Molte delle proprietà appena viste per i linguaggi regolari sono soddisfatte anche da quelli liberi dal contesto (magari con gli opportuni adattamenti); altre invece si perdono. Questo paragrafo è appunto dedicato all'analisi dei linguaggi liberi dal contesto. Iniziamo col mostrare che esistono linguaggi liberi dal contesto ma non regolari: un esempio è il seguente.
Esempio.
Consideriamo nell'alfabeto {a, b} il linguaggio L = {ai bi i i E N, i > 1}.Già sappiamo dallo scorso paragrafo che L non è regolare. Invece L è libero dal contesto. Infatti si vede facilmente (e in realtà ci è già capitato di osservare) che L è generato dalla grammatica di tipo 2 G = (N, T, P, 8) dove N = {S}, T = {a, b} e P è l'insieme di produzioni dato da:
S aSb ab.
Una versione del Pumping Lemma per linguaggi liberi dal contesto è la seguente.
Teorema
uvwxy(Pumping Lemma per Linguaggi Liberi dal Contesto) 5.7.1
Sia L un linguaggio di tipo 2 su un alfabeto T. Allora esiste un intero positivo n dipendente da L tale che, per ogni z E L, se 1(z) > n, ci sono u, v, w, x, y E T*per cui valgono le seguenti proprietà:
(a) z = uvwxy;
(b) 1(vwx) <
n;(c) 1(vx) > O;
(d) Vi
E N, uv i wxi y EL.
Dimostrazione.
SiaG = (N, T, P, S)
una grammatica libera dal contesto per cuiL = L(G)
e siap
il numero dei simboli non terminali diG.
Consideriamo tutti gli alberi di derivazione diG
che hanno l'etichetta di un simbolo non terminale come radice e ammettono profondità < p + 1 (ricordiamo che laprofondità
di un albero è la lunghezza massima di un suo cammino -cioè di una sua sequenza di lati- dalla radice a una foglia). Otteniamo così un numero finito di alberi: sia n la lunghezza massima delle stringhe generate dai nodi foglia di questi alberi nel modo descritto in § 5.5.Consideriamo adesso una stringa
z
EL
tale che/(z)
> n: z può essere generata solo da un albero di derivazione (con radiceS)
di profondità maggiore dip + 1.
Tra tutti gli alberi di derivazione con radice
S
per la stringaz
consideriamone uno con il numero minimo di nodi e scegliamo in questo albero un cammino di lunghezza maggiore di p + 1 daS
a una foglia. Poichép è
il numero dei simboli non terminali diG,
questo cammino deve contenere almeno un simbolo non terminale che si ripete tra le etichette dei suoi nodi; in altre parole, esistono due nodi N1 e N2 del cammino tali che:• N1 e N2 hanno la stessa etichetta non terminale, diciamo A;
• N2 è discendente di N1 (cioè è più vicino alla foglia);
• il cammino da N1 alla foglia è di lunghezza al più
p +1.
Per trovare
N1
e N2 basta percorrere a ritroso il cammino dalla foglia alla radice alla ricerca della prima ripetizione di una etichetta A.Il sottoalbero di radice N2 genera una stringa w E
T*
e quindi rappresenta una derivazione A —4 -*à w. Da parte sua il sottoalbero di radiceN1 ,
che compren-de N2 tra i suoi nodi, genera una parola che contiene w come sottostringa e la racchiude comevwx
per un'opportuna scelta di v e x in Tic. Allo stesso modo l'intero albero di computazione diz,
che include N1 tra i suoi nodi, genera una stringa che allargavwx
e quindi ha la forma uvwxy per opportune parole u e y inT*;
ma allora z = uvwxy, cioè vale (a).Se adesso sfruttiamo il fatto che N1 e N2 ammettono la stessa etichetta A e so-stituiamo nell'albero scelto per la derivazione di z il sottoalbero di radice
A
con quello di radiceN1,
generiamo con le foglie la stringa che si ottiene rimpiazzando w convwx
inz
= uvwxy, e cioè M/2 WX 2 y. Si prova così che uv 2 wx 2 y è genera-ta daG
e quindi appartiene aL.
Allo stesso modo, si dimostra che, per ogni i > O, uvwxy EL.
Se invece nell'albero di z sostituiamo il sottoalbero di radice N_con quello di radice N2 (di nuovo sfruttando il fatto che N1 e N2 hanno la stessa etichetta) proviamo che anche uwy sta in
L,
cioè uvi wxiy EL
anche per i = O.Questo dimostra (d).
Per provare (b), si noti anzitutto che il sottoalbero di radice
N1
ha profondità< p +
1; quindi la stringa che il sottoalbero genera, e cioèvwx,
ha lunghezza alpiù n per la definizione stessa di n.
Finalmente dimostriamo (c). Se / (vx) = O, e cioè vx è vuota, z coincide con uwy e quindi continua a essere generata anche se sostituiamo nel suo albero di deriva-zione il sottoalbero di radice N1 con quello di radice N2, e dunque diminuiamo il numero complessivo dei nodi: ma questo contraddice la scelta dell'albero stesso.
Anche per linguaggi liberi dal contesto, come già per linguaggi regolari, il Pum-ping Lemma può essere usato per costruire esempi negativi, come il seguente.
Esempio.
Il linguaggioL = {ai bi ci i E N, í > I}
non è libero dal contesto. Supponiamo infatti che lo sia. Applicando il Pum-ping Lemma troviamo n E N tale che, se z E Le 1(z) > n, allora ci sono u,v,w,x,y E T* per cui z = uvwxy, /(vwx) < n, 1(vx) > O e Vi E N uvi wxi y E L. Consideriamo la stringa
z
= anbncn. Ovviamentez
E Le 1(z) = 3n > n. A questo punto il ragionamento dell'esempio dopo il Teore-ma uvw si ripete e produce una contraddizione, mostrando che L non può essere libero dal contesto. Il lettore può controllarne da solo i dettagli.La seguente proposizione caratterizza i linguaggi di tipo 2 che sono non vuoti, oppure finiti, estendendo in tal senso i risultati già provati per linguaggi regolari in § 5.5. Anche la dimostrazione è analoga ma, al posto del Teorema uvw, sfrutta il Teorema uvwxy.
Proposizione 5.7.2
Siano G una grammatica di tipo 2,L(G)
il linguaggio che G genera. Sia poi n la costante associata a G dal Teorema uvwxy. Allora(a) L(G) non è vuoto se e solo se G genera una stringa di lunghezza < n,
(b) L(G) è infinito se e solo se G genera una stringa z tale che n < 1(z) < 2n.
Dimostrazione. (a) L'implicazione da destra a sinistra è ovvia. Viceversa sup-poniamo che
L(G)
non sia vuoto, ma contenga solo stringhe di lunghezza > n.Sua z E
L(G)
di lunghezza minima (comunque > n). Applichiamo il Teorema uvwxy ed esprimiamo appunto z come uvwxy per opportune stringhe u, v, w, x, y tali che, in particolare,l(vx)
> O e per ogni naturale i uvi wxi y EL(G).
In particolare, per i = O anche uwy E L(G). Ma 1(uwy) < 1(z) perchè/(vx)
> O, così uwy contraddice la scelta di z. Segue che, se L(G) 0, L(G) contiene stringhe di lunghezza < n.(b) Se L(G) contiene una stringa z di lunghezza maggiore di n, allora
L(G)
è infinito: basta applicare il Teorema uvwxy per osservare che z si scrive uvwxy per opportune stringhe u, v, w, x e y tali che, in particolare,L(G)
comprende tutte le infinite parole uv i wxi y per i che varia tra i numeri naturali. Viceversa, supponiamo cheL(G)
sia infinito. AlloraL(G)
contiene stringhe di ogni possi-bile lunghezza, in particolare anche stringhe z di lunghezza > n. Scegliamo z di lunghezza minima (comunque > n). Se1(z)
< 2n, siamo a posto. Altrimentiapplichiamo di nuovo il Teorema uvwxy a z e la esprimiamo come uvwxy rica-vando n, v, w, x e y dalle parole sull'alfabeto T dei simboli terminali di G: in par-ticolare, uwy E L(G), 1(uwy) < n e /(vx) > O. Notiamo l(uwy) < 1(z) proprio perchè /(vx) > O; inoltre 1(uwy) > l(uy) > n perchè 1(uvwxy) = 1(z) > 2n e /(vwx) < n. Ma allora uwy contraddice la scelta di z. ❑ Come già nel caso dei linguaggi regolari, possiamo allora ridurre il problema di stabilire se un linguaggio L libero dal contesto è o no vuoto, oppure è o no finito, alla questione della decidibilità di L. Come già preannunciato, dimostreremo in § 5.8 che, in realtà, tutti i linguaggi dipendenti dal contesto (e in particolare quelli liberi dal contesto) sono decidibili. Se accettiamo sin da ora questa conclusione, possiamo enunciare il seguente risultato, che estende il Teorema 5.6.3.
Teorema 5.7.3 Ci sono algoritmi effettivi che sanno decidere, per ogni linguag-gio libero dal contesto L,
(a) se L è vuoto oppure no, (b) se L è finito oppure no.
Esaminiamo adesso il comportamento dei linguaggi liberi dal contesto rispetto alla usuali operazioni tra linguaggi.
Proposizione 5.7.4 1 linguaggi di tipo 2 sono chiusi rispetto alle operazioni di unione, concatenazione e chiusura di Kleene.
Dimostrazione. La dimostrazione è simile a quella per i linguaggi regolari, e an-che più semplice. Siano L1, L2 due linguaggi liberi dal contesto, G1 = (N1, Ti,
, Si) e G2 = (N2, T2, P2, S2) le grammatiche tipo 2 che li generano. Di nuo-vo possiamo assumere che N1 e N2 sono disgiunti. Per provare che, per esempio, L1 U L2 è di tipo 2, prendiamo un nuovo simbolo iniziale S3 e formiamo
G3 = (Ni U N2 U {S3}, U T2, U P2 U {S3 SA S2 }, 83),
accettiamo dunque S3 -4 Si 182 nelle produzioni di G3, come concesso dalla definizione di grammatica libera dal contesto anche se proibito nelle grammatiche regolari. Si verifica allora che G3 è davvero una grammatica libera dal contesto e che genera L1 U L2. In modo analogo si procede per concatenazione e chiusura
di Kleene. ❑
Ma i linguaggi di tipo 2, a differenza di quelli regolari, non si preservano per intersezione. Vediamo perchè.
Proposizione 5.7.5 La classe dei linguaggi di tipo 2 non è chiusa rispetto alla intersezione.
Dimostrazione. Il linguaggio L1 = {a i bi ci i, j E N, > 1} è generato dalla grammatica G1 con produzioni
S AB
A ab a Ab
B > c c_13
e il linguaggio L2 = {Cib 2 b3 C3 i i, j E N, i, j > 1} è generato da una grammatica G2 con produzioni
S —÷ AB
A > a aA B > bc i bBc.
Si vede facilmente che le grammatiche G1 e G2 sono libere dal contesto, e quindi tali sono anche L 1 e L2. Ma la loro intersezione è il linguaggio {a' bi ci i G N, i >
1}, che abbiamo visto non essere libero dal contesto.
Ne segue:
Corollario 5.7.6
La classe dei linguaggi di tipo 2 non è chiusa rispetto alla complementazione.Dimostrazione. Una classe chiusa per unione e complementazione lo è anche per intersezione, visto che l'intersezione di due insiemi è il complemento dell'unione
dei loro complementi. ❑
Si ricordi che la soluzione positiva del problema dell'equivalenza di grammatiche regolari, così come dimostrata nel § 5.6, dipende proprio dal fatto che la classe dei linguaggi regolari si preserva per intersezione e complemento. Come abbiamo appena visto, non altrettanto vale per arbitrari linguaggi liberi dal contesto, e in effetti si può provare che il problema dell'equivalenza per grammatiche libere dal contesto rimane indecidibile.
Teorema 5.7.7 Non c'è algoritmo capace di stabilire, date due grammatiche li-bere dal contesto G1 e G2, se L(G1) = L(G2) oppure no.
La dimostrazione è elaborata; così rimandiamo ai testi citati in bibliografia per i dettagli.