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.
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.
Jeśli język A jest bezkontekstowy, to istnieje opisująca go
gramatyka bezkontekstowa.
Zauważmy, że nie ma znaczenia, czy
(gdyż k>0).
Załóżmy więc, że
.
Dzięki temu możemy założyć, że istnieje gramatyka bezkontekstowa
w postaci normalnej Chomsky'ego
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:
Niech x będzie wyprowadzanym słowem.
Dowód przebiega przez indukcję po wysokości drzewa
wyprowadzenia h:
- Jeśli h = 1, to
|x| = 1 = 20 = 2h-1.
- 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:
dla pewnych
.
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:
Na mocy zasady indukcji uzyskujemy lemat.
Niech |N| = n.
Pokażemy, że można wziąć k = 2n.
Z powyższego faktu wynika, że jeżeli pewne słowo
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.
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
.
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
.
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.
Jak widać, powielając ów fragment drzewa i razy uzyskujemy
drzewo wyprowadzenia słowa uviwxiy.
Czyli
.
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:
Niech A będzie językiem.
Jeśli dla każdego k > 0 istnieje takie słowo z, że
oraz dla dowolnego podziału słowa z
na słowa u, v, w, x i y, uvwxy = z takiego, że
i
istnieje takie
, że
,
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:
- Demon wybiera k> 0.
(Jeśli A jest faktycznie bezkontekstowy, to Demon może wybrać
za k=2|N|.)
- Wybieramy takie słowo
, że
.
- Demon dzieli z na takie słowa u, v, w, x, y, uvwxy=z, że
i
.
(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.)
- Wybieramy
.
Jeśli
, 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

.
Udowodnimy to korzystając z lematu o pompowaniu sformułowanego
jako gra z Demonem.
Nasza strategia wygląda następująco:
- Demon wybiera k.
- Wybieramy słowo z = akbkck.
- Demon dzieli słowo z = uvwxy.
- Wybieramy i=2.
Wiemy, że

i

.
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

.
Tak więc powyższa strategia jest wygrywająca, czyli A nie
jest bezkontekstowy.
Przykład
Pokażemy, że język

nie jest bezkontekstowy.
Nasza strategia wygląda następująco:
- Demon wybiera k.
- Wybieramy słowo
z = akbkakbk.
- Demon dzieli słowo z = uvwxy.
- Wybieramy i=2.
Wiemy, że

i

.
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
i tym
samym
.
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
.
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ż
.
Tak więc powyższa strategia jest wygrywająca, czyli B nie
jest bezkontekstowy.
Zachodzi następujący fakt, którego nie będziemy teraz dowodzić:
Zachodzi też inny fakt:
Jeżeli A i B są językami bezkontekstowymi, to istnieją
generujące je gramatyki
i
.
Co więcej, możemy założyć, że gramatyki te mają rozłączne
zbiory nieterminali
.
Niech S będzie nowym symbolem nieterminalnym nie
występującym ani w GA, ani w GB.
Wówczas gramatyka:
generuje język
.
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

nie jest
bezkontekstowy.
Załóżmy przeciwnie, że jest.
Wówczas:
Wiemy wszak, że
B nie jest bezkontekstowy, a więc
C też
nie może być.
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.
- Udowodnij, że język
nie jest
bezkontekstowy.
- 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:
-
{aibjck : 2i+j=k },
-
{aibjck : i+j+k = 42 },
-
,
-
,
-
.
- Udowodnij, że następujące języki nie są bezkontekstowe:
- 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:
-
{ aibjck : 3i = 2j+k },
-
{ aibj : i+j = k3 dla pewnego
,
-
,
-
,
-
{ aibj : i > j },
-
,
-
,
-
{ aibj : i+2j=42},
-
,
-
.