TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 19. tammikuuta 2012
Sisällys
Sisällys
Muistathan A B -konstruktion 0 k 1 i 2 s 3 s 4 a 5 0 k 1 o 2 i 3 r 4 a 5 00 k i 11 2 s 3 s 4 a 5 o 2 i 3 r 4 a 5
Eikö olisi helpompi...... yhdistää M A ja M B luomalla uusi alkutila, josta automaatti siirtyisi spontaanisti oikeaan osa-automaattiin? A0 ε 0 ε B0 k A1 k B1 i A2 o B2 s A3 i B3 s A4 r B4 a A5 a B5 Valitettavasti tällainen M ei ole DFA...
... mutta se on eli epädeterministinen äärellinen automaatti. on DFA kolmella poikkeuksella: samasta tilasta saa olla useampi kuin yksi siirtymä samalla merkillä tilasta ei tarvitse olla siirtymää kaikilla merkeillä tilasta voi olla spontaaneja eli ns. ε-siirtymiä muihin tiloihin
Epädeterminismi Epädeterminismi tarkoittaa laskentaa, jossa mahdollisia etenemistapoja on useita, joista valitaan joku. :n epädeterminismi on hyväntahtoista, koska valitsee aina hyväksyntään johtavan tavan, jos sellainen on olemassa. Epädeterministinen laskenta voidaan kuvata päätöspuuna. Tarkastellaan taululla seuraavaa automaattia: a a 0 a 1 b 2 a 3 b b ja merkkijonoa aababa.
matemaattisesti Merkintätapa Merkitään jatkossa Σ ε = Σ {ε}. Huomautus Koska ε tarkoittaa tyhjää merkkijonoa, pätee ε Σ. Määritelmä Viisikko (Q, Σ, δ, q 0, F) on epädeterministinen äärellinen automaatti (), jos Q on äärellinen (tilojen) joukko, Σ on äärellinen, epätyhjä joukko (merkistö), δ : Q Σ ε P(Q) pätee (siirtymäfunktio), q 0 Q pätee (alkutila) ja F Q pätee (hyväksyvät tilat).
:n toiminta formaalisti Olkoon M = (Q, Σ, δ, q 0, F) epädeterministinen äärellinen automaatti. Jokaiselle epätyhjälle merkkijonolle w = c 0 c n 1, jolle c 0,..., c n 1 Σ ε pätee 1, on mahdollisesti olemassa tilajonoja, jotka ovat muotoa 2 q 1,..., q n ja joille pätee q k+1 δ(q k, c k ) kaikilla k = 0,..., n 1. Kunkin tällaisen jonon viimeinen tila q n on merkkijonon w päätöstila automaatissa M. Tyhjän merkkijonon päätöstilaksi automaatissa M lasketaan myös q 0. Merkitään merkkijonon w päätöstilojen joukkoa Q w. M hyväksyy merkkijonon w Σ, jos ainakin yksi sen päätöstiloista M:ssä kuuluu F:ään eli jos Q w F = ; muuten se hylkää sen. M:n (tunnistama) kieli on L(M) = { w Σ Q w F = }. 1 Huomaa: w n. 2 Huomaa indeksoinnin ero!
Vaihtoehtoinen muotoilu Olkoon M = (Q, Σ, δ, q 0, F). Määritellään ( ) Q Σ Q pienimpänä relaationa, jolle seuraavat pätevät kaikilla q, q, q Q, c Σ ε ja w, v Σ : q δ(q, c) q c q (1) q w q q v q q wv q (2) q ε q (3) (Kolmas ehto lisätty luennon jälkeen.) w Jos q 0 q pätee, niin tila q on merkkijonon w:n (jokin) päätöstila.
Yhdiste :lla Olkoon M A = (Q A, Σ A, δ A, q A, F A ). Olkoon M B = (Q B, Σ B, δ B, q B, F B ). Voidaan olettaa: Q A Q B = ja 0 Q A Q B. Konstruoidaan M = (Q A Q B {0}, Σ A Σ B, δ, 0, F A F B ) missä {q A, q B } jos q = 0 ja c = ε δ A (q, c) jos q Q A ja c (Σ A ) ε δ : (q, c) δ B (q, c) jos q Q B ja c (Σ B ) ε muuten On helppo havaita, että L(M) = L(M A ) L(M B ).
Riittääkö? Todistaako edellisen kalvon konstruktio, että kahden säännöllisen kielen yhdiste on säännöllinen? Säännöllisen kielen määritelmässä puhutaan DFA:sta, ei :sta. On helppo nähdä, että jokainen DFA voidaan muokata :ksi. Lisäksi tarvitaan... Lause Jokaiselle :lle M on olemassa DFA M, jolle pätee L(M) = L( M).
Spontaanien siirtymien poisto Lemma Olkoon M = (Q, Σ, δ, q 0, F). Määritellään M = (Q, Σ, δ, q 0, F ) seuraavasti: { δ jos c = ε : (q, c) { q Q q c q } muulloin { ε F {q 0 } jos on olemassa q F, jolle q 0 q pätee F = F muuten Tällöin L(M) = L(M ). Todistus Sivuutetaan.
Osajoukkokonstruktio Lause Jokaiselle :lle M = (Q, Σ, δ, q 0, F) on olemassa DFA M = ( Q, Σ, δ, q 0, F), jolle pätee L(M) = L( M). Todistus Taululla (ja jälkiprujussa).
Laiska osajoukkokonstruktio Osajoukkokonstruktio sopii DFA-muunnosalgoritmin pohjaksi. Se tuottaa runsaasti turhia tiloja. Käytännössä kannattaa muodostaa osajoukko-tila vasta, kun sitä tarvitaan, siis laiskasti.
Esimerkki taululla A0 ε 0 ε B0 k A1 k B1 i A2 o B2 s A3 i B3 s A4 r B4 a A5 a B5
Sisällys
Suunnitelma Nämä tiedetään: ε on säännöllinen kieli. S Σ on säännöllinen kieli. Jos A on säännöllinen kieli, niin A on säännöllinen kieli. Jos A ja B ova säännöllisiä kieliä, niin AB on säännöllinen kieli. Jos A ja B ova säännöllisiä kieliä, niin A B on säännöllinen kieli. Voidaanko kaikki säännölliset kielet ilmaista näiden yhdistelyn avulla? Ratkaisuun tarvitaan: Tarkka määritelmä yhdistelemiselle (tänään). Todistus sille, että DFA:sta voidaan rakentaa yhdistelmä (tiistaina).
Määritelmä Olkoon M = {,,, (, )} ja olkoon Σ merkistö, jolle pätee Σ M =. (engl. regular expressions) ovat seuraavat merkistön Σ M merkkijonot ε, c, jos c Σ, r, jos r on säännöllinen lauseke (r 1 r 2 ), jos r 1 ja r 2 ovat säännöllisiä lausekkeita, (r 1 r 2 ), jos r 1 ja r 2 ovat säännöllisiä lausekkeita, ja vain ne. 3 Säännöllisten lausekkeiden joukkoa merkitään R Σ. 3 Käytännössä sulkeita ei läheskään aina kirjoiteta näkyviin. Operaattoreiden presedenssijärjestys on yllä korkeammalla mainittu lasketaan ensin.
Säännöllisten lausekkeiden tulkinta Määritelmä Olkoon Σ merkistö ja R Σ säännöllisten lausekkeiden joukko. Määritellään tulkintafunktio : R Σ P(Σ ) seuraavasti: = ε = {ε} c = {c} (c Σ) r = r (r R Σ ) (r 1 r 2 ) = r 1 r 2 (r 1, r 2 R Σ ) (r 1 r 2 ) = r 1 r 2 (r 1, r 2 R Σ )
käytännössä Yleisin käytännön sovellus on Unixin regexit, joita käytetään esim. egrep-ohjelmassa. Kääntäjien etupäässä voidaan käyttää säännöllisiä lausekkeita kuvaamaan kielen sanaset (flex ym.). Useimpien ohjelmointikielten kirjastoissa on toteutus Unixin regexien kaltaisille säännöllisille lausekkeille. Paaaaaaaaaaaaaljon sovelluksia!
Unixin regexien operaattoreita r* tarkoittaa samaa kuin r edellä (Kleenen tähti) r+ tarkoittaa samaa kuin rr* (Kleenen plus) r 1 r 2 tarkoittaa samaa kuin edellä (valitaan joko r 1 tai r 2 ) r? tarkoittaa samaa kuin (() r) r{n} tarkoittaa r:n toistoa täsmälleen n kertaa. r{n, m} tarkoittaa r:n toistoa vähintään n ja enintään m kertaa. sulkeita () voidaan käyttää ryhmittelyyn ^ tarkoittaa syötteen tai rivin alkua (riippuu käyttöyhteydestä) $ tarkoittaa syötteen tai rivin loppua (riippuu käyttöyhteydestä) ilman näitä regex etsii osamerkkijonoa, johon regex täsmää
Unixin regexien merkkiluokat Seuraavat ovat tapoja ilmaista yhden merkin mittaisia kieliä:. tarkoittaa kieltä Σ [c 1 c 2 c n ] tarkoittaa kieltä {c 1,..., c n }. [^c 1 c 2 c n ] tarkoittaa kieltä Σ {c 1,..., c n }. hakasulkeissa (hatulla tai ilman) on mahdollista käyttää myös merkkiväliä, esim. a-z nimettyä merkkijoukkoa, esim. [:alpha:], [:digit:], [:alnum:] \., \* jne: erikoismerkki sellaisenaan
Esimerkkejä 1. [[:alpha:]][[:alnum:]]* 2. [+-]?([[:digit:]]+\.[[:digit:]]* [[:digit:]]*\.[[:digit:]]+) 3. [[:digit:]]{5} +[[:alpha:]]+( +[[:digit:]]{2})?