Per presentare in modo formale i concetti basilari delle teorie della calcolabilità e della complessità, abbiamo innanzitutto bisogno di una definizione precisa di cosa è un computer.
I computer di uso quotidiano, come un personal computer, sono troppo complessi per essere utilizzati come modelli
Si preferisce invece utilizzare delle macchine computazionali “semplificate”.
Esistono diverse macchine che si possono usare, con diversa capacità computazionale
Solitamente, all’aumentare della loro capacità computazionale, aumenta la difficoltà gestionale e valutativa di queste macchine.
Tra le macchine computazionali più semplici, particolarmente adatte al nostro scopo, ci sono gli automi.
Sebbene gli automi siano costituiti da una memoria finita, esistono svariati contesti reali in cui essi sono impegnati con successo.
La teoria degli automi e dei linguaggi formali è lo studio di dispositivi computazionali o “macchine” computazionali.
Gli automi, originariamente, furono proposti per creare un modello matematico che riproducesse il funzionamento del cervello.
La teoria degli automi è alla base della descrizione e della modellazione dei linguaggi di programmazione, della costruzione dei loro riconoscitori e traduttori, della realizzazione di strumenti di elaborazione testuale.
Ecco alcuni esempi in cui gli automi finiti sono possono essere utilizzati come modelli per il software:
Riferimenti: Hopcroft, J.E., Ullman J.D., Introduction to Automata Theory, Languages, and Computation, Addison Wesley, Reading, Mass., 1979.
Un automa è un dispositivo sequenziale creato per eseguire un particolare compito che, ad ogni istante, può trovarsi in un determinato “stato“.
Quando l’automa si trova in uno stato, può eseguire una transizione (in un altro stato) in base ad un input esterno, rappresentato da un simbolo del suo alfabeto.
Lo scopo dello stato è quello di ricordare la parte rilevante della storia del sistema. Dunque lo stato funge da memoria.
Il modello di un automa consiste di un dispositivo di controllo, con un numero finito di stati, una testina di lettura e un nastro infinito diviso in celle.
Gli automi sono spesso utilizzati per descrivere linguaggi formali, e per questo sono chiamati accettori o riconoscitori di un linguaggio.
L’evoluzione di un automa parte da un particolare stato detto stato iniziale.
Un sottoinsieme privilegiato degli stati di un automa è detto insieme degli stati finali e corrispondono agli stati “accettanti”.
Una sequenza di simboli (detto anche stringa o parola) appartiene al linguaggio accettato da un automa se essa porta l’automa, in un certo numero di passi, dallo stato iniziale ad uno accettante.
A diverse classi di automi corrispondono diverse classi di linguaggi, caratterizzate da diversi livelli di complessità.
Analizziamo in dettaglio i vari tipi di automi.
Un “deterministic finite automaton” o “DFA” (automa a stati finiti determini-stico) è formalmente definito come una quintupla (Q,Σ,δ,q0,F) dove
Un DFA A = (Q,Σ,δ,q0,F) accetta una stringa u = u1 u2 ... un
se (e solo se) c’è una sequenza di stati r= r1, r2, ..., rn, rn+1
tale che:
r1=q0
ri+1 = δ(ri,ui)
, per ogni i
con 1
≤
i≤ n
rn+1 ∈ F
Il linguaggio accettato da un DFA è l’insieme di tutte le parole (stringhe) formate con i simboli di Σ per il quale l’automa partendo dallo stato iniziale raggiunge lo stato finale alla lettura dell’ultimo simbolo della parola.
Un linguaggio è regolare se esiste un DFA che accetta tutte e sole le parole che esso contiene.
Esempio: In figura è mostrato l’automa che accetta il linguaggio di tutte le parole composte di 0 e 1 e che terminano con 1.
Un “nondeterministic finite automaton” o “NFA” (automa a stati finiti non-deterministico) differisce da un DFA per la definizione della funzione di transizione.
Un NFA, stando in uno stato e leggendo un simbolo può andare in più stati.
Il funzionamento di un NFA si può immaginare come se esistessero più copie dello stesso automa.
Formalmente, un NFA è definito come per i DFA da una quintupla (Q,Σ,δ,q0,F), con l’unica differenza che la δ è così definita:
δ: Q x Σ -> 2Q (con 2Q denotiamo l’insieme di tutti i sottoinsiemi di Q).
Nota: data una parola su Σ, un NFA può avere una, nessuna o più sequenze di stati associati dalla funzione di transizione.
Una parola è accettata da un NFA se almeno una delle sequenze di stati associate dalla δ terminano in uno stato finale.
Esempio: In figura è mostrato l’automa che accetta il linguaggio di tutte le parole composte di 0 e 1 e che terminano con “01″.
Due automi A e B sono detti equivalenti se accettano lo stesso linguaggio, ovvero L(A)=L(B)
Teorema: Per ogni NFA N esiste un DFA D equivalente.
Per provare questo teorema si usa la subset construction:
gli stati di D rappresentano tutti i possibili sottoinsiemi degli stati raggiungibili in N, sulla stessa parola.
Sia N = (Q, Σ, δ, s, F) un NFA, la subset construction permette di costruire un DFA D = (Q’, Σ, δ’, s’, F’) nel modo seguente:
∈
R}Osservazione: La subset constuction è una traduzione esponenziale!
Come si è detto precedentemente, gli NFA accettano (tutti e solo) i linguaggi regolari.
Questa classe gode della proprietà di essere chiusa rispetto alle operazioni di unione, intersezione e complemento.
Ogni linguaggio appartenente a questa classe può essere costruito tramite una grammatica regolare.
Ogni linguaggio appartenente a questa classe può essere univocamente determinato tramite una espressione regolare.
Gli ultimi due concetti, sebbene siano marginali per questo corso, sono fondamentali per uno studio completo sulla teoria degli automi.
Informazioni più dettagliate possono essere reperite dal libro di testo consigliato: Hopcroft, J.E., Ullman J.D., Introduction to Automata Theory, Languages, and Computation, Addison Wesley, Reading, Mass., 1979.
Si consideri il linguaggio L = {anbn con n>1}
Domanda: Questo linguaggio può essere accettato da un automa a stati finiti?
Risposta: No! Gli automi a stati finiti posseggono una memoria finita e quindi non sono in grado di riconoscere linguaggi che, per la loro struttura, necessitano di ricordare una quantità di “informazioni” non limitate.
Il linguaggio in oggetto può essere accettato da un Pushdown Automaton o PDA.
Un PDA è un automa a stati finiti con stack. Lo stack è un contenitore (anche infinito) che rispetta un accesso LIFO ed ha capienza infinita.
Ad ogni transizione di un PDA è dunque possibile leggere il contenuto di una cella del nastro ed il simbolo in cima allo stack, passare in un nuovo stato e sostituire il simbolo letto sul top dello stack con una stringa.
I PDA sono stati introdotti da Oettinger nel 1961 e da Schutzenberger nel 1963.
Schutzenberger (1920-1996) è stato un ricercatore e un punto di riferimento per varie generazioni di ricercatori per i linguaggi formali e l’informatica teorica. Ha insegnato alla Facoltà di Scienze dell’Università di Parigi (VI e VII).
Un PDA nondeterministico è formalmente definito da una 6-pla (Q,Σ,Γ,δ,q0,F) dove
∈
Q è lo stato iniziale;Se (qB) ∈
δ(p,a,A), con a ∈
Σε, A ∈
Γε e B ∈
Γε allora è possibile che sia eseguito uno dei seguenti passi di calcolo,
∈
Σ, A, B ∈
Γ con a in lettura sul nastro di input e A in cima alla pila passa nello stato q, rimpiazza A con B in cima alla pila e muove la testina di lettura del nastro di input di una cella verso destra.∈
Σ, A = ε , B ∈
Γ allora, con a in lettura sul nastro di input e indipendentemente dal simbolo in cima alla pila, passa nello stato q, impila B in cima alla pila e muove la testina di lettura del nastro di input di una cella verso destra.∈
Σ, A∈
Γ, B = ε allora, con a in lettura sul nastro di input e A in cima alla pila, passa nello stato q, elimina A dalla cima della pila e muove la testina di lettura del nastro di input di una cella verso destra.Se a = ε , i tre tipi di mosse avvengono senza che la testina di lettura si sposti.
Come nel caso degli NFA, il concetto di configurazione è utile per descrivere la situazione in cui si trova la macchina complessivamente:
Quindi una configurazione è un elemento di Q x Σ* x Γ*.
La configurazione iniziale è (q0,x,ε)
Un PDA M = (Q,Σ,Γ,δ,q0,F) accetta una stringa w= w1w2 … wn, con wi ∈
Σε, se esistono una sequenza di stati, r0, r1,….,rn di Q e una stringa s0, s1, . . . , sm di Γ* che soddisfino le seguenti tre condizioni:
∈
δ (ri , wi+1 , a), dove si = a·t e si+1 = b·t, per qualche a,b in Γε e t in Γ*.I PDA sono schiusi rispetto all’unione, ma non rispetto al complemento e all’intersezione.
I PDA sono invece chiusi rispetto all’intersezione e al complemento con linguaggi regolari, cioè l’intersezione (o il complemento) di un linguaggio accettato da un PDA con un linguaggio regolare è sempre accettato da un PDA.
Anche per i PDA esiste la possibilità di usare delle grammatiche in grado di generare tutti i soli i linguaggi da essi accettati: le grammatiche context-free.
Un PDA A = (Q,Σ,Γ,δ,q0,F) è deterministico (DPDA) se
∈
Q, a ∈
Σε e B ∈
Γ, abbiamo che card(δ(q,a,B))≤1,∈
Q e B ∈
Γ, se δ(q,∈
,B) ≠ ø, allora δ(q,a,B) = ø per ogni a ∈
Σ.Dunque, se c’è una ε-mossa eseguibile in un certo stato e con un certo simbolo in cima alla pila allora quella è l’unica mossa eseguibile in quello stato e con quel simbolo in cima alla pila.
A differenza del caso dei DFA, esistono linguaggi accettati da un PDA che non possono essere accettati da un DPDA (per esempio il linguaggio delle palindrome).
Quindi L(PDA), la classe dei linguaggi accettati dai PDA, contiene strettamente L(DPDA), la classe dei linguaggi accettati dai PDA deterministici.
Per quanto un PDA possa essere più potente in un NFA, esistono linguaggi che non possono essere riconosciuti da un PDA. Per esempio, il linguaggio {anbncn, con n>1} necessita di una macchina di Turing per essere accettato.
Le macchine di Turing saranno oggetto delle prossime lezioni.
4. Macchine di Turing multinastro
5. Macchine di Turing non-deterministiche
6. Macchina di Turing universale e problema della fermata
7. Problemi decidibili e non decidibili
8. Problemi non decidibili e riducibilità - prima parte
9. Problemi non decidibili e riducibilità - seconda parte
11. Decidibilità delle teorie logiche
12. Misurazione della Complessità e introduzione alla classe P
14. NP-Completezza - prima parte
15. NP-Completezza - seconda parte
16. Altri problemi NP-Completi
17. Esercitazione su problemi NP-Completi
18. Space Complexity
19. Savitch Theorem