✖

Automaatin muuntaminen säännölliseksi lausekkeeksi

Näytämme, miten mikä tahansa äärellinen automaatti muunnetaan säännölliseksi lausekkeeksi.

Algoritmin kuvaus

Syötteenä on jokin NFA A. Ensimmäiseksi teemme siitä GNFA:n. Toisessa vaiheessa poistamme aina yhdellä askeleella yhden tilan, muutamme siirtymäfunktiota oikein ja toistamme, kunnes jäljellä on vain kaksi tilaa — alku- ja lopputila. Niiden välillä on kaari, jonka nimiönä on säännöllinen lauseke, ja se on koko algoritmin tulos. Koko menettely koostuu siis ennen kaikkea tilan poistamisesta ja automaatin sitä seuraavasta korjaamisesta niin, että saamme ekvivalentin automaatin.

Yhden tilan poistaminen

Sen, miten yksi tila poistetaan, voi havainnollistaa yksinkertaisella esimerkillä. Oletetaan, että osa automaatistamme näyttää tältä:

jossa Ri ovat säännöllisiä lausekkeita. Miltä automaatti näyttäisi, jos poistaisimme tilan qr? Voimme ajatella asian niin, että olemme tilassa qi ja kysymme, mitkä kaikki sanat pystymme tuottamaan tällä osuudella. Jos menemme tilasta qi suoraan tilaan qj, ne ovat kaikki sanat, jotka vastaavat säännöllistä lauseketta R4.

Jos taas menemme tilaan qr, voimme tuottaa muotoa R1 olevia sanoja. Tilassa qr voimme kuitenkin kiertää lausekkeella R2, joten voimme oikeastaan tuottaa muotoa R1∘(R2∗) olevia sanoja. Ja koska tilasta qr pääsee vielä tilaan qj, lisäämme siihen vielä säännöllisen lausekkeen R3. Kaiken kaikkiaan tätä reittiä voimme siis saada muotoa R1∘(R2∗)∘R3 olevia sanoja.

Nyt tiedämme, että tästä automaatin osasta voi syntyä muotoa R4 tai muotoa R1∘(R2∗)∘R3 olevia sanoja. Sen voi tietenkin kirjoittaa säännöllisen lausekkeen muotoon (R4)|(R1∘(R2∗)∘R3).

Nyt voimme helposti poistaa tilan qr ja jättää vain kaksi tilaa qi ja qj, ja lausekkeen R4 tilalle kirjoitamme juuri lasketun säännöllisen lausekkeen:

Teemme tämän menettelyn jokaiselle kaarelle jokaisesta tilasta qi johonkin tilaan qj, silmukat mukaan lukien, eli myös tapaukselle, jossa qi = qj.

Yhden tilan poistamisen jälkeen saamme ekvivalentin automaatin — automaatin, joka tunnistaa saman kielen.

Koko algoritmi

Syötteenä on NFA A = (Q, Σ, δ, q0, F).

  1. Muunnamme NFA:n A GNFA:ksi Z = (Q′, Σ, δ′, q0′, qf′). Jatkossa kirjaimella k merkitään tilojen määrää automaatissa Z.
  2. Jos k = 2, algoritmi päättyy ja alku- ja lopputilan välisellä kaarella on tuloksena oleva säännöllinen lauseke.
  3. Jos k>2, valitsemme minkä tahansa tilan qr, joka on eri kuin alku- ja lopputila, eli qr ≠ q0′ ja qr ≠ qf′. Sitten luomme uuden GNFA:n Z′ = (Q′′, Σ, δ′′, q0′, qf′), jolle pätee: Q′′=Q′∖{qr} ja kaikille qi ∈ Q′′ ∖ {qf′} ja kaikille qj ∈ Q′′ ∖ {q0′} olkoon δ′′(qi,qj)=(R4)|(R1(R2∗)R3), jossa R1 = δ′(qi,qr), R2 = δ′(qr,qr), R3 = δ′(qr, qj), R4 = δ′(qi, qj). Jatka sitten askeleesta 2.

Esimerkki

Olkoon syötteenä tämä äärellinen automaatti:

Ensimmäiseksi muunnamme sen GNFA:ksi (turhia ∅-siirtymiä emme piirrä näkyviin):

Nyt sovellamme algoritmin toista osaa ja poistamme jonkin solmun. Aloitamme solmusta q2. Poistamme solmun q2 ja lisäämme siirtymän tilasta q1 tilaan qf. Merkitsemme tämän siirtymän b(a|b)∗, koska solmusta q1 pääsemme tilaan q2 muotoa b oleville sanoille, sitten voimme kiertää lausekkeella a|b, jolloin saamme (a|b)∗, ja lopuksi siirrymme epsilon-säännöllä tilaan qf. Samalla pätee b(a|b)∗ϵ = b(a|b)∗. Saamme automaatin:

Jäljellä on viimeisen tilan q1 poistaminen. Lisäämme kaaren tilasta qs tilaan qf. Miten sen merkitsemme? Tilaan q1 pääsemme epsilon-säännöllä, jonka voi suoraan jättää pois. Sitten voimme kiertää lausekkeella a, joten saamme säännöllisen lausekkeen a∗. Ja lopuksi kaarta pitkin pääsemme tilaan qf, joten lauseke liitetään vielä lausekkeeseen b(a|b)∗. Kuvaamme kaaren siis säännöllisellä lausekkeella a∗ b(a|b)∗.

Automaatissa on enää kaksi tilaa, joten algoritmi päättyy. Kaarella on tuloksena oleva säännöllinen lauseke.

Lähteet

Luvut: Säännölliset lausekkeet, Säännöllisen lausekkeen muuntaminen automaatiksi, Yleistetty epädeterministinen äärellinen automaatti, Automaatin muuntaminen säännölliseksi lausekkeeksi