Lyhyt MathCheck-ohje (uuteen välilehteen)
Tässä tehtävässä kerrataan epädeterminististen äärellisten automaattien peruskäsitteitä ja muunnetaan epädeterministisiä äärellisiä automaatteja deterministisiksi. Tehtävän DFA-perusasioita tulee olla tehty, koska siellä käydään läpi tälle tehtävälle välttämättömiä esitietoja.
Määritelmä Epädeterministinen äärellinen automaatti eli NFA tarkoittaa viisikkoa (Q, Σ, Δ, q̂, F), jonka osat toteuttavat seuraavat ehdot:
NFA on siis muuten samanlainen kuin DFA, mutta osittaisen funktion δ paikalla on relaatio Δ. Sana ”relaatio” tarkoittaa mitä tahansa joukkoa A, joka toteuttaa ehdon muotoa A ⊆ A1 × … × An. Sen alkiot esitetään muodossa (a1, …, an), ja pätee a1 ∈ A1, …, an ∈ An. Niinpä ilmaus Δ ⊆ Q × (Σ ∪ {ε}) × Q tarkoittaa, että Δ on joukko kolmikoita (q, a, q’), missä (ilmaise sanallisesti) q on tällainentila olento, a on tällainenmerkki tai ε olento ja q’ on tällainentila olento. Kuvassa (q, a, q’) piirretään näinnuolena, joka alkaa tilasta q ja päättyy tilaan q’, ja jonka varrelle a on kirjoitettu.
Koska Δ on joukko, hyvin piirretyssä kuvassa ei ole kahta kaarta, jotka …alkavat samasta tilasta, ovat samannimiset (molempien varrelle on kirjoitettu sama merkki tai molempien varrelle on kirjoitettu ε), ja päättyvät samaan tilaan.. Jos Q = {1, 2} ja Σ = {a, b, c, d}, niin kaaria on vähintään näin monta0 ja enintään näin monta2 ⋅ (4 + 1) ⋅ 2 = 20.
Vaikka DFA:n δ on tapana esittää eri symbolilla kuin NFA:n Δ,
sillekin pätee δ ⊆ Q × (Σ ∪ {ε}) × Q.
DFA ei kuitenkaan ole sama asia kuin NFA, koska sille pätevät nämä• Kaaren nimenä ei voi olla ε.
• Samasta tilasta samalla nimellä lähtee enintään yksi kaari.
lisärajoitukset.
Niinpä jokainen DFA on NFA. Tällainen sanojen käyttö on hieman omituista: se on samanlaista kuin jos sanottaisiin, että jokainen epäaito maalaus on aito maalaus. Tällaiseksi sanasto on kuitenkin vakiintunut. Sitäpaitsi eikös jokainen epäluulo ole luulo? Suomenkielikään ei siis ole tässä täysin johdonmukainen. Matematiikassa on muutakin samalla tavalla kummallista kielenkäyttöä. Esimerkiksi jokainen osittainen funktio on täysi funktio.
Päinvastainen ei päde: ei ole niin, että jokainen NFA on DFA. Piirrä mahdollisimman pieni NFA, joka ei ole DFA. vastaus
Jokainen NFA, jossa on vain yksi tila ja jonka kaarten nimissä ei esiinny ε, on DFA tästä syystäSamasta tilasta samalla nimellä lähtee enintään yksi kaari, koska mahdollisia kärkipään tiloja on vain yksi..
DFA:illa q =σ⇒ q’ tarkoittaa, että on olemassa polku q:sta q’:uun, jonka kaarten nimet muodostavat merkkijonon σ. NFA:illa tilanne on sikäli monimutkaisempi, että ε-kaaret eivät tuota merkkejä polkua vastaavaan merkkijonoon. Esimerkiksi kuvan NFA:lla pätee 1 =bbd⇒ 4 polun 1ε2b2b2ε3ε4d4 ansiosta. Polun pituus voi siis olla suurempi kuin polun tuottaman merkkijonon pituus. Jatkoa varten annamme kuvan NFA:lle nimen a*b*c*. Se on myös ruudun oikeassa alanurkassa.
Sekä DFA:n että NFA:n tapauksessa σ kuuluu automaatin hyväksymään kieleen jos ja vain jos on olemassa alkutilasta johonkin lopputilaan vievä polku, jonka kaarten nimien jono ε:t pois jätettynä on σ. NFA:n hyväksymä kieli on siis {σ ∈ Σ* | ∃ q ∈ F: q̂ =σ⇒ q}. Sama kaava pätee DFA:n hyväksymälle kielelle.
Olkoon q ∈ F ja q1 =ε⇒ q =ε⇒ q2. Voiko hyväksytty kieli muuttua, jos q1 muutetaan lopputilaksi? vastausEi voi. Jokaisella merkkijonolla σ, jolla pääsee alkutilasta q1:een, pääsee alkutilasta q:hun polkua q̂ =σ⇒ q1 =ε⇒ q pitkin. Se kuuluu siis hyväksyttyyn kieleen jo silloin kun q1 ei vielä ole lopputila. Voiko hyväksytty kieli muuttua, jos q2 muutetaan lopputilaksi? vastausKyllä voi. Jos a*b*c*:ssä tila 4 muutetaan lopputilaksi, niin muun muassa d tulee uutena hyväksyttyyn kieleen.
Jos jokaiselle q ∈ Q pätee q̂ =ε⇒ q =ε⇒ q̂, niin mikä on hyväksytty kieli? vihjeJos (q, a, q’) on mikä tahansa kaari, niin tehtävän oletuksen mukaan q̂ =ε⇒ q ja q’ =ε⇒ q̂. Siksi q̂ =a⇒ q̂. vastausJos F = ∅, niin myös hyväksytty kieli on ∅. Jos F ≠ ∅, niin kieli on Γ*, missä Γ on kuvassa esiintyvien kaarten nimien joukko ε poislukien. perustelu 1Jokaiselle NFA:lle pätee, että jos F = ∅, niin myös hyväksytty kieli on ∅. Jos lopputiloja ei ole, niin mikään polku ei vie lopputilaan, joten mitään merkkijonoa ei hyväksytä. perustelu 2Jos F ≠ ∅, niin on olemassa lopputila. Annamme sen nimeksi qF. Tehtävän oletuksen mukaan q̂ =ε⇒ qF. Jokainen a1a2⋯an ∈ Γ* voidaan hyväksyä polulla, joka vihjeen mukaan kulkee q̂ =a1⇒ q̂ =a2⇒ q̂ … q̂ =an⇒ q̂ =ε⇒ qF. Vaikka voikin olla Σ ≠ Γ, muita Σ*:n alkioita ei ole mukana seuraavasta syystä. Jos merkkijonossa esiintyy merkki, jolla mikään kaari ei ole merkitty, niin merkkijonon mukaan kulkeminen epäonnistuu viimeistään sen kohdalla.
Pelkästään ε-kaarista muodostuvat silmukat muodostavat erikoistapauksen, joka on otettava huomioon esimerkiksi pumppauslemmaa käsiteltäessä. Sellaisen silmukan kiertäminen tai kiertämättä jättäminen ei muuta luettua merkkijonoa. Kaikki silmukan tilat voidaan yhdistää yhdeksi tilaksi ilman, että hyväksytty kieli muuttuu. Tuleeko tämän yhdistetyn tilan olla lopputila? vastausYhdistetyn tilan tulee olla lopputila jos ja vain jos yksikin silmukan tila on lopputila.
Tässä luvussa tavoitteena on muuntaa NFA N = (QN, Σ, Δ, q̂N, FN) DFA:ksi D = (QD, Σ, δ, q̂D, FD), joka hyväksyy saman kielen. Tämä luku ei ehkä ole ihan helppo, joten voit katsoa sen suoritetuksi, jos koet oppineesi jotain uutta (ja tietenkin myös jos sait sen tehtyä). Päätavoitteena ei ole oppia miten muunnos toimii, vaan miten tällaisia asioita todistetaan. Siksi todistus etenee huomattavasti pienemmin askelin kuin kirjallisuudessa on tapana, ja välillä kerrotaan miksi tehdään niin kuin tehdään.
Käytämme alaindeksejä N ja D osoittamaan, kumman automaatin osista kulloinkin puhumme. Molemmilla automaateilla on sama aakkosto, joten merkitsemme sitä Σ emmekä ΣD ja ΣN. Symbolit Δ ja δ eivät tarvitse alaindeksejä, koska ne erottuvat toisistaan ilmankin.
Tuloksena syntyvän DFA:n D tilat ovat alkuperäisen NFA:n N tilojen joukkoja. Muunnos on ehkä helpoin ymmärtää, jos jokaiselle σ ∈ Σ* otamme käyttöön merkinnän qσ tarkoittamaan niiden N:n tilojen joukkoa, joihin N:n alkutilasta pääsee σ:lla N:n kaaria pitkin.
qσ = {q ∈ QN | q̂N =σ⇒ q}
Muunnoksen tuloksen osat voidaan nyt ilmaista lyhyillä kaavoilla. Niiden sisältöä avataan kaavojen jälkeen.
Merkkijonoja eli Σ*:n alkioita on äärettömästi (paitsi jos Σ = ∅). Kaavan QD = {qσ | σ ∈ Σ*} voi ajatella käyvän läpi ne kaikki ja tuottavan jokaiselle niistä tilan. Tiloja ei kuitenkaan synny äärettömästi tästä syystäEri merkkijonoille voi syntyä samoja tiloja, eli voi olla qσ = qρ vaikka σ ≠ ρ.. Koska tuotettavat tilat ovat QN:n …osajoukkoja, niitä voi syntyä enintään näin monta2|QN|.
Olkoon a merkki ja σ merkkijono. Osan δ ymmärtämiseksi ilmaisemme qσa:n seuraavasti: qσa on niiden N:n tilojen joukko, joihin päästään qσ:n sisältämistä tiloista polkua pitkin, jossa on ensin nolla tai useampia ε-kaaria, sitten yksi a-kaari, ja lopuksi nolla tai useampia ε-kaaria.
qσa = {q ∈ QN | ∃ q’ ∈ qσ: q’ =a⇒ q}
Tämän kaavan todistamiseksi pitää osoittaa, että jos q ∈ qσa, niin ∃ q’ ∈ qσ: q’ =a⇒ q ja päinvastoin. Todistus on yksinkertainen ja tylsä. Siinä vedotaan toistuvasti qσ:n edellä olleeseen määritelmään ja pari kertaa =a1⋯an⇒:n määritelmään.
Kenties huomasit, että juuri todistamamme kaavan oikea puoli on melkein samanlainen kuin δ(qD, a):n määritelmän oikea puoli. Muuta eroa ei ole kuin (ilmaise sekä symbolina että sanallisesti) siinä missä δ(qD, a):n määritelmässä on tämäqD eli tuotettavan DFA:n tila, qσa:n kaavassa on tämäqσ eli niiden tilojen joukko, johon alkuperäisessä NFA:ssa pääsee σ:lla. Niinpä jos qσ sattumoisin on sellainen tila, johon δ(qD, a):n määritelmää voi soveltaa, niin saamme δ(qσ, a) = qσa. Voiko näin tyylikäs tulos olla sattumaa? vastausVoi, mutta aika usein ei ole. Tälläkään kertaa ei ole. Merkinnät pyritään usein valitsemaan siten, että merkintöjen väliset suhteet vastaavat merkintöjen tarkoittamien asioiden välisiä suhteita. Se helpottaa päättelyn seuraamista.
Mitkä qσ ovat sellaisia tiloja? Tilan qσ saa panna qD:n paikalle δ(qD, a):ssa sillä qD:tä koskevalla ehdolla, mikä δ(qD, a):n määritelmässä on sanottu. Se on tämäqD ∈ QD. Täytyy siis olla qσ ∈ QD.. Mitkä qσ toteuttavat tämän ehdon? vihjeSen näkee QD:n määritelmästä. vastausKaikki.
Tästä seuraa, että jos valitsemme q̂D:n sopivasti, niin D:ssä jokaiselle merkkijonolle σ pätee q̂D =σ⇒ qσ. Se tarkoittaa, että ajamalla D:ssä σ:n saamme selville kaikkien niiden tilojen joukon, joissa N voi olla ajettuaan σ:n. Jotta tämä pätisi kun σ = ε, täytyy olla …q̂D =ε⇒ qε. Koska DFA:issa ei ole ε-kaaria, on DFA:issa voimassa sääntö, että jos q =ε⇒ q’, niin …q’ = q. Tapaukseen q̂D =ε⇒ qε sovellettuna tämä tarkoittaa …qε = q̂D. Juuri näinhän edellä valittiin.
Olemme luvanneet, että q̂D =σ⇒ qσ, mutta emme vielä ole todistaneet sitä. Nyt todistamme. Olkoon sitä varten σ = a1a2⋯an mikä tahansa merkkijono. Tarvitsemme seuraavaa periaatetta, jota merkitsemme (*): jos DFA:ssa q =σ⇒ q’ ja δ(q’, a) = q’’, niin q =σa⇒ q’’. Periaatteen pätevyys seuraa suoraan perusmääritelmistä. Se on helppo nähdä päteväksi, kun muotoilee sen sanoiksi: …Jos q:sta on σ:lla merkitty polku q’:uun ja sieltä on a-kaari q’’:uun, niin yhdessä ne muodostavat σa:lla merkityn polun q:sta q’’:uun..
Tämä päättely etenee siis mitä tahansa merkkijonoa pitkin merkki kerrallaan, kunnes koko merkkijono on sen piirissä. Niinpä se todistaa jokaiselle merkkijonolle σ, että q̂D =σ⇒ qσ. Tällaista samanlaisilla askelilla pienestä suureen etenevää todistusta kutsutaan …induktiotodistukseksi.
Halusimme, että D hyväksyy saman kielen kuin N. Siksi jos σ vie N:ssä alkutilasta johonkin lopputilaan, pitää saman tapahtua D:ssä, eli qσ:n pitää olla lopputila. Jos σ ei vie N:ssä alkutilasta mihinkään lopputilaan, qσ …ei saa olla lopputila. Määritelmänsä mukaan qσ on niiden N:n tilojen joukko, joihin N:ssä pääsee N:n alkutilasta σ:lla. Siksi on helppo katsoa qσ:sta, hyväksyykö N σ:n. Näin se käy.Katsotaan, sisältääkö qσ yhtään N:n lopputilaa, eli päteekö qσ ∩ FN ≠ ∅. Edellä FD määriteltiin D:n niiden tilojen qσ joukkona, joille tämä ehto pätee. Rajaus D:n tiloihin esitettiin näinRajauduttiin niihin qσ, joille σ on merkkijono. Se on QD:n määritelmän mukaan täsmälleen sama joukko kuin QD:n tilojen joukko..
Vielä ei ole ihan valmista. Emme ole todistaneet, että D on DFA. Tällaisten tarkastaminen on usein helppoa ja saatetaan ilman mainintaa jättää lukijan tehtäväksi. Siinä on vaarana, että lopulta kukaan ei tarkasta asiaa, ja se ei pidäkään paikkaansa.
DFA:n määritelmässä asetetaan jokaiselle osalle oma ehto. Mitkä ne ehdot ovat ja mitkä niistä olemme edellä jo tarkastaneet? QDQD on äärellinen joukko. Tämän olemme tarkastaneet. ΣΣ on äärellinen joukko, jolle pätee ε ∉ Σ. Tästä emme ole puhuneet, mutta se on hyvin ilmeinen. Se olkoon rästi 1. δδ on osittainen funktio joukolta QD × Σ joukolle QD. Tätä emme ole tarkastaneet. Se on niin vaikea, että kannattaa tehdä muut ensin ja tehdä tämä lopuksi rästeinä 3 ja 4. q̂Dq̂D ∈ QD. Emme ehkä ole sanoneet tätä aivan suoraan, mutta se nähdään helposti todeksi. Tämä olkoon rästi 2. FDFD ⊆ QD. Edellä perusteltiin, että FD:n alkiot ovat D:n tiloja.
Tarkastamme ne ehdot, jotka ovat vielä tarkastamatta. rästi 1Myös NFA:n määritelmässä on sama vaatimus, ja Σ on myös N:n aakkosto. Siksi väite seuraa siitä lähtökohdastamme, että N on NFA. rästi 2Määriteltiin q̂D = qε, qε on muotoa qσ, ja QD on kaikkien sitä muotoa olevien tilojen joukko. rästi 3Edellä δ(qD, a) määriteltiin jokaiselle qD ∈ QD ja a ∈ Σ, joten δ on funktio niiltä joukoilta miltä pitääkin. Se on itse asiassa täysi funktio, mutta se ei haittaa, sillä matematiikassa jokainen täysi funktio on osittainen funktio. rästi 4Myös δ:n tuloksen pitää olla QD:n alkio. Tämä seuraa siitä, että jos qD ∈ QD, niin QD:n määritelmän vuoksi on olemassa jokin sellainen σ, että qD = qσ. Olemme osoittaneet, että δ(qσ, a) = qσa. Merkkijonon määritelmästä seuraa, että jos σ ∈ Σ* ja a ∈ Σ, niin myös σa ∈ Σ*. Siksi käyttämällä QD:n määritelmässä σa:ta nähdään, että δ:n tulos eli qσa on QD:n alkio.
Tämän luvun alussa lupasimme, että D on DFA ja hyväksyy saman kielen kuin N. Olemme osoittaneet molemmat.
Aakkosto on tämä{a, b, c, d}, ja sille ei tapahdu muunnoksessa mitään. Muodostamme aluksi tilan q̂D, joka tunnetaan myös tälläqε merkkijonoa alaindeksinä käyttävällä nimellä. Saamme tulokseksi q̂D = …{1, 2, 3, 4}.
Seuraavaksi valitsemme sen qD:ksi ja laskemme jokaiselle a ∈ Σ joukon {q ∈ QN | ∃ q’ ∈ qD: q’ =a⇒ q}.
δ(q̂D, a) = | …{1, 2, 3, 4} |
δ(q̂D, b) = | …{2, 3, 4} |
δ(q̂D, c) = | …{3, 4} |
δ(q̂D, d) = | …{4} |
Saimme yhden vanhan tilan eli {1, 2, 3, 4} ja kolme uutta tilaa. Kun teemme jokaiselle uudelle tilalle samanlaisen laskun, löydämme vielä yhden uuden tilan. Kaikkiaan saamme seuraavan taulukon:
a | b | c | d | |
{1, 2, 3, 4} | …{1, 2, 3, 4} | …{2, 3, 4} | …{3, 4} | …{4} |
{2, 3, 4} | …∅ | …{2, 3, 4} | …{3, 4} | …{4} |
{3, 4} | …∅ | …∅ | …{3, 4} | …{4} |
{4} | …∅ | …∅ | …∅ | …{4} |
…∅ | …∅ | …∅ | …∅ | …∅ |
Lopputiloja ovat …{1, 2, 3, 4}, {2, 3, 4} ja {3, 4}. Piirrettynä lopputulos näyttää tältä Tyhjää joukkoa vastaava tila on turha. Siihen tulevat kaaret olivat tylsiä piirtää, koska tilaa oli niukasti!.
DFA:ille ja NFA:ille voidaan tehdä muitakin temppuja. Voidaan muun muassa yhdistää kaksi NFA:ta yhdeksi, jonka hyväksymä kieli on alkuperäisten NFA:iden hyväksymien kielten leikkaus. DFA:illa ja NFA:illa on käytännön kannalta hyödyllinen kaveri nimeltä säännölliset lausekkeet (regular expression), joka on helppo muuntaa NFA:ksi.