Docente:
Giuseppe Scollo
Università di Catania
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Laurea in Informatica, I livello, AA 2009-10
un sistema di transizioni di stato è una struttura relazionale dotata di una costante e di una relazione binaria
è spesso utile in pratica distinguere fra diversi tipi di transizioni di stato,
un sistema di transizioni etichettate (ingl. labelled transition system (LTS)) generalizza il concetto ammettendo una famiglia di relazioni di transizioni, dove i simboli delle relazioni costituiscono l'insieme delle etichette del sistema
un LTS è deterministico se le sue relazioni di transizione sono funzioni, altrimenti è non deterministico
quando l'insieme degli stati è finito, il sistema è detto a stati finiti
una macchina a stati finiti (ingl. finite state machine (FSM)) è un LTS a stati finiti con un insieme finito di etichette, che ne designano le interazioni con l'ambiente
è spesso utile, ad es. per la modellazione di circuiti sequenziali, distinguere le interazioni di input da quelle di output di una FSM
la distinzione fra input e output nelle interazioni permette l'interconnessione di FSM, ed eventualmente la sincronizzazione delle rispettive transizioni di stato determinate da una interazione di I/O tra FSM interconnesse
quando le code sono di capacità limitata, il modello asincrono può essere ridotto a quello sincrono rappresentando le code stesse come FSM
il comportamento di un circuito sommatore può essere facilmente modellato da una FSM con output
possiamo tener conto del riporto da ciascuna posizione alla successiva dotando la macchina di due stati, corrispondenti ai due valori del riporto
come accennato nella lezione precedente, l'impiego di una macchina a stati finiti quale riconoscitore di un linguaggio non richiede interazioni di output, bensì la qualifica di un sottoinsieme F degli stati quali stati finali o accettanti
∈
Σ*
se ha una sequenza di transizioni, dallo stato iniziale ad uno stato finale,
con sequenza di etichette w
formalmente, un FSA è una quintupla <
Q, Σ,, δ
, q0, F>
, dove
Σ
è l'alfabeto di input e gli altri
simboli hanno il significato
già detto
δ
è una funzione δ
: Q X Σ
→ Q,
l'automa è deterministico (DFA),
altrimenti è non deterministico (NFA),
nel qual caso si può trattare la dinamica come una funzione avente per
codominio l'insieme delle parti di Q,
δ
: Q X Σ
→ ℘
(Q)
è conveniente pensare a un NFA come in grado di transire simultaneamente a tutti gli stati permessi dalla dinamica, per un dato input e in un dato insieme di stati in cui si trovi
un FSA è un riconoscitore privo di memoria, dunque il solo modo di tener traccia di eventi accaduti, significativi per il riconoscimento, sta nel definire stati distinti a tal fine
then
sull'alfabeto inglese avrà 5 stati ed un'unica sequenza accettante
il fatto che uno stato sia finale non implica assenza di transizioni uscenti da esso
ε
,0,1,01,10,010,101,...}
per definire con precisione il linguaggio accettato da un DFA, estendiamo la sua funzione di transizione sì da considerare stringhe sul suo alfabeto quale input:
δ*
: Q X Σ*
→ Q
tale funzione di transizione estesa, definita per induzione sulla
lunghezza della stringa argomento:
δ*
(q,ε
) =
q,
δ*
(q,wa) = δ
(δ*
(q,w),a)
con la notazione introdotta, il linguaggio LA riconosciuto dall'automa A è definito da LA =
{w | δ*
(q0,w) ∈
F }
la sola differenza di definizione formale tra DFA e NFA sta nel tipo
della funzione di transizione, che per un NFA assegna a uno stato
q e ad un'etichetta
a
l'insieme δ
(q, a)
degli stati ai quali l'automa può transire con l'input
a
δ*
(q,ε
) =
{q},
δ*
(q,wa) =
∪
p∈δ*
(q,w)δ
(p,a)
coerentemente con tale modifica, e con la condizione di accettazione di
stringhe da un NFA, il linguaggio LA riconosciuto dall'automa non deterministico
A è definito da LA =
{w | δ*
(q0,w) ∩
F ≠
∅
}
|
x ∈
{0,1}* } :
una costruzione canonica di un DFA che riconosce lo stesso linguaggio di un dato NFA è fatta così (il pedice D o N, nella designazione di componenti di un automa, rispettivamente indica l'automa da costruire o quello dato):
=
℘
(QN), q0D =
{q0N }, δ
D(qD, a) =
∪
q∈
qDδ
N(q, a), FD =
{qD |
qD ∩
FN ≠
∅
}
in pratica, spesso molti degli insiemi in ℘
(QN)
sono stati non raggiungibili dallo stato iniziale nel suo DFA equivalente
canonico, e possono pertanto essere eliminati
N.B. l'insieme vuoto di stati del NFA è uno stato del DFA equivalente canonico, ed è raggiungibile dallo stato iniziale sse per qualche stringa di input nessuno stato è raggiungibile dallo stato iniziale nel NFA con quell'input
nel caso peggiore, il minimo numero di stati necessari a costruire un DFA equivalente a un NFA dato è esponenzialmente maggiore del numero di stati del NFA, come accade nel seguente caso
per fortuna, il caso peggiore non sempre si verifica...
un problema frequente nella pratica è la ricerca di una qualsiasi stringa da un dato insieme, diciamo delle parole indicizzate, in un testo
un approccio alternativo, frequente in alcune applicazioni, richiede la costruzione di un indice invertito delle occorrenze delle stringhe ricercabili nel testo
un NFA che accetta il linguaggio suddetto è quello che ha la seguente "struttura a pettine":
teorema: esiste un DFA equivalente al NFA dato con un numero non superiore di stati
una estensione degli NFA, che non ne estende la classe dei linguaggi da essi riconoscibili, permette transizioni prive di etichetta dall'alfabeto di input
ε
-transizioni sono spesso, per convenienza,
"etichettate" con il simbolo della stringa vuota, ma si richiede
che ε
non sia un simbolo dell'alfabeto di input
come vedremo presto, una delle ragioni di interesse a questa estensione degli NFA sta nel fatto che rende agevole la dimostrazione di equivalenza di FSA ed espressioni regolari
un ε
-NFA è definito come un NFA, ma con una funzione
di transizione su Q X
(Σ∪
{ε
})
ε
-chiusura
q(ε
)
di uno stato q
dell'ε
-NFA come l'insieme di stati raggiungibili da
q con una sequenza (anche vuota) di
transizioni di etichetta ε
;
ε
-chiusura di un insieme di stati S è definita come l'unione delle ε
-chiusure degli stati in S
la funzione di transizione estesa
alle stringhe in input è così definita per un ε
-NFA:
δ*
(q,ε
) =
q(ε
)
, δ*
(q,wa) =
(∪
p∈δ*
(q,w)δ
(p,a))(ε
)
il linguaggio riconosciuto da un ε
-NFA è definito
come per un NFA,
ma con questa
δ*
la costruzione canonica del DFA equivalente a un ε
-NFA è analoga a
quella per un NFA,
ma con la differenza che gli stati raggiungibili dallo stato iniziale
di questo DFA sono ε
-chiusi
ε
-NFA N ha:
=
℘
(QN), q0D =
q0N(ε
) , δ
D(qD, a) =
(∪
q∈
qDδ
N(q, a))(ε
), FD =
{qD |
qD ∩
FN ≠
∅
}
teorema: un linguaggio è accettato da un
ε
-NFA se e solo se è accettato da un DFA
ε
-NFA rimpiazzando ogni stato con il singoletto
che lo contiene, ed estendendo la funzione di transizione con una
ε
-transizione da ciascun singoletto all'insieme vuoto