Sei sulla pagina 1di 51

Corso di Linguaggi di

Programmazione + Laboratorio
Docente: Marco de Gemmis

Capitolo 2 Grammatiche e
Linguaggi

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


concessione del materiale didattico
Linguaggi formali e monoidi liberi
Il concetto di linguaggio formale strettamente
correlato a quello di monoide libero (generato da un
insieme).

2/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizione di Alfabeto
Un insieme X finito e non vuoto di simboli un
alfabeto.
Esempi
Lalfabeto latino, con laggiunta dei simboli di
interpunzione e dello spazio bianco: a b c z ; , . :
Linsieme delle dieci cifre arabe: 0 1 9
Con i simboli primitivi dellalfabeto si formano le
parole (es.: abc, 127, casa,).

3/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizione di Parola o Stringa
Una sequenza finita di simboli x1 x2 ...xn , dove ogni
xi preso da uno stesso alfabeto X una parola
(su X).
Esempio
X = {0,1}.
001110 una parola su X
Una parola ottenuta giustapponendo o
concatenando simboli (caratteri) dellalfabeto.
Se una stringa ha m simboli (non necessariamente
distinti) allora diciamo che ha lunghezza m.

4/51
Corso di Linguaggi di Programmazione + Laboratorio
Lunghezza di una Parola o Stringa
La lunghezza di una stringa w denotata con |w|.
Le parole di lunghezza 1 sono i simboli di X.
Quindi 001110 una parola di lunghezza 6

001110 = 6

La parola vuota (o stringa vuota), denotata con ,


una stringa priva di simboli ed ha lunghezza 0
= 0

5/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizioni
Uguaglianza tra stringhe
Due stringhe sono uguali se i loro caratteri, letti
ordinatamente da sinistra a destra, coincidono.
X*
Linsieme di tutte le stringhe di lunghezza finita
sullalfabeto X si denota con X*.
Esempio

Se X = {0,1}, allora X = { , 0, 1, 00, 01, 10, 11,...}
X* ha un numero di elementi che un infinito
numerabile.
Dalla definizione, segue che X*, per ogni
insieme X.
6/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizioni
Concatenazione o prodotto
Sia X* una stringa di lunghezza m e X* una
stringa di lunghezza n, la concatenazione di e ,
denotata con o , definita come la stringa di
lunghezza m+n, i cui primi m simboli costituiscono
una stringa uguale a ed i cui ultimi n simboli
costituiscono una stringa uguale a .
Quindi se = x1 x2 ...xm e = x1 x2 ...xn , si ha:

= x1 x2 ...xm x1 x2 ...xn
Se X = alfabeto latino
= capo = stazione = capostazione
7/51
Corso di Linguaggi di Programmazione + Laboratorio
Operazione di concatenazione
La concatenazione di stringhe su X una
operazione binaria su X*:

: X X X

associativa: ( ) = ( ) = , , , X

non commutativa: , X :
capostazione stazionecapo
ha elemento neutro : = = , X *

Dunque ( X , ) un monoide (non commutativo).


8/51
Corso di Linguaggi di Programmazione + Laboratorio
Osservazione
In base alla definizione di prodotto, ogni parola non
vuota = x1 x2 ...xn si pu scrivere in uno ed un solo
modo come prodotto di parole di lunghezza 1, cio
di elementi di X.
Ci si esprime dicendo che:
(X , )

il monoide libero generato dallinsieme X.

9/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizioni
Prefisso, Suffisso
Se X della forma = , ove , X ,


allora un prefisso di e un suffisso di .
Sottostringa

Se , X e della forma = , ove , X

allora una sottostringa di .


Esempio
Sia = 00110. Allora:
{ , 0, 00, 001, 0011, } linsieme dei prefissi di
{ , 0, 10, 110, 0110, } linsieme dei suffissi di
{ , 0, 1, 00, 01, 10, 11, 001, 011, 110, 0011, 0110, }
linsieme delle sottostringhe di .
10/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizioni
Potenza di una stringa
Data una stringa su X, la potenza h-esima di
definita (induttivamente) come segue:

se h = 0
h
= h 1
altrimenti
con h=0, 1, 2,
La potenza h-esima di una stringa un caso
speciale di concatenamento (in quanto la si ottiene
concatenando una stringa h volte con se stessa).

11/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizioni
Potenza di un alfabeto
Sia X un alfabeto, poniamo:
1
1) X = X
2
2) X = {x1 x2 | x1 , x2 X , x1 x2 x1 x2 }
3 2
3) X = { x x x
1 2 3 | x x
1 2 X , x3 X , x1 x2 x3 x1 x2 x3}
..)
X i = {x1 x2 ...xi 1 xi | x1 x2 ...xi 1 X i 1 , xi X , x1 x2 ...xi x1 x2 ...xi 1 xi }
i)

12/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizioni
Potenza di un alfabeto
Se i2 si ha:
+
X + = X X 2 ... X i ... = Xi
i= 1
+
Se la parola vuota e prendiamo un w X tale
che w = w = w si ha:
+
X = { } X
Inoltre si ha:
{ } se h = 0
X =
h
h 1
XX altrimenti
13/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizioni
Linguaggio formale
Un linguaggio formale L su un alfabeto X un
sottoinsieme di X*.

L X
Esempio:
Il linguaggio delle parentesi ben formate un
linguaggio formale in quanto, denotato con M tale
linguaggio, si ha:
M { (,)} *

I linguaggi formali possono essere di natura molto


diversa luno dallaltro.
14/51
Corso di Linguaggi di Programmazione + Laboratorio
Esempi di linguaggi formali
Un linguaggio di programmazione pu essere
costruito a partire dallalfabeto X dei simboli sulla
tastiera.
Linsieme, finito o infinito, dei programmi ben
costruiti sintatticamente (ossia, che rispettano la
sintassi) costituisce un linguaggio.
Consideriamo linsieme dei teoremi di una teoria
matematica. I teoremi sono particolari stringhe di
simboli del nostro alfabeto. Linsieme dei teoremi
ben formati rappresenta un linguaggio. Ad
esempio, la stringa ab=ba non un teorema della
teoria dei gruppi, ma della teoria dei gruppi
abeliani.
15/51
Corso di Linguaggi di Programmazione + Laboratorio
Generazione e riconoscimento di linguaggi formali

A noi interessano i linguaggi formali da almeno due


punti di vista
Descrittivo/Generativo
Riconoscitivo

16/51
Corso di Linguaggi di Programmazione + Laboratorio
Generazione e riconoscimento di linguaggi formali

Punto di vista Descrittivo/Generativo


Come possiamo generare gli elementi di un dato linguaggio L?
Un linguaggio finito pu essere descritto/generato per
elencazione degli elementi (se il numero non troppo grande).
Un linguaggio infinito non elencabile. Questi sono i pi
interessanti perch devono essere specificati necessariamente
attraverso una propriet che ne caratterizza gli elementi, che ne
definisce lintensione. Tale propriet pu essere vista come una
regola da seguire per generare gli elementi del linguaggio. Il vero
problema trovare la(e) regola(e) generativa(e) (di produzione) di
un linguaggio. quello che accade quando si impara un
linguaggio: non possibile memorizzare tutte le frasi del
linguaggio.

17/51
Corso di Linguaggi di Programmazione + Laboratorio
Generazione di linguaggi formali
Esempio
Non possibile elencare tutti i teoremi della teoria
dei gruppi, perch sono infiniti i teoremi realizzabili
combinando quelli noti.
Un libro di teoria dei gruppi non lelencazione dei
teoremi, ma fornisce una serie di assiomi e le regole
con le quali, a partire dagli assiomi, possibile
costruire tutti i teoremi della teoria dei gruppi.
Per descrivere la regola di produzione di un
linguaggio, utilizzeremo una notazione insiemistica.

18/51
Corso di Linguaggi di Programmazione + Laboratorio
Generazione di linguaggi formali
Esempio
Sia L il linguaggio su X = {0} costituito da tutte e sole
le stringhe che hanno un numero pari di 0, cio:

L = { , 00, 0000, 000000, ...}

La regola di produzione di L viene espressa come


segue:

{
L = { } w n | w = 00, n = 1,2,... }
19/51
Corso di Linguaggi di Programmazione + Laboratorio
Generazione e riconoscimento di linguaggi formali

Punto di vista Riconoscitivo


Come possiamo riconoscere gli elementi di un dato
linguaggio L? Questo secondo punto di vista ha
come obiettivo la costruzione di macchine in grado
di decidere/stabilire se una stringa un elemento di
L oppure no. Si intende costruire una macchinetta
cui dare in ingresso una particolare parola e che
produce una tra due possibili risposte:
s ' L' e no ' L'

20/51
Corso di Linguaggi di Programmazione + Laboratorio
Riconoscimento di linguaggi formali
Esempio
Lesecuzione di un programma errato
sintatticamente viene inibita. Questo indice
dellesistenza di una macchinetta che stabilisce se
il programma appartiene o no allinsieme dei
programmi sintatticamente ben costruiti.

21/51
Corso di Linguaggi di Programmazione + Laboratorio
Generazione di linguaggi formali: esempio
Sia dato lalfabeto: X = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + , }
Voglio generare il linguaggio L dei numeri interi

relativi. Ovviamente: L X

Pi precisamente, L X poich, ad esempio,
1+ + 5 L
Non possiamo elencare gli elementi di L. Cerchiamo
dunque una serie di regole mediante le quali
possibile produrre tutti e soli gli elementi di L.
Assumiamo, per semplicit, che un numero relativo
sia costituito da una serie di cifre precedute da + o -.

22/51
Corso di Linguaggi di Programmazione + Laboratorio
Generazione di linguaggi formali: esempio
Adottiamo la BNF per descrivere le produzioni:
< S > ::= + < I > | < I >
< I > ::= < D > | < I > < D >
< D > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Queste regole generano tutti gli interi relativi purch partiamo dal
simbolo nonterminale S.
I il simbolo nonterminale (da ora in poi, talvolta abbreviato in
NT), anche detto categoria sintattica, che sta ad indicare (e da
cui si genera) la classe dei numeri interi.
I definito ricorsivamente o come una cifra oppure come un
intero seguito da una cifra.
Ogni intero relativo generato da queste regole e niente che non
sia un intero relativo pu essere generato da queste regole.
23/51
Corso di Linguaggi di Programmazione + Laboratorio
Generazione di linguaggi formali: esempio
S
Generazione ad albero:
proviamo a generare lintero relativo -375
I
Tale albero prende il nome di
albero di derivazione.
*
S 375 375 L I D
Nella notazione vista per il linguaggio delle
parentesi ben formate, tipica per i linguaggi 5
formali, la grammatica diventa: I D
S+I|I
ID|ID D 7

D0|1|2|3|4|5|6|7|8|9
Corso di Linguaggi di Programmazione + Laboratorio
3 24/51
Grammatiche generative
Dagli esempi di linguaggi visti, possiamo trarre le seguenti
conclusioni. Per generare un linguaggio sono necessari:
un insieme X di simboli primitivi con cui si formano le parole del
linguaggio, detto alfabeto dei simboli terminali o alfabeto
terminale;
un insieme V di simboli ausiliari o variabili con cui si identificano
le categorie sintattiche del linguaggio, detto alfabeto dei simboli
nonterminali (ausiliari) o alfabeto nonterminale o alfabeto delle
variabili;
un simbolo speciale S, scelto tra i nonterminali, da cui far partire
la generazione delle parole del linguaggio. Tale simbolo detto
assioma o scopo o simbolo distintivo o simbolo di partenza o
simbolo iniziale;
un insieme P di produzioni, espresse in un formalismo quali
regole di riscrittura, BNF (a::=b), carte sintattiche,
25/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizione di Grammatica generativa o a struttura
di frase
Una grammatica generativa o a struttura di frase G
una quadrupla
G=(X,V,S,P)
ove:
X lalfabeto terminale per la grammatica;
V lalfabeto nonterminale o delle variabili per la
grammatica;
S il simbolo di partenza per la grammatica;
P linsieme delle produzioni della grammatica
ed inoltre valgono le seguenti condizioni:
X V = e S V
26/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizione di Produzione
Una produzione una coppia (v,w),
+ * *
ove v ( X V ) e v contiene un NT v ( X V ) V ( X V )
w ( X V ) (w pu essere anche ).
Un elemento (v,w) di P viene comunemente scritto nella
forma:
v w
Una produzione deve, in qualche modo, riscrivere un NT.

27/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizione di Produzione
Per convenzione, gli elementi di X sono
rappresentati di solito con lettere minuscole (con o
senza pedici e di solito sono le prime lettere
dellalfabeto) o cifre ed operatori (connettivi), mentre
gli elementi di V sono rappresentati con lettere
maiuscole (con o senza pedici) o con stringhe
delimitate dalle parentesi angolari < e >.
La notazione 1 | 2 || k impiegata come
abbreviazione della seguente:
1
2

k
Corso di Linguaggi di Programmazione + Laboratorio
28/51
Esempi di grammatiche
La grammatica per il linguaggio delle parentesi ben
formate
G1 = ({ ( , ) }, {S }, S , {S ( ), S ( S ), S SS })

La grammatica per il linguaggio dei numeri interi


relativi
G2 = ({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, -}, {S , I , D}, S ,
{S + I , S I , I D, I ID, D 0, D 1, ..., D 9})

29/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizione di derivazione o produzione diretta

Sia G=(X,V,S,P) una grammatica e siano y e z


due stringhe finite di simboli in XV (stringhe di
terminali e nonterminali) tali che:
+ *
y = e z = , ove y ( X V ) , z ( X V ) ,
, , ( X V ) ( X V ) + e contiene un NT
1) Scriviamo
y z
e diciamo che y produce direttamente z o che z
derivata direttamente da y se:
P
ossia se esiste in G una produzione
30/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizione di derivazione o produzione diretta

2) Scriviamo
y z
e diciamo che y produce z o che z derivabile da
y se y=z o esiste una sequenza di stringhe
w1 , w2 ,..., wn , con w1 , w2 ,..., wn 1 ( X V ) + , wn ( X V )*
w1=y e wn=z tali che i, i = 1,2,..., n 1 : wi wi + 1
G
(wi produce direttamente wi+1), cio:
y= z


y z oppure
w = y w w ... w w = z
1 2 3 n 1 n

31/51
Corso di Linguaggi di Programmazione + Laboratorio
Osservazione
La nozione di derivazione diretta stabilisce una

relazione binaria in ( X V ) .
Date due stringhe y e z, il simbolo pu esserci o
meno; dipende dallesistenza di una produzione.
Allora possiamo anche definire una composizione di
relazioni:
2 def
y z w: y w e w z
dove 2 il numero di trascrizioni necessarie per
passare da y a z (ossia, la lunghezza della
derivazione).
32/51
Corso di Linguaggi di Programmazione + Laboratorio
Osservazione
2 3
Da ci si ha: = I
n
ove I la relazione identica e indica la
composizione della relazione nvolte con se stessa.

la chiusura riflessiva e transitiva della
relazione di derivazione diretta;
+
la chiusura transitiva della stessa relazione.

33/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizione di linguaggio generato da una
grammatica
Sia G=(X,V,S,P) una grammatica. Il linguaggio
generato da G, denotato con L(G), linsieme delle
stringhe di terminali derivabili dal simbolo di partenza
S.

L(G ) = w X S w
G

Sono, dunque, stringhe di L(G) le stringhe che:
consistono di soli terminali;
possono essere derivate da S in G.

34/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizione di forma di frase

Sia G=(X,V,S,P) una grammatica. Una stringa w,



w ( X V ) , una forma di frase di G se:

S w
G

Alle forme di frase si applicano le stesse definizioni


(es.: potenza) e gli stessi operatori (es.:
concatenazione) dati per le stringhe.
Proposizione:
Data una grammatica G=(X,V,S,P), L(G) linsieme
delle forme di frase terminali (o frasi) di G.

35/51
Corso di Linguaggi di Programmazione + Laboratorio
Definizione di grammatiche equivalenti

Due grammatiche G e G si dicono equivalenti se


generano lo stesso linguaggio, ossia se

L(G)=L(G)

36/51
Corso di Linguaggi di Programmazione + Laboratorio
Esempio

Sia G=(X,V,S,P), ove


(1) ( 2)

X = {a, b}, V = {S }, P = S aSb, S ab

Determiniamo L(G).
ab L(G ) poich S
( 2)
ab
Se numeriamo le produzioni, possiamo indicare la
produzione usata immediatamente al di sotto del
simbolo .
ho applicato la produzione n
(n )
k
y z y produce z in k passi, dove k=lunghezza
della derivazione
37/51
Corso di Linguaggi di Programmazione + Laboratorio
Esempio
2 2
a2b2 L(G) poich S aSb a b
(1) ( 2)
3
3 3
a3b3 L(G) poich S a b

{a nb n | n > 0} L(G )

Inoltre, qualsiasi derivazione da S in G produce frasi


del tipo anbn.
n n
Dunque L (G ) {a b | n > 0} e quindi
n n
L(G ) = {a b | n > 0}
38/51
Corso di Linguaggi di Programmazione + Laboratorio
Notazione

Per rendere pi concisa la descrizione di una


grammatica, spesso ci limiteremo ad elencarne le
produzioni, quando sia chiaro quale sia il simbolo di
partenza e quali siano i terminali ed i nonterminali.
Inoltre, le produzioni con la stessa parte sinistra
vengono accorpate attraverso luso del simbolo
(preso a prestito dalla BNF).
Infine, ometteremo lindicazione della grammatica
dalla simbologia di derivazione e derivazione diretta
quando sia chiaro dal contesto a quale grammatica si
fa riferimento.
39/51
Corso di Linguaggi di Programmazione + Laboratorio
Esempio

Sia data la seguente grammatica:


(1) ( 2 ) ( 3) ( 4) ( 5) ( 6 )
S A |B, A aA | a , B bB | b
Determinare L(G). (1) ( 2)
Non sappiamo se applicare S A oppure S B
inizialmente. I meccanismi di costruzione di un
linguaggio sono generalmente non deterministici,
poich pu non essere univoca la sostituzione da
operare ad una forma di frase se uno stesso NT si
trova a sinistra di 2 o pi produzioni, come illustrato
nella figura seguente.

40/51
Corso di Linguaggi di Programmazione + Laboratorio
Esempio
aaaA...

)
(3
aaA

(4
)
)
(3

aA aaaL(G)
(4
)

aaL(G)
)

A
(3
(4
)

aL(G)
)
(1

S
{ } { }
bB...
L( G ) = a n n > 0 b n n > 0
(2
)

)
(5

B
(6
)

bL(G)
41/51
Corso di Linguaggi di Programmazione + Laboratorio
Osservazione

Dunque, una grammatica uno strumento generativo


di un linguaggio perch, data una qualsiasi parola di
quel linguaggio, possiamo risalire mediante le
produzioni al simbolo di partenza della grammatica.
Viceversa, dato il simbolo di partenza di una
grammatica, seguendo uno qualsiasi dei cammini
dellalbero di derivazione, si produce una parola
valida del linguaggio.

42/51
Corso di Linguaggi di Programmazione + Laboratorio
Osservazione

In generale, dato un linguaggio L ed una grammatica


G, non esiste un algoritmo in grado di dimostrare che
la grammatica genera il linguaggio, ossia che
L=L(G).
Pi specificamente, non esiste un algoritmo che
stabilisce se una data stringa generata o no dalla
grammatica presa in considerazione.
Tutto ci si riassume nella seguente proposizione:
Il problema di dimostrare la correttezza di una
grammatica non risolubile algoritmicamente, in
generale.

43/51
Corso di Linguaggi di Programmazione + Laboratorio
Osservazione

In molti casi importanti, per, possibile dimostrare


per induzione che una particolare grammatica genera
proprio un particolare linguaggio.
Queste dimostrazioni ci consentono di stabilire se,
data una grammatica G ed un linguaggio L, risulta:
w L(G ) w L cio L(G ) L
w L w L(G ) cio L L(G )

44/51
Corso di Linguaggi di Programmazione + Laboratorio
Osservazione

In molti casi importanti, per, possibile dimostrare


per induzione che una particolare grammatica genera
proprio un particolare linguaggio.
Queste dimostrazioni ci consentono di stabilire se,
data una grammatica G ed un linguaggio L, risulta:
w L(G ) w L cio L(G ) L
w L w L(G ) cio L L(G )

La grammatica G genera solo stringhe


appartenenti al linguaggio L.

45/51
Corso di Linguaggi di Programmazione + Laboratorio
Osservazione

In molti casi importanti, per, possibile dimostrare


per induzione che una particolare grammatica genera
proprio un particolare linguaggio.
Queste dimostrazioni ci consentono di stabilire se,
data una grammatica G ed un linguaggio L, risulta:
w L(G ) w L cio L(G ) L
w L w L(G ) cio L L(G )

Il linguaggio L comprende solo parole


generabili dalla grammatica G.
46/51
Corso di Linguaggi di Programmazione + Laboratorio
Principio di induzione

Sia n0 un intero e sia P=P(n) un enunciato che ha


senso per ogni intero maggiore o uguale ad n0 . Se:
P(n0) vero
Per ogni n>n0, P(n-1) vero implica P(n) vero
allora P(n) vero per tutti gli n maggiori o uguali ad n0

47/51
Corso di Linguaggi di Programmazione + Laboratorio
Esercizi

Determinare una grammatica che genera il seguente


linguaggio:

L = {a nb n | n > 0}
e dimostrare questo risultato.

Che tipo di grammatica genera L ?


Soluzione esercizio

48/51
Corso di Linguaggi di Programmazione + Laboratorio
Esercizi

Determinare una grammatica che genera il seguente


linguaggio:

L = {a n b 2 n | n > 0}
e dimostrare questo risultato.

Di che tipo la grammatica che genera L ?


Soluzione esercizio

49/51
Corso di Linguaggi di Programmazione + Laboratorio
Esercizi

Sia data la seguente grammatica:


G = ( X ,V , S , P )
X = {0, 1} V = {S , A, B}
(1) (2) ( 3) (4) (5) (6) (7 ) (8 )

P = S 0 B | 1A, A 0 | 0S | 1AA, B 1 | 1S | 0 BB

Determinare il linguaggio generato da G.
Soluzione esercizio

50/51
Corso di Linguaggi di Programmazione + Laboratorio
Esercizi

Dimostrare per induzione che il linguaggio L generato


dalla seguente grammatica vuoto:

G = ( X ,V , S , P )
X = {a, b, c} V = {S , A, B}
(1) ( 2) ( 3) ( 4 ) (5) ( 6 )

P = S aBS | bA, aB Ac | a , bA S | Ba

Soluzione esercizio

51/51
Corso di Linguaggi di Programmazione + Laboratorio

Potrebbero piacerti anche