07.06.2016 Views

LFA_Exercitii_aplicative_seminarii

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

1. Limbaje şi expresii regulate<br />

Exemplul 1.1<br />

Mulţimile V = {a, b, c}; Σ = {0, 1}; V T = {a 1 , a 2 , ..., a n } etc. sunt alfabete.<br />

Observaţia 1.1<br />

Mulţimea Σ* este monoid în raport cu operaţia de concatenare a cuvintelor<br />

definită prin<br />

xy = a i1 a i2 ...a ir a j1 a j2 ...a js ,<br />

dacă<br />

x = a i1 a i2 ...a ir ,<br />

y = a j1 a j2 ...,a js ,<br />

a ip ∈Σ (1 ≤ p ≤ r) şi<br />

a jq ∈Σ (1 ≤ q ≤ r),<br />

deoarece operaţia de concatenare este asociativă, iar λ este element neutru.<br />

Observaţia 1.2<br />

Dacă Σ 0 = {λ}, Σ 2 = ΣΣ (mulţimea cuvintelor de lungime 2), Σ 3 = Σ 2 Σ<br />

(mulţimea cuvintelor de lungime 3), Σ n = Σ n-1 Σ (mulţimea cuvintelor de lungime n;<br />

n>1), atunci<br />

a) Σ* = U ;<br />

Σ k<br />

k≥0<br />

Σ k<br />

b) Σ + = U .<br />

k≥1<br />

Exemplul 1.2<br />

Următoarele construcţii descriu limbaje:<br />

1) Σ = {a, b, c}, L 1 = {a n b n c n | n ≥ 1},<br />

L 2 = {a p | p ∈ N*, p număr prim},<br />

L 3 = {xx | x∈Σ*}.<br />

2) Σ = {0, 1}, L = { x∈Σ* | x este scrierea binară a unui număr natural<br />

divizibil prin 5}.<br />

3) L = {a 3 , a 5 }.<br />

Observaţia 1.3<br />

L{λ}={λ}L=L;<br />

L∅ = ∅L = ∅,<br />

pentru oricare limbaj L, unde ∅ este limbajul vid.<br />

Observaţia 1.4<br />

Dacă L este un limbaj λ-liber (nu conţine cuvântul vid) atunci L + = L* - {λ}.<br />

Cerinta 1.1 Dacă Σ este un alfabet, atunci Σ* este mulţime numărabilă.<br />

Demonstraţie. Presupunem card(Σ) = n şi Σ = {x 1 , x 2 , …, x n }. Construim funcţia<br />

bijectivă f pentru domeniul Σ* şi codomeniul N (mulţimea numerelor naturale). Fie<br />

w ∈ Σ*, atunci f(w) poate fi ales astfel:<br />

f ( w)<br />

⎧0,<br />

⎨<br />

⎩<br />

i + i<br />

w = λ<br />

= k −1<br />

1 2n<br />

+ L + ik<br />

n , w = xi<br />

x x , k = | w |,1 ≤ i ≤ n,1<br />

≤ s ≤ k<br />

1 i<br />

L<br />

2 ik<br />

s<br />

.


Cerinta 1.2. Fie mulţimea univers U, funcţia f : U → U şi B ⊆ U . Construim, în<br />

mod inductiv, şirul de mulţimi:<br />

A 0 = B; A k+1 = A k ∪ {f(x) | x ∈ A k }, k ∈ N şi A = . Atunci:<br />

a) A este închisă faţă de f;<br />

b) Dacă mulţimea C este astfel încât B ⊂ C ⊆ U şi este închisă faţă de f atunci<br />

A⊆C.<br />

Demonstraţie. Fie x ∈ A. Există k ∈ N astfel încât x ∈ A k . Prin urmare f(x) ∈<br />

A k+1 ⊂ A. Fie mulţimea C astfel încât B ⊂ C ⊆ U şi C închisă faţă de f. Evident A 0<br />

⊂ C. Presupunem, prin inducţie că A k ⊂ C. Fie y ∈ A k+1 Cum A k+1 = A k ∪{f(x) | x<br />

∈ A k }, atunci fie y ∈ A k (deci şi lui C), fie y = f(x) cu x ∈ A k ⊆ C. Din închiderea<br />

lui C în raport cu f, rezultă y ∈ C.<br />

Prin urmare<br />

U<br />

k∈N<br />

A k<br />

⊆C.<br />

Exemplul 1.3<br />

a) L(0*1*2*)={0 i 1 j 2 k | i, j, k ≥ 0}.<br />

b) Expresiile b(ab)* şi (ba)*b sunt echivalente.<br />

c) L(ba*) este mulţimea cuvintelor, peste {a, b}, care încep cu b şi după<br />

care urmează 0, 1, 2, … etc. simboluri a, adică L(ba*) = {ba n | n ≥ 0}.<br />

d) L(a*ba*ba*) este mulţimea cuvintelor, peste {a, b}, care conţin simbolul<br />

b exact de două ori.<br />

e) L((a+b)*) reprezintă mulţimea tuturor cuvintelor peste alfabetul {a, b}.<br />

f) L((a+b)*(aa+bb)(a+b)*) este mulţimea tuturor cuvintelor, peste {a, b},<br />

conţinând, consecutive, doua litere a sau b.<br />

Exemplul 1.4<br />

Următoarele limbaje sunt mulţimi regulate:<br />

L 1 ={a n | n≥1};<br />

L 2 = {(ab) n c| n≥0};<br />

L 3 = {a,b}*, etc.<br />

Cerinta 1.3 [Identităţi cu expresii regulate]<br />

Fie r, s şi t expresii regulate peste Σ. Atunci:<br />

a) r + s ∼ s + r, r + ∅ ∼ ∅ + r, r + r ∼ r, (r + s) + t ∼ r + (s + t);<br />

b) rλ ∼ λr ∼ r, r∅ ∼ ∅r ∼ ∅, (rs)t ∼ r(st); în general, comutativitatea<br />

produsului nu are loc.<br />

c) r(s + t) ∼ rs + rt, (s + t)r ∼ sr + tr;<br />

d) r* ∼ r*r* ∼ (r*)* ∼ (λ+r)*, ∅* ∼ λ* ∼ λ;<br />

e) r* ∼ λ + r + r 2 + r 3 + … + r k + r k+1 r*, pentru k ≥0.<br />

f) (r+s)* ∼ (r* +s*)* ∼ (r*s*)* ∼ (r*s)*r* ∼ r*(sr*)*. Expresiile (r+s)* şi<br />

r*+s* nu sunt, în general, echivalente.<br />

g) r*r ∼ rr*, r(sr)* ∼ (rs)*r;<br />

h) (r*s)* ∼ λ + (r + s)*s, (rs*)* ∼ λ + r(r + s)*;<br />

i) Dacă λ∉L(s) atunci ((r ∼ sr + t) ⇔ r∼s*t ) şi ((r ∼ rs + t) ⇔ r ∼ ts*).<br />

Demonstraţie. Folosind unele dintre identităţile a-h, demonstrăm afirmaţia i). Din r<br />

∼ s*t rezultă r ∼ (λ + ss*)t ∼ λt + ss*t ∼ t + sr ∼ sr + t. Presupunem că λ ∉ L(s) şi că<br />

U<br />

k∈N<br />

A k


∼ sr + t . Obţinem, succesiv, r ∼ sr + t ∼ s(sr + t) +t ∼ s 2 r + (st + t) ∼ s 3 r + (s 2 t + st<br />

+ t) ∼ … ∼ s k+1 r + (s k t + s k-1 t + … + st + t), pentru k ≥ 0. Arătăm că r ∼ s*t prin<br />

dublă incluziune. Fie x ∈ L(r) de lungime k := |x|. Deoarece r∼ s k+1 r + (s k t + s k-1 t +<br />

… + st + t) şi λ ∉ L(s) rezultă că x ∉ s k+1 r (este clar că L(s k+1 ) conţine cuvinte cu<br />

cel puţin k + 1 simboluri). Prin urmare x ∈ L(s k t + s k-1 t + … + st + t ) ⊂ L(s*t).<br />

Reciproc, fie x ∈ L(s*t), deci există i ≥ 0 astfel încât x ∈ L(s i t). Dar, identitatea r∼<br />

s i+1 r + (s i t + s i-1 t + … + st + t) arată că L(r) ⊃ L(s i t). Deci x ∈ L(r). Partea a doua a<br />

afirmaţiei se demonstrează similar.<br />

2. Mecanisme generative fundamentale<br />

Exemplul 2.1<br />

Fie V = {S, A, B, C, a, *} şi P = { (S, BAB), (BA, BC), (CA, AAC), (CB,<br />

AAB), (A, a), (B, *)}. În cadrul sistemului de rescriere (V, P) sunt posibile generări<br />

de cuvinte precum:<br />

k<br />

* + 1<br />

2 k<br />

a) B A 2 B ⎯→ B A B;<br />

k<br />

2<br />

b) B A 2 B ⎯→<br />

* a *;<br />

k<br />

* k<br />

* + 1<br />

2 k<br />

c) B A 2 B ⎯→<br />

* a *;<br />

d) S ⎯→<br />

* * *.<br />

n<br />

a 2 2<br />

n<br />

Observaţia 2.1<br />

Ansambul SR = (Ω ∪ Σ, P) este un sistem de rescriere pentru limbajul L(G)<br />

pornind de la şirul S. Metoda de generare pentru L(G) poate fi specificată prin<br />

structura (SR, {S}, Σ).<br />

=<br />

Exemplul 2.2 [a k b k ]<br />

O gramatică care generează limbajul {a n b n | n≥1}. este G=({S}, {a, b}, S,<br />

{(S, aSb), (S, ab)}. Se demonstrează, prin inducţie, că<br />

FP(G) = {a k Sb k | k ≥ 1} ∪ {a k b k | k ≥ 1}.<br />

Prin urmare L(G) = {a k b k | k≥1}.<br />

Exemplul 2.3 [Pătrate]<br />

Fie Ω={S, A, B, X}, Σ={a, %} şi P = {S ::= %% | %B% | %AABB%, %A ::=<br />

%XA, XA ::= AX, XB ::= AABX, X% ::= B%, A ::= a, B ::= a}.<br />

Gramatica G=(Ω, Σ, S, P) generează limbajul L = {% a % | n ≥ 0}.<br />

Cerinta 2.1<br />

Pentru orice gramatică de tip 2, G = (Ω, Σ, S, P) , dacă AB ⎯ ⎯→<br />

* w, atunci<br />

există w ⎯ ⎯ ⎯→<br />

*<br />

1 , w 2 ∈ V* astfel încât: 1) w = w 1 w 2 şi 2) A ⎯→<br />

* w 1, B w 2 .<br />

Demonstraţie. Fie n lungimea derivării AB ⎯ ⎯→<br />

* w. Aplicăm metoda inducţiei<br />

după n. Pentru n = 0 (AB ⎯ ⎯→<br />

* AB), luăm w1 = A şi w 2 = B, iar afirmaţia este<br />

evidentă. Să presupunem că propoziţia este adevărată pentru orice derivare de<br />

lungime n. Fie AB ⎯→<br />

* w o derivare de lungime n + 1. Punem în evidenţă<br />

ultimul pas al derivării: AB ⎯ ⎯→<br />

* α → w. Fie C ::= β a n + 1 producţie aplicată.<br />

Din ipoteza de inducţie rezultă: α = α1α ⎯ ⎯→<br />

* ⎯ ⎯→<br />

*<br />

2 , A α 1 , B α 2 . Neterminalul


C se află fie în α 1 , fie în α 2 . Să presupunem că C se află în α 1 , adică α 1 = γ 1 Cγ 2 .<br />

Prin urmare AB ⎯→<br />

* γ<br />

⎯ ⎯→ *<br />

⎯→<br />

1Cγ 2 α 2 → γ 1 βγ 2 α 2 = w. Luăm A γ 1 Cγ 2 → γ 1 βγ 2 =<br />

α * 1 şi B α 2 . În general α 1 şi α 2 nu sunt determinate în mod unic.<br />

Cerinta 2.2<br />

Pentru orice gramatică de tip 2, G = (Ω, Σ, S, P), există o gramatică<br />

echivalentă G’ = (Ω’, Σ, S, P’), de tip 2, în care toate producţiile lui P’ care conţin<br />

terminale sunt de forma A ::= a, a ∈ Σ.<br />

Demonstraţie. Pentru fiecare simbol terminal a ∈ Σ, se introduce un neterminal nou<br />

X a . Se consideră: Ω’ = Ω ∪ {X a | a ∈ Σ}, iar P’ se obţine din P înlocuind toate<br />

terminalele a cu neterminalul X a şi adăugând, în final, producţiile X a ::= a, a ∈ Σ.<br />

Este evident că se păstrează tipul gramaticii şi că L(G’) = L(G)<br />

Cerinta 2.3<br />

Orice gramatică liniară la dreapta este echivalentă cu o gramatică de acelaşi<br />

tip, dar cu reguli de forma: A ::= aB sau A ::= a, unde A, B ∈ Ω, iar a ∈ Σ ∪ {λ}.<br />

Demonstraţie. Fie A ::= wB o regulă a gramaticii iniţiale, A, B ∈ Ω, w ∈ Σ * . Dacă<br />

|w| = 1, aceasta nu suferă nici o modificare, fiind în forma cerută. Presupunem că<br />

|w| = n > 1. Atunci w = a 1 a 2 …a n , introducem n-1 simboluri neterminale noi B 1 , B 2 ,<br />

…, B n-1 şi înlocuim regula A::= wB cu mulţimea de reguli {A ::= a 1 B 1 , B 1 ::= a 2 B 2 ,<br />

…, B n-2 ::= a n-1 B n-1 , B n-1 ::= a n B}. Dacă n = 0 (mai spunem că avem de-a face cu o<br />

redenumire) atunci parcurgem următoarele etape (a se vedea şi propoziţia 5.3).<br />

Iniţial, se determină mulţimea 1 R(B) = {D | D ∈Ω, B ⎯→<br />

* D}. Regula A ::= B se<br />

înlocuieşte cu mulţimea de reguli {A ::= αC| D ::= αC ∈ P, D ∈ R(B), α ≠ λ} ∪<br />

{A ::= α| D ::= α ∈ P, D ∈ R(B)}.<br />

Fie A::= w o regulă a gramaticii iniţiale, A ∈ Ω şi w ∈ Σ * . Dacă n = |w| ≤<br />

1, aceasta rămâne neschimbată, altfel se consideră n-1 neterminale noi C 1 , C 2 ,<br />

…,C n-1 , şi dacă w = a 1 a 2 …a n , regula se înlocuieşte cu mulţimea de reguli {A :=<br />

a 1 C 1 , C 1 ::= a 2 C 2 , …, C n-2 ::= a n-1 C n-1 , C n-1 ::= a n }. Se parcurg toate regulile<br />

gramaticii iniţiale şi se transformă ca mai sus. Trebuie avut în vedere ca regulile să<br />

fie înregistrate o singură dată.<br />

Exemplul 2.4<br />

Fie gramatica G = ({S, A, B, C, D}, {a, b, c}, S, {S ::= A | abcB, A ::= C | D,<br />

B ::= A | ab, C ::= S}). Obţinem succesiv:<br />

R(S) = {A, C, D, S},<br />

R(A) = {C, D, S, A},<br />

R(B) = {A, C, D, S},<br />

R(C) = {S, A, C, D},<br />

R(D) = ∅.<br />

Considerăm regula S ::= abcB şi simbolurile X 1 , X 2 . Formăm mulţimea<br />

S 1 = {S ::= aX 1 , X 1 ::= bX 2 , X 2 ::= cB}.<br />

Pentru regula B ::= ab, considerăm simbolul X 3 şi mulţimea de reguli<br />

P 1 = {B::=aX 3 , X 3 ::= b}.<br />

În acest moment, regulile sunt:<br />

1 R(B) reprezintă mulţimea redenumirilor directe sau prin simboluri intermediare ale<br />

neterminalului B.


S ::= A | aX 1 ; X 1 ::= bX 2 ;<br />

A ::= C | D;<br />

X 2 ::= cB;<br />

B ::= A | aX 3 ; X 3 ::= b.<br />

C ::= S;<br />

Regula S ::= A se transformă în S ::= aX 1 (care există deja), regula A::= C se<br />

transformă în A ::= aX 1 , regula A ::= D se elimină, regula B::=A se înlocuieşte cu<br />

B ::= aX 1 , iar regula C ::=S se înlocuieşte cu regula C ::= aX 1 . Gramatica G’ are<br />

mulţimea neterminalelor Ω’ = {S, B, X 1 , X 2 , X 3 }, aceeaşi mulţime de terminale,<br />

simbolul de start S şi mulţimea de reguli P’ = { S ::= aX 1 , X 1 ::= bX 2 , X 2 ::= cB, B<br />

::= aX 1 | aX 3 , X 3 ::= b}. Se observă că simbolurile A, C şi D sunt inutile Regulile A<br />

::= aX 1 şi C ::= aX 1 pot fi adăugate, dar în procesul de generare nu se vor aplica<br />

niciodată.<br />

Observaţia 2.2<br />

Fie G o gramatică liniară la stânga, există o gramatică liniară la stânga G’<br />

astfel încât L(G’) = L(G), iar regulile gramaticii G’ sunt numai de forma A ::= Ba<br />

şi A ::= a, unde A, B ∈ Ω, iar a ∈ Σ ∪ {λ}.<br />

Demonstraţie. Se procedează ca la demonstraţia propoziţiei 2.3.<br />

Cerinta 2.5<br />

Fie G o gramatică în care producţiile sunt de forma A ::= Ba şi A ::= a.<br />

Atunci există o gramatică G’ echivalentă cu G pentru care producţiile sunt de<br />

forma A ::= aB şi A ::= a.<br />

Demonstraţie. Fie G = (Ω, Σ, S, P) gramatica dată. Construim G’=(Ω’, Σ, S’, P’),<br />

unde S’ este un neterminal nou, considerat ca axiomă în gramatica G’, Ω’ = Ω ∪<br />

{S’}, iar P’ se obţine din P prin transformarea fiecărei producţii, după cum<br />

urmează:<br />

1. A ::= a ∈ P ⇔ S’ ::= aA∈ P’, A ≠ S;<br />

2. S ::= a ∈ P ⇔ S’ ::= aS ∈ P’ şi S’ ::= a ∈ P’;<br />

3. A ::=Ba ∈ P ⇔ B ::= aA ∈ P’, A ≠ S;<br />

4. S ::= Ba ∈ P ⇔ B ::= aS∈ P’ şi B ::= a ∈ P’.<br />

Fie w∈L(G). Dacă |w| = 1, rezultă S ::= w ∈ P, deci (regula 2) S’::=w ∈ P’. Prin<br />

urmare w ∈ L(G’). Dacă w = a 1 a 2 …a n , n > 1, atunci există derivarea: S → A 1 a n →<br />

A 2 a n-1 a n → A 3 a n-2 a n-1 a n … → A n-1 a 2 a 3 … a n-2 a n-1 a n → a 1 a 2 …a n . Producţiile folosite<br />

au fost: S ::= A 1 a n ; A 1 ::= A 2 a n-1 ; …, A n-2 ::= A n-1 a 2 şi A n-1 ::= a 1. Deci, în P’, se vor<br />

utiliza regulile A 1 ::= a n ; A 2 ::= a n-1 A 1 ; …, A n-1 ::= a 2 A n-2 şi S’ ::= a 1 A n-1 . Rezultă că<br />

w ∈ L(G’). Incluziunea inversă se demonstrează similar.<br />

Observaţia 2.3<br />

Propoziţiile anterioare arată echivalenţa dintre gramaticile liniare la stânga şi<br />

cele liniare la dreapta. Nu trebuie crezut că dacă o gramatică are pe lângă reguli de<br />

tipul A ::= a, atât reguli de forma A ::= aB, cât şi reguli de forma C ::= Db, ea va fi<br />

echivalentă cu o gramatică liniară la stânga (sau la dreapta). De exemplu, gramatica


cu regulile { S ::= aA | aB; A ::= Sb; B ::= b} generează 2 un limbaj de tip 2 şi nu<br />

unul de tip 3 aşa cum ar părea la prima vedere.<br />

Exemplul 2.5<br />

Următoarele limbaje sunt de tip 3: L 1 = {a n | n≥1}, L 2 = Σ + , unde Σ este un<br />

alfabet finit (a se face legătura şi cu elementele lexicale ale limbajelor de<br />

programare), L 3 = {a(ba) n | n ≥0}. L 1 este generat de gramatica G 1 având regulile:<br />

P={S ::= aS | a}. Fie Σ = {a 1 , a 2 , …, a n }, L 2 este generat de o gramatică cu regulile:<br />

P = {S ::= a i S | i = 1, 2, …, n} ∪ {S ::= a i | i = 1, 2, …, n}. Limbajul L 3 este generat<br />

de gramatica cu regulile P = { S := aA | a, A ::= bB, B ::= aA | a}.<br />

Exemplul 2.6<br />

Fie gramatica G = ({E, T, F}, {(, ), +, *, a}, E, P) unde E este simbolul de<br />

start, iar P are următoarele elemente: E ::= E+T | T; T ::= T*F | F, F ::= (E) | a.<br />

Arborii de derivare pentru şirurile a+(a*a) şi (a+a)*a sunt 3 :<br />

E<br />

E<br />

/ | \ |<br />

E + T<br />

T<br />

| | / | \<br />

T F T * F<br />

| / | \ | |<br />

F ( E ) F a<br />

| | / | \<br />

a T ( E )<br />

/ | \ /|\<br />

T * F<br />

E + T<br />

| | | |<br />

F a T F<br />

| | |<br />

a F a<br />

|<br />

a<br />

Cerinta 2.6<br />

Fie G = (Ω, Σ, S, P) o gramatică independentă de context. Oricare ar fi A ∈<br />

Ω, α ∈ (Ω ∪ Σ)*, A ⎯ ⎯→<br />

α dacă şi numai dacă există un A-arbore cu frontiera α.<br />

Demonstraţie. Fie n numărul nodurilor interioare al unui A-arbore cu frontiera α.<br />

Dacă n = 1 atunci, arborele are forma:<br />

A<br />

X 1 X 2 … X k<br />

2 Se demonstrează uşor că limbajul generat de gramatica de la observaţia 2.3 este L = {a n b n<br />

| n ≥ 1}.<br />

3 În arbori, au fost trecute direct etichetele vârfurilor şi nu elementele din mulţimea X.


Prin urmare, în G există producţia A ::= X 1 X 2 …X k , Deci A → X 1 X 2 …X k . Să<br />

presupunem că proprietatea are loc pentru arbori cu cel mult n - 1 noduri interioare<br />

şi fie un A-arbore cu n noduri interioare şi frontiera α (n > 1). Descendenţii lui A<br />

nu pot fi toţi frunze. Fie X 1 , X 2 , …, X k etichetele acestor descendenţi şi α i frontiera<br />

X i – arborelui dacă X i ∈ Ω şi α i = X<br />

⎯ ⎯→<br />

* i dacă X i ∈ Σ. Deoarece orice X i -arbore are cel<br />

mult n-1 noduri, atunci X i α i (evident şi pentru X<br />

⎯ ⎯→<br />

*<br />

i ∈ Σ). Prin urmare, în G<br />

există derivarea A → X 1 X 2 …X k α 1 X 2 …X k ⎯→<br />

*<br />

*<br />

⎯ α1α 2 X 3 … X k ⎯→<br />

α 1 α 2<br />

*<br />

…α k-1 X k ⎯→<br />

α 1 α 2 …α k = α.<br />

Reciproc, presupunem că derivarea A ⎯ ⎯→<br />

* α are lungimea n (în gramatica<br />

G) şi procedăm prin inducţie după n. Pentru n = 1, rezultă că A → α, iar dacă α =<br />

X1X 2 …X k atunci se pune în evidenţă A-arborele:<br />

A<br />

X 1 X 2 …<br />

Xk<br />

Presupunem că afirmaţia este valabilă pentru derivări de lungime cel mult n - 1<br />

care încep de la un neterminal din G şi fie derivarea, în n paşi, A ⎯ ⎯→<br />

* α. Fie A<br />

::= X ⎯ ⎯→<br />

*<br />

1 X 2 …X k prima producţie din derivare. Deci A → X 1 X 2 …X k α. Atunci<br />

(conform propoziţiei 2.1) α = α 1 α 2 …α k şi X i ⎯ ⎯→<br />

* αi (în cel mult n-1 paşi).<br />

Dacă X i ≠ α i , atunci există un X i – arbore cu frontiera α i . Dacă X i = α i atunci X i –<br />

arborele este format doar din nodul etichetat cu X i .<br />

A<br />

X 1 X 2 X k-1 X k<br />

α 1 α 2 α k-1 α k<br />

Astfel, A-arborele de frontieră α se obţine prin aşezarea X i -arborilor în ordinea X 1 ,<br />

X 2 , …, X k şi adăugarea unui nou nod cu eticheta A şi descendenţii X 1 , X 2 , …, X k .<br />

Observaţia 2.4<br />

Fie G = (Ω, Σ, S, P) o gramatică independentă de context. Atunci α ∈ L(G),<br />

adică S ⎯ ⎯→<br />

* α, dacă şi numai dacă există un arbore de derivare (S-arbore) cu<br />

frontiera α.


Observaţia 2.5<br />

Fie G = (Ω, Σ, S, P) o gramatică independentă de context şi w∈ L(G), deci<br />

există un arbore de derivare cu frontiera w.<br />

a) Evident, se poate pune în evidenţă o derivare extrem stânga (resp.<br />

dreapta) pentru w din S. Totuşi, pentru un anumit cuvânt pot exista mai<br />

multe derivări extrem stânga (resp. dreapta), ceea ce denotă o ambiguitate<br />

în procesul de generare.<br />

b) Pentru orice cuvânt w∈ L(G), numărul de derivări extrem stânga pentru<br />

w este egal cu numărul de derivări extrem dreapta.<br />

Exemplul 2.7<br />

Fie G = ({S}, {a, b}, S, {S ::= SbS | a}) şi cuvântul w = (ab) 3 a. Se observă că:<br />

S → SbS → SbSbS → abSbS → abSbSbS → ababSbS → abababS → abababa<br />

şi<br />

S → SbS → SbSbS → SbSbSbS → abSbSbS → ababSbS → abababS → abababa.<br />

Dacă numerotăm regulile de rescriere:<br />

1. S ::= SbS,<br />

2. S ::= a<br />

atunci derivările cuvântului (ab) 3 a sunt obţinute prin aplicarea secvenţelor de<br />

reguli: 1,1,2,1,2,2,2 (resp. 1,1,1,2,2,2,2). Totuşi limbajul {(ab) n a | n ≥ 1} nu este<br />

ambiguu deoarece este generat şi de gramatica liniară la dreapta G 1 = ({S, X, Y},<br />

{a, b}, S, {S ::= Xa, X := aY, Y ::= bX | b}) care nu este ambiguă.<br />

Observaţia 2.6<br />

Orice gramatică independentă de context care conţine, printre regulile sale de<br />

rescriere, producţii de unul din tipurile (1)-(4), cu neterminalul A util in generarea<br />

de cuvinte peste Σ, este ambiguă:<br />

(1) A ::= AA;<br />

(2) A ::= AγA;<br />

(3) A ::= αA | Aβ;<br />

(4) A ::= αA | αAβA.<br />

Cerinta 2.7<br />

Fie G = (Ω, Σ, S, P) o gramatică independentă de context, iar A ∈ Ω cu<br />

proprietatea că există o producţie de forma A ::= Aα. Atunci există o gramatică G’<br />

echivalentă cu G care pentru orice A-regulă A ::= β avem A ∉ Pref(β).<br />

Demonstraţie. Fie A ::= Aα i , i = 1, 2, …, n, toate A-regulile de rescriere ale<br />

gramaticii G care au neterminalul A ca primă literă a membrului drept, iar A ::= β i ,<br />

i = 1, 2, …, m, celelalte A-reguli. Considerăm gramatica G’ = (Ω ∪ {B}, Σ, S, P’)<br />

unde B ∉ (Ω ∪ Σ) este un simbol nou, iar P’ se obţine din P astfel:<br />

P’=(P-{A :: Aα i ; 1≤i≤n}) ∪{ A ::= β i B; 1≤i≤m} }) ∪{B ::= α i B | α i ; 1 ≤ i ≤ n}.<br />

Observăm că noua gramatică nu mai este recursivă la stânga în A, dar este<br />

recursivă la dreapta în B. Echivalenţa celor două gramatici rezultă imediat.<br />

Exemplul 2.8 [Generarea factorialului]<br />

Următoarea gramatică, G = (Ω, Σ, S, P), prezentată în Păun(1974), generează<br />

factorialul numerelor naturale: Ω = {S, A, A_, A 0 , A + , X, Y, Z}, Σ = {#, a}, P =<br />

{(S, A) ; (S, aa); (S, A_S); (S, A 0 A 0 ); (#A_, #A + ); (A + A_, A_ZA + ); (A + A 0 , A 0 ZA + );<br />

(A + #, ZX#); (A + X, XZA + ); (A + Z, ZA + ); (ZA_, A_Z); (X#, Y#), (A 0 Y, YA 0 ), (ZY,<br />

A 0 Y); (XY, YA_); (#Y, #A 0 ); (A 0 A_, A_A 0 ); (#Y, #a); (aA 0 , aa)}


Atunci Var(G) = 7 şi Prod(G) = 19. Măsura Simb(G) nu poate fi evaluată<br />

deoarece G nu este o gramatică independentă de context.<br />

Exemplul 2.9<br />

Fie gramatica independentă de context G = (Ω, Σ, S, P), unde Ω = {S, A, B},<br />

Σ = {a, b} şi P = {(S, aB); (S, bA); (A, a); (A, aS); (A, bAA); (B, b); (B, bS); (B,<br />

aBB)}. Atunci Var(G) = 3, Prod(G) = 8 şi Simb(G) = 32. Fie derivarea D 1 : S → aB<br />

→ abS → abbA → abba. Atunci Index(D 1 , G) = 1. Derivarea D 2 : S → bA → bbAA<br />

→ bbaSA → bbaaBA → bbaaaBBA → … → bbaaabba, are indexul Index(D 2 , G)<br />

= 3.<br />

3. Mecanisme pentru recunoaşterea automată a<br />

mulţimilor regulate<br />

Exemplul 3.1<br />

Fie Q = {q 0 , q 1 , q 2 , q 3 }, Σ = {0, 1}, F = {q 0 }. Pentru automatul M = (Q, Σ, δ,<br />

q 0 , F), dat prin diagrama:<br />

1<br />

q 0<br />

1 q 1<br />

0 0<br />

0<br />

0<br />

q 2<br />

1 q 3<br />

funcţia δ, definită tabelar, este:<br />

δ 0 1<br />

q 0 q 2 q 1<br />

q 1 q 3 q 0<br />

q 2 q 0 q 3<br />

q 3 q 1 q 2<br />

Cerinta 3.1<br />

Cu notaţiile de mai sus, δ(q, uv) = δ(δ(q,u), v), pentru oricare u, v ∈ Σ*.<br />

Demonstraţie. Se utilizează un raţionament inductiv după lungimea cuvântului v.<br />

Dacă |v| = 0 atunci δ(q, uv) = δ(δ(q, u), λ) = δ(q, u). Presupunem afirmaţia<br />

adevărată pentru cuvinte v de lungime cel mult n. Fie v de lungime n + 1, v = wa,<br />

unde a ∈ Σ şi w ∈ Σ*. Obţinem succesiv: δ(q, uv) = δ(q, uwa) = δ(δ(q, uw), a) =<br />

δ(δ(δ(q, u), w), a) = δ(δ(q, u), wa) = δ(δ(q, u), v).<br />

Exemplul 3.2<br />

Fie automatul din exemplul 3.1. Atunci:<br />

a) δ(q 0 , 10101100) = δ(δ(q 0 , 1), 0101100) = δ(δ(q 1 , 0), 101100) =<br />

1


δ(δ(q 3 , 1), 01100) = δ(δ(q 2 , 0), 1100) = δ(δ(q 0 , 1), 100)= δ(δ(q 1 , 1),00) =<br />

δ(δ(q 0 , 0),0) = δ(δ(q 2 , 0), λ)= δ(q 2 , 0) = q 0 ∈ F.<br />

b) δ(q 0 , 11101001) = δ(δ(q 0 , 1), 1101001) = δ(δ(q 1 , 1), 101001) =<br />

δ(δ(q 0 , 1), 01001) = δ(δ(q 1 , 0), 1001) = δ(δ(q 3 , 1), 001)= δ(δ(q 2 , 0), 01)=<br />

δ(δ(q 0 , 0), 1) = δ(δ(q 2 , 1), λ) = δ(q 2 ,1) = q 3 ∉ F.<br />

Exemplul 3.3<br />

Limbajul acceptat de automatul prezentat în exemplul 3.1 este constituit din<br />

mulţimea şirurilor peste {0, 1} în care apar un număr par de ‘0’ şi un număr par de<br />

‘1’.<br />

Exemplul 3.4<br />

Fie N = (Q, Σ, δ N , q 0 , F) cu Q = {A, B, C}, Σ = {a, b}, q 0 = A, F = {B, C} şi<br />

δ N dată prin tabelul:<br />

δ N a b<br />

A {A, B} {B}<br />

B {A, C} {C}<br />

C {B, C} {A}<br />

şi w = abababb.<br />

Atunci, obţinem succesiv:<br />

δ N (A, abababb) = δ N (A, bababb) ∪ δ N (B, bababb);<br />

δ N (A, bababb) = δ N (B, ababb) = δ N (A, babb) ∪ δ N (C, babb);<br />

δ N (B, bababb) = δ N (C, ababb) = δ N (B, babb) ∪ δ N (C, babb);<br />

δ N (A, babb) = δ N (B, abb) = δ N (A, bb) ∪ δ N (C, bb);<br />

δ N (B, babb) = δ N (C, abb) = δ N (B, bb) ∪ δ N (C, bb);<br />

δ N (C, babb) = δ N (A, abb) = δ N (A, bb) ∪ δ N (B, bb);<br />

δ N (A, bb) = δ N (B, b) = {C};<br />

δ N (B, bb) = δ N (C, b) = {A};<br />

δ N (C, bb) = δ N (A, b) = {B};<br />

δ N (A,abababb) = {A, B, C}.<br />

Observăm că F ∩ δ N (A, abababb) ≠ ∅. Deci abababb ∈ L(N).<br />

Cerinta 3.2.<br />

Orice limbaj acceptat de un AFD este acceptat de un AFN.<br />

Demonstraţie. Evident.<br />

Cerinţa 3.3.<br />

Fie L un limbaj acceptat de un AFN. Atunci există un AFD, notat cu M,<br />

astfel încât L(M) = L.<br />

Demonstraţie. Fie N = (Q, Σ, δ, q 0 , F) un AFN astfel încât L(N) = L. Definim un<br />

AFD, notat cu M = (Q M , Σ, δ M , q 0 ’, F’) unde:<br />

Q M = P(Q); q 0 ’ = q o ; F’ = {P | P ⊆ Q, P ∩ F ≠ ∅},<br />

iar<br />

δ M (∅, a) = ∅;<br />

δ M (P, a)= δ ( q,<br />

a) ; oricare P ⊆ Q, P ≠ ∅.<br />

U<br />

q∈P


Este suficient să demonstrăm că δ M ({s}, w) = δ(s, w), oricare s ∈ Q şi oricare w ∈<br />

Σ*. Dezvoltăm un raţionament inductiv. Pentru |w| = 0, afirmaţia este evidentă.<br />

Presupunem că afirmaţia este adevărată pentru orice cuvânt de lungime k. Fie w ∈<br />

Σ* astfel încât |w| = k + 1, w = αa, |α| = k, a ∈ Σ. Prin urmare: δ M ({s}, w) =<br />

δ M ({s}, αa) = δ M (δ M ({s}, α)), a)= δ ( r,<br />

a)<br />

= δ ( r,<br />

a)<br />

= δ({s}, αa).<br />

U<br />

M<br />

r∈δ<br />

M ({ s},<br />

α )<br />

r∈δ<br />

( s,<br />

α )<br />

În concluzie, w ∈ L(M) ⇔ δ(q0, w) ∩ F ≠ ∅ ⇔ δ M ({q 0 }, w) ∩ F ≠ ∅ ⇔ δ M (q o ’,<br />

w) ∈ F’ ⇔ w ∈ L(M’).<br />

U<br />

Exemplul 3.5<br />

Fie automatul finit nedeterminist din exemplul 3.4. Automatul finit<br />

determinist asociat are este caracterizat prin tabelul:<br />

Q M P(Q) A b<br />

q 7’ ∅ q 7 ’ q 7 ’<br />

q 0 ’ {A} q 3 ’ q 1 ’<br />

q 1 ’ {B} q 4 ’ q 2 ’<br />

q 2 ’ {C} q 5 ’ q 0 ’<br />

q 3 ’ {A, B} q 6 ’ q 5 ’<br />

q 4 ’ {A, C} q 6 ’ q 3 ’<br />

q 5 ’ {B, C} q 6 ’ q 4 ’<br />

q 6 ’ {A, B, C} q 6 ’ q 6 ’<br />

deoarece:<br />

δ M (q 0 ’, a) = δ M ({A}, a) = δ N (A, a) = {A, B} = q 3 ’;<br />

δ M (q 0 ’, b) = δ M ({A}, b) = δ N (A, b) = {B} = q 1 ’;<br />

δ M (q 1 ’, a) = δ M ({B}, a) = δ N (B, a) = {A, C} = q 4 ’;<br />

δ M (q 1 ’, b) = δ M ({B}, b) = δ N (B, b) = {C} = q 2 ’;<br />

δ M (q 2 ’, a) = δ M ({C}, a) = δ N (C, a) = {B, C} = q 5 ’;<br />

δ M (q 2 ’, b) = δ M ({C}, b) = δ N (C, b) = {A} = q 0 ’;<br />

δ M (q 3 ’, a) = δ M ({A, B}, a) = δ N (A, a) ∪ δ N (B, a) = {A, B, C} = q 6 ’;<br />

δ M (q 3 ’, b) = δ M ({A, B}, b) = δ N (A, b) ∪ δ N (B, b) = {B, C} = q 5 ’;<br />

δ M (q 4 ’, a) = δ M ({A, C}, a) = δ N (A, a) ∪ δ N (C, a) = {A, B, C} = q 6 ’;<br />

δ M (q 4 ’, b) = δ M ({A, C}, b) = δ N (A, b) ∪ δ N (C, b) = {A, B} = q 3 ’;<br />

δ M (q 5 ’, a) = δ M ({B, C}, a) = δ N (B, a) ∪ δ N (C, a) = {A, B, C} = q 6 ’;<br />

δ M (q 5 ’, b) = δ M ({B, C}, b) = δ N (B, b) ∪ δ N (C, b) = {A, C} = q 4 ’;<br />

δ M (q 6 ’, a) = δ M ({A, B, C},a) = δ N (A,a) ∪ δ N (B,a) ∪ δ N (C,a)={A, B, C} = q 6 ’;<br />

δ M (q 6 ’, b) = δ M ({A, B, C},b) =δ N (A,b) ∪ δ N (B,b) ∪ δ N (C,b)={A, B, C} = q 6 ’,<br />

iar F’ = {q 1 ’, q 2 ’, q 3 ’, q 4 ’, q 5 ’, q 6 ’}. Observăm că q 7 ’ este stare inutilă şi se poate<br />

elimina din Q M .


4. Optimizarea automatelor finite<br />

Algoritmul 4.1 [Determinarea stărilor accesibile 4 ]<br />

Prin aplicarea strategiei greedy, putem obţine un şir ascendent de mulţimi cu<br />

stări accesibile, majorat în sensul relaţiei de incluziune de mulţimea stărilor<br />

automatului considerat.<br />

Fie S 0 = {q 0 }. Pentru i ≥ 0, formăm S i+1 = S i ∪ {q ∈ Q - S i | există s ∈ S i şi a<br />

∈ Σ astfel încât δ(s, a) = q}. O altă modalitate de construire a şirului ascendent<br />

utilizează relaţia de recurenţă: S i+1 = S i ∪ {δ(s, a) | s ∈ S i , a ∈ Σ}.<br />

Este clar că trebuie să existe k 0 , k 0 ≤ |Q| astfel încât S k0 = S k0+1 , k 0 fiind cel<br />

mai mic număr natural cu această proprietate; în aceste condiţii S k0+j = S k0 , oricare j<br />

≥ 1. Mulţimea stărilor accesibile este S k0 .<br />

Intrare: Q, Σ, q 0 , δ, F<br />

Ieşire: Q’ – mulţimea stărilor accesibile<br />

SEQ<br />

1. i := 0; S 0 := {q 0 };<br />

2. do {S i+1 := S i ∪{δ(s, a) | s ∈ S i , a ∈ Σ}; i = i+1; }while(S i – S i-1 ≠ ∅);<br />

3. Q’ = S i .<br />

END.<br />

Algoritmul 4.2 [Determinarea stărilor utile 5 ]<br />

Prin aplicarea strategiei greedy, putem obţine un şir ascendent de mulţimi cu<br />

stări utile, majorat în sensul relaţiei de incluziune de mulţimea stărilor automatului<br />

considerat.<br />

Fie U 0 = F. Pentru i ≥ 0, formăm U i+1 = U i ∪ {q ∈ Q - U i | există a ∈ Σ astfel<br />

încât δ(q, a) ∈ U i }.<br />

Este clar că trebuie să existe k 0 , k 0 ≤ |Q| astfel încât U k0 = U k0+1 , k 0 fiind cel<br />

mai mic număr natural cu această proprietate; în aceste condiţii U k0+j = U k0 , oricare<br />

j≥1. Mulţimea stărilor utile este U k0 .<br />

Intrare: Q, Σ, q 0 , δ, F<br />

Ieşire: U’ – mulţimea stărilor utile<br />

SEQ<br />

1. i := 0; U 0 := F;<br />

2. do {<br />

for a ∈ Σ do for q ∈ Q - U i do if δ(q, a) ∈ U i then U i+1 = U i ∪ {q};<br />

i = i +1;<br />

}while(U i – U i-1 ≠ ∅);<br />

3. U’ = U i .<br />

END.<br />

4 Problema determinării stărilor accesibile este echivalentă cu problema determinării<br />

vârfurilor unui digraf care sunt legate prin cel puţin un drum de vârful care corespunde<br />

stării q 0 . Dacă se determină matricea existenţei drumurilor sau, echivalent, închiderea<br />

tranzitivă a relaţiei binare asociată diagramei de tranziţie (de exemplu, folosind algoritmul<br />

Roy-Warshal) atunci stările accesibile corespund valorii 1 în linia stării q 0 din matricea<br />

existenţei drumurilor.<br />

5 În unele lucrări, stările utile sunt denumite stări observabile.


Cerinta 4.1 [Lema de pompare]<br />

Fie L un limbaj regulat. Există atunci un număr natural n astfel încât pentru<br />

orice cuvânt w ∈ L, |w| ≥ n, w = xyz cu proprietăţile:<br />

a) |xy| ≤ n;<br />

b) |y| ≥ 1;<br />

c) xy i z ∈ L pentru oricare i ≥ 0.<br />

Demonstraţie. Se foloseşte automatul minimal care recunoaşte L. Rezultă că n este<br />

unic determinat şi depinde numai de L. Fie M = (Q, Σ, δ, q 0 , F) astfel încât L(M) =<br />

L şi M este automatul minimal. Considerăm n := |Q|. Fie w ∈ L, |w| ≥ n, w ∈ L, |w|<br />

≥ n. Atunci w = a 1 a 2 … a m , m ≥ n. Fie q i = δ(q 0 , a 1 a 2 …a i ), i = 1, 2, …, m. Deoarece<br />

w ∈ L rezultă că q m ∈ F. Cum sunt evidenţiate m + 1 stări, iar m ≥ n, rezultă că, în<br />

şirul q 0 , q 1 , …, q m , există două stări care se repetă. Fie q s şi q t stările care se repetă<br />

(evident 0 ≤ s < t ≤ m; se poate lua chiar s minim cu aceste proprietăţi). Se<br />

descompune w astfel: x = a 1 a 2 …a s , y = a s+1 a s+2 …a t , z = a t+1 a t+2 …a m . Se observă că<br />

această descompunere satisface cerinţele formulate.<br />

2<br />

k<br />

Exemplul 4.1 [ a ]<br />

2<br />

k<br />

Fie L = { a | k ≥ 1}. Vom arăta că L nu este limbaj regulat. Presupunem<br />

contrariul. Fie n numărul natural dat de lema de pompare aplicată pentru<br />

presupusul limbaj regulat L şi w ∈ L astfel încât w = a , adică |w| = n<br />

2 > n pentru<br />

n > 1. Atunci w = xyz cu a) |xy| ≤ n; b) |y| ≥ 1; c) xy i z ∈ L pentru oricare i ≥ 0. Fie i<br />

= 2. Obţinem |xy 2 z| = |xyz| + |y| = n 2 + |y|. Dar n 2 < |xy 2 z| ≤ n 2 + n < (n+1) 2 . Deci<br />

xy 2 z ∉ L, contrar celor presupuse. În concluzie L nu este limbaj regulat.<br />

Exemplul 4.2 [a k b k ]<br />

Fie L = {a k b k | k ≥ 1}. Presupunem că L este limbaj regulat şi fie n numărul<br />

dat de Teorema 4.3. Fie w = a n b n = xyz. Cum |y| > 0, apar trei situaţii:<br />

1. y = a s , 0 < s ≤ n. Pentru i = 0 se va obţine un cuvânt cu mai puţine<br />

simboluri a decât b, deci xy 0 z ∉ L;<br />

2. y = b t , 0 < t ≤ n. Analog, pentru i=0, rezultă xy 0 z ∉ L;<br />

3. y = a s b t , 0 < s, t ≤ n. Pentru i = 2 se amestecă literele şi se obţine<br />

xy 2 z = a n-s a s b t a s b t b n-t = a n b t a s b n ∉ L.<br />

Deci L nu este limbaj regulat.<br />

Cerinta 4.2<br />

Fie L un limbaj acceptat de un AFD cu n stări. Atunci L ≠ ∅ ⇔ există w ∈ L<br />

astfel încât |w| < n;<br />

Demonstraţie. Presupunem că L este nevid. Fie w ∈ L. Notăm w 0 := w.<br />

Dacă |w 0 | < n atunci stop, altfel aplicăm Teorema 4.3 şi rezultă<br />

descompunerea w 0 = xyz cu proprietăţile: a) |xy| ≤ n; b) |y| ≥ 1; c) xy i z ∈ L pentru<br />

oricare i ≥ 0. Pentru i = 0, formăm w 1 = xz ∈ L, deoarece L este acceptat de un<br />

AFD, deci este limbaj regulat.<br />

Continuăm cu obţinerea secvenţei, descrescătoare în lungime, w 0 , w 1 , …, w t .<br />

Ne oprim când |w t | < n.<br />

Implicaţia inversă (⇐) este evidentă.<br />

2<br />

n


Cerinta 4.3<br />

Fie L un limbaj acceptat de un AFD cu n stări. Atunci L este infinit ⇔ există<br />

w ∈ L, n ≤ |w| < 2n.<br />

Demonstraţie. Fie L limbajul generat de un AFD cu n stări. Dacă limbajul este<br />

infinit atunci, sigur există un cuvânt w ∈ L astfel încât |w| > n.<br />

Fie w 0 := w. Conform lemei de pompare rezultă că w 0 = xyz cu proprietăţile:<br />

a) |xy| ≤ n; b) |y| ≥ 1; c) xy i z∈L pentru oricare i ≥ 0.<br />

Dacă |w 0 | < 2n atunci stop, altfel considerăm w 1 = xz ∈ L, pentru care |w 1 | <<br />

|w 0 |.<br />

Dacă |w 1 | < 2n atunci stop, altfel reluăm procesul şi vom obţine o sevenţă,<br />

descrescătoare în lungime, w 0 , w 1 , …, w t . Ne oprim când |w t | < n.<br />

Reciproc, dacă în L există un cuvânt w astfel încât n ≤ |w| < 2n, atunci prin<br />

aplicarea lemei de pompare şi considerarea cuvintelor xy i z, i ≥ 0, obţinem o<br />

mulţime infinită de cuvinte ale limbajului, deci L este infinit.<br />

Algoritmul 4.3<br />

Fie L un limbaj acceptat de un AFD cu n stări. Pentru a verifica dacă L ≠ ∅,<br />

se poate aplica următorul algoritm.<br />

Intrare: Q, Σ, q 0 , δ, F<br />

Ieşire: “DA” dacă L este nevid; “NU” în caz contrar.<br />

SEQ<br />

1. i := 0; S 0 := {q 0 };<br />

2. do {S i+1 := S i ∪{δ(s, a) | s ∈ S i , a ∈ Σ}; i = i + 1;} while(S i – S i-1 ≠ ∅);<br />

3. if S i ∩ F = ∅ then write “NU”; else write “DA”.<br />

END.<br />

Se observă că mulţimea S i , de la pasul 3, conţine stările accesibile. Este clar că<br />

dacă nici o stare finală nu este accesibilă atunci limbajul L este vid.<br />

Algoritmul 4.4<br />

Fie L un limbaj acceptat de un AFD cu n stări. Pentru a verifica dacă L ≠ ∅,<br />

se poate aplica următorul algoritm.<br />

Intrare: Q, Σ, q 0 , δ, F<br />

Ieşire: “DA” dacă L este infinit; “NU” în caz contrar.<br />

SEQ<br />

1. i := 0; S 0 := {q 0 };<br />

2. do {S i+1 := S i ∪{δ(s, a) | s ∈ S i , a ∈ Σ}; i = i + 1; }while(i < n);<br />

3. do{<br />

if S i ∩ F ≠ ∅ then write “DA”; stop.<br />

S i+1 := S i ∪{δ(s, a) | s ∈ S i , a ∈ Σ}; i = i + 1;<br />

}while(i < 2n);<br />

4. write “NU”.<br />

END.


5. Transformări asupra gramaticilor formale<br />

Cerinta 5.1 [Eliminarea redenumirilor]<br />

Fie G = (Ω, Σ, S, P) o gramatică de tipul 2 sau 3. Există o gramatică G 1 = (Ω,<br />

Σ, S, P 1 ) de acelaşi tip cu G, echivalentă cu G şi fără redenumiri.<br />

Demonstraţie. Fie G = (Ω, Σ, S, P) o gramatică de tipul 2 sau 3 şi P’ := {A ::= w |<br />

w ∉ Ω, A ::= w ∈ P} mulţimea regulilor din P care nu sunt redenumiri. Fie P” := {<br />

A ::= w | A ∈Ω, există B, B ∈ Ω şi A ⎯ ⎯→<br />

+ B (în G, derivare în cel puţin un pas),<br />

iar B → w ∈ P’} o mulţime de reguli care nu sunt redenumiri. Formăm gramatica<br />

G1 = (Ω, Σ, S, P 1 ) cu P 1 := P’ ∪ P”. Evident G 1 este fără redenumiri şi de acelaşi tip<br />

cu G. Demonstrăm că G şi G 1 sunt echivalente.<br />

Fie w ∈ L(G), deci S ⎯ ⎯→<br />

* w, printr-o derivare stângă (conform lemei 5.1),<br />

în G, de forma: S = w0 ⎯ ⎯→<br />

* w 1 ⎯ ⎯→<br />

* w2 ⎯ ⎯→<br />

* … ⎯ ⎯→<br />

* w<br />

⎯ ⎯→<br />

*<br />

k = w, derivările<br />

w i w i+1 , i = 0, 1, 2, …, k - 1 fiind de lungime nenulă, iar pentru fiecare din<br />

ele este posibilă numai una din situaţiile:<br />

a) w ⎯ ⎯→<br />

*<br />

i w i+1 este o derivare de lungime 1 obţinută prin aplicarea unei<br />

reguli din P’. Deci w i ⎯ ⎯→<br />

* wi+1, în gramatica G 1 .<br />

b) w ⎯→<br />

* i ⎯ w i+1 este o derivare de lungime cel puţin egală cu 2, astfel încât<br />

există v ∈ (Ω∪Σ) * , pentru care w i ⎯→<br />

* v (derivare stângă cu<br />

redenumiri) şi v → wi+1, derivare printr-o regulă din P’. Prin aplicarea<br />

unei reguli din P” referitor la derivarea iniţială w ⎯→<br />

*<br />

i v se poate găsi<br />

w i ⎯ ⎯→<br />

* v în G1. Prin cuplarea derivărilor rezultă că este posibil ca S<br />

⎯ ⎯→<br />

* w în G 1 .<br />

Reciproca este imediată.<br />

Cerinţa 5.2 [Determinarea simbolurilor neterminale care “generează” cuvântul<br />

vid]<br />

Fie G = (Ω, Σ, S, P) o gramatică cu producţiile de forma (p, q) ∈ Ωx(Ω∪Σ)*.<br />

Şirul de mulţimi generat prin:<br />

U 0 = ∅;<br />

U m+1 = U m ∪ {X | X ∈ Ω, există w, w ∈ U m *, X ::= w ∈ P}<br />

are următoarele proprietăţi:<br />

a) U 0 ⊆ U 1 ⊆ … U m ⊆ … ⊆ Ω şi există k, număr natural, astfe încât U k =<br />

U k+1 .<br />

b) Dacă U k = U k+1 , atunci U k = U k+i , pentru oricare i > 0.<br />

c) Fie k* cel mai mic număr natural pentru care U k* = U k* +1 . Atunci<br />

U k* = {X | X ∈ Ω şi X ⎯ ⎯→<br />

* λ}.<br />

Demonstraţie. Proprietatea a) rezultă din construcţia şirului de mulţimi, iar<br />

proprietatea b) se poate demonstra uşor prin inducţie.<br />

Vom demonstra proprietatea c). Mai general, vom arăta că<br />

U m ⊆ {X | X ∈ Ω şi X ⎯ ⎯→<br />

* λ}, pentru oricare m număr natural.<br />

Dacă m = 0, este evident. Presupunem că U ⎯ ⎯→<br />

*<br />

m ⊆ {X | X ∈ Ω şi X λ} şi<br />

fie X ∈ U m+1 . Dacă X ∉ U m rezultă că există w, w∈U m *, X ::= w ∈ P. Sunt posibile<br />

două cazuri:<br />

Cazul 1: w = λ. Deci X ⎯ ⎯→<br />

* λ.


Cazul 2. w ≠ λ. Atunci w = x 1 x 2 …x r , unde x i ∈ U m , i = 1, 2, …, r. Din ipoteza<br />

de inducţie rezultă că x i ⎯ ⎯→<br />

* λ, i = 1, 2, …, r. Deci X ⎯ ⎯→<br />

* λ.<br />

⎯→<br />

*<br />

În ambele cazuri a rezultat că X ∈{X | X ∈ Ω şi X ⎯ λ}.<br />

În concluzie U k* ⊆ {X | X ∈ Ω şi X ⎯ ⎯→<br />

* λ }.<br />

Reciproc, presupunem că U ⎯ ⎯→<br />

*<br />

k* ≠ ∅ şi arătăm că {X | X ∈ Ω şi X λ} ⊆<br />

U ⎯ ⎯→<br />

*<br />

k* , prin inducţie completă în raport cu lungimea derivării X λ.<br />

Dacă derivarea X ⎯ ⎯→<br />

* λ este de lungime 1 atunci X ::= λ este producţie<br />

din P, deci X ∈ U1 ⊆ U k* .<br />

Presupunem că pentru orice derivare X ⎯ ⎯→<br />

* λ cu lungimea cel mult m<br />

rezultă X ∈ Uk*. Fie X ⎯ ⎯→<br />

* λ o derivare de lungime m+1. Punem în evidenţă<br />

primul pas al derivării. Rezultă că există v astfel încât X ::= v şi X → v ⎯ ⎯→<br />

* λ,<br />

unde derivarea v ⎯→<br />

* λ are lungimea m. Evident pentru m ≠ 0 trebuie ca v ≠ λ.<br />

Prin urmare v = v1v 2 …v r este o scriere a lui v cu elemente v i ∈ Ω, i = 1, 2, …, r.<br />

Dacă ar exista un i pentru care v i ∈ Σ, acesta nu ar mai putea fi eliminat pe<br />

parcursul derivării v ⎯ ⎯→<br />

* λ. Conform propoziţiei 2.1 rezultă că v ⎯ ⎯→<br />

*<br />

i λ, i =<br />

1, 2, …, r. Prin aplicarea ipotezei de inducţie rezultă că v i ∈ U k* şi deci v ∈ U k* .<br />

Astfel obţinem X ∈ U k* .<br />

Cerinţa 5.3 [Limbaje independente de context generate de gramatici cu λ -<br />

producţii]<br />

Fie G = (Ω, Σ, S, P) o gramatică cu producţiile de forma (p, q) ∈ Ωx(Ω∪Σ)*.<br />

Atunci L(G) este un limbaj independent de context.<br />

Demonstraţie. Fie P 1 = {Y ::= w 1 | există w ∈ (Ω∪Σ) + , cu Y ::= w astfel încât w 1 se<br />

obţine din w prin ştergerea a zero, unu sau mai multor simboluri X ∈ Ω pentru care<br />

X ⎯ ⎯→<br />

* λ} şi G 1 = (Ω, Σ, S, P 1 ).<br />

Evident, gramatica G 1 este independentă de context, iar L(G 1 ) = L(G) – {λ}.<br />

Ceinţa 5.4 [Simboluri care generează cuvinte peste Σ 6 ]<br />

Fie G = (Ω, Σ, S, P) o gramatică independentă de context cu L(G) ≠ ∅. Există<br />

o gramatică G 1 = (Ω 1 , Σ, S, P 1 ) independentă de context, echivalentă cu G, astfel<br />

încât pentru oricare X ∈ Ω 1 , mulţimea {w ∈ Σ* | X ⎯→<br />

* w} este nevidă.<br />

Demonstraţie. Construim şirul de mulţimi U 0 , U 1 , U 2 , … folosind următorul<br />

algoritm:<br />

1. U 0 := ∅; i := 1;<br />

2. U i := U i-1 ∪ {X | X ::= w ∈ P, w ∈ (U i ∪ Σ)*}<br />

3. Dacă U i ≠ U i-1 atunci i := i + 1 şi se continuă cu pasul 2.<br />

4. Se consideră Ω 1 = U i , P 1 se obţine din P prin eliminarea producţiilor<br />

în care apare cel puţin un simbol neterminal din Ω - Ω 1 .<br />

Să observăm că U 0 ⊆ U 1 ⊆ … ⊆ U m ⊆ … ⊆ Ω (numărul maxim de aplicări<br />

al pasului 2 este maximum card (Ω)), deci există k astfel încât U k = U k+1 şi U k =<br />

U k+p pentru oricare p > 0. Indicele i furnizat de algoritm corespunde celui mai mic<br />

6 Acestea se mai numesc şi simboluri productive. Prin analogie cu sistemele AFD,<br />

simbolurile productive vor fi numite şi simboluri utile. Simbolurile care sunt în acelaşi timp<br />

accesibile (definiţia 5.3) şi productive le vom numi simboluri utilizabile, precum în<br />

Atanasiu (1987).


k pentru care U k = U k+1 . Notăm această valoare prin k*. Deci se poate scrie că U 0 ⊆<br />

U 1 ⊆ … ⊆ U k* .<br />

De asemenea, pentru oricare i = 1, 2, …, k*, dacă X ∈ U i atunci există w ∈<br />

Σ* astfel încât X ⎯→<br />

* w. Dacă i = 1, afirmaţia rezultă din construcţia mulţimii<br />

U1. Presupunem proprietatea adevărată pentru un indice i şi considerăm X ∈ U i+1 .<br />

Dacă X ∈ U i demonstraţia este încheiată. Considerăm cazul X ∈ U i+1 – U i , deci<br />

există producţia X ::= X 1 X 2 …X r , cu X i ∈ U i ∪ Σ, i = 1, 2, …, r. Dacă X i ∈ Σ,<br />

considerăm w ⎯ ⎯→<br />

*<br />

i = X i ; altfel, prin ipoteza de inducţie există w i astfel încât X i<br />

w i . Formăm derivarea X → X 1 X 2 …X r ⎯ ⎯→<br />

* w1w 2 …w r şi luăm w = w 1 w 2 …w r.<br />

Pentru a completa demonstraţia propoziţiei este suficient să arătăm că dacă<br />

X ⎯→<br />

n w (derivare în n paşi) şi w ∈ Σ* atunci există i astfel încât X ∈ U i . Vom<br />

proceda prin inducţie după n (lungimea derivării).<br />

Pentru n = 1, din construcţie va rezulta că X ∈ U 1 . Să presupunem afirmaţia<br />

adevărată pentru derivări de lungime cel mult n şi să considerăm o derivare de<br />

lungime n + 1. Punem în evidenţă primul pas al derivării, adică X → X 1 X 2 …X r<br />

⎯→<br />

n<br />

n<br />

w . Conform propoziţiei 2.1 rezultă că w = w 1 w 2 …w r cu X p ⎯⎯→<br />

i w p (p =<br />

1, 2, …, r). Dacă X p ∈ Σ (n p = 0) atunci luăm j[p] = 0, adică X p ∈ U 0 . Dacă X p ∈ Ω<br />

atunci, prin utilizarea ipotezei de inducţie rezultă că există j[p] astfel încât X p ∈<br />

U j[p] ; Cum şirul construit este ascendent, putem lua i = 1+ max{j[1], j[2], …, j[r]}<br />

şi rezultă X ∈ U i .<br />

Pe baza afirmaţiilor de mai sus se deduce echivalenţa gramaticilor G şi G 1 .<br />

Cerinţa 5.5 [Decidabilitatea problemei L(G) ≠ ∅]<br />

Există un algoritm care pentru o gramatică independentă de context stabileşte<br />

dacă L(G) = ∅ sau L(G) ≠ ∅.<br />

Demonstraţie. Se poate utiliza următorul algoritm:<br />

1. U 0 := ∅; i := 1;<br />

2. U i := U i-1 ∪ {X | X ::= w ∈ P, w ∈ (U i ∪ Σ)*}<br />

3. Dacă U i ≠ U i-1 atunci i := i + 1 şi se continuă cu pasul 2.<br />

4. Dacă S ∈ U i atunci L(G) ≠ ∅ altfel L(G) = ∅.<br />

Justificarea corectitudinii algoritmului urmează paşii prezentaţi în cadrul<br />

demonstraţiei propoziţiei 5.5.<br />

Cerinţa 5.6 [Determinarea simbolurilor accesibile]<br />

Fie G = (Ω, Σ, S, P) o gramatică independentă de context cu L(G) ≠ ∅. Există<br />

G 1 = (Ω 1 , Σ 1 , S, P 1 ) echivalentă cu G care nu are simboluri inaccesibile.<br />

Demonstraţie. Vom demonstra că algoritmul de mai jos va determina simbolurile<br />

accesibile. Paşii algoritmului sunt:<br />

1. U 0 := {S}; i := 1;<br />

2. U i := U i-1 ∪ {X | există A ::= uXv ∈ P, astfel încât A ∈ U i-1 }.<br />

3. Dacă U i ≠ U i-1 atunci i:= i+1 şi se continuă de la pasul 2.<br />

4. Fie k* valoarea lui i obţinută la acest pas. Formăm Ω 1 := Ω ∩ U k* , Σ 1 :=<br />

Σ ∩ U k* şi P 1 producţiile lui P care au în ambii membrii numai simboluri<br />

din U k* .<br />

Cum U k* ⊆ Ω ∪ Σ, are cardinal finit, rezultă că procesul descris se termină în timp<br />

finit. Se arată uşor că G şi G 1 sunt echivalente şi că pentru oricare A∈ Ω 1 ∪ Σ 1<br />

există u şi v din (Ω 1 ∪Σ 1 )* astfel încât S ⎯ ⎯→<br />

* uAv.


Cerinţa 5.7<br />

Fie G = (Ω, Σ, S, P) o gramatică independentă de context cu L(G) ≠ ∅.<br />

Atunci G este echivalentă cu o gramatică G 1 fără simboluri neutilizabile.<br />

Demonstraţie. Asupra gramaticii G se aplică propoziţia 5.5 şi se determină G 1<br />

echivalentă cu G care are numai simboluri neterminale care pot “genera” cuvinte<br />

peste alfabetul terminal (aşa numitele simboluri productive sau utile). Apoi, asupra<br />

gramaticii G 1 se aplică propoziţia 5.6 pentru a obţine G 2 ce are numai simboluri<br />

accesibile din simbolul de start. Dacă, gramatica nu are redenumiri şi nici λ-<br />

producţii, atunci s-a obţinut o gramatică proprie (definiţia 5.4, teorema 5.1).<br />

Cerinţa 5.8<br />

Fie G = (Ω, Σ, S, P) o gramatică independentă de context cu L(G) ≠ ∅. Există<br />

G 1 = (Ω 1 , Σ 1 , S, P 1 ) echivalentă cu G care este gramatică proprie.<br />

Exemplul 5.1<br />

Simbolurile neutilizabile ale gramaticii cu mulţimea de reguli {(S, A), (S, B),<br />

(A, aB), (A, bS), (A, b), (B, AB), (B, Ba), (C, AS), (C, b)} sunt B, a şi C.<br />

Exemplul 5.2<br />

După eliminarea λ-producţiilor, gramatica cu regulile {(S, aSbS), (S, bSaS),<br />

(S, λ)} devine echivalentă cu gramatica cu regulile {(S’, S), (S’, λ), (S, aSbS), (S,<br />

aSb), (S, abS), (S, ab), (S, bSaS), (S, baS), (S, bSa), (S, ba)}.<br />

Exemplul 5.3<br />

Fie gramatica G cu mulţimea de reguli P = {(S, A), (A, bS), (A, b)}.<br />

Gramatica proprie echivalentă cu G are mulţimea regulilor P’ = {(S, bS), (S, b)},<br />

iar A este un simbol neutilizabil.<br />

6. Forme normale. Lema Bar-Hillel<br />

Observaţia 6.1<br />

Este suficient să se lucreze cu mecanisme generative echivalente cu<br />

gramaticile proprii (obţinute după transformările necesare).<br />

Cerinta 6.1<br />

Fie G = (Ω, Σ, S, P) o gramatică proprie. Atunci există G 1 gramatică în forma<br />

normală Chomsky echivalentă cu G.<br />

Demonstraţie. Prin aplicarea propoziţiei 2.2 putem considera că mulţimea P<br />

conţine numai reguli de forma A ::= X 1 X 2 …X m (m > 1) şi A ::= a, cu A, X 1 , …, X m<br />

∈ Ω, a ∈ Σ. Regulile pentru care m = 2 rămân nemodificate în P 1 . Dacă m > 2,<br />

considerăm m - 2 neterminale noi şi pentru regula curentă adaugăm în P 1 cele m - 1<br />

reguli: A ::= X 1 D 1 , D 1 ::= X 2 D 3 , …, D m-3 ::= X m-2 D m-2 , D m-2 ::= X m-1 X m .<br />

Este uşor de demonstrat că după prelucrarea tuturor regulilor din P, gramatica<br />

obţinută este în forma normală Chomsky şi este echivalentă cu G.<br />

Exemplul 6.1<br />

Fie gramatica cu regulile S ::= bA | aB; A ::= bAA | aS | a; B ::= aBB | bS | b.<br />

Introducem neterminalele noi X a şi X b . Formăm regulile X a ::= a şi X b ::= b. Apoi


modificăm regulile gramaticii iniţiale cu excepţia regulilor A ::= a şi B ::= b.<br />

Obţinem noua mulţime de reguli:<br />

S ::= X b A | X a B;<br />

A ::= X b AA | X a S | a;<br />

B ::= X a BB | X b S | b;<br />

X a ::= a;<br />

X b ::= b.<br />

Introducem noi simboluri neterminale şi modificăm regulile care au în<br />

membrul drept cel puţin trei simboluri. Fie Y 1 şi Y 2 simboluri neterminale noi.<br />

Gramatica în forma normală Chomsky, echivalentă cu gramatica iniţială, are<br />

regulile:<br />

S :;= X b A | X a B;<br />

A ::= X b Y 1 | X a S | a;<br />

B ::= X a Y 2 | X b S | b;<br />

Y 1 ::= AA;<br />

Y 2 ::= BB;<br />

X a ::= a;<br />

X b ::= b.<br />

Cerinta 6.2<br />

Fie G = (Ω, Σ, S, P) o gramatică de tip 2 în forma normală Chomsky. Dacă<br />

derivarea A → w 1 → … → w n , n ≥ 1, w n ∈ Σ*, are proprietatea că cel mai lung lanţ<br />

de la rădăcină la vârfurile terminale în arborele de derivare asociat ei în gramatica<br />

G A = (Ω, Σ, A, P) are k noduri, atunci |w n | ≤ 2 k-1 .<br />

Demonstraţie. Aplicăm metoda inducţiei în raport cu k. Cum n ≥ 1 rezultă k ≥ 2.<br />

Pentru k = 2 rezultă n = 1 şi w 1 ∈ Σ, deoarece G este în forma normală Chomsky,<br />

deci |w 1 | ≤ 2 k-1 . Presupunem afirmaţia adevărată pentru orice întreg m, 2 ≤ m ≤ k,<br />

unde k este un întreg fixat, k ≥ 2. Considerăm o derivare A → w 1 → … → w n , n≥1,<br />

w n ∈ Σ*, care are proprietatea că cel mai lung lanţ de la rădăcină la vârfurile<br />

terminale în arborele de derivare asociat ei are k + 1 noduri. Primul pas al derivării<br />

constă în aplicarea unei reguli de forma A ::= XY cu X şi Y neterminale (gramatica<br />

este în forma normală Chomsky).<br />

Prin aplicarea ipotezei de inducţie asupra arborilor de derivare cu rădăcinile<br />

X şi Y obţinem<br />

|w n | ≤ 2 k-1 + 2 k-1 = 2 k ,<br />

deci<br />

|w n | ≤ 2 (k+1)-1 .<br />

Cerinta 6.3<br />

Fie gramatica proprie G = (Ω, Σ, S, P) şi A ::= α 1 Bα 2 o A-producţie şi B ::=<br />

β 1 | β 2 | … β k toate B-producţiile din mulţimea P. Considerăm G 1 = (Ω, Σ, S, P 1 )<br />

unde P 1 = (P – {A ::= α 1 Bα 2 }) ∪ {A ::= α 1 β 1 α 2 | α 1 β 2 α 2 |… | α 1 β k α 2 }. Atunci G şi<br />

G 1 sunt gramatici echivalente.<br />

Demonstraţie. Se arată, prin dublă incluziune, că L(G) = L(G 1 ).


Cerinta 6.4<br />

Fie gramatica fără λ-producţii şi numai cu simboluri utilizabile, G = (Ω, Σ, S,<br />

P) şi A ::= Aα 1 | Aα 2 … | Aα k toate A-producţiile recursive la stânga şi A ::= β 1 |<br />

β 2 | … β m restul A-producţiilor din mulţimea P. Fie X un simbol nou, X ∉ Ω ∪ Σ,<br />

Ω 1 = Ω ∪ {X} şi gramatica G 1 = (Ω 1 , Σ, S, P 1 ), unde P 1 se obţine din P prin<br />

înlocuirea tuturor A-producţiilor cu regulile: A ::= β 1 | β 2 | … β m , A ::= β 1 X | β 2 X |<br />

… β m X şi X ::= α 1 | α 2 … | α k , X ::= α 1 X | α 2 X … | α k X.<br />

Atunci G şi G 1 sunt echivalente.<br />

Demonstraţie. Se arată că L(G) = L(G 1 ).<br />

Cerinta 6.5<br />

Fie G = (Ω, Σ, S, P) o gramatică proprie. Atunci există gramatica G*, în<br />

forma normală Greibach, echivalentă cu G.<br />

Demonstraţie. Se aplică algoritmul:<br />

Intrare: Gramatica G 1 în forma normală Chomsky, nerecursivă la stânga, fără λ-<br />

producţii, Ω 1 = {A 1 , A 2 , …., A m }, S 1 ≡ A 1 .<br />

Ieşire: Gramatica G* în forma normală Greibach.<br />

SEQ<br />

1. P* := P 1 ; i := m;<br />

2. while i > 1 do<br />

SEQ<br />

i := i - 1;<br />

while (există j, i < j ≤ m, A i ::= A j α în P*) do<br />

P* := (P* - {A i ::= A j α}) ∪ {A i ::= βα | A j ::= β ∈ P*}<br />

END<br />

3. for indici i ai simbolurilor Y do<br />

while (există j, 1 ≤ j ≤ m, Y i ::= A j α ∈ P*) do<br />

P* := (P* - { Y i ::= A j α }) ∪ {Y i ::= βα | A j ::= β ∈ P*}<br />

END.<br />

Exemplul 6.2<br />

Fie gramatica G, cu simbolurile neterminale numerotate şi regulile: A 1 ::=<br />

A 2 A 3 ; A 2 ::= A 3 A 1 | b; A 3 ::= A 1 A 2 | a.<br />

Se observă că gramatica G, deşi are reguli de tip FNC, este recursivă în mai<br />

mulţi paşi.<br />

Considerăm regula A 3 ::= A 1 A 2 şi o înlocuim cu A 3 ::= A 2 A 3 A 2 , prin<br />

aplicarea lemei 6.1. Observăm că în continuare persistă recursivitatea în mai mulţi<br />

paşi. Considerăm regula A 3 ::= A 2 A 3 A 2 şi o înlocuim, folosind lema 6.1, cu regulile<br />

A 3 ::= A 3 A 1 A 3 A 2 | bA 3 A 2 . Observăm că am ajuns la reursivitate într-un singur pas<br />

şi putem aplica lema 6.2. Eliminăm regula A 3 ::= A 3 A 1 A 3 A 2 şi introducem regulile<br />

A 3 ::= bA 3 A 2 Y 3 | aY 3 ; Y 3 ::= A 1 A 3 A 2 Y 3 | A 1 A 3 A 2 . Am obţinut următoarea mulţime<br />

de reguli:<br />

A 1 ::= A 2 A 3 ;<br />

A 2 := A 3 A 1 | b;<br />

A 3 ::= bA 3 A 2 Y 3 | aY 3 | bA 3 A 2 | a<br />

Y 3 ::= A 1 A 3 A 2 Y 3 | A 1 A 3 A 2 .


În continuare aplicăm algoritmul din demonstraţia teoremei 6.3. Eliminăm<br />

regula A 2 ::= A 3 A 1 şi adăugăm regulile: A 2 ::= bA 3 A 2 Y 3 A 1 | aY 3 A 1 | bA 3 A 2 A 1 | aA 1 .<br />

Observăm că A 2 ::= b rămâne pe loc. Apoi regula A 1 ::= A 2 A 3 se elimină şi se<br />

introduc regulile: A 1 ::= bA 3 A 2 Y 3 A 1 A 3 | aY 3 A 1 A 3 | bA 3 A 2 A 1 A 3 | aA 1 A 3 | bA 3 . Până<br />

acum am aplicat pasul 2 cu indicii i =2 şi 1.<br />

Aplicăm, în continuare, pasul 3 pentru Y 3 . Astfel regulile<br />

Y 3 ::= A 1 A 3 A 2 Y 3 | A 1 A 3 A 2<br />

se înlocuiesc cu<br />

Y 3 ::= bA 3 A 2 Y 3 A 1 A 3 A 3 A 2 Y 3 | aY 3 A 1 A 3 A 3 A 2 Y 3 | bA 3 A 2 A 1 A 3 A 3 A 2 Y 3 |<br />

aA 1 A 3 A 3 A 2 Y 3 | bA 3 A 3 A 2 Y 3 | bA 3 A 2 Y 3 A 1 A 3 A 3 A 2 | aY 3 A 1 A 3 A 3 A 2 |<br />

bA 3 A 2 A 1 A 3 A 3 A 2 | aA 1 A 3 A 3 A 2 | bA 3 A 3 A 2 .<br />

Gramatica G*, în forma normală Greibach, echivalentă cu gramatica dată, are<br />

regulile:<br />

A 1 ::= bA 3 A 2 Y 3 A 1 A 3 | aY 3 A 1 A 3 | bA 3 A 2 A 1 A 3 | aA 1 A 3 | bA 3 ;<br />

A 2 ::= bA 3 A 2 Y 3 A 1 | aY 3 A 1 | bA 3 A 2 A 1 | aA 1 | b;<br />

A 3 ::= bA 3 A 2 Y 3 | aY 3 | bA 3 A 2 | a<br />

Y 3 ::= bA 3 A 2 Y 3 A 1 A 3 A 3 A 2 Y 3 | aY 3 A 1 A 3 A 3 A 2 Y 3 | bA 3 A 2 A 1 A 3 A 3 A 2 Y 3 |<br />

aA 1 A 3 A 3 A 2 Y 3 | bA 3 A 3 A 2 Y 3 | bA 3 A 2 Y 3 A 1 A 3 A 3 A 2 | aY 3 A 1 A 3 A 3 A 2 |<br />

bA 3 A 2 A 1 A 3 A 3 A 2 | aA 1 A 3 A 3 A 2 | bA 3 A 3 A 2 .<br />

Trebuie observat că, în general, procesul de normalizare, conduce la creşterea<br />

numărului neterminalelor dar şi a regulilor. Astfel cresc măsurile Var şi Prod.<br />

Cerinta 6.6 [Lema Bar-Hillel]<br />

Fie L un limbaj independent de context oarecare. Atunci există numerele<br />

naturale p = p(L) şi q = q(L) astfel încât orice cuvânt w ∈ L cu |w| > p se poate<br />

descompune sub forma w = uvxyz, unde |vxy| ≤ q, vy ≠ λ şi pentru oricare număr<br />

natural i, uv i xy i z ∈ L.<br />

Demonstraţie. Dacă λ ∈ L atunci se ia p = p(L’) şi q = q(L’) unde L’ = L – {λ}.<br />

Presupunem că λ ∉ L şi fie G = (Ω, Σ, S, P) o gramatică de tip doi în forma<br />

normală Chomsky astfel încât L = L(G). Dacă |Ω| = n, luăm p = 2 n şi q = 2 n-1 . Fie<br />

w∈ L cu |w| > p. Folosind teorema 6.2 rezultă că cel mai lung lanţ de la rădăcină la<br />

vârfurile terminale, din arborele de derivare al cuvântului w, pornind de la simbolul<br />

de start S, conţine cel puţin n + 2 noduri. În caz contrar ar rezulta că |w| ≤ 2 n .<br />

Deoarece |Ω| = n rezultă că cel mai lung lanţ conţine două noduri n 1 şi n 2<br />

etichetate cu acelaşi neterminal X. Presupunem că nodul n 1 este mai aproape de<br />

rădăcina S decât nodul n 2 şi fie D 1 subarborele de rădăcină n 1 . Evident frontiera lui<br />

D 1 , notată cu a, conform teoremei 6.2, are lungimea (notată cu |a|) cel mult 2 n+1 . Fie<br />

D 2 subarborele cu rădăcina n 2 şi frontiera x. Atunci există v ∈ Σ* şi y ∈ Σ* astfel<br />

încât a = vxy. Evident, v şi y nu pot fi simultan vide pentru că regula care se aplică<br />

din n 1 este de forma X ::= YZ, cu Y şi Z neterminale. Există şi cuvintele u şi z<br />

peste Σ astfel încât S ⎯ ⎯→<br />

* uXy ⎯ ⎯→<br />

* uvXyz ⎯ ⎯→<br />

* uv<br />

2 Xy 2 z ⎯ ⎯→<br />

* … ⎯ ⎯→<br />

*<br />

uv<br />

i xy i z, i≥1. De asemenea, |vxy| = |a| ≤ q, iar vy ≠ λ şi uv i xy i z∈L pentru orice i ≥ 0.<br />

Exemplul 6.3<br />

Un exemplu simplu de limbaj care nu este independent de context este L =<br />

{a n b n c n | n ≥ 1}. Prin reducere la absurd, putem presupune contrariul, adică L este<br />

un limbaj independent de context. Atunci există constantele p şi q date de lema


Bar-Hillel. Se alege un număr natural k > p / 3 şi cuvântul w = a k b k c k de lungime<br />

mai mare ca p. Din descompunerea furnizată de teorema 6.4 rezultă că v şi y conţin<br />

cel mult una din literele a, b sau c; altfel prin iterare nu s-ar mai păstra ordinea<br />

alfabetică. Totuşi prin iterare ar trebui să se obţină acelaşi număr de simboluri a, b<br />

şi c, ori nu pentru orice i ≥ 0 se poate obţine acest lucru. Rezultă că L nu este un<br />

limbaj independent de context.<br />

Cerinta 6.7<br />

Fie G o gramatică independentă de context. Atunci L(G) este infinit dacă şi<br />

numai dacă există w ∈ L(G) astfel încât p < |w| ≤ p + q, unde p şi q sunt numerele<br />

furnizate de teorema 6.4.<br />

Demonstraţie. Dacă L(G) este infinit rezultă că există w ∈ L(G) cu |w| > p,<br />

deoarece Σ este o mulţime finită. Dacă |w| ≤ p + q atunci stop, altfel aplicarea<br />

teoremei 6.4 şi alegerea lui i = 0, în procesul iterativ conduce la un cuvânt mai<br />

scurt, dar de lungime mai mare ca p. După un număr finit de paşi se ajunge la un<br />

cuvânt cu lungimea cel mult p + q. Afirmaţia reciprocă rezultă din aplicarea<br />

teoremei 6.4 şi generarea unui şir infinit de cuvinte prin iteraţie.<br />

7. Gramatici şi automate<br />

Cerinta 7.1<br />

Fie G = (Ω, Σ, S, P) o gramatică liniară la dreapta 7 . Atunci există un automat<br />

finit nedeterminist (deci şi unul determinist) M astfel încât L(M) = L(G).<br />

Demonstraţie. Fără a restrânge generalitatea putem presupune că simbolul S nu<br />

apare în membrul drept al nici unei reguli din P, iar fiecare regulă are una din<br />

formele: A ::=a şi A ::= aB cu A, B ∈ Ω şi a ∈ Σ.<br />

Fie X ∉ Ω ∪ Σ şi automatul finit nedeterminist M = (Ω∪{X}, Σ, δ, S, S 1 )<br />

unde δ : (Ω ∪ {X})xΣ → P(Ω ∪ {X}) este definită prin:<br />

⎧{<br />

A | Y :: = aA∈<br />

P}<br />

∪{<br />

X},<br />

Y ≠ X , Y :: = a ∈ P<br />

⎪<br />

δ ( Y,<br />

a)<br />

= ⎨{<br />

A | Y :: = aA∈<br />

P},<br />

Y ≠ X , Y :: = a ∉ P<br />

⎪<br />

⎩∅,<br />

Y = X ,<br />

iar S 1 = {S, X} dacă S ::= λ ∈ P şi S 1 = {X} dacă S ::= λ ∉ P.<br />

Vom demonstra că L(M) = L(G), prin dublă incluziune. Fie w ∈ Σ*, w ≠ λ,<br />

astfel încât w = a 1 a 2 …a n , n ≥ 1 şi a i ∈ Σ, i = 1, 2, …, n. Atunci w ∈ L(G) dacă şi<br />

numai dacă există producţiile D i ::= a i D i+1 ∈ P, cu D 1 = S, i = 1, 2, …, n-1 şi D n ::=<br />

a n ∈ P. Deci există stările s 1 , s 2 , …, s n+1 , unde s n+1 = X, iar s 1 = S, s n+1 ∈ S 1 , s i+1 ∈<br />

δ(s i , a i ), i = 1, 2, …, n, echivalent cu w ∈ L(M). Este uşor de văzut că dacă w ∈<br />

L(M) atunci w ∈ L(G).<br />

Caz special: Dacă w = λ şi w ∈ L(G) atunci există unica producţie S ::= λ ∈<br />

P, deci S 1 = {S, X}, adică {S} ∩ {S 1 } ≠ ∅, ceea ce este echivalent cu λ ∈ L(M).<br />

Cerinta 7.2<br />

Orice limbaj generat de o gramatică liniară 8 este regulat.<br />

7 A se vedea şi propoziţia 2.5 (manual).


Demonstraţie. Se aplică teorema 3.1, teorema 3.2 şi teorema 7.1 (din manual)<br />

Exemplul 7.1<br />

Fie gramatica G = (Ω, Σ, S, P), unde Ω = {S, A, B}, Σ = {a, b} şi P = { S ::=<br />

aA | a, A ::= bB, B ::= aA | a}.<br />

Un AFN care recunoaşte limbajul L(G) are stările {S, A, B, X}, mulţimea<br />

stărilor finale este {X}, iar funcţia de tranziţie este:<br />

δ A B<br />

S {A, X} ∅<br />

A ∅ {B}<br />

B {A, X} ∅<br />

X ∅ ∅<br />

Cerinta 7.3<br />

Pentru orice limbaj regulat L există o gramatică liniară G astfel încât L=L(G).<br />

Demonstraţie. Fie automatul finit determinist M = (Q, Σ, δ, q 0 , F) astfel încât L =<br />

L(M). Gramatica echivalentă G = (Ω, Σ, S, P) se construieşte astfel: Ω = Q, S = q 0 ,<br />

iar pentru λ ∉ L(M) mulţimea regulilor P este {p ::= aq | δ(p, a) = q} ∪ {p ::= a |<br />

δ(p, a) ∈ F}. Dacă λ ∈ L(M) atunci q 0 ∈ F şi adăugăm un simbol nou S, ca simbol<br />

de start şi regulile S ::= q 0 | λ. Gramatica obţinută este echivalentă cu o gramatică<br />

liniară prin eliminarea redenumirilor şi definiţia 5.1(manual) Egalitatea L(G) =<br />

L(M) rezultă imediat.<br />

Exemplul 7.2<br />

Fie automatul dat prin tabelul<br />

δ a b C<br />

q 0 q 1 Q 0<br />

q 1 q 1 q 2<br />

q 2 q 2 Q 0<br />

Cu starea iniţială q 0 şi F = {q 0 }. Deoarece λ ∈ L(M), în prima fază, rezultă<br />

următoarele reguli:<br />

S ::= q 0 | λ;<br />

q 0 ::= aq 1 | cq 0 | c;<br />

q 1 ::= aq 1 | bq 2 ;<br />

q 2 ::= bq 2 | cq 0 | c.<br />

După eliminarea redenumirilor se obţine:<br />

S ::= aq 1 | cq 0 | c | λ;<br />

q 0 ::= aq 1 | cq 0 | c;<br />

8 Din acest motiv gramaticile liniare se mai numesc şi gramatici regulate. Rezultă, de aici,<br />

că familia limbajelor de tip 3 conţine limbajele finite şi este închisă la operaţiile de<br />

reuniune, produs şi stelare (*). Astfel, limbajele de tip 3 sunt descriptibile cu ajutorul<br />

expresiilor regulate, generabile de gramatici liniare şi recunoscute de sisteme tranziţionale<br />

şi deci de automate finite.


q 1 ::= aq 1 | bq 2 ;<br />

q 2 ::= bq 2 | cq 0 | c.<br />

Un automat pushdown (cu memorie locală gestionată prin disciplina LIFO<br />

[eng. Last In First Out] – numită memorie pushdown) citeşte banda de intrare (de<br />

la stânga la dreapta) folosind un număr de stări interne (ca şi un AFD sau AFN),<br />

dar tranziţia, în general nedeterministă, se face nu numai în raport cu starea<br />

anterioară şi informaţia curentă de pe banda de intrare, ci şi în funcţie de cea mai<br />

recentă informaţie stocată în memoria auxiliară (prelucrată ca o stivă de capacitate<br />

infinită).<br />

Observaţia 7.1<br />

Mişcarea automatului este posibilă numai dacă memoria stivă este nevidă.<br />

Exemplul 7.3<br />

Fie Q = {q 0 , q 1 , q 2 }, Σ = {a, b}, Γ = {a, Z 0 }, F = {q 0 } şi funcţia de tranziţie δ<br />

definită astfel: δ(q 0 , a, Z 0 ) = {(q 1 , aZ 0 )}, δ(q 1 , a, a) = {(q 1 , aa)}, δ(q 1 , b, a) = {(q 2 ,<br />

λ)}, δ(q 2 , b, a) = {(q 2 , λ)}, δ(q 2 , λ, Z 0 ) = {(q 0 , λ)}, δ(q, x, Z 0 ) = ∅ în celelalte<br />

cazuri. Fie M = (Q, Σ, Γ, δ, q 0 , Z 0 , F). Se poate arăta că L(M) = {a n b n | n ≥ 0}.<br />

Cerinta 7.4 [Un limbaj recunoscut de un APD cu stări finale poate fi recunoscut şi<br />

de un APD cu memoria pushdown vidă]<br />

Fie L(M) limbajul recunoscut de automatul pushdown M = (Q, Σ, Γ, δ, q 0 , Z 0 ,<br />

F). Atunci există un APD, notat M’=(Q’, Σ, Γ’, δ’, q init , X, ∅), care recunoaşte<br />

L(M) cu memoria pushdown vidă, adică L λ (M’) = L(M).<br />

Demonstraţie. Fie Q’ = Q ∪ {q init , q λ } unde q init şi q λ sunt două elemente distincte<br />

şi noi în raport cu Q. De asemenea, considerăm X un simbol nou în raport cu Γ şi<br />

formăm Γ’ = Γ∪{X}. Dacă definim δ’ ca mai jos atunci se poate demonstra, prin<br />

dublă incluziune – vezi Popovici şi colectiv(1991), că L λ (M’) = L(M). Funcţia δ’<br />

acţionează conform următoarelor şapte legi:<br />

a) δ’(q init , λ, X) = {(q 0 , Z o X)};<br />

b) δ’(q, a, Z) = δ(q, a, Z), pentru oricare q, a şi Z astfel încât q ∈ Q, a ∈ Σ,<br />

Z∈Γ;<br />

c) δ’(q, λ, Z) = δ(q, λ, Z) dacă q ∈ Q – F şi Z ∈ Γ;<br />

d) δ’(q, λ, Z) = δ(q, λ, Z) ∪ {(q λ, λ)} dacă q ∈ F şi Z ∈ Γ;<br />

e) δ’(q, λ, X) = {(q λ, λ)} dacă q ∈ F;<br />

f) δ’(q λ , λ, Z) = {(q λ, λ)} dacă Z ∈ Γ∪{X};<br />

g) δ’(q, a, Z) = ∅ în toate celelalte cazuri.<br />

Cerinta 7.5 [Un limbaj recunoscut de un APD cu memoria pushdown vidă poate fi<br />

recunoscut şi de un APD cu stări finale]<br />

Fie L λ (M) limbajul recunoscut de automatul pushdown M = (Q, Σ, Γ, δ, q 0 ,<br />

Z 0 , ∅). Atunci există un APD, notat M’ = (Q’, Σ, Γ’, δ’, q init , X, {q f }), care<br />

recunoaşte L λ (M) cu starea finală q f , adică L λ (M) = L(M’).<br />

Demonstraţie. Fie Q’ = Q ∪ {q init , q f } unde q init şi q f sunt două elemente distincte şi<br />

noi în raport cu Q. De asemenea, considerăm X un simbol nou în raport cu Γ şi<br />

formăm Γ’ = Γ∪{X}. Dacă definim δ’ ca mai jos atunci se poate demonstra, prin


dublă incluziune (conform Popovici şi colectiv(1991)), că L λ (M) = L(M’). Funcţia<br />

δ’ acţionează conform următoarelor patru legi:<br />

a) δ’(q init , λ, X) = {(q 0 , Z o X)};<br />

b) δ’(q, a, Z) = δ(q, a, Z), pentru oricare q, a şi Z astfel încât q ∈ Q, a<br />

∈Σ∪{λ}, Z ∈ Γ;<br />

c) δ’(q, λ, X) = {(q f , λ)}, dacă q ∈ Q;<br />

d) δ’(q, a, Z) = ∅, în toate celelalte cazuri.<br />

Cerinta 7.6<br />

Pentru orice gramatică independentă de context G = (Ω, Σ, S, P) care<br />

generează limbajul L = L(G) există un sistem APD care recunoaşte L.<br />

Demonstraţie. Presupunem că P conţine reguli de forma u ::= v, cu |u| = 1 şi v ∈ (Ω<br />

∪ Σ)*. Construim automatul M = ({q}, Σ, Ω ∪ Σ, δ, q, S, ∅) cu funcţia de tranziţie<br />

definită prin următoarele trei reguli:<br />

1. [expandare] δ(q, λ, X) = {(q, α) | (X ::= α) ∈ P} pentru toate regulile<br />

mulţimii P;<br />

2. [reducere] δ(q, a, a) = {(q, λ)}, dacă a ∈ Σ;<br />

3. [altfel] δ(q, a, X) = ∅, în toate celelalte cazuri.<br />

Se arată, prin dublă incluziune, folosind metoda inducţiei complete (vezi Popovici<br />

şi colectiv(1991)), că L(G) = L λ (M).<br />

Exemplul 7.4<br />

Fie gramatica G = ({S, A}, {0, 1, 2}, S, P) unde P constă din producţiile: S<br />

::= S2 | A2; A ::= 0A1 | 01. Se observă că L(G) = {0 n 1 n 2 m | n, m ≥ 1}.<br />

Sistemul APD care recunoaşte limbajul L(G) este M = ({q}, {0, 1, 2}, {S, A,<br />

0, 1, 2}, δ, q, S, ∅) unde δ are următoarea definiţie:<br />

δ(q, λ, S) = {(q, S2), {q, A2)};<br />

δ(q, λ, A) = {(q, 0A1), (q, 01)};<br />

δ(q, 0, 0) = {(q, λ)};<br />

δ(q, 1, 1) = {(q, λ)};<br />

δ(q, 2, 2) = {(q, λ)};<br />

δ(q, 0, 1) = δ(q, 0, 2) = δ(q, 0, S) = δ(q, 0, A) = ∅;<br />

δ(q, 1, 0) = δ(q, 1, 2) = δ(q, 1, S) = δ(q, 1, A) = ∅;<br />

δ(q, 2, 0) = δ(q, 2, 1) = δ(q, 2, S) = δ(q, 2, A) = ∅.<br />

Cerinta 7.7<br />

Pentru orice sistem APD care recunoaşte limbajul L cu memoria pushdown<br />

vidă, există o gramatică independentă de context care generează limbajul L.<br />

Demonstraţie. Fie M = (Q, Σ, Γ, δ, q 0 , Z 0 , ∅) un APD astfel încât L = L λ (M).<br />

Construim gramatica G = (Ω, Σ, S, P) cu reguli de forma u ::= v astfel încât |u| = 1,<br />

v ∈ (Ω∪Σ)*. Fie S un simbol special astfel încât S ∉ QxΓxQ ∪ Σ. Considerăm<br />

mulţimea simbolurilor neterminale ca fiind Ω = QxΓxQ ∪ {S}, iar fiecare element<br />

din QxΓxQ de forma (q, Z, r) îl vom scrie compact sub forma [qZr]. Producţiile din<br />

mulţimea P se definesc folosind următoarele reguli:<br />

1. [Start] Pentru fiecare q ∈ Q introducem producţia S ::= [q 0 Z 0 q].


2. [Ştergere] Pentru oricare a ∈ Σ ∪ {λ} astfel încât (r, λ) ∈ δ(q, a, Z) se<br />

introduce producţia [qZr] ::= a.<br />

3. [Compunere] Pentru oricare a ∈ Σ ∪ {λ} pentru care (r, α 1 α 2 …α k ) ∈<br />

δ(q, a, Z), unde α i ∈ Γ (i = 1, 2, …, k), considerăm toate combinaţiile de<br />

k stări s 1 , s 2 , …, s k pentru a forma producţii de forma [qZs k ] ::= a[rα 1 s 1 ]<br />

[s 1 α 2 s 2 ]…[s k-1 α k s k ], unde k > 0.<br />

Prin inducţie completă în raport cu numărul de tranziţii (respectiv în raport cu<br />

lungimea derivării) se arată că L λ (M) ⊆ L(G) (respectiv L(G) ⊆ L λ (M)). Pentru<br />

detalii se poate consulta Popovici şi colectiv(1991).<br />

Exemplul 7.5<br />

Fie Q = {q 0 , q 1 , q 2 }, Σ = {a, b}, Γ = {a, Z 0 }, şi funcţia de tranziţie δ definită<br />

astfel: δ(q 0 , a, Z 0 ) = {(q 1 , aZ 0 )}, δ(q 1 , a, a) = {(q 1 , aa)}, δ(q 1 , b, a) = {(q 2 ,λ)}, δ(q 2 ,<br />

b, a) = {(q 2 ,λ)}, δ(q 2 , λ, Z 0 ) = {(q 0 ,λ)}, δ(q, x, Z 0 ) = ∅, în celelalte cazuri. Fie M =<br />

(Q, Σ, Γ, δ, q 0 , Z 0 , ∅). Se poate arăta că L λ (M) = {a n b n | n ≥ 0}. A se vedea şi<br />

exemplul 7.3.<br />

Gramatica de tip doi care recunoaşte limbajul L λ (M), construită pe baza<br />

metodei dată de demonstraţia teoremei 7.7 are 24 de producţii, după cum urmează.<br />

Conform [Start] introducem trei producţii:<br />

S ::= [q 0 Z 0 q 0 ] | [q 0 Z 0 q 1 ] | [q 0 Z 0 q 0 ].<br />

Conform [Compunere] pentru δ(q 0 , a, Z 0 ) = {(q 1 , aZ 0 )} introducem<br />

următoarele nouă producţii:<br />

[q 0 Z 0 q 0 ] ::= a [q 1 aq 0 ] [q 0 Z 0 q 0 ]; [q 0 Z 0 q 0 ] ::= a [q 1 aq 1 ] [q 1 Z 0 q 0 ];<br />

[q 0 Z 0 q 0 ] ::= a [q 1 aq 2 ] [q 2 Z 0 q 0 ]; [q 0 Z 0 q 1 ] ::= a [q 1 aq 0 ] [q 0 Z 0 q 1 ];<br />

[q 0 Z 0 q 1 ] ::= a [q 1 aq 1 ] [q 1 Z 0 q 1 ]; [q 0 Z 0 q 1 ] ::= a [q 1 aq 2 ] [q 2 Z 0 q 1 ];<br />

[q 0 Z 0 q 2 ] ::= a [q 1 aq 0 ] [q 0 Z 0 q 2 ]; [q 0 Z 0 q 2 ] ::= a [q 1 aq 1 ] [q 1 Z 0 q 2 ];<br />

[q 0 Z 0 q 2 ] ::= a [q 1 aq 2 ] [q 2 Z 0 q 2 ];<br />

Folosind [Compunere] pentru δ(q 1 , a, a) = {(q 1 , aa)} obţinem încă nouă<br />

producţii:<br />

[q 1 Z 0 q 0 ] ::= a [q 1 aq 0 ] [q 0 aq 0 ]; [q 1 Z 0 q 0 ] ::= a [q 1 aq 1 ] [q 1 aq 0 ];<br />

[q 1 Z 0 q 0 ] ::= a [q 1 aq 2] [q2aq 0 ]; [q 1 Z 0 q 1 ] ::= a [q 1 aq 0 ] [q 0 aq 1 ];<br />

[q 1 Z 0 q 1 ] ::= a [q 1 aq 1 ] [q 1 aq 1 ]; [q 1 Z 0 q 1 ] ::= a [q 1 aq 2 ] [q 2 aq 1 ];<br />

[q 1 Z 0 q 2 ] ::= a [q 1 aq 0 ] [q 0 aq 2 ]; [q 1 Z 0 q 2 ] ::= a [q 1 aq 1 ] [q 1 aq 2 ];<br />

[q 1 Z 0 q 2 ] ::= a [q 1 aq 2 ] [q 2 aq 2 ];<br />

Aplicăm regula [Ştergere] pentru δ(q 1 , b, a) = {(q 2 , λ)} şi δ(q 2 , b, a) = {(q 2 , λ)}.<br />

Obţinem producţiile: [q 1 aq 2 ] ::= b şi [q 2 aq 2 ] ::= b.<br />

Pentru tranziţia δ(q 2 , λ, Z 0 ) = {(q 0 ,λ)}, obţinem producţia: [q 2 Z 0 q 0 ] ::= λ.<br />

Evident, λ-producţiile pot fi eliminate şi se obţine o gramatică de tip doi, dar<br />

foarte complexă (în sensul că mărimea mulţimilor Ω şi P este considerabilă).<br />

Comparaţi cu gramatica obţinută printr-o simplă modificare a gramaticii din<br />

exemplul 2.2 (manual).<br />

Observaţia 7.2<br />

Fie M = (Q, Σ, Γ, δ, q 0 , B, ∅) un sistem MT. Atunci L(M) = ∅.<br />

Observaţia 7.3<br />

Fie M = (Q, Σ, Γ, δ, q 0 , B, Q) un sistem MT. Atunci L(M) = Σ*.<br />

Observaţia 7.4<br />

Introducerea nedeterminismului asupra sistemelor MT nu creşte puterea de<br />

acceptare. Mai precis, are loc:


Cerinta 7.8<br />

Pentru orice maşină Turing M există o gramatică G, de tip 0, astfel încât<br />

L(M) = L(G).<br />

Demonstraţie. Se poate urmări Hopcroft şi Ullman(1979).<br />

Cerinta 7.9<br />

Următoarele afirmaţii sunt adevărate.<br />

a) Pentru orice gramatică dependentă de context (de tip 1) G = (Ω, Σ, S, P)<br />

există o gramatică monotonă G’ = (Ω, Σ, S, P’) astfel încât L(G’) = L(G)<br />

– {λ}.<br />

b) Pentru orice automat liniar mărginit M există o gramatică monotonă G<br />

astfel încât L(M) = L(G).<br />

Demonstraţie. Pentru a) se poate consulta, de exemplu, lucrarea Jucan şi Andrei<br />

(2002). Pentru b) recomandăm studierea lucrării Hopcroft şi Ullman (1979).<br />

Exemplul 7.6<br />

O maşină Turing care acceptă limbajul L = {a n b n c n | n > 0} este M = (Q, Σ, Γ,<br />

δ, q 0 , B, F), unde Q = {q 0 , q 1 , q 2 , q 3 , q 4 , q 5 }, Σ = {a, b, c}, Γ = {a, b, c, x, y, z, B}, F<br />

= {q 5 }, iar δ este dată prin tabelul:<br />

δ A B c x Y z B<br />

q 0 (q 1 ,x,D) ∅ ∅ ∅ (q 4 ,y,D) ∅ ∅<br />

q 1 (q 1 , a, D) (q 2 , y, D) ∅ ∅ (q 1 ,y,D) ∅ ∅<br />

q 2 ∅ (q 2 , b, D) (q 3 , z, S) ∅ ∅ (q 2 ,z,D) ∅<br />

q 3 (q 3 , a, S) (q 3 , b, S) ∅ (q 0 ,z,D) (q 3 ,y,S) (q 3 ,z,S) ∅<br />

q 4 ∅ ∅ ∅ ∅ (q 4 ,y,D) (q 4 ,z,D) (q 5 ,B,D)<br />

q 5 ∅ ∅ ∅ ∅ ∅ ∅ ∅<br />

8. Proprietăţi de închidere<br />

Cerinta 8.1<br />

Familia limbajelor dependente de context este închisă faţă de reuniune.<br />

Demonstraţie. Fie L 1 şi L 2 două limbaje dependente de context generate de<br />

gramaticile G 1 = (Ω 1 , Σ 1 , S 1 , P 1 ) şi G 2 = (Ω 2 , Σ 2 , S 2 , P 2 ) astfel încât gramaticile G 1<br />

= (Ω 1 , Σ 1 , S 1 , P 1 – {S 1 ::= λ}) şi G 2 = (Ω 2 , Σ 2 , S 2 , P 2 - {S 2 ::= λ}) să fie dependente<br />

de context, iar Ω 1 ∩ Ω 2 = ∅, Ω 1 ∩ Σ 2 = ∅ şi Ω 2 ∩ Σ 1 = ∅. Fie S ∉ Ω 1 ∪ Ω 2 ∪ Σ 1<br />

∪ Σ 2 .<br />

Formăm gramatica G = (Ω 1 ∪ Ω 2 ∪{S}, Σ 1 ∪Σ 2 , S, P) unde P = (P 1 – {S 1 ::=<br />

λ}) ∪ (P 2 – {S 2 ::= λ}) ∪ {S::= w | S 1 ::= w ∈ P 1 sau S 2 ::= w ∈ P 2 }.<br />

Arătăm că L = L 1 ∪ L 2 este generat de gramatica G.<br />

Evident G, fără producţia S ::= λ, este dependentă de context (a se vedea<br />

definiţia 5.1(manual), pentru legătura cu limbajele dependente de context).<br />

Fie w ∈ L(G). Presupunem că w ≠ λ. Atunci există o derivare S ⎯ ⎯→<br />

* w. La<br />

primul pas se poate aplica, fie o producţie din P1, fie o producţie din P 2 .<br />

Presupunem că iniţial se aplică o producţie din P 1, următoarele producţii sunt tot<br />

din P1, deoarece Ω ⎯ ⎯→<br />

*<br />

1 ∩ Ω 2 = ∅. Rezultă că S 1 w, adică w ∈ L(G 1 ). Analog


pentru aplicarea primei producţii din P 2 . Dacă w = λ atunci S ::= λ, adică S 1 ::= λ<br />

sau S 2 ::= λ. Deci w ∈ L 1 ∪ L 2 .<br />

Fie w ∈ L 1 ∪ L 2 – {λ}. Atunci w ∈ L 1 (S 1 ⎯→<br />

* w, în G1) sau w ∈ L 2 (S 2<br />

⎯ ⎯→<br />

* w, în G 2 ). Prin înlocuirea primului pas al derivării şi aplicarea producţiei<br />

corespunzătoare din P, obţinem S ⎯ ⎯→<br />

* w, în G.<br />

Pentru w = λ raţionamentul este banal.<br />

Observaţa 8.1<br />

Enunţul şi demonstraţia de mai sus pot fi refăcute pentru a arăta închiderea la<br />

reuniune a familiilor L 2 şi L 3.<br />

Conform teoremei 3.3 (manul), familia limbajelor regulate este cea mai mică<br />

familie de limbaje care conţine limbajele finite şi este închisă la reuniune, produs<br />

(concatenare) şi la operaţia * (închiderea Kleene). Trebuie remarcat că familia L 3<br />

include strict familia limbajelor finite.<br />

Cerinta 8.2<br />

Fie Σ un alfabet şi L ⊆ Σ* un limbaj regulat. Atunci Σ* - L este un limbaj<br />

regulat<br />

Demonstraţie. Dacă L este un limbaj regulat aunci există M = (Q, Σ, δ, q 0 , F) un<br />

sistem AFD astfel încât L(M) = L. Atunci sistemul M 1 = (Q, Σ, δ, q 0 , Q - F) este<br />

considerat astfel încât L(M 1 ) = Σ* - L.<br />

Cerinta 8.3<br />

Familia limbajelor regulate este închisă la operaţia de intersecţie.<br />

Demonstraţie. Se foloseşte faptul că A ∩ B = C(CA ∪ CB), unde prin CX se<br />

notează complementara mulţimii X.<br />

Observaţia 8.2<br />

Familia limbajelor regulate peste un alfabet Σ, fiind închisă la reuniune,<br />

intersecţie şi complementară, formează o algebră booleană în care suma booleană<br />

este reuniunea, produsul boolean este intersecţia, iar complementul unui element<br />

este obţinut prin formarea limbajului complementar (diferenţa până la Σ*.)<br />

Cerinta 8.4<br />

Familia L 2 este închisă la reuniune.<br />

Demonstraţie. Fie L 1 şi L 2 două limbaje independente de context generate de<br />

gramaticile G 1 = (Ω 1 , Σ 1 , S 1 , P 1 ) şi G 2 = (Ω 2 , Σ 2 , S 2 , P 2 ) astfel încât gramaticile G 1<br />

= (Ω 1 , Σ 1 , S 1 , P 1 – {S 1 ::= λ}) şi G 2 = (Ω 2 , Σ 2 , S 2 , P 2 - {S 2 ::= λ}) să fie<br />

independente de context, iar Ω 1 ∩ Ω 2 = ∅, Ω 1 ∩ Σ 2 = ∅ şi Ω 2 ∩ Σ 1 = ∅. Fie S ∉<br />

Ω 1 ∪ Ω 2 ∪ Σ 1 ∪Σ 2 . Formăm gramatica G = (Ω 1 ∪ Ω 2 ∪{S}, Σ 1 ∪ Σ 2 , S, P) unde<br />

P = P 1 ∪ P 2 ∪ {S::= S 1 , S::= S 2 }. Este uşor de arătat că L = L 1 ∪ L 2 este generat de<br />

gramatica G. Evident redenumirile pot fi eliminate (propoziţia 5.3 - manual), dacă<br />

acest lucru este necesar în aplicaţii.<br />

Cerinta 8.5<br />

Familia L 2 este închisă la concatenare (produs).


Demonstraţie. Fie L 1 şi L 2 două limbaje independente de context generate de<br />

gramaticile G 1 = (Ω 1 , Σ 1 , S 1 , P 1 ) şi G 2 = (Ω 2 , Σ 2 , S 2 , P 2 ) astfel încât gramaticile G 1<br />

= (Ω 1 , Σ 1 , S 1 , P 1 – {S 1 ::= λ}) şi G 2 = (Ω 2 , Σ 2 , S 2 , P 2 - {S 2 ::= λ}) să fie<br />

independente de context, iar Ω 1 ∩ Ω 2 = ∅, Ω 1 ∩ Σ 2 = ∅ şi Ω 2 ∩ Σ 1 = ∅. Fie S ∉<br />

Ω 1 ∪ Ω 2 ∪ Σ 1 ∪Σ 2 . Formăm gramatica G = (Ω 1 ∪ Ω 2 ∪{S}, Σ 1 ∪ Σ 2 , S, P) unde<br />

P = P 1 ∪ P 2 ∪ {S::= S 1 S 2 }. Este uşor de arătat că L = L 1 L 2 este generat de<br />

gramatica G.<br />

Cerinta 8.6<br />

Familia L 2 este închisă la operaţia * (stelare).<br />

Demonstraţie. Fie L un limbaj independent de context generat de gramatica G 1 =<br />

(Ω 1 , Σ 1 , S 1 , P 1 ) astfel încât gramatica G 1 = (Ω 1 , Σ 1 , S 1 , P 1 – {S 1 ::= λ}) este<br />

independentă de context,. Fie S ∉ Ω 1 ∪ Σ 1 . Formăm gramatica G = (Ω 1 ∪ {S}, Σ 1 ,<br />

S, P) unde P = P 1 ∪ {S::= SS 1 | λ}. Este uşor de arătat că L* este generat de<br />

gramatica G. Evident λ-producţiile pot fi eliminate (propoziţia 5.4 - manual), dacă<br />

acest lucru este necesar în aplicaţii.<br />

Observaţia 8.3<br />

Dacă L este un limbaj de tip i (i = 2 sau 3) atunci L + este de tip i.<br />

Cerinta 8.7<br />

Familia L 2 nu este închisă la intersecţie şi complementară.<br />

Demonstraţie. Considerăm limbajele independente de context L 1 = {a n b m c m | n ≥ 1,<br />

m ≥ 1} şi L 2 = {a n b n c m | n ≥ 1, m ≥ 1} generate de gramaticile G 1 = ({S 1 , A 1 , B 1 },<br />

{a, b, c}, S 1 , {S 1 ::= A 1 B 1 , A 1 ::= aA 1 | a, B 1 ::= bB 1 c | bc}) şi G 2 = ({S 2 , A 2 , B 2 },<br />

{a, b, c}, S 2 , {S 2 ::= A 2 B 2 , A 2 ::= aA 2 b | ab, B 2 ::= cB 2 | c}). Evident L 1 ∩ L 2 =<br />

{a n b n c n | n ≥ 1} care nu este independent de context, după cum a fost justificat în<br />

exemplul 6.3. Deci L 2 nu este închisă la intersecţie. Dacă L 2 ar fi închisă la<br />

complementară, atunci ar trebui să fie închisă şi la intersecţie deoarece L 2 este<br />

închisă la reuniune, iar în teoria mulţimilor are loc relaţia A ∩ B = C(CA ∪ CB).<br />

Folosind principiul reducerii la absurd deducem că L 2 nu este închisă la<br />

complementară.<br />

Cerinta 8.8<br />

Fie L ∈ L 2 şi R ∈ L 3 , L 1 = L ∩ R şi L 2 = L – R. Atunci L i ∈ L 2 (i = 1, 2).<br />

Demonstraţie. Este suficient să demonstrăm că L 1 ∈ L 2 . Deoarece familia L 3 este<br />

închisă la complementară (R ∈ L 3 conduce la CR ∈ L 3 ), iar L – R = L ∩ CR, va<br />

rezulta că şi L 2 ∈ L 2 .<br />

Fără a restrânge generalitatea putem continua în următoarele ipoteze: a) L şi<br />

R sunt limbaje peste acelaşi alfabet Σ; b) mulţimea L ∪ R nu conţine cuvântul vid<br />

λ.<br />

Fie M = (Q, Σ, δ, q 0 , F) sistemul AFD care recunoaşte limbajul R, L(M) = R.<br />

Dacă F = {f 1 , f 2 , …, f m } atunci fie M i =(Q, Σ, δ, q 0 , {f i }) şi R i = L(M i ), i = 1, 2, …,<br />

m. Fie G = (Ω, Σ, S, P) o gramatică de tip 2, în forma normală Chomsky, care<br />

generează limbajul L, L(G) = L. Este evident că L ∩ R = (L ∩ R 1 ) ∪ (L ∩ R 2 ) ∪<br />

… ∪ (L ∩ R m ). Prin urmare este suficient să arătam că L i = (L ∩ R i ) este


independent de context, cu i oarecare în mulţimea {1, 2, …, m}. Invocarea<br />

proprietăţii de închidere a familiei L 2 la reuniune va încheia demonstraţia.<br />

Construim G 1 = (Ω 1 , Σ, S 1 , P 1 ) gramatica independentă de context astfel încât<br />

Ω 1 = (Ω ∪ Σ) x Q x Q, S 1 = (S, q 0 , f i ) şi P 1 conţine toate producţiile de forma:<br />

a. (A, q, q 1 ) ::= (B, q, q 2 ) (C, q 2 , q 1 ), unde q, q 1 , q 2 ∈ Q, iar A ::= BC ∈ P.<br />

b. (A, q, q 1 ) ::= (a, q, q 1 ), unde q, q 1 ∈ Q, iar A ::= a ∈ P.<br />

c. (a, q, q 1 ) ::= a, a ∈ Σ, δ(q, a) = q 1 .<br />

Faptul că L(G 1 ) = L ∩ R i rezultă din justificarea următoarelor afirmaţii:<br />

a) (A, q i , q j ) ⎯ ⎯→<br />

* (X1, q i , q 1 ) (X 2 , q 1 , q 2 ) … (X n+1 , q n , q j ) ⇔ A<br />

⎯ ⎯→<br />

*<br />

X 1 X 2 … X n+1 , oricare A, X 1 , X 2 , …, X n+1 ∈ Ω, q ∈ Q.<br />

b) (a ⎯ ⎯→<br />

*<br />

1 , q 1 , q 2 ) (a 2 , q 2 , q 3 ) … (a n , q n , q n+1 ) a 1 a 2 …a n ⇔ δ(q 1 , a 1 a 2 …a n ) =<br />

q n+1 .<br />

Într-adevăr, fie w = a ⎯ ⎯→<br />

*<br />

1 a 2 …a n ∈ L(G 1 ), deci S 1 ⎯ ⎯→<br />

* a1a 2 …a n ; (S, q 0 , f i )<br />

(A ⎯ ⎯→<br />

*<br />

1 , q 0 , q 1 ) … (A n , q n-1 , f i ) ⎯ ⎯→<br />

* (a1, q 0 , q 1 ) … (a n , q n-1 , f i ) a 1 a 2 …a n , prin<br />

aplicarea producţiilor în ordinea 1), 2) şi 3), în final. Prin urmare, conform a)<br />

obţinem S ⎯ ⎯→<br />

* A 1 A 2 …A n , iar conform b) rezultă δ(q 1 , a 1 a 2 …a n ) = f i . Cum f i ∈ F<br />

rezultă w ∈ R i . Obţinem, de asemenea, existenţa producţiilor A i ::= a i , i = 1, 2, …,<br />

n. De asemenea rezultă şi S ⎯ ⎯→<br />

* A ⎯ ⎯→<br />

* 1 A 2 …A n a 1 a 2 …a n , echivalent cu w ∈<br />

L. În final obţinem w ∈ L ∩ R i .<br />

În partea a doua a demonstraţiei considerăm w = a 1 a 2 …a n ∈ L ∩ R i . Din w ∈<br />

R i deducem existenţa stărilor q 1 , q 2 , …, q n-1 astfel încât q i = δ(q 0 , a 1 a 2 …a i ), i = 1, 2,<br />

…, n-1. În plus, f i = δ(q 0 , a 1 a ⎯<br />

⎯ ⎯→<br />

* 2…an). Derivarea S ⎯→<br />

* a1a 2 …a n poate fi scrisă<br />

astfel S A ⎯ ⎯→<br />

* 1 A 2 …A n a 1 a 2 …a n . Aceste rezultate permit asamblarea<br />

unei derivări în G 1 ⎯ ⎯→<br />

*<br />

1 : S = (A, q 0 , f i ) ⎯ ⎯→<br />

* (A1, q 0 , q 1 ) … (A n , q n-1 , f i ) (a 1 , q 0 ,<br />

q 1 ) … (a n , q n-1 , f i ) ⎯→<br />

a1a 2 …a n , adică w ∈ L(G 1 ).<br />

U<br />

a∈Σ<br />

* UΣ a<br />

a∈Σ<br />

Cerinta 8.9<br />

Considerăm transformarea de substituire definită asupra limbajelor ca în<br />

definiţia 1.8 - manual. Familia limbajelor independente de context este închisă la<br />

substituţii.<br />

Demonstraţie. Fie L un limbaj independent de context peste Σ, iar pentru fiecare a<br />

∈ Σ, fie Σ a alfabetul asociat lui a. Fie s: Σ* → P(( )*) substituţia lui Σ* în<br />

P(( Σ )*). Evident s are următoarele proprietăţi (din definiţia 1.8):<br />

a<br />

1. pentru oricare a ∈ Σ, s(a) ⊆ Σ a ;<br />

2. s(λ)={λ};<br />

3. pentru oricare i, 1 ≤ i ≤ k, dacă a i ∈ Σ atunci s(a 1 a 2 …a k ) =<br />

s(a 1 )s(a 2 )…s(a k ).<br />

Presupunem că, pentru fiecare a ∈ Σ, s(a) este un limbaj independent de<br />

context. Trebuie să arătăm că s(L) este limbaj independent de context.<br />

Conform ipotezei, există gramaticile G = (Ω, Σ, S, P) şi G a = (Ω a , Σ a , S a , P a )<br />

astfel încât L = L(G) şi s(a) = L(G a ) pentru oricare a ∈ Σ. Presupunem că Ω a ∩ Ω b<br />

= Σ a ∩ Σ b = ∅ pentru a ≠ b şi pentru fiecare a, b ∈ Σ avem Ω a ∩ Σ b = ∅ şi Ω ∩ Ω a<br />

= ∅. Dacă λ ∈ Σ ∪ Σ a (adică S ::= λ ∈ P sau S a ::= λ ∈ P a , a ∈ Σ atunci trebuie ca<br />

(Ω, Σ, S, P-{ S ::= λ}) şi (Ω a , Σ a , S a , P a -{ S a ::= λ}) să fie gramatici independente<br />

de context. Definim transformarea t: Ω ∪ Σ ∪ {λ} → Ω ∪ {S a | a ∈ Σ } ∪ {λ} prin<br />

t(λ) = λ; t(X) = X pentru oricare X∈Ω, t(a)=S a pentru oricare a ∈ Σ astfel încât,


prin extensie, rezultă că pentru oricare x 1 , x 2 , …, x n ∈ Ω ∪ Σ ∪ {λ} are loc relaţia<br />

t(x 1 x 2 …x n ) = t(x 1 )t(x 2 )…t(x n ).<br />

Formăm gramatica G 1 = (Ω 1 , Σ 1 , S, P 1 ) astfel încât Ω 1 := Ω ∪ ( Ω ), Σ<br />

U<br />

a∈Σ<br />

Σ<br />

a<br />

U<br />

P a<br />

a∈Σ<br />

, iar P 1 = ( ) ∪ {X →::= t(α) | X ::= α ∈ P}.<br />

Evident G 1 = (Ω 1 , Σ 1 , S, P 1 – {S ::= λ}) este independentă de context. Se<br />

arată, prin dublă incluziune, că L(G 1 ) = s(L).<br />

a) s(L) ⊆ L(G 1 ): Fie w ∈ s(L) = s(α)<br />

, deci există α ∈ L astfel încât w =<br />

s(α). Dacă α = λ atunci există, în gramatica G, producţia S ::= λ, deci în G1 există<br />

producţia S ::= t(λ), adică S ::= λ. Obţinem s(λ) = {λ}, adică w = λ şi w ∈ L(G 1 ).<br />

Dacă α ≠ λ atunci există, în gramatica G, simbolurile terminale a 1 a 2 …a k astfel încât<br />

α = a 1 a 2 …a k . Deoarece s(α) = s(a 1 )s(a 2 )…s(a k ), rezultă că pentru fiecare i, 1 ≤ i ≤ k<br />

există w i ∈ s(a i ) şi w = w 1 w 2 …w k . Din α ∈ L = L(G) rezultă că există, în G,<br />

derivarea S ⎯→<br />

* α1 ⎯ ⎯→<br />

* α2 ⎯ ⎯→<br />

* … ⎯→ αp = α (=a 1 a 2 …a k ). Prin<br />

aplicarea transformării t obţinem existenţa, în G ⎯ ⎯→ * ⎯→<br />

*<br />

1 , a derivării S t(α 1 ) ⎯<br />

t(α2) ⎯ ⎯→<br />

* … ⎯→<br />

t(αp) = t(α) = t(a 1 ) t(a 2 ) … t(a k ) = … .<br />

w1w 2 … w k = w. În concluzie, w ∈ L(G 1 ).<br />

b) L(G ⎯ ⎯→<br />

*<br />

1 ) ⊆ s(L): Fie w ∈ L(G 1 ), adică există derivarea S α 1 ⎯ ⎯→<br />

* α2<br />

⎯→ … ⎯ ⎯→<br />

* αp = w. Deoarece mulţimile de neterminale ale gramaticilor din<br />

ipoteză sunt disjuncte (am presupus că Ω ∩ Ω a = ∅ pentru oricare a ∈ Σ)<br />

producţiile din P 1 de forma X ::= t(α), unde X ::= α ∈ P, pot fi permutate cu<br />

producţiile din U P a<br />

, astfel încât iniţial să nu se utilizeze producţii din U P a<br />

.<br />

a∈Σ<br />

* a1<br />

S a1<br />

U<br />

α∈L<br />

⎯ * a1<br />

⎯ *<br />

Deoarece s(ai) = L(G ) atunci există în fiecare G , derivarea ⎯ ⎯→<br />

* w i , i =<br />

1, 2, …, k. Prin urmare ⎯ ⎯→<br />

* wi în G 1 şi S ⎯→ …<br />

*<br />

S<br />

1<br />

a<br />

… S<br />

2 a<br />

⎯ *<br />

k<br />

a<br />

⎯ ⎯→<br />

* 1<br />

i ∈ L( G a 1<br />

Deci există o derivare S ⎯ ⎯→<br />

* wt ∈ {S a | a ∈ Σ}*. Prin urmare există k ≥1 astfel<br />

încât w ⎯ *<br />

t =<br />

a<br />

S<br />

a<br />

… S ak<br />

şi a1a 2 …a k ∈ L(G). Cum S ⎯→ w, rezultă că S<br />

a<br />

S<br />

S<br />

w<br />

⎯→<br />

2<br />

S a1<br />

S a1<br />

S<br />

a 1<br />

S a 2<br />

U<br />

a∈Σ<br />

S a2<br />

a<br />

S<br />

ak<br />

a∈Σ<br />

1 =<br />

S ak<br />

⎯→<br />

*<br />

w şi apoi obţinem descompunerea w = w1w 2 …w k astfel încât<br />

w i în G 1 şi deci şi în<br />

G a1<br />

, pentru i = 1, 2, … k. Se mai poate spune că<br />

), adică w i ∈ s(a i ), i = 1, 2, …, k. În concluzie rezultă că w ∈<br />

s(a 1 )s(a 2 )…s(a k ) = s(a 1 a 2 …a k ) ⊆ s(L).<br />

Observaţia 8.4<br />

Familia limbajelor independente de context este închisă la homomorfisme.<br />

Observaţia 8.5<br />

Un sistem gsm este un sistem AFN care, în plus, faţă de banda de intrare<br />

(cuvinte peste Σ) conţine şi o bandă de ieşire (pentru manipularea cuvintelor peste<br />

1


∆). Faptul că (q 2 , u) ∈ δ(q 1 , a) arată trecerea din starea q 1 in starea q 2 , când capul de<br />

citire a întâlnit simbolul a, dar şi emiterea cuvântului u ∈ ∆* la ieşire. Funcţia δ se<br />

extinde la Σ*, în mod obişnuit.<br />

Cerinţa 8.10<br />

Orice clasă de limbaje peste alfabetul Σ închisă la substituţii finite şi<br />

intersecţie cu limbaje regulate este închisă la transformări gsm.<br />

Demonstraţie. Fie C o clasă de limbaje cu proprietatea din enunţ şi sistemul gsm M<br />

= (Q, Σ, ∆, δ, q 0 , F).<br />

Considerăm substituţia finită s: Σ → P(Q x Σ x ∆* x Q) definită astfel încât<br />

pentru oricare a ∈ Σ, s(a) = {(q 1 , a, u, q 2 ) | q 1 , q 2 ∈ Q, u ∈ ∆* , (q 2 , u) ∈ δ(q 1 , a)}.<br />

Fie limbajul R ⊆ (Q x Σ x ∆* x Q)* definit prin R = {((q 0 , a 1 , u 1 , q 1 ) (q 1 , a 2 ,<br />

u 2 , q 2 ) … (q n-1 , a n , u n , q n ) | q n ∈ F, (q i , u i ) ∈δ(q i-1 , a i ), i = 1, 2, …, n}. Limbajul R<br />

este regulat deoarece este acceptat de automatul finit nedeterminist A = (Q, Q x Σ x<br />

∆* x Q, δ 1 , q 0 , F), cu q 2 ∈δ 1 (q 1 , (q 1 , a, u, q 2 )) dacă şi numai dacă (q 2 , u) ∈δ(q 1 , a)<br />

pentru oricare q 1 , q 2 ∈ Q, u ∈ ∆* şi a ∈ Σ.<br />

Definim homomorfismul h : Q x Σ x ∆* x Q → ∆* prin h(q 1 , a, u, q 2 ) = u,<br />

pentru oricare q 1 , q 2 ∈ Q, u ∈ ∆* şi a ∈ Σ.<br />

Atunci pentru oricare L ∈ C, rezultă g M (L) = h(s(L)∩R).<br />

Sunt valide echivalenţele:<br />

• w ∈ h(s(L) ∩ R) dacă şi numai dacă există α ∈ s(L) ∩ R astfel încât w =<br />

h(α);<br />

• α ∈ s(L) ∩ R dacă şi numai dacă există v ∈ L astfel încât α ∈ s(v) ∩ R;<br />

deci α = (q 0 , a 1 , u 1 , q 1 ) (q 1 , a 2 , u 2 , q 2 ) … (q n-1 , a n , u n , q n ) , q n ∈ F, (q i , u i ) ∈<br />

δ(q i-1 , a i ), i = 1, 2, …, n; v = a 1 a 2 …a n .<br />

Prin urmare h(α) = u 1 u 2 …u n . Deci w ∈ h(s(L) ∩ R) dacă şi numai dacă există<br />

cuvintele v = a 1 a 2 …a n ∈ L, w = u 1 u 2 …u n ∈ ∆*, stările q 0 , q 1 , …, q n ∈ Q, q n ∈ F<br />

astfel încât (q i , u i ) ∈ δ(q i-1 , a i ), i = 1, 2, …, n, echivalent cu w ∈ g M (v).<br />

Deoarece g M (L) = h(s(L) ∩ R) pentru L ∈ C, iar C este închisă la substituţii<br />

finite şi intersecţia cu limbaje regulate obţinem: L ∈ C ⇒ s(L) ∈ C ⇒ s(L) ∩ R ∈<br />

C ⇒ h(s(L) ∩ R) ∈ C ⇒ g M (L) ∈ C.<br />

Observaţia 8.6<br />

Deoarece familiile L i ( i = 2, 3) satisfac condiţille teoremei 8.10 rezultă că<br />

acestea sunt închise la transformări gsm.<br />

9. Specificarea sintaxei limbajelor de programare<br />

Exemplul 9.1<br />

Vom ilustra utilizarea limbajului C++ în codificarea algoritmului pentru<br />

determinarea stărilor accesibile ale unui sistem AFD. Pentru acest exemplu,<br />

automatul M este un obiect al clasei Sistem_AFD caracterizat prin atributele:<br />

numar_stari = |Q|, cardinal_sigma = | Σ |, stare_initiala = q 0 , delta (funcţia de<br />

tranziţie) definită ca tablou, stari_accesibile (tablou care va conţine stările<br />

accesibile) şi n_accessible (cardinalul mulţimii stărilor accesibile). La declararea<br />

automatului se va apela constructorul care va citi datele. Stările accesibile se<br />

determină prin apelarea metodei aferente. Afişarea datelor despre automat se<br />

realizează, de asemenea, printr-o metodă specifică.


#include <br />

class Sistem_AFD {<br />

private:<br />

int numar_stari;<br />

int cardinal_sigma;<br />

int q0;<br />

int **delta;<br />

int *stari_accesibile;<br />

// Structură de date organizată ca o coadă<br />

int n_accesibile;<br />

public:<br />

Sistem_AFD(); //Constructor<br />

~Sistem_AFD(); //Destructor<br />

Determină_stările_accesibile();<br />

// Metoda care implementează algoritmul 4.1<br />

Afişare_informaţii(); //Vizualizarea informaţiilor<br />

}<br />

Sistem_AFD::Sistem_AFD(){ //Constructor<br />

int i, j;<br />

cout > numar_stari;<br />

// Se presupune că stările vor fi codificate prin numerele naturale<br />

// 0, 1, 2, …, numar_stari-1.<br />

cout > cardinal_sigma;<br />

// Se presupune că literele vor fi codificate prin numerele naturale<br />

// 0, 1, 2, …, cardinal_sigma-1.<br />

cout "Introduceţi starea iniţială:";<br />

do {cin >> q0; } while ((q0 = numar_stari));<br />

delta = new int *[numar_stari];<br />

for (i = 0; i


cardinal_sigma = 0; q0 = 0; n_accesibile = 0;<br />

} //sfârşit destructor<br />

void Sistem_AFD :: Determină_stările_accesibile(){<br />

int primul_slot = 0;<br />

// Tabloul este organizat ca o coadă.<br />

// Inserarea presupune incrementarea variabilei ultimul_slot,<br />

// iar "eliminarea" din coadă presupune incrementarea variabilei<br />

// primul_slot. Tabloul este suficient de<br />

// larg pentru a include toate stările automatului.<br />

int ultimul_slot = 0;<br />

int qc; //starea curentă;<br />

int qt; //starea posibil accesibilă din qc;<br />

int a_fost_vizitată;<br />

// variabilă logică care va atesta prezenţa/absenţa<br />

// stării qt în tabloul stari_accesibile;<br />

int i, j; // variabile de lucru<br />

stari_accesibile[0] = q0; // starea iniţială este accesibilă;<br />

while (primul_slot


}<br />

Exemplul 9.2 [Liste în Prolog]<br />

Exemplificăm prin câteva predicate utile în prelucrarea listelor, folosind<br />

implementarea Turbo Prolog.<br />

domains<br />

list=integer* /* Se defineste tipul lista de intregi */<br />

predicates<br />

wlist(list) /* afisarea elementelor unei liste */<br />

nlist(list,integer) /* Numarul elementelor unei liste */<br />

slist(list,integer) /* Suma elementelor listei */<br />

addx(integer,list,list) /* Adauga x la fiecare element al listei */<br />

addl(list,list,list) /* aduna element cu element doua liste */<br />

dlist(list,list) /* dublarea elementelor unei liste */<br />

rnlist(list,list) /* eliminarea numerelor negative */<br />

inlist(integer,list) /* este in lista? Yes or No */<br />

catlist(list, list, list) /* concatenare de liste */<br />

clauses<br />

wlist([]) :- !.<br />

wlist([H | T]) :- write(H), nl, wlist(T).<br />

nlist([],0) :-!.<br />

nlist([_|T],N) :- nlist(T,N1), N=N1+1.<br />

slist([],0) :- !.<br />

slist([X|C],S) :- slist(C,S1), S=S1+X.<br />

addx(X,[], []):- !.<br />

addx(X,[A|R], [Y|R1]) :- Y=A+X,addx(X,R,R1).<br />

addl([],L,L) :- !.<br />

addl(L,[],L) :- !.<br />

addl([A|L1],[B|L2],[C|L3]) :- C=A+B,addl(L1,L2,L3).<br />

dlist([], []) :- !.<br />

dlist([A|B], [A,A|C]) :- dlist(B,C).<br />

rnlist([],[]) :- !.<br />

rnlist([X|A],[X|B]) :- X>=0, !, rnlist(A,B).<br />

rnlist([X|A],B) :- X


delta(s1, b, s2).<br />

delta(s2, a, s1).<br />

delta(s2, a, s3).<br />

delta(s2, b, s3).<br />

delta(s3, a, s2).<br />

delta(s3, a, s3).<br />

delta(s3, b, s1).<br />

stare_iniţială(s1).<br />

stare_finală(s2).<br />

stare_finală(s3).<br />

accepta(X, []) :- stare_finală(X), write("Da").<br />

accepta(X, [Prima_literă | Restul]) :- delta(X, Prima_literă, Y),<br />

accepta(Y, Restul).<br />

aparţine(W) :- stare-iniţială(X), accepta(X, W).<br />

aparţine( _ ) :- write("Nu").<br />

?- aparţine([a, b, a, b, a, b, b]).<br />

Observaţia 9.1<br />

În Prolog se comunică cunoştinţe. Determinarea efectivă a soluţiei este<br />

realizată de către nucleul Prolog prin metode specifice: unificare, backtracking etc.<br />

Observaţia 9.2<br />

Limbajul Prolog permite atât codificarea algoritmilor recursivi, cât şi a celor<br />

nerecursivi. Următoarele declaraţii permit calculul factorialului în ambele variante.<br />

00F] | [#x202A-#x202E] | [#x206A-#x206F] | #xFEFF<br />

Exemplul 9.4<br />

Secvenţa XML următoare ilustrează definirea înregistrărilor tip bază de date:<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

]><br />

<br />

<br />

<br />

<br />

Ionescu<br />

Marian<br />

<br />

Februarie 23, 2005


<br />

CAIET DICTANDO<br />

15<br />

25000<br />

<br />

<br />

CRETA<br />

10<br />

15000<br />

<br />

<br />

<br />

<br />

<br />

Popescu<br />

Alexandru<br />

<br />

Februarie 24, 2005<br />

<br />

<br />

CARTE<br />

1<br />

500000<br />

<br />

<br />

CD AUDIO<br />

10<br />

150000<br />

<br />

<br />

<br />

<br />

Exemplul 9.5<br />

Documentul următor defineşte două tipuri de obiecte (cerc şi elipsă)<br />

împreună cu atributele acestora.<br />

<br />

<br />

<br />

<br />


L CDATA #IMPLIED<br />

H CDATA #IMPLIED><br />

]><br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

10. Introducere în analiza sintactică<br />

Cerinta 10.1 [Gramaticile dependente de context sunt recursive 9 .]<br />

Există un algoritm care pentru orice G = (Ω, Σ, S, P) - gramatică dependentă<br />

de context – şi orice w ∈ Σ + decide dacă afirmaţia “w ∈ L(G)” este adevărată.<br />

Demonstraţie. Fiind dată gramatica G = (Ω, Σ, S, P), dependentă de context şi w ∈<br />

Σ + astfel încât |w| = m, definim, prin recurenţă, şirul de mulţimi X i , i ≥ 0, astfel:<br />

X 0 = {S},<br />

X i+1 = X i ∪ {v | v ∈ (Ω∪Σ) + , există u ∈ X i astfel încât u→v şi |v|≤ m}, i≥0.<br />

Vom arăta că şirul construit are următoarele proprietăţi:<br />

• P 1 : X k = {v | v ∈ (Ω ∪ Σ) + , S ⎯→<br />

k v, |v| ≤ m}, k = 0, 1, …;<br />

• P 2 : X i (i ≥ 0) este un şir ascendent, în sensul relaţiei de incluziune şi<br />

m<br />

k<br />

mărginit de U (Ω ∪ Σ) şi există p ∈ N astfel încât X p = X p+1 .<br />

k =1<br />

• P 3 . Dacă X p = X p+1 atunci X p = X p+i , oricare i ≥ 0.<br />

• P 4 . Fie p 0 = min {p | X p = X p+1 }. Atunci w ∈ L(G) dacă şi numai dacă<br />

w ∈ X p0<br />

.<br />

Demonstraţia proprietăţii P 1 [prin inducţie în raport cu k]. Fie Y k := {v | v ∈<br />

(Ω ∪ Σ) + , S ⎯→<br />

k v, |v| ≤ m}. Vom arăta că Xk (obţinut prin construcţia<br />

recurentă) coincide cu Y k , k = 0, 1, … Pentru k = 0, proprietatea este, în mod<br />

evident, adevărată. Este suficient să observăm că X 0 = Y 0 = {S}. Presupunem că P 1<br />

este adevărată pentru un k oarecare şi demonstrăm că X k+1 = Y k+1 . Iniţial,<br />

demonstrăm că X k+1 ⊆ Y k+1 . Fie v ∈ X k+1 . Atunci fie v ∈ X k , fie v ∈{α | α ∈ (Ω ∪<br />

Σ) + , există u ∈ X k astfel încât u → α şi |α| ≤ m}. Dacă v ∈ X k atunci, prin ipoteza<br />

de inducţie rezultă v ∈ Y k , dar Y k ⊆ Y k+1 (o derivare în cel mult k paşi poate fi<br />

considerată şi ca derivare în cel mult k + 1 paşi). Prin urmare v ∈ Y k+1 . Fie v ∈{α |<br />

α ∈ (Ω ∪ Σ) + , există u ∈ X k astfel încât u → α şi |α| ≤ m}. Avem succesiv S<br />

⎯→<br />

k u şi u → v şi |v| ≤ m. Deci S ⎯ k ⎯→<br />

+1 v şi |v| ≤ m. Prin urmare v ∈ Y<br />

k+1. A<br />

9 În teoria algoritmilor, o gramatică formală G se numeşte recursivă dacă există un algoritm<br />

care acceptă, la intrare, orice cuvânt w peste vocabularul terminal şi produce, la ieşire,<br />

răspunsul la întrebarea: “w ∈ L(G)? “ Nu trebuie să confundăm această noţiune cu cea<br />

referitoare la recursivitatea la stânga (resp. dreapta) a gramaticilor, introdusă prin definiţia<br />

2.10.


mai rămas de justificat incluziunea inversă: Y k+1 ⊆ X k+1 . Fie v ∈ Y k+1 . Atunci S<br />

⎯ k ⎯→ +1 v şi |v| ≤ m. Rezultă că există u∈(Ω ∪ Σ)<br />

+ astfel încât S ⎯→<br />

k u → v (am<br />

pus în evidenţă ultimul pas al derivării), iar u = x 1 αy 1 , v = x 1 βy 1 şi α ::= β ∈ P.<br />

Deoarece gramatica este dependentă de context, deci şi monotonă, obţinem că |α| ≤<br />

|β|, deci |u| ≤ |v|. Cum |v| ≤ m, rezultă şi |u| ≤ m. Adică u ∈ Y k ⊆ X k (conform<br />

ipotezei de inducţie). În concluzie, v este un element al mulţimii {v | v ∈ (Ω ∪ Σ) + ,<br />

există u ∈ X ⎯→<br />

k<br />

k astfel încât u → v şi |v| ≤ m} ⊆ X k+1 . Dacă S v şi |v| ≤ m<br />

atunci în mod banal v ∈ Y k ⊆ X k (conform ipotezei de inducţie).<br />

Demonstraţia proprietăţii P 2 . Construcţia şirului de mulţimi arată şi<br />

caracterul ascendent al şirului. Mărginirea este posibilă deoarece se lucrează cu<br />

mulţimile de cardinal finit Ω şi Σ, iar mulţimea cuvintelor de lungime cel mult m<br />

este o mulţime finită.<br />

Demonstraţia proprietăţii P 3 [prin inducţie în raport cu i]. Cazul i = 1 este<br />

chiar cel din ipoteză. Admitem, prin ipoteza de inducţie, că X k = X k+i , pentru un i<br />

fixat. Dorim să arătăm că proprietatea se păstrează pentru indicele i + 1. Dar X k+(i+1)<br />

= X k+i ∪ {v | v ∈ (Ω ∪ Σ) + , există u ∈ X k+i astfel încât u → v şi |v| ≤ m} = (prin<br />

ipoteza de inducţie) X k ∪ {v | v ∈ (Ω ∪ Σ) + , există u ∈ X k astfel încât u → v şi |v|<br />

≤ m} = X k+1 = X k .<br />

Demonstraţia proprietăţii P ⎯ m<br />

4 Fie w ∈ L(G), deci S ⎯→ w, adică w ∈ Xm.<br />

Dacă m > p 0 atunci se aplică proprietatea P 3 şi rezultă că w ∈ X<br />

p 0<br />

. Dacă m ≤ p 0<br />

atunci se aplică proprietatea P 2 şi rezultă w ∈ X p0<br />

. Reciproc, dacă w ∈ X p0<br />

, prin<br />

aplicarea proprietăţii P1, rezultă S ⎯ ≤ k0<br />

⎯→ w. Prin urmare w ∈ L(G).<br />

Cele de mai sus ne permit formularea următorului algoritm:<br />

1. k := 0; X k := {S};<br />

2. Repetă paşii<br />

2.1. X k+1 = X k ∪ {v | v ∈ (Ω ∪ Σ) + , există u ∈ X k astfel încât u → v şi |v|<br />

≤ m};<br />

2.2. k := k + 1;<br />

până când X k = X k-1 .<br />

3. Dacă w ∈ X k atunci w ∈ L(G) altfel w ∉ L(G).<br />

Exemplul 10.1<br />

Fie gramatica G = ({S, A}, {a, b}, S, {(S, AA), (S, AS), (S, b), (A, SA), (A,<br />

AS), (A, a)}) şi w = abaab (|w| = 5). Prin aplicarea propoziţiei 10.1 se obţine<br />

următorul şir de mulţimi:<br />

X 0 = {S};<br />

X 1 = X 0 ∪ {AA, AS, b};<br />

X 2 = X 1 ∪ {SAA, ASA, aA, AAS, Aa, SAS, ASS, aS, AAA, Ab};<br />

X 3 = X 2 ∪ {AAAA, ASAA, bAA, SSAA, SASA, SaA, SAAS, SAa, ASSA, aSA,<br />

AASA, AbA, ASAS, ASa, aAS, aa, AaS, AAAS, Aab, bAS, SSAS, SASS, SaS,<br />

SAAA, SAAS, SAb, ASSS, aSS, AASS, AbS, ASb, aAA, ab, AaA, AAa, , ab}


X 4 = X 3 ∪ {SAAAA, ASAAA, aAAA, AASAA, AaAA, AAASA, AAaA,<br />

AAAAS, AAAa, SASAA, ASSAA, aSAA, AAAAA, AbAA, ASASA, ASaA,<br />

ASAAS, ASAa, bSAA, bASA, baA, bAAS, bAa, SbAA, SSSAA, SSASA, SSaA,<br />

SSAAS, SSAa, SASSA, SaSA, SAASA, SAbA, SASAS, SASa, AAaA, ASaA,<br />

SaAS, Sab, SaAS, SAASS, SAaS, SAAAS, SAAb, Saa, ASSSA, aSSA, AASSA,<br />

AbSA, ASbA, ASSAS, ASSa, aAAA, aASA, abA, AaSA, AAbA, AASAS, AASa,<br />

SAbA, AbAS, Aba, aSAS, AbAS, ASASS, ASaS, ASAb, aSa, aASS, aaS, aAAS,<br />

aAb, AaAA, AaAS, Aab, ASAAS, AAASS, AAbS, AAAb, SAab, ASab, aab,<br />

bSAS, bASS, baS, bAAA, bAAS, bAb, SAAAS, SbAS, SSASS, SSSAS, SSaS,<br />

SSAAA, SSAb, bASS, SSASS, SASSS, SaSS, SAASS, SAbS, SASAA, SASb,<br />

AAaS, baS, SaAA, bAAAA, SaAA, SAaA, SAAa, ASAb, ASAb, bAb, Sab,<br />

ASSSS, aSSS, AASSS, AbSS, ASAAS, ASbS, ASSb, aAAS, abS, aSb, AaSS,<br />

AAbS, AASb, SAbS, AbAA, AbAS, Abb, aaA, SAaA, ASaA, aaA, AaAS, Aaa,<br />

ASAa, aAa, AASa, Aaa},<br />

...<br />

X 9 = X 8 ∪ {abaab, ...}<br />

Observăm că w ∈ X 9 . Prin urmare w ∈ L(G).<br />

Cerinta 10.2<br />

Există un algoritm care să determine, pentru o gramatică independentă de<br />

context G = (Ω, Σ, S, P) şi un cuvânt w ∈ Σ*, dacă w ∈ L(G) sau w ∉ L(G).<br />

Demonstraţie. Deoarece orice gramatică independentă de context este<br />

echivalentă cu o gramatică în forma normală Greibach (teorema 6.3) putem<br />

presupune că G este în forma normală Greibach. Dacă w = λ atunci w ∈ L(G) dacă<br />

şi numai dacă S ::= λ ∈ P. Presupunem că w ≠ λ. Atunci w ∈ L(G) dacă şi numai<br />

dacă S ⎯ ⎯→<br />

* w. În cadrul derivării fiecare producţie adaugă exact un terminal,<br />

deci S ⎯ ⎯→ |w|<br />

w (lungimea derivării este egală cu lungimea cuvântului w). Un<br />

algoritm pentru a decide dacă w ∈ L(G) sau nu, ar trebui să genereze toate<br />

derivările de lungime |w|. Acest lucru este posibil deoarece numărul regulilor este<br />

finit şi prin aplicarea metodei backtracking se pot genera toate derivările de o<br />

anumită lungime.<br />

Exemplul 10.2<br />

Considerăm datele de intrare din exemplul 10.1. Rezultatul aplicării<br />

algoritmului CYK este prezentat în următorul tabel:<br />

j i = 1 i = 2 i = 3 i = 4 i = 5<br />

5 V 15 = {A, S}<br />

4 V 14 = {A, S} V 24 = {A, S}<br />

3 V 13 = {A, S} V 23 = {S} V 3,3 = {A, S}<br />

2 V 12 = {A, S} V 22 ={A } V 3,2 ={S} V 42 = {A, S}<br />

1 V 11 ={A} V 21 = {S} V 31 = {A} V 41 = {A} V 51 = {S}<br />

Cerinta 10.3<br />

Algoritmul CYK (Cocke, Younger şi Kasami) calculează mulţimile V i,j (j =<br />

1, 2, …, m; i = 1, 2, …, m – j + 1) folosind O(m 3 ) operaţii de reuniune.


Demonstraţie. Complexitatea pasului 1 este O(m). Numărul de operaţii de reuniune<br />

din pasul 2 este dat de numărul tripletelor (j, i, k) - cardinalul mulţimii -<br />

{(1, 1, _), (1, 2, _), …., (1, m, _),<br />

(2, 1, 1), (2, 2 1), …, (2, m-1, 1),<br />

(3, 1, 1), (3, 1, 2), (3, 2, 1), (3, 2, 2), …, (3, m-2, 1), (3, m-2, 2), ….,<br />

(m, 1, 1), (m, 1, 2), …, (m, 1, m-1)},<br />

adică o expresie de ordinul O(m 3 ).<br />

Prin _ am notat executarea doar a pasului 2.a. Prin urmare complexitatea<br />

algoritmului este de O(m 3 ) operaţii de reuniune.<br />

Pentru obţinerea analizei stângi a unui cuvânt w generat de gramatica G se<br />

poate utiliza o procedură recursivă inspirată de schema algoritmului CYK. Se<br />

presupune, în continuare, că G este în forma normală Chomsky. Procedura<br />

ANALIZA, care furnizează analiza stângă, are următorul cod (în limbaj<br />

algoritmic):<br />

Integer n(100); Integer h;<br />

Procedure Analiza (i, j, A)<br />

Integer i, j;<br />

Neterminal A;<br />

SEQ<br />

if (j = 1) then SEQ h := h + 1; n[h] := #(A ::= a i ); END else<br />

SEQ<br />

If (există k astfel încât<br />

k = min{s | s = 1, 2, …, j-1, A ::= BC ∈ P, B ∈ V is , C ∈ V i+s, j-s })<br />

then SEQ<br />

h := h+1;<br />

n[h] := #(A ::= BC);<br />

if (k < j-k) then SEQ Analiza(i, k, B); Analiza(i+k, j-k, C); END<br />

else SEQ Analiza(i+k, j-k, C); Analiza(i, k, B); END;<br />

END<br />

END<br />

END<br />

Procedura este apelată prin Analiza(1, |w|, S) numai dacă algoritmul CYK a<br />

furnizat rezultatul “w ∈L(G)”. Valoarea variabilei h va fi majorată de valoarea<br />

[log 2 |w|].<br />

Cerinta 10.4<br />

Fie G = (Ω, Σ, S, P) o gramatică independentă de context, nerecursivă la<br />

stânga şi A ⎯⎯→<br />

χ wXu (stânga). Atunci există o constantă reală pozitivă, c, astfel<br />

încât<br />

|χ| ≤ c |w|+2 .<br />

Demonstraţie. Fie n = |Ω| şi arborele corespunzător derivării A ⎯⎯→<br />

χ wXu<br />

(stânga). Atunci, în acest arbore nu există nici un drum de lungime mai mare decât<br />

n(|w| + 2). Fie s = max {|α| |A ::= α∈P}. Cum în arborele de derivare nu sunt mai<br />

mult de s n(|w| + 2) noduri interioare, rezultă că lungimea unei analize stângi poate fi


majorată ca în enunţ. Se observă că se poate lua c = s n care depinde numai de<br />

gramatica G, nu şi de forma propoziţională.<br />

Exemplul 10.3<br />

Fie gramatica cu regulile S ::= aSb | b şi cuvântul w = aaabbb. Prin aplicarea<br />

algoritmului de analiză sintactică descendentă rezultă următoarele configuraţii:<br />

(q, 1, λ, S$) |- (q, 1, S 1 , aSb$) |- (q, 2, S 1 a, Sb$) |- (q, 2, S 1 aS 1 , aSbb$) |-<br />

(q, 3, S 1 aS 1 a, Sbb$) |- (q, 3, S 1 aS 1 aS 1 , aSbbb$) |- (q, 4, S 1 aS 1 aS 1 a, Sbbb$) |-<br />

(q, 4, S 1 aS 1 aS 1 aS 1 , aSbbbb$) |- (r, 4, S 1 aS 1 aS 1 aS 1 , aSbbbb$) |-<br />

(q, 4, S 1 aS 1 aS 1 aS 2 , abbbb$) |- (r, 4, S 1 aS 1 aS 1 aS 2 , abbbb$) |-<br />

(r, 4, S 1 aS 1 aS 1 a, Sbbb$) |- (r, 3, S 1 aS 1 aS 1 , aSbbb$) |-<br />

(q, 3, S 1 aS 1 aS 2 , abbb$) |- (q, 4, S 1 aS 1 aS 2 a, bbb$) |-<br />

(q, 5, S 1 aS 1 aS 2 ab, bb$) |- (q, 6, S 1 aS 1 aS 2 abb, b$) |-<br />

(q, 7, S 1 aS 1 aS 2 abbb, $) |- (t, 7, S 1 aS 1 aS 2 abbb, λ).<br />

Analiza sintactică a cuvântului aaabbb este 112 unde indicii şi asocierile sunt<br />

următoarele: 1 (S 1 ) pentru S ::= aSb, respectiv 2 (S 2 ) pentru S ::= ab.<br />

Cerinta 10.5<br />

Fie G = (Ω, Σ, S, P) o gramatică independentă de context, fără λ-producţii şi<br />

aciclică, w ∈ Σ * , iar A ⎯⎯→<br />

χ uXw (dreapta). Atunci există o constantă reală<br />

pozitivă, c, astfel încât<br />

|χ| ≤ c |w| .<br />

Demonstraţie. În virtutea propoziţiei 5.3, putem presupune că gramatica G nu are<br />

redenumiri. Deoarece gramatica nu are λ-producţii atunci în orice derivare X<br />

⎯⎯→<br />

χ w, numărul (notat prin h) producţiilor de forma Y ::= α, cu |α| ≥ 2 nu poate<br />

depăşi |w|. Evident h < |w|. Vom arăta, prin inducţie după h, că |χ|≤ 2|w|.<br />

Pentru h = 0, rezultă că |w| = 1, lungimea derivării este 1, deci |χ|≤ 2|w|.<br />

Presupunem că h > 1, A → Y 1 Y 2 ...Y m ⎯ ⎯→<br />

* w (dreapta), deci w = w1w 2 ...w m<br />

(proprietatea de localizare) astfel încât Y ⎯ ⎯→<br />

*<br />

i w i , prin aplicarea a h i reguli, i = 1,<br />

2, ..., m. Evident h = 1 + h 1 + h 2 + ... + h m . Fie χ i fiecare dintre cele i derivări<br />

drepte. Prin ipoteza de inducţie rezultă că |χ i | ≤ h i + |w i |. Prin sumare, rezultă că |χ|<br />

≤ 1 + h 1 + h 2 + ... + h m + |w 1 | + |w 2 | + ... + |w m| = h + |w| ≤ 2 |w|.<br />

Fie w ∈ Σ * , α ∈ (Ω ∪ Σ) + , şi α ⎯ ⎯→<br />

* u o derivare dreaptă, unde u este un<br />

prefix al lui w. Conform celor de mai sus, lungimea derivării este cel mult 2|u|.<br />

Numărul analizelor sintactice parţial drepte consistente cu w care se referă la<br />

prefixul u este cel mult |P| 2|u| , unde |P| reprezintă numărul producţiilor gramaticii<br />

date. Cuvântul w are |w| prefixe deci numărul analizelor sintactice este cel mult |P| 2<br />

+ |P| 4 + ... + |P| 2|w| < c |w| . În rolul lui c se poate lua, de exemplu, |P| 4 .<br />

Exemplul 10.4<br />

Fie gramatica din exemplul 10.3 şi cuvântul w = a 3 b 3 . Conform algoritmului<br />

analizei sintactice ascendente au loc următoarele tranziţii:<br />

(q, 1, $, λ) |- (q, 2, $a, D) |- (q, 3, $aa, DD) |- (q, 4, $aaa, DDD) |-<br />

(q, 5, $aaab, DDDD) |- (q, 5, $aaS, 2DDDD) |- (q, 6, $aaSb, D2DDDD) |-<br />

(q, 6, $aS, 2D2DDDD) |- (q, 6, $aSb, D1D2DDDD) |-<br />

(q, 7, $S, 1D2D2DDDD) |- (t, 7, λ, 1D1D2DDDD).<br />

Analiza sintactică a cuvântului aaabbb este 112 unde indicii producţiilor sunt<br />

următoarele: 1 pentru S ::= aSb, respectiv 2 pentru S ::= ab.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!