Sei sulla pagina 1di 47

Corso di Linguaggi di

Programmazione + Laboratorio

Docente: Marco de Gemmis


Capitolo 4 Linguaggi liberi da
contesto

Si ringraziano il Prof. Giovanni Semeraro e il Dott. Pasquale Lops per la


concessione del materiale didattico

Alberi di derivazione

Le derivazioni in una grammatica libera da contesto


possono essere rappresentate da alberi (detti alberi
di derivazione).
La sequenza delle regole sintattiche utilizzate per
generare una stringa w da una grammatica G di
simbolo iniziale S definisce la struttura di w, che
dunque potrebbe
essere
rappresentata
da
una
delle
*
derivazioni S w . Al fine di disporre di una
rappresentazione univoca, si preferisce ricorrere agli
alberi di derivazione.

Corso di Linguaggi di Programmazione + Laboratorio

2/47

Definizioni preliminari

Un Albero un grafo orientato, aciclico, connesso e avente al


massimo un lato entrante in ciascun nodo.
La definizione rigorosa di albero la seguente:

Un albero T un insieme finito, non vuoto di vertici (nodi) tali che:

esiste un vertice speciale, detto radice dellalbero;


esiste una partizione T1, T2, ..., Tm, con m0, degli altri vertici, tale
che esista un ordinamento T1, T2, ..., Tm, e ogni sottoinsieme di vertici
Ti, 1im, sia a sua volta un albero.

Questa definizione di tipo ricorsivo, ma non circolare in quanto


ogni sottoalbero Ti contiene meno vertici dellalbero T.
T1, T2, ..., Tm sono detti sottoalberi di T. I vertici privi di discendenti
sono le foglie dellalbero, gli altri sono i nodi interni.
La stringa dei simboli che etichettano le foglie di un albero T, letti
nellordine da sinistra a destra, prende il nome di frontiera di T.

Corso di Linguaggi di Programmazione + Laboratorio

3/47

Definizione di partizione

Gli insiemi (non vuoti) T1, T2, ..., Tm, m0,


costituiscono una partizione di un insieme (non
vuoto) T se:
i)

Ti T j per i j , i, j 1, 2, ..., m
m

ii)

T T
i

i 1

Corso di Linguaggi di Programmazione + Laboratorio

4/47

Definizione di albero di derivazione

X
Sia G = (X, V, S, P) una grammatica
C.F.
e
*
una stringa derivabile da S in G, S w .
Dicesi albero di derivazione lalbero T avente le
seguenti propriet:

(1)

la radice etichettata con il simbolo iniziale S;


(2) ogni nodo interno (nodo non foglia) etichettato
con un simbolo di V (un nonterminale);
(3) ogni nodo foglia etichettato con un simbolo di X
(un terminale) o con ;

Corso di Linguaggi di Programmazione + Laboratorio

5/47

Definizione di albero di derivazione


(4)

se un nodo N etichettato con A, ed N ha k


discendenti diretti N1 , N 2 ,..., N k, etichettati con i simboli
A1 , A2 ,..., Ak, rispettivamente, allora la produzione:

A A1 A2 ... Ak
A

...

deve appartenere a P;
(5) la stringa w pu essere ottenuta leggendo (e
concatenando) le foglie dellalbero da sinistra a destra.
Corso di Linguaggi di Programmazione + Laboratorio

6/47

Definizioni

Lunghezza di un cammino
Dato

un albero di derivazione, la lunghezza di un


cammino dalla radice ad una foglia data dal numero
di nonterminali su quel cammino.

Altezza o profondit
Laltezza

di un albero data dalla lunghezza del suo


cammino pi lungo.

Corso di Linguaggi di Programmazione + Laboratorio

7/47

Osservazione

Un albero di derivazione non impone alcun ordine


sullapplicazione delle produzioni in una derivazione.
In altri termini, data una derivazione, esiste uno ed
un solo albero di derivazione che la rappresenta,
mentre un albero di derivazione rappresenta in
generale pi derivazioni (in funzione dellordine col
quale si espandono i nonterminali).
Esempio

Corso di Linguaggi di Programmazione + Laboratorio

8/47

Principio di sostituzione di sottoalberi

Definizione di derivazione destra (sinistra)


Data

una grammatica
G = (X, V, S, P), diremo che
*
una derivazione S w , ove:
S w1 w2 ... wn w
wi yi Azi , wi 1 yi wi zi , i 1, 2, ..., n 1

destra (sinistra) se, per ogni i, i = 1, 2,..., n-1, risulta:


zi X ( yi X )
In altre parole in una derivazione destra (sinistra) ad
ogni passo si espande il nonterminale posto pi a
destra (sinistra).
Corso di Linguaggi di Programmazione + Laboratorio

9/47

Esempio

Riconsideriamo la grammatica che genera tutte e sole


le stringhe che hanno un ugual numero di 1 e di 0.
S 0 B | 1A
A 0 | 0S | 1AA
B 1 | 1S | 0 BB

Consideriamo la stringa 0011. Una possibile


derivazione : S 0 B 00 BB 001B 0011
Unaltra possibile : S 0 B 00 BB 00 B1 0011
Il non determinismo insito nella derivazione scompare
quando si considera il relativo albero di derivazione
(vedi figura seguente).
Corso di Linguaggi di Programmazione + Laboratorio

10/47

Esempio
S

Corso di Linguaggi di Programmazione + Laboratorio

11/47

Principio di sostituzione di sottoalberi

Consideriamo ora il sottoalbero con radice nel nodo di


profondit minore etichettato con una B.
S

Corso di Linguaggi di Programmazione + Laboratorio

12/47

Principio di sostituzione di sottoalberi

Cosa accade se un qualsiasi sottoalbero con radice in


un nodo etichettato con una B viene sostituito con il
sottoalbero
?
Il nuovo albero ancora un albero di derivazione
(ovviamente, per una stringa differente da 0011).
Consideriamo, ad esempio, il sottoalbero individuato
dal cerchio pieno
nella figura seguente

Corso di Linguaggi di Programmazione + Laboratorio

13/47

Principio di sostituzione di sottoalberi


S

Il nuovo albero di derivazione rappresentato nella


seguente figura:
Corso di Linguaggi di Programmazione + Laboratorio

14/47

Principio di sostituzione di sottoalberi


S

per cui: S 000111

Corso di Linguaggi di Programmazione + Laboratorio

15/47

Principio di sostituzione di sottoalberi

Possiamo ripetere indefinitamente questo processo di


sostituzione di sottoalberi, ottenendo parole del
linguaggio di lunghezza crescente:
0011

w 4

000111

w 6

w 00001111 w 8

00 n11n

w 2n 2 n 1, 2,

La lunghezza cresce in maniera costante.

Corso di Linguaggi di Programmazione + Laboratorio

16/47

Principio di sostituzione di sottoalberi

Nelle grammatiche C.F., dunque, possiamo sostituire alberi


pi piccoli con alberi di dimensioni maggiori, purch abbiano
la stessa radice - pi precisamente, purch i nodi radice
siano etichettati con lo stesso NT - ottenendo ancora alberi di
derivazione validi.
Una caratteristica dei linguaggi C.F., che discende
direttamente dal processo descritto in precedenza, che la
lunghezza delle parole cresce in maniera costante.
Dunque, se una grammatica genera parole la cui lunghezza
cresce in maniera esponenziale, allora il linguaggio generato
non libero.
n n n
Controesempio L {a b c | n 0}

Corso di Linguaggi di Programmazione + Laboratorio

17/47

Principio di sostituzione di sottoalberi

Generalizziamo ora il discorso:


Supponiamo di avere un albero di derivazione Tz per
una stringa z di terminali generata da una grammatica
C.F. G, e supponiamo inoltre che il simbolo NT A
compaia due volte su uno stesso cammino.
La situazione rappresentata graficamente in Figura.

Corso di Linguaggi di Programmazione + Laboratorio

18/47

Principio di sostituzione di sottoalberi


S

Il sottoalbero pi in basso
con radice nel nodo
etichettato con una A
genera la sottostringa w,
mentre quello pi in alto
genera la sottostringa vwx.
Poich la G C.F.,
sostituendo il sottoalbero pi
in alto con quello pi in
basso, si ottiene ancora una
derivazione valida. Il nuovo
albero genera la stringa
uwy.

Corso di Linguaggi di Programmazione + Laboratorio

19/47

Principio di sostituzione di sottoalberi


S

Se effettuiamo la
sostituzione inversa (il
sottoalbero pi in basso
viene rimpiazzato da quello
pi in alto), otteniamo un
albero di derivazione lecito
per la stringa uvvwxxy,
ossia uv2wx2y. Ripetendo
questa sostituzione un
numero finito di volte, si
ottiene linsieme di stringhe:

{uv wx y | n 0}
n

Corso di Linguaggi di Programmazione + Laboratorio

20/47

Proposizione

Ogni linguaggio C.F. infinito deve contenere almeno


un sottoinsieme infinito di stringhe della forma:
uvnwxny
n0
Formalizziamo ora alcuni risultati connessi con il
processo di sostituzione di sottoalberi.

Corso di Linguaggi di Programmazione + Laboratorio

21/47

Lemma

Sia G = (X, V, S, P) una grammatica C.F. e


supponiamo che:

m max v A v P

Sia Tw un albero di derivazione per una stringa w di


L(G). Se laltezza di Tw al pi uguale ad un intero j,
allora: w m j
In formule: height (Tw ) j w m

Corso di Linguaggi di Programmazione + Laboratorio

22/47

Dimostrazione

La dimostrazione vale per un albero di derivazione


che abbia come radice un qualunque simbolo NT, non
necessariamente S.
Procediamo per induzione su j.
Passo base
j=1
Tw rappresenta ununica produzione:

Tw:

...

Dunque la parola generata composta al pi da m


caratteri terminali e si ha: w m
Corso di Linguaggi di Programmazione + Laboratorio

23/47

Dimostrazione

Passo induttivo
Supponiamo che il lemma valga per ogni albero di
altezza al pi uguale a j e la cui radice sia un simbolo
NT e dimostriamolo per un albero di altezza j+1.
Supponiamo che il livello pi alto dellalbero
rappresenti la produzione A v , dove
v v1v2 ...vk , v k , k m (il sottoalbero di profondit
1 ha al pi m figli).
A

Tw:

v1
Corso di Linguaggi di Programmazione + Laboratorio

v2

...

vk
24/47

Dimostrazione

Ogni simbolo vi, i = 1, 2,..., k di v pu essere radice di


un sottoalbero di altezza al pi uguale a j, poich Tw
ha altezza uguale a j+1 (un vi potrebbe anche essere
un terminale).
Dunque, per ipotesi di induzione, ciascuno di questi
alberi ha al pi mj foglie. Poich v k m , la stringa
w, frontiera dellalbero Tw, ha lunghezza:
j
j
j
j
j
j
j 1
w m

...

v k volte

c.v.d.
Corso di Linguaggi di Programmazione + Laboratorio

25/47

Pumping Lemma per i linguaggi liberi da contesto


o teorema uvwxy

Sia L un linguaggio libero da contesto. Allora esiste


una costante p, che dipende solo da L, tale che se z
una parola di L di lunghezza maggiore di p ( z p),
allora z pu essere scritta come uvwxy in modo tale
che:
(1) vwx p
(2) al pi uno tra v e x la parola vuota (vx );
(3)

i, i 0 : uv i wx i y L

Corso di Linguaggi di Programmazione + Laboratorio

26/47

Osservazione

Dato un linguaggio generato da una grammatica che non


C.F., non possiamo escludere immediatamente che non
esiste una grammatica C.F. che generi lo stesso
linguaggio.
Se un linguaggio infinito non obbedisce al Pumping
Lemma, non pu essere generato da una grammatica
C.F.
Il Pumping Lemma per i linguaggi liberi fornisce una
condizione necessaria affinch un linguaggio sia libero.
L libero p ,....
Dunque pu essere utilizzato per dimostrare che un
linguaggio non libero (con una dimostrazione per
assurdo - modus tollens).

p,... L non libero

Corso di Linguaggi di Programmazione + Laboratorio

27/47

Dimostrazione Pumping Lemma

Sia G = (X, V, S, P) una grammatica C.F. che genera


L. Denotiamo con m il numero di simboli della pi
lunga parte destra di una produzione di G:

m max v A v P

Denotiamo con k la cardinalit dellalfabeto


nonterminale di G:
kV
k 1

Poniamo p m
e sia z L , con z p
Per il lemma precedente:

height (T ) j z m z m
j

height (Tz ) j

Corso di Linguaggi di Programmazione + Laboratorio

28/47

Dimostrazione Pumping Lemma

se z p m k 1 allora ogni albero di derivazione per z


deve avere altezza maggiore di k+1.
Dunque, in ogni albero di derivazione per z deve
esistere almeno un cammino di lunghezza non
inferiore a k+2.
Poich k V , almeno due NT devono comparire
duplicati su quel cammino o un NT deve essere
ripetuto 3 o pi volte sul cammino. Senza ledere la
generalit della dimostrazione, denotiamo con A il NT
che compare duplicato per ultimo su quel cammino.
Non vi sono pertanto altri NT ripetuti almeno due volte
al di sotto della A pi in alto (della coppia di A).
Corso di Linguaggi di Programmazione + Laboratorio

29/47

Dimostrazione Pumping Lemma

Questa considerazione implica che il cammino dalla A


pi in alto della coppia ad una foglia ha lunghezza al
pi k+1.
Indichiamo con vwx la sottostringa derivata dal
sottoalbero avente radice nella A pi alta della coppia,
ove w la sottostringa derivata dal sottoalbero avente
radice nella A pi bassa della coppia.
Dal Lemma, si ha:

vwx m k 1 p
per cui risulta dimostrata la (1) del Pumping Lemma.

Corso di Linguaggi di Programmazione + Laboratorio

30/47

Dimostrazione Pumping Lemma

Scriviamo z nella forma uvwxy, ed applichiamo il


principio di sostituzione di sottoalberi. Se sostituiamo
al sottoalbero avente radice nella A pi alta della
coppia quello avente radice nella A pi bassa,
otteniamo un albero di derivazione per la stringa:
uwy uv 0 wx 0 y che la (3) per i = 0.
Se operiamo la sostituzione inversa, otteniamo un
albero di derivazione per la stringa: uvvwxxy uv 2 wx 2 y
che la (3) per i = 2.
Se ripetiamo la suddetta sostituzione i-1 volte, la
i
i
u
v
v
...
v
w
x
x
...
x
y

uv
wx
y
stringa derivata :
i volte

i volte

per cui la (3) risulta dimostrata.


Corso di Linguaggi di Programmazione + Laboratorio

31/47

Dimostrazione Pumping Lemma

La (2) pu essere dimostrata per assurdo.


Sia: v x
La sostituzione del sottoalbero avente radice nella A pi
alta della coppia con quello avente radice nella A pi
bassa non provoca alcun cambiamento nella stringa z
derivata dallintero albero. Ma tale sostituzione provoca la
diminuzione della lunghezza del cammino che dalla A (in
origine quella pi in alto) porta ad una foglia. Dunque,
anche il cammino di lunghezza non inferiore a k+2 (su cui
compariva la coppia di A) nellalbero di derivazione per z
risulta accorciato. In questo modo abbiamo ottenuto un
albero di derivazione per z con altezza almeno uguale a
k+1. Ma questo assurdo per il Lemma.
c.v.d.
Corso di Linguaggi di Programmazione + Laboratorio

32/47

Definizione di grammatica ambigua

Una grammatica G libera da contesto ambigua se


esiste una stringa x in L(G) che ha due alberi di
derivazione differenti.
In modo alternativo, G ambigua se esiste una
stringa x in L(G) che ha due derivazioni sinistre (o
destre) distinte.

Corso di Linguaggi di Programmazione + Laboratorio

33/47

Esempio di grammatica ambigua

La seguente grammatica libera da contesto:


G2 ( X , V , S , P )
X {a,},

V {S },

P {S S S , S a}

ambigua. Infatti la stringa w a a a in L(G2) ha due


differenti alberi di derivazione.
S

S
a

Nel linguaggio naturale, lambiguit (sintattica) un


fenomeno intrinseco, che si verifica frequentemente.
Corso di Linguaggi di Programmazione + Laboratorio

34/47

Esempio
un dolce rosso
aggettivo

sostantivo
rosso

dolce
aggettivo

sostantivo

una torta di colore rosso


un dolce rosso
un uomo rosso dal carattere dolce

Agli effetti delle applicazioni ai linguaggi di


programmazione, lambiguit una propriet
negativa. Infatti, il significato di una frase pu essere
definito come una funzione del suo albero di
derivazione.
Corso di Linguaggi di Programmazione + Laboratorio

35/47

Esempio

Sicch, se esiste pi di un albero di derivazione per


una stessa frase, essa pu avere un significato non
univoco.
Si preferisce perci cercare una grammatica
differente che, pur generando lo stesso linguaggio,
non sia ambigua.
Lunico vantaggio delle grammatiche ambigue risulta
essere, in generale, il minore numero di regole che
possono avere rispetto ad una grammatica non
ambigua.

Corso di Linguaggi di Programmazione + Laboratorio

36/47

Esempio

Il linguaggio precedente pu essere generato anche


dalla seguente grammatica:
G3 ( X , V , S , P )
X {a,},

V {S },

P {S S a, S a}

G3 non ambigua.
Inoltre: L(G2 ) L(G3 ) aw | w { a}* a { a}

Esistono per dei linguaggi, detti inerentemente


ambigui, per i quali tutte le grammatiche che li
generano risultano ambigue.

Corso di Linguaggi di Programmazione + Laboratorio

37/47

Definizione di linguaggio inerentemente ambiguo

Un linguaggio L inerentemente ambiguo se ogni


grammatica che lo genera ambigua.

(G ) L L(G ) : G ambigua

Corso di Linguaggi di Programmazione + Laboratorio

38/47

Esempio di linguaggio inerentemente ambiguo

Un linguaggio inerentemente ambiguo :

L {a i b j c k | a i b j c k , (i j j k )}
Intuitivamente, ci si rende conto di ci pensando che
in ogni grammatica che genera L devono esistere due
diversi insiemi di regole per produrre le stringhe aibick
e le stringhe aibjcj. Le stringhe aibici saranno
necessariamente prodotte in due modi distinti, con
distinti alberi di derivazione e conseguente ambiguit.

Corso di Linguaggi di Programmazione + Laboratorio

39/47

Esempio di linguaggio ambiguo

Linguaggi di programmazione
Si

consideri la seguente grammatica G = (X, V, S, P):


X = {if, then, else, a, b, p, q}
V = {S, C}
P = {S if C then S else S | if C then S | a | b, C p | q}
G ambigua. Infatti la stringa:
w = if p then if q then a else b
pu essere generata in due modi.

Corso di Linguaggi di Programmazione + Laboratorio

40/47

Esempio di linguaggio ambiguo

S
if

S
then S

C
p

if

if

C then

else

if p then (if q then a else b)

C then
p

if

C then S
q

else

if p then (if q then a) else b

Corso di Linguaggi di Programmazione + Laboratorio

41/47

Esempio di linguaggio ambiguo

Per rendere non ambigua G si usa solitamente la


convenzione di associare ogni istruzione else con
listruzione if pi vicina.
La grammatica che riflette questa convenzione la
seguente:

G ( X ,V , S , P )

X = {if, then, else, a, b, p, q}


V = {S, S1, S2, C, T}
P = {S S1 | S2,S1 if C then S1 else S2 | T,S2 if C
then S | if C then S1 else S2 | T,C p | q,T a | b }
Corso di Linguaggi di Programmazione + Laboratorio

42/47

Esempio di linguaggio ambiguo

In G la stringa w = if p then if q then a else b ha un


unico albero di derivazione:
S
S2

Ma proprio vero che lalbero


di derivazione per w unico?
Si tenga conto che lambiguit
di un linguaggio prescinde dal
nome delle variabili ma dipende
dalla struttura.

if

C then S
p

S2

if

C then

S1

Corso di Linguaggi di Programmazione + Laboratorio

else

S2

43/47

Esercizi

Determinare la grammatica che genera il seguente


linguaggio:

L {a b c | n 0}
n n n

e dimostrare la correttezza di tale grammatica.


Di che tipo la grammatica che genera L?
Applicare il Pumping Lemma per dimostrare che L
non libero.
Soluzione esercizio

Corso di Linguaggi di Programmazione + Laboratorio

44/47

Esercizi

Applicare il Pumping Lemma per dimostrare che il


seguente linguaggio L non libero da contesto:

L a

n2

|n0

Soluzione esercizio

Corso di Linguaggi di Programmazione + Laboratorio

45/47

Esercizi

Applicare il Pumping Lemma per dimostrare che il


seguente linguaggio L non libero da contesto:

L a b | i 2 , i, j 0
i

Soluzione esercizio

Corso di Linguaggi di Programmazione + Laboratorio

46/47

Esercizi

Dimostrare che il seguente linguaggio non libero da


contesto:

L a k b r | k > 0, r k 2

Soluzione esercizio

Corso di Linguaggi di Programmazione + Laboratorio

47/47