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 α,γ(NT)\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:wTSGw}. 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ε,S1,S0S0,S1S1},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ϵ010S01S1. S \to \epsilon|0|1|0S0|1S1.

Wyprowadzenie słowa 01100110: S0S001S100110. 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 NT{ε}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 AX1XnA \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 wL(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:
    EE+Eid+Eid+EEid+idEid+idEE \Rightarrow \underline{E} + E \Rightarrow id + E \Rightarrow id + E * E \Rightarrow id + id * E \Rightarrow id + id * E
  2. Prawostronne wyprowadzenie:
    EE+EE+EEE+EidE+ididid+ididE \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 wTw \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 ABA \to B (produkcje jednostkowe), gdzie A,BNA, 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 ANA \in N' istnieje wTw \in T^* takie, że AwA \Rightarrow^* w.

7.1. D-d (szkic)

  1. NSN_S \gets \emptyset
  2. Nn{A:(Aw)PwT}N_n \gets \left\{ A: (A \to w) \in P \land w \in T^* \right\}
  3. while NSNnN_S \neq N_n:
    1. NSNnN_S \gets N_n
    2. NnNS{A:(Aα)Pα(TNS)}N_n \gets N_S \cup \left\{ A: (A \to \alpha) \in P \land \alpha \in (T \cup N_S)^* \right\}
  4. NNnN' \gets N_n
  5. P{(Aα)P:ANnα(TNS)}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(NT)X \in (N' \cup T') istnieją α,β(NT)\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ć NN':
    1. Jeśli ANA \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 NN' a terminale do TT'
  3. Do PP' przenieś tylko te produkcje z PP, które zawierają symbole z NT{ε}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 GG' 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 ABA \Rightarrow^* B oraz ABA \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 ABCA \to BC lub AaA \to a, gdzie A,B,CNA,B,C \in N oraz aTa \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 AaA \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 CaaC_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 AB1BnA \to B_1\dots B_n dla n>2n > 2, to tworzymy nowe nieterminale D1,,Dn2D_1,\dots,D_{n-2} i zastępujemy tę produkcję przez AB1D1,D1B2D2,,Dn3Bn2Dn2,Dn2Bn1BnA \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 AaαA \to a\alpha, gdzie AN,aT,,αNA \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 AAα1Aα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βiB1isBαjαjB1jr \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 AAαiA \to A \alpha_i musi kiedyś skończyć się produkcją AβjA \to \beta_j: AAαi1Aαi2αi1Aα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αi2BBjα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 AaαA \to a \alpha, gdzie aT,AN,αNa \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 AiAjαA_i \to A_j \alpha to i<ji < j.

  1. for k1k \gets 1 to nn:
    1. for j1j \gets 1 to (k1)(k-1):
      1. Za każdą produkcję postaci AkAjα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 AkAkα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. AiAjγA_i \to A_j \gamma, gdzie zawsze i<ji < j
  2. AiaγA_i \to a \gamma, gdzie aTa \in T
  3. BiγB_i \to \gamma, dzie γ(N{B1,,Bi1})\gamma \in (N \cup \{B_1, \dots, B_{i-1}\})^*.

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

Teraz rozważmy An1A_{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 A3A1A2A_3 \to A_1 A_2 więc z Lemat#1 dostajemy A3A2A3A2A_3 \to A_2 A_3 A_2.

Dalej nie pasuje, więc ponownie z Lemat#1 otrzymujemy A3A3A1A3A2bA3A2A_3 \to A_3 A_1 A_3 A_2 | b A_3 A_2.

Teraz mamy A3A3A1A3A2bA3A2aA_3 \to A_3 A_1 A_3 A_2 | b A_3 A_2 | a, korzystamy z Lemat#2 i otrzymujemy
A3aaB3bA3A2bA3A2B3A_3 \to a| aB_3 | b A_3 A_2 | b A_3 A_2 B_3 oraz B3A1A3A2A1A3A2B3B_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: