TIEA24 Automaatit ja kieliopit, syksy 205 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 5. marraskuuta 205
Sisällys
Käsiteanalyysiä Tarkastellaan koodilukkoa äärellisenä automaattina.
Deterministinen äärellinen automaatti (DFA) Deterministisen äärellisen automaatin kuvaukseen kuuluu automaatille mahdollisesti tulevien ärsykkeiden (merkit) luettelo automaatin tilojen luettelo yhden tilan merkitseminen alkutilaksi mahdollisesti joidenkin tilojen merkitseminen hyväksyviksi (eli lopputiloiksi) siirtymien (tilasta toiseen) luettelointi siirtymään liittyy aina jokin merkki jokaisesta tilasta lähtee täsmälleen yksi siirtymä per merkki engl. deterministic finite automaton, deterministic finite-state machine
Äärellinen automaatti graafisesti hyväksyvä tila esitetään kaksoisviivalla ympyröitynä muut tilat esitetään yhdellä viivalla ympyöritynä alkutila merkitään piirtämällä siihen ei-mistään tuleva nuoli alkutila voi olla hyväksyvä tila! tilasiirtymä esitetään merkillä varustettuna nuolena tilasta toiseen q 0 tilasiirtymä a q q 2 alkutila muu tila hyväksyvä tila
Huomaa graafiesityksestä Koska jokaisesta tilasta on täsmälleen yksi siirtymä jokaiselle merkille, pitäisi periaatteessa myös jokaisesta ympyrästä olla nuoli jokaiselle merkille. Käytännössä usein jätetään osa nuolista merkitsemättä. Tulkintasääntö Jos automaatin graafiesityksessä ei ole näkyviin piirretty kaikkia tilasiirtymiä, vievät puuttuvat siirtymät ns. hylkäystilaan tila joka ei ole hyväksyvä ja josta kaikki siirtymät vievät takaisin siihen itseensä. Hylkäystilaa ei yleensä piirretä näkyviin.
Äärellinen automaatti siirtymätaulukkona kaksiulotteinen taulukko sarakkeilla merkit riveillä tilat alkutila merkitään nuolella lopputilat merkitään tähdellä taulukon rivillä q ja sarakkeella c on tila q tulkitaan siirtymäksi tilasta q merkillä c tilaan q Myös mahdollinen hylkäystila ja siirtymät siihen on merkittävä näkyviin.
Matemaattinen määritelmä Määritelmä Viisikko (Q, Σ, δ, q 0, F) on deterministinen äärellinen automaatti (DFA), jos Q on äärellinen (tilojen) joukko, Σ on äärellinen, epätyhjä joukko (merkistö), δ : Q Σ Q pätee (siirtymäfunktio), q 0 Q pätee (alkutila) ja F Q pätee (hyväksyvät tilat). Huomioita Olennaista on, että kyseessä on viisikko, jonka alkioilla on mainitut ominaisuudet. Yllä käytetyt merkinnät Q, Σ, δ, q 0 ja F ovat vakiintuneita, mutta asia ei muutu miksikään, vaikka merkinnät vaihtaisi toisiksi.
Äärellisen automaatin käyttäytyminen Automaatti käynnistyy alkutilassaan. Kun automaatille tulee ärsyke (syötemerkki), se siirtyy nykyisestä tilasta seuraavaan. Käytännössä automaatin siirtyminen tilaan voi herättää jonkin toiminnan (sivuvaikutus). Teoriassa sivuvaikutukset sivuutetaan. Teoriassa ja tietyissä sovelluksissa automaatin ajatellaan tarkastavan (äärellisiä) merkkijonoja. Automaatille annetaan syötteeksi merkkijono siten, että kukin merkki annetaan vuorollaan automaatille ärsykkeeksi. Kun syötejono päättyy, merkkijonon luokka määräytyy silloisen tilan mukaan. Automaatti hyväksyy merkkijonon, jos päättymishetken tila oli hyväksyvä, ja muuten hylkää sen.
Esimerkki taululla 0 0 2 0 0 3 0 0 0 2 3 0 2 0 3 3 2 w = 000 v = 00 u = 000
Merkkijonot matemaattisesti. Äärellinen epätyhjä joukko on merkistö, ja sen alkioita kutsutaan merkeiksi. 2. Merkistön Σ merkkijono koostuu nollasta tai useammasta merkistä peräkkäin asetettuna (ilman välimerkkejä). Merkkien järjestyksellä on merkitystä. Merkin toistolla on merkitystä. Esim. kissa on merkkijono. Muodollisesti merkkijono on kuvaus {0,..., n } Σ, missä n on merkkijonon pituus. 3. Merkistön Σ niiden merkkijonojen joukkoa, joiden pituus on n, merkitään Σ n :llä. 4. Merkistön Σ kaikkien merkkijonojen joukkoa merkitään Σ :lla. Eli Σ = Σ i i=0
Merkkijonojen kirjoittamisesta Tyhjää merkkijonoa merkitään ε (joissakin lähteissä käytetään merkintää λ). Merkkijonon w Σ pituutta merkitään w. Yhden merkin merkkijono samastetaan kyseiseen merkkiin: jos c Σ, niin c Σ ja c =. Merkkijono, joka saadaan toistamalla sama merkki (c Σ) monta (k N) kertaa, voidaan merkitä c k. c 0 = ε c = c c k = k Usein kirjoitetaan w = c... c n, missä n = w.
Merkkijono-operaatioita Kaksi merkkijonoa v, w Σ voidaan yhdistää (engl. concatenate) kirjoittamalla jonot peräkkäin: vw. Merkkijono v Σ voidaan kääntää peilikuvakseen v R ; esim. (2345) R = 5432. Sovitaan, että R vaikuttaa niin pieneen osaan merkkijonoa kuin mahdollista. Sulkeet ovat tässä metamerkkejä, jotka eivät kuulu Σ:aan
DFA:n toiminta formaalisti Olkoon M = (Q, Σ, δ, q 0, F) deterministinen äärellinen automaatti. Jokaiselle epätyhjälle merkkijonolle w = c 0 c n Σ \ {ε} on olemassa samanpituinen tilajono 2 q,..., q n, jolle pätee q k+ = δ(q k, c k ) kaikilla k = 0,..., n. Tämän jonon viimeinen tila q n on merkkijonon w päätöstila automaatissa M. Tyhjän merkkijonon päätöstila automaatissa M on q 0 M hyväksyy (engl. accept) merkkijonon w Σ, jos sen päätöstila M:ssä kuuluu F:ään; muuten se hylkää (engl. reject) sen. 2 Huomaa indeksoinnin ero!
Automaatin ymmärtäminen 3 Automaatin tilat ovat automaatin muisti: Se, että automaatti on jossakin tilassa, kertoo jotain siitä, minkälainen syötteenä oleva merkkijono on tähän asti ollut. Kannattaa aina selvittää, mitä kukin tila automaatille kertoo! Aiemmin tuntemattoman automaatin toiminnan selvittämisessä tilojen muistitehtävän selvittäminen on erittäin tärkeä! 3 Välistä luennon jälkeen poistettu kalvoja joita ei keretty käsitellä luennolla.
Minkälaiset merkkijonot tämä automaatti hyväksyy? 0 0 2 0 0 0 3
(merkkijonokäsittely) DFA koodataan yleensä silmukaksi, joka käy syötemerkkijonon läpi merkki kerrallaan. Tiloille annetaan numerot. Kulloinkin voimassa oleva tila tallennetaan muuttujaan. Iteraation alussa hypätään switch case-rakenteella tilamuuttujan osoittamaan tilaan. Kunkin tilan kohdalla valitaan syötemerkin perusteella, mikä tila laitetaan muuttujaan seuraavaksi. Syötteen loputtua katsotaan, ollaanko hyväksyvässä tilassa vai ei.
Vaihtoehtoisia ratkaisuja Switch casen sijasta voidaan käyttää taulukkoa, josta luetaan seuraavan tilan numero. Ei suoraan mahdollista tilasta riippuvan sivuvaikutuksen koodausta. Tilamuuttujan sijasta käytetään goto-lausetta tilasiirtymän toteuttamiseen. Tämä on yksi harvoista tilanteista, joissa goton käytössä on järkeä. Ei sovellu kieliin, joissa ei ole goto-lausetta... Tilamuuttujan ja silmukan sijasta koodataan kukin tila omaksi aliohjelmakseen. Tilasiirtymä toteutetaan funktiokutsulla. ÄLÄ KÄYTÄ kielissä, jotka eivät takaa ns. häntäkutsun poistoa Mm. C, C++, Java eivät sovellu. Kätevä temppu funktiokielissä (Scheme, Haskell, ML).
Automaatti oliona Ärsykkeenä metodikutsu. Tila tallennetaan attribuutiksi. Tilasiirtymät voidaan toteuttaa switch-case- tai taulukkoperiaatteella.
Esimerkkiohjelman automaatti 0 0 2 0 0 3 0 0 0 2 3 0 2 0 3 3 2