✖

Conversione da NFA a DFA

Vediamo come convertire un automa non deterministico in un automa deterministico, dimostrando così che la potenza di calcolo degli automi non deterministici e di quelli deterministici è equivalente.

L’idea di base

Prendiamo un automa non deterministico ⟨QN, ΣN, δN, q0, FN⟩ senza ε-transizioni. Costruiamo un automa deterministico ⟨QD, ΣD, δD, p0, FD⟩ in questo modo:

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

La funzione di transizione δD la definiamo così:

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

Che cosa significa? Un automa non deterministico può trovarsi contemporaneamente in più stati, quindi può capitare, ad esempio, che il nostro automa non deterministico si trovi negli stati {q0, q1}. Leggendo il simbolo successivo, ad esempio 1, possiamo arrivare all’insieme di stati {q0, q2, q3}. Nella versione deterministica dello stesso automa questo si traduce così: creiamo due stati, li chiamiamo {q0, q1} e {q0, q2, q3} e introduciamo tra di loro una transizione per il simbolo 1. Formalmente si passa da uno stato all’altro, ma grazie al nome sappiamo che nell’automa non deterministico ci saremmo trovati rispettivamente in due e in tre stati.

Esempio

Prendiamo questo automa non deterministico:

Per costruire l’automa deterministico ci serve soprattutto una nuova funzione di transizione. Ci aiuta una tabella in cui scriviamo tutte le transizioni. All’inizio la tabella si presenta così:

stato/simbolo01{q0}

Nella colonna di sinistra avremo alla fine dell’algoritmo tutti gli stati dell’automa deterministico. La tabella compilata ci darà poi la funzione di transizione. Ora scriviamo nella tabella in quali stati arriviamo se siamo negli stati {q0} e in ingresso ci sono i simboli 0 e 1.

stato/simbolo01{q0}{q1}{q1,q2}

Dallo stato q0 per il simbolo 0 c’è una transizione solo verso lo stato q1, mentre per il simbolo 1 si va negli stati q1 e q2. Ora aggiungiamo alla tabella due nuovi stati: {q1} e {q1, q2}. Perché? Ogni volta che nella tabella inseriamo un insieme di stati che non abbiamo ancora nella colonna di sinistra, aggiungiamo lì quell’insieme di stati.

stato/simbolo01{q0}{q1}{q1,q2}{q1}{q1,q2}

e compiliamo di nuovo. Per lo stato {q1, q2} non dimentichiamo di controllare entrambi gli stati, cioè dove arriviamo da q1 unito a dove arriviamo da q2.

stato/simbolo01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}

Abbiamo ottenuto alcuni nuovi stati, che dobbiamo aggiungere alla tabella:

stato/simbolo01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}{q0,q1,q3}{q0,q3}

…e di nuovo completiamo le transizioni:

stato/simbolo01{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}

Gli stati {q0, q1, q3}, {q1} e {q1,q2} li abbiamo già, quindi aggiungiamo solo lo stato {q0,q1,q2,q3}.

stato/simbolo01{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}

Non abbiamo aggiunto nessun nuovo stato, quindi la tabella è completa. Ora non resta che costruire il diagramma. Gli stati dell’automa deterministico sono nella prima colonna, le transizioni per i simboli 0 e 1 nelle colonne successive. Ogni stato che contiene uno stato finale dell’automa originale sarà finale anche in questo automa. Cioè ogni stato che contiene q3 sarà uno stato finale. L’automa si presenterà così:

Possiamo mostrare che l’automa funziona davvero correttamente. Proviamo con la parola 11001. Nell’automa deterministico percorriamo il cammino

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

e l’automa accetterebbe la parola, perché l’ultimo stato {q0, q1, q2, q3} è finale. Nell’automa non deterministico, durante la simulazione, arriveremmo agli stessi stati: partiremmo dallo stato q0 e per il simbolo 1 arriveremmo negli stati {q1, q2}. Il simbolo 1 successivo ci porterebbe negli stati {q0,q3} e così via per gli stati seguenti. Alla fine ci ritroveremmo in tutti gli stati {q0, q1, q2, q3} e l’automa accetterebbe la parola.

Fonti

Capitoli: Automa a stati finiti, Automa completo, Automa a stati finiti non deterministico, Simulazione di un automa non deterministico, Conversione da NFA a DFA