✖

Conversia AFN în AFD

Vom vedea cum se convertește un automat nedeterminist într-un automat determinist, demonstrând astfel că puterea de calcul a automatelor nedeterministe și a celor deterministe este echivalentă.

Ideea de bază

Fie un automat nedeterminist ⟨QN, ΣN, δN, q0, FN⟩ fără ε-tranziții. Construim un automat determinist ⟨QD, ΣD, δD, p0, FD⟩ astfel încât

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

Funcția de tranziție δD o definim astfel:

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

Ce înseamnă asta? Un automat nedeterminist se poate afla simultan în mai multe stări, deci, de exemplu, putem ajunge în situația în care automatul nostru nedeterminist este în stările {q0, q1}. Citind următorul simbol, de exemplu 1, putem ajunge în mulțimea de stări {q0, q2, q3}. În versiunea deterministă a aceluiași automat, acest lucru se reflectă prin faptul că creăm două stări, le denumim {q0, q1} și {q0, q2, q3} și introducem între ele o tranziție pentru simbolul 1. Formal, trecem dintr-o stare în alta, dar datorită denumirii vom ști că în automatul nedeterminist ne-am fi aflat în două, respectiv în trei stări.

Exemplu

Fie acest automat nedeterminist:

Pentru a construi automatul determinist, trebuie mai ales să construim noua funcție de tranziție. Ne ajută un tabel în care notăm toate tranzițiile. La început, tabelul arată astfel:

stare/simbol01{q0}

În coloana din stânga vom avea, la sfârșitul algoritmului, toate stările automatului determinist. Tabelul completat va defini apoi funcția de tranziție. Acum scriem în tabel în ce stări ajungem dacă ne aflăm în starea {q0} și la intrare avem simbolurile 0 și 1.

stare/simbol01{q0}{q1}{q1,q2}

Din starea q0 pleacă pentru simbolul 0 o tranziție doar spre starea q1, în timp ce pentru simbolul 1 pleacă spre stările q1 și q2. Acum adăugăm în tabel două stări noi: {q1} și {q1, q2}. De ce? Ori de câte ori completăm în tabel o mulțime de stări pe care nu o avem încă în coloana din stânga, o adăugăm și acolo.

stare/simbol01{q0}{q1}{q1,q2}{q1}{q1,q2}

și completăm din nou. La starea {q1, q2} nu trebuie să uităm să verificăm ambele stări, adică mulțimea stărilor în care ajungem din starea q1, reunită cu cea în care ajungem din starea q2.

stare/simbol01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}

Am obținut câteva stări noi, pe care trebuie să le adăugăm în tabel:

stare/simbol01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}{q0,q1,q3}{q0,q3}

…și completăm iar tranzițiile:

stare/simbol01{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}

Stările {q0, q1, q3}, {q1} și {q1,q2} le avem deja, deci adăugăm doar starea {q0,q1,q2,q3}.

stare/simbol01{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}

Nu am mai adăugat nicio stare nouă, deci tabelul este completat. Acum rămâne doar să construim diagrama. Stările automatului determinist sunt în prima coloană, iar tranzițiile pentru simbolurile 0 și 1 în următoarele. Orice stare care conține o stare finală din automatul inițial va fi stare finală și în acest automat. Adică orice stare care conține q3 va fi stare finală. Automatul va arăta astfel:

Putem verifica faptul că automatul funcționează cu adevărat corect. Încercăm să acceptăm cuvântul 11001. În automatul determinist vom merge pe drumul

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

iar automatul ar accepta cuvântul, deoarece ultima stare {q0, q1, q2, q3} este finală. În automatul nedeterminist am ajunge, în timpul simulării, în aceleași stări, adică am porni din starea q0 și, pentru simbolul 1, am ajunge în stările {q1, q2}. Următorul simbol 1 ne-ar duce în stările {q0,q3} și așa mai departe pentru celelalte stări. La final ne-am afla în toate stările {q0, q1, q2, q3} și automatul ar accepta cuvântul.

Surse

Capitole: Automat finit, Automat complet, Automat finit nedeterminist, Simularea AFN, Conversia AFN în AFD