Sunteți pe pagina 1din 8

LABORATOR NR 7

FORME NORMALE PENTRU GRAMATICI


INDEPENDENTE DE CONTEXT

Forma normală Chomsky


Există anumite forme standard ale gramaticilor care le fac avantajoase
fie în aplicaţii, fie în demonstrarea unor rezultate teoretice. Forma normală
Chomsky, în plus, este apropiată modelului de generare a frazelor în limbile
naturale.
Definiţie.Spunem că gramatica G = (VN ,VT , S , P ) are forma normală
Chomsky dacă toate producţiile ei sunt de forma A → a sau A → BC , unde
A, B, C ∈ V N , a ∈ VT .
Teoremă. Dacă L ∈ L 2 şi λ ∉ L , atunci există o gramatică independentă de
context sub forma normală Chomsky care generează L.
Demonstraţie. Pentru orice gramatică de tip 2 există o gramatică
G1 = (VN ,VT , S , P1 ) fără λ -producţii şi fără producţii singulare care generează
limbajul L. Dacă ( A → α ) ∈ P1 , atunci α ≥ 1 .
În cazul α = 1 , deoarece G nu are producţii singulare, α = a ∈ VT şi producţia
A → a este admisă în forma normală Chomsky. Trebuie să ne ocupăm de
producţiile A → α cu α ≥ 2 . O vom face în două etape.
Etapa I. Pentru fiecare a ∈VT , introducem un nou neterminal C a .
Fie ( A → X 1 X 2 ... X m ) ∈ P ; m ≥ 2 . Formăm producţia
⎧ X i , dac[ X i ∈VN
(*) A → Y1Y2 ...Ym , unde Yi = ⎨
⎩C a , dac[ X i = a ∈VT
Pentru fiecare a ∈VT ,adăugăm producţia
(**) Ca → a
Păstrăm producţiile de forma
(* * *) A → a , A ∈ VN
Fie:
P2 mulţimea producţiilor de forma (*), (**), (***).
V2 = VN ∪ {C a | a ∈VT }
G2 = (V2 ,VT , S , P2 )
Producţiile din P2 sunt de forma
A → a cu A∈ V2 sau A → α cu a ∈V2 ∗ şi α ≥ 2
Se poate demonstra că L(G2 ) = L(G1 ) .
Etapa II. Fie G2 = (V2 ,VT , S , P2 ) gramatica obţinută la etapa I.
Fie ( A → α ) ∈ P2 . Dacă | α |= 1 , atunci α = a ∈ VT şi A → a se păstrează.
Fie | α |≥ 2 . Dacă | α |= 2 , atunci α = B1 B2 şi A → B1 B2 se păstrează, fiind
admisă în forma normală Chomsky.
Dacă | α |= m > 2 , atunci α = B1 B2 ...Bm şi înlocuim producţia A → B1 B2 ...Bm din
P2 cu producţiile A → B1 D1 , D1 → B2 D2 , ..., Dm−3 → Bm−2 Dm−2 , Dm−2 → Bm−1 Bm
unde D1 , D2 ,..., Dm−2 sunt neterminale noi.
Fie V = V2 ∪ mulţimea neterminalelor noi adăugate la II.
Fie P mulţimea producţiilor obţinute la II şi G = (VN ,VT , S , P ) .
Din construcţie rezultă că G are forma normală Chomsky.
Se demonstrează că L(G2 ) = L(G ) . Deci L(G ) = L(G2 ) = L(G1 ) = L .g

Exemplu. Să se aducă la forma normală Chomsky gramatica G1 :


S → aB | bA
A → bAa | aS | a
B → aBb | bS | b
Vom reprezenta pe coloane transformările producţiilor corespunzătoare celor
două etape.
P1 P2 (Etapa I) P (Etapa II)
S → aB S → Ca B S → Ca B
Ca → a Ca → a
S → bA S → Cb B S → Cb B
Cb → b Cb → b
A → bAa A → Cb AC a S → Cb D1
S → aS S → Ca S S → Ca S
Gramatica G sub forma normală Chomsky, echivalentă cu G1 este
G = ({S , A, B, C a , Cb , D1},{a, b}, P, S ) .

Forma normală Greibach


Considerăm G = (VN ,VT , S , P) o gramatică independentă de context. Spunem
că gramatica G este cu recursie stângă dacă în G există o derivare de forma
*
A ⇒ Aα .
Există algoritmi de analiză sintactică pentru gramatici independente de
context care nu sunt aplicabili dacă gramatica G este cu recursie stângă.
Transformările următoare conduc la eliminarea recursiei stângi.
Definiţie. Spunem că o gramatică este în forma normală Greibach dacă

toate producţiile lui G sunt de forma A → aα unde a ∈ VT , α ∈VN .
Vom stabili mai întâi două tipuri de transformări asupra unei gramatici care
nu modifică limbajul generat.
Lema 1. Fie G = (VN ,VT , S , P) o gramatică independentă de context . Fie
A → αBγ o producţie din P şi B → β1 | ... | β r toate B-producţiile lui G. Fie P1
mulţimea de producţii obţinute din P eliminând producţia A → αBγ şi
adăugând producţiile A → αβ1γ | ... | αβ r γ . Fie G1 = (VN ,VT , S , P1 ) . Atunci
L(G ) = L(G1 ) .
Lema 2. Fie G = (VN ,VT , S , P) o gramatică independentă de context, A∈VN şi
(1) A → Aα 1 | ... | Aα r
(2) A → β1 | ... | β s
toate A-producţiile, unde β i (i ∈1, s) nu încep cu A. Fie P1 mulţimea de
producţii obţinută din P înlocuind (1) şi (2) cu:
(2) A → β1 | ... | β s
(3) A → β1 B | ... | β s B
(4) B → α 1 | ... | α r
(5) B → α 1 B | ... | α r B
unde B este un nou neterminal.
Fie G1 = (VN ∪ {B},VT , S , P1 ) . Atunci L(G ) = L(G1 ) .
Teoremă. Dacă L este un limbaj independent de context şi λ ∈/ L , atunci
există o gramatică sub forma normală Greibach care generează L.
Demonstraţie.Există o gramatică G = (VN ,VT , S , P) sub forma normală
Chomsky care generează L. Putem considera că mulţimea VN a fost
ordonată: VN = { A1 , A2 ,..., An }, S = A1

Aducerea gramaticii G la forma normală Greibach se realizează în trei etape.


Etapa I. În această etapă vom transforma producţiile astfel încât, dacă
Ai → A jα este o producţie, atunci i < j . Realizăm această transformare cu
ajutorul următorului algoritm:
Algoritmul GRCR
I: G = (VN ,VT , S , P) o gramatică sub forma normală Chomsky, unde
VN = { A1 , A2 ,..., An }, S = A1 .
O: O gramatică G' independentă de context, echivalentă
G ' = (V N ∪ {B1 ,..., Bn },VT , S , P ' )
astfel încât, dacă ( Ai → A jα ) ∈ P' , atunci i < j .
M: begin
1° for k:=1 to n do
begin
2° for j:=1 to k-1 do
3° for ∀( A k → A jα ) ∈ P do
begin
4° for ∀( A j → β ) ∈ P do
5° add Ak → βα
6° remove A k → A jα
end
7° for ∀( A k → Akα ) ∈ P do
begin
8° add Bk → α şi Bk → αBk
9° remove A k → Akα
end
10 ° for ∀( A k → β ) ∈ P ( β ∉ Ak (VN ∪ VT ) ∗ ) do
11° add Ak → βBk
end
end

Etapa II. În această etapă vom face ca toate A j producţiile să înceapă în


dreapta cu un terminal.

Algoritmul GRAT
I: Gramatica G' rezultată după aplicarea algoritmului GRCR.
O: O gramatică G'' independentă de context, echivalentă cu G', astfel încât ,
dacă A → γ este o producţie a lui G'', atunci γ începe cu un terminal.

M: begin
1° for k:=n-1 downto 1 do
begin
2° for h:=1 to n-i do
begin
3° for ∀( Ai → Ai + hα ) ∈ P do
begin
4° for ∀( Ai + → β ) ∈ P do
5° add Ai → βα
6° remove Ai → Ai + jα
end
end
end
end

Etapa III. În algoritmul GRCR au fost introduse neterminalele Bk , k ∈1, n .


Deoarece gramatica iniţială este sub forma normală Chomsky, toate
secvenţele α de la 7 ° încep cu un neterminal Ah . Algoritmul GRAT nu
modifică Bk -producţiile, astfel că, dacă Bk → γ este o producţie a lui G''
atunci γ începe cu un Ah .
În această etapă vom face ca şi Bk -producţiile să înceapă în partea dreaptă cu
terminale.
Algoritmul GRBT
I: Gramatica G'' rezultat[ dup[ aplicarea algoritmului GRAT.
O: O gramatic[ G1 sub forma normal[ Greibach, echivalent[ cu G''
M: begin
1° for k:=1 to n do
begin
2° for ∀( B k → A jα ) ∈ P do
begin
3 °
for ∀( A j → β ) ∈ P do
4° add Bk → βα
5° remove B k → A jα
end
end
end

Exemplu. Să se aducă la forma Greibach, gramatica


G = ({ A1 , A2 , A3 },{a, b}, A1 , P ) , unde P conţine producţiile:
A1 → A2 A1
A2 → A2 A3 | a
A3 → A1 A3 | b
Etapa I
Producţii vechi Producţii noi
k=1 Nu se fac modificări
k=2 A 2 → A2 A3 B 2 → A3 ; B2 → A3 B2
A2 → a A 2 → a ; A 2 → aB2

Celelalte producţii rămân neschimbate

k=3, j=1 A3 → A1 A3 A3 → A2 A1 A3
K=3, j=2 A3 → A2 A1 A3 A3 → aA1 A3
A3 → aB2 A1 A3

Gramatica rezultată după etapa I conţine producţiile:


A1 → A2 A1
A2 → aB2 | a
B2 → A3 | A3 B2
A3 → aA1 A3 | aB2 A1 A3 | b

Etapa II
Producţii vechi Producţii noi
i=2 Nu se fac modificări
i=1 A1 → A2 A1 A1 → aA1 ; A1 → aB2 A1

Celelalte producţii rămân neschimbate. Gramatica G'' rezultată după etapa II


conţine producţiile:
A1 → aA1 | aB2 A1
A2 → aB2 | a
B2 → A3 | A3 B2
A3 → aA1 A3 | aB2 A1 A3 | b

Etapa III
Producţii vechi Producţii noi
k=1 Nu se fac transformări (nu există
B1 )
k=2 B 2 → A3 ; B2 → A3 B B 2 → aA1 A3 | aB2 A1 A3 | b
B 2 → aA1 A3 B2 | aB2 A1 A3 B2 | bB2

k=3 Nu se fac transformări (nu există B 3 )


Celelalte producţii rămân neschimbate.
Gramatica sub forma normală Greibach, echivalentă cu gramatica G este
G = ({ A1 , A2 , A3 , B2 },{a, b}, A1 , P1 )
unde P1 conţine producţiile:
A1 → aA1 | aB2 A1
A2 → aB2 | a
A3 → aA1 A3 | aB2 A1 A3 | b
B2 → aA1 A3 | aB2 A1 A3 | b | aA1 A3 B2 | aB2 A1 A3 B2 | bB2

Teme propuse:

1. Să se aducă la forma normală Chomsky următoarele gramatici proprii:

G1 = ({S , A, B}, {a, b, c}, S , P )


G 2 = ({E , T , F }, {a,+,*, (, )}, E , P )
P : S → aAbB | bcA
P : E → E + T | T * F | (E) | a
A → cba | aBC
T → T * F | (E) | a
B → a | aBbA
F → (E) | a
C → ba | CBa

2. Să se aducă la forma normală Greibach următoarele gramatici:

G1 = ({S , A, B}, {a, b, c}, S , P )


P : S → AB | BC G 2 = ({S , A}, {a, b}, S , P )
A → a | BC | SA P : S → AA | a
B → b | BA | BC A → SA | b
C → c | CB | AC
3. Implementaţi algoritmul de aducere la forma normală Chomsky.
(limbajul de programare la alegere).
4. Implementaţi algoritmul de aducere la forma normală Greibach.
(limbajul de programare la alegere).

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