Säännöllisen lausekkeen muuntaminen automaatiksi
Näytämme, miten mikä tahansa säännöllinen lauseke muunnetaan epädeterministiseksi äärelliseksi automaatiksi.
Esimerkki
Ennen kuin kuvaamme itse algoritmin, näytämme esimerkillä, mistä oikeastaan on kyse. Olkoon meillä tämä säännöllinen lauseke: a(b|c)x∗. Sanoin kuvaisimme säännöllisen lausekkeen tuottaman kielen sanoiksi, jotka alkavat kirjaimella ”a”, sen jälkeen tulee joko kirjain ”b” tai ”c” ja sitten mikä tahansa määrä kirjaimia ”x”. Osaisimmeko rakentaa automaatin, joka hyväksyisi tämän kielen? Kyllä vain, katso:
Tämä automaatti hyväksyy selvästi saman kielen. Herää kysymys, onko jokaiselle säännölliselle lausekkeelle olemassa automaatti, joka hyväksyy kyseisen kielen. No, on.
Säännöllisen lausekkeen muuntaminen automaatiksi: algoritmin kuvaus
Oletamme, että syötteenä on säännöllinen lauseke R. Aiemmasta säännöllisiä lausekkeita käsittelevästä osasta tiedämme, että säännöllisellä lausekkeella voi olla yhteensä kuusi eri muotoa. Erotamme siis kuusi eri tapausta:
-
R = a jollekin symbolille a ∈ Σ. Eli säännöllinen lauseke on vain yksi aakkoston Σ symboli, jonka yllä työskentelemme. Automaatti, joka hyväksyisi yhden symbolin a, näyttäisi tältä:
-
R = ϵ, tyhjä sana. Automaatti, joka hyväksyisi tyhjän sanan, näyttäisi tältä:
-
R = ∅, säännöllinen lauseke, joka tuottaa tyhjän kielen. Automaatti, joka tunnistaisi tällaisen kielen, on tämä:
-
R = R1 ∪ R2, jossa R1, R2 ovat säännöllisiä lausekkeita. Tiedämme jo, että säännöllisten kielten yhdiste on jälleen säännöllinen kieli ja että pystymme rakentamaan automaatin, joka hyväksyy sellaisen kielen. Toisin sanoen oletamme, että meillä on automaatit, jotka tunnistavat lausekkeiden R1 ja R2 tuottamat kielet, ja niiden avulla rakennamme automaatin, joka hyväksyy lausekkeen R1 ∪ R2 tuottaman kielen. Esimerkki: jos R1 = a ja R2 = ϵ, saamme menetelmän mukaan tämän automaatin:
-
R = R1 ∘ R2, jossa R1, R2 ovat säännöllisiä lausekkeita. Sama tapaus kuin edellisessä kohdassa. Säännöllisten kielten konkatenaatio on säännöllinen kieli, ja pystymme siis rakentamaan automaatin, joka hyväksyy sellaisen kielen. Jos siis R1 = a, R2 = b, konkatenaatio näyttäisi tältä:
-
, jossa R1 on säännöllinen lauseke. Tiedämme taas, että säännöllisen kielen Kleenen tähti on säännöllinen kieli. Jos siis R = a∗, automaatti näyttäisi tältä:
Soveltamalla näitä kohtia vähitellen muunnamme koko säännöllisen lausekkeen äärelliseksi automaatiksi.
Kokonainen esimerkki
Yritetään muuntaa säännöllinen lauseke (a|bc)∗. Saamme vähitellen nämä automaatit:
Tämä tuloksena syntyvä automaatti hyväksyy kielen, jonka säännöllinen lauseke (a|bc)∗ tuottaa. Automaatti on tietenkin hirvittävän monimutkainen, ja varmasti on olemassa paljon yksinkertaisempi automaatti, joka hyväksyy saman kielen. Voimme käyttää NFA:n muuntamisen DFA:ksi algoritmia ja sen jälkeen tehdä automaatin minimoinnin.
Lähteet
Luvut: Säännölliset lausekkeet, Säännöllisen lausekkeen muuntaminen automaatiksi, Yleistetty epädeterministinen äärellinen automaatti, Automaatin muuntaminen säännölliseksi lausekkeeksi