Języki, automaty i obliczenia/Wykład 10: Lemat o pompowaniu dla języków bezkontekstowych. Własności języków bezkontekstowych. Problemy rozstrzygalne: Różnice pomiędzy wersjami
Matiunreal (dyskusja | edycje) Nie podano opisu zmian |
m Zastępowanie tekstu – „,...,” na „,\ldots,” |
||
(Nie pokazano 94 wersji utworzonych przez 5 użytkowników) | |||
Linia 1: | Linia 1: | ||
Wprowadzimy i udowodnimy najprostszą wersję lematu o pompowaniu dla języków bezkontekstowych. | |||
== | ==Lemat o pompowaniu== | ||
Istotną cechą języków regularnych jest własność pompowania, którą ustaliliśmy | Istotną cechą języków regularnych jest własność pompowania, którą ustaliliśmy | ||
Linia 13: | Linia 10: | ||
dostatecznie długiego słowa w gramatyce. | dostatecznie długiego słowa w gramatyce. | ||
{{lemat|1|| | {{lemat|1.1|| | ||
(o pompowaniu) Dla dowolnego języka bezkontekstowego <math> | (o pompowaniu) Dla dowolnego języka bezkontekstowego <math>L \subset A^*</math> istnieją liczby | ||
naturalne <math> | naturalne <math>N,M \geqslant 1</math> takie, że każde słowo <math>w \in L</math> o długości <math>|w| > N</math> można | ||
przedstawić w formie <math> | przedstawić w formie <math>w=u_1w_1uw_2u_2</math>, gdzie <math>w_{1,}w_{2},v_{1},v_{2},u\in A^{*}</math> oraz | ||
oraz | # <math>|w_1uw_2| \leqslant M</math> | ||
# <math> | # <math>w_1w_2 \neq 1</math> | ||
# <math> | # <math>u_1w_1^iuw_2^iu_2 \in L</math> dla <math>i=0,1,.</math>.. | ||
# <math> | |||
}} | }} | ||
Zanim przeprowadzimy dowód lematu zobaczmy jak stosuje się ten lemat do języka generowanego | Zanim przeprowadzimy dowód lematu, zobaczmy jak stosuje się ten lemat do języka generowanego | ||
przez gramatykę <math> | przez gramatykę <math>(\{v_0,v_1,v_2 \},\{a,b\},v_0,P)</math>, <br> | ||
gdzie <math> | gdzie <math>P: v_0 \rightarrow v_1v_2, \;v_1 \rightarrow av_2 b , v_2 \rightarrow b\;|\;v_0b</math>.<br> | ||
[[File:ja-lekcja10-w-anim1.mp4|250x250px|thumb|center|Animacja 1]] | |||
{{dowod||| | {{dowod||| | ||
Załóżmy, bez utraty ogólności rozważań (dlaczego?), że język bezkontekstowy <math> | Załóżmy, bez utraty ogólności rozważań (dlaczego?), że język bezkontekstowy <math>L</math> | ||
nie zawiera słowa pustego i jest | nie zawiera słowa pustego i jest | ||
generowany przez gramatykę <math> | generowany przez gramatykę <math>G=(V_N,V_T,v_0,P)</math> | ||
w normalnej postaci Chomsky' ego. | w normalnej postaci Chomsky'ego. | ||
Rozważmy dowolne wyprowadzenie w <math> | Rozważmy dowolne wyprowadzenie w <math>G</math> | ||
<center><math> | <center><math>w_0 \mapsto w_1 \mapsto ... \mapsto w_r</math></center> | ||
o długości <math> | o długości <math>r \geqslant 1</math> i <math>w_0 \in V_N</math>. Niech najdłuższa ścieżka | ||
w drzewie binarnym <math> | w drzewie binarnym <math>T</math> tego wyprowadzenia ma długość <math>k</math> | ||
(jako długość przyjmujemy tutaj liczbę | (jako długość przyjmujemy tutaj liczbę | ||
wierzchołków, przez które przechodzi ścieżka). Indukcyjne ze względu na <math> | wierzchołków, przez które przechodzi ścieżka). Indukcyjne ze względu na <math>k</math> łatwo jest | ||
uzasadnić, że <center><math> | uzasadnić, że <center><math>|w_r| \leqslant 2^{k-1}</math>.</center> | ||
Załóżmy teraz, że zbiór <math> | Załóżmy teraz, że zbiór <math>V_N</math> ma <math>p</math> elementów i | ||
przyjmijmy <math> | przyjmijmy <math>N=2^p</math> oraz <math>M=2^{p+1}</math>. Niech <math>w \in L(G)</math> będzie słowem, którego długość jest | ||
większa od <math> | większa od <math>N</math>. | ||
Zatem najdłuższa ścieżka <math> | Zatem najdłuższa ścieżka <math>S</math> w drzewie wyprowadzenia <math>T</math> będącego | ||
wyprowadzeniem słowa <math> | wyprowadzeniem słowa <math>w</math> w | ||
gramatyce <math> | gramatyce <math>G</math> ma długość co najmniej <math>p+2</math>. A więc przechodzi przez co najmniej <math>p+2</math> | ||
wierzchołków. Stąd, że | wierzchołków. Stąd, że | ||
wierzchołki maksymalne drzewa wyprowadzenia mają etykiety terminalne wnioskujemy, | wierzchołki maksymalne drzewa wyprowadzenia mają etykiety terminalne, wnioskujemy, że w <math>S</math> występują dwa różne wierzchołki <math>s_1, s_2</math> etykietowane przez ten sam symbol nieterminalny <math>v</math>. Przyjmijmy, że wierzchołek <math>s_1</math> jest bliższy wierzchołka początkowego drzewa wyprowadzenia niż <math>s_2</math>. Wierzchołki <math>s_1, s_2</math> można tak dobrać, aby podścieżka ścieżki <math>S</math> o początku w wierzchołku <math>s_1</math> miała długość równą | ||
że w <math> | co najwyżej <math>p+2</math>. Zauważmy teraz, że żadna ścieżka poddrzewa <math>T_1</math>, którego wierzchołkiem początkowym jest <math>s_1</math>, | ||
wierzchołki <math> | nie ma długości większej niż <math>p+2</math>. Jeśli więc <math>\overline w</math> jest słowem | ||
Przyjmijmy, że wierzchołek <math> | określonym przez liście <math>T_1</math>, to | ||
bliższy wierzchołka początkowego drzewa wyprowadzenia niż <math> | |||
Wierzchołki <math> | |||
aby podścieżka ścieżki <math> | |||
co najwyżej <math> | |||
Zauważmy teraz, że żadna ścieżka poddrzewa | |||
<math> | |||
nie ma długości większej niż <math> | |||
określonym przez liście <math> | |||
to | |||
<center><math> | <math>\mbox{(1)}</math> | ||
|\overline{w}|\leqslant 2^{(p+2)-1}=M | <center><math> | ||
</math></center> | |\overline{w}|\leqslant 2^{(p+2)-1}=M</math></center> | ||
Rozważmy teraz poddrzewo <math> | Rozważmy teraz poddrzewo <math>T_2</math> drzewa <math>T</math> o wierzchołku początkowym w <math>s_2</math> | ||
i niech <math> | i niech <math>u</math> będzie słowem określonym | ||
przez liście <math> | przez liście <math>T_2</math>. Wtedy <math>\overline w= w_1uw_2</math> dla pewnych <math>w_1, w_2 \in V_T^*</math>. | ||
W połączeniu z nierównością | W połączeniu z nierównością <math>\mbox{(1)}</math> uzyskujemy pierwszą własność postulowaną w lemacie. Co więcej, <math>w_1w_2 \neq 1</math>, | ||
uzyskujemy pierwszą własność postulowaną w lemacie. Co więcej, <math> | |||
ponieważ pierwsza produkcja wyprowadzenia | ponieważ pierwsza produkcja wyprowadzenia | ||
<math> | <math>v\mapsto^{*}\overline{w}</math> jest postaci <math>v \rightarrow v_1v_2</math> dla pewnych | ||
<math> | <math>v_{1},\, v_{2}\in V_{N}</math> , a w gramatyce nie | ||
ma produkcji wymazującej. Zatem dla pewnych <math> | ma produkcji wymazującej. Zatem dla pewnych <math>u_1, u_2 \in V^*_T</math> jest | ||
<center><math> | <center><math>v_{0}\mapsto^{*}u_{1}vu_{2}\mapsto^{*}u_{1}uu_{2}</math></center> | ||
lub <center><math> | lub <center><math>v_0 \mapsto^* u_1vu_2 \mapsto^* u_1w_1vw_2u_2 \mapsto^* u_1 w_1 uw_2 u_2 = w</math></center> | ||
lub | lub | ||
<center><math> | <center><math>v_{0}\mapsto^{*}u_{1}vu_{2}\mapsto^{*}u_{1}w_{1}vw_{2}u_{2}\mapsto^{*}u_{1}w^{i}_{1}vw^{i}_{2}u_{2}\mapsto^{*}u_{1}w^{i}_{1}uw^{i}_{2}u_{2}</math></center> | ||
dla <math> | dla <math>i=1,2,\ldots</math> | ||
W konsekwencji <math> | W konsekwencji <math>u_1w_1^iuw_2^iu_2 \in L</math> dla dowolnego <math>i=0,1,.</math>... Lemat zatem został | ||
udowodniony. | udowodniony. | ||
}} | |||
Analogicznie jak w przypadku języków regularnych, lemat o pompowaniu dla języków bezkontekstowych | Analogicznie jak w przypadku języków regularnych, lemat o pompowaniu dla języków bezkontekstowych | ||
stosuje się najczęściej do uzasadnienia, | stosuje się najczęściej do uzasadnienia, | ||
że pewne języki nie należą do rodziny <math> | że pewne języki nie należą do rodziny <math>\mathcal{L}_{2}</math>. | ||
Takie właśnie zastosowanie przedstawione jest poniżej, na przykładzie | Takie właśnie zastosowanie przedstawione jest poniżej, na przykładzie | ||
języka, o którym pó{z}niej | języka, o którym pó{z}niej udowodnimy, że jest kontekstowy, czyli należy do rodziny języków <math>\mathcal{L}_{1}</math>. | ||
języków <math> | |||
{{przyklad||| | {{kotwica|prz.1.1|}}{{przyklad|1.1|| | ||
Niech <math> | Niech <math>L=\{a^nb^nc^n : n \geqslant 1 \}</math>. Przeprowadzając rozumowanie nie wprost, a więc | ||
zakładając bezkontekstowość | zakładając bezkontekstowość | ||
tego języka, z lematu o pompowaniu uzyskujemy odpowiednie stałe <math> | tego języka, z lematu o pompowaniu uzyskujemy odpowiednie stałe <math>M, N</math>. | ||
Niech <math> | Niech <math>k > \frac{N}{3}</math> i rozważmy słowo <math>x_1=a^kb^kc^k</math>. Zatem | ||
istnieje rozkład <math> | istnieje rozkład <math>x_1=u_1w_1uw_2u_2</math>, <math>w_1w_2 \neq 1</math> oraz <math>x_i=u_1w_1^iuw_2^iu_2 \in L</math> | ||
dla <math> | dla <math>i=0,1,.</math>.. | ||
Z postaci słów języka <math> | Z postaci słów języka <math>L</math> oraz z faktu <math>w_1w_2 \neq 1</math> wnioskujemy, że słowa <math>w_1, w_2</math> | ||
są potęgami | są potęgami | ||
jednej z liter <math> | jednej z liter <math>a,b,c</math> oraz że <math>|x_i| \longrightarrow \infty</math>, o ile <math>i \longrightarrow \infty</math>. | ||
A to wyklucza możliwość | A to wyklucza możliwość | ||
zachowania własności | zachowania własności określającej język <math>L</math>. Otrzymana sprzeczność prowadzi do wniosku, iż | ||
język <math> | język <math>\{a^nb^nc^n : n \geqslant 1 \}</math> nie jest bezkontekstowy. | ||
Lemat o pompowaniu wykorzystywany bywa również w dowodach rozstrzygalności pewnych | Lemat o pompowaniu wykorzystywany bywa również w dowodach rozstrzygalności pewnych | ||
problemów w rodzinie języków rozpoznawalnych. Zagadnieniem tym zajmiemy się w | problemów w rodzinie języków rozpoznawalnych. Zagadnieniem tym zajmiemy się w | ||
dalszej części tego wykładu. | dalszej części tego wykładu. | ||
}} | |||
== | ==Własności rodziny języków bezkontekstowych== | ||
Przedstawimy teraz podstawowe własności rodziny języków bezkontekstowych | Przedstawimy teraz podstawowe własności rodziny języków bezkontekstowych | ||
Linia 125: | Linia 109: | ||
z problemami jednoznaczności. | z problemami jednoznaczności. | ||
{{twierdzenie||| | {{kotwica|tw.1|}}{{twierdzenie|2.1|| | ||
Rodzina języków bezkontekstowych <math> | Rodzina języków bezkontekstowych <math>\mathcal{L}_{2}</math> jest zamknięta ze względu | ||
na następujące działania: | na następujące działania: | ||
# sumę mnogościową, | # sumę mnogościową, | ||
# katenację i operację iteracji <math> | # katenację i operację iteracji <math>*</math>, | ||
# | # przecięcie (iloczyn mnogościowy) z językiem regularnym, | ||
# homomorfizm | # homomorfizm. | ||
}} | }} | ||
{{dowod||| | {{dowod||| | ||
1. Niech <math>G_i = (V^i_N ,V_T,v^i_0,P_i)</math> będą gramatykami bezkontekstowymi dla <math>i=1,2</math> takimi, że <math>V^1_N \cap V^2_N = \emptyset</math> oraz <math>L_i = L(G_i)</math>. Język <math>L = L_1 \cup L_2</math> jest generowany przez gramatykę bezkontekstową określoną w następujący sposób: <center><math>G= (V^1_N \cup V^2_N \cup \{v_0\},V_T,v_0,P^1 \cup P^2 \cup \{ v_0 \rightarrow v^1_0 , v_0 \rightarrow {v_0}^2 \})</math>.</center> | |||
dla <math> | |||
że <math> | |||
generowany | |||
przez gramatykę bezkontekstową określoną w następujący sposób: | |||
<center><math> | |||
2. Przy powyższych oznaczeniach, język <math>L = L_1 \cdot L_2</math> jest generowany przez gramatykę bezkontekstową: <center><math>G= (V^1_N \cup V^2_N \cup \{ v_0 \},V_T,v_0,P^1 \cup P^2 \cup \{ v_0 \rightarrow v^1_0 v^2_0 \})</math>.</center> | |||
gramatykę bezkontekstową: | Jeśli <math>L = L(G)</math>, dla <math>G = (V_N ,V_T,v_0,P)</math> gramatyki bezkontekstowej, to <math>L^* = L(\overline{G})</math> dla gramatyki <center><math>\overline{G} = ( V_N \cup \{\overline{v}_0 \} , V_T , \overline{v}_0,P \cup \{ \overline{v}_0 \rightarrow 1 , \overline{v}_0 \rightarrow \overline{v}_0 v_0 \}</math>,</center> która jest również gramatyką bezkontekstową.<br> | ||
<center><math> | |||
3. Niech <math>R</math> będzie dowolonym językiem rozpoznawanym przez pewien automat skończenie stanowy <math>\mathcal{A} =(S,f,s_0,T)</math>. Język ten możemy przedstawić w postaci sumy <math>R=\bigcup_{i=1}^k R_i</math>, w której każdy język <math>R_i</math> jest rozpoznawany przez automat <math>\mathcal{A}</math> , w którym jako stan końcowy przyjmujemy <math>t_i \in T</math>. Rodzina języków bezkontekstowych jest zamknięta ze względu na sumę mnogościową i oczywista jest równość <math>L \cap R= \bigcup _{i=1}^k (L \cap R_i)</math>. Wystarczy zatem udowodnić, że język <math>L \cap R_i</math> jest bezkontekstowy. Załóżmy, że <math>T=\{t \}</math> oraz <math>L</math> jest językiem generowanym przez gramatykę bezkontekstową <math>G = (V_N ,V_T,v_0,P)</math> w normalnej postaci Chomsky'ego. Bez utraty ogólności rozważań można także założyć, że <math>1\notin L</math>. Konstruujemy gramatykę <center><math>H=(S \times (V_N \cup V_T) \times S,V_T,(s_0,v_0,t),P_H)</math>,</center> dla której <math>P_H</math> zawiera następujące produkcje: | |||
<math>\ | * <math>(s_1,v_1,s_2) \rightarrow (s_1,v_2,s_3)(s_3,v_3,s_2)</math> dla <math>s_i \in S</math>, <math>v_i \in V_N</math> jeśli <math>v_1\rightarrow v_2v_3 \in P</math>, | ||
* <math>(s_1,v_1,s_2) \rightarrow (s_1,a,s_2)</math> dla <math>s_i \in S</math>, <math>a \in V_T</math> jeśli <math>v_1\rightarrow a \in P</math>, | |||
* <math>(s_1,a,s_2)\rightarrow a</math> dla <math>s_i \in S</math>, <math>a \in V_T</math> jeśli <math>f(s_1,a)=s_2</math>. | |||
Bezpośrednio z konstrukcji wynika, że gramatyka <math>H</math> jest bezkontekstowa. Łatwo również zauważyć, że język generowany przez gramatykę <math>H</math> jest równy <math>L \cap R</math>. | |||
4. Niech <math>h: A^* \longrightarrow B^*</math> oznacza dowolny homomorfizm, a <math>L \subset A^*</math> językiem bezkontekstowym generowanym przez gramatykę <math>G = (V_N ,A,v_0,P)</math>. Rozszerzamy homomorfizm <math>h</math> do wolnych monoidów <math>(A \cup V_N)^*</math> i <math>(B \cup V_N)^*</math>, przyjmując, że <math>h</math> na zbiorze <math>V_N</math> jest równe identyczności. Łatwo zauważyć, że język <math>h(L)</math> jest generowany przez gramatykę bezkontekstową <math>G = (V_N, B, v_0, P_h)</math>, w której <center><math>P_h=\{ v \rightarrow h(w) : v \rightarrow w \in P \}</math>.</center> | |||
}} | |||
Z równości <math>L\setminus R=L\cap \overline{R}</math> , | |||
zamkniętości klasy <math>\mathcal{L}_{3}</math> ze względu na uzupełnienie | |||
Z równości <math> | oraz z punktu 3 udowodnionego powyżej twierdzenia wynika następujący | ||
zamkniętości klasy <math> | |||
oraz z punktu | |||
wniosek. | wniosek. | ||
{{wniosek||| | {{wniosek|2.1|| | ||
Niech <math> | Niech <math>L \subset A^*</math> będzie dowolonym językiem bezkontekstowym, a | ||
<math> | <math>R \subset A^*</math> regularnym. Wtedy <math>L \setminus R</math> jest | ||
językiem bezkontekstowym. | językiem bezkontekstowym. | ||
Linia 205: | Linia 152: | ||
języków bezkontekstowych. | języków bezkontekstowych. | ||
{{fakt||| | {{fakt|2.1|| | ||
Rodzina języków bezkontekstowych <math> | Rodzina języków bezkontekstowych <math>\mathcal{L}_{2}</math> jest zamknięta ze | ||
względu na podstawienie | względu na podstawienie | ||
regularne i przeciwobraz przez homomorfizm. | regularne i przeciwobraz przez homomorfizm. | ||
Linia 217: | Linia 164: | ||
bezkontekstowych jest suma mnogościowa. | bezkontekstowych jest suma mnogościowa. | ||
{{twierdzenie||| | {{twierdzenie|2.2|| | ||
Rodzina języków bezkontekstowych <math> | Rodzina języków bezkontekstowych <math>\mathcal{L}_{2}</math> nie jest zamknięta ze względu na: | ||
# iloczyn mnogościowy | # iloczyn mnogościowy, | ||
# uzupełnienie | # uzupełnienie. | ||
}} | }} | ||
{{dowod||| | {{dowod||| | ||
Dla <math> | Dla <math>i=1,2</math> niech <math>G_i = (\{ v_0 , v_1\},\{ a,b,c\},{v_0},P_i)</math> będą gramatykami | ||
o następujących zbiorach praw: | o następujących zbiorach praw: | ||
<center><math> | <center><math>\begin{array} {l} | ||
P_1 = \{ v_0 \rightarrow v_0 c, \; v_0 \rightarrow v_1 c, \; v_1 \rightarrow ab, \; v_1 \rightarrow a v_1 b \} \\ | P_1 = \{ v_0 \rightarrow v_0 c, \; v_0 \rightarrow v_1 c, \; v_1 \rightarrow ab, \; v_1 \rightarrow a v_1 b \}, \\ | ||
P_2 = \{ v_0 \rightarrow a v_0 , \; v_0 \rightarrow a v_1 , \; v_1 \rightarrow bc, \; v_1 \rightarrow b v_1 c \}. | P_2 = \{ v_0 \rightarrow a v_0 , \; v_0 \rightarrow a v_1 , \; v_1 \rightarrow bc, \; v_1 \rightarrow b v_1 c \}. | ||
\end{array} | \end{array}</math></center> | ||
Gramatyki te są bezkontekstowe i generują, odpowiednio, następujące języki: | Gramatyki te są bezkontekstowe i generują, odpowiednio, następujące języki: | ||
<center><math> | <center><math>L(G_{1})=\left\{ a^{n}b^{n}c^{m}:n,m\geqslant 1\right\} \in \mathcal{L}_{2}</math>,</center> | ||
<center><math> | <center><math>L(G_{2})=\left\{ a^{n}b^{m}c^{m}:n,m\geqslant 1\right\} \in \mathcal{L}_{2}</math>.</center> | ||
Języki te są bezkontekstowe, lecz ich przecięcie | Języki te są bezkontekstowe, lecz ich przecięcie | ||
<center><math> | <center><math>L(G_{1})\cap L(G_{2})=\left\{ a^{n}b^{n}c^{n}\, :\, n\geqslant 1\right\} \notin \mathcal{L}_{2}</math></center> | ||
jest językiem istotnie kontekstowym. | jest językiem istotnie kontekstowym. | ||
Z udowodnionej właśnie własności oraz z praw de'Morgana | Z udowodnionej właśnie własności oraz z praw de'Morgana | ||
wynika, że rodzina <math> | wynika, że rodzina <math>\mathcal{L}_{2}</math> nie jest też domknięta ze względu na uzupełnienie. | ||
}} | |||
== | ==Jednoznaczność języków bezkontekstowych== | ||
Omówimy teraz, dość ogólnie zresztą, problem występujący w niektórych | Omówimy teraz, dość ogólnie zresztą, problem występujący w niektórych gramatykach bezkontekstowych, a polegający na wielokrotnym wyprowadzeniu tego samego słowa. Z punktu widzenia języków programowania, których syntaktykę opisują, w pewnym zakresie, gramatyki bezkontekstowe, taka nadmiarowość (niejednoznaczność parsingu) jest cechą wysoce niepożądaną. Gramatyki, które nie będą mieć takiej własności nazwiemy jednoznacznymi. Jednoznacznym nazwiemy też język, dla którego istnieje gramatyka jednoznaczna. | ||
gramatykach bezkontekstowych, a polegający na | |||
wielokrotnym | |||
wyprowadzeniu tego samego słowa. Z punktu widzenia języków programowania, | |||
których syntaktykę | |||
opisują, w pewnym zakresie, gramatyki bezkontekstowe taka nadmiarowość (niejednoznaczność | |||
parsingu) jest cechą wysoce | |||
Jednoznacznym nazwiemy też język dla którego istnieje gramatyka jednoznaczna. | |||
{{definicja||| | {{definicja|3.1|| | ||
Niech <math> | Niech <math>G = (V_N,V_T,v_0,P)</math> będzie gramatyką bezkontekstową. '''Lewostronnym''' ('''prawostronnym''') '''wyprowadzeniem''' słowa <math>w \in {V_T}^*</math> w gramatyce <math>G</math> nazywamy wyprowadzenie <center><math>v_0 \mapsto w_1 \mapsto \ldots.. \mapsto w_n = w</math></center> takie, że dla każdego <math>i=0,\ldots,n-1, \;\; w_{i+1}</math> jest generowane bezpośrednio z <math>w_i</math> przez zastąpienie pierwszego z lewej (prawej) symbolu nieterminalnego występującego w słowie <math>w_i</math>. | ||
'''Lewostronnym''' | |||
('''prawostronnym''') | |||
'''wyprowadzeniem''' słowa <math> | |||
wyprowadzenie <center><math> | |||
takie, | |||
że dla każdego <math> | |||
generowane bezpośrednio z <math> | |||
symbolu nieterminalnego występującego w słowie <math> | |||
}} | }} | ||
Jeśli chcemy zaznaczyć, że wyprowadzenie jest lewostronne lub | Jeśli chcemy zaznaczyć, że wyprowadzenie jest lewostronne lub prawostronne, to posługujemy się zapisem | ||
prawostronne, to posługujemy się zapisem | |||
<center><math> | <center><math>v_{0}\mapsto_{L}^{*}w,\; v_{0}\mapsto_{P}^{*}w</math>.</center> | ||
Każde wyprowadzenie słowa w gramatyce bezkontekstowej | Każde wyprowadzenie słowa w gramatyce bezkontekstowej można tak uporządkować, by sekwencja produkcji tworzyła prawostronne lub lewostronne wyprowadzenie. Stąd wynika też fakt, że dowolne słowo generowane przez gramatykę bezkontekstową ma tyle samo wyprowadzeń lewostronnych, co prawostronnych. Ilość różnych wyprowadzeń danego słowa jest w niektórych zastosowaniach | ||
można tak uporządkować, by sekwencja produkcji | gramatyk bezkontekstowych dość istotna, choćby w problemach parsingu, czyli poszukiwania w gramatyce wyprowadzenia dla danego słowa. Ilość różnych wyprowadzeń słów w gramatyce stanowi pewną informację na temat nadmiarowości tej gramatyki. Bardzo istotną rolę odgrywają zarówno w teorii, jak i zastosowaniach - gramatyki bezkontekstowe jednoznaczne, których definicję podajemy poniżej. | ||
tworzyła prawostronne lub | |||
lewostronne wyprowadzenie. Stąd wynika też | |||
fakt, że dowolne słowo generowane przez gramatykę bezkontekstową ma | |||
tyle samo | |||
wyprowadzeń lewostronnych, co prawostronnych. Ilość różnych wyprowadzeń danego słowa | |||
jest w niektórych zastosowaniach | |||
gramatyk bezkontekstowych dość istotna, choćby w problemach parsingu, czyli | |||
poszukiwania w gramatyce wyprowadzenia dla danego słowa. | |||
Ilość różnych wyprowadzeń słów w gramatyce stanowi pewną informację na temat nadmiarowości | |||
tej gramatyki. Bardzo istotną rolę odgrywają | |||
zarówno w teorii, jak i zastosowaniach gramatyki bezkontekstowe jednoznaczne, | |||
których definicję podajemy poniżej. | |||
{{definicja||| | {{definicja|3.2|| | ||
Gramatyka bezkontekstowa <math> | Gramatyka bezkontekstowa <math>G</math> jest '''jednoznaczna''' wtedy i tylko wtedy, gdy każde słowo generowane przez tę gramatykę ma dokładnie jedno wyprowadzenie lewostronne (prawostronne). Język bezkontekstowy <math>L</math> nazywamy jednoznacznym, jeśli istnieje jednoznaczna gramatyka bezkontekstowa generująca ten język. | ||
wtedy i | |||
gdy każde słowo generowane przez tę gramatykę ma dokładnie jedno wyprowadzenie | |||
lewostronne (prawostronne). | |||
Język bezkontekstowy <math> | |||
jednoznaczna gramatyka bezkontekstowa generująca | |||
ten język. | |||
}} | }} | ||
Jednoznaczność gramatyki oznacza istnienie | Jednoznaczność gramatyki oznacza istnienie dokładnie jednego drzewa wywodu dla każdego generowanego słowa. W klasie gramatyk bezkontekstowych problem jednoznaczności jest nierozstrzygalny. W rozdziale poświęconym algorytmicznej rozstrzygalności wrócimy do tego zagadnienia. Oczywiście wobec powyższego nierozstrzygalny jest też problem jednoznaczności języka. Problem jednoznaczności gramatyki i języka jest rozstrzygalny w podklasach języków | ||
dokładnie jednego drzewa wywodu dla każdego generowanego słowa. | |||
W klasie gramatyk bezkontekstowych problem jednoznaczności jest nierozstrzygalny. | |||
W rozdziale poświęconym algorytmicznej rozstrzygalności wrócimy do | |||
tego zagadnienia. Oczywiście wobec powyższego nierozstrzygalny jest też problem | |||
jednoznaczności języka. | |||
Problem jednoznaczności gramatyki i języka jest rozstrzygalny w podklasach języków | |||
bezkontekstowych, na przykład dla klasy języków ograniczonych, to znaczy takich | bezkontekstowych, na przykład dla klasy języków ograniczonych, to znaczy takich | ||
<math> | <math>L\subset A^{*}</math> , że <math>L\subset w_{1}^{*}...w_{n}^{*}</math> dla pewnych słów <math>w_{1},\ldots,w_{n}\in A^{*}</math> . | ||
słów <math> | |||
{{przyklad||| | {{przyklad|3.1|| | ||
Język <math> | Język <math>\left\{ a^{n}b^{n+m}c^m\, :\, n,m>0\right\}</math> | ||
generowany przez gramatykę <math> | generowany przez gramatykę <math>G=(V_{N},V_{T},v_{0},P)</math> , gdzie <math>V_{N}=\{v_{0},v_{1}\}</math> , | ||
<math> | <math>V_{T}=\{a,b,c\}</math> oraz<br> | ||
<math> | <math>P= v_{0}\rightarrow v_1 v_2 , \;\; v_1 \rightarrow av_{1}b\;|ab, \;\; v_2 \rightarrow bv_2c, \;|bc</math> <br> | ||
jest, jak łatwo sprawdzić, językiem jednoznacznym.<br> | jest, jak łatwo sprawdzić, językiem jednoznacznym.<br> | ||
}} | }} | ||
Mówimy, że język <math> | Mówimy, że język <math>L\in \mathcal{L}_{2}</math> jest '''niejednoznaczny''', | ||
jeśli nie jest jednoznaczny, czyli nie istnieje gramatyka jednoznaczna | jeśli nie jest jednoznaczny, czyli nie istnieje gramatyka jednoznaczna generująca ten język. Przykładem języka niejednoznacznego jest | ||
generująca ten język. Przykładem języka niejednoznacznego | |||
jest | |||
<center><math> | <center><math>L=\left\{ a^{n}b^{n}c^{m}d^m\, :\, m,n\geqslant 1\right\} \cup \left\{ a^{n}b^{m}c^{m}d^n\, :\, m,n\geqslant 1\right\}</math>.</center> | ||
Uzasadnienie tego faktu jest dosyć żmudne i dlatego zostało tutaj pominięte. | Uzasadnienie tego faktu jest dosyć żmudne i dlatego zostało tutaj pominięte. | ||
Zauważmy na koniec tego krótkiego omówienia problematyki jednoznaczności gramatyk, | Zauważmy na koniec tego krótkiego omówienia problematyki jednoznaczności gramatyk, że każdy język regularny (ale nie każda gramatyka regularna) jest jednoznaczny. Jednoznaczna | ||
że każdy język regularny (ale nie każda gramatyka regularna) jest | jest bowiem gramatyka otrzymana z automatu deterministycznego generującego ten język. | ||
jednoznaczny. Jednoznaczna | |||
jest bowiem gramatyka otrzymana z automatu deterministycznego generującego ten | |||
język. | |||
Jednoznaczny jest również język bezkontekstowy, który jest iloczynem | Jednoznaczny jest również język bezkontekstowy, który jest iloczynem <math>L\cap R</math> , gdzie <math>L\in \mathcal{L}_{2}</math> i jest językiem jednoznacznym, a <math>R\in \mathcal{L}_{3}</math> . Gramatyka tego języka, skonstruowana w punkcie [[#prz.3|3]] w twierdzeniu [[#tw.1|2.1]] jest jednoznaczna, co wynika stąd, że automat rozpoznający <math>R</math> jest deterministyczny. | ||
<math> | |||
a <math> | |||
w punkcie [[# | |||
rozpoznający <math> | |||
== | ==Problemy rozstrzygalne algorytmicznie== | ||
Podobnie jak dla języków regularnych tak i w przypadku bezkontekstowych lemat | Podobnie jak dla języków regularnych tak i w przypadku bezkontekstowych lemat o pompowaniu wykorzystuje się do uzasadnienia rozstrzygalności pewnych problemów. Dla rodziny języków bezkontekstowych mamy następujące twierdzenie. | ||
o pompowaniu wykorzystuje się do | |||
problemów. | |||
Dla rodziny języków bezkontekstowych mamy następujące twierdzenie. | |||
{{twierdzenie||| | {{twierdzenie|4.1|| | ||
W rodzinie | W rodzinie języków bezkontekstowych <math>\mathcal{L}_{2}</math> następujące | ||
problemy | problemy są rozstrzygalne: | ||
# problem niepustości języka, | # problem niepustości języka, <math>L\neq \emptyset</math> | ||
# problem nieskończoności języka, <math> | # problem nieskończoności języka, <math>card\, L=\aleph _{0}</math> | ||
# problem należenia słowa <math> | # problem należenia słowa <math>w</math> do języka <math>L</math>. | ||
}} | }} | ||
{{dowod||| | {{dowod||| | ||
Aby udowodnić punkt 1 wykorzystamy następującą równoważność: | Aby udowodnić punkt 1, wykorzystamy następującą równoważność: | ||
<center><math>L\neq \emptyset \; \Longleftrightarrow \; \exists w\in L\, :\, |w|\leqslant N</math>.</center> | |||
na | Uzasadnienie tej równoważności polega na rozkładzie słowa <math>w</math> spełniającego warunek <math>N<|w|</math> (zgodnie z oznaczeniami i tezą lematu o pompowaniu) i zastąpieniu go słowem | ||
(zgodnie z oznaczeniami i tezą lematu o pompowaniu) i zastąpieniu go | <math>u_{1}uu_{2}</math> , które jest istotnie krótsze. Po skończonej ilości takich skracających kroków dostaniemy słowo należące do języka <math>L</math> i spełniające warunek <math>|w|\leqslant N</math> . | ||
<math> | |||
skracających kroków dostaniemy | |||
<math> | |||
warunek <math> | |||
W uzasadnieniu punktu 2 wykorzystamy równoważność | W uzasadnieniu punktu 2 wykorzystamy równoważność | ||
<center><math> | <center><math>card\, L=\aleph _{0}\Longleftrightarrow \; \exists w\in L\, :\, N<|w|\leqslant N+M</math></center> | ||
gdzie <math> | gdzie <math>M,N</math> są stałymi z lematu o pompowaniu. | ||
Przyjmując, iż | Przyjmując, iż język <math>L</math> jest nieskończony, wnioskujemy, że | ||
istnieją w tym języku słowa dowolnie | istnieją w tym języku słowa dowolnie długie. | ||
Niech <math> | Niech <math>w\in L</math> i <math>|w|>N</math> . Jeśli <math>w</math> nie spełnia warunku | ||
<math> | <math>|w|\leqslant N+M</math> , to stosujemy lemat o pompowaniu dla <math>i=0</math> , uzyskując | ||
słowo <math>u_{1}uu_{2}</math> należące do języka i istotnie krótsze | |||
od <math> | od <math>w</math> . Z warunku <math>|w_{1}w_{2}|\leqslant |w_{1}uw_{2}|\leqslant M</math> | ||
(punkt 1 tezy lematu o pompowaniu) wynika, | (punkt 1 tezy lematu o pompowaniu) wynika, iż różnica długości | ||
tych | tych słów nie może być wieksza niż stała <math>M</math> . | ||
Zatem po | Zatem po skończonej ilości kroków uzyskujemy słowo należące | ||
do | do języka i spełniające żądany warunek. | ||
Implikacja w przeciwną stronę ( <math> | Implikacja w przeciwną stronę ( <math>\Leftarrow</math> ) wynika bezpośrednio | ||
z lematu o pompowaniu. Istnieje mianowicie | z lematu o pompowaniu. Istnieje mianowicie nieskończony zbiór słów w postaci | ||
<center><math> | <center><math>u_{1}w_{1}^{i}uw_{2}^{i}u_{2}\in L</math></center> | ||
dla <math> | dla <math>i=0,1,2,...</math>. | ||
Punkt 3 twierdzenia wymaga podania odpowiedniego algorytmu. Jego prezentacją i omówieniem | Punkt 3 twierdzenia wymaga podania odpowiedniego algorytmu. Jego prezentacją i omówieniem | ||
zajmujemy się poniżej. | zajmujemy się poniżej. | ||
}} | |||
<tt>Algorytm CYK - przynależność słowa do języka.</tt> | |||
Rozważmy problem przynależności słowa <math> | Rozważmy problem przynależności słowa <math>w</math> do danego języka, generowanego | ||
przez gramatykę bezkontekstową <math> | przez gramatykę bezkontekstową <math>G</math>. Jest to problem rozstrzygalny. | ||
Bardzo łatwo podać algorytm, wykorzystujący postać normalną | Bardzo łatwo podać algorytm, wykorzystujący postać normalną | ||
Greibach. Po sprowadzeniu gramatyki <math> | Greibach. Po sprowadzeniu gramatyki <math>G</math> do postaci normalnej Greibach prawa strona | ||
każdej produkcji rozpoczyna się symbolem terminalnym i jest to | każdej produkcji rozpoczyna się symbolem terminalnym i jest to | ||
jedyny symbol terminalny. | jedyny symbol terminalny. | ||
Zatem | Zatem jeśli <math>w=a_1a_2...a_n</math>, to należy zbadać | ||
wszystkie wywody w <math> | wszystkie wywody w <math>G</math>, z symbolu początkowego <math>S</math>, o długości dokładnie <math>|w|</math>, | ||
to znaczy wywody złożone z | to znaczy wywody złożone z | ||
dokładnie <math> | dokładnie <math>|w|</math> kroków. Jeśli dla każdego symbolu nieterminalnego istnieje co | ||
najwyżej <math> | najwyżej <math>k</math> produkcji w gramatyce <math>G</math>, w których pojawia się on po lewej stronie, | ||
to algorytm będzie działał w czasie <math> | to algorytm będzie działał w czasie <math>O(k^{|w|})</math>. Metoda ta jest | ||
jednak bardzo nieefektywna. Czasochłonne jest też samo sprowadzenie gramatyki <math> | jednak bardzo nieefektywna. Czasochłonne jest też samo sprowadzenie gramatyki <math>G</math> | ||
do postaci normalnej Greibach. | do postaci normalnej Greibach. | ||
Linia 432: | Linia 319: | ||
Algorytm CYK działa w oparciu o ideę programowania dynamicznego | Algorytm CYK działa w oparciu o ideę programowania dynamicznego | ||
. Rozważmy słowo <math> | . Rozważmy słowo <math>w=a_1a_2...a_n</math> oraz gramatykę <math>G</math>. | ||
Niech zbiór <math> | Niech zbiór <math>V_i^j</math> zawiera wyłącznie te symbole nieterminalne, z których można wywieść | ||
słowo <math> | słowo <math>a_ia_{i+1}...a_{i+j-1}</math>, czyli | ||
<center><math> | <center><math>V_i^j=\{v \in V_N: v \Rightarrow^*_G a_i a_{i+1}... a_{i+j-1} \}</math>.</center> | ||
Mamy zatem następującą równoważność: <center><math>w \in L(G) \Leftrightarrow | |||
v_0 \in V_1^n</math>.</center><br> | |||
Wyjście: TAK lub NIE - odpowiedź na pytanie, czy <math> | {{algorytm|''Cocke-Younger-Kasami'' - sprawdza, czy dane słowo | ||
należy do języka generowanego przez gramatykę bezkontekstową|| | |||
1 Wejście: <math>G=(V_N, V_T, P, v_0)</math>, <math>w \in V_T^*</math> - gramatyka bezkontekstowa i słowo<br> <math>w=a_1a_2...a_n</math> o długości <math>n</math>. | |||
2 Wyjście: TAK lub NIE - odpowiedź na pytanie, czy <math>w \in | |||
L(G)</math>. | L(G)</math>. | ||
3 <math>G \leftarrow</math>''PostaćNormalnaChomsky'ego''<math>(G)</math>; | |||
<math> | 4 '''for''' <math>i=1,\ldots,n</math> '''do''' | ||
5 <math>V_i^1 \leftarrow \{v \in V_N: (v \rightarrow a) \in P, a \in V_T\ \wedge\ a_i=a \}</math>; | |||
'''for''' <math> | 6 '''end for''' | ||
\in V_T\ \wedge\ a_i=a \}</math>; | 7 '''for''' <math>j=2,\ldots,n</math> '''do''' | ||
8 '''for''' <math>i=1,\ldots,n-j+1</math> '''do''' | |||
''' | 9 <math>V_i^j \leftarrow</math>; | ||
10 '''for''' <math>k=1,\ldots,j-1</math> '''do''' | |||
'''for''' <math> | 11 <math>V_i^j \leftarrow V_i^j \cup \{v \in V_N: (v \rightarrow wy) \in P,\ w \in V_i^k,\ y \in V_{i+k}^{j-k}\}</math>; | ||
12 '''end for''' | |||
'''for''' <math> | 13 '''end for''' | ||
14 '''end for''' | |||
'''for''' <math> | 15 '''if''' <math>v_0 \in V_1^n</math> | ||
\in P,\ w \in V_i^k,\ y \in V_{i+k}^{j-k}\}</math>; | 16 '''return''' '''TAK''', <math>w \in L(G)</math>; | ||
17 '''else''' | |||
''' | 18 '''return''' '''NIE''', <math>w \not \in L(G)</math>; | ||
19 '''end if''' | |||
''' | |||
''' | |||
'''if''' <math> | |||
'''return''' '''TAK''', <math> | |||
'''else''' | |||
'''return''' '''NIE''', <math> | |||
''' | |||
}} | }} | ||
Algorytm CYK działa w czasie <math> | Algorytm CYK działa w czasie <math>|w|^3</math>, gdzie <math>|w|</math> jest długością | ||
słowa, o którego przynależność do języka pytamy. | słowa, o którego przynależność do języka pytamy. | ||
{{przyklad||| | {{przyklad|4.1|| | ||
Zbadamy, czy słowo <math> | Zbadamy, czy słowo <math>w=bbaaaa</math> należy do języka generowanego | ||
gramatyką: | gramatyką: | ||
<center><math>\ | <center><math>\begin{align} v & \rightarrow & wx\ |\ yz \\ | ||
w & \rightarrow & wy\ |\ xx\ |\ a \\ | |||
x & \rightarrow & wz\ |\ b \\ | |||
y & \rightarrow & xy\ |\ zz\ |\ a \\ | |||
z & \rightarrow & yy\ |\ b | |||
\ | \end{align}</math></center> | ||
gdzie <math> | gdzie <math>v</math> jest symbolem początkowym. | ||
}} | }} | ||
Poniższa animacja ilustruje działanie algorytmu CYK. | Poniższa animacja ilustruje działanie algorytmu CYK. | ||
[[File:ja-lekcja10-w-anim2.mp4|250x250px|thumb|center|Animacja 2]] | |||
Aktualna wersja na dzień 21:57, 15 wrz 2023
Wprowadzimy i udowodnimy najprostszą wersję lematu o pompowaniu dla języków bezkontekstowych.
Lemat o pompowaniu
Istotną cechą języków regularnych jest własność pompowania, którą ustaliliśmy w lemacie o pompowaniu. Podobną, ale nie taką samą, cechę posiadają języki bezkontekstowe. O ile dla języków regularnych własność pompowania wynikała z istnienia pętli w grafie opisującym automat, to dla języków bezkontekstowych pompowanie jest wynikiem powtarzającego się symbolu nieterminalnego w wyprowadzeniu dostatecznie długiego słowa w gramatyce.
Lemat 1.1
(o pompowaniu) Dla dowolnego języka bezkontekstowego istnieją liczby naturalne takie, że każde słowo o długości można przedstawić w formie , gdzie oraz
- dla ..
Zanim przeprowadzimy dowód lematu, zobaczmy jak stosuje się ten lemat do języka generowanego
przez gramatykę ,
gdzie .
Dowód
Załóżmy, bez utraty ogólności rozważań (dlaczego?), że język bezkontekstowy nie zawiera słowa pustego i jest generowany przez gramatykę w normalnej postaci Chomsky'ego. Rozważmy dowolne wyprowadzenie w
o długości i . Niech najdłuższa ścieżka w drzewie binarnym tego wyprowadzenia ma długość (jako długość przyjmujemy tutaj liczbę wierzchołków, przez które przechodzi ścieżka). Indukcyjne ze względu na łatwo jest
uzasadnić, żeZałóżmy teraz, że zbiór ma elementów i przyjmijmy oraz . Niech będzie słowem, którego długość jest większa od . Zatem najdłuższa ścieżka w drzewie wyprowadzenia będącego wyprowadzeniem słowa w gramatyce ma długość co najmniej . A więc przechodzi przez co najmniej wierzchołków. Stąd, że wierzchołki maksymalne drzewa wyprowadzenia mają etykiety terminalne, wnioskujemy, że w występują dwa różne wierzchołki etykietowane przez ten sam symbol nieterminalny . Przyjmijmy, że wierzchołek jest bliższy wierzchołka początkowego drzewa wyprowadzenia niż . Wierzchołki można tak dobrać, aby podścieżka ścieżki o początku w wierzchołku miała długość równą co najwyżej . Zauważmy teraz, że żadna ścieżka poddrzewa , którego wierzchołkiem początkowym jest , nie ma długości większej niż . Jeśli więc jest słowem określonym przez liście , to
Rozważmy teraz poddrzewo drzewa o wierzchołku początkowym w i niech będzie słowem określonym przez liście . Wtedy dla pewnych . W połączeniu z nierównością uzyskujemy pierwszą własność postulowaną w lemacie. Co więcej, , ponieważ pierwsza produkcja wyprowadzenia jest postaci dla pewnych , a w gramatyce nie ma produkcji wymazującej. Zatem dla pewnych jest
lub
dla
W konsekwencji dla dowolnego ... Lemat zatem został udowodniony.

Analogicznie jak w przypadku języków regularnych, lemat o pompowaniu dla języków bezkontekstowych stosuje się najczęściej do uzasadnienia, że pewne języki nie należą do rodziny . Takie właśnie zastosowanie przedstawione jest poniżej, na przykładzie języka, o którym pó{z}niej udowodnimy, że jest kontekstowy, czyli należy do rodziny języków .
Przykład 1.1
Niech . Przeprowadzając rozumowanie nie wprost, a więc zakładając bezkontekstowość tego języka, z lematu o pompowaniu uzyskujemy odpowiednie stałe . Niech i rozważmy słowo . Zatem istnieje rozkład , oraz dla .. Z postaci słów języka oraz z faktu wnioskujemy, że słowa są potęgami jednej z liter oraz że , o ile . A to wyklucza możliwość zachowania własności określającej język . Otrzymana sprzeczność prowadzi do wniosku, iż język nie jest bezkontekstowy.
Lemat o pompowaniu wykorzystywany bywa również w dowodach rozstrzygalności pewnych problemów w rodzinie języków rozpoznawalnych. Zagadnieniem tym zajmiemy się w dalszej części tego wykładu.
Własności rodziny języków bezkontekstowych
Przedstawimy teraz podstawowe własności rodziny języków bezkontekstowych związane z zamkniętością ze względu na działania oraz z problemami jednoznaczności.
Twierdzenie 2.1
Rodzina języków bezkontekstowych jest zamknięta ze względu na następujące działania:
- sumę mnogościową,
- katenację i operację iteracji ,
- przecięcie (iloczyn mnogościowy) z językiem regularnym,
- homomorfizm.
Dowód
3. Niech będzie dowolonym językiem rozpoznawanym przez pewien automat skończenie stanowy . Język ten możemy przedstawić w postaci sumy , w której każdy język jest rozpoznawany przez automat , w którym jako stan końcowy przyjmujemy . Rodzina języków bezkontekstowych jest zamknięta ze względu na sumę mnogościową i oczywista jest równość . Wystarczy zatem udowodnić, że język jest bezkontekstowy. Załóżmy, że oraz jest językiem generowanym przez gramatykę bezkontekstową w normalnej postaci Chomsky'ego. Bez utraty ogólności rozważań można także założyć, że . Konstruujemy gramatykę
- dla , jeśli ,
- dla , jeśli ,
- dla , jeśli .
Bezpośrednio z konstrukcji wynika, że gramatyka jest bezkontekstowa. Łatwo również zauważyć, że język generowany przez gramatykę jest równy .
4. Niech oznacza dowolny homomorfizm, a językiem bezkontekstowym generowanym przez gramatykę . Rozszerzamy homomorfizm do wolnych monoidów i , przyjmując, że na zbiorze jest równe identyczności. Łatwo zauważyć, że język jest generowany przez gramatykę bezkontekstową , w której
Z równości , zamkniętości klasy ze względu na uzupełnienie oraz z punktu 3 udowodnionego powyżej twierdzenia wynika następujący wniosek.
Wniosek 2.1
Niech będzie dowolonym językiem bezkontekstowym, a regularnym. Wtedy jest językiem bezkontekstowym.
Bez dowodu podajemy dwie dalsze własności związane z zamkniętością rodziny języków bezkontekstowych.
Fakt 2.1
Rodzina języków bezkontekstowych jest zamknięta ze względu na podstawienie regularne i przeciwobraz przez homomorfizm.
Rodzina języków bezkontekstowych nie jest zamknięta na wszystkie działania boolowskie. Jak wynika z poniższego twierdzenia, jedynym działaniem boolowskim nie wyprowadzającym poza rodzinę języków bezkontekstowych jest suma mnogościowa.
Twierdzenie 2.2
Rodzina języków bezkontekstowych nie jest zamknięta ze względu na:
- iloczyn mnogościowy,
- uzupełnienie.
Dowód
Dla niech będą gramatykami o następujących zbiorach praw:
Gramatyki te są bezkontekstowe i generują, odpowiednio, następujące języki:
Języki te są bezkontekstowe, lecz ich przecięcie
jest językiem istotnie kontekstowym.
Z udowodnionej właśnie własności oraz z praw de'Morgana wynika, że rodzina nie jest też domknięta ze względu na uzupełnienie.

Jednoznaczność języków bezkontekstowych
Omówimy teraz, dość ogólnie zresztą, problem występujący w niektórych gramatykach bezkontekstowych, a polegający na wielokrotnym wyprowadzeniu tego samego słowa. Z punktu widzenia języków programowania, których syntaktykę opisują, w pewnym zakresie, gramatyki bezkontekstowe, taka nadmiarowość (niejednoznaczność parsingu) jest cechą wysoce niepożądaną. Gramatyki, które nie będą mieć takiej własności nazwiemy jednoznacznymi. Jednoznacznym nazwiemy też język, dla którego istnieje gramatyka jednoznaczna.
Definicja 3.1
Jeśli chcemy zaznaczyć, że wyprowadzenie jest lewostronne lub prawostronne, to posługujemy się zapisem
Każde wyprowadzenie słowa w gramatyce bezkontekstowej można tak uporządkować, by sekwencja produkcji tworzyła prawostronne lub lewostronne wyprowadzenie. Stąd wynika też fakt, że dowolne słowo generowane przez gramatykę bezkontekstową ma tyle samo wyprowadzeń lewostronnych, co prawostronnych. Ilość różnych wyprowadzeń danego słowa jest w niektórych zastosowaniach gramatyk bezkontekstowych dość istotna, choćby w problemach parsingu, czyli poszukiwania w gramatyce wyprowadzenia dla danego słowa. Ilość różnych wyprowadzeń słów w gramatyce stanowi pewną informację na temat nadmiarowości tej gramatyki. Bardzo istotną rolę odgrywają zarówno w teorii, jak i zastosowaniach - gramatyki bezkontekstowe jednoznaczne, których definicję podajemy poniżej.
Definicja 3.2
Gramatyka bezkontekstowa jest jednoznaczna wtedy i tylko wtedy, gdy każde słowo generowane przez tę gramatykę ma dokładnie jedno wyprowadzenie lewostronne (prawostronne). Język bezkontekstowy nazywamy jednoznacznym, jeśli istnieje jednoznaczna gramatyka bezkontekstowa generująca ten język.
Jednoznaczność gramatyki oznacza istnienie dokładnie jednego drzewa wywodu dla każdego generowanego słowa. W klasie gramatyk bezkontekstowych problem jednoznaczności jest nierozstrzygalny. W rozdziale poświęconym algorytmicznej rozstrzygalności wrócimy do tego zagadnienia. Oczywiście wobec powyższego nierozstrzygalny jest też problem jednoznaczności języka. Problem jednoznaczności gramatyki i języka jest rozstrzygalny w podklasach języków bezkontekstowych, na przykład dla klasy języków ograniczonych, to znaczy takich , że dla pewnych słów .
Przykład 3.1
Język
generowany przez gramatykę , gdzie ,
oraz
jest, jak łatwo sprawdzić, językiem jednoznacznym.
Mówimy, że język jest niejednoznaczny, jeśli nie jest jednoznaczny, czyli nie istnieje gramatyka jednoznaczna generująca ten język. Przykładem języka niejednoznacznego jest
Uzasadnienie tego faktu jest dosyć żmudne i dlatego zostało tutaj pominięte.
Zauważmy na koniec tego krótkiego omówienia problematyki jednoznaczności gramatyk, że każdy język regularny (ale nie każda gramatyka regularna) jest jednoznaczny. Jednoznaczna jest bowiem gramatyka otrzymana z automatu deterministycznego generującego ten język.
Jednoznaczny jest również język bezkontekstowy, który jest iloczynem , gdzie i jest językiem jednoznacznym, a . Gramatyka tego języka, skonstruowana w punkcie 3 w twierdzeniu 2.1 jest jednoznaczna, co wynika stąd, że automat rozpoznający jest deterministyczny.
Problemy rozstrzygalne algorytmicznie
Podobnie jak dla języków regularnych tak i w przypadku bezkontekstowych lemat o pompowaniu wykorzystuje się do uzasadnienia rozstrzygalności pewnych problemów. Dla rodziny języków bezkontekstowych mamy następujące twierdzenie.
Twierdzenie 4.1
W rodzinie języków bezkontekstowych następujące problemy są rozstrzygalne:
- problem niepustości języka,
- problem nieskończoności języka,
- problem należenia słowa do języka .
Dowód
Aby udowodnić punkt 1, wykorzystamy następującą równoważność:
Uzasadnienie tej równoważności polega na rozkładzie słowa spełniającego warunek (zgodnie z oznaczeniami i tezą lematu o pompowaniu) i zastąpieniu go słowem , które jest istotnie krótsze. Po skończonej ilości takich skracających kroków dostaniemy słowo należące do języka i spełniające warunek .
W uzasadnieniu punktu 2 wykorzystamy równoważność
gdzie są stałymi z lematu o pompowaniu.
Przyjmując, iż język jest nieskończony, wnioskujemy, że istnieją w tym języku słowa dowolnie długie. Niech i . Jeśli nie spełnia warunku , to stosujemy lemat o pompowaniu dla , uzyskując słowo należące do języka i istotnie krótsze od . Z warunku (punkt 1 tezy lematu o pompowaniu) wynika, iż różnica długości tych słów nie może być wieksza niż stała . Zatem po skończonej ilości kroków uzyskujemy słowo należące do języka i spełniające żądany warunek.
Implikacja w przeciwną stronę ( ) wynika bezpośrednio z lematu o pompowaniu. Istnieje mianowicie nieskończony zbiór słów w postaci
dla .
Punkt 3 twierdzenia wymaga podania odpowiedniego algorytmu. Jego prezentacją i omówieniem zajmujemy się poniżej.

Algorytm CYK - przynależność słowa do języka.
Rozważmy problem przynależności słowa do danego języka, generowanego przez gramatykę bezkontekstową . Jest to problem rozstrzygalny. Bardzo łatwo podać algorytm, wykorzystujący postać normalną Greibach. Po sprowadzeniu gramatyki do postaci normalnej Greibach prawa strona każdej produkcji rozpoczyna się symbolem terminalnym i jest to jedyny symbol terminalny. Zatem jeśli , to należy zbadać wszystkie wywody w , z symbolu początkowego , o długości dokładnie , to znaczy wywody złożone z dokładnie kroków. Jeśli dla każdego symbolu nieterminalnego istnieje co najwyżej produkcji w gramatyce , w których pojawia się on po lewej stronie, to algorytm będzie działał w czasie . Metoda ta jest jednak bardzo nieefektywna. Czasochłonne jest też samo sprowadzenie gramatyki do postaci normalnej Greibach.
Istnieje szybszy algorytm rozwiązujący problem przynależności do języka. Jest to algorytm Cocke'a-Youngera-Kasamiego, w skrócie CYK.
Algorytm CYK działa w oparciu o ideę programowania dynamicznego . Rozważmy słowo oraz gramatykę . Niech zbiór zawiera wyłącznie te symbole nieterminalne, z których można wywieść słowo , czyli
Mamy zatem następującą równoważność:
Algorytm Cocke-Younger-Kasami - sprawdza, czy dane słowo należy do języka generowanego przez gramatykę bezkontekstową
1 Wejście: , - gramatyka bezkontekstowa i słowo
o długości . 2 Wyjście: TAK lub NIE - odpowiedź na pytanie, czy . 3 PostaćNormalnaChomsky'ego; 4 for do 5 ; 6 end for 7 for do 8 for do 9 ; 10 for do 11 ; 12 end for 13 end for 14 end for 15 if 16 return TAK, ; 17 else 18 return NIE, ; 19 end if
Algorytm CYK działa w czasie , gdzie jest długością słowa, o którego przynależność do języka pytamy.
Przykład 4.1
Zbadamy, czy słowo należy do języka generowanego gramatyką:
gdzie jest symbolem początkowym.
Poniższa animacja ilustruje działanie algorytmu CYK.