Documente Academic
Documente Profesional
Documente Cultură
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.
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
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
1.3
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
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
2.2
0
$
1
{(q2 , 0)}
{(q3 , )}
{(q3 , )}
$
0
{(q2 , $)}
{(q4 , )}
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)
3. S
a se defineasc
a gramatici independente de context care genereaza limbajele urmatoare
din {0, 1} :
(a)
(b)
(c)
(d)
(e)
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