Torna alla pagina di Informatica Teorica
:: Informatica Teorica - Nondeterminismo ::
Appunti & Dimostrazioni del 17 Marzo
Le immagini di questa pagina sono prese dalle slide della prof Trucco
Una computazione deterministica è quella in cui dato uno stato e un ingresso posso andare in un unico nuovo stato. Intuitivamente, in una computazione non deterministica (da ora n.d.
) dato uno stato e un ingresso posso andare a finire in un insieme di stati; in altre parole ogni stato può avere più di una transizione per ogni simbolo dell'alfabeto. A proposito di simboli, aggiungiamo al pacchetto quello di stringa vuota ε: si ha una transizione etichettata con ε quando si passa al nuovo stato senza leggere alcun ingresso.
Un automa finito n.d.
, o NFA, data una stringa di ingresso funziona così:
Con un esempio si fissano meglio le idee. Dato l'NFA:
Ecco l'albero di computazione corrispondente per la stringa di ingresso 010110
:
La rappresentazione ad albero è particolarmente utile perché basta una veloce occhiata per capire quali sono le sottostringhe che la stringa iniziale deve contenere perché sia accettata dall'automa. In questo caso sono 101
e 11
.
La definizione formale di NFA è molto simile a quella dei DFA (Deterministic Finite Automaton, automi finiti deterministici), poiché entrambi hanno stati (di cui uno iniziale e almeno uno finale), un alfabeto di ingresso e funzioni di transizione. Sono proprio queste ultime a distinguerli, perché fa la sua comparsa il simbolo di stringa vuota ε.
Un automa a stati finiti non deterministico è una 5-tupla (Q, Σ, δ, q0, F) dove:
La definizione formale dell'NFA dell'esempio sopra sarà quindi:
0 | 1 | ε | |
q1 | {q1} | {q1,q2} | 0 |
q2 | {q3} | 0 | {q3} |
q3 | 0 | {q4} | 0 |
q4 | {q4} | {q4} | 0 |
Sia dato un automa n.d.
N=(Q,Σ,δ,q0,F), ed una stringa di ingresso w tale che w = y1y2..ym , dove ogni yi fa parte dell'alfabeto Σε.
Diciamo che N accetta w se esiste una sequenza di stati r0r1..rm in Q che rispettino tre condizioni:
Automi deterministici e non deterministici riconoscono la stessa classe di linguaggi, il che è anti-intuitivo perché questi ultimi sembrano più potenti. Ma se riconoscono gli stessi linguaggi significa che sono equivalenti, sarà vero?
Ogni automa a stati finiti n.d.
ha un automa a stati finiti deterministico equivalente.
Dimostrazione
L'idea è quella di dimostrare il teorema per costruzione, ovvero provare che è possibile costruire un DFA equivalente ad un NFA dato. In pratica, dato un automa n.d.
N=(Q,Σ,δ,q0,F) che supponiamo riconosca il linguaggio A, vogliamo creare il corrispondente automa deterministico M=(Q',Σ',δ',q0',F') che riconosca A.
Distinguiamo due casi: il caso (1) in cui non ci sono stati con frecce uscenti etichettate con ε, e il caso (2) in cui ci sono.
Caso (1)
Caso (2)
Considerando anche gli ε, dovremo trovare un modo per includerli nella notazione: per ogni stato R di M definiamo E(R) l'insieme di stati che possono essere raggiunti da R viaggiando attraverso le frecce ε, R incluso. Più formalmente, per R ∈ Q:
E(R) = {q | q può essere raggiunto da R viaggiando attraverso 0 o più frecce ε}
Ecco allora come cambia la quintupla (le corrispondenze uguali al Caso (1) non saranno ricommentate):
Seguendo le indicazioni descritte nei casi (1) e (2) è possibile costruire correttamente un DFA M che corrisponde a un NFA N: la dimostrazione del teorema è completa!
Dato il seguente NFA:
Ecco il DFA corrispondente:
Un linguaggio è regolare se e solo se esiste un automa a stati finiti n.d.
che lo riconosce.
Dimostrazione
Il teorema è un "se e solo se", quindi vanno dimostrati entrambi i sensi delle implicazioni.
Se un automa n.d.
riconosce un linguaggio allora questo è regolare
Un linguaggio è regolare se esiste un automa a stati finiti deterministico che lo riconosce. Ma abbiamo appena visto nel Teorema 1 che ogni NFA può essere convertito in un DFA equivalente, quindi entrambi riconoscono la stessa classe di linguaggi, quindi anche quelli regolari.
Se un linguaggio è regolare allora esiste un automa n.d.
che lo riconosce
Dato che gli automi n.d.
sono una generalizzazione di quelli deterministici, un DFA è anche un NFA, quindi se il linguaggio è riconosciuto da uno lo è anche dall'altro.
Le operazioni regolari sono unione, concatenazione e star. Si dice che una collezione di oggetti è chiusa rispetto ad una determinata operazione se applicandola ai membri della collezione si ottiene un oggetto che appartiene ancora alla collezione stessa.
La classe di linguaggi regolari è chiusa rispetto all'operazione di unione.
Dimostrazione
Abbiamo due linguaggi A1 e A2 e vogliamo dimostrare che la loro unione è regolare. L'idea è quella di prendere due automi n.d.
N1 ed N2 che li riconoscano (rispettivamente) e combinarli in un nuovo NFA N, che dovrà accettare la stringa in ingresso se uno dei due la accetta. Dato che ogni Ni ha propri stati iniziali e finali, come li dobbiamo combinare?
Basta aggiungere un nuovo stato iniziale che con frecce ε si colleghi ai vecchi stati iniziali, così da avere garanzia che la stringa in ingresso arrivi a entrambi gli Ni, e se uno di loro accetta tutto N accetta! Vediamo in figura che si capisce meglio:
Più formalmente, siano dati due automi n.d.
:
La costruzione di N=(Q,Σ,δ,q0,F) che riconosce l'unione dei linguaggi A1 e A2 va fatta così:
La classe di linguaggi regolari è chiusa rispetto all'operazione di concatenazione.
Dimostrazione
Abbiamo due linguaggi A1 e A2 e vogliamo dimostrare che la loro concatenazione è regolare. L'idea è quella di prendere due automi n.d.
N1 ed N2 che li riconoscano (rispettivamente) e combinarli in un nuovo NFA N. Dato che ogni Ni ha propri stati iniziali e finali, come li dobbiamo combinare?
Anche in questo caso si capisce meglio in figura:
Più formalmente, siano dati due automi n.d.
:
La costruzione di N=(Q,Σ,δ,q1,F2) che riconosce la concatenazione dei linguaggi A1 e A2 va fatta così:
La classe di linguaggi regolari è chiusa rispetto all'operazione di star.
Dimostrazione
L'operazione star è quella che ci permette di concatenare per un certo numero di volte la stessa stringa.
Abbiamo un linguaggio A e vogliamo dimostrare che il suo star A* è regolare. L'idea è quella di prendere l'automa n.d.
N1 che lo riconosce e realizzare un nuovo NFA N che implementi lo star. Lo costruiamo mettendo delle frecce ε addizionali che vadano dagli stati finali di N1 a quello iniziale di N1, così che si possa ricominciare il giro. Dato che stiamo usando un automa n.d.
non possiamo trascurare il fatto che la stringa passata in ingresso potrebbe essere vuota: la ripetizione di una stringa vuota è una stringa vuota, quindi lo stato iniziale di N dovrà essere anche tra quelli finali. Il nuovo stato iniziale è collegato a quello vecchio di N1 da una solita freccia ε.
Vediamo in figura:
Più formalmente, sia dato l'automa n.d.
:
La costruzione di N=(Q1,Σ,δ1,q0,F1) che riconosce lo star del linguaggio A1 va fatta così: