a cura di Luca Cabibbo e Walter Didimo Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 1 automi a pila automi a pila e grammatiche non contestuali notazioni sul livello degli esercizi: (*) facile, (**) non difficile (***) media complessità, (****) difficile, (*****) quasi impossibile Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 2
automa a pila non deterministico (PDA) : A = <, Γ, Z 0, Q, q 0, F, δ > dove èl alfabeto (finito) di input Γ èl alfabeto (finito) dei simboli della pila Z 0 èil simbolo di pila iniziale Q è un insieme (finito e non vuoto) di stati q 0 Q è lo stato iniziale F Q è l insieme degli stati finali δ : Q ( {ε}) Γ P(Q Γ*) è la funzione di transizione; la transizione δ(q, a, A) <q,γ> indica che: dallo stato q, leggendo a (che può anche essere ε) dalla stringa di input e A come elemento affiorante dalla pila, si passa allo stato q e si inserisce γ al posto di A in pila Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 3 un automa a pila è deterministico se per ogni stato q, simbolo di input a e simbolo di pila A, riesce: δ(q, a, A) + δ(q, ε, A) 1 configurazione (istantanea): <q, x, γ>, dove q è lo stato corrente x è la stringa di input ancora da leggere γ è la stringa ancora presente in pila (il primo simbolo di γ è quello affiorante dalla pila) transizione tra configurazioni: <q, x, γ> <q, x, γ > x = ax, γ = Aα, γ = βα, <q, β> δ(q, a, A) oppure x = x, γ = Aα, γ = βα, <q, β> δ(q, ε, A) computazione: chiusura transitiva e riflessiva * di Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 4
definizioni di accettazione: accettazione per pila vuota: una stringa x è accettata da un PDA al termine della computazione su x la pila è vuota accettazione per stato finale: una stringa x è accettata da un PDA al termine della computazione su x il PDA è su uno stato finale linguaggio riconosciuto da un PDA: insieme delle stringhe accettate dal PDA teorema: i linguaggi riconosciuti dai PDA che accettano per pila vuota sono tutti e soli i linguaggi riconosciuti dai PDA che accettano per stato finale (equivalenza dei linguaggi nelle due definizioni) Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 5 Esercizio 1(**) definire un automa a pila per il linguaggio non contestuale L = {a n b n : n 1}. accettazione per pila vuota = {a,b}, Γ={Z, A}, Z 0 = Z, Q ={q 0, q 1 } δ(q 0, a, Z) = {<q 0, A>} δ(q 0, a, A) = {<q 0, AA>} δ(q 0, b, A) = {<q 1, ε >} δ(q 1, b, A) = {<q 1, ε >} az A, aa AA q 0 q 1 Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 6
computazione sulla stringa aaabbb <q 0, aaabbb, Z> <q 0, aabbb, A> <q 0, abbb, AA> <q 0, bbb, AAA> <q 1, bb, AA> <q 1, b, A> <q 1, ε, ε> accettazione per stato finale = {a,b}, Γ={Z, A}, Z 0 = Z, Q ={q 0, q 1, q F }, F = {q F } δ(q 0, a, Z) = {<q 0, AZ>} δ(q 0, a, A) = {<q 0, AA>} δ(q 0, b, A) = {<q 1, ε >} δ(q 1, b, A) = {<q 1, ε >} δ(q 1, ε, Z) = {<q F, Z>} domanda: come si può modificare l automa affinché accetti contemporaneamente per pila vuota e per stato finale? Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 7 Esercizio 2(***) definire un automa a pila per il linguaggio non contestuale L = {a n b 2n : n 1}. accettazione per pila vuota δ(q 0, a, Z) = {<q 0, AA>} δ(q 0, a, A) = {<q 0, AAA>} δ(q 0, b, A) = {<q 1, ε >} δ(q 1, b, A) = {<q 1, ε >} az AA, aa AAA q 0 q 1 Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 8
soluzione alternativa con accettazione per pila vuota δ(q 0, a, Z) = {<q 0, A>} δ(q 0, a, A) = {<q 0, AA>} δ(q 0, b, A) = {<q 1, A>} δ(q 1, b, A) = {<q 2, ε>} δ(q 2, b, A) = {<q 1, A>} az A, aa AA ba A q 0 q 1 ba A q 2 Esercizio 3(***) definire un automa a pila per il linguaggio non contestuale L = {a n b m : m n 1}. Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 9 accettazione per pila vuota (e stato finale) δ(q 0, a, Z) = {<q 0, AZ>} δ(q 0, a, A) = {<q 0, AA>} δ(q 0, b, A) = {<q 1, ε>} δ(q 1, b, A) = {<q 1, ε>} δ(q 1, b, Z) = {<q 1, Z>} δ(q 1, ε, Z) = {<q F, ε>} az AZ, aa AA q 0 q 1, bz Z εz ε q F Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 10
albero di computazione per la stringa abb <q 0, abb, Z> <q 0, bb, AZ> <q 1, b, Z> δ(q 1, b, Z) δ(q 1, ε, Z) <q 1, ε, Z> <q F, b, ε> non accettante <q F, ε, ε> accettata sia per stato finale che per pila vuota Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 11 Esercizio 4(***) definire un automa a pila per il linguaggio non contestuale L = {a n b m : n m 1}. accettazione per stato finale δ(q 0, a, Z) = {<q 0, AZ>} δ(q 0, a, A) = {<q 0, AA>} δ(q 0, b, A) = {<q 1, ε >} δ(q 1, b, A) = {<q 1, ε >} δ(q 1, ε, A) = {<q F, ε >} δ(q 1, ε, Z) = {<q F, ε>} az AZ, aa AA q 0 q 1 εz ε εa ε q F Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 12
accettazione per pila vuota δ(q 0, a, Z) = {<q 0, AZ>} δ(q 0, b, A) = {<q 1, ε>} δ(q 1, b, A) = {<q 1, ε>} δ(q 0, a, A) = {<q 0, AA>, <q 0, A>} δ(q 1, ε, Z) = {<q 1, ε>} az A, aa AA aa A q 0 q 1 εz ε Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 13 albero di computazione per la stringa aab <q 0, aab, Z> <q 0, ab, AZ> <q 0, b, AAZ> <q 0, b, AZ> non accettata <q 1, ε, AZ> <q 1, ε, AZ> <q 1, ε, Z> <q 1, ε, ε> accettata per pila vuota Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 14
Esercizio 5(***) definire un automa a pila per il linguaggio non contestuale L = {a n b m c k : n,m,k 1 ed n=m o n=k}. accettazione per pila vuota e stato finale δ(q 0, a, Z) = {<q 0, AZ>} δ(q 0, a, A) = {<q 0, AA>} conta le a δ(q 0, b, A) = {<q 1, ε>, <q 2, A>} crea due rami: (n=m) o (n=k) δ(q 1, b, A) = {<q 1, ε >} δ(q 1, c, Z) = {<q 3, Z>} δ(q 3, c, Z) = {<q 3, Z>} δ(q 3, ε, Z) = {<q F, ε>} ramo n=m δ(q 2, b, A) = {<q 2, A>} δ(q 2, c, A) = {<q 4, ε>} ramo n=k δ(q 4, c, A) = {<q 4, ε>} δ(q 4, ε, Z) = {<q F, ε>} Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 15 cz Z cz Z q 1 q 3 εz ε az AZ, aa AA q 0 ba A q 2 ca ε q 4 εz ε q F ba A ca ε Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 16
Esercizio 6(***) definire un automa a pila per il linguaggio non contestuale L = {a n b m a m b n : n,m 1}. accettazione per pila vuota e stato finale δ(q 0, a, Z) = {<q 0, AZ>} δ(q 0, a, A) = {<q 0, AA>} δ(q 0, b, A) = {<q 1, BA>} δ(q 1, b, B) = {<q 1, BB>} δ(q 1, a, B) = {<q 2, ε>} δ(q 2, a, B) = {<q 2, ε>} δ(q 2, b, A) = {<q 3, ε>} δ(q 3, b, A) = {<q 3, ε>} δ(q 3, ε, Z) = {<q F, ε>} Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 17 bb BB ab ε svuota le B ba BA q 1 ab ε q 2 svuota le A εz ε az AZ, aa AA q 0 inserisce le B q 3 q F inserisce le A Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 18
Esercizio 7(***) definire un automa a pila per il linguaggio delle stringhe su {a,b} tali che #a = #b. accettazione per pila vuota e stato finale δ(q 0, a, Z) = {<q 0, AZ>} δ(q 0, b, Z) = {<q 0, BZ>} δ(q 0, a, A) = {<q 0, AA>} δ(q 0, b, B) = {<q 0, BB>} δ(q 0, a, B) = {<q 0, ε>} δ(q 0, b, A) = {<q 0, ε>} δ(q 0, ε, Z) = {<q F, ε>} osservazione nella pila non ci possono essere contemporaneamente delle A e delle B Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 19 Esercizio 8(***) definire un automa a pila per il linguaggio delle stringhe su {a,b,c} tali che #a = #b + #c. accettazione per pila vuota e stato finale δ(q 0, a, Z)={<q 0, AZ>}, δ(q 0, b, Z)={<q 0, BZ>}, δ(q 0, c, Z)={<q 0, BZ>} δ(q 0, a, A)={<q 0, AA>}, δ(q 0, b, B)={<q 0, BB>}, δ(q 0, c, B)={<q 0, BB>} δ(q 0, a, B)={<q 0, ε>}, δ(q 0, b, A)={<q 0, ε>}, δ(q 0, c, A)={<q 0, ε>} δ(q 0, ε, Z) = {<q F, ε>} Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 20
Esercizio 9(***) definire un automa a pila per ciascuno dei seguenti linguaggi non contestuali: L = {a n c m b n : n,m 1} L = {(ab) n (cd) n : n 1} L = stringhe su {a,b,c,d} tali che #a + #b = #c + #d Esercizio 10(**) mostrare l albero di computazione per la stringa aaabb nell automa dell Esercizio 4 Esercizio 11(**) mostrare l albero di computazione per la stringa aabcc nell automa dell Esercizio 5 Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 21 input : una grammatica non contestuale (CFG) G = < V T,V N, P, S > ouput : un PDA A = <, Γ, Z 0, Q, q 0, δ > che accetta per pila vuota ricavare una G = < V T,V N, P, S > in GNF equivalente a G ma che non genera ε = V T Γ = V N Z 0 = S Q = {q} e q 0 = q per ogni produzione A aγ introdurre δ(q, a, A) <q, γ> se G genera ε allora aggiungere lo stato q a Q, porre q 0 = q ed aggiungere le seguenti transizioni: δ(q, ε, Z 0 ) <q, ε> (per riconoscere ε) δ(q, ε, Z 0 ) <q, Z 0 > (per ricondursi alle transizioni su q) Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 22
Esercizio 12(***) definire un automa a pila non deterministico che riconosce il linguaggio generato dalla seguente grammatica non contestuale: S a S + S S * S (S) portiamo la grammatica in GNF portiamo in quasi CNF: S SPS SMS ASZ a P +, M *, A (, Z ) scegliamo l ordinamento S < P < M < A < Z Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 23 eliminiamo la ricursione sinistra su S: S ASZR ar ASZ a R PSR MSR PS MS P +, M *, A (, Z ) sostituiamo a ritroso e semplifichiamo S (SZR ar (SZ a R +SR *SR +S *S Z ) poniamo: = {a, +, *, (, )}, Γ = {S, R, Z}, Q = {q}, q 0 = q, Z 0 = S costruiamo l insieme delle transizioni: Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 24
δ(q, (, S) = {<q, SZR>, <q, SZ>} δ(q, a, S) = {<q, R>, <q, ε>} δ(q, +, R) = {<q, SR>, <q, S>} δ(q, *, R) = {<q, SR>, <q, S>} δ(q, ), Z) = {<q, ε>} Esercizio 13(***) definire un automa a pila non deterministico per la seguente grammatica G non contestuale: S ε [S] SS (L(G) è anche detto linguaggio delle parentesi bilanciate o Dyck 1 ) Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 25 consideriamo la grammatica equivalente a G ma che non genera la stringa vuota: S [S] SS [] scriviamo la grammatica in GNF: S [Z [SZ [ZR [SZR R [Z [SZ [ZR [SZR [ZRR [SZRR Z ] poniamo: = {[, ]}, Γ = {S, R, Z}, Q = {q, q }, q 0 = q, Z 0 = S costruiamo l insieme delle transizioni: δ(q, [, S) = {<q, Z>, <q, SZ>, <q, ZR>, <q, SZR>} δ(q, [, R) = {<q, Z>, <q, SZ>, <q, ZR>, <q, SZR>, <q, ZRR>, <q, SZRR>} δ(q, ], Z) = {<q, ε>} δ(q, ε, S) = {<q, ε>, <q, S>} Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 26
osservazione: esiste un PDA molto più semplice per il linguaggio definito dalla grammatica delle parentesi bilanciate S = simbolo di pila iniziale δ(q, ε, S) = {<q, ε>} δ(q, [, S) = {<q, AS>} δ(q, [, A) = {<q, AA>} δ(q, ], A) = {<q, ε>} la situazione nella pila all istante generico è così riassunta: - se l elemento affiorante è S allora c è un bilanciamento di parentesi - se l elemento affiorante è A allora ci sono più parentesi aperte Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 27 input : un PDA A = <, Γ, Z 0, Q, q 0, δ > che accetta per pila vuota ouput : una grammatica non contestuale (CFG) G = < V T,V N, P, S > V T = V N = {[paq] : p, q Q, A Γ} {S} l insieme P delle produzioni è il seguente: S [q 0 Z 0 q] q Q [paq] a <q, ε> δ(p, a, A) [paq m+1 ] a[q 1 B 1 q 2 ] [q 2 B 2 q 3 ]... [q m B m q m+1 ] su ogni possibile scelta di q 2,..., q m+1 Q <q 1, γ> δ(p, a, A) con γ = B 1... B m Esercizio 14(***) definire una grammatica non contestuale che genera il linguaggio riconosciuto dal seguente automa a pila non deterministico: Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 28
= {[, ]}, Γ = {T, A}, Q = {q 0 }, Z 0 = T δ(q 0, ε, T) = {<q 0, ε>} δ(q 0, [, T) = {<q 0, AT>} δ(q 0, [, A) = {<q 0, AA>} δ(q 0, ], A) = {<q 0, ε>} produzioni per l assioma: S [q 0 Tq 0 ] produzioni per δ(q 0, ε, T) = {<q 0, ε>}: [q 0 Tq 0 ] ε Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 29 produzioni per δ(q 0, ], A) = {<q 0, ε>}: [q 0 ] ] produzioni per δ(q 0, [, T) = {<q 0, AT>} [q 0 Tq 0 ] [ [q 0 ] [q 0 Tq 0 ] produzioni per δ(q 0, [, A) = {<q 0, AA>} [q 0 ] [ [q 0 ] [q 0 ] poiché q 0 è il solo stato dell automa, possiamo rinominare i non terminali al modo: [q 0 Tq 0 ] = T, [q 0 ] = A, e riscrivere dunque la grammatica come segue: S T (S = assioma) T ε [AT A ] [AA Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 30
Esercizio 15(***) definire una grammatica non contestuale corrispondente al seguente automa a pila non deterministico: = {a,b}, Γ = {Z, A}, Q = {q 0, q 1, q F }, Z 0 = Z δ(q 0, a, Z) = {<q 0, AZ>} δ(q 0, a, A) = {<q 0, A>, <q 0, AA>} δ(q 0, b, A) = {<q 1, ε>} δ(q 1, b, A) = {<q 1, ε>} δ(q 1, ε, Z) = {<q F, ε>} Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 31 produzioni per l assioma: S [q 0 Zq 0 ] [q 0 Zq 1 ] [q 0 Zq F ] produzioni per <q 0, AZ> δ(q 0, a, Z): [q 0 Zq 0 ] a[q 0 ] [q 0 Zq 0 ] [q 1 Zq 0 ] [q F Zq 0 ] [q 0 Zq 1 ] a[q 0 ] [q 0 Zq 1 ] [q 1 Zq 1 ] [q F Zq 1 ] [q 0 Zq F ] a[q 0 ] [q 0 Zq F ] [q 1 Zq F ] [q F Zq F ] produzioni per <q 0, A> δ(q 0, a, A): [q 0 ] a[q 0 ] [q 0 ] a[q 0 ] [q 0 ] a[q 0 ] produzioni per <q 0, AA> δ(q 0, a, A): [q 0 ] a[q 0 ] [q 0 ] [q 1 ] [q F ] [q 0 ] a[q 0 ] [q 0 ] [q 1 ] [q F ] [q 0 ] a[q 0 ] [q 0 ] [q 1 ] [q F ] Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 32
produzioni per <q 1, ε> δ(q 0, b, A): [q 0 ] b produzioni per <q 1, ε> δ(q 1, b, A): [q 1 ] b produzioni per <q F, ε> δ(q 1, ε, Z): [q 1 Zq F ] ε proviamo a semplificare: - rinominiamo ciascun non terminale al modo: [q i Aq j ] = A ij - l intera grammatica si riscrive dunque come segue: Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 33 S Z 00 Z 01 Z 0F Z 00 aa 00 Z 00 aa 01 Z 10 aa 0F Z F0 Z 01 aa 00 Z 01 aa 01 Z 11 aa 0F Z F1 Z 0F aa 00 Z 0F aa 01 Z 1F aa 0F Z FF A 00 aa 00 A 00 aa 01 A 10 aa 0F A F0 aa 00 A 01 aa 00 A 01 aa 01 A 11 aa 0F A F1 aa 01 b A 0F aa 00 A 0F aa 01 A 1F aa 0F A FF aa 0F A 11 b Z 1F ε i simboli fecondi sono: A 01,A 11,Z 1F,Z 0F,S eliminando dunque i simboli: Z 00, Z 01,A 00,A 0F la grammatica diventa Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 34
S Z 0F Z 0F aa 01 Z 1F A 01 aa 01 A 11 aa 01 b A 11 b Z 1F ε eliminando le ε-produzioni e poi le produzioni unitarie si ha: S aa 01 A 01 aa 01 A 11 aa 01 b A 11 b rinominiamo i non terminali al modo: A 01 =A, A 11 = B S aa A aab aa b B b Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 35