Sunteți pe pagina 1din 13

Curs 5

Limbaje Independente de Context

In cele dou
a cursuri precedente au fost prezentate doua metode diferite nsa echivalente
de a descrie limbaje: automatele finite si expresiile regulate. In final au fost identificate
limbaje simple care nu pot fi descrise n acest fel, de exemplu limbajul {0n 1n | n 0}.
Incep
and cu acest curs vor fi prezentate gramaticile independente de context. Vom
vedea c
a ele sunt o metod
a mai puternica de descriere a limbajelor. O caracteristica important
a a lor este c
a pot descrie proprietati care au o structura recursiva.
Prima oar
a, gramaticile independente de context au fost folosite n studiul limbajelor umane. De exemplu, ele pot descrie recursiv relatiile dintre substantiv, verb si
prepozitie n fraze.
Gramaticile independente de context au aplicatii multe n specificarea si compilarea limbajelor de programare. Gramatica unui limbaj de programare este foarte util
a
pentru cei care vor s
a-i nvete sintaxa. De obicei, primul pas al proiectantilor de compilatoare si interpretoare pentru limbaje de programare este sa-i defineasca sintaxa. Cele mai
multe compilatoare si interpretoare contin un analizor gramatical (numit si parser) care
extrage semnificatia unui program nainte de a trece n faza de compilare sau interpetare. In
prezent se cunosc numeroase metodologii de construire a parserelor precum si tooluri care
genereaz
a automat un parser din o gramatica.
Limbajele care pot fi descrise cu o gramatica independenta de context se numesc limbaje
independente de context. Vom vedea ca ele includ toate limbajele regulate precum si
numeroase limbaje neregulate.
In prima parte a acestei prezentari vor fi descrise gramaticile independente de context
si propriet
atile limbajelor independente de context. In partea a doua vor fi prezentate
automatele push-down. Acestea sunt o clasa de automate care pot recunoaste limbaje
independente de context. Deasemenea, automatele push-down ne vor permite sa aflam mai
multe despre gramaticile si limbajele independente de context.

Gramatici Independente de Context

Exemplul ilustrativ urm


ator este o gramatica independenta de context numita G1 .
A 0A1
AB
B#

O gramatic
a este format
a din reguli de substitutie numite si productii. Fiecare regul
a
este o linie separat
a a gramaticii formata dintr-un simbol urmat de o sageata si apoi un sir.
Simbolul din st
anga s
agetii se numeste variabil
a.
S
irul din dreapta s
agetii este o secventa de variabile si alte simboluri numite terminale. Variabilele se scriu cu litere mari iar terminalele cu litere mici. Terminalele
corespund alfabetului de intrare si sunt adesea litere mici, numere sau simboluri speciale.
Una din variabile este desemnata sa fie variabila de start. De obicei, variabila de
start este cea care apare n partea stanga a primei reguli din gramatica.
De exemplu, gramatica G1 are trei reguli. Variabilele lui G1 sunt A si B. A este variabila
de start. Simbolurile terminale sunt 0, 1 si #.
O gramatic
a independenta de context descrie un limbaj prin generarea de siruri n felul
urm
ator:
1. Se scrie mai nt
ai starea de start care este de obicei simbolul din stanga primei reguli
din gramatic
a.
2. Se alege o variabil
a care apare scrisa si o regula care ncepe cu variabila aleasa. Se
nlocuieste variabila aleasa cu partea dreapta a regulii alese.
3. Se repet
a pasul 2 p
an
a cand se obtine un sir care contine doar simboluri terminale.
We exemplu, gramatica G1 poate genera sirul 000#111. Secventa de substitutii care genereaz
a
un sir se numeste derivatie. O derivatie a sirului 000#111 n gramatica G1 este
A 0A1 00A11 000A111 000B111 000#111.
Alternativ, derivarea unui sir poate fi reprezentata si cu un arbore generator, ca cel de mai
jos. Toate sirurile generate n acest fel constituie limbajul gramaticii. In general, limbajul
A
A
A
A
B
0

Figure 1: Arbore generator pentru gramatica G1 .


unei gramatici G este denotat L(G). Ese usor de observat ca L(G1 ) = {0n #1n | n 0}.
2

Limbajele care pot fi generate de o gramatica independenta de context se numesc limbaje


independente de context (sau CFL, abreviere de la Context-Free Languages).
O abreviere convenabil
a pentru mai multe reguli care au aceeasi parte stanga este s
a se
scrie o singur
a dat
a simbolul din partea stanga urmat de sageata, urmat de partile drepte
ale regulilor separate cu simbolul ,,|. De exemplu, regulile A 0A1 si A B se pot scrie
abreviat A 0A1 | B n o singura linie.

1.1

Definitia formal
a a unei gramatici independente de context

O gramatic
a independent
a de context este un 4-tuplu (V, , R, S) unde
1. V este o multime finit
a de variabile.
2. este o multime finit
a de terminale. Se presupune ca multimile V si sunt disjuncte,
adic
a V = .
3. R este o multime finit
a de reguli de forma X w cu X V si w un sir de simboluri
din V .
4. S V este variabila de start.
Dac
a u, v, w (V ) si A w este o regula a gramaticii, vom spune ca uAv produce
uwv si vom scrie uAv uwv. Deasemenea, spunem ca u deriveaz
a v si scriem u v
dac
a u = v sau dac
a exist
a o secventa de siruri u1 , . . . , uk astfel ncat
u u1 u2 . . . uk v.
Limbajul gramaticii este multimea de siruri {w | S w}.
Cel mai adesea, o gramatica se specifica scriindu-i regulile. Variabilele sunt simbolurile
care apar n partea st
ang
a a regulilor iar terminalele sunt celelalte simboluri care apar n
reguli. Implicit, variabila de start este variabila din partea stanga a primei reguli.

1.2

Exemplu de gramatic
a independent
a de context

Gramatica G = (V, , R, hEXPRi) cu regulile


hEXPRi hEXPRi + hTERMi | hTERMi
hTERMi hTERMi hFACTORi | hFACTORi
hFACTORi (hEXPRi) | a
Arborii generatori din Figura 2 indica faptul ca sirurile a + a a si (a + a) a pot fi generati
de gramatica G.
Un compilator translateaza codul scris n un limbaj de programare n o alta forma care
este mai convenabil
a pentru executie. Acest proces se numeste parsing si se bazeaza adesea
pe construirea unui arbore generator pentru programul citit. Constructia arborelui generator
se bazeaz
a pe gramatica independenta de context a limbajului de programare.
Gramatica G descrie un fragment din un limbaj de programare cu expresii aritmetice. Se
poate remarca felul n care arborii generatori ilustrati n Figura 2 grupeaza operatiile. De
exemplu, arborele pentru a + (a a) grupeaza operatorul si operanzii lui (ultimii doi a)
ca pe un operand al operatorului +. In arborele pentru (a + a) a, ordinea este inversat
a.
3

Figure 2: Arbori generatori pentru sirurile a + a a si (a + a) a.

1.3

Designul gramaticilor independente de context

La fel ca si designul automatelor finite, si designul gramaticilor independente de context


necesit
a creativitate. Vom descrie aici cateva tehnici care pot fi folosite independent sau n
combinatii pentru a construi gramatici independente de context (sau CFG-uri).
Reuniunea de limbaje. Daca se cunosc gramaticile G1 = (V1 , , R1 , S1 ) si G2 =
(V2 , , R2 , S2 ) pentru limbajele L1 si L2 atunci putem construi usor CFG pentru limbajul
L1 L2 : G = (V, , R, S) unde S este un neterminal nou, V = V1 V2 {S} si R =
R1 R2 {S S1 |S2 }.
De exemplu, pentru a obtine o gramatica pentru limbajul {0n 1n | n 0}{1n 0n | n 0}
construim mai nt
ai gramatica
S1 0S1 1 | 
pentru limbajul {0n 1n | n 0} si gramatica
S2 1S2 0 | 
pentru limbajul {1n 0n | n 0}. Daca adaugam regula S S1 | S2 obtinem gramatica
S S1 | S2
S1 0S1 1 | 
S2 1S2 0 | .
Conversia unui AFD n CFG. Uneori este mai usor sa se construiasca un AFD
pentru un limbaj. Conversia unui AFD n gramatica independenta de context se face astfel.
Se consider
a o variabil
a nou
a Ri pentru fiecare stare qi a AFD-ului. Apoi se adauga regula
R1 aRj la CFG dac
a (qi , a) = qj este o tranzitie a AFD-ului. Daca qi este stare final
aa
AFD-ului, se adaug
a regula Ri . Variabila de start a gramaticii se alege sa fie R0 , unde
q0 este starea de start.

Tehnici de memorare. Anumite limbaje independente de context contin siruri cu dou


a
subsiruri ,,legate n sensul ca o masina pentru un astfel de limbaj ar trebui sa retina un
num
ar nelimitat de informatie despre un subsir pentru a verifica daca al doilea subsir este
cel corespunz
ator. Aceast
a situatie apare pentru limbajul {0n 1n | n 0} deoarece masina
trebuie s
a tin
a minte num
arul de 0 ca sa verifice ca este egal cu numarul de 1 din sirul
urm
ator. O gramatic
a independenta de context care trateaza correct o situatie de acest gen
are o regul
a de forma R uRv care genereaza siruri n care portiunea ce contine secvente
de u corespunde portiunii care contine secvente de v.
In final, n limbaje mai complexe sirurile pot contine structuri care apar recursiv ca
p
arti ale altor structuri sau ca parti de structuri de acelasi fel. Gramatica pentru expresii
aritmetice ilustrat
a mai devreme este un exemplu tipic de acest fel. In acel exemplu, orice
aparitie a simbolului a poate fi nlocuita recursiv cu orice expresie aritmetica ntre paranteze.
Pentru a obtine acest efect, se plaseaza variabila care genereaza structura n locatia din
regul
a unde poate s
a apar
a recursiv structura respectiva.

1.4

Ambiguitate

Uneori, a gramatic
a poate genera acelasi sir n mai multe feluri. Un astfel de sir va avea
mai multi arbori generativi si deci mai multe semnificatii. Este de dorit sa se evite astfel de
situatii n aplicatii. De exemplu n limbajele de programare un program dat trebuie sa aib
a
o singur
a interpretare.
Dac
a o gramatic
a genereaza un sir n mai multe feluri spunem ca sirul ese derivat ambiguu n gramatica respectiva. Daca o gramatica genereaza un sir ambiguu spunem c
a
gramatica este ambigu
a.
De exemplu, gramatica G5 definita de regula
hEXPRi hEXPRi + hEXPRi | hEXPRi hEXPRi | (hEXPRi) | a
genereaz
a ambiguu sirul a + a a. Figura urmatoare prezinta doi arbori generativi diferiti
pentru acest sir.

Aceast
a gramatic
a nu tine cont de precedenta operatorilor aritmetici si deci poate grupa +
naintea lui , sau invers. In schimb, gramatica G din Sectiunea 1.2 generaza acelasi limbaj
ca si G5 si fiecare sir generat are un arbore generativ unic. Prin urmare gramatica G este
neambigu
a n timp ce gramatica G5 este ambigua.
Definitia general
a a notiunii de ambiguitate este urmatoarea. Spunem ca o gramatic
a
genereaz
a ambiguu un sir daca sirul are doi arbori generativi diferiti. Se poate ntampla
ca pentru acelasi arbore generativ sa putem scrie derivatii diferite deoarece putem modifica
5

ordinea de rescriere a variabilelor. Putem nsa sa definim un tip de derivatie care nlocuieste
variabilele n o ordine predefinita. O derivatie a unui sir w n o gramatica G este o derivatie
la st
anga dac
a la fiecare pas se nlocuieste variabila cea mai din stanga.
Definitia 1 Un sir este derivat ambiguu n gramatica independent
a de context G dac
a are
2 sau mai multe derivatii la st
anga care sunt diferite. Gramatica G este ambigu
a dac
a
genereaz
a ambiguu un sir.
Uneori, c
and avem o gramatica ambigua putem gasi o gramatica neambigua care genereaz
a
acelasi limbaj. Exist
a limbaje independente de context pentru care nu exista gramatici
neambigue. Un astfel de limbaj se numeste inerent ambiguu. De exemplu, limbajul
{ai bj ck | i = j sau j = k} este inerent ambiguu.

1.5

Forma normal
a Chomsky

C
and se lucreaz
a cu gramatici independente de context, este convenabil sa le avem scrise n
o form
a simplificat
a. O forma foarte simpla si convenabila este forma normala Chomsky.
Vem vedea c
a forma normala Chomsky este utila pentru a defini algoritmi care sa lucreze
cu gramatici independente de context.
Definitia 2 O gramatic
a independent
a de context este n forma normal
a Chomsky dac
a
este alc
atuit
a din reguli de forma
A BC
Aa
unde a poate fi orice terminal iar A, B si C pot fi orice variabile, cu exceptia faptului c
aB
si C nu pot fi variabila de start. De asemenea, este permis s
a avem regula S  dac
aS
este variabila de start.
Rezultatul care ne intereseaza este urmatorul.
Teorema 1 Orice limbaj independent de context este generat de o gramatic
a n forma normal
a Chomsky.
Demonstratie. Conversia unei gramatici G n o forma normala Chomsky se face n 4 pasi.
1. Mai nt
ai se adaug
a a variabila de start noua S0 si regula S0 S unde S este variabila
original
a de start a lui G. Acest pas garanteaza faptul ca variabila de start nu apare
n partea dreapt
a a vreunei reguli.
2. Apoi se elimin
a toate regulile A  pentru care A nu este variabila de start. Pentru
fiecare aparitie a lui A n partea dreapta a unei reguli se adauga o regula noua cu
acea aparitie a lui A eliminata. Altfel spus, daca R uAv este o regula, se va adauga
regula R uv. Aceasta transformare se face pentru fiecare aparitie a lui A, deci regula
R uAvAw va provoca adaugarea regulilor R uvAw, R uAvw si R uvw.
Dac
a avem regula R A si eliminam A, adaugam regula R  cu exceptia cazului
n care regula R  a fost eliminata mai devreme. Acest pas se repeta pana cand se
elimin
a toate -regulile care nu se refera la starea de start.
6

3. In al treilea pas se elimina regulile unitare de forma A B. Cand se elimina o regul


a
A B, atunci pentru toate cazurile n care apare o regula B u se adauga regula
A u, cu exceptia cazului n care A u este o regula unitara care a fost deja
eliminat
a. Acest pas se repeta pana cand se elimina toate regulile unitare.
4. In final se convertesc toate regulile ramase n forma Chomsky conrespunzatoare. Fiecare
regul
a A u1 u2 . . . uk cu k 3 se nlocuieste cu regulile A u1 A1 , A1 u2 A2 , . . . ,
Ak2 uk1 uk unde A1 , A2 , . . . , Ak2 sunt variabile noi. Daca k = 2 se nlocuieste
fiecare terminal ui din regulile precedente cu o variabila noua Ui si se adauga regula
Ui ui .

Exemplu
Fie G6 gramatica independenta de context
S ASA | aB
AB|S
Bb|
1. Dup
a primul pas obtinem gramatica
S0 S
S ASA | aB
AB|S
Bb|
2. Dac
a se elimin
a -regula B  se obtine gramatica
S0 S
S ASA | aB | a
AB|S|
Bb
Apoi se elimin
a -regula A  si se obtine gramatica
S0 S
S ASA | aB | a | SA | AS | S
AB|S
Bb
3.a Dac
a se elimin
a regula unitara S S, restul regulilor raman neschimbate. Apoi se
elimin
a regula unitar
a S0 S si se obtine gramatica
S0 ASA | aB | a | SA | AS
S ASA | aB | a | SA | AS
AB|S
Bb
7

3.b Se elimin
a regula unitara A B si se obtine gramatica
S0 ASA | aB | a | SA | AS
S ASA | aB | a | SA | AS
AS|b
Bb
Apoi se elimin
a regula unitara A S si se obtine gramatica
S0 ASA | aB | a | SA | AS
S ASA | aB | a | SA | AS
A b | ASA | aB | a | SA | AS
Bb
4. In final se convertesc toate regulile ramase n forma Chomsky si se obtine gramatica
S0 AA1 | U B | a | SA | AS
S AA1 | U B | a | SA | AS
A b | AA1 | U B | a | SA | AS
A1 SA
U a
Bb

Automate Pushdown

Automatul push-down este un model nou de calcul nedeterminist care, spre deosebire de
automatul finit nedeterminist are o stiv
a. Stiva reprezinta memorie suplimentara care
permite automatului s
a recunoasca niste limbaje neregulate.
Vom vedea c
a automatele pushdown sunt echivalente cu gramaticile independente de
context. Aceast
a echivalent
a este utila deoarece avem 2 optiuni cum sa demonstram ca un
limbaj este independent de context.
Figura urm
atoare este o reprezentare schematica a unui automat finit. Controlul reprezint
a st
arile unei functii de tranzitie, banda contine sirul de intrare iar sageata reprezint
a
capul de citire pozitionat pe simbolul care urmeaza sa fie citit.

Dac
a se adaug
a o stiv
a se obtine reprezentarea schematica a unui automat pushdown ilustrat
a n continuare.

Automatul pushdown (APD) poate scrie simboluri pe stiva si le poate reciti mai tarziu.
Scrierea unui simbol mpinge n jos toate celelalte simboluri din stiva. In orice moment se
poate citi si sterge simbolul din varful stivei. In acest caz simbolurile ramase n stiv
a se
mut
a n sus cu 1 pozitie. Trebuie retinut ca tot accesul de scriere/citire a stivei se produce
doar la v
arful stivei. Altfel spus, o stiva este un dispozitiv de memorare de tipul ,,ultimul
care intr
a-primul care iese. Daca se scrie o informatie A1 pe stiva si apoi se adauga alt
a
informatie A2 , informatia A1 nu mai poate fi accesata decat dupa ce se elimina informatia
A2 din stiv
a.
Stivele sunt utile deoarece pot retine o cantitate nelimitata de informatie. Reamintim
faptul c
a un automat finit nu poate sa recunoasca limbajul {an bn | n 0} fiindca nu are
memorie s
a retin
a numere n mari. Un APD poate recunoaste acest limbaj deoarece poate
folosi stiva ca s
a tin
a minte cati 0 a citit. Deci stiva permite ca automatul sa memoreze
numere oric
at de mari.
La fel ca si automatele finite, si automatele pushdown pot fi deterministe sau nedeterministe. Vom vedea c
a exista nsa o deosebire mare ntre automatele finite si automatele
pushdown:
AFD si AFN sunt echivalante.
APD deterministe si APD nedeterministe nu sunt echivalante.

2.1

Definitia formal
a a automatului pushdown

Definitia 3 Un automat pushdown este un 6-tuplu (Q, , , , q0 , F ) unde Q, , si F


sunt multimi distincte si
1. Q este multimea de st
ari,
2. este alfabetul de intrare,
3. este alfabetul stivei,
4. : Q   2Q este functia de tranzitie,
5. q0 Q este starea de start, si
6. F Q este multimea starilor de acceptare.
Reamintim c
a  este cuv
antul cu lungimea 0,  = {}, = {} si 2Q este
multimea submultimilor lui Q  .

Un automat pushdown M = (Q, , , , q0 , F ) calculeaza astfel. Un cuvant w este


acceptat dac
a putem scrie w = w1 w2 wn cu wi  si exista starile r0 , r1 , . . . , rm Q si
sirurile s0 , s1 , . . . , sm sare satisfac urmatoarele 3 conditii (sirurile si reprezinta secventa
de continuturi ale stivei lui M de-a lungul unei alternative de calcul care-l accepta pe w):
1. r0 = q0 si s0 = . Aceasta conditie indica faptul ca M porneste din starea de start cu
stiva goal
a.
2. Pentru i = 0, . . . , m 1 avem (ri+1 , b) (ri , wi+1 , a) unde si = at si si+1 = bt pentru
a, b  si t . Aceasta conditie spune ca M efectueaza tranzitii corecte care
depind de starea, continutul stivei si simbolul urmator de intrare.
3. rm F . Aceast
a conditie indica faptul ca n final M trece n o stare finala.

2.2

Exemple de automate pushdown

Exemplul 1. Un automat psuhdown care recunoaste limbajul {0n 1n | n 0} este M1 =


(Q, , , , q1 , F ), unde
Q = {q1 , q2 , q3 , q4 },
= {0, 1},
= {0, $},
F = {q1 , q4 }, si
este functia de tranzitie data de tabela urmatoare n car eintrarile goale reprezint
a
multimea vid
a
Intrare:
Stiv
a: 0
q1
q2
q3
q4

0
$

1


{(q2 , 0)}

{(q3 , )}
{(q3 , )}


$

 0


{(q2 , $)}

{(q4 , )}

Acest APD poate fi descris si cu o diagrama de stari:

Diagrama de st
ari pentru APD este similara cu cea pentru automate finite, cu modificarea c
a
scriem deasuprea s
agetilor de tranzitie si felul cum foloseste automatul stiva cand trece din
o stare n alta. Se scrie ,,a, b c pentru a indica faptul ca atunci cand automatul citeste
simbolul a de pe band
a, poate nlocui simbolul b din varful stive cu simbolul c. Oricare din
simbolurile a, b, c poate fi . Daca a = , automatul poate face o tranzitie fara sa citeasc
a
10

vreun simbol de pe banda de intrare. Daca b = , automatul poate face tranzitia far
a s
a
citeasc
a si s
a scoat
a vreun simbol din stiva. Daca c = , automatul nu scrie nici un simbol
pe stiv
a c
and face tranzitia.
Definitia formal
a a unui APD nu are un mecanism explicit care sa-i permita automatului
s
a detecteze dac
a stiva este vida. APD-ul din acest exemplu poate efectua acest test fiindc
a
la nceput pune simbolul $ pe stiva. Daca ulterior detecteaza simbolul $ din nou, va sti c
a
stiva s-a golit. Acest mod de detectie ca stiva s-a golit poate fi utilizat de catre orice APD.
O alt
a observatie importanta este ca un APD nu poate testa explicit daca a ajuns la
sf
arsitul sirului de intrare. APD-ul din acest exemplu poate detecta acest fapt deoarece
intr
a n o stare de acceptare doar atunci cand masina ajunge la sfarsitul sirului de intrare.
Prin urmare putem presupune ntotdeauna ca un APD poate verifica daca stiva s-a golit
sau dac
a a citit tot sirul de intrare.
Exemplul 2. Vom descrie un APD care recunoaste limbajul {ai bj ck | i, j, k si i =
j sau i = k}. Intuitiv, APD-ul pe care-l construim lucreaza astfel. Mai ntai citeste subsirul
de a-uri si le pune pe stiv
a. Cand a terminat de citit a-uri, automatul poate alege s
a
le potriveasc
a cu subsirul de b-uri sau cu subsirul de c-uri. Aceasta manevra este putin
problematic
a deoarece automatul nu stie n avans daca subsirul de a-uri trebuie potrivit cu
cel de b-uri sau cu cel de c-uri. Aceasta problema poate fi rezolvata usor deoarece un APD
poate fi nedeterminist si poate ghici ce sa faca.
Diagrama de st
ari a unui astfel de APD este ilustrata mai jos.

Exemplul 3. Vom descrie un APD pentru limbajul {wwR | w {0, 1} } unde wR reprezint
a
cuv
ntul w inversat. Constructia APD-ului poate fi descrisa neformal astfel. Automatul
ncepe s
a citeasc
a si s
a pun
a pe stiva toate simbolurile citite pana la un moment cand decide
nedeterminist c
a a citit jum
atate din cuvant, adica w. Apoi ncepe sa scoata simboluri din
stiv
a verific
and c
a simbolul scos se potriveste cu cel de intrare. Daca automatul reuseste
s
a goleasc
a stiva n acest fel si totodata sa si consume tot sirul de intrare, cuvantul este
acceptat. In caz contrar, cuvantul nu este acceptat.
Diagrama de st
ari a masinii descrise este ilustrata mai jos.

11

2.3

Exercitii

1. Se consider
a gramatica independenta de context urmatoare
E E+T |T
T T F |F
F (E) | a
Sse construiasc
a arborii generatori si derivatiile la stanga pentru expresiile urmatoare
a) a

b) a+a

c) a+a+a

d) ((a))

2. Se consider
a gramatica independenta de context G cu regulile
R XRX | S
S aT b | bT a
T XT X | X | 
Xa|b
(a)
(b)
(c)
(d)

Care sunt variabilele lui G?


Care sunt terminalele gramaticii G?
Care este variabila de start a lui G?
S
a se indice 3 siruri din limbajul L(G).

3. S
a se defineasc
a gramatici independente de context care genereaza limbajele urmatoare
din {0, 1} :
(a)
(b)
(c)
(d)
(e)

{w | w contine trei de 1}.


{w | w ncepe si se termina cu acelasi simbol}.
{w | lungimea lui w este impara}.
{w | lungimea lui w este impara si simbolul de la mijloc este 0}.
Multimea vid
a.

4. S
a se converteasc
a gramatica urmatoare n forma normala Chomsky
A BAB | B | 
B 00 | 
12

5. S
a se demonstreze c
a daca G este o gramatica independenta de context n form
a
normal
a Chomsky atunci pentru orice sir w L(G) cu lungimea n 1 se produce o
derivatie cu exact 2n 1 pasi care sa-l genereze pe w.

Bibliografie
1. Michael Sipser. Introduction to the Theory of Computation, Second Edition. Thomson
Course Technology. 2006. Capitolul 3: Context-Free Languages.

13

S-ar putea să vă placă și