Sunteți pe pagina 1din 31

Modulul 1.

Introducere în Teoria Limbajelor Formale


Cuprins
Introducere..........................................................................................................................9
Competenţe.........................................................................................................................9
U1. Noţiuni generale de teoria limbajelor formale...........................................................10
U2. Algoritmi normali în sens Markov.............................................................................17
U3. Gramatici analitice şi generative................................................................................25
Soluţiile testelor de autoevaluare pentru Modul 1............................................................38

Introducere
Introducem, în acest modul, o serie de noţiuni folosite în teoria limbajelor formale
cum ar fi: alphabet, simbol, cuvânt, subcuvânt, prefix, suffix, cuvânt vid. Noţiunea
de limbaj formal se defineşte apoi în mai multe feluri, echivalente între ele,
pornind de la sisteme de rescriere, pînă la gramatici generative şi analitice.

În afară de gramatici se mai prezintă un exemplu de sistem de rescriere, algoritmul


normal în sens Markov, pentru care se dau o serie de exemple de funcţionare.

În continuare se prezintă o ierarhizare a gramaticilor, numită Ierarhia lui Chomsky,


şi se definesc operaţiile cu limbaje.

Competenţe
La sfârşitul acestui modul studenţii vor fi capabili să:
 Folosească noţiunile definite în descrierea limbajelor formale;
 Construiască gramatici generative şi analitice pentru diferite limbaje;
 Construiască algoritmi normali în sens Markov cu o intrare şi o ieşire;
fixată;
 Implementeze algoritmii prezentaţi într-un limbaj de programare general.

-9-
Unitatea de învăţare M1.U1. Noţiuni generale de teoria limbajelor
formale

Cuprins

M1.U1.1. Introducere .................................................................................................... 10


M1.U1.2. Obiectivele unităţii de învăţare ..................................................................... 10
M1.U1.3. Noţiunea de limbaj ....................................................................................... 10
M1.U1.4. Rezumat ........................................................................................................ 16

M1.U1.1. Introducere
Noţiunile folosite în teoria limbajelor formale au fost preluate din lingvistică deşi
sunt folosite de multe ori cu sens schimbat. Astfel limbajul este definit ca o
mulţime de cuvinte iar în lingvistică, care se referă la un limbaj natural, limbajul
este o mulţime de fraze care sunt la rândul lor mulţimi de cuvinte.

Problema delicată este de a defini în mod finit o mulţime infinită sau foarte mare
de cuvinte.

In acestă primă parte se defineşte un limbaj prin proprietăţi specifice ale


cuvintelor sale sau printr-un sistem de reguli care conduc la generarea cuvimtelor
sale .

M1.U1.2. Obiectivele unităţii de învăţare


Această unitate de învăţare îşi propune ca obiectiv principal o iniţiere a studenţilor
în noţiuni specifice Limbajelor formale.
La sfârşitul acestei unităţi de învăţare studenţii vor fi capabili să:
 înţeleagă şi să explice algoritmii de generare a cuvintelor unui limbaj;
 demonstreze corectitudinea unei construcţii de limbaj.

Durata medie de parcurgere a unităţii de învăţare este de 2 ore.

M1.U1.3 Noţiunea de limbaj


Noţiunea de limbaj se întâlneşte atât în lingvistică, unde se referă la limbajele naturale, cât şi în
informatică, unde se referă la limbajele de programare.
O limbă naturală se defineşte, conform dicţionarului, ca o mulţime de cuvinte şi de metode de
combinare a lor, folosită şi înţeleasă de o comunitate umană considerabilă.

- 10 -
Un limbaj de programare se defineşte ca o mulţime de programe corecte scrise în acel limbaj.
O limbă naturală sau un limbaj de programare pot fi considerate ca mulţimi de secvenţe, adică
şiruri finite de elemente ale unui anumit vocabular de bază.
Pentru a putea studia proprietăţile acestor limbaje a fost necesară formalizarea noţiunii de
limbaj, construirea unei teorii matematice riguroase a limbajelor. O astfel de teorie este suficient de
generală pentru a include şi limbajele naturale şi limbajele de programare, precum şi o mulţime de alte
limbaje, formând la un loc aşa numitele limbaje formale.
Pentru a putea defini noţiunea de limbaj formal vom introduce o serie de noţiuni şi notaţii
folosite frecvent în această teorie.

Definiţia 1.1.1 Un alfabet sau vocabular, V, este o mulţime finită, nevidă de elemente.

Definiţia 1.1.2 Un element al alfabetului V se numeşte literă sau simbol.

În cele ce urmează vom folosi ca simboluri cifrele, literele latine şi greceşti mari şi mici şi
simboluri speciale cum ar fi $, #.

Exemplul 1 Exemple de alfabete sunt:


-alfabetul latin: {A, B, C, ..., Z}
-alfabetul grecesc: {, , , ..., }
-alfabetul binar: {0, 1}.

Definiţia 1.1.3 Un cuvânt peste alfabetul V este un şir finit constând din zero sau mai multe simboluri
ale lui V, unde un acelaşi simbol poate să apară de mai multe ori.

Notăm cu  sau , cuvântul vid, format din zero simboluri.


Dacă V este un alfabet atunci prin V* vom nota mulţimea tuturor cuvintelor peste V, inclusiv
cuvântul vid , iar V+= V* -   .

Exemplul 2 Dacă V =  0, 1  atunci


V*=, 0, 1, 00, 01, 10, 11, ...
şi
V+=0, 1, 00, 01, 10, 11, 000 , ....
Evident V* şi V+ sunt mulţimi infinite deoarece ele conţin cuvinte de
lungime oricât de mare.

Definiţia 1.1.4 Un limbaj este o mulţime de cuvinte peste un alfabet.

Exemplul 3 Într-un limbaj natural alfabetul, în sensul definiţiilor de mai sus, este
dicţionarul limbii respective, cuvintele sunt frazele, iar limbajul este mulţimea
tuturor frazelor. Într-un limbaj de programare simbolurile sunt instrucţiunile
limbajului, cuvintele sunt programele iar limbajul este mulţimea tuturor

- 11 -
programelor.

În mulţimea cuvintelor se introduce o operaţie numită concatenare:

Definiţia 1.1.5 Dacă u şi v sunt două cuvinte din V* atunci concatenarea uv este tot un cuvânt din V*,
care se obţine prin alăturarea simbolurilor lui v după ultimul simbol al lui u.

Observaţia 1.1.1 Evident operaţia de concatenare este asociativă, u(vw)=(uv)w, dar nu este comutativă
(în general uvvu) iar cuvântul vid  este element neutru relativ la operaţia de concatenare: u=u=u.

Definiţia 1.1.6 Puterea a i-a a cuvântului u, notată ui, este definită recursiv astfel:
(1) u0 = 
(2) ui+1 = uiu

Definiţia 1.1.7 Lungimea unui cuvânt u, notată lg(u) sau |u|, este numărul de simboluri ale cuvântului u
şi este o aplicaţie lg: V*  N .
Prin definiţie lg() = 0,  fiind cuvântul format din zero simboluri.

Definiţia 1.1.8 Un cuvânt u este subcuvânt al lui v dacă şi numai dacă există cuvintele  şi  astfel
încât v = u. Dacă  =  atunci u se numeşte prefix al lui v iar dacă  =  atunci u se numeşte sufix al
lui v. Un subcuvânt u al lui v se numeşte subcuvânt propriu al lui v numai dacă u{,v}.

Majoritatea limbajelor care ne interesează vor conţine o mulţime infinită de cuvinte. Se pun
atunci trei chestiuni importante:

1. Cum se poate reprezenta un limbaj?


Dacă limbajul este finit atunci el s-ar putea reprezenta prin enumerarea cuvintelor sale, deşi la
un număr mare de cuvinte enumerarea poate fi complicată. Dacă însă limbajul este infinit apare
problema găsirii unei reprezentări finite pentru limbaj.
Apare atunci o altă problemă:

2. Există o reprezentare finită pentru orice limbaj?


Evident mulţimea V* a tuturor cuvintelor peste un alfabet finit V este o mulţime numărabilă. Un
limbaj este o submulţime a lui V*, deci mulţimea tuturor limbajelor peste V este mulţimea părţilor lui
V*, adică o mulţime nenumărabilă.
Deşi nu am definit încă o reprezentare finită a unui limbaj, se pare că mulţimea reprezentărilor
finite este numărabilă [4] deci ar rezulta că există mai multe limbaje decât reprezentări finite ale
limbajelor.

3. Ce se poate spune despre structura acelor clase de limbaje care admit reprezentări finite?
Aceasta este una din principalele problemele de care ne vom ocupa în continuare.

Să considerăm acum câteva limbaje peste alfabetul {a, b}.

- 12 -
L1={  }
L2={ a, ba, aaba, bbbb }
L3={ ap | p număr prim }
L4={ ai bi | i număr natural }
L5={ u a , b | Na(u)=Nb(u) }
*

unde Na (u) este numărul de apariţii ale simbolului a în cuvântul u. Considerăm şi limbajul vid , care
nu conţine nici un cuvânt Se observă că   {} pentru că limbajul { } conţine un cuvânt şi anume .
Limbajele L1 şi L2 fiind finite se pot reprezenta prin enumerarea cuvintelor lor pe când limbajele
L3, L4 şi L5 sunt infinite şi au fost caracterizate de o proprietate pe care trebuie să o satisfacă toate
cuvintele limbajului. O astfel de proprietate specifică este un mijloc de bază de definire a unui limbaj
infinit.
Un alt mod de a defini un limbaj infinit este de a introduce un mecanism generativ şi de a
considera cuvintele produse de acest mecanism.
Se poate, de asemenea, construi un mecanism analitic, de recunoaştere. Astfel un limbaj se
poate defini ca mulţimea tuturor cuvintelor recunoscute de un astfel de mecanism.
Mecanismele generative şi analitice se pot defini în termenii unui sistem de rescriere.
Să considerăm câteva moduri de definire ale unor limbaje în exemplele următoare.

Exemplul 4 Fie L un limbaj peste alfabetul {a, b} definit după cum urmează:
(i) λ L
(ii) Dacă x L atunci axb  L
(iii) Nici un alt cuvânt nu aparţine lui L.
Vom demonstra prin dublă incluziune că limbajul L construit conform
acestor reguli este chiar limbajul L4 = { ai bi | i număr natural }.

a) Demonstrăm prin inducţie relativ la k faptul că a k b k  L, k  N , adică că
L4L:
Din (i)  =a0b0L .
Dacă akbkL prin (ii)  aakbkbL adică ak+1bk+1L, deci prin inducţie
rezultă că L4L.

b) Demonstrăm, prin inducţie relativ la lungimea cuvintelor din L, faptul că


LL4:
a0b0 , adică , este singurul cuvânt de lungime 0 din L.
Presupunem că akbk este singurul cuvânt de lungime 2k din L ; atunci din
(ii) rezultă că ak+1bk+1 este singurul cuvânt de lungime 2k+2 din L.
Pentru că L nu conţine nici un cuvânt de lungime impară (este uşor de
demonstrate această afirmaţie tot prin inducţie) rezultă că LL4.
Din a) şi b) rezultă că cele două limbaje sunt egale adică L4 =L .

Se observă că (i)-(iii) constituie un mecanism generativ pe când L4 este definit de o proprietate
specifică.

- 13 -
Exemplul 5 Fie L’ definit după cum urmează :
(i) L’
(ii) Dacă xL’, atunci axbL’ şi bxaL’
(iii) Dacă x1L, x2L’ atunci x1x2L’
(iv) Nici un alt cuvânt nu aparţine lui L’.
Vom demonstra că L’=L5.

Demonstrăm întâi că L’L5.
Pentru că  = a0b0are proprietatea de a avea acelaşi număr de a şi de b,
adică 0 de a şi 0 de b, iar (ii) şi (iii) păstrează proprietatea (acelaşi număr de
apariţii ale lui a şi b) rezultă că L’ conţine numai cuvinte cu acelaşi număr de
apariţii ale simbolului a şi b.
Se demonstrează prin inducţie că L’ conţine toate cuvintele de lungime
mai mică sau egală cu 2i cu această proprietate.

Exemplul 6 Fie L” un limbaj constând din toate cuvintele care se pot reduce la 
prin înlocuirea subcuvintelor ab prin .

Astfel cuvintele , ab, abab şi aabbab L”. Evident L”L5 dar L”L5
pentru că, de exemplu, baL”. Definiţia aceasta poate fi considerată ca un
mecanism de recunoaştere sau analitic.
În exemplele date anumite subcuvinte sunt rescrise. În conformitate cu
definiţia următoare, o mulţime finită de reguli de rescriere determină un sistem de
rescriere.

Definiţia 1.1.9 Un sistem de rescriere este o pereche ordonată SR=(V, F), unde V este un alfabet şi F o
mulţime finită de perechi ordonate de cuvinte peste V. Elementele (α,β) ale lui F sunt numite reguli de
rescriere sau producţii şi se notează αβ.
Un cuvânt α peste V generează direct un cuvânt β (α  β) dacă şi numai dacă există cuvintele u,
SR

v, α1 , β1 astfel încât:
α=uα1v
β=uβ1v
iar
α1β1 F,
adică subcuvântul α1 al lui α este înlocuit prin subcuvântul β1.
*
Un cuvânt α peste V generează β (în mai mulţi paşi) (α  β) dacă şi numai dacă există un şir
finit de cuvinte α0, α1 , ..., αk, k  0, unde α0=α, αk=β şi αi  αi+1, pentru 0  i  k-1. Secvenţa α0
α1... αk se va numi derivaţie a lui β din α în conformitate cu sistemul de rescriere, SR.
α= α0 α1 α2.... αk=β
*
Astfel relaţia  este o relaţie binară pe V* iar  este închiderea reflexivă şi tranzitivă a relaţiei
. Numărul k se numeşte lungimea derivaţiei sau număr de paşi.

- 14 -
Observaţia 1.1.2 Dacă  este o relaţie binară pe o mulţime W , atunci închiderea reflexivă şi tranzitivă
* a relaţiei  se defineşte :
(i) P*P pentru orice PW
(ii) Dacă P1*P2 şi P2P3  P1*P3
(iii) P*Q numai dacă se poate stabili prin (i) şi (ii).

Un sistem de rescriere poate fi transformat într-un mecanism generativ prin specificarea unei
submulţimi Ax  V*, numită mulţimea de axiome, şi considerând limbajul
*
(1) Lg(SR, Ax)={ β | α  β, αAx }
Similar un sistem de rescriere poate fi privit ca un mijloc analitic sau de recunoaştere,
considerând limbajul
*
(2) La(SR, Ax)={ α | α  β, βAx }
Formula (1) reprezintă limbajul generat de perechea (SR, Ax), iar formula (2) reprezintă limbajul
recunoscut sau acceptat de perechea (SR, Ax).

Observaţia 1.1.3 De cele mai multe ori mulţimea Ax este formată dintr-un singur simbol (simbolul
iniţial) sau are o structură foarte simplă.

Observaţia 1.1.4 De cele mai multe ori V se împarte în două submulţimi :


VT, mulţimea terminalelor
VN, mulţimea neterminalelor sau a variabilelor
şi limbajul se defineşte ca o submulţime a lui VT *.
Revenind la exemplele anterioare, în exemplul 1.1.6, L” se poate defini, în termenii unui sistem de
rescriere ca:
L” = La(SR,{}),
unde V={a,b} iar F={ab}.
În exemplul 1.1.4,
L=Lg(SR,{x}){a,b}*,
unde
SR=({a,b,x}, {x, xaxb}).
Limbajul L’ din exemplul 1.1.5 este definit acum :
L’ = Lg(SR,{x}){a,b}*,
unde
SR=({a,b,x}, {x, xaxb, xbxa, xxx}).
Sistemele de rescriere sunt de asemenea denumite sisteme semi - Thue.

Să ne reamintim...
Definiţiile pentru: alphabet, simbol, cuvânt, subcuvânt, prefix, sufix,
cuvânt vid, limbaj, regulă de rescriere, sistem de rescriere, derivaţie,
axiomă.
.

- 15 -
Test de evaluare a cunoştinţelor
I. Întrebări.
Definiţi noţiunile de:
 vocabular,
 cuvânt,
 subcuvânt,
 prefix,
 suffix,
 limbaj,
 sistem de rescriere.
II. Exerciţii propuse.
1. Furnizaţi câteva exemple de limbaje peste alfabetul {0, 1}.
2. Care este lungimea cuvântului “limbaj”? Este “aba” subcuvânt al lui? Care
este rezultatul pentru (limbaj) 3 ?
3. Fie limbajul
L = {a2nbn | 0<n<5}
Să se descrie mulţimea de cuvinte din L.

M1.U1.4 Rezumat
Unitatea de învăţare prezintă câteva elemente introductive în teoria limbajelor
formale cum sunt: alphabet, simbol, cuvânt, subcuvânt, prefix, suffix, cuvânt vid.
Noţiunea de limbaj formal se defineşte apoi prin proprietăţi specifice cuvintelor
limbajului, printr-un sistem de generare a cuvintelor sau printr-un sistem de
rescriere. Important pentru fiecare din reprezentări ale unui limbaj este să
demonstrăm corectitudinea construcţiei, pentru care s-au prezentat, în unitatea de
învăţare, mai multe demonstraţii.

- 16 -
Unitatea de învăţare M1.U2. Algoritmi normali în sens Markov

Cuprins
M1.U2.1. Introducere ..................................................................................................17
M1.U2.2. Obiectivele unităţii de învăţare ...................................................................17
M1.U2.3. Algoritmi normali în sens Markov .............................................................17
M1.U2.4. Exemple de algoritmi normali.....................................................................18
M1.U2.5. Rezumat.......................................................................................................24

M1.U2.1. Introducere
Unul din cele mai cunoscute sisteme de rescriere este algoritmul normal în sens
Markov[16]. Caracteristic pentru algoritmul normal Markov este faptul că
mulţimea de reguli este ordonată şi că regulile se aplica unui cuvânt iniţial într-o
anumită ordine.
.

M1.U2.2. Obiectivele unităţii de învăţare


Această unitate de învăţare îşi propune ca obiectiv principal familiarizarea
studenţilor cu un prim mecanism formal, algoritmul normal în sens Markov.
La sfârşitul acestei unităţi de învăţare studenţii vor fi capabili să:
 înţeleagă şi să explice algoritmii normali;
 construiască proprii algoritmi normali;
 programeze un algoritm normal.

Durata medie de parcurgere a unităţii de învăţare este de 3-4 ore.

M1.U2.3 Algoritmi normali în sens Markov

Definiţia 1.1.10 Un algoritm normal în sens Markov este un sistem de rescriere SR = (V, F) unde
elementele lui F sunt date într-o anumită ordine α1β1, α2β2 , . . . , αkβk şi există o submulţime,
posibil vidă, F1F conţinând reguli sau producţii finale α.β ; la fiecare pas al unui proces de
rescriere, se aplică prima din regulile lui F care este aplicabilă, şi în plus se rescrie cea mai din stânga
apariţie a subcuvântului care este membrul stâng al regulei folosite.
Astfel, algoritmii normali în sens Markov posedă o proprietate specială şi anume : pentru orice
cuvânt P există cel mult un cuvânt care poate fi generat din P într-un singur pas.

- 17 -
Din punct de vedere formal, α├─ β dacă şi numai dacă fiecare din următoarele condiţii este
satisfăcută.
(i) Există un număr i, 1 i k şi cuvintele α' şi α" astfel încât α=α'αiα", β= α'βiα".
(ii) Nici un cuvânt αj, j < i, nu este subcuvânt al lui α
(iii) αi apare o singură dată ca subcuvânt al lui α'αi.
Algoritmul normal reia aplicarea regulilor în ordine atâta timp cât este îndeplinita condiţia:
(iv) αiβi nu este un element al lui F1 şi unul din cuvintele α1, ..., αk este subcuvânt al lui β.
Dacă (iv) nu este îndeplinită, dar sunt îndeplinite (i)-(iii), atunci α├─*.β şi procesul de rescriere
se încheie.
Deci α├─*. β dacă şi numai dacă există α0, α1 , ..., αn astfel încât

α=α0├─ α1├─ α2├─ ... ├─ αn+1├─ .αn=β .

O consecinţă imediată este lipsa ambiguităţii. Rezultă că există cel mult un singur cuvânt β
astfel încât α├─* .β .
Dacă există un astfel de cuvânt β se spune că algoritmul normal se termină cu α sau că traduce α
în β. În caz contrar algoritmul ciclează cu α.

M1.U2.4 Exemple de algoritmi normali în sens Markov

Exemplul 7 Fie algoritmul normal peste { a, b } cu regulile de rescriere


1. a
2. b
3. .aba
El traduce orice cuvânt din {a,b}* în aba
Exemplificare:

aababba├1─ ababba ├1─babba ├1─bbba├1─bbb├2─ bb├2─ b ├2─λ ├3─. aba

- 18 -
Exemplul 8 Fie algoritmul cu alfabetul { a, x, y, # } şi regulile:
1. yaay
2. xaayx
3. x
4. a##x
5. #a#
6. #
7. ya
El traduce orice cuvânt de forma ai # aj cu i, j  0 în aij, deci realizează înmulţirea a
două numere.
Fie i = 2 şi j = 3. Atunci:
aa#aaa├4─ a#xaaa├2─ a#ayxaa├2─ a#ayayxa├1─ a#aayyxa├2─ a#aayyayx
( 3)
├1─ a#aayayyx├1─ a#aaayyyx  a#aaayyy├4─ #xaaayyy├2─ #ayxaayyy
├2─ #ayayxayyy├1─ #aayyxayyy├2─ #aayyayxyyy├1─ #aayayyxyyy
├1─ #aaayyyxyyy├3─ #aaayyyyyy├5─ #aayyyyyy├5─ #ayyyyyy
├5─ # yyyyyy├6─ yyyyyy├7─* aaaaaa.

Exemplul 9 Trecerea de la un număr natural la succesorul său este dată de


algoritmul peste alfabetul  = {a} cu mulţimea regulilor formată numai dintr-o
singură regulă:
1. a · aa.
Algoritmul transformă un cuvânt de forma ai în ai+1.
Exemplificare:
aaa ├─.aaaa

Exemplul 10 Algoritmul care calculează suma a două sau mai multe numere
este (, P) unde  = {a, #} şi mulţimea regulilor P :
1. #  
Acest algoritm transformă ai#aj în ai+j, ai#aj#ak în ai+j+k, etc.
Exemplificare:
a3 # a2 # a4 ├─ a5 # a4 ├─ a9

- 19 -
Exemplul 11 Modulul diferenţei a două numere: ai#aj ├─ a|i-j|
AN = (, P) unde  = {a, #} şi P conţine regulile:
1. a#a  #
2. #  
Să calculăm modulul diferenţei dintre 4 şi 2.
AN : a4 # a2├1─ a3 # a ├1─ a2 # ├2─ a2

Exemplul 12 Restul împărţirii unui număr natural la 5 transformă:


i / 5 
ai  ai5 iar AN = (, P) unde  = {a} şi P :
1. aaaaa  
Exemplificare:
AN : a13├─ a8├─ a3

Exemplul 13 Câtul împărţirii unui număr natural la 5 transformă: #


ai  ai / 5 iar algoritmul este definit de :

# aaaaa  a #
AN = (, P) unde  = {a, #} şi P :  # a #

 #

Exemplificare pentru câtul împărţirii numărului natural 13 la 5:
AN : # a13 ├─ a # a8 ├─ a2 # a3 ├─ a2 # a2 ├─ a2 # a ├─a2 # ├─. a2

Exemplul 14 Câtul şi restul împărţirii unui număr natural la 5: #


ai  ai / 5 # ai5i / 5

AN = (, P) unde  = {a, #} şi P : # aaaaa  a #



#  #
Calculăm câtul şi restul împărţirii numărului natural 13 la 5:
AN : # a13 ├─ a # a8 ├─ a2 # a3 ├─. a2 # a3

- 20 -
Exemplul 15 Cel mai mare divizor comun a două numere naturale:
ai#ajacmmdc(i,j)
1. axxa
2. a#ax#
3. a##y
4. ya
5. xz
6. za
7. #
El traduce ai # aj în ak, unde k este cel mai mare divizor comun al lui i şi j. Să
calculăm cel mai mare divizor comun al lui 6 şi 4.
a 6 # a 4 -a 5 x # a 3 -a 4 xa # a 3 -a 3 xa 2 # a 3 -a 2 xa 3 # a 3 -axa 4 # a 3 -
- xa 5 # a 3 - xa 4 x # a 2 - xa 3 xa # a 2 - xa 2 xa 2 # a 2 - xaxa 3 # a 2 -
- x 2 a 4 # a 2 - x 2 a 3 x # a - x 2 a 2 xa # a - x 2 axa 2 # a - x 3 a 3 # a - x 3 a 2 x # -
- x 3 axa # - x 4 a 2 # - x 4 a # y - x 4 # y 2 - x 4 # ay - x 4 # a 2 - zx 3 # a 2 -
- z 2 x 2 # a 2 - z 3 x # a 2 - z 4 # a 2 -az 3 # a 2 -a 2 z 2 # a 2 -a 3 z # a 2 -a 4 #a 2 -
-a 3 x # a -a 2 xa # a -axa 2 # a - xa 3 # a - xa 2 x # - xaxa # - x 2 a 2 # - x 2 a # y -
-x 2 # y 2 -x 2 # ay -x 2 # a 2 -zx # a 2 -z 2 # a 2 -az # a 2 -a 2 # a 2 -ax # a -
-xa # a -x 2 # -zx # -z 2 # -az # -a 2 # -a # y -# y 2 -# ay -# a 2 -a 2
Similar dacă calculăm cel mai mare divizor comun al lui 4şi 6 avem:
a 4 # a 6 -a 3 x # a 5 -a 2 xa # a 5 -axa 2 # a 5 - xa 3 # a 5 - xa 2 x # a 4 - xaxa # a 4 -
- x 2 a 2 # a 4 - x 2 ax # a 3 - x 3 a # a 3 - x 4 # a 2 -zx 3 # a 2 -z 2 x 2 # a 2 -z 3 x # a 2 -
-z 4 # a 2 -az 3 # a 2 -a 2 z 2 # a 2 -a 3 z # a 2 -a 4 # a 2 -a 3 x # a -a 2 xa # a -

-axa 2 # a - xa 3 # a - xa 2 x # - xaxa # - x 2 a 2 # - x 2 a # y - x 2 # y 2 - x 2 # ay -
- x 2 # a 2 -zx # a 2 -z 2 # a 2 -az # a 2 -a 2 # a 2 -ax # a - xa # a - x 2 # -zx # -
-z 2 # -az # -a 2 # -a # y - # y 2 - # ay - # a 2 -a 2

- 21 -
Exemplul 16 Împărţirea a două numere naturale:
a i # a j  a i / j # a i ji / j
AN = (, P) unde  = {a, #, x, y, c, r, s, t} şi P:
ac  ca

 xaa  axa
c # a  c # t

tx  rt
ta  t

t  
a # x  acy #


P : a #  # x

c # x  c # s
2

sx  s

sa  s
s  

x  
y  


a  r
Exemplificări
a3 # a5 -a2 # xa5 -a2 # axa 4 -a2 # a2 xa3 -a2 # a3 xa2 -a2 # a 4 xa -
-a # xa 4 xa -a # axa 3 xa -a # a2 xa2 xa -a # a3 xaxa -# xa3 xaxa -
- # axa 2 xaxa - # a2 xaxaxa - # a3 xaxa - # a 4 xa - # a5 - # ra 4 - # r 2a3 -
-#r 3a2 - # r 4a - # r 5

a11 # a 4 -a10 # xa 4 -a10 # a 3 xa -a 9 # xa 3 xa -a 9 # a 2 xaxa -


-a 8 # xa 2 xaxa - a 8 #axaxaxa -a 7 # xaxaxaxa -a 7 cy # axaxaxa -

ca 7 y # axaxaxa -ca 7 y # a 4 -ca 7 # a 4 -ca 6 # xa 4 -ca 6 # a 3 xa -ca 5 # xa 3 xa -


-ca 5 # a 2 xaxa -ca 4 # xa 2 xaxa -ca 4 # axaxaxa -ca 3 # xaxaxaxa -
-ca3cy# axaxaxa -c 2a3 y # axaxaxa -c 2a3 y # a4 -c 2a3 # a4 -c 2a2 # xa4 -
-c 2 a 2 # a 3 xa -c 2 a # xa 3 xa -c 2 a # a 2 xaxa -c 2 # xa 2 xaxa -c 2 # axaxaxa -
-c 2 # txaxaxa -c 2 # rtaxaxa -c 2 # rtxaxa -c 2 # r 2 taxa -c 2 # r 2 txa -c 2 # r 3 ta -
-c 2 # r t -c 2 # r 3
3

- 22 -
a 12 # a 4 a 11 # xa 4 a 11 # a 3 xa a 10 # xa 3 xa a 10 # a 2 xaxa 
a 9 # xa 2 xaxa a 9 # axaxaxa a 8 # xaxaxaxa a 8 cy # axaxaxa 
ca 8 y # axaxaxa ca 8 y # a 4 ca 8 # a 4 ca 7 # xa 4 ca 7 # a 3 xa 
ca 6 # xa 3 xa ca 6 # a 2 xaxa ca 5 # xa 2 xaxa ca 5 # axaxaxa 
ca 4 # xaxaxaxa ca 4 cy # axaxaxa c 2 a 4 y # axaxaxa c 2 a 4 y # a 4 
c 2 a 4 # a 4 c 2 a 3 # xa 4 c 2 a 3 # a 3 xa c 2 a 2 # xa 3 xa c 2 a 2 # a 2 xaxa 
c 2 a # xa 2 xaxa c 2 a # axaxaxa c 2 # xaxaxaxa c 3 # saxaxaxa 
c 3 # s c 3 #

Definiţia 1.1.11 Un sistem normal Post este un sistem de rescriere (V, F) unde toate elementele (α, β)
ale lui F sunt notate prin αxxβ, x fiind o variabilă operaţională. (Se presupune că x  V şi nici α nici β
nu au x ca subcuvânt). Relaţia se defineşte astfel: α1β1 dacă şi numai dacă există cuvintele α, u, β
peste V\{x} astfel încât: α1=αu, β1=uβ, şi αxxβF.

Se poate şi aici specifica o mulţime de axiome şi se poate defini limbajul generat şi cel
recunoscut la fel ca mai sus.

1 Să se construiască un algoritm normal în sens Markov care să realizeze înlocuirea


literelor a şi b dintr-un cuvânt de intrare, prin cuvintele alpha, respectiv beta adică
algoritmul codificării.

2 Să se construiască un algoritm normal în sens Markov care să calculeze puteri-



le lui 2, adică care să transforme cuvântul an# în a2 . Să se exemplifice algoritmul
pentru următoarele valori ale lui n:
a. n = 2;
b. n = 3;
c. n = 4.

Să ne reamintim...

Algoritmul normal în sens Markov se caracterizează prin faptul că mulţimea


de reguli este ordonată şi că regulile se aplica unui cuvânt iniţial într-o
anumită ordine până când nici o regulă nu mai poate fi aplicată sau până cind
s-a aplicat o regulă finală.

- 23 -
Test de evaluare a cunoştinţelor
I. Întrebări.
2. Cum se defineşte un algoritm normal Markov?.
3. Când se opreşte un algoritm nornal în sens Markov?

II. Exerciţii propuse.


1. Să se construiască un algoritm normal în sens Markov care să calculeze
lungimea unui cuvânt adică care să transforme un cuvânt w în 0|w|., unde
w din {a,b,c}*).

M2.U2.5 Rezumat
Unitatea de învăţare prezintă unul din primele sisteme de rescriere,
algoritmul normal în sens Markov, în care regulile de rescriere sunt ordonate
şi se aplică la rândul lor într-o anumită ordine. Prezentarea este însoţită de
foarte multe exemple pentru înţelegerea complexităţii unei astfel de
construcţii, cât şi pentru utilizarea acestor exemple în constrcţii ulterioare.

- 24 -
Unitatea de învăţare M1.U3. Gramatici generative şi analitice
Cuprins
M1.U3.1. Introducere ................................................................................................ 25
M1.U3.2. Obiectivele unităţii de învăţare ................................................................. 25
M1.U3.3. Gramatici generative şi analitice .............................................................. 25
M1.U3.4. Ierarhia lui Chomsky ................................................................................ 29
M1.U3.5. Operaţii cu limbaje ................................................................................... 34
M1.U3.6. Rezumat.....................................................................................................37

M1.U3.1. Introducere
Noţiunea de gramatică formală a fost introdusă de lingvistul Noam Chomsky, si
reprezintă mecanismul generativ cel mai folosit pe parcursul acestui material.
Astfel se prezintă atât gramatici generative cât şi analitice şi se demonstrează că
ele sunt într-o relaţie de dualitate, fapt care permite tratarea numai a uneia dintre
ele.

Un alt aspect important care va fi tratat este definirea unor operaţii cu limbaje ca
operaţii clasice cu mulţimi şi chiar a unor operatii specifice limbajelor.
.

M1.U3.2. Obiectivele unităţii de învăţare


Această unitate de învăţare îşi propune ca obiectiv principal familiarizarea
studenţilor cu un al doilea mecanism formal, gramatica generativa în sens Chomsy.
La sfârşitul acestei unităţi de învăţare studenţii vor fi capabili să:
 înţeleagă şi să explice gramaticile generative;
 construiască propriile gramatici care să genereze un anumit limbaj;
 programeze un generarea cuvintelor într-o gramatică.

Durata medie de parcurgere a unităţii de învăţare este de 3 ore.

M1.U3.3 Gramatici generative şi analitice


Vom defini un tip de mecanism care joacă un rol important în teoria limbajelor formale.

Definiţia 1.2.1 O gramatică generativă este un quadruplu ordonat


G=(VN, VT,S,P) ,
unde VN şi VT sunt alfabete finite disjuncte SVN şi P este o mulţime finită de perechi ordonate (u,v),
astfel încât v este un cuvânt din V*, unde V=VNVT şi u este un cuvânt din V* care conţine cel puţin o
literă din VN.

- 25 -
Elementele lui VN formează mulţimea neterminalelor sau variabilelor, iar cele ale lui VT
formează mulţimea terminalelor; S se numeşte simbolul iniţial, iar P sunt reguli de rescriere, producţii.
De fapt o gramatică este un sistem de rescriere (V, P) numit sistem de rescriere indus de G.
Noţiunile de derivare directă sau derivare corespund celor introduse în cadrul unui sistem de
rescriere.
Limbajul L(G) generat de G este definit de:
*
L(G)={ w| wV *, S  w }
Vom introduce o noţiune duală celei de gramatică generativă şi anume cea de gramatică
analitică.

Definiţia 1.2.2 O gramatică analitică este un quadruplu ordonat


G=(VN, VT, S, P), unde VN, VT, S sunt exact ca în definiţia 1.3.1, dar P este o mulţime finită de reguli (u,
v) astfel încât u este un cuvânt din V* iar vV* conţine cel puţin o literă din VN.
Limbajul L(G) recunoscut de gramatica G, sau acceptat este definit de :
*
L(G)={ w| wVT*, w  S },
deci limbajul cuvintelor formate numai din terminale care se reduc la simbolul iniţial prin aplicarea
regulilor din P.

Definiţia 1.2.3 Două gramatici, G şi G1, se numesc gramatici echivalente atunci şi numai atunci când
L(G)=L(G1).

Exemplul 1 Limbajul L = { aibi | iN } este generat de gramatica generativă


G = ({S}, {a,b}, S, {S, SaSb})
şi recunoscut de gramatica analitică
G1 = ({S}, {a,b}, S, {S, aSbS})
Deci L(G) = L(G1).

Exemplul 2 Limbajul L = { w | w{a,b}*, Na(w)=Nb(w) } este generat de


gramatica generativă
G = ({S}, {a,b}, S, {S, Sasb, SbSa, SSS})
şi recunoscut de gramatica analitică
G1 = ({S}, {a,b}, S, {S, aSbS, bSaS, SSS})
Vom arăta în cele ce urmează că orice gramatică analitică admite o
gramatică generativă, duală a ei, echivalentă.

Teorema 1.2.1
Fie G = (VN, VT, S, P) o gramatică generativă (sau analitică). Fie P1 o mulţime de reguli
de forma u v dacă v u este în P. Atunci L(G1)=L(G) unde G1=(VN, VT, S, P1) este o
gramatică analitică (generativă).

▼ Demonstraţie:
Dacă G este o gramatică generativă vom demonstra că pentru orice cuvânt  din (VNVt)* avem
* *
(1.2.1) S    S
G G1

- 26 -
Vom arăta întâi prin inducţie că dacă pentru un anume k
u0  u1  ...  uk
este o derivaţie în G, atunci
uk  uk-1  ..  u0
este o derivaţie în G1.
Evident, pentru k=1 afirmaţia este valabilă conform definiţiei regulilor lui P1. Procedând
inductiv, presupunem că afirmaţia este adevărată pentru k paşi şi fie o derivaţie în k+1 paşi de forma:
u0  u1  ... uk uk+1 în G.
Conform ipotezei inducţiei
uk  uk+1  uk+1  uk
G G1
* *
şi u0  uk  uk  u0
G G1

Atunci din cele două rezultă că


* *
u0  uk+1  uk+1  u0
G G1

Dacă acum u0=S vom obţine afirmaţia (1.2.1) dorită, deci L(G)=L(G1).

Observaţia 1.2.1 Pentru o gramatică generativă sau analitică G, gramatica G1 definită mai sus se va
numi duala sa.

Vom da în continuare câteva exemple de gramatici conform cu [21].

Exemplul 3 Fie G = ({S, B, C}, {a, b, c}, S, P}), unde mulţimea P este formată
din:
SaSBC
SaBC
CBBC
bBbb
bCbc
cCCc
aBab
Să încercăm o derivaţie în gramatica G:

S  aSBC  aaSBCBC  aaaSBCBCBC  aaaaBCBCBCBC 


 aaaaBBCCBCBC * aaaaBBBBCCCC  aaaabBBBCCCC 
 aaaabbBBCCC  aaaabbbBCCCC  aaaabbbbCCCC 
 aaaabbbbcCCC  aaaabbbbccCC  aaaabbbbcccC  aaaabbbbcccc

Se poate demonstra că L(G)={anbncn | n1}

- 27 -
Exemplul 4[21] Fie limbajul L={ ww | w{0,1}* }. Gramatica G definită de:
G=({x0, x1, x2, x3, y0, y1}, {0,1}, x0, P}), unde P este:

P: x0x1x2x3 x1x2ix1yi
x1x2 yijjyi
pentru fiecare i şi j din {0,1}
x3 yix3x2ix3
ix2x2i
Această gramatică generează limbajul L. Să încercăm o derivaţie în această
gramatică:
x0  x1x2x3 0x1y0x3 0x1x20x3  01x1y10x3  01x10y1x3  01x10x21x3 
 01x1x201x3  0101x3  0101

Exemplul 5 [21] Pentru limbajul L={an² | n1} vom avea următoarele reguli
gramaticale care se bazează pe identitatea n2=1+3+...+(2n-1), unde toate
simbolurile cu excepţia lui a sunt simboluri neterminale:
P : x0a
x0axx2z
x2zaa
xaaa
yaaa
x2zy1yxz
xx1x1yx
yx1y1yx
xy1x1y
yy1y1y
ax1axxyx2
x2yxy2
y2yyy2
y2xyx2
Să încercăm şi aici câteva derivaţii:
x0  axx2z  axaa  aaaa
x0  axx2z  axy1yxz  ax1yyxz axxyx2yyxz axxyxy2yxz
 axxyxyy2xz  axxyxyyx2z axxyxyyaa  axxyxyaaa
 axxyxaaaa  axxyaaaaa  axxaaaaaa  axaaaaaaa
 aaaaaaaaa = a9 = a3².


Exemplul 6 [21] ] Pentru generarea limbajului L = { a2 | n0 }vom avea
următoarele reguli gramaticale
x0yxy
yxyz
zxxxz
- 28 -
zyxxy
xa
y
Vom construi o derivaţie în aceasta gramatică pentru n = 2, pornind de la
simbolul iniţial x0
x0  yxy  yzy  yxxy  yzxy yxxzy  yxxxxy  xxxy  axxxy 
 aaxxy aaaxy aaaay  aaaa

Exemplul 7[21 Fie G=({S,B}, {0,1}, S, P) unde


S  0B

P: B  1S
B  1

Limbajul generat de G este L(G) = {(01)n | n>0}. Exemplificăm derivaţia unui
cuvânt din limbaj pentru n = 3.
S  0B  01S  010B  0101S  01010B  010101 = (01)3

Exemplul 8 [21] Fie gramatica G=({S,A,B},{a,b},S,P), unde mulţimea regulilor P


este P={S  aSb,S  ab}. Este uşor de demonstrat că limbajul generat de
gramatica G este
L(G) = {anbn | n>0}.
Pentru n = 4 obţinem următoarea derivaţie:
S aSb  aaSbb aaaSbbb  aaaabbbb = a4b4

M1.U3.4 Ierarhia lui Chomsky

Gramaticile generative pot fi clasificate prin impunerea de restricţii asupra formei regulilor.

Definiţia 1.2.4 (Ierarhia lui Chomsky) Pentru i{0,1,2,3}, o gramatică generativă, G=(VN, VT, S, P)
este de tip i dacă şi numai dacă regulile de rescriere din P îndeplinesc restricţiile de tip (i):
(0) Nici o restrictie.
(1) Reguli dependente de context (DC): Fiecare regulă din P este de forma u1Au2u1wu2 , unde u1,
u2V*, AVN şi w  {VN VT }+ cu o singură excepţie posibilă S, care poate să apară dacă S
nu apare în dreapta nici unei reguli din P.
(2) Reguli independente de context (IDC): Fiecare regulă din P este de forma
A  w cu A  VN şi w  {VN VT } *.
(3) Reguli regulate (R): Fiecare regulă este de una din următoarele două forme A aB sau
A  a , unde A, BVN şi aVT.

- 29 -
Gramaticile de tip 1 se numesc dependente de context sau contextuale, gramaticile de tip 2 se
numesc independente de context, iar gramaticile de tip 3 se mai numesc şi regulate sau cu număr finit
de stări.
Evident că orice gramatică de tip 3 este şi de tip 2, orice gramatică de tip 2 este şi de tip 1, şi orice
gramatică de tip 1 este de tip 0.
Dacă notăm cu Li familia limbajelor de tip (i) avem, evident, următoarea incluziune între
familiile de limbaje:
L3  L2  L1  L0
Se va demonstra ulterior că incluziunea este proprie, deci că prin restricţiile (0)-(3) se obţine într-
adevăr o ierarhizare a familiilor de limbaje.

Definiţia 1.5 O gramatică este cu lungime crescătoare sau monotonă dacă şi numai dacă regula uv
satisface condiţia |u| |v| cu o singură excepţie posibilă S, care, dacă apare în mulţimea regulilor,
atunci S nu apare în partea dreaptă a nici unei reguli.

Observaţia 1.2.2 Gramaticile dependente de context sunt gramatici cu lungime crescătoare. Se poate
demonstra că gramaticile cu lungime crescătoare şi gramaticile dependente de context sunt echivalente.

Teorema 1.2.2
Pentru fiecare gramatică monotonă, G, există o gramatică dependentă de context, G’,
echivalentă cu G, adică L(G) = L(G’).

▼Demonstraţie.
Fie gramatica monotonă G=(VN, VT, S, P), în care regulile din P sunt monotone, adică de forma
uv unde |u| |v|. Presupunem că regula uv nu este dependentă de context şi că este de forma:

A1 A2 … Am → B1 B2 … Bn

Pentru că gramatica este monotonă avem m  n iar Ai şi Bi pot fi simboluri terminale sau
variabile. Presupunem că toate simbolurile Ai sunt variabile (în caz contrar înlocuim fiecare simbol
terminal Ai printr-un nou symbol neterminal Ai’ şi adăugăm regula Ai’→ Ai).
Considerăm noi variabile C1,C2, …, Cm. şi înlocuim regula iniţială uv prin mulţimea de reguli
dependente de context P(u,v):

A1 A2 … Am → C1 A2 … Am
C1 A2 … Am → C1 C2 … Am
………………………………………………
C1 C2 … Cm-1Am → C1 C2 …Cm Bm+1 Bm+2 … Bn
C1 C2 … Cm-1Cm Bm+1 … Bn → C1 C2 … Cm-1Bm Bm+1 … Bn
C1 C2 … Cm-1Bm Bm+1 … Bn → C1 C2 … Cm-2Bm-1 Bm … Bn
……………………………………………………………..
C1 B2 … Bn → B1 B2 … Bn

Fie acum gramatica G” = (VN  {C1, C2, …, Cm}, VT, S, P\ {uv}  P(u,v) ).
Este uşor de demonstrat acum că L(G) = L(G”).

- 30 -
Procedând de aceeaşi maniera cu fiecare regula monotonă care nu este dependentă de context se obţine
în final gramatica echivalentă G’.

Exemplul 9 Să aplicăm algoritmul din teorema 1.2.2 pentru gramatica din


exemplul 1.2.3, G = ({S, B, C}, {a, b, c}, S, P}), cu P :
SaSBC
SaBC
CBBC
bBbb
bCbc
cCCc
aBab
Singura regulă monotonă care nu este dependentă de context este regula CBBC
Înlocuim această regulă cu următoarea mulţime de reguli dependente de context:

CB  C1B
C1B  C1C2
C1C2  C1C
C1C  BC
Obţinem în final gramatica dependentă de context echivalentă cu G, G’= ({S,B,C,
C1, C2}, {a,b,c}, S, P’), unde P’:
S  aSBC
S  aBC
bB  bb
bC  bc
cC  Cc
aB  ab
CB  C1 B
C1B  C1C2
C1C2  C1C
C1C  BC.

Observaţia 1.2.3 Gramaticile din exemplele 3, 4, şi 6 sunt gramatici monotone deci, conform teoremei
1.2.2, limbajele generate sunt dependente de context. Gramatica din exemplul 5 este o gramatică de tip
0 (există reguli care nu sunt monotone, ca de exemplu regula x1x2), gramatica din exemplul 8 este
independentă de context iar cea din exemplul 7 este regulată sau de tip 3.

Pentru gramaticile analitice definiţiile rămân aceleaşi ca şi pentru gramaticile generative, schimbând
însă membrul drept cu membrul stâng în regulile din P. Noţiunea de gramatică generativă cu lungime
crescătoare îşi are corespondentul dual în cea de gramatică analitică cu lungime descrescătoare.

- 31 -
Exemplul 10 Din punct de vedere lingvistic, gramaticile sunt folosite pentru
analiza frazelor. Să considerăm următoarea gramatică analitică IDC unde VN = {
F, A, V, Pn, S, Sn}, (variabile care reprezintă, respective: fraza, articol, verb,
predicat nominal, substantiv, subiect), VT = {o, fata, este, laboranta}, unde
fiecare din aceste cuvinte ale limbii române reprezintă un simbol al alfabetului
terminalelor. Regulile gramaticii sunt:

{oA, fatăS, laborantăS, esteV, ASSn, VSPn, SnPnF}


Frazele recunoscute sunt :
 o fata este laborantă
 o laborantă este fată
 o fată este fată
 o laborantă este laborantă
Fiecare din fraze este corectă gramatical dar unele s-ar putea să nu aibă nici un
înţeles.
În cele ce urmează vom considera numai gramatici generative, aspectul analitic fiind tratat în capitolele
II şi III prin intermediul automatelor.

Exemplul 11 Se numeşte palindrom un cuvânt, care este identic când este citit
de la stânga la dreapta sau de la dreapta la stânga. Astfel în limba româna există
palindroamele: capac, coc, cuc, lupul, ele, etc. Notăm cu ~y reflectatul sau
oglinditul unui cuvânt y, adică cuvântul ale cărui simboluri sunt în ordine inversă
faţă de y. Limbajul { y~y | y VT* } este în mulţimea palindroamelor cu VT={a1,
..., an} şi poate fi generat de gramatica:

G=({S}, VT, S, {S, Sa1Sa1, Sa2Sa2, ..., SanSan}).

În exemplul anterior există regula S iar S apare şi în dreapta altor reguli. Vom arăta că există
ca pentru orice astefel de gramatică existăo gramatică echivalentă în care S nu apare în dreapta nici unei
reguli.

Teorema 1.2.3
Dacă G = (VN, VT, S, P) este o gramatică DC, atunci există altă gramatică D.C., G1, care
generează acelaşi limbaj cu G, pentru care simbolul initial (de start) nu apare în dreapta nici
unei reguli ale lui G1. Dacă G este I.D.C. sau R atunci şi G1 este I,D,C,, respectiv R.
▼ Demonstraţie :
Fie S1VNVT. Construim gramatica G1={VN{S1}, VT, S1, P1 }, unde P1 conţine toate regulile
din P şi în plus toate regulile de forma S1 unde
S P :
P1=P{S1 │ S P }
Observăm că S1VNVT deci nu apare în dreapta nici unei producţii din G şi nici în dreapta
vreunei producţii noi adăugate în P.
Să demonstrăm acum că L(G)=L(G1).
*
a) Presupunem că wL(G), deci există o derivaţie în gramatica G de forma S  w. Atunci prima regulă
folosită este de forma S deci derivaţia va fi :

- 32 -
*
S w
G G

Prin definiţia lui P1 avem : S1 P1 şi deci:


S1  
G1

Pentru că toate regulile lui P sunt în P1 rezultă că orice derivaţie din G este şi o derivaţie în gramatica
G1 deci
*
 w
G1

Combinând cele două derivaţii se obţine:


*
S1    w ,
G1 G1

Deci w  L(G1), de unde rezultă că L(G)L(G1).


*
b) Presupunem acum că wL(G1), deci există derivaţia S1  w în gramatica G1. Prima regulă folosită
este de forma S1, pentru un anume . Rezultă din construcţia gramaticii G1 că S este o regulă
*
din P şi deci S, în gramatica G. Acum   w este o derivaţie în gramatica G1 dar nu poate avea
*
simbolul S1, căci foloseşte numai regulile din P1 care sunt şi în P. Rezultă că   w este o derivaţie în
gramatica G şi atunci:
*
S    w,
G G

adică wL(G).
Evident că regulile adăugate la P pentru a obţine P1 sunt de acelaşi tip cu regulile lui P deci
dacă G este DC (IDC sau R) atunci şi G1 este DC (IDC sau R).

Teorema 1.2.4
Dacă L este un limbaj DC, IDC sau R, atunci şi L şi L\{} sunt limbaje DC, IDC respectiv
R.

▼Demonstraţie : Dacă L este un limbaj DC, IDC sau R, din teorema 1.2.3 rezultă că există o gramatică
G, care poate fi DC, IDC sau R, în care simbolul iniţial, S, nu apare în partea dreaptă a nici unei reguli
de rescriere. În plus singura regulă în care membrul drept poate fi λ este de forma S→λ.
Atunci pentru limbajul L\{} se scoate regula S→λ, iar pentru limbajul L se adugă tot regula S→λ.
Toate aceste modificări nu au nici o influenţă asupra restului cuvintelor generate de G pentru că
simbolul iniţial S nu mai apare în partea dreaptă a nici unei reguli de rescriere.

M1.U3.5 Operaţii cu limbaje

Pentru că limbajele sunt mulţimi, rezultă că se pot folosi toate operaţiile cu mulţimi cunoscute.

- 33 -
Reuniunea a două limbaje
L1L2={ w | wL1 sau wL2 }

Intersecţie a două limbaje


L1L2={ w | wL1 şi wL2 }

Diferenţa a două limbaje


L1-L2={ w | wL1 şi wL2 }

Complementara unui limbaj relativ la un alphabet V


CV(L)=V*-L

În afară de aceste operaţii se pot introduce o serie de operaţii specifice limbajelor :

Concatenarea a două limbaje


L1L2={uv | uL1, vL2
Limbajele Φ şi {} reprezintă elementul zero şi respectiv elementul unitate relativ la concatenarea
limbajelor:
L Φ = Φ L= Φ
L{}={}L=L
Concatenarea se mai numeşte şi produs.

Puterea unui limbaj se defineşte recursiv prin:


L0 = {}
Li+1 = Li L .
Produsul Kleene (sau Închiderea Kleene) este definit prin reuniunea tuturor puterilor lui L:

L   Li
*

i 0

Închiderea Kleene  - liberă este



L   Li
i 1
Câtul stâng a două limbaje este limbajul format din sufixele cuvintelor din L1 care au prefixul în L2:

L2\L1={v |uvL1, uL2}


Derivata stângă a unui limbaj relativ la cuvântul v este
 vs L={u |vuL}
adică câtul stâng al limbajelor
{v}\L
Câtul drept a două limbaje este limbajul format din prefixele cuvântelor din L1 cu sufixul în L:
L1/L2 = { v| vuL1 pentru uL2 }
Derivata dreaptă a unui limbaj relativ la cuvântul u este
udL= {v |vuL}

- 34 -
adică câtul drept al limbajelor:
L/{u}

Reflectatul sau oglinditul unui limbaj


~
L= { ~u | uL }
Substituţia unui limbaj se defineşte astfel:
aV definim  (a) un limbaj peste Va iar apoi se aplică proprietăţile:
()=,
(uv)=(u)(v)  u, v V*
deci  este o aplicaţie  : V* P(V’*)’
unde V’=  Va .
aV
Substituţia unui limbaj L este atunci:
(L)={ v | v(u) pentru uL }

Dacă (a) este un singur cuvânt ua, atunci substituţia se numeşte homomorfism h:V*V’*. Un
homomorfism se numeşte -liber dacă nici unul din cuvintele (a)=ua nu este .

Observaţia 1.3.1 Pentru că V* este un semigrup liber, h este homomorfism de semigrupuri.

Una din problemele pe care le vom studia în capitolele următoare este problema închiderii familiilor
de limbaje de tip i, Li (i = 0, 1, 2, 3) relative la operaţiile introduse.

1. Se consideră gramatica monotonă

G = ( {A,B}, {a,b}, A, P), unde P:


A → Ba B → BA
Aa → Bb B→b
B → bB A→a
Să se construiască o gramatică echivalentă independentă de context.

2. Considerăm gramatica G=({x0,x,y,z},{a }, x0, P), unde P este mulţimea


producţiilor:
(1) x0yxy
(2) xyyz
(3) zxxxz
(4) zyxxy
(5) xa
(6) y
(a) Să se dea o derivare în G pentru un cuvânt din L(G).
(b) Să se verifice care dintre cuvintele următoare aparţin limbajului:
{aaaaa,aaaa,a}.

- 35 -
3. Să se construiască gramatică pentru generarea limbajului:
L = {anbn | n>0}

Să ne reamintim...
O gramatică generativă este un quadruplu ordonat
G=(VN, VT,S,P) ,
unde VN şi VT sunt alfabete finite disjuncte SVN şi P este o mulţime finită de
perechi ordonate (u,v), astfel încât v este un cuvânt din V*, unde V=VNVT şi u
este un cuvânt din V* care conţine cel puţin o literă din VN.

Limbajul L(G) generat de G este definit de:


*
L(G)={ w| wV *, S  w }
Gramaticile şi, respectiv, limbajele generate de ele, sunt de 4 tipuri: de tip 0
(fără restricţii), de tip 1 (dependente de context), de tip 2 (independente de
context) şi de tip 3 (regulate).

Operaţiile cu limbaje sunt: reuniunea, intersecţia complementara, concatenarea,


puterea, produsul Klenee, oglindirea, substituţia, homomorfismul,
homomorfismul invers, derivata sângă şi dreaptă

Teste de evaluare/autoevaluare
I. Întrebări.
1. Ce este o gramatică generativă?
2. Câte tipuri de gramatici cunoaşteţi şi care sunt acestea?
II. Exerciţii propuse.
1. Se dă gramatica G=({S,A},{,,, p,q,r,‘ },S, P), unde P =
{SSS, SSS, SS, SA, AA’, Ap, Aq, Ar }.
Să se verifice dacă pqrpqr  L(G).
2. Să se construiască o gramatică G care generază următorul limbaj:
L = {a2nbn | n>0}

- 36 -
M1.U3.6. Rezumat. Această unitate de învăţare prezintă noţiunea de gramatică
formală, care a fost introdusă de lingvistul Noam Chomsky. Gramatica generativă
reprezintă mecanismul generativ cel mai folosit pe parcursul acestul material. S-au
prezentat atât gramatici generative cât şi analitice şi s-a demonstrat că ele sunt într-o
relaţie de dualitate, fapt care permite tratarea numai a uneia dintre ele. Un alt aspect
important tratat a fost definirea unor operaţii cu limbaje ca operaţii clasice cu mulţimi
şi chiar a unor operaţii specifice limbajelor..

- 37 -
Soluţiile testelor de autoevaluare pentru Modul 1
M1.U1.

I. Întrebări.
Raspuns: Vezi Definitiile 1.1.1 – 1.1.9.
II. Rezolvare
1. L1 = {00,11,010,001}
L2 = {1 n 00| n>0}
L3 = {1 n 0m| n>0, m>1}
2. Lungimea cuvântului “limbaj” = numarul de caractere pentru “limbaj”, adică 6 caractere.
Nu, “aba” nu este subcuvânt pentru cuvântul“limbaj”.
Rezultatul este concatenarea cuvantului “limbaj” cu el însuşi de 3 ori, adică:
limbajlimbajlimbaj.
3. n=1 aab
n=2 aaaabb
n=3 aaaaaabbb
n=4 aaaaaaaabbbb
L={ aab, aaaabb, aaaaaabbb, aaaaaaaabbbb}

M1.U2.

I. Întrebări.
Raspuns: Vezi Definiţiile 1.1.10 – 1.1.9
II. Rezolvare:
1. Stim ca w este din {a,b,c}*, ceea ce înseamnă că în L avem cuvinte formate numai din
simbolurile a,b,c. Algoritmul îin sens Markov este următorul:
AN = (, P) unde  = {a, b, c, 0}
a  0

P : b  0
c  0

M1.U3.

I. Întrebări.
Raspuns: Vezi Definiţiile 1.2.1
II. Rezolvare:

- 38 -
1. Este suficient sa se construiască o derivaţie în gramatica G pentru cuvântul dat:

SSSSSSSSSS SSSSS ASSSS  pSSSS  pASSS 


pqSSS  pqASS  pqrSS pqrSSS pqrASS
pqrAAS pqrAAA pqrpAA pqrpqApqrpqr

2. Avem limbajul:

L = {a2nbn | n>0}
Trebuie să obţinem o gramatică de forma G = (VN, VT, P, S). Limbajul este format din cuvinte de
forma aab, aaaabb, aaaaaabbb. De aici deducem comportamentele multimii de terminale
VT={a,b}. Multimea de neterminale se initializeaza cu {S}.Vom adauga membri la această
multime pe masura ce vom avea nevoie. Pentru a ajunge la cuvinte de forma a2nbn, cu n oricat
de mare, pornind de la simbolul de start, avem nevoie de o definitie recursiva, cu alte cuvinte
simbolul de start trebuie sa apara si in dreapta unei productii. Este evident faptul că obtinerea
cuvantului aaaabb din cuvantul aab se face adaugand doi de a la început si un b la sfarsit. Acest
rationament ne conduce la o producµie de genul S  aaSb. Derivând succesiv după aceasta
regula, pornind de la simbolul de start, obţinem:

SaaSbaaaaSbbaaaaaaSbbb...

Evident, aceasta regulă nu este suficientă, deoarece ori de cate ori o aplicăm, nu vom obţtine
niciodată un cuvânt format numai din terminale. Avem nevoie de o altă regulă pentru încheierea
derivării. Alegem spre aplicare regula Saab, deoarece aab este cuvântul de lungime minimă
ce se poate genera, adică gramatica nu poate genera cuvântul vid.

- 39 -

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