✖

Omzetting van NFA naar DFA

We laten zien hoe je een niet-deterministische automaat omzet naar een deterministische automaat. Daarmee bewijzen we dat niet-deterministische en deterministische automaten evenveel kunnen berekenen (dezelfde rekenkracht hebben).

Basisidee

Neem een niet-deterministische automaat ⟨QN, ΣN, δN, q0, FN⟩ zonder epsilonovergangen. We bouwen een deterministische automaat ⟨QD, ΣD, δD, p0, FD⟩ zo dat

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

De overgangsfunctie δD definiëren we als volgt:

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

Wat betekent dit? Een niet-deterministische automaat kan tegelijk in meerdere toestanden zijn, dus we kunnen bijvoorbeeld in de situatie komen dat onze niet-deterministische automaat in de toestanden {q0, q1} zit. Door het volgende symbool te lezen, bijvoorbeeld 1, kunnen we in de verzameling toestanden {q0, q2, q3} komen. In de deterministische versie van dezelfde automaat komt dat tot uiting doordat we twee toestanden maken, ze {q0, q1} en {q0, q2, q3} noemen en daartussen een overgang voor het symbool 1 invoeren. Formeel gaan we zo van de ene toestand naar de andere, maar dankzij de naamgeving weten we dat we in de niet-deterministische automaat in twee, respectievelijk drie toestanden zouden zitten.

Voorbeeld

Neem deze niet-deterministische automaat:

Om de deterministische automaat te construeren, moeten we vooral een nieuwe overgangsfunctie opstellen. Daarbij helpt een tabel waarin we alle overgangen noteren. Aan het begin ziet de tabel er zo uit:

toestand/symbool01{q0}

In de linkerkolom staan aan het einde van het algoritme alle toestanden van de deterministische automaat. De ingevulde tabel bepaalt dan de overgangsfunctie. Nu noteren we in de tabel in welke toestanden we komen als we in de toestanden {q0} zitten en de invoer de symbolen 0 en 1 is.

toestand/symbool01{q0}{q1}{q1,q2}

Vanuit toestand q0 loopt voor het symbool 0 alleen een overgang naar toestand q1, terwijl er voor het symbool 1 overgangen lopen naar de toestanden q1 en q2. Nu voegen we twee nieuwe toestanden aan de tabel toe: {q1} en {q1, q2}. Waarom? Zodra we in de tabel een verzameling toestanden invullen die nog niet in de linkerkolom staat, voegen we die verzameling toestanden daar toe.

toestand/symbool01{q0}{q1}{q1,q2}{q1}{q1,q2}

en we vullen weer in. Bij de toestand {q1, q2} mogen we niet vergeten beide toestanden te controleren, dus waar we vanuit toestand q1 komen, verenigd met waar we vanuit toestand q2 komen.

toestand/symbool01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}

We hebben een aantal nieuwe toestanden gekregen, die we aan de tabel moeten toevoegen:

toestand/symbool01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}{q0,q1,q3}{q0,q3}

…en we vullen de overgangen weer in:

toestand/symbool01{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}

De toestanden {q0, q1, q3}, {q1} en {q1,q2} hebben we al, dus we voegen alleen de toestand {q0,q1,q2,q3} toe.

toestand/symbool01{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}

We hebben geen nieuwe toestand meer toegevoegd, dus de tabel is ingevuld. Nu hoeven we alleen nog het diagram te tekenen. De toestanden van de deterministische automaat staan in de eerste kolom, de overgangen voor de symbolen 0 en 1 in de volgende. Elke toestand die een eindtoestand van de oorspronkelijke automaat bevat, is ook in deze automaat een eindtoestand. Dat wil zeggen dat elke toestand die q3 bevat een eindtoestand wordt. De automaat ziet er zo uit:

We kunnen laten zien dat de automaat echt goed werkt. We proberen het woord 11001 te accepteren. In de deterministische automaat volgen we het pad

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

en de automaat zou het woord accepteren, omdat de laatste toestand {q0, q1, q2, q3} een eindtoestand is. In de niet-deterministische automaat zouden we tijdens de simulatie in dezelfde toestanden komen: we zouden beginnen in toestand q0 en voor het symbool 1 in de toestanden {q1, q2} komen. Het volgende symbool 1 zou ons in de toestanden {q0,q3} brengen enzovoort voor de volgende toestanden. Uiteindelijk zouden we in alle toestanden {q0, q1, q2, q3} belanden en de automaat zou het woord accepteren.

Bronnen

Hoofdstukken: Eindige automaat, Totale automaat, Niet-deterministische eindige automaat, Simulatie van een niet-deterministische automaat, Omzetting van NFA naar DFA