✖

Omdannelse af NFA til DFA

Vi viser, hvordan man omdanner en ikke-deterministisk automat til en deterministisk automat, hvormed vi beviser, at beregningskraften hos ikke-deterministiske og deterministiske automater er ækvivalent.

Grundidé

Vi har en ikke-deterministisk automat ⟨QN, ΣN, δN, q0, FN⟩ uden epsilon-overgange. Vi konstruerer en deterministisk automat ⟨QD, ΣD, δD, p0, FD⟩ således, at

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

Overgangsfunktionen δD definerer vi på følgende måde:

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

Hvad betyder det? En ikke-deterministisk automat kan være i flere tilstande på samme tid, så vi kan for eksempel komme i en situation, hvor vores ikke-deterministiske automat er i tilstandene {q0, q1}. Ved at læse det næste symbol, for eksempel 1, kan vi komme til mængden af tilstande {q0, q2, q3}. I den deterministiske version af den samme automat viser det sig ved, at vi laver to tilstande, navngiver dem {q0, q1} og {q0, q2, q3} og indfører en overgang mellem dem for symbolet 1. Formelt kommer vi fra den ene tilstand til den anden, men takket være navngivningen ved vi, at vi i den ikke-deterministiske automat ville være havnet i to, henholdsvis tre tilstande.

Eksempel

Vi ser på denne ikke-deterministiske automat:

For at konstruere den deterministiske automat skal vi først og fremmest konstruere en ny overgangsfunktion. Til det bruger vi en tabel, som vi skriver alle overgange ind i. I begyndelsen ser tabellen sådan ud:

tilstand/symbol01{q0}

I den venstre søjle vil vi til sidst i algoritmen have alle tilstande i den deterministiske automat. Den udfyldte tabel vil så bestemme overgangsfunktionen. Nu skriver vi i tabellen, hvilke tilstande vi kommer til, hvis vi er i tilstandene {q0} og inputsymbolerne er 0 og 1.

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

Fra tilstanden q0 går der for symbolet 0 kun en overgang til tilstanden q1, mens der for symbolet 1 går overgange til tilstandene q1 og q2. Nu tilføjer vi to nye tilstande til tabellen: {q1} og {q1, q2}. Hvorfor? I det øjeblik, vi i tabellen udfylder en mængde af tilstande, som vi ikke endnu har i den venstre søjle, tilføjer vi denne mængde af tilstande dertil.

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

og vi udfylder igen. Ved tilstanden {q1, q2} må vi ikke glemme at kontrollere begge tilstande, dvs. hvor vi kommer hen fra tilstanden q1 forenet med, hvor vi kommer hen fra tilstanden q2.

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

Vi fik nogle nye tilstande, som vi skal tilføje til 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 udfylder igen overgangene:

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 tilføjer bare 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 tilføjede ikke flere nye tilstande, så tabellen er udfyldt. Nu mangler vi bare at tegne diagrammet. Tilstandene i den deterministiske automat står i den første søjle, overgangene for symbolerne 0 og 1 i de næste. Hver tilstand, der indeholder en accepttilstand fra den oprindelige automat, bliver også en accepttilstand i denne automat. Dvs. at hver tilstand, der indeholder q3, bliver en accepttilstand. Automaten kommer til at se sådan ud:

Vi kan vise, at automaten virker helt korrekt. Vi prøver at acceptere ordet 11001. I den deterministiske automat går vi ad vejen

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

og automaten ville acceptere ordet, fordi den sidste tilstand {q0, q1, q2, q3} er accepterende. I den ikke-deterministiske automat ville vi under simuleringen komme til de samme tilstande, dvs. vi ville begynde i tilstanden q0, og for symbolet 1 ville vi komme til tilstandene {q1, q2}. Det næste symbol 1 ville føre os til tilstandene {q0,q3} osv. for de følgende tilstande. Til sidst ville vi ende i alle tilstandene {q0, q1, q2, q3}, og automaten ville acceptere ordet.

Kilder

Kapitler: Endelig automat, Total automat, Ikke-deterministisk endelig automat, Simulering af en NFA, Omdannelse af NFA til DFA