Lemat o pompowaniu dla języków regularnych

Wstęp

Okazuje się, że nie każdy język jest regularny. Standardowy przykład języka, który nie jest regularny, to $A = \{a^nb^n: n \ge 0 \}$. Intuicyjnie jest to dosyć oczywiste. Żeby język był regularny, musi być możliwe stwierdzenie czy słowo należy do języka przy użyciu stałej pamięci. Jednak żeby sprawdzić, czy słowo jest postaci anbn, musimy najpierw wczytać litery a i zapamiętać ich dokładną liczbę. Zapamiętanie liczby n wymaga przynajmniej $\log_2 n$ bitów pamięci, a to nie jest stała. Tak więc, jaką byśmy pamięcią nie dysponowali, zawsze znajdzie się dostatecznie duże n, takie że po wczytaniu an nie będziemy dokładnie wiedzieli ile tych liter a było. Tym samym nie będziemy w stanie sprawdzić, czy liter b jest dokładnie tyle samo.

Spróbujmy sformalizować powyższe rozumowanie. Dowodzimy nie wprost, że A nie jest regularne. Załóżmy przeciwnie, że A jest regularne. Niech $M=(Q, \Sigma, \delta, s, F)$ będzie automatem akceptującym A i niech n = |Q|. Wówczas z zasady szufladkowej Dirichleta istnieje taki stan q, $u \ge 0$ oraz v > 0, że n = u+v, $\delta^*(s, a^u) = \delta^*(q, a^v) = q$. Wówczas tak samo jest akceptowane, lub nie, słowo aubn i anbn. Sprzeczność. A więc założenie, że A jest regularny było fałszywe.

Lemat o pompowaniu

Powyższe rozumowanie można uogólnić, uzyskując bardziej ogólne narzędzie do wykazywania, że pewne języki nie są regularne.


\begin{theorem}[Lemat o pompowaniu dla języków regularnych]
Niech $A$\ będzie j...
...v \neq \varepsilon$\ i dla wszystkich $i \ge 0$
$xuv^iwz \in A$.
\end{theorem}

Dowód:

Skoro A jest językiem regularnym, to istnieje deterministyczny automat skończony rozpoznający A -- oznaczmy go przez $M = \angles{Q, \Sigma, \delta, s, F}$. Wybieramy k=|Q|.

Niech x, y i z będą takimi słowami, że $xyz \in A$ oraz $\vert y\vert \ge k$. Zauważmy, że w obliczeniu automatu M akceptującego słowo xyz, w trakcie wczytywania słowa y, pojawia się przynajmniej k+1 stanów.

Z zasady szufladkowej Dirichleta wynika, że przynajmniej jeden z tych stanów musi się powtarzać. Weźmy pierwsze powtórzenie się stanu w trakcie wczytywania słowa y.

Możemy więc podzielić słowo y na trzy części y=uvw:

Zauważmy, że słowu v odpowiada ,,pętelka'', tzn. $v \neq \varepsilon$, oraz:

\begin{displaymath}
\delta^*(s,xu) = \delta^*(s,xuv)
\end{displaymath}

\includegraphics{rys-5-a}
Stąd, dla dowolnego $i \ge 0$ mamy:

\begin{eqnarray*}
\delta^*(s,xuv^i) &=&
\delta^*(\delta^*(s,xuv), v^{i-1}) = ...
...& \delta^*(s,xuv^{i-1}) =\\
& & \vdots\\
&=& \delta^*(s,xu)
\end{eqnarray*}


Stąd zaś otrzymujemy:

\begin{displaymath}
\delta^*(s, xuv^iwz) = \delta^*(s,xuvwz) \in F
\end{displaymath}

Czyli $xuv^iwz \in A$. \qed

Zastosowanie lematu o pompowaniu

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

Specjalnie z myślą o takim zastosowaniu powstało alternatywne sformułowanie lematu o pompowaniu:

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

Niech A będzie językiem. Jeżeli dla każdego $k \ge 0$ istnieją takie słowa x, y, z, że $xyz \in A$, $\vert y\vert \ge k$ oraz dla dowolnego podziału słowa y na słowa u, v, w, y=uvw takiego, że $v \neq \varepsilon$, istnieje takie $i \ge 0$, że $xuv^iwz \not \in A$, wówczas A nie jest regularny.

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 regularny, 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ć regularny lub nie.


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

Prowadzimy z Demonem grę. Staramy się pokazać, że język nie jest regularny, a Demon stara się pokazać, że język mimo wszystko jest regularny. Zasady gry są następujące:
  1. Demon wybiera $k \ge 0$. (Jeśli A jest faktycznie regularny, to Demon może wybrać za k liczbę stanów automatu akceptującego A).
  2. Wybieramy takie słowa x, y, z, że $xyz \in A$ i $\vert y\vert \ge k$.
  3. Demon dzieli y na takie słowa u, v, w, y=uvw, że $v \neq \varepsilon$. (Jeśli A jest faktycznie regularny, to Demon może podzielić y na pierwszych dwóch wystąpieniach stanu, który jako pierwszy powtarza się w trakcie wczytywania słowa y.)
  4. Wybieramy $i \ge 0$.
Jeśli $xuv^iwz \not \in A$, to wygraliśmy, wpp. wygrał Demon.

Oryginalne sformułowanie lematu o pompowaniu mówi, że jeżeli język jest regularny, 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 regularny. Pamiętajmy, że lemat o pompowaniu nie służy do pokazywania, że język jest regularny. Nie zawsze pozwala on na pokazanie, że język, który nie jest regularny faktycznie taki nie jest -- istnieją języki, które nie są regularne i spełniają lemat o pompowaniu.

Zobaczmy na przykładach jak można zastosować sformułowanie lematu o pompowaniu jak gry z Demonem:

Przykład

Pokażemy, że język $A = \{a^nb^n: n \ge 0 \}$ nie jest regularny. Słowo $zuv^2wz \not \in A$, bo ma więcej literek a niż b, czyli wygraliśmy.

Powyższa strategia jest dla nas strategią wygrywającą, a zatem język A nie jest regularny.

Przykład

Pokażemy, że język $B = \{a^{2^n} : n \le 0 \}$ nie jest regularny. Słowo $zuv^2wz \not \in B$, bo $2^k < \vert zuv^2wz\vert < 2\cdot 2^k = 2^{k+1}$ a zatem wygraliśmy.

Powyższa strategia jest dla nas strategią wygrywającą, a zatem język B nie jest regularny.

Przykład

Pokażemy, że język $C=\{a^{n!}: n \ge 0\}$ nie jest regularny. Mamy $\vert xuv^iwz\vert = (k+1)! + (i-1)\cdot \vert v\vert$. Tak więc, z jednej strony mamy |xuviwz| > (k+1)!, ale z drugiej:

\begin{displaymath}
\vert xuv^iwz\vert =
(k+1)! + (k+1) \cdot \vert v\vert<
(k+1)! + (k+1) \cdot (k+1)! =
(k+2)(k+1)! =
(k+2)!
\end{displaymath}

Stąd, $\vert xuv^iwz\vert \not\in C$, czyli wygraliśmy.

Powyższa strategia jest dla nas strategią wygrywającą, a zatem język C nie jest regularny.

Inne metody dowodzenia nieregularności języków

Wykorzystanie lematu o pompowaniu nie jest jedynym sposobem pokazywania, że jakiś język nie jest regularny. Jeśli już wiemy o jakimś języku (B), że nie jest regularny, to możemy pokazać, że jakiś inny język (A) nie jest regularny korzystając z własności domknięcia klasy języków regularnych. Rozumujemy przy tym nie wprost -- gdyby język A był regularny, to B też, a że B nie jest, to i A nie może być.

Przykład

Pokażemy, że język $D=\{a^nb^m: n \neq m \}$ nie jest regularny. Gdyby był on regularny, to (ze względu na domknięcie klasy języków regularnych na dopełnienie) język $A = \{a^nb^n: n \ge 0 \}$ byłby też regularny, a nie jest. Tak więc język D nie może być regularny.

Przykład

Rozważmy język $E \subseteq \{[,]\}$ złożonych z poprawnych wyrażeń nawiasowych. Pokażemy, że nie jest on regularny. Gdyby był on regularny, to $E \setint L([^*]^*) = \{[^n]^n:n \ge 0 \}$ też byłby regularny. Natomiast język $\{[^n]^n : n \ge 0 \}$, tak jak $A = \{a^nb^n: n \ge 0 \}$, nie jest regularny. Tak więc język E nie może być regularny.

Podsumowanie

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

Skorowidz

Praca domowa

  1. Które z poniższych języków są regularne, a które nie? (Odpowiedzi nie musisz formalnie uzasadniać.)
    a)
    $\{a ^{n^3}: n \ge 0 \}$,
    b)
    $\{a^ib^j : i \cdot j \le 42 \}$,
    c)
    $\{a^ib^j : i \equiv j\ \mod\ 42 \}$,
    d)
    $\{ww : w \in \{a,b\}^*\}$,
    e)
    $\{a^nb^m : \vert n - m\vert \le 42 \}$
  2. Pokaż, że język $\{a^mb^na^{m \cdot n} : m,n \ge 0 \}$ nie jest regularny.
  3. Pokaż, że język zawierający te słowa nad alfabetem {a,b}, które zawierają tyle samo liter a i b, $\{x \in \{a,b\} : \char93 _a(x) = \char93 _b(x)\}$, nie jest regularny.

Ćwiczenia

  1. Pokaż, że następujące języki nie są regularne:
  2. Które z podanych języków są regularne, a które nie? Odpowiedzi uzasadnij.
    a)
    $\{a^ib^j : 0 \le i \le j \le 42\}$,
    b)
    komentarze w Pascalu,
    c)
    $\{a^ib^jc^k : i \neq j \orelse j \neq k \}$,
    d)
    $\{a^i b^j a^{2(i+j)} : i,j \ge 0\}$,
    e)
    $\{x \in \{a,b\}: \char93 _a(x) \neq \char93 _b(x)\}$,
    f)
    $\{a^{2n} : n \ge 0 \}$,
    g)
    $\{a^ib^jc^k : i + j + k \le 42\}$,
    h)
    poprawne programy w Pascalu,
    i)
    $\{a^{42^n} : n \ge 0 \}$,
    j)
    $\{x \in \{a,b\}^* : \char93 _a(x)$ jest podzielne przez 42}.
    Rozwiązanie
    Regularne są: a), b), f), g), j).
    zamknij