Automi a pila
Un automa a pila (o PDA) è una sestupla equivalente alle CFG che sfrutta uno stack:
e i suoi componenti sono definiti come:
- è l'insieme degli stati
- è l'alfabeto dell'input
- è l'alfabeto dello stack
- è la funzione di transizione, con e
- è lo stato iniziale
- è l'insieme degli stati finali
Un PDA accetta se esistono e per cui:
- e : comincia dallo stato iniziale e con la pila vuota
- : alla fine dell'input, è su uno stato accettante
- , con per e : il prossimo stato e pila sono determinati dallo stato , l'input e la cima della pila
Per esempio, l'automa che riconosce
sarà rappresentato da , dove:
Un altro esempio è l'automa che riconosce :
Equivalenza
Si può dimostrare che un linguaggio è context-free sse esiste un PDA tale che , infatti:
-
Condizione sufficiente ()
Dato che è context-free esiste una CFG che lo riconosce. Basterà quindi trasformare la CFG in PDA:
- Inserire sullo stack prima e poi , ovvero lo start symbol
- Per ogni regola , alla lettura di sullo stack rimuovere e inserirci
- Per ogni terminale , alla lettura di sullo stack rimuovere mentre viene anche letto sull'input
Per esempio, la CFG si potrà convertire nel seguente PDA:
-
Condizione necessaria ()
Per dimostrarlo si vuole semplificare in modo che:
- Abbia un unico stato accettante : con -transizioni dagli stati finali a
- Svuoti lo stack prima di accettare: con sullo stato finale
- Inserisca o rimuova un simbolo sullo stack ad ogni transizione: sostituendo le transizioni con e , e le transizioni con e
Sia quindi , i non-terminali e lo start symbol di :
- Per ogni , e se contiene e contiene , allora a viene aggiunta la regola
- Per ogni viene aggiunta la regola a
- Per ogni viene aggiunta la regola a
Il primo punto è il caso in cui per andare da a il primo simbolo aggiunto e l'ultimo rimosso dallo stack è lo stesso, mentre il secondo è il caso in cui il simbolo viene rimosso prima di arrivare a .
Si può quindi dimostrare che sse porta da con lo stack vuoto a con lo stack vuoto:
-
Condizione sufficiente (), per induzione sul numero di passi di derivazione:
-
Caso base con passo, ovvero senza non-terminali: usa che non tocca lo stack
-
Passo induttivo con passi, assumendo che valga fino a :
Il primo passo può essere oppure .
Nel primo caso, con , si ha che in passi, quindi per ipotesi induttiva parte da e arriva a con lo stack uguale. Essendo una regola di , da a aggiunge sullo stack e da a lo rimuove, verificando la proprietà.
Nel secondo caso, con , si ha che e , entrambe fino a passi. Per ipotesi induttiva lo stack ritorna vuoto da a e da a , verificando la proprietà.
-
-
Condizione necessaria (), per induzione sul numero di passi della computazione di da a :
-
Caso base con passi: va da un a senza leggere nulla, quindi e infatti
-
Passo induttivo con passi, assumendo che valga fino a :
I passi per da a hanno lo stack vuoto all'inizio e alla fine oppure anche altrove.
Nel primo caso, lo stesso simbolo va inserito leggendo da ad uno stato e rimosso leggendo da uno stato a , quindi . Ci sono passi da a quindi, dato , per ipotesi induttiva e allora .
Nel secondo caso lo stack si svuota anche su quindi da a e da a sono al più passi, per cui, dato , per ipotesi induttiva e e allora .
-