Epädeterministisen automaatin simulointi
Jos meillä on epädeterministinen automaatti ja haluamme selvittää, hyväksyykö se annetun sanan, voimme muuntaa automaatin deterministiseksi, voimme jotenkin kokeilla tai voimme käyttää algoritmia, joka simuloi NFA:n toimintaa.
Algoritmin periaate
Näytämme periaatteen havainnollisesti sopivan esimerkin avulla. Olkoon meillä tämä automaatti:
Kyseessä on epädeterministinen äärellinen automaatti, joka hyväksyy jonkin kielen. Meidän ei nyt tarvitse lainkaan tietää, minkä. Näytämme, miltä tällaisen automaatin laskenta voi näyttää syötesanalle 11001. Ajatus on tämä: käsittelemme sanan yhden symbolin ja katsomme, minne kaikkialle voimme päästä, kun samalle symbolille on useita siirtymiä. Muistamme kaikki nämä tilat, ja seuraavassa askeleessa oletamme jo olevamme ”kaikissa näissä tiloissa yhtä aikaa” ja meitä kiinnostaa, minne näistä tiloista pääsemme edelleen.
Muistamme siis joukon tiloja, joissa voimme olla, ja sanan lukemattoman osan. Alussa meillä on pari ({q0}, 11001). Aloitamme tilasta q0 (alkutila) ja syötteenä on sana 11001. Automaatti näyttää tältä, punaisella ja lihavoituna on korostettu tila, jossa olemme:
Ensimmäinen symboli on 1, tilasta q0 on symbolille 1 vain yksi siirtymä, joten päädymme tilaan q1. Muistamme parin ({q1}, 1001). Automaatti näyttää tältä:
Jatkamme eteenpäin. Sanan lukematon osa on 1001, joten etsimme taas siirtymiä symbolille 1. Niitä on nyt kaksi — takaisin tilaan q0 ja lisäksi tilaan q3. Nyt lähdemme molempiin tiloihin yhtä aikaa. Muistamme siis parin ({q0, q3}, 001).
Mikä tässä on logiikka? Tiedämme, että alkutilasta on olemassa polku, jolla sanalla 11 päästään sekä tilaan q3 että tilaan q0. Emme vielä tiedä, kumpi haara on meille hyödyllinen, joten muistamme yksinkertaisesti molemmat. Jatkamme eteenpäin. Syötteenä on symboli 0. Nyt meidän täytyy katsoa sekä tilasta q0 että tilasta q3 lähteviä siirtymiä. Tilasta q0 lähtevät siirtymät tiloihin q1 ja q2, tilasta q3 lähtee siirtymä takaisin tilaan q1. Otamme mukaan kaikki nämä tilat, jolloin saamme parin ({q1, q2}, 01):
Tämä askel ei kuitenkaan ole vielä valmis. Näemme, että tilasta q2 lähtee epsilon-siirtymä tilaan q4. Tiedämme, että epsilon-siirtymän voi tehdä ”milloin tahansa” lukematta seuraavaa merkkiä. Toisin sanoen — lukematta seuraavaa symbolia syötesanasta voimme vielä siirtyä tilaan q4. Lisäämme siis tilan q4 niiden tilojen joukkoon, joissa voimme olla: ({q1, q2, q4}, 01). Väritämme automaatin näin:
Seuraavaksi syötteenä on 0. Katsomme, minne voimme siirtyä niistä kolmesta tilasta, joissa olemme. Tilasta q1 emme voi siirtyä minnekään, koska symbolille 0 ei ole siirtymää. Laskenta tässä haarassa päättyy. Tilasta q4 emme myöskään pääse mihinkään. Tilasta q2 pääsemme takaisin tilaan q2. Mutta koska tilasta q2 lähtee jälleen epsilon-siirtymä tilaan q4, voimme päästä myös tilaan q4. Tilojen joukosta {q1, q2, q4} pääsemme siis symbolilla 0 tilojen joukkoon {q2, q4}, ja saamme parin ({q2, q4}, 1):
Lopuksi syötteenä on symboli 1. Tilasta q2 emme pääse minnekään, laskenta tässä haarassa päättyy. Tilasta q4 pääsemme kuitenkin tiloihin q3 ja q5. Saamme parin ({q3, q5}, ε):
Automaatti on nyt lukenut koko sanan ja ”on” kahdessa tilassa: q3, q5. Koska ainakin yksi niistä on lopputila, automaatti hyväksyy sanan 11001.
Algoritmi
Ensimmäiseksi tarvitsemme funktion, joka ottaa parametrina tilojen joukon ja laskee, mihin tiloihin pääsemme lisäksi epsilon-siirtymien avulla. Syötteenä on siis automaatti (Q, Σ, δ, q0, F) ja tilojen joukko States, ja tulosteena on näiden tilojen ylijoukko, johon kuuluvat tilat, joihin pääsee epsilon-siirtymien avulla. Tätä operaatiota kutsumme joukon States epsilon-sulkeumaksi.
Käytämme tätä funktiota funktiossa, joka simuloi epädeterministisen automaatin toimintaa. Syötteenä on automaatti, syötesana w = w1w2… wn ja tilojen joukko, joissa automaatti parhaillaan on. Tulosteena on joko vastaus YES (kyllä) tai NO (ei) sen mukaan, hyväksyykö automaatti annetun sanan vai ei.
Jos haluamme tarkistaa, hyväksyykö automaatti sanan w, kutsumme funktiota näin: ComputeNFA((Q, Σ, δ, q0, F), w, EpsilonClosure((Q, Σ, δ, q0, F), {q0})).
Lähteet
Luvut: Äärellinen automaatti, Täydellinen automaatti, Epädeterministinen äärellinen automaatti, Epädeterministisen automaatin simulointi, NFA:n muuntaminen DFA:ksi