Lemat o pompowaniu dla języków bezkontekstowych

Wstęp

Okazuje się, że nie każdy język jest bezkontekstowy. Poznamy w tym wykładzie lemat o pompowaniu dla języków bezkontekstowych. Podobnie jak w przypadku lematu o pompowaniu dla języków regularnych, jest to narzędzie umożliwiające wykazanie, że dany język nie jest bezkontekstowy.

Lemat o pompowaniu dla języków bezkontekstowych

Niech A będzie językiem bezkontekstowym. Jeżeli A zawiera dowolnie długie słowa, to okazuje się, że drzewach wyprowadzeń tych słów muszą istnieć fragmenty, które można powielać. Ich powielanie ,,pompuje'' słowa należące do języka.


\begin{theorem}[lemat o pompowaniu dla języków bezkontekstowych]
Niech $A$\ b...
...vert \le k$\ oraz dla każdego $i \ge 0$\ mamy
$uv^iwx^iy \in A$.
\end{theorem}

Dowód:

Jeśli język A jest bezkontekstowy, to istnieje opisująca go gramatyka bezkontekstowa. Zauważmy, że nie ma znaczenia, czy $\varepsilon \in A$ (gdyż k>0). Załóżmy więc, że $\varepsilon \not\in A$. Dzięki temu możemy założyć, że istnieje gramatyka bezkontekstowa w postaci normalnej Chomsky'ego $G=\angles{N, \Sigma, P, S}$ generująca język A, L(G) = A.

Zauważmy, że drzewa wyprowadzeń dla gramatyk w postaci normalnej Chomsky'ego mają postać regularnych drzew binarnych z ,,frędzelkami'' długości 1. Produkcje przekształcające nieterminal na dwa nieterminale dają węzły wewnętrzne o dwóch synach. Natomiast produkcje przekształcające nieterminal na terminal odpowiadają ojcom liści -- każdy ojciec liścia ma tylko jednego syna.

Zachodzi następujący fakt:
\begin{fact}
Jeśli drzewo wyprowadzenia ma wysokość $h$, to długość
wyprowadzanego słowa nie przekracza $2^{h-1}$.
\end{fact}

Dowód faktu:

Niech x będzie wyprowadzanym słowem. Dowód przebiega przez indukcję po wysokości drzewa wyprowadzenia h:
  1. Jeśli h = 1, to |x| = 1 = 20 = 2h-1.
  2. Jeśli h>1, to można podzielić x na dwa takie słowa y i z, x = yz, że wyprowadzenie x wygląda następująco:

    \begin{displaymath}
\xymatrix{
S \ar[r] & YZ \ar[dl]_>{*} \ar[dr]^>{*} \\
y & & z
}
\end{displaymath}

    dla pewnych $Y,Z \in N$. Poddrzewa wyprowadzenia y z Y i z z Z mają wysokość co najwyżej h-1. Tak więc, z założenia indukcyjnego mamy:

    \begin{displaymath}
\vert x\vert = \vert xy\vert = \vert x\vert+\vert y\vert \le 2^{h-2} + 2^{h-2} = 2^{h-1}
\end{displaymath}

Na mocy zasady indukcji uzyskujemy lemat. \qed

Niech |N| = n. Pokażemy, że można wziąć k = 2n. Z powyższego faktu wynika, że jeżeli pewne słowo $z \in A$ ma długość przynajmniej k=2n, to jego drzewo wyprowadzenia ma wysokość przynajmniej n+1. W takim drzewie wyprowadzenia istnieje ścieżka, na której jest przynajmniej n+1 nieterminali. Wybierzmy i ustalmy jedną taką ścieżkę. Na takiej ścieżce pewien nieterminal musi się powtarzać. Niech X będzie pierwszym nieterminalem, który powtarza się na tej ścieżce idąc do góry (od liścia do korzenia). Jego powtórzenia wyznaczają podział słowa z na słowa u, v, w, x i y, uvwxy = z, w sposób przedstawiony na rysunku.

\includegraphics{rys-11-a}
Drzewo wyprowadzenia jest regularne, a oba zaznaczone na rysunku wystąpienia nieterminala X to różne węzły drzewa. Wynika stąd, że v i x nie mogą być oba pustymi słowami. Czyli $vx \neq \varepsilon$.

Ponieważ X jest pierwszym terminalem, który powtarza się na wybranej ścieżce idąc od liścia do korzenia, więc poddrzewo wyprowadzenia vwx z X jest wysokości co najwyżej n+1. Stąd $\vert vwx\vert \le 2^n = k$.

Nieterminal X występuje (przynajmniej) w dwóch miejscach na ścieżce. Zauważmy, że możemy powielać fragment drzewa wyprowadzenia między pierwszym i drugim wystąpieniem nieterminala X na wybranej ścieżce, z którego pochodzą słowa v i x.

\includegraphics{rys-11-b}
Jak widać, powielając ów fragment drzewa i razy uzyskujemy drzewo wyprowadzenia słowa uviwxiy. Czyli $uv^iwx^iy \in A$. \qed

Zastosowanie lematu o pompowaniu

Lemat o pompowaniu służy pokazywaniu, że określone języki nie są bezkontekstowe. Schemat takiego dowodu przebiega nie wprost. Lemat o pompowaniu ma postać implikacji: jeśli język jest bezkontekstowy, to ma pewne własności. Dowód, że język nie jest bezkontekstowy przebiega według schematu: skoro dany język nie posiada tych własności, to nie może być bezkontekstowy. Myśląc o takim zastosowaniu, możemy odwrócić lemat o pompowaniu:

Lemat o pompowaniu dla języków bezkontekstowych-- sformułowanie alternatywne:

Niech A będzie językiem. Jeśli dla każdego k > 0 istnieje takie słowo z, że $\vert z\vert \ge k$ oraz dla dowolnego podziału słowa z na słowa u, v, w, x i y, uvwxy = z takiego, że $vx \neq \varepsilon$ i $\vert vwx\vert \le k$ istnieje takie $i \ge 0$, że $uv^iwx^iy \not\in A$, wówczas A nie jest bezkontekstowy.

Nawet w postaci odwróconej lemat o pompowaniu jest trudny do zrozumienia, gdyż mamy tu do czynienia z czterema poziomami zagnieżdżonych naprzemiennych kwantyfikatorów uniwersalnych i egzystencjalnych. Takie zagnieżdżenie naprzemiennych kwantyfikatorów możemy sobie wyobrazić jako ruchy dwóch graczy -- gracze na przemian wskazują jakie wartości powinny przyjąć zmienne spod kwantyfikatorów, jeden gracz spod uniwersalnych, a drugi spod egzystencjalnych. Pierwszy gracz stara się pokazać, że dany język jest bezkontekstowy, a drugi, że nie. O wygranej decyduje, czy dla wybranych wartości zmiennych zachodzi własność objęta kwantyfikatorami. Gra jest skończona, więc jeden z graczy ma strategię wygrywającą. W zależności od tego, który z graczy to jest, język może być bezkontekstowy lub nie.


Lemat o pompowaniu dla języków bezkontekstowych -- gra z Demonem:

Prowadzimy z Demonem grę. Staramy się pokazać, że język nie jest bezkontekstowy, a Demon stara się pokazać, że język mimo wszystko jest bezkontekstowy. Zasady gry są następujące:
  1. Demon wybiera k> 0. (Jeśli A jest faktycznie bezkontekstowy, to Demon może wybrać za k=2|N|.)
  2. Wybieramy takie słowo $z \in A$, że $\vert z\vert \ge k$.
  3. Demon dzieli z na takie słowa u, v, w, x, y, uvwxy=z, że $vx \neq \varepsilon$ i $\vert vwx\vert \le k$. (Jeśli A jest faktycznie bezkontekstowy, to może to być podział wyznaczony przez powtarzający się nieterminal na pewnej ścieżce od liścia do korzenia.)
  4. Wybieramy $i \ge 0$.
Jeśli $uv^iwx^iy \not\in A$, to wygraliśmy, wpp. wygrał Demon.

Oryginalne sformułowanie lematu o pompowaniu mówi, że jeżeli język jest bezkontekstowy, to Demon ma strategię wygrywającą. Natomiast odwrotne sformułowanie mówi, że jeżeli my mamy strategię wygrywającą, to język nie jest bezkontekstowy. Pamiętajmy, że lemat o pompowaniu nie służy do pokazywania, że język jest bezkontekstowy. Nie zawsze pozwala on na pokazanie, że język, który nie jest bezkontekstowy faktycznie taki nie jest -- istnieją języki, które nie są bezkontekstowe i spełniają lemat o pompowaniu.

Przykład

Standardowym przykładem języka, który nie jest bezkontekstowy to $A = \{a^nb^nc^n : n \ge 0\}$. Udowodnimy to korzystając z lematu o pompowaniu sformułowanego jako gra z Demonem. Nasza strategia wygląda następująco: Wiemy, że $\vert vwx\vert \le k$ i $vx \neq \varepsilon$. Tak więc słowa v i x mogą zawierać jeden rodzaj znaków lub dwa, ale nie wszystkie trzy. Czyli nie może zachodzić #a(uviwxiy) = #b(uviwxiy) = #c(uviwxiy). Stąd wynika, że $uv^iwx^iy \not\in A$.

Tak więc powyższa strategia jest wygrywająca, czyli A nie jest bezkontekstowy. \qed

Przykład

Pokażemy, że język $B = \{a^ib^ja^ib^j : i,j \ge 0\}$ nie jest bezkontekstowy. Nasza strategia wygląda następująco: Wiemy, że $\vert vwx\vert \le k$ i $vx \neq \varepsilon$. Możliwe są trzy przypadki:

Jeżeli słowo v lub x nie jest w całości zbudowane z jednego rodzaju znaków, to $uv^iwx^iy \not\in L(a^*b^*a^*b^*)$ i tym samym $uv^iwx^iy \not\in B$.

Jeżeli słowa v i x są zbudowane w całości z tych samych znaków, to znaczy że oba pochodzą z tego samego podsłowa postaci ak lub bk. Ale wówczas $uv^iwx^iy \not\in B$.

Pozostaje jeszcze przypadek, gdy słowo v jest w całości złożone z liter a, a x z liter b (lub odwrotnie). Wówczas jednak również $uv^iwx^iy \not\in B$.

Tak więc powyższa strategia jest wygrywająca, czyli B nie jest bezkontekstowy. \qed

Inne metody dowodzenia niebezkontekstowości języków

Zachodzi następujący fakt, którego nie będziemy teraz dowodzić:
\begin{fact}
Przecięcie języka bezkontekstowego i regularnego jest
bezkontekstowe.
\end{fact}

Zachodzi też inny fakt:


\begin{fact}
Suma języków bezkontekstowych jest bezkontekstowa.
\end{fact}

Dowód:

Jeżeli A i B są językami bezkontekstowymi, to istnieją generujące je gramatyki $G_A=\angles{N_A, \Sigma, P_A, S_A}$ i $G_B=\angles{N_B, \Sigma, P_B, S_B}$. Co więcej, możemy założyć, że gramatyki te mają rozłączne zbiory nieterminali $N_A \setint N_B = \emptyset$. Niech S będzie nowym symbolem nieterminalnym nie występującym ani w GA, ani w GB. Wówczas gramatyka:

\begin{displaymath}
G=\angles{N_A \setsum N_B \setsum \{S\}, \Sigma, P_A \setsum P_B, S}
\end{displaymath}

generuje język $A \setsum B$. \qed

Korzystając z tych faktów możemy pokazywać nie wprost, że języki nie są bezkontekstowe. Schemat rozumowania jest następujący: Zakładamy, że dany język jest bezkontekstowy. Z powyższych faktów wynika, że jakiś inny język, który nie jest bezkontekstowy, musiałby taki być. A więc uprzednie założenie musiało być fałszywe. Stąd dany język nie jest bezkontekstowy.

Przykład

Pokażemy, że język $C = \{ww : w \in \{a,b\}^*\}$ nie jest bezkontekstowy. Załóżmy przeciwnie, że jest. Wówczas:

\begin{displaymath}
C \setint L(a^*b^*a^*b^*) = \{a^ib^ja^ib^j : i,j \ge 0\} = B
\end{displaymath}

Wiemy wszak, że B nie jest bezkontekstowy, a więc C też nie może być. \qed

Podsumowanie

Wykład ten był poświęcony przede wszystkim lematowi o pompowaniu dla języków bezkontekstowych. Poznaliśmy trzy równoważne sformułowania tego lematu, oraz przykłady jego zastosowania do wykazywania, że określone języki nie są bezkontekstowe. Poznaliśmy też metodę wykazywania, że dane języki nie są bezkontekstowe, w oparciu o własności klasy języków bezkontekstowych.

Skorowidz

Praca domowa

  1. Udowodnij, że język $D=\{a^{2^i} : i \ge 0\}$ nie jest bezkontekstowy.
  2. Dla każdego z poniższych języków określ, czy jest on: (i) regularny, (ii) bezkontekstowy, ale nie regularny, (iii) nie jest bezkontekstowy:

Ćwiczenia