Języki, automaty i obliczenia/Wykład 13: Złożoność obliczeniowa.
Wprowadzenie: Sformułujemy definicje podstawowych klas złożoności w języku maszyn Turinga oraz metodę ich porównywania. Przeanalizujemy związki między rodziną języków określonych przez maszyny Turinga a rodziną języków typu (0) z hierarchii Chomsky'ego. Podamy dalsze własności języków kontekstowych i typu (0). Wprowadzimy pojęcie języka rekurencyjnie przeliczalnego oraz przedstawimy tezę Churcha. Następnie omówimy teoretyczne podstawy teorii rozstrzygalności oraz przeanalizujemy kilka problemów nierozstrzygalnych w teorii języków.
Słowa kluczowe: klasy złożoności obliczeniowej, redukcja wielomianowa, problemy zupełne, teza Churcha, język rekurencyjnie przeliczalny, zamkniętość na działania, rozstrzygalność, nierozstrzygalność.
1. Klasy złożoności obliczeniowej
Jednym z podstawowych celów wprowadzania maszyn Turinga jest dążenie do formalnej definicji złożoności obliczeniowej. Na podstawie wcześniejszych uwag możemy utożsamiać akceptację słowa przez maszynę Turinga z jej zatrzymaniem się. Intuicyjnie, można takie zachowanie maszyny Turinga utożsamić z wykonaniem programu który zwraca odpowiedź "Tak" na postawione przez nas pytanie.
Definicja 1.1
Ustalmy funkcje . Mówimy, że maszyna Turinga (deterministyczna lub niedeterministyczna) akceptuje słowo w czasie jeśli istnieje ciąg konfiguracji takich, że , dla pewnych oraz dla .
Jeśli istnieje ciąg konfiguracji , gdzie , jest konfiguracją akceptującą (tzn. dla pewnych ) oraz dodatkowo to mówimy, że maszyna akceptuje słowo w pamięci
Mówimy że język jest akceptowany w czasie (pamięci ) jeśli istnieje maszyna Turinga dla której oraz każde słowo jest akceptowane w czasie (pamięci odpowiednio).
W niektórych podejściach wykorzystuje się do definicji złożoności pamięciowej tak zwanych maszyn Turinga off-line. Pomysł polega na tym aby nie uwzględniać komórek taśmy z których maszyna czytała informacje, a jedynie te do których następował zapis. Dzięki temu zabiegowi można w sposób "rozsądny" mówić o akceptacji słowa w pamięci itp. W ujęciu prezentowanym w tym wykładzie zajmujemy się akceptacją w pamięci dla , zatem nie ma potrzeby dodatkowego definiowania maszyn Turinga off-line.
Definicja 1.2
Oznaczmy przez oraz rodzinę języków akceptowanych w czasie i odpowiednio pamięci przez deterministyczną maszynę Turinga. Dla maszyn niedeterministycznych wprowadzamy w identyczny sposób klasy oraz .
Określamy następujące klasy złożoności (klasy języków):
Wprost z definicji otrzymujemy zależności
P NP oraz PSPACE NPSPACE . W
dalszej części wykładu udowodnimy kilka mniej oczywistych zależności.
Przykład 1.1
Rozważmy język:
Język P . Deterministyczna maszyna Turinga akceptująca taki język może wyglądać następująco (zaczynamy od konfiguracji ):
- Jeśli symbol pod głowica to zamień go na . Inaczej odrzuć.
- Przejdź od lewego ogranicznika do prawego sprawdzając czy po
występuje lub , po tylko lub a po kolejny symbol lub ogranicznik. Jeśli ta zależność nie jest spełniona, odrzuć. Gdy osiągniesz ogranicznik wykonaj następny krok.
- Gdy przed
ogranicznikiem nie znajduje się symbol odrzuć. W przeciwnym razie zamień symbol na a następnie poruszaj się w lewo aż dotrzesz do symbolu innego niż i .
- Jeśli symbol do którego dotarłeś to , zamień go na
. Sprawdź symbol po lewej. Jeśli to poruszaj się w prawo aż do ogranicznika. Następnie przejdź do kroku 3.
- Jeśli dotarłeś do symbolu poruszaj się w lewo aż do
ogranicznika. Zamień symbol przy ograniczniku na a następnie idź w prawo zamieniając wszystkie symbole na . Gdy dojdziesz do ogranicznika przejdź do kroku .
- Jeśli dotarłeś do ogranicznika, oznacza to że skasowano już
wszystkie symbole . Przejdź w prawo aż do ogranicznika. Jeśli natrafisz na symbol odrzuć. W przeciwnym przypadku akceptuj.
Nietrudno zaobserwować, że maszyna przechodzi przez taśmę w prawo i w lewo tyle razy ile symboli zawiera taśma oraz wykonuje jeden dodatkowy przebieg na starcie. Zatem słowa z są akceptowane w czasie ograniczonym wielomianowo.
Przykład 1.2
Rozważmy teraz język
Najprostszą metodą uzasadnienia że NP jest konstrukcja tak zwanej wyroczni. Polega ona na następującej dwuetapowej procedurze:
- skonstruuj niedeterministyczną maszynę Turinga (wyrocznia) generującą pewne
słowo (certyfikat)
- zweryfikuj w sposób deterministyczny spełnienie założeń przez
certyfikat
W naszym przykładzie Etap 1 wygląda następująco:
- Użyj dwóch taśm. Na pierwszej z nich znajduje się .
- Idź po pierwszej taśmie wykorzystując niedeterministyczną
funkcję przejść. Napotykając możesz wypisać na taśmie drugiej i przejść o jedną komórkę w prawo na taśmie pierwszej lub przejść do następnego kroku. Jeśli dotarłeś do prawego ogranicznika taśmy pierwszej przejdź do kroku 3.
- Powróć do początku pierwszej taśmy. Wykonaj sekwencję jak w
kroku z tą różnicą że teraz na drugiej taśmie wypisuj symbole .
- Jako ostatnią część tego etapu przekopiuj symbole z
pierwszej taśmy na drugą (po symbolach i )
W konstrukcji wykorzystaliśmy dwie taśmy, ale oczywiście w nawiązaniu do wcześniejszych uwag, całą konstrukcję można wykonać na jednej taśmie (z odpowiednio rozszerzonym alfabetem i bardziej skomplikowaną funkcją przejść).
Etap 2 polega na weryfikacji czy na taśmie drugiej znajduje się słowo postaci gdzie oraz . Jeśli tak to słowo wejściowe pochodziło z języka i akceptujemy. Można do tego wykorzystać deterministyczną maszynę Turinga niemal identyczną z opisaną w przykładzie poprzednim.
Jeśli słowo wejściowe pochodzi z języka to jedno z obliczeń maszyny niedeterministycznej z Etapu pierwszego prowadzi do konstrukcji odpowiedniego słowa na drugiej taśmie. Nie wiemy jaka dokładnie ścieżka obliczeń ma być wykorzystana, ale dla akceptacji języka nie ma to znaczenia.
Zastanów się czy da się wykazać, że także P (Ćwiczenie 1.3 do tego wykładu).
Definicja 1.3
Funkcja jest konstruowalną pamięciowo jeśli istnieje maszyna Turinga dla której gdzie , dla , oraz dodatkowo jest konfiguracją końcową.
Inaczej mówiąc funkcję nazywamy konstruowalną pamięciowo jeśli istnieje maszyna Turinga otrzymując na wejściu słowo długości zaznacza na taśmie roboczej klatek i zatrzymuje się (akceptując słowo ).
Przykład 1.3
Funkcja jest konstruowalna pamięciowo. Maszyna która konstruuje działa według schematu:
- Przejdź do prawego markera. Jeśli napotkano symbol inny niż
to odrzuć.
- Idź w lewo aż do pierwszego symbolu lub markera
- Jeśli napotkałeś symbol zamień go na i przejdź
do prawego markera. Dopisz do słowa symbol (zwiększając tym samym długość słowa na taśmie o ). Następnie powtórz cykl od .
- Jeśli napotkałeś marker idź w prawo zamieniając wszystkie wystąpienia na
. Następnie wracaj do lewego markera i zatrzymaj się akceptując.
Twierdzenie 1.1
Dowód
(Szkic) Ustalamy liczbę naturalną dla której . Maszynę definiujemy następująco:
- Przekoduj słowo wejściowe łącząc po kolejnych symboli w
jeden blok stanowiący nowy symbol na taśmie.
- Symuluj maszynę na skompresowanej taśmie.
Położenie głowicy wewnątrz bloku zakoduj w stanach maszyny
Zauważmy, że w kroku maszyna wykorzystuje komórek pamięci do odczytania słowa wejściowego. Kompresja taśmy zapewnia, że podczas symulowania maszyny nie wykorzystamy więcej niż komórek. Jednocześnie można założyć, że akceptuje słowa wejściowe z języka o długości mniejszej niż bez symulowania .

Twierdzenie Savitch
Dla dowolnej funkcji konstruowalnej pamięciowo spełniającej warunek prawdziwa jest inkluzja .
Dowód
Niech będzie niedeterministyczną maszyną Turinga akceptującą język w pamięci . Niech oznacza liczbę konfiguracji potrzebną do zaakceptowania słowa o długości . Istnieje liczba dla której , co z kolei oznacza, że każde słowo o długości jest akceptowane w krokach czasowych.
Rozważmy algorytm:
{
Wniosek
Lemat
Jeśli to oraz .
Dowód
Niech będzie dana maszyna deterministyczna akceptująca dany język w czasie . Do akceptacji słowa o długości maszyna wykorzystuje conajwyżej kroków czasowych, czyli odwiedza conajwyżej komórek taśmy.
Na podstawie Twierdzenia Uzupelnic twTComp| istnieje maszyna Turinga wykorzystująca
komórek pamięci. Dla niedeterministycznych maszyn Turinga argumentacja jest identyczna.

Wniosek
Nie jest znany przykład wykazujący silną inkluzję
P NP ani dowód
wykluczający istnienie takiego przykładu. Powszechnie uznawana hipoteza głosi:
Rozstrzygnięcie jej prawdziwości lub fałszywości stanowi jeden z najważniejszych a zarazem najtrudniejszych problemów współczesnej informatyki. Jak widzieliśmy w Przykładzie Uzupelnic ex_NP| nawet w przypadku konkretnego języka NP problem uzasadnienie, że także P jest nietrywialny, gdyż wymaga zazwyczaj konstrukcji całkiem nowej maszyny Turinga niż ta do weryfikacji NP .
2. Redukcja i problemy zupełne
Definicja transformacja wielomianowa
Niech będą dowolnymi językami nad pewnym alfabetem . Mówimy, że redukuje się do w czasie wielomianowym, co oznaczamy , gdy istnieje deterministyczna maszyna Turinga taka, że dla dowolnego istnieje i stan o własności
oraz
Lemat
Załóżmy, że . Wtedy zachodzą implikacje
- P P
- NP NP
- PSPACE PSPACE
Dowód
Dane słowo transformujemy do w czasie wielomianowym, co gwarantuje założenie . Dzięki założeniu P możemy rozstrzygnąć czy (tzn. jeśli akceptujemy to robimy to w czasie wielomianowym). Tym sposobem (korzystając z definicji transformacji wielomianowej) akceptujemy w czasie wielomianowym, o ile tylko . Dowód dla pozostałych implikacji jest identyczny.

Definicja
Niech oznacza pewną klasę języków. Język nazywamy -trudnym jeśli spełniony jest warunek:
Jeżeli dodatkowo spełniony jest warunek to język nazywamy -zupełnym.
Intuicyjnie, fakt że język jest -zupełny oznacza że jest ona najbardziej skomplikowany (pod względem obliczeniowym) wśród języków z klasy , natomiast język -trudny jest bardziej skomplikowany niż każdy z klasy choć sam nie musi do niej należeć.
Rozważając klasę P , NP i
PSPACE możemy mówić o językach (problemach) P -zupełnych, NP -zupełnych
czy też PSPACE -zupełnych. To samo odnosi się do języków trudnych (tzn. klasa języków P -trudnych itd.).
Przykład
Rozważmy języki:
Języki oraz wyglądają na bardzo podobne, zatem wydaje się że oraz . Uzasadnienie tego faktu jest prawie natychmiastowe.
Konstruujemy deterministyczną maszynę Turinga która działa w następujący sposób:
- Jeśli słowo wejściowe jest puste to stop.
- Przejdź do prawego ogranicznika. Jeśli przy ograniczniku nie
występuje symbol to wykonaj krok Uzupelnic Step_stop_1|.
- Jeśli w słowie wejściowym występuje symbol to sprawdź czy słowo przetwarzane jest postaci gdzie oraz oraz czy dodatkowo jest liczbą parzystą. Jeśli nie
to wykonaj krok Uzupelnic Step_stop_1|.
- Zamień słowo na słowo i wykonaj krok Uzupelnic Step_stop_1|.
- Przejdź nad pierwszy symbol po lewym ograniczniku i zatrzymaj
się.
W ten sposób zawsze przeprowadzamy konfigurację na konfigurację , przy czym tylko gdy . Zatem wtedy i tylko wtedy gdy . Wykazaliśmy, że .
Warunek otrzymujemy w sposób identyczny. Trzeba tylko wypisać odpowiednią ilość symboli (a wiemy już jak konstruować liczbę mając dane ).
3. Języki maszyn Turinga i rodzina
Powstaje naturalne pytanie o związki pomiędzy klasą języków rozpoznawanych przez maszyny Turinga, a klasami zadanymi poprzez gramatyki. Odpowiemy na to pytanie w tej części wykładu.
Twierdzenie
Każdy język akceptowany przez maszynę Turinga jest typu (0).
Dowód
Niech będzie językiem akceptowanym przez maszynę Turinga , o której założymy, że , jeśli para należy do dziedziny funkcji przejść maszyny Turinga. Założenie to nie ogranicza ogólności rozważań. Wyróżnimy pewien podzbiór zbioru stanów , którego elementy, jak wskazuje oznaczenie, skojarzone są ze stanami końcowymi. Do zbioru należy każdy stan , dla którego istnieje ciąg stanów dla taki, że dla oraz , gdzie . Zauważmy, iż wraz ze stanem do zbioru należą wszystkie elementy ciągu .
Określamy teraz gramatykę . Zbiór symboli nieterminalnych zawiera wyłącznie następujące symbole:
- dla każdego stanu i symbole
Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle v_{sa},\: ^{\#}v_{sa},\: v_{sa}^{\#},\: ^{\#}v_{sa}^{\#} }
- dla każdej litery symbole
i
- wszystkie elementy zbioru
- symbole Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle v_{0},\: v_{1} } nie należące do
Zbiór praw składa się z praw wymienionych poniżej:
- ,
jeśli dla pewnego , ,
- , dla każdego
,
- ,
, , jeśli i ,
- ,
, , jeśli i ,
- ,
, , jeśli ,
- , ,
jeśli istnieją dla takie, że , dla oraz ,
- , , ,
jeśli istnieją dla takie, że , dla oraz ,
- dla wszystkich ,
- , ,
jeśli (porównaj założenie na początku dowodu),
- jeśli .
Określona powyżej gramatyka jest gramatyką typu (0). Rozważmy teraz dowolne słowo , dla którego istnieje wyprowadzenie w gramatyce ze stanu początkowego przy użyciu praw 1-7. Słowo zawiera dokładnie jeden z następujących symboli lub . Pierwsza litera słowa oznaczona jest markerem z lewej strony, a ostatnia litera słowa oznaczona jest markerem ze strony prawej. Ponadto żadna z liter występujących pomiędzy pierwszą a ostatnią nie jest oznaczona markerem . Z każdym takim słowem kojarzymy konfigurację poprzez zastąpienie symbolu przez oraz przez dopisanie symbolu po lewej lub prawej stronie znaczonej przez ten marker litery, zgodnie z jego występowaniem. Jeśli np. , to skojarzona konfiguracja jest postaci . Zauważmy, że jeśli słowa i są w powyższej formie, to fakt, iż , jest równoważny stwierdzeniu, że z konfiguracji skojarzonej ze słowem maszyna Turinga może przejść (bezpośrednie następstwo) do konfiguracji skojarzonej ze słowem . Każdy krok obliczenia realizowanego przez ma swój odpowiednik - krok w wyprowadzeniu w gramatyce . Z tym, że wobec praw 6 i 7 sekwencja obliczeń
jest traktowana jako jeden krok w obliczeniu prowadzonym przez maszynę Turinga. I analogicznie traktujemy sekwencję z markerem występującym po lewej stronie. Ze stanu początkowego gramatyki można wyprowadzić wszystkie słowa , dla których konfiguracja jest równa dla pewnego oraz maszyna Turinga realizuje obliczenie
Wynika to z praw 1 i 2 skonstruowanej gramatyki . Z kolei prawa typu 9 służą do zastąpienia symboli nieterminalnych typu przez litery terminalne, a prawa typu 8 eliminują symbole nieterminalne typu . A zatem dla niepustego słowa spełniona jest równoważność
gdzie oraz . Prawo 10. zapewnia, że
powyższa równoważność prawdziwa jest także dla słowa pustego . A to kończy dowód tego twierdzenia.
Język nazywamy rekurencyjnie przeliczalnym jeśli istnieje efektywny algorytm wyliczający wyłącznie słowa z . Przez efektywny algorytm rozumiemy skończony zbiór instrukcji, który w jednoznaczny sposób opisuje działanie tego algorytmu. Klasę języków rekurencyjnie przeliczalnych oznaczamy symbolem .
Zauważmy, że każda gramatyka typu (0) jest algorytmem wyliczającym wyłącznie słowa z . Dla każdej liczby naturalnej można bowiem rozważyć skończony zbiór wyprowadzeń w rozpoczynających się od symbolu początkowego i o długości równej . Z tego zbioru można z kolei wybrać wyłącznie te wyprowadzenia, które kończą się słowem nad alfabetem terminalnym gramatyki i tylko te słowa dodawać do listy składającej się na język . Są to, jak łatwo zauważyć, wszystkie słowa języka i nic ponadto. A zatem
Twierdzenie
Każdy język typu (0) jest językiem rekurencyjnie przeliczalnym, czyli .
Język nazywamy rekurencyjnym jeśli istnieje efektywny algorytm rozstrzygający dla każdego słowa jego przynależność do języka . Klasę języków rekurencyjnych oznaczamy symbolem .
Klasa języków kontekstowych zawiera się istotnie w klasie języków rekurencyjnych, o czym przekonuje poniższe twierdzenie.
Twierdzenie
Każdy język kontekstowy 'jest językiem rekurencyjnym, czyli
Dowód
Niech będzie dowolnym językiem kontekstowym. Istnieje więc gramatyka kontekstowa taka, że . Bezpośrednio z definicji gramatyki kontekstowej wynika, że słowo puste wtedy i tylko wtedy, gdy . Załóżmy teraz, że dane jest słowo , o którym mamy zadecydować, czy należy do języka . W tym celu rozważmy wszystkie ciągi słów
o tej własności, że są parami różne dla , oraz . Ilość takich ciągów jest skończona i słowo wtedy i tylko wtedy, gdy wśród powyższych ciągów znajdziemy choć jeden taki, że tworzy wyprowadzenie w gramatyce . Czyli
Ponieważ ilość ciągów podlegających rozważaniom jest skończona oraz ponieważ stwierdzenie czy pomiędzy dowolnymi słowami zachodzi relacja , sprowadza się do przeszukania
skończonego zbioru praw , efektywnie rozstrzygniemy, czy należy do języka czy też nie.
Uzyskane dotąd rezultaty możemy podsumować następująco:
W określeniu języka rekurencyjnie przeliczalnego oraz języka rekurencyjnego wystąpiło pojęcie efektywnego algorytmu, efektywnej procedury. Pojęcie to, intuicyjnie dość jasne, nie zostało precyzyjnie określone. Co za tym idzie, dla matematycznie poprawnych definicji języka rekurencyjnie przeliczalnego i języka rekurencyjnego należałoby sformalizować pojęcie algorytmu. W dotychczasowych rozważaniach intuicja efektywnej procedury była o tyle wystarczająca, że naszym celem było wskazanie istnienia takiej procedury. W sytuacji, gdyby naszym celem było wykazanie, że taka procedura nie istnieje, formalizacja tego pojęcia byłaby wręcz konieczna. We wszystkich takich przypadkach powszechnie przyjmuje się, że maszyna Turinga jest właśnie taką formalizacją. Na zdefiniowaną w poprzednim wykładzie maszynę Turinga można spojrzeć jako na algorytm, efektywną procedurę dającą odpowiedź pozytywną lub negatywną w zależności od akceptacji lub nieakceptowania słowa wejściowego. Proces obliczenia prowadzony przez maszynę Turinga zgadza się z intuicyjnym rozumieniem algorytmu. O tym, że każda efektywna procedura jest reprezentowana przez pewną maszynę Turinga, mówi, powszechnie przyjęta jako prawdziwa, Teza Churcha.
Teza Churcha
Każda efektywna procedura (algorytm) da się opisać przez maszynę Turinga.
Konsekwencją przyjęcia Tezy Churcha jest inkluzja . Biorąc pod uwagę udowodnione powyżej twierdzenia mamy
co ostatecznie prowadzi do równości .
4. Rodziny i - zamkniętość na działania
Dla kompletności tej części wykładu przedstawimy własności zamkniętości rodziny języków kontekstowych i języków typu (0) ze względu na najczęściej używane operacje. W niektórych przypadkach dowody dotyczące obu klas są takie same. W dowodach posłużymy się specjalną postacią gramatyk, a mianowicie taką, w której symbole terminalne występują tylko po prawej stronie. Prawdziwe bowiem jest twierdzenie
Twierdzenie
Dla każdej gramatyki istnieje równoważna gramatyka tego samego typu taka, że każda produkcja, w której występuje symbol terminalny , jest postaci .
Elementarny dowód tej własności pozostawiamy jako zadanie domowe.
Twierdzenie
Rodziny i są zamknięte ze względu na
- sumę mnogościową,
- iloczyn mnogościowy,
- katenację,
- iterację `{} `{},
- odbicie zwierciadlane.
Dowód
{}
Uzupelnic Lsuma|. Niech dla będą gramatykami typu (odpowiednio typu ), takimi, że . I niech . Określamy gramatykę typu (typu ) generującą język .
Jeśli , to przyjmujemy
Zauważmy, że wówczas w żadnej z gramatyk nie ma prawa wymazującego. Jeśli natomiast , to konstruujemy gramatykę dla języków i , jak powyżej, a następnie dodajemy nowy symbol początkowy i prawa .
Uzupelnic Liloczyn|. Przecięcie udowodnimy tylko dla języków typu . Dowód dla języków kontekstowych został przeprowadzony wcześniej.
Niech dla będą gramatykami typu , takimi, że . Niech . Określamy gramatykę typu generującą język przyjmując
gdzie: ,
a do zbioru należą prawa
(1)
(2) dla
(3) dla
(4) dla
(5)
Przy pomocy prawa (1) i wszystkich praw ze zbioru można wygenerować zbiór słów
Z dowolnego słowa należącego do tego zbioru, korzystając z praw (2)-(4) można wyprowadzić słowo wtedy i tylko wtedy, gdy . Korzystając z prawa (5) dostajemy słowo . A więc .
Uzupelnic Lkatenacja|. Niech dla będą tak jak poprzednio gramatykami typu ( ) takimi, że oraz spełniającymi warunki powyższego twierdzenia. Niech . Określamy gramatykę odpowiednio typu ( ) generującą język .
Jeśli , to przyjmujemy
Jeśli , to oznaczamy . Wówczas
Wykorzystując poprzednią konstrukcję i zamkniętość ze względu na sumę w każdym z tych przypadków otrzymujemy gramatykę generującą katenację języków i .
Uzupelnic Literacja|. Niech będzie gramatyką typu (typu ) taką, że symbole terminalne nie występują po lewej stronie żadnej produkcji z . Załóżmy też, że . Gramatyka
gdzie
generuje język . Jeśli , to usuwamy prawo wymazujące i dla języka konstruujemy gramatykę . Z faktu, że , wynika, że również .
Uzupelnic Lodbicie|. Jeśli jest gramatyką typu (typu ) taką, że , to gramatyka , gdzie generuje
język .
Zauważmy na koniec, że rodzina nie jest zamknięta ze względu na uzupełnienie. Stwierdzenie to wynika z przyjęcia jako obowiązujacej Tezy Churcha, która w tym wypadku implikuje równość rodziny języków i rodziny języków rekurencyjnie przeliczalnych oraz z faktu, iż istnieje język rekurencyjnie przeliczalny, którego uzupełnienie nie jest rekurencyjnie przeliczalne. Ten ostatni fakt podajemy bez dowodu. Dodajmy, że własność zamkniętości ze względu na uzupełnienie dla rodziny przez długi czas pozostawała problemem otwartym. Dopiero w roku 1987 udowodniono, iż własność ta jest spełniona dla języków kontekstowych. Podsumowanie własności zamkniętości ze względu na działania dla różnych klas języków hierarchii Chomsky'ego zawarte jest w poniższej tabeli.
{0.3cm} {
3 |
2 || 1 || 0 | |||
T | T | T |
T | |
T | T | T |
T | |
T | T | T |
T | |
T | N | T |
N | |
T | N | T |
T | |
} {0.3cm}
Na koniec podamy twierdzenie o wzajemnych relacjach pomiędzy rodzinami języków z hierarchii Chomsky'ego. Dowód tego twierdzenia wynika w części z definicji typów gramatyk wprowadzonych na wykładzie 2, a w części z udowodnionych własności poszczególnych rodzin języków z hierarchii Chomsky'ego (zakładając obowiązywanie Tezy Churcha).
Twierdzenie
Rodziny języków hierarchii Chomsky'ego spełniają następujące relacje
.
5. Problemy rozstrzygalne
W poprzednim wykładzie uzasadniliśmy, że dla każdej deterministycznej maszyny Turinga jesteśmy w stanie wskazać taką która akceptuje dany język i jednocześnie zatrzymuje się tylko na słowach akceptowanych. Wymagało to przejścia przez maszynę niedeterministyczną a następnie jej symulację na maszynie deterministycznej. Z tego powodu ograniczamy się w dalszej części wykładu tylko do tego typu maszyn Turinga (akceptacja=stop). Jak to uzasadniono wcześniej, przy założeniu Tezy Churcha, maszyna Turinga może być rozpatrywana jako matematycznie ścisła definicja algorytmu.
Pojęcie rozstrzygalnego problemu zostało wprowadzone wcześniej, na innym wykładzie i jest ono znane. Przypomnijmy więc tylko, że rozstrzygalność czy też nierozstrzygalność odnosi się do pewnej klasy, którą tworzą określone przypadki ustalonego problemu. Jeśli istnieje algorytm, który rozwiązuje taki problem dla wszystkich przypadków w tej klasy, to mówimy, że problem jest rozstrzygalny (w tej klasie). Zatem taki algorytm jest uniwersalnym sposobem rozwiązywania problemu dla wszystkich danych wejściowych określających poszczególne przypadki w tej klasie. Jak łatwo zauważyć dla ustalenia rozstrzygalności problemu wystarczy się opierać na intuicyjnym pojęciu algorytmu. Są jednak takie problemy, dla których nie istnieje, w rozważanej klasie przypadków, uniwersalny sposób ich rozwiazywania. Takie problemy nazywamy nierozstrzygalnymi w danej klasie. Aby wykazać nierozstrzygalność jakiegoś problemu, nieodzownym jest sformalizowanie pojęcia algorytmu. Standardowo taką formalizacją jest, o czym wspomniano już wcześniej, maszyna Turinga.
Zwróćmy uwagę, że maszyna Turinga akceptuje języki, gdy tym czasem przyzwyczajeni jesteśmy, że algorytmy (programy) rozwiązują pewne, niekiedy bardzo skomplikowane problemy (określone przy pomocy list, kolejek, grafów itp.). Zwracamy zatem uwagę na fakt, że w przypadku maszyny Turinga musimy wykonać wstępne umowne kodowanie naszego problemu. W tym przypadku rozważany język określa te spośród "sensownych" kodowań, które stanowią rozwiązanie postawionego problemu. Z drugiej strony maszyna akceptując słowo może informować nas o tym, że wynikiem obliczeń numerycznych na danych zakodowanych w rzeczywiście jest liczba zakodowana w itp.
Dla ilustracji powyższych dywagacji rozważmy problem skończoności w klasie jezyków regularnych. Problem ten jest rozstrzygalny, bo w oparciu o lemat o pompowaniu można skonstruować algorytm, który dla dowolnego języka regularnego rozstrzygnie, czyli odpowie twierdząco lub przecząco na pytanie o jego skończoność. W tym przypadku można np. przyjąć, że jako słowo wejściowe podajemy zakodowany opis gramatyki generującej język.
Nierozstrzygalność algorytmiczna problemu w ustalonej klasie nie oznacza, podkreślmy, niemożliwości rozwiazania konkretnego zadania z tej klasy. Nierostrzygalność oznacza niemożliwość rozwiązania za pomocą tego samego algorytmu, tej samej metody, wszystkich przypadków tego problemu należących do danej klasy.
W zamieszczonej poniżej tabeli przedstawiamy najczęściej rozważane pod kątem rozstrzygalności problemy z dziedziny języków formalnych w ramach hierarchii Chomsky'ego. Litera R oznacza rozstrzygalność problemu, N nierostrzygalność, a znak - pojawiający się przy problemie jednoznaczności oznacza, że problemu tego nie formułuje się dla gramatyk kontekstowych i typu (0).
{0.3cm} {
własność || (3) || (2) || (1) || (0) | ||||
należenie | R | R | R |
N |
inkluzja | R | N | N |
N |
równoważność | R | N | N |
N |
pustość | R | R | N |
N |
nieskończoność | R | R | N |
N |
jednoznaczność gramatyki | R | N | - |
- |
} {0.3cm}
Najczęściej używaną metodą dowodzenia nierozstrzygalności problemu jest redukcja tego problemu do innego, powiedzmy , dla którego nierozstrzygalność została ustalona wcześniej. Redukcja taka prowadzi do sformułowania implikacji:
jeśli byłby rozstrzygalny, to i byłby rozstrzygalny.
A ponieważ to ostatnie (następnik implikacji) nie jest prawdą, więc problem nie jest rozstrzygalny.
Należy w tym miejscu podkreślić fakt, że dowody nierozstrzygalności problemów uniwersalnych (takich jak problem Posta rozważany dalej) wiążą się z konstrukcją odpowiednich maszyn Turinga, kodowaniem problemu, a następnie dowodem uzasadniającym, że problem jest rzeczywiście nierozstrzygalny. Tematyka ta wykracza poza ramy wykładu. Z tego też powodu ograniczymy się tutaj do zaprezentowania jednego ze znanych problemów nierozstrzygalnych bez dowodu nierozstrzygalności.
Najczęściej występującym w literaturze problemem nierozstrzygalnym jest, bez wątpienia, problem Posta przedstawiony poniżej.
Problem Posta
Dla dowolnego alfabetu , o co najmniej dwóch elementach ( ), załóżmy, iż dana jest, tak zwana, lista słów, a dokładniej par słów Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle \left( u_{1},w_{1}\right) \: \left( u_{2},w_{2}\right) \: \ldots \left( u_{n},w_{n}\right), } gdzie , . Mówimy, że taka lista ma własność Posta (problem Posta ma rozwiązanie), jeśli istnieje ciąg indeksów taki, że
Jest to w ogólnym przypadku problem nierozstrzygalny.
Problem ten można sformułować równoważnie następująco. Niech będzie alfabetem interpretowanym jako zbiór indeksów, a dowolnym alfabetem. Niech Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle h:A^{*}\longrightarrow B^{*},\: g:A^{*}\longrightarrow B^{*} } będą dowolnymi homomorfizmami. Problem Posta, inaczej sformułowany, polega na odpowiedzi na pytanie, czy istnieje słowo takie, że .
Dwa kolejne przykłady ilustrują technikę redukcji pewnych problemów do problemu Posta. W efekcie uzyskujemy nierozstrzygalność w sposób opisany powyżej.
Twierdzenie
W klasie gramatyk bezkontekstowych problem niejednoznaczności jest nierozstrzygalny.
Dowód
Udowodnimy, że problem jest nierozstrzygalny dla gramatyk bezkontekstowych generujących jązyki nad alfabetem dwuelementowym . Oznaczmy i określmy homomorfizm , przyjmując oraz . Niech będzie ciągiem dowolnie wybranych i ustalonych słów. Dla dowolnej liczby naturalnej niech . Określony poniżej język
jest językiem bezkontekstowym, jako generowany przez gramatykę , dla której
Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle V_{N}=\{v_{u}\},\: V_{T}=\{a,b\},\: v_{0}=v_{u} } oraz Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle P_{x}=\{v_{u}\rightarrow h(\overline{i})v_{u}h(u_{i}),\: v_{u}\rightarrow h(\overline{i})bah(u_{i})\} } .
Niech teraz i oznaczają ciągi dowolnie wybranych i ustalonych słów i . Tworzą one listę słów Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle \left( u_{1},w_{1}\right) \: \left( u_{2},w_{2}\right) \: \ldots \left( u_{n},w_{n}\right), } . Zatem zasadne jest postawienie pytania, czy lista ta ma własność Posta. Niech oraz będą gramatykami bezkontekstowymi określonymi tak jak powyżej. Gramatyka , gdzie Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle P=\{v_{0}\rightarrow v_{u},\: v_{0}\rightarrow v_{w}\}\cup P_{u}\cup P_{w} } jest bezkontekstowa. Gramatyka ta jest niejednoznaczna wtedy i tylko wtedy, gdy . Ten ostatni warunek równoważny jest istnieniu liczb takich, że , czyli własności Posta listy Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle \left( u_{1},w_{1}\right) \: \left( u_{2},w_{2}\right) \: \ldots \left( u_{n},w_{n}\right) } .Ostatecznie więc rozstrzygalność problemu niejednoznaczności w klasie gramatyk bezkontekstowych prowadziłaby do
rozstrzygalności własności Posta.
Dla drugiego przykładu przyjmijmy jako alfabety Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle A_{2}=\left\{ a,b\right\} ,\: A_{3}=\left\{ a,b,c\right\} } oraz określmy język
Ustalmy listę Posta Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle \left( u_{1},w_{1}\right) \: \left( u_{2},w_{2}\right) \: \ldots \left( u_{n},w_{n}\right) } nad alfabetem , gdzie . Wprowadzamy teraz języki Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L_{u},\: L_{w}\: L_{PP} } nad alfabetem przyjmując:
oraz definiujemy język
Określone powyżej języki nad alfabetem mają własności konieczne do zastosowania lematu, który przytoczymy bez dowodu.
Lemat
Języki Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L,\: L_{PP},\: A_{3}^{*}\setminus L,\: A_{3}^{*}\setminus L_{PP} } są bezkontekstowe.
Dla języków i uzasadnienie ich bezkontekstowości jest proste poprzezkonstrukcję odpowiednich gramatyk. Aby uzyskać bezkontekstowość ich uzupełnień, należy podzielić rozważane języki na rozłączne podzbiory i konstruować gramatyki bezkontekstowe dla tych wyróżnionych podzbiorów, a w końcu wykorzystać fakt, że suma języków bezkontekstowych jest językiem bezkontekstowym.
Zauważmy teraz, że istnienie rozwiązania problemu Posta nad alfabetem jest równoważne temu, że .
Jeśli bowiem , gdzie , to oczywiście . Jeśli ciąg jest rozwiązaniem problemu Posta, to też. Zatem jeśli , to język jest nieskończony.
Wobec nierozstrzygalności problemu Posta wnioskujemy, że nierozstrzygalny jest problem pustości i problem nieskończoności przecięcia w klasie języków bezkontekstowych.