✖

Omforming av NFA til DFA

Vi skal vise hvordan du omformer en ikke-deterministisk automat til en deterministisk automat, og dermed beviser vi at beregningskraften til ikke-deterministiske og deterministiske automater er ekvivalent.

Grunntanken

La oss ha en ikke-deterministisk automat ⟨QN, ΣN, δN, q0, FN⟩ uten epsilonoverganger. Vi konstruerer en deterministisk automat ⟨QD, ΣD, δD, p0, FD⟩ slik at

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

Overgangsfunksjonen δD definerer vi som følger:

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

Hva betyr dette? En ikke-deterministisk automat kan være i flere tilstander samtidig, så vi kan for eksempel komme i en situasjon der den ikke-deterministiske automaten vår er i tilstandene {q0, q1}. Ved å lese neste symbol, for eksempel 1, kan vi komme til mengden av tilstander {q0, q2, q3}. I den deterministiske versjonen av den samme automaten viser det seg ved at vi lager to tilstander, gir dem navnene {q0, q1} og {q0, q2, q3} og innfører en overgang mellom dem for symbolet 1. Formelt kommer vi dermed fra én tilstand til en annen, men takket være navnene vet vi at vi i den ikke-deterministiske automaten ville havnet i henholdsvis to og tre tilstander.

Eksempel

La oss ha denne ikke-deterministiske automaten:

For å konstruere den deterministiske automaten må vi først og fremst konstruere en ny overgangsfunksjon. Til det har vi nytte av en tabell der vi skriver inn alle overgangene. I begynnelsen ser tabellen slik ut:

tilstand/symbol01{q0}

I den venstre kolonnen vil vi på slutten av algoritmen ha alle tilstandene i den deterministiske automaten. Den utfylte tabellen bestemmer da overgangsfunksjonen. Nå skriver vi inn i tabellen hvilke tilstander vi kommer til hvis vi er i tilstanden {q0} og symbolene 0 og 1 er input.

tilstand/symbol01{q0}{q1}{q1,q2}

Fra tilstanden q0 går det for symbolet 0 en overgang bare til tilstanden q1, mens det for symbolet 1 går overganger til tilstandene q1 og q2. Nå legger vi to nye tilstander til i tabellen: {q1} og {q1, q2}. Hvorfor? Så snart vi fyller ut en mengde av tilstander som vi ennå ikke har i den venstre kolonnen, legger vi denne mengden av tilstander til der.

tilstand/symbol01{q0}{q1}{q1,q2}{q1}{q1,q2}

og vi fyller ut igjen. For tilstanden {q1, q2} må vi ikke glemme å sjekke begge tilstandene, altså hvor vi kommer fra tilstanden q1, slått sammen med hvor vi kommer fra tilstanden q2.

tilstand/symbol01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}

Vi fikk flere nye tilstander som vi må legge til i tabellen:

tilstand/symbol01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}{q0,q1,q3}{q0,q3}

…og vi fyller ut overgangene igjen:

tilstand/symbol01{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}

Tilstandene {q0, q1, q3}, {q1} og {q1,q2} har vi allerede der, så vi legger bare til tilstanden {q0,q1,q2,q3}.

tilstand/symbol01{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}

Vi la ikke til noen ny tilstand denne gangen, så tabellen er ferdig utfylt. Nå gjenstår det bare å tegne diagrammet. Tilstandene i den deterministiske automaten står i den første kolonnen, og overgangene for symbolene 0 og 1 står i de neste. Hver tilstand som inneholder en sluttilstand fra den opprinnelige automaten, blir også en sluttilstand i denne automaten. Det betyr at hver tilstand som inneholder q3, blir en sluttilstand. Automaten kommer til å se slik ut:

Vi kan vise at automaten virkelig fungerer riktig. Vi prøver å akseptere ordet 11001. I den deterministiske automaten går vi veien

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

og automaten ville akseptert ordet, siden den siste tilstanden {q0, q1, q2, q3} er en sluttilstand. I den ikke-deterministiske automaten ville vi under simuleringen komme til de samme tilstandene, altså vi ville begynt i tilstanden q0 og kommet til tilstandene {q1, q2} for symbolet 1. Det neste symbolet 1 ville tatt oss til tilstandene {q0,q3} osv. for de neste tilstandene. Til slutt ville vi havnet i alle tilstandene {q0, q1, q2, q3}, og automaten ville akseptert ordet.

Kilder

Kapitler: Endelig automat, Total automat, Ikke-deterministisk endelig automat, Simulering av ikke-deterministisk automat, Omforming av NFA til DFA