|
|
Linia 337: |
Linia 337: |
| tylko wypisać odpowiednią ilość symboli <math>\displaystyle 4</math> (a wiemy już, jak | | tylko wypisać odpowiednią ilość symboli <math>\displaystyle 4</math> (a wiemy już, jak |
| konstruować liczbę <math>\displaystyle 2n</math>, mając dane <math>\displaystyle n</math>). | | konstruować liczbę <math>\displaystyle 2n</math>, mając dane <math>\displaystyle n</math>). |
|
| |
|
| |
|
| |
|
| |
|
| |
| ==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<nowiki>=</nowiki>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 tymczasem
| |
| 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 <math>\displaystyle \sharp w_1 \$
| |
| w_2 \sharp</math>, może informować nas o tym, że wynikiem obliczeń
| |
| numerycznych na danych zakodowanych w <math>\displaystyle w_1</math> rzeczywiście jest liczba
| |
| zakodowana w <math>\displaystyle w_2</math> 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 rozwiązania 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)''':
| |
|
| |
| <div align=center>
| |
| {| border=1
| |
| |-
| |
| | '''własność'''
| |
| | '''(3)'''
| |
| | '''(2)'''
| |
| | '''(1)'''
| |
| | '''(0)'''
| |
| |---
| |
| |align="center"| należenie <math>\displaystyle w\in L </math>
| |
| |align="center"| R
| |
| |align="center"| R
| |
| |align="center"| R
| |
| |align="center"| N
| |
| |---
| |
| |align="center"| inkluzja <math>\displaystyle L_{1}\subset L_{2} </math>
| |
| |align="center"| R
| |
| |align="center"| N
| |
| |align="center"| N
| |
| |align="center"| N
| |
| |---
| |
| |align="center"| równoważność
| |
| |align="center"| R
| |
| |align="center"| N
| |
| |align="center"| N
| |
| |align="center"| N
| |
| |---
| |
| |align="center"| pustość <math>\displaystyle L=\emptyset </math>
| |
| |align="center"| R
| |
| |align="center"| R
| |
| |align="center"| N
| |
| |align="center"| N
| |
| |---
| |
| |align="center"| nieskończoność <math>\displaystyle card\, L=\aleph _{0} </math>
| |
| |align="center"| R
| |
| |align="center"| R
| |
| |align="center"| N
| |
| |align="center"| N
| |
| |---
| |
| |align="center"| jednoznaczność gramatyki
| |
| |align="center"| R
| |
| |align="center"| N
| |
| |align="center"| -
| |
| |align="center"| -
| |
| |}
| |
| </div>
| |
|
| |
| Najczęściej używaną metodą dowodzenia nierozstrzygalności problemu
| |
| <math>\displaystyle P </math> jest redukcja tego problemu do innego, powiedzmy <math>\displaystyle P'
| |
| </math> , dla którego nierozstrzygalność została ustalona wcześniej.
| |
| Redukcja taka prowadzi do sformułowania implikacji:
| |
|
| |
| jeśli <math>\displaystyle P </math> byłby
| |
| rozstrzygalny, to i <math>\displaystyle P' </math> byłby rozstrzygalny.
| |
|
| |
| A ponieważ to
| |
| ostatnie (następnik implikacji) nie jest prawdą, więc problem <math>\displaystyle P
| |
| </math> 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 <math>\displaystyle A </math> , o co najmniej dwóch elementach ( <math>\displaystyle \sharp A\geqslant 2 </math> ), załóżmy, iż dana jest, tak zwana, lista słów, a dokładniej: par słów ''' <math>\displaystyle \left( u_{1},w_{1}\right) \: \left( u_{2},w_{2}\right) \: \ldots \left( u_{n},w_{n}\right), </math> ''' gdzie <math>\displaystyle u_{i},w_{i}\in A^{+} </math> , <math>\displaystyle n\in \Bbb N </math> . Mówimy, że taka lista ma własność Posta (problem Posta ma rozwiązanie), jeśli istnieje ciąg indeksów <math>\displaystyle i_{1},\ldots ,i_{k}\in \{1,...,n\} </math> taki, że
| |
|
| |
| <center><math>\displaystyle u_{i_{1}}\ldots u_{i_{k}}=w_{i_{1}}\ldots w_{i_{k}}.</math></center>
| |
|
| |
| Jest to w ogólnym przypadku problem nierozstrzygalny.
| |
|
| |
| Problem ten można sformułować równoważnie następująco. Niech <math>\displaystyle A </math> będzie
| |
| alfabetem interpretowanym jako zbiór indeksów, a <math>\displaystyle B
| |
| </math> dowolnym alfabetem. Niech <math>\displaystyle h:A^{*}\longrightarrow
| |
| B^{*},\: g:A^{*}\longrightarrow B^{*} </math> będą dowolnymi
| |
| homomorfizmami. Problem Posta, inaczej sformułowany, polega na odpowiedzi
| |
| na pytanie, czy istnieje słowo <math>\displaystyle x\in A^{+} </math> takie, że <math>\displaystyle h(x)=g(x) </math> .
| |
|
| |
| Dwa kolejne przykłady ilustrują technikę redukcji pewnych
| |
| problemów do problemu Posta. W efekcie
| |
| uzyskujemy nierozstrzygalność w sposób opisany powyżej.
| |
|
| |
| {{twierdzenie|5.1||
| |
| W klasie gramatyk bezkontekstowych problem
| |
| niejednoznaczności jest nierozstrzygalny.
| |
|
| |
| }}
| |
|
| |
| {{dowod|||
| |
| Udowodnimy, że problem jest nierozstrzygalny dla gramatyk
| |
| bezkontekstowych generujących języki nad alfabetem
| |
| dwuelementowym <math>\displaystyle A=\{a,b\} </math> . Oznaczmy <math>\displaystyle B=\{d,e\} </math> i
| |
| określmy homomorfizm <math>\displaystyle h:B^{*}\longrightarrow A^{*} </math> ,
| |
| przyjmując <math>\displaystyle h(d)=ba^{2} </math> oraz <math>\displaystyle h(e)=ba^{3} </math> . Niech <math>\displaystyle u </math>
| |
| będzie ciągiem <math>\displaystyle u_{1},...,u_{n}\in B^{+} </math> dowolnie wybranych
| |
| i ustalonych słów. Dla dowolnej liczby naturalnej <math>\displaystyle i>0 </math> niech <math>\displaystyle \overline{i}=de^{i} </math> . Określony poniżej język
| |
|
| |
| <center><math>\displaystyle L_{u}=\{h(\overline{i_{1}}).....h(\overline{i_{k}})bah(u_{i_{k}}),...,h(u_{i_{1}})\in
| |
| A^{*}\: :\: k\geqslant 1,\: 1\leqslant i_{j}\leqslant n\}</math></center>
| |
|
| |
| jest językiem
| |
| bezkontekstowym, jako generowany przez gramatykę <math>\displaystyle G_{u}=(V_{N},V_{T},v_{0},P_{u}) </math> , dla której
| |
|
| |
| <math>\displaystyle V_{N}=\{v_{u}\},\: V_{T}=\{a,b\},\: v_{0}=v_{u} </math> oraz <math>\displaystyle P_{x}=\{v_{u}\rightarrow h(\overline{i})v_{u}h(u_{i}),\:
| |
| v_{u}\rightarrow h(\overline{i})bah(u_{i})\} </math> .
| |
|
| |
| Niech teraz <math>\displaystyle u </math> i <math>\displaystyle w </math> oznaczają ciągi dowolnie wybranych i
| |
| ustalonych słów <math>\displaystyle u_{1},...,u_{n}\in B^{+} </math> i <math>\displaystyle w_{1},...,w_{n}\in B^{+} </math> . Tworzą one listę słów ''' <math>\displaystyle \left( u_{1},w_{1}\right) \: \left( u_{2},w_{2}\right) \: \ldots
| |
| \left( u_{n},w_{n}\right), </math> '''. Zatem zasadne jest postawienie
| |
| pytania, czy lista ta ma własność Posta. Niech <math>\displaystyle G_{u} </math> oraz <math>\displaystyle G_{w}
| |
| </math> będą gramatykami bezkontekstowymi określonymi tak jak
| |
| powyżej. Gramatyka <math>\displaystyle G=(\{v_{0},v_{u},v_{w}\},\{a,b\},v_{0},P) </math> ,
| |
| gdzie <math>\displaystyle P=\{v_{0}\rightarrow v_{u},\: v_{0}\rightarrow v_{w}\}\cup
| |
| P_{u}\cup P_{w} </math> jest bezkontekstowa. Gramatyka ta jest
| |
| niejednoznaczna wtedy i tylko wtedy, gdy <math>\displaystyle L_{u}\cap L_{y}\neq
| |
| \emptyset </math> . Ten ostatni warunek równoważny jest istnieniu liczb
| |
| <math>\displaystyle i_{1},...,i_{k}\in \Bbb N </math> takich, że <math>\displaystyle u_{i_{1}}.....u_{i_{k}}=w_{i_{1}}.....w_{i_{k}} </math>, czyli własności
| |
| Posta listy ''' <math>\displaystyle \left( u_{1},w_{1}\right) \: \left(
| |
| u_{2},w_{2}\right) \: \ldots \left( u_{n},w_{n}\right) </math> .'''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 <math>\displaystyle A_{2}=\left\{ a,b\right\} ,\: A_{3}=\left\{ a,b,c\right\} </math> oraz określmy język
| |
|
| |
| <center><math>\displaystyle L=\left\{ v_{1}cv_{2}c\overleftarrow{v}_{2}c\overleftarrow{v}_{1}\,
| |
| :\, v_{1},v_{2}\in A_{2}^{*}\right\}. </math></center>
| |
|
| |
| Ustalmy listę Posta ''' <math>\displaystyle \left( u_{1},w_{1}\right) \: \left( u_{2},w_{2}\right) \: \ldots \left( u_{n},w_{n}\right) </math> '''
| |
| nad alfabetem <math>\displaystyle A_{2} </math> , gdzie <math>\displaystyle u_{i},w_{i}\in A_{2}^{+}
| |
| </math> . Wprowadzamy teraz języki <math>\displaystyle L_{u},\: L_{w}\: L_{PP} </math> nad
| |
| alfabetem <math>\displaystyle A_{3} </math>, przyjmując:
| |
|
| |
| <center><math>\displaystyle \aligned L_{u} &= \left\{ ba^{i_{k}}b\ldots ba^{i_{1}}cu_{i_{1}}\ldots u_{i_{k}}\, :\, k\geqslant 1,1\leqslant i_{j}\leqslant n\right\} \\
| |
| L_{w} &= \left\{ ba^{i_{k}}b\ldots ba^{i_{1}}cw_{i_{1}}\ldots
| |
| w_{i_{k}}\, :\, k\geqslant 1,1\leqslant i_{j}\leqslant n\right\}
| |
| \endaligned</math></center>
| |
|
| |
| oraz definiujemy język
| |
|
| |
| <center><math>\displaystyle L_{PP}=L_{u}c\overleftarrow{L}_{w}.</math></center>
| |
|
| |
| Określone powyżej języki nad alfabetem <math>\displaystyle A_{3} </math> mają
| |
| własności konieczne do zastosowania lematu, który przytoczymy bez
| |
| dowodu.
| |
|
| |
| {{lemat|5.1||
| |
| Języki <math>\displaystyle L,\: L_{PP},\: A_{3}^{*}\setminus L,\: A_{3}^{*}\setminus
| |
| L_{PP} </math> są bezkontekstowe.
| |
|
| |
| }}
| |
|
| |
| Dla języków <math>\displaystyle L </math> i <math>\displaystyle L_{PP} </math> uzasadnienie ich bezkontekstowości jest proste
| |
| poprzez konstrukcję 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 <math>\displaystyle A_{3} </math> jest równoważne temu, że <math>\displaystyle L_{PP}\cap
| |
| L\neq \emptyset </math> .
| |
|
| |
| Jeśli bowiem <math>\displaystyle L_{PP}\cap L\ni ba^{i_{k}}\ldots
| |
| ba^{i_{1}}cu_{i_{1}}\ldots u_{i_{k}}c\overleftarrow{w_{i_{1}}\ldots
| |
| w_{i_{k}}}ca^{i_{1}}b\ldots a^{i_{k}}b </math> , gdzie <math>\displaystyle k\geqslant 1,1\leqslant
| |
| i_{j}\leqslant n </math> , to oczywiście <math>\displaystyle u_{i_{1}}\ldots u_{i_{k}}=w_{i_{1}}\ldots
| |
| w_{i_{k}} </math> . Jeśli ciąg <math>\displaystyle i_{1},\ldots ,i_{k} </math> jest
| |
| rozwiązaniem problemu Posta, to <math>\displaystyle (i_{1},\ldots
| |
| ,i_{k})(i_{1},\ldots ,i_{k}) </math> też. Zatem jeśli <math>\displaystyle L_{PP}\cap L\neq
| |
| \emptyset </math> , to język <math>\displaystyle L_{PP}\cap L </math> jest nieskończony.
| |
|
| |
| Wobec nierozstrzygalności problemu Posta wnioskujemy, że
| |
| nierozstrzygalny jest problem pustości i problem nieskończoności
| |
| przecięcia <math>\displaystyle L_{1}\cap L_{2} </math> w klasie języków
| |
| bezkontekstowych.
| |
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.
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).
Uwaga 1.1
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):
Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned \textbd{P} \displaystyle =\bigcup_{k=0}^\infty Dtime(n^k), &\qquad\qquad& \textbd{NP} \displaystyle =\bigcup_{k=0}^\infty Ntime(n^k), \\ \textbd{PSPACE} \displaystyle =\bigcup_{k=0}^\infty Dspace(n^k), && \textbd{NSPACE} \displaystyle =\bigcup_{k=0}^\infty Nspace(n^k). \endaligned}
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:
Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L=\left\{1^i 2^j 3^k\: k=i\cdot j,\: i,j\geqslant 1\right\}. }
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łowicą, 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
Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L=\left\{3^k\: : \: k=i\cdot j }
dla pewnych
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 1. 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 konstruowalna 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 liniowa kompresja pamięci
Niech będzie dany język oraz maszyna Turinga
akceptująca w pamięci . Dla dowolnego
istnieje maszyna Turinga akceptująca w
pamięci .
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 1.2 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:
Algorytm
1 Wejście: słowo długości
2 oblicz
3 for każda konfiguracja akceptująca dla której
4 do if Test(, , ) then akceptuj
gdzie procedura Test ma następującą postać:
Algorytm Procedure Test(,,)
1 if and [ () or ()] then return true
2 else for każda konfiguracja dla której
3 do if Test(,,) and Test ,,)
4 then return true;
5 return false
Przedstawiony algorytm można zrealizować za pomocą wielotaśmowej
maszyny Turinga. Założenie dotyczące konstruowalności pamięciowej
jest istotnie wykorzystywane w tej konstrukcji przy implementacji
linii 3 algorytmu i linii 2 procedury Test. Musimy zaznaczyć
komórek taśmy, aby móc konstruować konfiguracje o długości
ograniczonej przez i móc następnie wykonywać na nich
symulację maszyny .
Zauważmy, że ilość konfiguracji jest ograniczona przez , a
głębokość rekursji przez . Oznacza to, że jesteśmy w
stanie skonstruować maszynę Turinga, która wymaga pamięci, gdzie jest pewną stałą. Na mocy Twierdzenia 1.1 jesteśmy w stanie określić maszynę działającą w pamięci .
Wniosek 1.1
PSPACE NPSPACE
Lemat 1.1
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 co najwyżej kroków
czasowych, czyli odwiedza co najwyżej komórek taśmy.
Na podstawie Twierdzenia 1.1 istnieje maszyna Turinga
wykorzystująca
komórek pamięci. Dla niedeterministycznych maszyn Turinga argumentacja
jest identyczna.

Wniosek 1.2
P NP PSPACE NPSPACE
Uwaga 1.2
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:
P NP.
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 1.2, nawet w
przypadku konkretnego języka NP, problem
uzasadnienia, że także P, jest nietrywialny,
gdyż wymaga zazwyczaj konstrukcji całkiem nowej maszyny Turinga niż
ta do weryfikacji NP .
Redukcja i problemy zupełne
Definicja 2.1 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 2.1
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 2.2
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 on 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ć.
Uwaga 2.1
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 2.1
Rozważmy języki:
Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L_1=\left\{1^i 2^j 3^k\: k=i\cdot j,\: i,j\geqslant 1\right\}\quad,\quad L_2=\left\{1^i 2^j 4^{2k}\: k=i\cdot j,\: i,j\geqslant 1\right\}. }
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 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 1.
- Zamień słowo na słowo i wykonaj krok 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 ).