Gramatyki bezkontekstowe

by Jerry Sky

2020-10-29



1. DEF

Gramatyka bezkontekstowe GG to czwórka G=(N,T,P,S)G = (N, T, P, S) gdzie

2. Relacja wyprowadzenia ⇒G\underset{G}{\Rightarrow}

Jeśli A→βA \to \beta jest produkcją w GG oraz α,γ∈(N∪T)∗\alpha, \gamma \in (N \cup T)^* wówczas αAγ⇒Gαβγ\alpha A \gamma \underset{G}{\Rightarrow} \alpha\beta\gamma.
(αβγ\alpha\beta\gamma jest bezpośrednio wyprowadzany z αAγ\alpha A \gamma w gramatyce GG).

Notacja:


3. DEF: Język generowany przez GG

L(G)={w:w∈T∗∧S⇒G∗w}. L(G) = \left\{ w: w \in T^* \land S \underset{G}{\Rightarrow}^* w \right\}.

Język LL nazywamy bezkontekstowym jeśli jest identyczny z L(G)L(G) dla pewnej gramatyki bezkontekstowej GG.
G1G_1 i G2G_2 są równoważne, jeżeli L(G1)=L(G2)L(G_1) = L(G_2).

3.1. Przykład

G=( {S},{0,1},{S→ε,S→1,S→0S0,S→1S1},S ) G = \big(~ \{S\}, \{0,1\}, \left\{ S \to \varepsilon, S \to 1, S \to 0S0, S \to 1S1 \right\}, S ~\big) lub inaczej (krócej) zapisując S→ϵ∣0∣1∣0S0∣1S1. S \to \epsilon|0|1|0S0|1S1.

Wyprowadzenie słowa 01100110: S⇒0S0⇒01S10⇒0110. S \Rightarrow 0S0 \Rightarrow 01S10 \Rightarrow 0110.


4. Drzewo wyprowadzania

Drzewo o następujących własnościach

  1. każdy wierzchołek ma etykietę z N∪T∪{ε}N \cup T \cup \{\varepsilon\}
  2. korzeń ma etykietę SS (symbol początkowy)
  3. wierzchołki wewnętrzne mają etykiety z NN
  4. jeżeli wierzchołek wewnętrzny ma etykietę AA a jego potomkowie od lewej mają kolejno etykiety X1,…,XnX_1, \dots, X_n to A→X1…XnA \to X_1 \dots X_n jest produkcją w PP

Jeśli konkatenacja wszystkich liści czytanych od lewej do prawej daje α\alpha to drzewo nazywamy drzewem wyprowadzenia α\alpha.


4.1. Przykład

kontynuacja przykładu wcześniejszego


4.2. Przykład

Mamy:

Jak widać, możemy uzyskać dwa drzewa dla tego słowa w tej gramatyce.
Oznacza to, że gramatyka jest niejednoznaczna.


5. Twierdzenie o istnieniu drzewa wyprowadzenia dla gramatyki GG

Niech G=(N,T,P,S)G = (N,T,P,S) będzie gramatyką bezkontekstową. Wówczas S⇒∗α  ⟺  S \Rightarrow^* \alpha \iff istnieje drzewo wyprowadzenia α\alpha w gramatyce GG.

5.1. D-d

«Indukcja względem liczby wierzchołków wewnętrznych w drzewie.»


5.2. DEF: Lewo- i prawostronne wyprowadzanie

Jeżeli w każdym kroku wyprowadzenia stosujemy produkcję do nieterminala leżącego najbardziej na lewo (prawo), to wyprowadzenie nazywamy lewostronnym (prawostronnym). Jeżeli w∈L(G)w \in L(G) to w ma co najmniej jedno drzewo wyprowadzenia. Każdemu drzewu wyprowadzenia odpowiada dokładnie jedno wyprowadzenie lewostronne (prawostronne).

5.2.1. Przykład

kontynuacja przykładu wcześniejszego

  1. Lewostronne wyprowadzenie:
    E⇒E‾+E⇒id+E⇒id+E∗E⇒id+id∗E⇒id+id∗EE \Rightarrow \underline{E} + E \Rightarrow id + E \Rightarrow id + E * E \Rightarrow id + id * E \Rightarrow id + id * E
  2. Prawostronne wyprowadzenie:
    E⇒E+E‾⇒E+E∗E⇒E+E∗id⇒E+id∗id⇒id+id∗idE \Rightarrow E + \underline{E} \Rightarrow E + E * E \Rightarrow E + E * id \Rightarrow E + id * id \Rightarrow id + id * id

5.3. DEF: Gramatyka wieloznaczna

Jeśli L(G)L(G) istnieje słowo mające dwa różne drzewa wyprowadzenia to GG nazywamy wieloznaczną (niejednoznaczną).


6. DEF: Symbole bezużyteczne

Symbol XX jest użyteczny, jeśli istnieje wyprowadzenie postaci S⇒∗αXγwS \Rightarrow^* \alpha X \gamma w gdzie w∈T∗w \in T^*
otherwise XX jest bezużyteczny.

Niech LL — niepusty język bezkontekstowy, wówczas LL można wygenerować za pomocą gramatyki GG o następujących własnościach:

  1. każdy symbol pojawia się w wyprowadzeniu jakiegoś słowa z LL
  2. nie ma produkcji postaci A→BA \to B (produkcje jednostkowe), gdzie A,B∈NA, B \in N

Co więcej, jeśli ε∉L\varepsilon \notin L to w GG nie ma produkcji postaci A→εA \to \varepsilon.


7. Lemat o usuwaniu symboli bezużytecznych#1

Dla dowolnej gramatyki bezkontekstowej G=(N,T,P,S)G = (N,T,P,S) z L(G)≠∅L(G) \neq \emptyset można efektywnie znaleźć równoważną gramatykę bezkontekstową G′=(N′,T,P′,S)G' = (N', T, P', S) taką, że dla dowolnego A∈N′A \in N' istnieje w∈T∗w \in T^* takie, że A⇒∗wA \Rightarrow^* w.

7.1. D-d (szkic)

  1. NS←∅N_S \gets \emptyset
  2. Nn←{A:(A→w)∈P∧w∈T∗}N_n \gets \left\{ A: (A \to w) \in P \land w \in T^* \right\}
  3. while NS≠NnN_S \neq N_n:
    1. NS←NnN_S \gets N_n
    2. Nn←NS∪{A:(A→α)∈P∧α∈(T∪NS)∗}N_n \gets N_S \cup \left\{ A: (A \to \alpha) \in P \land \alpha \in (T \cup N_S)^* \right\}
  4. N′←NnN' \gets N_n
  5. P′←{(A→α)∈P:A∈Nn∧α∈(T∪NS)∗}P' \gets \left\{ (A \to \alpha) \in P: A \in N_n \land \alpha \in (T \cup N_S)^* \right\}

8. Lemat o usuwaniu symboli bezużytecznych#2

Dla dowolnej gramatyki bezkontekstowej G=(N,T,P,S)G = (N,T,P,S) można efektywnie znaleźć równoważną gramatykę bezkontekstową G′=(N′,T′,P′,S)G' = (N', T', P', S) taką, że dla każdego X∈(N′∪T′)X \in (N' \cup T') istnieją α,β∈(N′∪T′)∗\alpha, \beta \in (N' \cup T')^* takie, że S⇒∗αXβS \Rightarrow^* \alpha X \beta.

8.1. D-d (szkic)

  1. N′←{S}N' \gets \{S\}
  2. while można zmienić N′N':
    1. Jeśli A∈N′A \in N' oraz A←α1∣…∣αnA \gets \alpha_1|\dots|\alpha_n to dodaje wszystkie nieterminale z α1,…,αn\alpha_1,\dots,\alpha_n do N′N' a terminale do T′T'
  3. Do P′P' przenieś tylko te produkcje z PP, które zawierają symbole z N′∪T′∪{ε}N' \cup T' \cup \{\varepsilon\}.

9. Twierdzenie#2

Każdy niepusty język bezkontekstowy jest generowany przez gramatykę bezkontekstową niezawierającą symboli bezużytecznych.


10. Twierdzenie#3

Jeżeli L=L(G)L = L(G) dla gramatyki bezkontekstowej G=(N,T,P,S)G = (N,T,P,S) to dla L∖{ε}L \setminus \{\varepsilon\} istnieje gramatyka bezkontekstowa G′G' niezawierająca ε\varepsilon-produkcji i symboli bezużytecznych.


10.1. D-d

Symbole bezużyteczne usunęliśmy dzięki poprzedniemu twierdzeniu.

Dla każdego nieterminala AA sprawdzamy czy A⇒∗εA \Rightarrow^* \varepsilon. Jeśli tak to każdą produkcję B→αAβB \to \alpha A \beta zastępujemy produkcjami B→αAβB \to \alpha A \beta oraz B→αβB \to \alpha \beta (ale nie dołączamy B→εB \to \varepsilon).
Następnie usuwamy wszystkie ε\varepsilon-produkcje


11. Twierdzenie#4

Każdy język bezkontekstowy niezawierający ε\varepsilon jest definiowany za pomocą gramatyki niezawierającej symboli bezużytecznych, ε\varepsilon-produkcji oraz produkcji jednostkowych.

11.1. D-d

Jeżeli dla nieterminala AA mamy A⇒∗BA \Rightarrow^* B oraz A≠BA \neq B,
to dla każdej niejednostkowej produkcji B→αB \to \alpha dodajemy produkcję A→αA \to \alpha.

Następnie usuwamy produkcje jednostkowe.


12. Postać normalna Chomsky’ego

Dowolny język bezkontekstowy niezawierający ε\varepsilon jest generowany przez gramatykę, której wszystkie produkcje są postaci A→BCA \to BC lub A→aA \to a, gdzie A,B,C∈NA,B,C \in N oraz a∈Ta \in T.

12.1. D-d

Niech GG będzie gramatyką bez symboli bezużytecznych, ε\varepsilon-produkcji i produkcji jednostkowych. Wówczas jeśli prawa strona produkcji jest długości 11 to jest postaci A→aA \to a.

Dla pozostałych produkcji wykonujemy następujące operacje:

  1. Jeśli po prawej stronie występuje terminal aa to dodajemy do NN nowy nieterminal CaC_a a do produkcji Ca→aC_a \to a i zastępujemy aa przez CaC_a.
  2. Teraz jeśli prawa strona produkcji jest dłuższa niż 11 to zawiera tylko nieterminale. Jeśli jest postaci A→B1…BnA \to B_1\dots B_n dla n>2n > 2, to tworzymy nowe nieterminale D1,…,Dn−2D_1,\dots,D_{n-2} i zastępujemy tę produkcję przez A→B1D1,D1→B2D2,…,Dn−3→Bn−2Dn−2,Dn−2→Bn−1BnA \to B_1 D_1, D_1 \to B_2 D_2, \dots, D_{n-3} \to B_{n-2}D_{n-2}, D_{n-2} \to B_{n-1}B_n.


12.2. Przykład

Mamy:

Wówczas, postać normalna Chomsky’ego:


13. Postać normalna Greibach

Produkcje są postaci A→aαA \to a\alpha, gdzie A∈N,a∈T,,α∈N∗A \in N,\enspace a \in T,\enspace, \alpha \in N^*.

Określmy jako AA-produkcje wszystkie produkcje z nieterminalem AA po lewej stronie.

13.1. Lemat#1

Niech G=(N,T,P,S)G = (N,T,P,S) będzie gramatyką bezkontekstową.
Niech A→α1Bα2A \to \alpha_1 B \alpha_2 będzie produkcją w PP i niech B→β1∣…∣βrB \to \beta_1|\dots|\beta_r będzie zbiorem wszystkich BB-produkcji.
Niech G′=(N,T,P′,S)G' = (N,T,P',S) będzie gramatyką otrzymaną z GG przez usunięcie produkcji A→α1Bα2A \to \alpha_1 B \alpha_2 i dodanie produkcji A→α1β1α2∣…∣α1βrα2A \to \alpha_1 \beta_1 \alpha_2 | \dots | \alpha_1 \beta_r \alpha_2. Wówczas L(G)=L(G′)L(G) = L(G').

13.1.1. D-d

Dowód po strukturze drzewa wyprowadzenia.


13.2. Lemat#2

Niech G=(N,T,P,S)G = (N,T,P,S) będzie gramatyką bezkontekstową.

Niech A→Aα1∣…∣AαrA \to A \alpha_1 | \dots | A \alpha_r będzie zbiorem tych AA-produkcji, których prawe strony zaczynają się od AA. Niech A→β1∣…∣βSA \to \beta_1 | \dots | \beta_S będzie zbiorem pozostałych AA-produkcji. Niech G′=(N∪{B},T,P′,S)G' = (N \cup \{B\}, T, P', S) będzie gramatyką utworzoną poprzez dodanie nowego nieterminala BB i zastąpienie wszystkich AA-produkcji przez następujące produkcje A→βi∣βiB1≤i≤sB→αj∣αjB1≤j≤r \begin{aligned} A \to \beta_i|\beta_i B &\quad& 1 \le i \le s\\ B \to \alpha_j | \alpha_j B &\quad& 1 \le j \le r\\ \end{aligned} Wówczas L(G)=L(G′)L(G) = L(G').

13.2.1. D-d

W wyprowadzeniu lewostronnym ciąg produkcji postaci A→AαiA \to A \alpha_i musi kiedyś skończyć się produkcją A→βjA \to \beta_j: A⇒Aαi1⇒Aαi2αi1⇒⋯⇒Aαin…αi1⇒βjαin…αi1 A \Rightarrow A \alpha_{i_1} \Rightarrow A \alpha_{i_2} \alpha_{i_1} \Rightarrow \dots \Rightarrow A \alpha_{i_n} \dots \alpha_{i_1} \Rightarrow \beta_j \alpha_{i_n} \dots \alpha_{i_1} Można to zastąpić przez A⇒βjB⇒βjαinB⇒⋯⇒βjαin…αi2B⇒Bjαin…αi1 A \Rightarrow \beta_j B \Rightarrow \beta_j \alpha_{i_n} B \Rightarrow \dots \Rightarrow \beta_j\alpha_{i_n} \dots \alpha_{i_2}B \Rightarrow \Beta_j \alpha_{i_n} \dots \alpha_{i_1}

Ponieważ transformacja ta jest obustronna to L(G)=L(G′)L(G) = L(G').


13.3. Twierdzenie#5

Każdy język bezkontekstowy LL niezawierający ε\varepsilon jest generowany przez pewną gramatykę, w której każda produkcja jest postaci A→aαA \to a \alpha, gdzie a∈T,A∈N,α∈N∗a \in T,\enspace A \in N,\enspace \alpha \in N^*.

13.3.1. D-d

Niech G=(N,T,P,S)G = (N,T,P,S) będzie gramatyką w postaci normalnej Chomsky’ego.
Załóżmy, że N={A1,…,An}N = \{A_1, \dots, A_n\}.
Modyfikujemy produkcje tak, aby jeśli produkcja jest postaci Ai→AjαA_i \to A_j \alpha to i<ji < j.

  1. for k←1k \gets 1 to nn:
    1. for j←1j \gets 1 to (k−1)(k-1):
      1. Za każdą produkcję postaci Ak→AjαA_k \to A_j \alpha wstaw produkcje Ak→βαA_k \to \beta \alpha dla wszystkich produkcji Aj→βA_j \to \beta (Lemat#1).
      2. Dla produkcji postaci Ak→AkαA_k \to A_k \alpha wykonaj Lemat 2 używając nowych nieterminali BkB_k.

Po wykonaniu tego algorytmu mamy gramatykę równoważną o produkcjach w postaci:

  1. Ai→AjγA_i \to A_j \gamma, gdzie zawsze i<ji < j
  2. Ai→aγA_i \to a \gamma, gdzie a∈Ta \in T
  3. Bi→γB_i \to \gamma, dzie γ∈(N∪{B1,…,Bi−1})∗\gamma \in (N \cup \{B_1, \dots, B_{i-1}\})^*.

Zauważmy, że AnA_n-produkcje muszą zaczynać się terminalem.

Teraz rozważmy An−1A_{n-1}–produkcje: ich lewe strony muszą zaczynać się terminalem lub nieterminalem AnA_n więc możemy je z Lematu#1 zastąpić prawymi stronami AnA_n-produkcji (wszystkie zaczynają się terminalem). I tak do A1A_1.

Łatwo zauważyć, że BB-produkcje nigdy nie zaczynają się nieterminalem BB, więc też z Lemat#1 możemy je zastąpić prawymi stronami AA-produkcji.


13.4. Przykład

Mamy:

Nie pasuje A3→A1A2A_3 \to A_1 A_2 więc z Lemat#1 dostajemy A3→A2A3A2A_3 \to A_2 A_3 A_2.

Dalej nie pasuje, więc ponownie z Lemat#1 otrzymujemy A3→A3A1A3A2∣bA3A2A_3 \to A_3 A_1 A_3 A_2 | b A_3 A_2.

Teraz mamy A3→A3A1A3A2∣bA3A2∣aA_3 \to A_3 A_1 A_3 A_2 | b A_3 A_2 | a, korzystamy z Lemat#2 i otrzymujemy
A3→a∣aB3∣bA3A2∣bA3A2B3A_3 \to a| aB_3 | b A_3 A_2 | b A_3 A_2 B_3 oraz B3→A1A3A2∣A1A3A2B3B_3 \to A_1 A_3 A_2 | A_1 A_3 A_2 B_3.

Teraz odpowiednio podstawiając zgodnie z Lemat#1 otrzymujemy: