✖

NFA:n muuntaminen DFA:ksi

Näytämme, miten epädeterministinen automaatti muunnetaan deterministiseksi automaatiksi, ja todistamme näin, että epädeterminististen ja determinististen automaattien laskentateho on yhtä suuri.

Perusajatus

Olkoon meillä epädeterministinen automaatti (QN, ΣN, δN, q0, FN) ilman epsilon-siirtymiä. Rakennamme deterministisen automaatin (QD, ΣD, δD, p0, FD) näin:

  • QD ⊆ 2QN
  • ΣD = ΣN
  • p0 = {q0}
  • FD = {Q ∈ QD | Q ∩ FN ≠ ∅}

Siirtymäfunktion δD määrittelemme seuraavasti:

∀Q∈QD,a∈ΣD:δD(Q,a)=⋃q∈QδN(q,a)

Mitä tämä tarkoittaa? Epädeterministinen automaatti voi olla samanaikaisesti useassa tilassa, joten voimme esimerkiksi päätyä tilanteeseen, jossa epädeterministinen automaattimme on tiloissa {q0, q1}. Lukemalla seuraavan symbolin, esimerkiksi 1, voimme päästä tilojen joukkoon {q0, q2, q3}. Saman automaatin deterministisessä versiossa tämä näkyy niin, että luomme kaksi tilaa, nimeämme ne {q0, q1} ja {q0, q2, q3} ja lisäämme niiden välille siirtymän symbolille 1. Muodollisesti siirrymme yhdestä tilasta toiseen, mutta nimeämisen ansiosta tiedämme, että epädeterministisessä automaatissa olisimme kahdessa tai kolmessa tilassa.

Esimerkki

Olkoon meillä tämä epädeterministinen automaatti:

Deterministisen automaatin rakentamiseksi tarvitsemme ennen kaikkea uuden siirtymäfunktion. Siinä auttaa taulukko, johon kirjaamme kaikki siirtymät. Alussa taulukko näyttää tältä:

tila/symboli01{q0}

Vasempaan sarakkeeseen tulee algoritmin lopussa kaikki deterministisen automaatin tilat. Täytetty taulukko määrää sitten siirtymäfunktion. Nyt kirjaamme taulukkoon, mihin tiloihin pääsemme, kun olemme tilassa {q0} ja syötteenä ovat symbolit 0 ja 1.

tila/symboli01{q0}{q1}{q1,q2}

Tilasta q0 lähtee symbolille 0 siirtymä vain tilaan q1, kun taas symbolille 1 se lähtee tiloihin q1 ja q2. Nyt lisäämme taulukkoon kaksi uutta tilaa: {q1} ja {q1, q2}. Miksi? Aina kun taulukkoon täydennetään jokin tilojen joukko, jota ei vielä ole vasemmassa sarakkeessa, lisäämme sen joukon sinne.

tila/symboli01{q0}{q1}{q1,q2}{q1}{q1,q2}

ja täydennämme taas. Tilan {q1, q2} kohdalla emme saa unohtaa tarkistaa molempia tiloja, eli sitä, minne pääsemme tilasta q1, yhdisteenä sen kanssa, minne pääsemme tilasta q2.

tila/symboli01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}

Saimme useita uusia tiloja, jotka meidän täytyy lisätä taulukkoon:

tila/symboli01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}{q0,q1,q3}{q0,q3}

…ja täydennämme taas siirtymät:

tila/symboli01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}{q0,q1,q3}{q0,q1,q3}{q0,q1,q2,q3}{q0,q3}{q1}{q1,q2}

Tilat {q0, q1, q3}, {q1} ja {q1,q2} meillä on jo, joten lisäämme vain tilan {q0,q1,q2,q3}.

tila/symboli01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}{q0,q1,q3}{q0,q1,q3}{q0,q1,q2,q3}{q0,q3}{q1}{q1,q2}{q0,q1,q2,q3}{q0,q1,q3}{q0,q1,q2,q3}

Emme lisänneet enää yhtään uutta tilaa, joten taulukko on täytetty. Nyt enää piirrämme kaavion. Deterministisen automaatin tilat ovat ensimmäisessä sarakkeessa, siirtymät symboleille 0 ja 1 seuraavissa. Jokainen tila, joka sisältää jonkin alkuperäisen automaatin lopputilan, on lopputila myös tässä automaatissa. Eli jokainen tilaa q3 sisältävä tila on lopputila. Automaatti näyttää tältä:

Voimme näyttää, että automaatti toimii todella oikein. Yritetään hyväksyä sana 11001. Deterministisessä automaatissa kuljemme polkua

q0→1q1,q2→1q0,q3→0q1→0q0,q1,q3→1q0,q1,q2,q3

ja automaatti hyväksyisi sanan, koska viimeinen tila {q0, q1, q2, q3} on lopputila. Epädeterministisessä automaatissa päätyisimme simuloinnin aikana samoihin tiloihin, eli aloittaisimme tilasta q0 ja symbolilla 1 päätyisimme tiloihin {q1, q2}. Seuraava symboli 1 vie meidät tiloihin {q0,q3} jne. seuraavien tilojen osalta. Lopulta päätyisimme kaikkiin tiloihin {q0, q1, q2, q3} ja automaatti hyväksyisi sanan.

Lähteet

Luvut: Äärellinen automaatti, Täydellinen automaatti, Epädeterministinen äärellinen automaatti, Epädeterministisen automaatin simulointi, NFA:n muuntaminen DFA:ksi