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.