ICS-C2000 Tietojenkäsittelyteoria Luento 2: Äärelliset automaatit Aalto-yliopisto Perustieteiden korkeakoulu Tietotekniikan laitos Kevät 2016
Kertausta: kielet ja automaatit Laskennallisen ongelman ratkaisevia tietokoneohjelmia ja -laitteita voidaan tarkastella automaatteina x = 4831. x = 5899 def isprime(x):.... return res true. false Aakkosto: äärellinen joukko symboleja, esim. Σ = {0,1,2,...,9} Kieli: joukko Σ:n merkkijonoja, esim {x Σ x on alkuluku} = {1,2,3,5,7,11,...} {x {0x00,0x01,...,0xFF} x on virusvapaa tietokoneohjelma} Millainen automaatti tarvitaan annetun ongelman ratkaisemiseen (eli kielen tunnistamiseen)? Voiko kaikki ongelmat ratkaista jollain automaatilla? 2/39
Alue ja aiheet Orposen prujun luvut 2.1 2.3 (tai Sipserin kirjan luku 1.1) Äärellisen automaatin rakenne ja sen esitystapoja Äärellisen automaatin toiminta Semanttisten toimintojen liittäminen automaatteihin Äärellisten automaattien ja niiden toiminnan tarkka matemaattinen esitys eli formalisointi 3/39
Äärelliset automaatit 4/39
Tilakaaviot ja tilataulut Tarkastellaan aluksi tietojenkäsittelyjärjestelmiä, joilla on vain äärellisen monta mahdollista tilaa. Tällaisen järjestelmän toiminta voidaan kuvata äärellisenä automaattina t. äärellisenä tilakoneena (engl. finite automaton, finite state machine). Äärellisillä automaateilla on useita vaihtoehtoisia esitystapoja: tilakaaviot, tilataulut,... 5/39
Esimerkki: 20c 20c 10c 10c 10c 10c 0.00 0.10 0.20 0.30 enough 20c 20c 10c 20c more than enough 10c 20c Em. tilakaavion esittämä automaatti ratkaisee päätösongelman riittävätkö annetut rahat kahvin ostamiseen? Äärellisiä automaatteja voidaan yleensäkin käyttää yksinkertaisten päätösongelmien ratkaisujen mallintamiseen. Automaattimallista on muitakin kuin binäärivasteisten järjestelmien kuvaamiseen tarkoitettuja versioita (ns. Moore- ja Mealy-automaatit), mutta niitä ei käsitellä tällä kurssilla. 6/39
Tilakaavioiden merkinnät: q Automaatin tila nimeltä q q 0 Alkutila q 0 q f q a 1 q 2 Lopputila q f : automaatti hyväksyy syötejonon, jos se jonon loppuessa on tällaisessa tilassa Syötemerkin a aikaansaama siirtymä tilasta q 1 tilaan q 2 Sekä lyhennysmerkintä: a q 1 a, b, c q 2 q 1 b c q 2 7/39
Esimerkki: C-kielen etumerkittömät liukuluvut. q 7 digit. digit digit digit. digit q 0 q 1 q 2 q 3 exp exp exp digit q 4 digit q 6 +,- digit q 5 Käytetyt lyhenteet: digit = {0,1,...,9}, exp = {E,e}. 8/39
Äärellisen automaatin esitys tilatauluna: automaatin uusi tila vanhan tilan ja syötemerkin funktiona. Esimerkki: Liukulukuautomaatin tilataulu: digit. exp + q 0 q 1 q 7 q 1 q 1 q 2 q 4 q 2 q 3 q 4 q 3 q 3 q 4 q 4 q 6 q 5 q 5 q 5 q 6 q 6 q 6 q 7 q 3 missä ilmaisee alkutilaa ja lopputilaa. 9/39
K: Mitä tilataulun tyhjät paikat tarkoittavat? V: Tilataulun tyhjät paikat, tai vastaavasti tilakaavion puuttuvat kaaret, kuvaavat automaatin virhetilanteita. Jos automaatti ohjautuu tällaiseen paikkaan, syötejono ei kuulu automaatin hyväksymään joukkoon. Muodollisesti automaatissa ajatellaan olevan erityinen virhetila, jota ei vain selkeyden vuoksi merkitä näkyviin. 10/39
Esimerkki: Liukulukuautomaatin täydellinen kaavioesitys olisi:. digit digit. q 0 q 1 exp, +,- error +,- digit, exp,.,+,- exp 11/39
ja liukulukuautomaatin täydellinen tauluesitys olisi: digit. exp + q 0 q 1 q 7 error error error q 1 q 1 q 2 q 4 error error.... q 6 q 6 error error error error error error error error error error... 12/39
2.2 Äärellisiin automaatteihin perustuva ohjelmointi Annetun äärellisen automaatin pohjalta on helppo laatia automaatin toimintaa vastaava ohjelma. 13/39
Esimerkki: Liukulukuautomaattiin perustuva syötejonon syntaksitestaus Pythonohjelmointikielellä: from sys import s t d i n q=0 f o r c i n s t d i n. r e a d l i n e ( ). s t r i p ( " \ n " ) : i f q==0: i f c. i s d i g i t ( ) : q=1 e l i f c== ". " : q=7 else : q=99 e l i f q==1: i f c. i s d i g i t ( ) : q=1 e l i f c== ". " : q=2 e l i f c== "E" or c== " e " : q=4 else : q=99... e l i f q==7: i f c. i s d i g i t ( ) : q=3 else : q=99 i f q i n [ 2, 3, 6 ] : p r i n t " I s a v a l i d f l o a t i n g p o i n t number " else : p r i n t " Not a f l o a t i n g p o i n t number " 14/39
Semanttisten toimintojen liittäminen äärellisiin automaatteihin Esimerkki: Kahdeksanjärjestelmän lukuja tunnistava automaatti ja siihen perustuva syöteluvun arvonmääritys ( muuttaminen kymmenjärjestelmään ). q +, 0 q d 1 q 2 d Lyhennysmerkintä d = {0,1,...,7}. d 15/39
Pelkän syntaksitestin toteutus: from sys import s t d i n q=0 f o r c i n s t d i n. r e a d l i n e ( ). s t r i p ( " \ n " ) : i f q==0: i f c== " + " or c== " " : q=1 e l i f c i n " 01234567 " : q=2 else : q=99 e l i f q==1: i f c i n " 01234567 " : q=2 else : q=99 e l i f q==2: i f c i n " 01234567 " : q=2 else : q=99 i f q==2: p r i n t " Octal numeral " else : p r i n t " Not an o c t a l numeral " 16/39
Täydennys syöteluvun arvon laskevilla operaatioilla ( luvun muuttaminen kymmenjärjestelmään ): from sys import s t d i n q=0 sgn=1 # SEM: sign val =0 # SEM: absolute value f o r c i n s t d i n. r e a d l i n e ( ). s t r i p ( " \ n " ) : i f q==0: i f c== " + " : q=1 e l i f c== " " : sgn= 1; q=1 e l i f c i n " 01234567 " : v a l = i n t ( c ) ; q=2 else : q=99 e l i f q==1: i f c i n " 01234567 " : v a l = i n t ( c ) ; q=2 else : q=99 e l i f q==2: i f c i n " 01234567 " : v a l =8 * v a l + i n t ( c ) ; q=2 else : q=99 i f q==2: p r i n t " Octal numeral ; decimal p r e s e n t a t i o n i s ", sgn * v a l else : p r i n t " Not an o c t a l numeral " 17/39
Sivupolku: hieman lisää aiheesta Äärellisiä automaatteja voidaan käyttää käytöksen suunnittelun ja toteutuksen apuna esim. peleissä: linkki 1 ja linkki 2 Myös kurssin tietokonekotitehtävissä käytetyn automaattieditorin käyttöliittymän logiikka voidaan nähdä ja on suunniteltu automaattina ( jos olemme tilassa lisää siirtymä ja tulee tapahtuma kaarisymbolia klikattu, siirry alitilaan muokkaa kaarisymbolijoukkoa jne) Adoben ActionScript language ( the programming language for the Adobe Flash Player and Adobe AIR runtime environments ) sisältää tuen automaateille (katso kappale 10 kirjassa Sanders and Cumaranatunge: ActionScript 3.0 Design Patterns) Wikipediasta voi lukaista vaikkapa artikkelit tapahtumapohjaisista automaateista ja automaattipohjaisesta ohjelmoinnista 18/39
2.3 Äärellisen automaatin käsitteen formalisointi Mekanistinen malli: syötenauha: i n p u t nauhapää: ohjausyksikkö: q 1 q 2 q 0 Äärellinen automaatti M koostuu äärellistilaisesta ohjausyksiköstä, jonka toimintaa säätelee automaatin siirtymäfunktio δ, sekä merkkipaikkoihin jaetusta syötenauhasta ja nämä yhdistävästä nauhapäästä, joka kullakin hetkellä osoittaa yhtä syötenauhan merkkiä. δ 19/39
Automaatin toiminta : Automaatti käynnistetään erityisessä alkutilassa q 0, siten että tarkasteltava syöte on kirjoitettuna syötenauhalle ja nauhapää osoittaa sen ensimmäistä merkkiä. Yhdessä toiminta-askelessa automaatti lukee nauhapään kohdalla olevan syötemerkin, päättää ohjausyksikön tilan ja luetun merkin perusteella siirtymäfunktion mukaisesti ohjausyksikön uudesta tilasta, ja siirtää nauhapäätä yhden merkin eteenpäin. Automaatti pysähtyy, kun viimeinen syötemerkki on käsitelty. Jos ohjausyksikön tila tällöin kuuluu erityiseen (hyväksyvien) lopputilojen joukkoon, automaatti hyväksyy syötteen, muuten hylkää sen. Automaatin tunnistama kieli on sen hyväksymien merkkijonojen joukko. 20/39
Edellisen kalvon sanallinen määritelmä voi jättää tulkinnanvaraa (mitä tapahtuu tyhjällä syötteellä ε, jne). Täsmällinen, matemaattinen muotoilu: Määritelmä Äärellinen automaatti on viisikko missä M = (Q,Σ,δ,q 0,F), Q on automaatin tilojen äärellinen joukko; Σ on automaatin äärellinen syöteaakkosto; δ : Q Σ Q on automaatin siirtymäfunktio; q 0 Q on automaatin alkutila; F Q on automaatin (hyväksyvien) lopputilojen joukko. 21/39
Esimerkki: Liukulukuautomaatin formaali esitys: M = ({q 0,...,q 7,error},{0,1,...,9,.,E,e,+,-}, δ,q 0,{q 2,q 3,q 6 }), missä δ on kuten aiemmin taulukossa; esim. δ(q 0,0) = δ(q 0,1) = = δ(q 0,9) = q 1, δ(q 0,.) = q 7, δ(q 0,E) = δ(q 0,e) = error, δ(q 1,.) = q 2, δ(q 1,E) = δ(q 1,e) = q 4, jne. 22/39
Automaatin käytöksen formalisointi Edellinen määritelmä kuvasi automaatin rakenteen mutta ei vielä sen käytöstä. Myös käytös voidaan kuvata tarkasti matemaattisesti parin lisämääritelmän avulla. Automaatin tilanne on pari (q,w) Q Σ Erityisesti automaatin alkutilanne syötteellä x on pari (q 0,x). Intuitio: q on automaatin tila ja w on syötemerkkijonon jäljellä oleva, so. nauhapäästä oikealle sijaitseva osa. Esimerkki Muun muassa seuraavat ovat liukulukuautomaatin tilanteita: (q 0,0.25E2), (q 0,EE..33), (error,e..33), (q 1,.25E2), (q 6,ε). Syötteellä.242E10 automaatin alkutilanne on (q 0,.242E10). 23/39
Tilanne (q,w) johtaa suoraan tilanteeseen (q,w ), merkitään (q,w) M (q,w ), jos on w = aw (a Σ) ja q = δ(q,a). Tällöin sanotaan myös, että tilanne (q,w ) on tilanteen (q,w) välitön seuraaja. Intuitio: automaatti ollessaan tilassa q ja lukiessaan nauhalla olevan merkkijonon w = aw ensimmäisen merkin a siirtyy tilaan q ja siirtää nauhapäätä yhden askelen eteenpäin, jolloin nauhalle jää merkkijono w. Jos automaatti M on yhteydestä selvä, relaatiota voidaan merkitä yksinkertaisesti (q,w) (q,w ). Esimerkki Pohdi miksi liukulukuautomaatilla (i) pätee (q 0,0.25E2) (q 1,.25E2), (ii) ei päde (q 0,0.25E2) (q 6,5E2), ja (iii) tilanteella (q 6,ε) ei ole välittömiä seuraajia. 24/39
Tilanne (q,w) johtaa tilanteeseen (q,w ) t. tilanne (q,w ) on tilanteen (q, w) seuraaja, merkitään (q,w) M (q,w ), jos on olemassa välitilannejono (q 0,w 0 ), (q 1,w 1 ),..., (q n,w n ), n 0, siten että (q,w) = (q 0,w 0 ), (q 0,w 0 ) M (q 1,w 1 ), (q 1,w 1 ) M (q 2,w 2 )... (q n 1,w n 1 ) M (q n,w n ) ja (q n,w n ) = (q,w ) Erikoistapauksena n = 0 saadaan (q,w) M (q,w) millä tahansa tilanteella (q, w). Jälleen, jos automaatti M on yhteydestä selvä, merkitään yksinkertaisesti (q,w) (q,w ). 25/39
Automaatti M hyväksyy merkkijonon x Σ, jos on voimassa muuten M hylkää x:n. (q 0,x) M (q f,ε) jollakin q f F; Toisin sanoen: automaatti hyväksyy x:n, jos sen alkutilanne syötteellä x johtaa, syötteen loppuessa, johonkin hyväksyvään lopputilanteeseen. Automaatin M tunnistama kieli määritellään: L(M) = {x Σ (q 0,x) M (q f,ε) jollakin q f F}. 26/39
Esimerkki: Merkkijonon 0.25E2 käsittely liukulukuautomaatilla: (q 0,0.25E2) (q 1,.25E2) (q 2,25E2) (q 3,5E2) (q 3,E2) (q 4,2) (q 6,ε). Koska q 6 F = {q 2,q 3,q 6 }, on siis 0.25E2 L(M). 27/39
Vaihtoehtoinen määritelmä (Sipserin kirjasta) Automaatin hyväksymät sanat voitaisiin määritellä myös ilman tilannetta Kulloinkin jäljellä oleva syöte ei tällöin näy suoraan esityksestä Määritelmä Olkoon M = (Q,Σ,δ,q 0,F) äärellinen automaatti M hyväksyy merkkijonon w = w 1 w 2...w n Σ jos on olemassa jono r 0 r 1 r 2...r n Q automaatin tiloja siten, että r0 = q 0 δ(r i,w i+1 ) = r i+1 pätee kaikille 0 i < n r n F L(M) = {w Σ M hyväksyy w:n} Esimerkki: Liukulukuautomaatti hyväksyy merkkijonon 0.25E2 koska yllämainitut ehdot täyttyvät tilajonolla q 0 q 1 q 2 q 3 q 3 q 4 q 6. 28/39
Hieman lisää esimerkkejä Esimerkki: Kielet {w {0,1} w sisältää parillisen määrän symbolia 1} ja {w {0,1} w sisältää alimerkkijonon 001} voidaan tunnistaa seuraavilla automaateilla: 1 0 0 1 e o a b c d 0 1 0 1 1 0 0, 1 Tilan a selitys voisi olla ei olla vielä nähty merkkijonoa 001 ja edellinen merkki ei ollut 0. Mitkä voisivat olla muiden automaatin tilojen selitykset? 29/39
Lause Jos L Σ voidaan tunnistaa äärellisellä automaatilla, niin myös kieli L = {w Σ w / L} voidaan. Todistus Otetaan mikä tahansa äärellinen automaatti M L = (Q,Σ,δ,q 0,F), joka tunnistaa kielen L (eli L(M L ) = L). Koska automaatin tila suorituksen lopussa on yksikäsitteinen mille tahansa syötemerkkijonolle, saamme äärellisen automaatin komplementtikielelle L = {w Σ w / L} yksinkertaisesti vaihtamalla kaikki hyväksyvät lopputilat ei-hyväksyviksi ja päinvastoin eli M L = (Q,Σ,δ,q 0,Q \ F). 30/39
Esimerkki: Edellisen esimerkin automaatista kielelle L = {w {0,1} w sisältää alimerkkijonon 001} saamme tällä konstruktiolla komplementtikielen L = {w {0,1} w ei sisällä alimerkkijonoa 001} hyväksyvän automaatin: 0 0 1 a b c d 1 1 0 0, 1 31/39
Lause Jos kielet A,B Σ voidaan tunnistaa äärellisellä automaateilla, niin myös kieli A B = {w Σ w A ja w B} voidaan. Todistus Olkoot M A = (Q A,Σ,δ A,q A,0,F A ) ja M B = (Q B,Σ,δ B,q B,0,F B ) äärellisiä automaatteja, jotka tunnistavat kielet A ja B. Tehdään automaatti M A B = (Q A B,Σ,δ A B,q A B,0,F A B ), joka simuloi kumpaakin automaattia yhtäaikaa ja hyväksyy merkkijonon jos ja vain jos kumpikin automaatti hyväksyisi. Q A B = Q A Q B eli automaatin tilat ovat pareja, jotka pitävät kirjaa siitä, missä tilassa simuloitavat automaatit A ja B olisivat q A B,0 = (q A,0,q B,0 ) eli alkutilassa kummatkin simuloitavat automaatit olisivat alkutilassa 32/39
δ A B ((q a,q B ),σ) = (δ A (q A,σ),δ B (q B,σ)) eli siirrytään uuteen tilaan niin, että se vastaa niitä tiloja, joihin simuloitavat automaatit olisivat päättyneet luettuaan saman merkin σ, ja F A B = F A F B eli hyväksytään joss kumpikin simuloitava automaatti hyväksyisi. Nyt voitaisiin näyttää induktiolla syöte merkkijonon pituuden suhteen, että jos automaatti A on syötteen lukemisen jälkeen tilassa q a ja automaatti B tilassa q B, niin silloin automaatti M A B on tilassa (q A,q B ). (Vastaavia konstruktioita kierroksen 3 demotehtävissä) 33/39
Esimerkki: Tehdään esitetyllä konstruktiolla automaatti, joka hyväksyy sanat, jotka sisältävät sekä parillisen määrän symbolia 1 että alisanan 001. Lähtöautomaatit: 1 0 0 1 e o a b c d 0 Tulos: 1 0 0 0 (e, a) (e, b) (e, c) (e, d) 1 1 1 1 1 1 1 1 (o, a) (o, b) (o, c) (o, d) 0 0 1 1 0 0, 1 0 0 0 0 34/39
Sivupolku: joitain muita automaattiluokkia 35/39
Äärelliset automaatit ovat ehkäpä yksinkertaisin automaattiluokka. Niiden laajennuksia on paljon, seuraavilla kalvoilla olevien lisäksi mm: Pinoautomaatit: tarkastellaan myöhemmin kurssilla Ajastetut automaatit: laajentavat äärellisiä automaatteja reaalilukuarvoisilla kelloilla (katso esim. johdantoartikkeli ja eräs työkalu) Hybridiautomaatit: sallivat yleisemmän reaalilukuarvoisten muuttujien käytön, käytetään mallintamaan tietokoneohjelmien ja -laitteiden ja fyysisten prosessien välistä vuorovaikutusta Turingin koneet: tarkastellaan myöhemmin kurssilla 36/39
Äärettömät merkkijonot Tällä kurssilla tarkastellaan vain äärellisiä merkkijonoja... mutta joissakin sovelluksissa tarvitaan myös äärettömiä syötteitä: Esimerkiksi reaktiivisissa järjestelmissä (serverit, protokollat, jne) suorituksen ei välttämättä oleteta päättyvän ollenkaan Äärettömille merkkijonoille on määritelty useita automaattiluokkia Esim. Büchi-automaatit hyväksyvät äärettömän merkkijonon jos hyväksyvässä tilassa käydään äärettömän usein Sovellusesimerkkinä: spin verification tool 37/39
Esimerkki: Büchi-automaatti, joka hyväksyy aakkoston {a, b, c} äärettömät merkkijonot, joiden parillisissa positioissa on a b, c s a 0 s 1 Nyt abacacaba... hyväksytään mutta bbacacaba... ja abacaccba... hylätään. Esimerkki: Büchi-automaatti, joka hyväksyy aakkoston {req, ack, data} äärettömät merkkijonot, joissa jokaista req-symbolia ( request, pyyntö ) seuraa myöhemmin ack-symboli ( acknowledgement, kuittaus ) ack req s 0 s 1 req, data ack, data 38/39
Muuntimet Äärellistilaiset muuntimet (engl. transducers) eivät hylkää/hyväksy syötettä vaan muuntavat sen toiseksi merkkijonoksi. Esimerkiksi Mooren koneet liittävät tulosteen laskennan tiloihin s 0 /0 b, c b, c b, c a s a 1 /0 s 2 /1 a input: state: output: a b c a a a c... s 0 s 1 s 0 s 0 s 1 s 2 s 2 s 0... 0 0 0 0 1 1 0... kun taas Mealyn koneet sallivat tulosteen riippua myös nykyisestä syötemerkistä: b/0, c/0 input: a b c a a a c... a/0 state: s 0 s 1 s 0 s 0 s 1 s 1 s 1 s 0... s 0 s 1 output: 0 0 0 0 1 1 0... b/0, c/0 a/1 Käytetään yleisimmin laitteistosuunnittelussa (syöteaakkosto on joukko kellotettuja signaaleja jne); kokeile nettihakua termillä Mealy machine 39/39