Okazuje się, że nie każdy język jest regularny.
Standardowy przykład języka, który nie jest regularny, to
.
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
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
będzie automatem akceptującym A
i niech n = |Q|.
Wówczas z
zasady szufladkowej Dirichleta
istnieje taki stan q,
oraz v > 0, że
n = u+v,
.
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.
Powyższe rozumowanie można uogólnić, uzyskując bardziej ogólne
narzędzie do wykazywania, że pewne języki nie są regularne.
Skoro A jest językiem regularnym, to istnieje
deterministyczny automat skończony rozpoznający A --
oznaczmy go przez
.
Wybieramy k=|Q|.
Niech x, y i z będą takimi słowami, że
oraz
.
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:
- u --
od początku słowa y do pierwszego wystąpienia
powtarzającego się stanu,
- v --
od pierwszego do drugiego wystąpienia powtarzającego się
stanu, oraz
- w --
od drugiego wystąpienia powtarzającego się
stanu do końca słowa y.
Zauważmy, że słowu v odpowiada ,,pętelka'',
tzn.
, oraz:
Stąd, dla dowolnego
mamy:
Stąd zaś otrzymujemy:
Czyli
.
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:
Niech A będzie językiem.
Jeżeli dla każdego
istnieją takie słowa
x, y, z, że
,
oraz
dla dowolnego podziału słowa y na słowa u, v, w, y=uvw
takiego, że
,
istnieje takie
, że
,
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:
- Demon wybiera
.
(Jeśli A jest faktycznie regularny, to Demon może wybrać
za k liczbę stanów automatu akceptującego A).
- Wybieramy takie słowa x, y, z, że
i
.
- Demon dzieli y na takie słowa u, v, w, y=uvw, że
.
(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.)
- Wybieramy
.
Jeśli
, 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

nie jest regularny.
- Demon wybiera k.
- Wybieramy
, y= ak i z=bk.
- Jakkolwiek Demon by nie podzielił słowa y, to słowo v
składa się wyłącznie z literek a i jest niepuste.
Możemy wybrać i=2.
Słowo

, 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

nie jest regularny.
- Demon wybiera k.
- Wybieramy
, y= a2k-1, z=a.
- Jakkolwiek Demon by nie podzielił słowa y, to słowo v
składa się wyłącznie z literek a oraz 0 < |v| < 2k.
Możemy wybrać i=2.
Słowo

, bo

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

nie jest regularny.
- Demon wybiera k.
- Wybieramy
,
y=a(k+1)!-1, z = a.
- Demon wybiera słowa u, v, w.
Mamy
0 < |v| < (k+1)!.
- Wybieramy i=k+2.
Mamy

.
Tak więc, z jednej strony mamy
|xuviwz| > (k+1)!,
ale z drugiej:
Stąd,

, czyli wygraliśmy.
Powyższa strategia jest dla nas strategią wygrywającą, a
zatem język C nie jest regularny.
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

nie jest regularny.
Gdyby był on regularny, to (ze względu na domknięcie klasy
języków regularnych na dopełnienie)
język

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 \{[,]\}$](jfa-main-img382.png)
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 \}$](jfa-main-img383.png)
też byłby regularny.
Natomiast język
![$\{[^n]^n : n \ge 0 \}$](jfa-main-img384.png)
, tak jak

, nie jest regularny.
Tak więc język
E nie może być regularny.
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.
- Które z poniższych języków są regularne, a które nie?
(Odpowiedzi nie musisz formalnie uzasadniać.)
- a)
-
,
- b)
-
,
- c)
-
,
- d)
-
,
- e)
-
- Pokaż, że język
nie jest regularny.
- Pokaż, że język zawierający te słowa nad alfabetem
{a,b}, które zawierają tyle samo liter a i b,
,
nie jest regularny.
- Pokaż, że następujące języki nie są regularne:
-
,
- język złożony z palindromów nad alfabetem {a,b},
,
- {ap : p jest liczbą pierwszą },
-
,
-
- Które z podanych języków są regularne, a które nie?
Odpowiedzi uzasadnij.
- a)
-
,
- b)
- komentarze w Pascalu,
- c)
-
,
- d)
-
,
- e)
-
,
- f)
-
,
- g)
-
,
- h)
- poprawne programy w Pascalu,
- i)
-
,
- j)
-
jest podzielne przez 42}.
Rozwiązanie
Regularne są: a), b), f), g), j).
zamknij