Języki, automaty i obliczenia/Wykład 12: Języki kontekstowe i automat liniowo ograniczony. Maszyna Turinga: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Arek (dyskusja | edycje)
Nie podano opisu zmian
 
m Zastępowanie tekstu – „,...,” na „,\ldots,”
 
(Nie pokazano 108 wersji utworzonych przez 8 użytkowników)
Linia 1: Linia 1:
{Złożoność obliczeniowa. Języki maszyn Turinga i typu '''(0)'''. Rozstrzygalność}
W tym wykładzie omówimy języki i gramatyki kontekstowe oraz ich własności. Wprowadzimy automat liniowo ograniczony i uzasadnimy równość rodziny języków kontekstowych i rodziny języków rozpoznawanych przez automaty liniowo ograniczone. Zdefiniujemy maszynę Turinga i pokażemy równoważność tego modelu z wybranymi innymi modelami obliczeń.


'''Wprowadzenie:''' Sformułujemy definicje podstawowych klas
W tym wykładzie  omówimy kolejną rodzinę języków hierarchii Chomsky'ego,
złożoności w języku maszyn Turinga oraz metodę ich porównywania.
a mianowicie języki kontekstowe. Przedstawimy kilka własnosci gramatyk kontekstowych,
Przeanalizujemy związki między rodziną języków określonych przez maszyny Turinga a
czyli typu '''(1)''' oraz wprowadzimy pojęcie automatu liniowo ograniczonego. Wprowadzimy
rodziną języków typu '''(0)''' z hierarchii Chomsky'ego. Podamy dalsze własności
też najogólniejszy model obliczeń, a mianowicie maszynę Turinga.
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:'''
==Języki kontekstowe==
klasy złożoności obliczeniowej, redukcja wielomianowa, problemy zupełne, teza Churcha,
język rekurencyjnie
przeliczalny, zamkniętość na działania, rozstrzygalność, nierozstrzygalność.


==Klasy złożoności obliczeniowej==
Języki kontekstowe to kolejna rodzina języków w hierarchii Chomsky'ego. Rozszerza ona
istotnie rodzinę języków bezkontekstowych. Wykorzystanie tej rodziny języków
formalnych jest dość ograniczone. Brak jest bowiem praktycznych metod konstrukcji parserów
dla tych gramatyk.


Jednym z podstawowych celów wprowadzania maszyn Turinga jest dążenie
Ta część wykładu  prezentuje gramatyki równoważne gramatykom
do formalnej definicji złożoności obliczeniowej. Na podstawie
kontekstowym, posiadające pewne określone własności. Te własności wykorzystuje się
wcześniejszych uwag możemy '''utożsamiać akceptację słowa'''
przy uzasadnieniu faktu, że rodzina języków kontekstowych pokrywa się z rodziną
przez maszynę Turinga z jej '''zatrzymaniem się'''. Intuicyjnie,
języków rozpoznawanych przez automaty liniowo ograniczone. Biorąc pod uwagę  to, że
można takie zachowanie maszyny Turinga utożsamić z wykonaniem
zastosowania tej rodziny języków formalnych nie są powszechne
programu który zwraca odpowiedź "Tak" na postawione przez nas
oraz to, że dowody dla przedstawionych poniżej twierdzeń
pytanie.
są mocno techniczne, postanowiliśmy  zrezygnować z rygorystycznej  prezentacji tego materiału i pominąć dowody. Zainteresowany Student może je znaleźć w literaturze wskazanej
do tego przedmiotu.


{{definicja|||
{{definicja|1.1||
Ustalmy funkcje <math>\displaystyle t,s:\mathbb{N}\rightarrow \mathbb{N}</math>. Mówimy, że
Gramatykę  <math>G=(V_{N},V_{T},v_{0},P)</math> nazywamy rozszerzającą,
maszyna Turinga <math>\displaystyle \mathcal{MT}</math> (deterministyczna lub
jeśli każde prawo jest postaci  <math>x\rightarrow y</math> , gdzie  <math>x,y\in (V_{N}\cup V_{T})^{*}</math> i spełniona
niedeterministyczna) '''akceptuje słowo <math>\displaystyle w\in \Sigma_I^*</math> w
jest nierówność  <math>\mid x\mid \leqslant \mid y\mid</math> lub jest to prawo  <math>v_{0}\rightarrow 1</math>  
czasie <math>\displaystyle t(|w|)</math>''' jeśli istnieje ciąg <math>\displaystyle k\leq t(|w|)</math> konfiguracji
i wtedy  <math>v_{0}</math> nie występuje  po prawej stronie w żadnej produkcji z  <math>P</math> .
<math>\displaystyle d_1,d_2,\dots, d_k</math> takich, że <math>\displaystyle d_1=\sharp s_0 w \sharp</math>, <math>\displaystyle d_k=
\sharp w_{1}s_{F}w_{2}\sharp</math> dla pewnych <math>\displaystyle w_{1},w_{2}\in \Sigma
_{T}^{*},s_{F}\in S_{F}</math> oraz <math>\displaystyle d_i \mapsto d_{i+1}</math> dla
<math>\displaystyle i=1,\dots,k-1</math>.


Jeśli istnieje ciąg konfiguracji <math>\displaystyle d_1 \mapsto d_2 \mapsto \dots
\mapsto d_m</math>, gdzie <math>\displaystyle d_1=\sharp s_0 w \sharp</math>, <math>\displaystyle d_m</math> jest
konfiguracją akceptującą (tzn. <math>\displaystyle d_m= \sharp w_{1}s_{F}w_{2}\sharp</math>
dla pewnych <math>\displaystyle w_{1},w_{2}\in \Sigma _{T}^{*},s_{F}\in S_{F}</math>) oraz
dodatkowo <math>\displaystyle |d_i|\leq s(|w|)+2</math> to mówimy, że maszyna <math>\displaystyle \mathcal{MT}</math>
'''akceptuje słowo <math>\displaystyle w\in \Sigma_I^*</math> w pamięci <math>\displaystyle s(|w|)</math>'''
Mówimy że '''język <math>\displaystyle L</math> jest akceptowany w czasie <math>\displaystyle t(n)</math>
(pamięci <math>\displaystyle s(n)</math>)''' jeśli istnieje maszyna Turinga <math>\displaystyle \mathcal{MT}</math> dla
której <math>\displaystyle L(\mathcal{MT})=L</math> oraz każde słowo <math>\displaystyle w\in L</math> jest
akceptowane w czasie <math>\displaystyle t(|w|)</math> (pamięci <math>\displaystyle s(|w|)</math> odpowiednio).
}}
{{uwaga|||
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 <math>\displaystyle \log n</math> itp. W ujęciu prezentowanym w tym wykładzie
zajmujemy się akceptacją w pamięci <math>\displaystyle n^k</math> dla <math>\displaystyle k\geq 1</math>, zatem nie ma
potrzeby dodatkowego definiowania maszyn Turinga off-line.
}}
}}


{{definicja|||
Wprost z definicji wynika, że gramatyka kontekstowa
Oznaczmy przez <math>\displaystyle Dtime(t(n))</math> oraz <math>\displaystyle Dspace(s(n))</math> rodzinę języków
jest gramatyką rozszerzającą. Prawdziwe jest również następujące twierdzenie.
akceptowanych w czasie <math>\displaystyle t(n)</math> i odpowiednio pamięci <math>\displaystyle s(n)</math> przez
deterministyczną maszynę Turinga. Dla maszyn niedeterministycznych
wprowadzamy w identyczny sposób klasy <math>\displaystyle Ntime(t(n))</math> oraz
<math>\displaystyle Nspace(s(n))</math>.


Określamy następujące klasy złożoności (klasy języków):
{{kotwica|prz.1|}}{{twierdzenie|1.1||


<center><math>\displaystyle \aligned </math> '''P''' <math>\displaystyle  =\bigcup_{k=0}^\infty Dtime(n^k) &\qquad\qquad&
Dla dowolnej gramatyki <math>G=(V_{N},V_{T},v_{0},P)</math>  rozszerzającej  istnieje
</math> '''NP''' <math>\displaystyle  =\bigcup_{k=0}^\infty Ntime(n^k)
równoważna gramatyka kontekstowa.
\\
</math> '''PSPACE''' <math>\displaystyle  =\bigcup_{k=0}^\infty Dspace(n^k) &&
</math> '''NPSPACE''' <math>\displaystyle =\bigcup_{k=0}^\infty Nspace(n^k)
\endaligned</math></center>


}}
}}


Wprost z definicji otrzymujemy zależności
Wprowadzimy teraz gramatyki z markerem końca.
'''P''' <math>\displaystyle  \subset  </math> '''NP'''  oraz
'''PSPACE''' <math>\displaystyle  \subset  </math> '''NPSPACE''' . W
dalszej części wykładu udowodnimy kilka mniej oczywistych
zależności.


{{przyklad|||
{{definicja|1.2||
Rozważmy język:
Gramatyką z markerem końca  <math>\sharp</math> nazywamy
<center><math>\displaystyle
gramatykę  <math>G_{\sharp }=(V_{N}\cup \{\sharp \},V_{T},v_{0},P)</math>  taką, że
L=\left\{1^i 2^j 3^k\: k=i\cdot j,\: i,j\geq 1\right\}
<math>\sharp \notin V_{N}\cup V_{T}</math>  oraz prawa są postaci: <math>u\rightarrow v</math>
</math></center>
, <math>\sharp u\rightarrow \sharp v</math>  lub  <math>u\sharp \rightarrow v\sharp</math> ,
gdzie  <math>u,v\in (V_{N}\cup V_{T})^{*}</math>  i w słowie  <math>u</math>  występuje co najmniej
jeden symbol nieterminalny z  <math>V_{N}</math> .
Językiem generowanym przez tę gramatykę
nazywamy zbiór


Język <math>\displaystyle L\in  </math> '''P''' . Deterministyczna maszyna Turinga
<center><math>L(G_{\sharp })=\{w\in V_{T}^{*}:\ : \sharp v_{0}\sharp \mapsto^{*}\sharp w\sharp \}</math></center>
<math>\displaystyle MT_3</math> akceptująca taki język może wyglądać następująco (zaczynamy
od konfiguracji <math>\displaystyle \sharp s_0 w \sharp</math>):
# Jeśli symbol pod głowica to <math>\displaystyle 1</math> zamień go na <math>\displaystyle \sharp</math>. Inaczej odrzuć.
# Przejdź od lewego ogranicznika do prawego sprawdzając czy po <math>\displaystyle 1</math>
występuje <math>\displaystyle 1</math> lub <math>\displaystyle 2</math>, po <math>\displaystyle 2</math> tylko <math>\displaystyle 2</math> lub <math>\displaystyle 3</math> a po <math>\displaystyle 3</math> kolejny
symbol <math>\displaystyle 3</math> 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 <math>\displaystyle 3</math> odrzuć. W przeciwnym
razie zamień symbol <math>\displaystyle 3</math> na <math>\displaystyle \sharp</math> a następnie poruszaj się w lewo
aż dotrzesz do symbolu innego niż <math>\displaystyle 3</math> i <math>\displaystyle \diamondsuit</math>.
# Jeśli symbol do którego dotarłeś to <math>\displaystyle 2</math>, zamień go na
<math>\displaystyle \diamondsuit</math>. Sprawdź symbol po lewej. Jeśli to <math>\displaystyle 2</math> poruszaj się w
prawo aż do ogranicznika. Następnie przejdź do kroku 3.
# Jeśli dotarłeś do symbolu <math>\displaystyle 1</math> poruszaj się w lewo aż do
ogranicznika. Zamień symbol <math>\displaystyle 1</math> przy ograniczniku na <math>\displaystyle \sharp</math> a
następnie idź w prawo zamieniając wszystkie symbole <math>\displaystyle \diamondsuit</math>
na <math>\displaystyle 2</math>. Gdy dojdziesz do ogranicznika przejdź do kroku <math>\displaystyle 3</math>.
# Jeśli dotarłeś do ogranicznika, oznacza to że skasowano już
wszystkie symbole <math>\displaystyle 1</math>. Przejdź w prawo aż do ogranicznika. Jeśli
natrafisz na symbol <math>\displaystyle 3</math> odrzuć. W przeciwnym przypadku akceptuj.


Nietrudno zaobserwować, że maszyna <math>\displaystyle MT_3</math> przechodzi przez taśmę w prawo i w lewo tyle
razy ile symboli <math>\displaystyle 3</math> zawiera taśma oraz wykonuje jeden dodatkowy
przebieg na starcie. Zatem słowa z <math>\displaystyle L</math> są akceptowane w
czasie ograniczonym wielomianowo.
}}
}}


{{przyklad|||
Gramatyka z markerem końca  <math>G_{\sharp }</math>  jest kontekstowa (typu <math>1</math> ), jeśli
 
jej prawa
Rozważmy teraz język
po wymazaniu markera  <math>\sharp</math> spełniają warunki gramatyki rozszerzającej.
<center><math>\displaystyle
Oczywiście dla dowolnej gramatyki kontekstowej istnieje równoważna gramatyka
L=\left\{3^k\: : \: k=i\cdot j  </math>  dla pewnych <math>\displaystyle  i,j> 1\right\}
kontekstowa z markerem końca. Prawdziwe jest również następujące twierdzenie:
</math></center>
 
Najprostszą metodą uzasadnienia że <math>\displaystyle L\in  </math> '''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ę <math>\displaystyle 3^k</math>.
# Idź po pierwszej taśmie wykorzystując niedeterministyczną
funkcję przejść. Napotykając <math>\displaystyle 3</math> możesz wypisać <math>\displaystyle 1</math> 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 <math>\displaystyle 2</math> z tą różnicą że teraz na drugiej taśmie wypisuj symbole
<math>\displaystyle 2</math>.
# Jako ostatnią część tego etapu przekopiuj symbole <math>\displaystyle 3</math> z
pierwszej taśmy na drugą (po symbolach <math>\displaystyle 1</math> i <math>\displaystyle 2</math>)
 
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ę
{{twierdzenie|1.2||
słowo postaci <math>\displaystyle 1^i 2^j 3^k</math> gdzie <math>\displaystyle i,j>1</math> oraz <math>\displaystyle k=i\cdot j</math>. Jeśli
Dla dowolnej gramatyki kontekstowej z markerem końca istnieje
tak to słowo wejściowe <math>\displaystyle 3^k</math> pochodziło z języka <math>\displaystyle L</math> i akceptujemy.
równoważna gramatyka
Można do tego wykorzystać deterministyczną maszynę Turinga niemal
kontekstowa.
identyczną z opisaną w przykładzie poprzednim.


Jeśli słowo wejściowe pochodzi z języka <math>\displaystyle L</math> 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 <math>\displaystyle L</math> nie ma to znaczenia.
Zastanów się czy da się wykazać, że także <math>\displaystyle L\in  </math> '''P'''
(Ćwiczenie '''1.3''' do tego wykładu).
}}
}}


{{definicja|||
{{dowod|||
Funkcja <math>\displaystyle s(n)</math> jest '''konstruowalną pamięciowo''' jeśli istnieje
Niech  <math>G_{\sharp }=(V_{N}\cup \{\sharp \},V_{T},v_{0},P)</math> będzie dowolną
maszyna Turinga <math>\displaystyle \mathcal{MT}=(\Sigma _{T},S,f,s_{0},S_{F})</math> dla
gramatyką kontekstową z markerem końca. Zakładamy, bez ograniczania ogólności
której <math>\displaystyle d_1 \mapsto^* d_2</math> gdzie <math>\displaystyle d_1=\sharp s_0 1^n \sharp</math>,
rozważań, że w&nbsp;zbiorze  <math>P</math> nie występuje prawo  <math>v_{0}\rightarrow 1</math>  
<math>\displaystyle d_2=\sharp s_1 1^{s(n)} w \sharp</math> dla <math>\displaystyle s_1\in S_F</math>, <math>\displaystyle w\in
(po wymazaniu markera  <math>\sharp</math> ). Dla każdego symbolu  <math>x</math> ze zbioru
(\Sigma_T\setminus \left\{1\right\})^*</math> oraz dodatkowo <math>\displaystyle d_2</math> jest
<math>V=V_{N}\cup V_{T}</math> określamy trzy symbole  <math>\, ^{\sharp }x,x^{\sharp },^{\ : \sharp }x^{\sharp }</math>  
konfiguracją końcową.
oraz oznaczamy odpowiednio przez  <math>\, ^{\sharp }V,V^{\sharp },^{\sharp }V^{\sharp }</math>  
}}
zbiory tych symboli. Dla  <math>u=u_{1}...u_{k}</math>  
 
takiego, że  <math>k\geqslant 1</math> <math>u_{i}\in V</math> dla  <math>i=1,\ldots,k</math> wprowadzamy także następujące oznaczenia:
Inaczej mówiąc funkcję <math>\displaystyle s(n)</math> nazywamy konstruowalną pamięciowo
jeśli istnieje maszyna Turinga <math>\displaystyle \mathcal{MT}</math> otrzymując na wejściu
słowo <math>\displaystyle w</math> długości <math>\displaystyle |w|=n</math> zaznacza na taśmie roboczej <math>\displaystyle s(n)</math> klatek
i zatrzymuje się (akceptując słowo <math>\displaystyle w</math>).
 
{{przyklad|||
Funkcja <math>\displaystyle s(n)=2n</math> jest konstruowalna pamięciowo. Maszyna <math>\displaystyle MT_4</math>
która konstruuje <math>\displaystyle s(n)</math> działa według schematu:
# Przejdź do prawego markera. Jeśli napotkano symbol inny niż
<math>\displaystyle 1</math> to odrzuć.
# Idź w lewo aż do pierwszego symbolu <math>\displaystyle 1</math> lub markera <math>\displaystyle \sharp</math>
# Jeśli napotkałeś symbol <math>\displaystyle 1</math> zamień go na <math>\displaystyle \clubsuit</math> i przejdź
do prawego markera. Dopisz do słowa symbol <math>\displaystyle \clubsuit</math> (zwiększając
tym samym długość słowa na taśmie o <math>\displaystyle 1</math>). Następnie powtórz cykl od
<math>\displaystyle 2</math>.
# Jeśli napotkałeś marker idź w prawo zamieniając wszystkie wystąpienia <math>\displaystyle \clubsuit</math> na
<math>\displaystyle 1</math>. Następnie wracaj do lewego markera i zatrzymaj się akceptując.
 
}}


{{twierdzenie|liniowa kompresja pamięci||
<math>\, ^{\sharp }u=\, ^{\sharp }u_{1}u_{2}...u_{k}</math>  ,  <math>u^{\sharp }=u_{1}...u_{k-1}u_{k}^{\sharp }</math>
oraz  <math>\, ^{\sharp }u^{\sharp }=\, ^{\sharp }u_{1}u_{2}...u_{k-1}u_{k}^{\sharp }</math>
gdy  <math>k>1</math> .


Niech będzie dany język <math>\displaystyle L</math> oraz maszyna Turinga
Przy takich oznaczeniach definiujemy gramatykę
<math>\displaystyle \mathcal{TM}</math> akceptująca <math>\displaystyle L</math> w pamięci <math>\displaystyle s(n)</math>. Dla dowolnego
<math>\displaystyle \varepsilon>0</math> istnieje maszyna Turinga <math>\displaystyle \mathcal{TM}'</math> akceptująca <math>\displaystyle L</math> w
pamięci <math>\displaystyle \max\left\{n,\varepsilon s(n)\right\}</math>.
}}


{{dowod|||
<center><math>G_{1}=(V_{N}\cup \, ^{\sharp }V\cup V^{\sharp }\cup ^{\sharp }V^{\sharp },V_{T},\, ^{\sharp }v_{0}^{\sharp },P_{1})</math></center>
(''Szkic'')
Ustalamy liczbę naturalną <math>\displaystyle k</math> dla której <math>\displaystyle \varepsilon k\geq 2</math>. Maszynę
<math>\displaystyle \mathcal{TM}'</math> definiujemy następująco:
# Przekoduj słowo wejściowe łącząc po <math>\displaystyle r</math> kolejnych symboli w
jeden blok stanowiący nowy symbol na taśmie.
# Symuluj maszynę <math>\displaystyle \mathcal{MT}</math> na skompresowanej taśmie.
Położenie głowicy wewnątrz bloku zakoduj w stanach maszyny
<math>\displaystyle \mathcal{MT}'</math>


Zauważmy, że w kroku <math>\displaystyle 1</math> maszyna <math>\displaystyle \mathcal{MT}'</math> wykorzystuje <math>\displaystyle n</math>
w której zbiór praw  <math>P_{1}</math> składa się ze wszystkich praw uzyskanych zgodnie
komórek pamięci do odczytania słowa wejściowego. Kompresja taśmy
z poniższymi warunkami:
zapewnia, że podczas symulowania maszyny <math>\displaystyle \mathcal{MT}</math> nie
# jeśli  <math>u\rightarrow w\in P</math> , to  <math>u\rightarrow w,\ : ^{\#}u\rightarrow \, ^{\#}w,\ : u^{\#}\rightarrow w^{\#},\ : ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1}</math>  
wykorzystamy więcej niż <math>\displaystyle \lceil \frac{s(n)}{k}\rceil \leq \varepsilon s(n)</math>
# jeśli  <math>\, ^{\#}u\rightarrow \, ^{\#}w\in P</math> , to  <math>\ : u^{\#}\rightarrow w^{\#},\ : ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1}</math>  
komórek. Jednocześnie można założyć, że <math>\displaystyle \mathcal{MT}'</math> akceptuje
# jeśli  <math>u^{\#}\rightarrow w^{\#}\in P</math> , to  <math>u^{\#}\rightarrow w^{\#},\ : ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1}</math>  
słowa wejściowe z języka <math>\displaystyle L</math> o długości mniejszej niż <math>\displaystyle k</math> bez
<math>\, ^{\#}x\rightarrow x,\ : x^{\#}\rightarrow x,\ : ^{\#}x^{\#}\rightarrow x\in P_{1}</math>  
symulowania <math>\displaystyle \mathcal{MT}</math>.
dla wszystkich  <math>x\in V</math> .
}}


{{twierdzenie|Savitch||
Określona w ten sposób gramatyka  <math>G_{1}</math>  jest gramatyką rozszerzającą i równoważną
wyjściowej.
Dla gramatyki  <math>G_{1}</math>  istnieje, zgodnie z poprzednim twierdzeniem,
równoważna gramatyka kontekstowa, co kończy dowód twierdzenia.


Dla dowolnej funkcji <math>\displaystyle s(n)</math> konstruowalnej pamięciowo spełniającej
warunek <math>\displaystyle s(n)\geq \log_2 n</math> prawdziwa jest inkluzja
<math>\displaystyle Nspace(s(n))\subset DSpace(s^2(n))</math>.
}}
}}


{{dowod|||
Prawdziwe jest także następujące twierdzenie (porównaj z [[#prz.1|1.1]]).
Niech <math>\displaystyle \mathcal{NMT}</math> będzie niedeterministyczną maszyną Turinga
akceptującą język <math>\displaystyle L=L(\mathcal{NMT})</math> w pamięci <math>\displaystyle s(n)</math>. Niech
<math>\displaystyle k(n)</math> oznacza liczbę konfiguracji potrzebną do zaakceptowania słowa
o długości <math>\displaystyle n</math>. Istnieje liczba <math>\displaystyle c>1</math> dla której <math>\displaystyle k(n)\leq
c^{s(n)}</math>, co z kolei oznacza, że każde słowo o długości <math>\displaystyle n</math> jest
akceptowane w <math>\displaystyle c^{s(n)}</math> krokach czasowych.
 
Rozważmy algorytm:
 
{| border=1
|+ <span style="font-variant:small-caps">Uzupelnij tytul</span>
|-
| ||  '''Algorithm 1'''
|-
|
1:  ||  Wejście: słowo <math>\displaystyle w</math> długości <math>\displaystyle |w|=n</math>
|-
| 2:  ||  oblicz <math>\displaystyle s(n)</math>
|-
| 3:  || '''for''' każda konfiguracja akceptująca <math>\displaystyle d_A</math> dla której <math>\displaystyle |d_A|\leq
s(n)</math>
|-
| 4:  || <math>\displaystyle \qquad</math> '''do if''' Test(<math>\displaystyle \sharp s_0 w \sharp</math>, <math>\displaystyle d_A</math>, <math>\displaystyle s(n)
\log_2 c</math>) '''then''' akceptuj
|-
|
 
|-
|
 
|}
 
gdzie procedura Test ma następującą postać:
 
{| border=1
|+ <span style="font-variant:small-caps">Uzupelnij tytul</span>
|-
|  ||  '''procedure''' Test(<math>\displaystyle d</math>,<math>\displaystyle d'</math>,<math>\displaystyle i</math>)
|-
|  1: ||  '''if''' <math>\displaystyle i=0</math> '''and''' [ (<math>\displaystyle d=d'</math>) '''or'''
(<math>\displaystyle d\mapsto d'</math>)] '''then return true'''
|-
| 2: || <math>\displaystyle \qquad</math> '''else for''' każda konfiguracja <math>\displaystyle d''</math> dla której
<math>\displaystyle |d''|\leq s(n)</math>
|-
| 3: ||  <math>\displaystyle \qquad \qquad</math> '''do if''' Test(<math>\displaystyle d</math>,<math>\displaystyle d''</math>,<math>\displaystyle i-1</math>)
'''and''' Test(<math>\displaystyle d''</math>,<math>\displaystyle d'</math>,<math>\displaystyle i-1</math>)
|-
| 4: || <math>\displaystyle \qquad \qquad \qquad</math> '''then return true''';
|-
| 5: ||  '''return false'''
|-
|
 
|}


Przedstawiony algorytm można zrealizować za pomocą wielo-taśmowej
{{twierdzenie|1.3||
maszyny Turinga. Założenie dotyczące konstruowalności pamięciowej
Dla dowolnej gramatyki kontekstowej (rozszerzającej) istnieje równoważna
jest istotnie wykorzystywane w tej konstrukcji przy implementacji
gramatyka kontekstowa (rozszerzająca) o tej własności, że każde prawo, w którym
linii 3 algorytmu i linii 2 procedury Test. Musimy zaznaczyć <math>\displaystyle s(n)</math>
występuje symbol terminalny, jest postaci  <math>v\rightarrow a</math> , gdzie  <math>v\in V_{N},\ : a\in V_{T}</math> .
komórek taśmy aby móc konstruować konfiguracje o długości
ograniczonej przez <math>\displaystyle s(n)</math> i móc następnie wykonywać na nich
symulację maszyny <math>\displaystyle \mathcal{NMT}</math>.


Zauważmy, że ilość konfiguracji jest ograniczona przez <math>\displaystyle s(n)</math> a
głębokość rekursji przez <math>\displaystyle \log c^{s(n)}</math>. Oznacza to, że jesteśmy w
stanie skonstruować maszynę Turinga która wymaga <math>\displaystyle c' s^2(n)</math>
pamięci, gdzie <math>\displaystyle c'</math> jest pewną stałą. Na mocy
Twierdzenia&nbsp;[[##twTComp|Uzupelnic twTComp|]] jesteśmy w stanie określić maszynę
<math>\displaystyle \mathcal{MT}</math> działającą w pamięci <math>\displaystyle s^2(n)</math>.
}}
}}


{{wniosek|||
Mówimy, że gramatyka  <math>G</math>  jest rzędu  <math>n>0</math> , jeśli dla każdego
<center> '''PSPACE''' <math>\displaystyle = </math> '''NPSPACE''' </center>
prawa  <math>x\rightarrow y</math> tej gramatyki spełniony jest warunek  <math>\mid x\mid \leqslant n</math>
i <math>\mid y\mid \leqslant n</math> . Kolejne twierdzenie stwierdza możliwość dalszego
uproszczenia praw gramatyki rozszerzającej.


}}
{{twierdzenie|1.4||
Dla każdej gramatyki rozszerzającej istnieje równoważna gramatyka rozszerzająca
rzędu  <math>2</math> .


{{lemat|||
Jeśli <math>\displaystyle g(n)\geq n</math> to <math>\displaystyle Dtime(g(n))\subset Dspace(g(n))</math> oraz
<math>\displaystyle Ntime(g(n))\subset Nspace(g(n))</math>.
}}
}}


{{dowod|||
Na koniec wprowadzimy  jeszcze jeden rodzaj gramatyk równoważnych gramatykom
Niech będzie dana maszyna deterministyczna <math>\displaystyle \mathcal{MT}</math>
kontekstowym. Są to mianowicie gramatyki liniowo ograniczone.
akceptująca dany język <math>\displaystyle L</math> w czasie <math>\displaystyle g(n)</math>. Do akceptacji słowa <math>\displaystyle w</math>
o długości <math>\displaystyle n</math> maszyna wykorzystuje conajwyżej <math>\displaystyle g(n)</math> kroków
czasowych, czyli odwiedza conajwyżej <math>\displaystyle g(n)+1</math> komórek taśmy.


Na podstawie Twierdzenia&nbsp;[[##twTComp|Uzupelnic twTComp|]] istnieje maszyna Turinga
{{definicja|1.3||
<math>\displaystyle \mathcal{MT}'</math> wykorzystująca
Gramatyka  <math>G=(V_{N},V_{T},v_{0},P)</math> jest liniowo ograniczona, jeśli każde
<center><math>\displaystyle
prawo jest jednej z następujących postaci:
\max \left\{n, \frac{1}{2}(g(n)+1)\right\}\leq g(n)
</math></center>


komórek pamięci. Dla niedeterministycznych maszyn Turinga argumentacja
<center><math>v_{0}\rightarrow v_{0}v,\ : v_{1}v_{2}\rightarrow z_{1}z_{2},\ : v\rightarrow x</math></center>
jest identyczna.
}}


{{wniosek|||
gdzie  <math>x\in V_{N}\cup V_{T},\ : v,v_{1},v_{2},z_{1},z_{2}\in V_{N}</math> oraz
<center> '''P''' <math>\displaystyle  \subset  </math> '''NP''' <math>\displaystyle  \subset
<math>v_{0}\notin \{x,z_{1},z_{2},v\}</math> .
</math> '''PSPACE''' <math>\displaystyle  = </math> '''NPSPACE''' </center>


}}
}}


{{uwaga|||
{{twierdzenie|1.5||
Nie jest znany przykład wykazujący silną inkluzję
Dla dowolnej gramatyki kontekstowej <math>G</math> istnieje gramatyka liniowo ograniczona
  '''P''' <math>\displaystyle  \varsubsetneq </math> '''NP''' ani dowód
<math>G_{1}</math> , która jest równoważna <math>G</math>  lub też generuje język <math>L(G)\setminus \{1\}</math> .
wykluczający istnienie takiego przykładu. Powszechnie uznawana
hipoteza głosi:
<center> '''P''' <math>\displaystyle \neq </math> '''NP''' </center>


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&nbsp;[[##ex_NP|Uzupelnic ex_NP|]] nawet w
przypadku konkretnego języka <math>\displaystyle L\in  </math> '''NP'''  problem
uzasadnienie, że także <math>\displaystyle L\in  </math> '''P'''  jest nietrywialny,
gdyż wymaga zazwyczaj konstrukcji całkiem nowej maszyny Turinga niż
ta do weryfikacji <math>\displaystyle L\in  </math> '''NP'''  .
}}
}}


==Redukcja i problemy zupełne==
{{dowod|||
 
W świetle poprzednich twierdzeń możemy przyjąć, że gramatyka kontekstowa  <math>G=(V_{N},V_{T},v_{0},P)</math>  
{{definicja|transformacja wielomianowa||
ma prawa wyłącznie w następujących postaciach:
 
<math>v_{0}\rightarrow 1</math>  
Niech <math>\displaystyle L_1,L_2</math> będą dowolnymi językami nad pewnym alfabetem
<math>v\rightarrow x</math> gdzie  <math>v\in V_{N},\ : x\in V_{N}\cup V_{T}</math>  
<math>\displaystyle \Sigma_I</math>. Mówimy, że <math>\displaystyle L_1</math> redukuje się do <math>\displaystyle L_2</math> w czasie
<math>v\rightarrow v_{1}v_{2}</math> gdzie  <math>v,v_{1},v_{2}\in V_{N}</math>  
wielomianowym, co oznaczamy <math>\displaystyle L_1 \propto L_2</math>, gdy istnieje
<math>v_{1}v_{2}\rightarrow v_{3}v_{4}</math> gdzie  <math>v_{1},v_{2},v_{3},v_{4}\in V_{N}</math>  
deterministyczna maszyna Turinga <math>\displaystyle \mathcal{MT}=(\Sigma
_{T},S,f,s_{0},S_{F})</math> taka, że dla dowolnego <math>\displaystyle w\in \Sigma_I^*</math>
istnieje <math>\displaystyle w'\in \Sigma_I^*</math> i stan <math>\displaystyle s_1\in S_F</math> o własności
<center><math>\displaystyle
\sharp s_0 w \sharp \mapsto^* \sharp s_1 w' \sharp
</math></center>


oraz
Określamy gramatykę  <math>G_{1}=(V_{N}\cup \{z_{0},z_{1}\},V_{T},z_{0},P_{1})</math> ,
<center><math>\displaystyle
gdzie  <math>z_{1},z_{2}</math>  są nowymi symbolami nieterminalnymi, a więc nie należą
w\in L_1 \quad \Longleftrightarrow \quad w' \in L_2.
do  <math>V_{N}</math> . Natomiast zbiór praw  <math>P_{1}</math>  składa się ze wszystkich
</math></center>
praw ze zbioru  <math>P</math> postaci 2 i 4 oraz  <math>z_{0}\rightarrow z_{0}z_{1},\ : z_{0}\rightarrow v_{0},\ :</math>
praw  <math>z_{1}v\rightarrow vz_{1},\ : vz_{1}\rightarrow z_{1}v</math>  dla  <math>v\in V_{N}</math>
i praw  <math>v_{1}z_{1}\rightarrow v_{3}v_{4}</math> dla każdego prawa postaci 4
w&nbsp;gramatyce  <math>G</math> . Skonstruowana gramatyka jest liniowo ograniczona i spełnia tezę
twierdzenia.


}}
}}


{{lemat|||
==Automat liniowo ograniczony==
Załóżmy, że <math>\displaystyle L_1 \propto L_2</math>. Wtedy zachodzą implikacje
# <math>\displaystyle L_2 \in  </math> '''P''' <math>\displaystyle  \quad \Longrightarrow \quad L_1 \in  </math> '''P'''
# <math>\displaystyle L_2 \in  </math> '''NP''' <math>\displaystyle  \quad \Longrightarrow \quad L_1 \in  </math> '''NP'''
# <math>\displaystyle L_2 \in  </math> '''PSPACE''' <math>\displaystyle  \quad \Longrightarrow \quad L_1 \in  </math> '''PSPACE'''


}}
Określimy teraz systemy, zwane automatami liniowo ograniczonymi, który rozpoznają
języki kontekstowe.


{{dowod|||
{{definicja|2.1||
Dane słowo <math>\displaystyle w</math> transformujemy do <math>\displaystyle w'</math> w czasie wielomianowym, co
'''Automatem liniowo ograniczonym ''' nazywamy
gwarantuje założenie <math>\displaystyle L_1 \propto L_2</math>. Dzięki założeniu <math>\displaystyle L_2 \in
system  <math>\mathcal{A}_{LO}=(\Sigma _{T},S,P,s_{0},S_{F})</math> , w którym  <math>\Sigma _{T}</math>  
</math> '''P''' możemy rozstrzygnąć czy <math>\displaystyle w'\in L_2</math> (tzn. jeśli
jest skończonym alfabetem,  <math>S</math>  skończonym zbiorem stanów,  <math>S\cap \Sigma _{T}=\emptyset</math>  
akceptujemy <math>\displaystyle w'</math> to robimy to w czasie wielomianowym). Tym sposobem
oraz wyróżniony jest podzbiór  <math>\Sigma _{I}\subset \Sigma _{T}</math> . Zbiór  <math>\Sigma _{T}</math>
(korzystając z definicji transformacji wielomianowej) akceptujemy
zwany jest alfabetem taśmy, a  <math>\Sigma _{I}</math>  - alfabetem wejściowym.
<math>\displaystyle w</math> w czasie wielomianowym, o ile tylko <math>\displaystyle w\in L_1</math>. Dowód dla
Wyróżnione są także: element  <math>\#\in \Sigma _{T}\setminus \Sigma _{I}</math> zwany
pozostałych implikacji jest identyczny.
markerem końca, stan początkowy  <math>s_{0}\in S</math>  oraz  <math>S_{F}\subset S</math>  
}}
- zbiór stanów końcowych. Natomiast relacja przejść  <math>P\subset (S\times \Sigma _{T})\times (S\times \Sigma _{T}\times \{-1,0,1\})</math>
spełnia następujące warunki:
# jeśli  <math>(s_{1},\#)P(s_{2},a,k)</math> , to  <math>a=\#</math>  
# jeśli  <math>(s_{1},a)P(s_{2},\#,k)</math> , to  <math>a=\#</math>


{{definicja|||
Fakt, że  <math>(s_{1},a)P(s_{2},b,k)</math> ,  zapisujemy zazwyczaj jako  <math>(s_{1},a)\rightarrow (s_{2},b,k)</math> .
Niech <math>\displaystyle \mathcal{C}</math> oznacza pewną klasę języków. Język <math>\displaystyle L</math> nazywamy
Do opisu działania automatu liniowo ograniczonego wygodnie jest wprowadzić pojęcie
'''<math>\displaystyle \mathcal{C}</math>-trudnym''' jeśli spełniony jest warunek:
konfiguracji (podobnie jak dla automatów ze stosem).
<center><math>\displaystyle
\forall\; L' \in \mathcal{C} \quad L'\propto L.
</math></center>


Jeżeli dodatkowo spełniony jest warunek <math>\displaystyle L\in \mathcal{C}</math> to język
Konfiguracją automatu liniowo ograniczonego jest
<math>\displaystyle L</math> nazywamy '''<math>\displaystyle \mathcal{C}</math>-zupełnym'''.
słowo  <math>vsw\in (\Sigma _{T}\cup S)^{*}</math> ,
}}
w&nbsp;którym  <math>s\in S,\; v,w\in \Sigma _{T}^{*}</math> . Pomiędzy dwoma konfiguracjami
<math>d_{1},d_{2}</math>  zachodzi relacja bezpośredniego następstwa  <math>d_{1}\mapsto d_{2}</math>  
wtedy i tylko wtedy, gdy spełniony jest jeden z&nbsp;niżej wypisanych warunków, gdzie
<math>s_{1},s_{2}\in S</math> <math>a,b,c\in \Sigma _{T}</math>  oraz  <math>v,w\in \Sigma _{T}^{*}:</math>
#  <math>d_{1}=vs_{1}aw</math> ,  <math>d_{2}=vs_{2}bw</math>  oraz  <math>(s_{1},a)P(s_{2},b,0)</math>
#  <math>d_{1}=vs_{1}aw</math> ,  <math>d_{2}=vbs_{2}w</math>  oraz  <math>(s_{1},a)P(s_{2},b,1)</math>  
#  <math>d_{1}=vcs_{1}aw</math> ,  <math>d_{2}=vs_{2}cbw</math>  oraz  <math>(s_{1},a)P(s_{2},b,-1)</math>


Intuicyjnie, fakt że język jest <math>\displaystyle \mathcal{C}</math>-zupełny oznacza że
Przechodnie domknięcie relacji  <math>\mapsto</math> oznaczać będziemy symbolem
jest ona najbardziej skomplikowany (pod względem obliczeniowym)
<math>\mapsto^{*}</math> i określać mianem obliczenia wykonanego przez automat
wśród języków z klasy <math>\displaystyle \mathcal{C}</math>, natomiast język
liniowo ograniczony.
<math>\displaystyle \mathcal{C}</math>-trudny jest bardziej skomplikowany niż każdy z klasy
<math>\displaystyle \mathcal{C}</math> choć sam nie musi do niej należeć.


{{uwaga|||
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.).
}}
}}


{{przyklad|||
Język rozpoznawany przez automat liniowo ograniczony  <math>\mathcal{A}_{LO}</math>  
Rozważmy języki:
to zbiór słów nad alfabetem  <math>\Sigma _{I}</math> , pod działaniem których automat
<center><math>\displaystyle
wykonuje obliczenie prowadzące do stanu końcowego, czyli
L_1=\left\{1^i 2^j 3^k\: k=i\cdot j,\: i,j\geq 1\right\}\quad,\quad
L_2=\left\{1^i 2^j 4^{2k}\: k=i\cdot j,\: i,j\geq 1\right\}
</math></center>
 
Języki <math>\displaystyle L_1</math> oraz <math>\displaystyle L_2</math> wyglądają na bardzo podobne, zatem wydaje
się że <math>\displaystyle L_1 \propto L_2</math> oraz <math>\displaystyle L_2 \propto L_1</math>. Uzasadnienie tego
faktu jest prawie natychmiastowe.


Konstruujemy deterministyczną maszynę Turinga która działa w
<center><math>L(\mathcal{A}_{LO})=\left\{ w\in \Sigma _{I}^{*}\ : :\ : s_{0}\#w\#\mapsto^{*}vs,\; v\in \Sigma _{T}^{*},\, s\in S_{F}\right\}</math>.</center>
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 <math>\displaystyle 4</math> to wykonaj krok [[##Step_stop_1|Uzupelnic Step_stop_1|]].
# Jeśli w słowie wejściowym występuje symbol <math>\displaystyle 4</math> to sprawdź czy słowo przetwarzane jest postaci <math>\displaystyle \sharp w
4^s \sharp</math> gdzie <math>\displaystyle s\geq 1</math> oraz <math>\displaystyle w\in (\Sigma_I\setminus
\left\{4\right\})^*</math> oraz czy dodatkowo <math>\displaystyle s</math> jest liczbą parzystą. Jeśli nie
to wykonaj krok [[##Step_stop_1|Uzupelnic Step_stop_1|]].
# Zamień słowo <math>\displaystyle 4^s</math> na słowo <math>\displaystyle 3^{\frac{s}{2}}\sharp^{\frac{s}{2}}</math> i wykonaj krok [[##Step_stop_1|Uzupelnic Step_stop_1|]].
# Przejdź nad pierwszy symbol po lewym ograniczniku i zatrzymaj
się.


W ten sposób zawsze przeprowadzamy konfigurację <math>\displaystyle \sharp s_0 w \sharp
Język  <math>L\subset \Sigma _{I}^{*}</math> jest rozpoznawany (akceptowany) przez
</math> na konfigurację <math>\displaystyle \sharp s_1 w' \sharp</math>, przy czym <math>\displaystyle w'=1^i 2^j 3^k</math>
automat liniowo ograniczony, jeśli istnieje automat  <math>\mathcal{A}_{LO}</math> taki,
tylko gdy <math>\displaystyle w=1^i 2^j 4^{2k}</math>. Zatem <math>\displaystyle w\in L_2</math> wtedy i tylko wtedy
że <math>\mathcal{L}(\mathcal{A}_{LO})=L</math>  
gdy <math>\displaystyle w'\in L_1</math>. Wykazaliśmy, że <math>\displaystyle L_2 \propto L_1</math>.


Warunek <math>\displaystyle L_1 \propto L_2</math> otrzymujemy w sposób identyczny. Trzeba
<center>
tylko wypisać odpowiednią ilość symboli <math>\displaystyle 4</math> (a wiemy już jak
<div class="thumb"><div style="width:200px;"><flash>file=Wyklad12_rysunek1.swf|width=200|height=200</flash>
konstruować liczbę <math>\displaystyle 2n</math> mając dane <math>\displaystyle n</math>).
<div.thumbcaption>Rysunek 1</div>
}}
</div></div>
</center>


==Języki maszyn Turinga i rodzina <math>\displaystyle \mathcal{L}_{0}</math>==


Powstaje naturalne pytanie o związki pomiędzy  klasą
Opiszemy teraz możliwe ruchy automatu liniowo ograniczonego. Automat ten
języków rozpoznawanych przez maszyny Turinga, a klasami zadanymi
może czytać słowo wejściowe w
poprzez gramatyki. Odpowiemy na to pytanie w tej części
dwóch kierunkach. Jego głowica może poruszać się w lewo lub w
wykładu.
prawo. Automat może wymieniać czytaną literę na inną,
ale nie rozszerza miejsca zajętego na taśmie przez czytane słowo.
Działa  niedeterministycznie. Czytając literę  <math>a</math>, będąc w stanie  <math>s</math>,  automat ma kilka możliwości działania. Może mianowicie:
# zamienić literę na inną literę i/lub zmienić stan na inny - zgodnie z warunkiem 1. Głowica czytająca automatu pozostaje w poprzedniej pozycji,
# zamienić literę na inną literę i/lub zmienić stan na inny - zgodnie z warunkiem 2. Głowica czytająca automatu przesuwa się w prawo,
# zamienić literę na inną literę i/lub zmienić stan na inny - zgodnie z warunkiem 3. Głowica czytająca automatu przesuwa się w lewo.


{{twierdzenie|||
Związek pomiędzy rodziną języków kontekstowych a wprowadzoną rodziną automatów liniowo
Każdy język akceptowany przez maszynę Turinga jest typu
ograniczonych ustalają poniższe twierdzenia.
'''(0)'''.


<center><math>\displaystyle \mathcal{L}(MT)\subset \mathcal{L}_{0}</math></center>
{{twierdzenie|2.1||
Dla dowolnego języka kontekstowego  <math>L</math> istnieje automat liniowo ograniczony
<math>\mathcal{A}_{LO}</math>  taki, że  <math>\mathcal{L}(\mathcal{A}_{LO})=L</math> .


}}
}}


{{dowod|||
{{dowod|||
Niech  <math>\displaystyle L  </math>  będzie językiem akceptowanym przez maszynę Turinga <math>\displaystyle \mathbf{MT}=(\Sigma _{T},S,f,s_{0},S_{F})  </math> , o której założymy, że
Można założyć,
<math>\displaystyle f(s_{0},\#)=(s',\#,1) </math> , jeśli para <math>\displaystyle (s_{0},\#)  </math>  należy do
bez ograniczenia ogólności naszych rozważań, że gramatyka <math>G=(V_{N},V_{T},v_{0},P)</math>  
dziedziny funkcji przejść <math>\displaystyle f  </math> maszyny Turinga. Założenie to nie
generująca język <math>L</math>  ma prawa wyłącznie następujących postaci:
ogranicza ogólności rozważań. Wyróżnimy pewien podzbiór <math>\displaystyle \overline{S}_{F} </math>  zbioru stanów  <math>\displaystyle S  </math> , którego elementy,
# (G) <math>v\rightarrow x</math> , gdzie <math>v\in V_{N},x\in V_{N}\cup V_{T},x\neq v_{0}</math>  
jak wskazuje oznaczenie, skojarzone są ze stanami końcowymi. Do
# (G) <math>v_{0}\rightarrow v_{0}v_{1}</math> , gdzie <math>v_{1}\in V_{N},v_{1}\neq v_{0}</math>  
zbioru <math>\displaystyle \overline{S}_{F} </math> należy każdy stan <math>\displaystyle \overline{s}\in S
# (G) <math>v_{1}v_{2}\rightarrow v_{3}v_{4}</math> , gdzie <math>v_{1},\ldots,v_{4}\in V_{N},v_{3},v_{4}\neq v_{0}</math>  
</math> , dla którego istnieje ciąg stanów  <math>\displaystyle s_{1}=\overline{s},...,s_{k}  </math> dla <math>\displaystyle k\geq 1 </math>  taki, że  <math>\displaystyle (s_{i},\#)\rightarrow (s_{i+1},\#,0)  </math> dla  <math>\displaystyle k=1,...,k-1  </math> oraz
# (G) <math>v_{0}\rightarrow 1</math>  jeśli <math>1\in L</math> .
<math>\displaystyle (s_{k},\#)\rightarrow (s,\#,1)  </math> , gdzie  <math>\displaystyle s\in S_{F} </math> .
Zauważmy, iż wraz ze stanem  <math>\displaystyle \overline{s} </math> do zbioru <math>\displaystyle \overline{S}_{F}  </math>  należą wszystkie elementy ciągu <math>\displaystyle s_{1}=\overline{s},...,s_{k}  </math> .


Określamy teraz gramatykę <math>\displaystyle G=(V_{N},V_{T},v_{0},P) </math> . Zbiór
Określamy automat liniowo ograniczony <math>\mathcal{A}_{LO}=(\Sigma _{T},S,P,s_{0},S_{F})</math> ,
symboli nieterminalnych <math>\displaystyle V_{N} </math> zawiera wyłącznie
przyjmując <math>\Sigma _{T}=V_{N}\cup V_{T}\cup \{\#,\flat \}</math> , <math>S=\{s_{0},s_{1},s_{2},s_{3},s_{4}\}\cup \{s_{v_{1}}:  v_{1}v_{2}\rightarrow v_{3}v_{4}\in P\}</math> ,
następujące symbole:
<math>\Sigma _{I}=V_{N}\cup V_{T}</math>  ,  <math>S_{F}=\{s_{3}\}</math> , <math>s_{0}</math>  -
# dla każdego stanu <math>\displaystyle s\in </math> <math>\displaystyle a\in \Sigma _{T}\setminus \{\#\}  </math>  symbole
stan początkowy. Relacja przejść automatu  <math>\mathcal{A}_{LO}</math>  zdefiniowana
<math>\displaystyle v_{sa},\: ^{\#}v_{sa},\: v_{sa}^{\#},\: ^{\#}v_{sa}^{\#} </math>  
jest poniżej:
# dla każdej litery <math>\displaystyle a\in \Sigma _{T}\setminus \{\#\} </math> symbole <math>\displaystyle \, ^{\#}a </math>  
# (A)  <math>(s_{0},\#)\rightarrow (s_{0},\#,1)</math>
i <math>\displaystyle a^{\#} </math>  
# (A)  <math>(s_{0},\#)\rightarrow (s_{4},\#,1)</math>  jeśli <math>1\in L</math>
# wszystkie elementy zbioru <math>\displaystyle \Sigma _{T}\setminus (\Sigma _{I}\cup \{\#\}) </math>  
# (A)  <math>(s_{0},x)\rightarrow (s_{0},x,1)</math>  ,  <math>(s_{0},x)\rightarrow (s_{0},x,-1)</math> dla każdego <math>x\in V_{N}\cup V_{T}</math>
# symbole <math>\displaystyle v_{0},\: v_{1} </math> nie należące do <math>\displaystyle \Sigma _{T} </math>  
# (A)  <math>(s_{0},x)\rightarrow (s_{0},v,0)</math>  jeśli <math>v\rightarrow x\in P</math> i  <math>x\neq v_{0}</math>  
# (A) <math>(s_{0},v_{3})\rightarrow (s_{v_{1}},v_{1},1),\; (s_{v_{1}},v_{4})\rightarrow (s_{0},v_{2},0)</math> jeśli <math>v_{1}v_{2}\rightarrow v_{3}v_{4}\in P</math>  
# (A) <math>(s_{0},v_{0})\rightarrow (s_{1},v_{0},-1)</math>  
# (A) <math>(s_{1},\#)\rightarrow (s_{2},\#,1)</math>
# (A)  <math>(s_{1},\flat )\rightarrow (s_{2},\flat ,1)</math>
# (A)  <math>(s_{2},v_{0})\rightarrow (s_{3},\flat ,1)</math>  
# (A) <math>(s_{3},v_{1})\rightarrow (s_{0},v_{0},0)</math> , gdy <math>v_{0}\rightarrow v_{0}v_{1}\in P</math>  
# (A) <math>(s_{3},\#)\rightarrow s_{3},\#,1),\; (s_{4},\#)\rightarrow (s_{3},\#,1)</math>  


Zbiór praw <math>\displaystyle P  </math>  składa się z praw wymienionych poniżej:
Określony automat <math>\mathcal{A}_{LO}</math>  rozpoznaje
#  <math>\displaystyle v_{0}\rightarrow \, ^{\#}v_{sa}^{\#}  </math> ,  <math>\displaystyle v_{0}\rightarrow v_{1}v_{sa}^{\#}  </math>
tylko te słowa, które są generowane przez gramatykę <math>G</math> , symulując wstecz
jeśli  <math>\displaystyle f(s,a)=(\overline{s},b,1)  </math>  dla pewnego  <math>\displaystyle b\in \Sigma
każde wyprowadzenie gramatyki <math>G</math> .
_{T}\setminus \{\#\}  </math> ,
<math>\displaystyle \overline{s}\in \overline{S}_{F}  </math> ,
#  <math>\displaystyle v_{1}\rightarrow \, ^{\#}a  </math> ,  <math>\displaystyle v_{1}\rightarrow v_{1}a  </math>  dla każdego
<math>\displaystyle a\in \Sigma _{T}\setminus \{\#\}  </math> ,
#  <math>\displaystyle v_{s_{1}c}b\rightarrow cv_{sa}  </math>  ,  <math>\displaystyle \, ^{\#}v_{s_{1}c}b\rightarrow \, ^{\#}cv_{sa}  </math>
,  <math>\displaystyle v_{s_{1}c}b^{\#}\rightarrow cv^{\#}_{sa}  </math>  ,  <math>\displaystyle \,
^{\#}v_{s_{1}c}b^{\#}\rightarrow \, ^{\#}cv^{\#}_{sa}  </math>  jeśli  <math>\displaystyle f(s,a)=(s_{1},b,-1)  </math>  i  <math>\displaystyle c\in \Sigma _{T}\setminus \{\#\}  </math> ,
#  <math>\displaystyle bv_{s_{1}c}\rightarrow v_{sa}c  </math>  ,  <math>\displaystyle \, ^{\#}bv_{s_{1}c}\rightarrow \, ^{\#}v_{sa}c  </math>
,  <math>\displaystyle bv_{s_{1}c}^{\#}\rightarrow v_{sa}c^{\#}  </math>  ,  <math>\displaystyle \,
^{\#}bv_{s_{1}c}^{\#}\rightarrow \, ^{\#}v_{sa}c^{\#}  </math>  jeśli  <math>\displaystyle f(s,a)=(s_{1},b,1)  </math>  i  <math>\displaystyle c\in \Sigma _{T}\setminus \{\#\}  </math> ,
#  <math>\displaystyle v_{s_{1}b}\rightarrow v_{sa}  </math>  ,  <math>\displaystyle \, ^{\#}v_{s_{1}b}\rightarrow \, ^{\#}v_{sa}  </math>
,  <math>\displaystyle v_{s_{1}b}^{\#}\rightarrow v^{\#}_{sa}  </math>  ,  <math>\displaystyle \,
^{\#}v_{s_{1}b}^{\#}\rightarrow \, ^{\#}v^{\#}_{sa}  </math>  jeśli  <math>\displaystyle f(s,a)=(s_{1},b,0)  </math> ,
#  <math>\displaystyle v_{s_{1}b}^{\#}\rightarrow v^{\#}_{sa}  </math>  ,  <math>\displaystyle \, ^{\#}v_{s_{1}b}^{\#}\rightarrow \, ^{\#}v^{\#}_{sa}  </math> ,
jeśli istnieją  <math>\displaystyle s_{1}',...,s_{k}'\in S  </math>  dla  <math>\displaystyle k\geq 1  </math>  takie,
że  <math>\displaystyle f(s,a)=(s_{1}',b,1)  </math> ,  <math>\displaystyle f(s_{i}',\#)=(s_{i+1}',\#,0)  </math>  dla
<math>\displaystyle i=1,...,k-1  </math>  oraz  <math>\displaystyle f(s_{k}',\#)=(s_{1},\#,-1)  </math> ,
#  <math>\displaystyle \, ^{\#}v_{s_{1}b}\rightarrow \, ^{\#}v_{sa}  </math>  , ,  <math>\displaystyle \, ^{\#}v_{s_{1}b}^{\#}\rightarrow \, ^{\#}v^{\#}_{sa}  </math> ,
jeśli  istnieją  <math>\displaystyle s_{1}',...,s_{k}'\in S  </math>  dla  <math>\displaystyle k\geq 1  </math>
takie, że  <math>\displaystyle f(s,a)=(s_{1}',b,-1)  </math> ,  <math>\displaystyle f(s_{i}',\#)=(s_{i+1}',\#,0)  </math>  dla  <math>\displaystyle i=1,...,k-1  </math>  oraz  <math>\displaystyle f(s_{k}',\#)=(s_{1},\#,1)  </math> ,
#  <math>\displaystyle a^{\#}\rightarrow a  </math>  dla wszystkich  <math>\displaystyle a\in \Sigma _{T}\setminus \{\#\}  </math> ,
#  <math>\displaystyle \, ^{\#}v_{sa}\rightarrow a  </math>  ,  <math>\displaystyle \, ^{\#}v_{sa}^{\#}\rightarrow a  </math> ,
jeśli <math>\displaystyle f(s_{0},\#)=(s,\#,1)  </math> (porównaj założenie na początku
dowodu),
#  <math>\displaystyle v_{0}\Rightarrow 1  </math>  jeśli <math>\displaystyle 1\in L  </math> .


Określona powyżej gramatyka  <math>\displaystyle G  </math>  jest gramatyką typu
}}
'''(0)'''. Rozważmy teraz dowolne słowo  <math>\displaystyle w  </math> , dla którego
istnieje wyprowadzenie w gramatyce  <math>\displaystyle G  </math>  ze stanu
początkowego  <math>\displaystyle v_{0} </math>  przy użyciu praw 1-7. Słowo  <math>\displaystyle w  </math>  zawiera
dokładnie jeden z następujących symboli  <math>\displaystyle v_{sa},\,
^{\#}v_{sa},v_{sa}^{\#}  </math>  lub  <math>\displaystyle \, ^{\#}v_{sa}^{\#}  </math> . Pierwsza
litera słowa  <math>\displaystyle w  </math>  oznaczona jest markerem  <math>\displaystyle \#  </math>  z lewej
strony, a ostatnia litera słowa  <math>\displaystyle w  </math>  oznaczona jest markerem  <math>\displaystyle \#  </math>  ze strony prawej. Ponadto żadna z liter występujących pomiędzy
pierwszą a ostatnią nie jest oznaczona markerem  <math>\displaystyle \#  </math> . Z każdym
takim słowem kojarzymy konfigurację poprzez zastąpienie symbolu  <math>\displaystyle v_{sa}  </math>  przez  <math>\displaystyle sa  </math>  oraz przez dopisanie symbolu  <math>\displaystyle \#  </math>  po
lewej lub prawej stronie znaczonej przez ten marker litery, zgodnie
z jego występowaniem. Jeśli np.  <math>\displaystyle w=\, ^{\#}v_{sa}^{\#}  </math> , to
skojarzona konfiguracja jest postaci  <math>\displaystyle \#sa\#  </math> . Zauważmy, że
jeśli słowa  <math>\displaystyle u  </math>  i  <math>\displaystyle w  </math>  są w powyższej formie, to fakt, iż  <math>\displaystyle u\mapsto^{*}w  </math> , jest równoważny stwierdzeniu, że z
konfiguracji skojarzonej ze słowem  <math>\displaystyle w  </math>  maszyna Turinga
<math>\displaystyle MT  </math>  może przejść (bezpośrednie następstwo) do
konfiguracji skojarzonej ze słowem  <math>\displaystyle u  </math> . Każdy krok
obliczenia realizowanego przez  <math>\displaystyle MT  </math>  ma swój odpowiednik - krok w
wyprowadzeniu w gramatyce  <math>\displaystyle G  </math> . Z tym, że wobec praw 6 i 7
sekwencja obliczeń


<center><math>\displaystyle vsa\#\rightarrow vbs_{1}'\#\rightarrow ...\rightarrow
Prawdziwe jest również następujące twierdzenie.
vbs_{k}'\#\rightarrow vs_{1}b\#</math></center>


jest traktowana jako jeden krok w
{{twierdzenie|2.2||
obliczeniu prowadzonym przez maszynę Turinga. I analogicznie
Dla dowolnego języka <math>L</math>  rozpoznawanego przez automat liniowo ograniczony
traktujemy sekwencję z markerem  <math>\displaystyle \#  </math>  występującym po lewej
<math>\mathcal{A}_{LO}</math>  istnieje gramatyka kontekstowa <math>G</math>  taka, że  <math>L(G)=L</math> .
stronie. Ze stanu początkowego  <math>\displaystyle v_{0}  </math>  gramatyki  <math>\displaystyle G  </math>
można wyprowadzić wszystkie słowa  <math>\displaystyle w  </math> , dla których konfiguracja
jest równa  <math>\displaystyle \#vsa\#  </math>  dla pewnego  <math>\displaystyle v\in (\Sigma _{I}\setminus
\{\#\})^{*}  </math>  oraz maszyna Turinga realizuje obliczenie
 
<center><math>\displaystyle sa\#\rightarrow bs_{1}'\#\rightarrow ...\rightarrow
bs_{k}'\#\rightarrow b\#s_{1},\quad s_{1}\in S_{F}.</math></center>
 
Wynika to z
praw 1 i 2 skonstruowanej gramatyki <math>\displaystyle G  </math> . Z kolei prawa
typu 9 służą do zastąpienia symboli nieterminalnych typu
<math>\displaystyle \, ^{\#}v_{sa},\, ^{\#}v_{sa}^{\#}  </math>  przez litery terminalne,
a&nbsp;prawa typu 8 eliminują symbole nieterminalne typu  <math>\displaystyle a^{\#}  </math> . A
zatem dla niepustego słowa  <math>\displaystyle w\in (\Sigma _{I}\setminus \{\#\})^{*}
</math> spełniona jest równoważność
 
<center><math>\displaystyle v_{0}\mapsto_{G}^{*}w\: \Leftrightarrow \: s_{0}\#w\#\rightarrow
_{TM}^{*}\#u\#s_{1}, </math></center>
 
gdzie  <math>\displaystyle u\in (\Sigma _{I}\setminus
\{\#\})^{*}  </math> oraz  <math>\displaystyle s_{1}\in S_{F} </math> . Prawo 10. zapewnia, że
powyższa równoważność prawdziwa jest także dla słowa pustego  <math>\displaystyle 1
</math> . A to kończy dowód tego twierdzenia. }}
 
Język <math>\displaystyle L  </math>  nazywamy '''rekurencyjnie przeliczalnym'''
jeśli istnieje efektywny
algorytm wyliczający wyłącznie słowa z <math>\displaystyle L  </math> . 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  <math>\displaystyle \mathcal{RP} </math> .
 
Zauważmy, że każda gramatyka  <math>\displaystyle G </math> typu '''(0)''' jest
algorytmem wyliczającym wyłącznie słowa z  <math>\displaystyle L=L(G) </math> . Dla każdej
liczby naturalnej  <math>\displaystyle k  </math>  można bowiem rozważyć skończony zbiór
wyprowadzeń w  <math>\displaystyle G  </math>  rozpoczynających się od symbolu początkowego
<math>\displaystyle v_{0}  </math>  i o długości równej  <math>\displaystyle k  </math> . Z tego zbioru można z kolei
wybrać wyłącznie te wyprowadzenia, które kończą się słowem
nad alfabetem terminalnym gramatyki  <math>\displaystyle G  </math>  i tylko te
słowa dodawać do listy składającej się na język  <math>\displaystyle L  </math> . Są to, jak
łatwo zauważyć, wszystkie słowa języka  <math>\displaystyle L </math>  i nic ponadto. A
zatem
 
{{twierdzenie|||
Każdy język typu '''(0)''' jest językiem rekurencyjnie
przeliczalnym, czyli  <math>\displaystyle \mathcal{L}_{0}\subset \mathcal{RP}  </math> .


}}
}}


Język  <math>\displaystyle L  </math>  nazywamy '''rekurencyjnym'''
W dowodzie konstruuje się odpowiednią gramatykę.Zasada tej konstrukcji
jeśli istnieje efektywny algorytm
jest następująca.
rozstrzygający dla każdego słowa <math>\displaystyle w\in A^{*}  </math>  jego
Z symbolu startowego gramatyka generuje dowolne
przynależność do języka  <math>\displaystyle L  </math> . Klasę języków
słowa, ustawiając zawsze na prawym końcu symbol nieterminalny związany z
rekurencyjnych oznaczamy symbolem  <math>\displaystyle \mathcal{R}  </math> .
przejściem automatu do stanu końcowego. Następnie korzysta się z możliwości
zamiany takiego symbolu nieterminalnego na inne. W ten sposób gramatyka
symuluje wstecz
działanie automatu, wprowadzając symbole nieterminalne odpowiadające stanom
automatu. Dojście do stanu początkowego automatu w tej symulacji jest równoznaczne
z usunięciem ostatniego symbolu nieterminalnego i wygenerowaniem słowa dokładnie
tego samego, które rozpoznaje automat.


Klasa języków kontekstowych zawiera się istotnie w klasie
Udowownimy teraz zamkniętość rodziny języków
języków rekurencyjnych, o czym przekonuje poniższe
kontekstowych ze względu na iloczyn mnogościowy.
twierdzenie.


{{twierdzenie|||
{{twierdzenie|2.3||
Każdy język kontekstowy ''''''jest językiem rekurencyjnym, czyli
Dla dowolnych języków kontekstowych  <math>L_{1},L_{2}\subset A^{*}</math>  iloczyn
<math>\displaystyle \mathcal{L}_{1}\subset \mathcal{R}</math>  
mnogościowy tych języków  <math>L_{1}\cap L_{2}</math> jest językiem kontekstowym.


}}
}}


{{dowod|||
{{dowod|||
Niech <math>\displaystyle L </math> będzie dowolnym językiem kontekstowym. Istnieje więc
(szkic)
gramatyka kontekstowa <math>\displaystyle G=(V_{N},V_{T},v_{0},P) </math>  taka, że <math>\displaystyle L=L(G)  </math> . Bezpośrednio z&nbsp;definicji gramatyki
Załóżmy, że języki  <math>L_{1},L_{2}</math>  są rozpoznawane przez automaty
kontekstowej wynika, że słowo puste <math>\displaystyle 1\in L  </math> wtedy i tylko
liniowo ograniczone, <math>\mathcal{A}^{1}_{LO}</math>  i <math>\mathcal{A}_{LO}^{2}</math> .
wtedy, gdy <math>\displaystyle v_{0}\rightarrow 1\in P  </math> . Załóżmy teraz, że dane
Opiszemy konstrukcję automatu liniowo ograniczonego <math>\mathcal{A}_{LO}</math> ,
jest słowo <math>\displaystyle w\in V^{*}_{T}  </math> , o którym mamy zadecydować, czy
który rozpoznawać będzie wyłącznie słowa akceptowane równocześnie przez oba
należy do języka <math>\displaystyle L  </math> . W tym celu rozważmy wszystkie ciągi słów
automaty. Działanie tego automatu jest następujące. Każde słowo będzie czytane
trzy razy. Przy pierwszym czytaniu automat  <math>\mathcal{A}_{LO}</math>  dubluje litery,
to znaczy w miejsce litery <math>a</math>  wprowadza parę <math>(a,a)</math> . Po zakończeniu
tej procedury automat wraca do skrajnej lewej pozycji i rozpoczyna symulację
automatu <math>\mathcal{A}^{1}_{LO}</math> . Jeśli ta symulacja doprowadzi do zaakceptowania
czytanego słowa przez automat <math>\mathcal{A}^{1}_{LO}</math> , to automat  <math>\mathcal{A}_{LO}</math>  
rozpoczyna obliczenie od początku, symulując teraz pracę automatu <math>\mathcal{A}_{LO}^{2}</math> .
Jeśli i ta symulacja zakończy się zaakceptowaniem czytanego słowa, to automat
przechodzi do ustalonego stanu końcowego, a to oznacza akceptację tego słowa.
Działając w opisany sposób, automat <math>\mathcal{A}_{LO}</math>  rozpoznaje
język <math>L_{1}\cap L_{2}</math> , a to w świetle udowodnionego powyżej twierdzenia
oznacza, że przecięcie języków kontekstowych <math>L_{1}\cap L_{2}</math> jest językiem
kontekstowym.


<center><math>\displaystyle y_{0}=v_{0},\: y_{1},...,y_{n-1},\: y_{n}=w</math></center>
}}
 
o tej własności, że  <math>\displaystyle y_{i}\in (V_{N}\cup V_{T})^{*}  </math> są parami różne dla  <math>\displaystyle i=0,...,n
</math> ,  <math>\displaystyle n\geq 1  </math>  oraz  <math>\displaystyle \mid y_{i}\mid \leq \mid y_{i+1}\mid  </math> .
Ilość takich ciągów jest skończona i słowo  <math>\displaystyle w\in L  </math>  wtedy i
tylko wtedy, gdy wśród powyższych ciągów znajdziemy choć jeden taki,
że tworzy wyprowadzenie w gramatyce  <math>\displaystyle G  </math> . Czyli


<center><math>\displaystyle y_{0}=v_{0}\rightarrow y_{1}\rightarrow ...\rightarrow
Ponieważ dalsze własności domkniętości rodziny języków kontekstowych  pokrywają się z własnościami języków typu '''(0)''', więc omówimy te własności wspólnie, co będzie mieć miejsce w następnym wykładzie.
y_{n-1}\rightarrow y_{n}=w. </math></center>


Ponieważ ilość ciągów podlegających rozważaniom jest
==Maszyna Turinga==
skończona oraz ponieważ stwierdzenie czy pomiędzy dowolnymi słowami
zachodzi relacja  <math>\displaystyle \rightarrow  </math> , sprowadza się do przeszukania
skończonego zbioru praw  <math>\displaystyle P  </math> , efektywnie rozstrzygniemy, czy  <math>\displaystyle w
</math>  należy do języka  <math>\displaystyle L  </math>  czy też nie. }}


Uzyskane dotąd rezultaty możemy podsumować następująco:
[[grafika:Turing1.jpeg|thumb|right||Alan Turing (1912-1954)<br>[[Biografia Turinga|Zobacz biografię]]]]
Przejdziemy teraz do prezentacji ogólnego modelu maszyny liczącej, który został
wprowadzony  w 1936 roku przez Alana M. Turinga. Na cześć swego autora został on nazwany '''(jednotaśmową) maszyną Turinga'''. Model ten jest podobny w swojej idei do rozważanych wcześniej
automatów liniowo ograniczonych, przy czym jednym z podstawowych założeń (i różnic względem automatów) jest nieskończony dostęp do pamięci. Maszyna Turinga może wydawać się  na początku  pojęciem bardzo abstrakcyjnym. Jednak, jak później zobaczymy, stanowi ona
jedną z podstawowych koncepcji współczesnej informatyki. Pozwala
na formalne zdefiniowanie pojęcia algorytmu oraz jego
złożoności obliczeniowej. Jako model obliczeń pozwala odpowiedzieć
także na bardzo ważne pytanie: czy każdy problem można rozwiązać
algorytmicznie?


<center><math>\displaystyle \mathcal{L}(MT)\subset \mathcal{L}_{0}\subset \mathcal{RP}</math></center>
Jednotaśmowa maszyna Turinga jest podobna w swej idei do automatu
liniowo ograniczonego, pominięte jednak zostaje, jak wspomnieliśmy, ograniczenie
dostępu do pamięci. Omawiana maszyna jest abstrakcyjnym tworem w
skład którego wchodzą:


W określeniu języka rekurencyjnie przeliczalnego oraz języka
* dwustronnie nieskończona taśma zbudowana z komórek zawierających symbole z pewnego zadanego alfabetu,
rekurencyjnego wystąpiło pojęcie efektywnego algorytmu,
* głowica, która może czytać i zapisywać symbole w komórkach taśmy oraz poruszać się w prawo lub lewo o jedną komórkę lub pozostawać na tej samej pozycji podczas jednego kroku czasowego,
efektywnej procedury. Pojęcie to, intuicyjnie dość jasne, nie
* działający sekwencyjnie mechanizm odpowiedzialny za sterowanie maszyną; mechanizm ten na podstawie symbolu odczytanego z komórki pod głowicą oraz stanu, w którym aktualnie znajduje się maszyna, dokonuje zapisu symbolu w tejże komórce, przechodzi do kolejnego stanu i przesuwa głowicę w prawo, lewo lub też nie zmienia pozycji głowicy.
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&nbsp;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'''
Podamy teraz formalną
definicję maszyny Turinga. Aby zachować analogię do poprzednich wykładów,
zdefiniujemy maszynę  w języku konfiguracji.


''Każda efektywna''  
{{definicja|3.1||}}
''procedura (algorytm) da się opisać przez maszynę Turinga. ''
'''(Jednotaśmowa deterministyczna) maszyna Turinga''' jest to
system  <math>\mathbf{MT}=(\Sigma _{T},S,f,s_{0},S_{F})</math> , w którym
<math>\Sigma _{T}</math>  jest skończonym alfabetem,  <math>S</math>
skończonym zbiorem stanów,  <math>S\cap \Sigma _{T}=\emptyset</math>  oraz
wyróżniony jest podzbiór  <math>\Sigma _{I}\subset \Sigma _{T}</math> . Zbiór
<math>\Sigma _{T}</math>  zwany jest alfabetem taśmy, a  <math>\Sigma _{I}
</math>  - alfabetem wejściowym. Wyróżnione są także: element  <math>\#\in \Sigma _{T}\setminus \Sigma _{I}</math>  zwany markerem końca, stan
początkowy  <math>s_{0}\in S</math>  oraz  <math>S_{F}\subset S</math>  - zbiór
stanów końcowych. Natomiast '''funkcja przejść''' jest funkcją
częściową  <math>f:\ : (S\times \Sigma _{T})\rightarrow (S\times \Sigma
_{T}\times \{-1,0,1\}</math> .


Konsekwencją przyjęcia Tezy Churcha jest inkluzja <math>\displaystyle \mathcal{RP}\subset \mathcal{L}(MT)  </math> . Biorąc pod uwagę udowodnione
'''Konfiguracją maszyny Turinga''' jest słowo <math>vsw\in (\Sigma
powyżej twierdzenia mamy
_{T}\cup S)^{*}</math> , w którym  <math>s\in S,\; v,w\in \Sigma _{T}^{*}
</math> . Pomiędzy dwiema konfiguracjami  <math>d_{1},d_{2}</math>  zachodzi
'''relacja bezpośredniego następstwa'''  <math>d_{1}\mapsto d_{2}</math>
wtedy i&nbsp;tylko wtedy, gdy spełniony jest jeden z niżej wypisanych
warunków, gdzie  <math>s_{1},s_{2}\in S</math> ,  <math>a,b,c\in \Sigma _{T}</math>
oraz  <math>v,w\in \Sigma _{T}^{*}</math>:
#  <math>d_{1}=vs_{1}aw</math> ,  <math>d_{2}=vs_{2}bw</math>  oraz  <math>f(s_{1},a)=(s_{2},b,0)</math>
# <math>d_{1}=vs_{1}aw</math> ,  <math>d_{2}=vbs_{2}w</math>  oraz  <math>f(s_{1},a)=(s_{2},b,1)</math> i  <math>w\neq 1</math>
#  <math>d_{1}=vs_{1}\#</math> ,  <math>d_{2}=vbs_{2}\#</math>  oraz  <math>f(s_{1},\#)=(s_{2},b,1)</math>
#  <math>d_{1}=vcs_{1}aw</math> ,  <math>d_{2}=vs_{2}cbw</math>  oraz  <math>f(s_{1},a)=(s_{2},b,-1)</math>
#  {{kotwica|pkt.5|}}<math>d_{1}=s_{1}\#w</math> ,  <math>d_{2}=s_{2}\#bw</math>  oraz  <math>f(s_{1},\#)=(s_{2},b,-1)</math>


<center><math>\displaystyle \mathcal{L}(MT)\subset \mathcal{L}_{0}\subset \mathcal{RP}</math></center>
Przechodnie domknięcie relacji  <math>\mapsto</math> oznaczać będziemy
symbolem  <math>\mapsto^{*}</math> i określać mianem '''obliczenia
wykonanego''' przez maszynę Turinga. Konfiguracja  <math>d_{1}\in (\Sigma
_{T}\cup S)^{*}</math>  jest '''końcowa''', jeśli stąd, że  <math>d_{1}\mapsto d_{2}</math> , wynika  <math>d_{2}=d_{1}</math>  Mówimy, że maszyna
Turinga '''zatrzymuje się''' w  <math>d_{1}</math> wtedy i tylko wtedy,
gdy  <math>d_{1}</math> jest konfiguracją końcową.


co ostatecznie prowadzi do równości  <math>\displaystyle \mathcal{L}_{0}=\mathcal{L}(MT) </math> .
Zauważmy, że wprowadzenie markera końca jest zabiegiem czysto formalnym. Pozwala on z jednej strony na oznaczenie słowa wejściowego, a z drugiej strony wskazuje na elementy taśmy, które były zmieniane (czy to przez wprowadzenie słowa wejściowego, czy też poprzez ruch głowicy).


==Rodziny <math>\displaystyle \mathcal{L}_{1}</math> i <math>\displaystyle \mathcal{L}_{0}</math> - zamkniętość na działania==
{{definicja|3.2||
Język rozpoznawany przez maszynę Turinga  <math>MT</math> jest to zbiór


Dla kompletności tej części wykładu przedstawimy własności
<center><math>L(\mathbf{MT})=\left\{ w\in \Sigma _{T}^{*}\ : :\ : \sharp s_{0}w\sharp \mapsto^{*}\sharp w_{1}s_{F}w_{2}\sharp ,\; dla\ : pewnych\ : w_{1},w_{2}\in \Sigma _{T}^{*},s_{F}\in S_{F}\right\}</math>.</center>
zamkniętości rodziny języków kontekstowych  <math>\displaystyle \mathcal{L}_{1}
</math>  i języków typu '''(0)'''  <math>\displaystyle \mathcal{L}_{0} </math>  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  <math>\displaystyle a  </math> , jest postaci  <math>\displaystyle v\longrightarrow a  </math> .


}}
}}


Elementarny dowód tej własności pozostawiamy jako zadanie
Język  <math>L\subset \Sigma _{I}^{*}</math>  jest rozpoznawany (akceptowany)
domowe.
przez maszynę Turinga, jeśli istnieje  <math>MT</math>  taka, że  <math>L(\mathcal{MT})=L</math>  Klasę języków rozpoznawanych przez maszynę
Turinga oznaczamy  <math>\mathcal{L}(MT)</math> .


{{twierdzenie|||
We wprowadzonym przez nas ujęciu formalnym, działanie maszyny
Rodziny  <math>\displaystyle \mathcal{L}_{0}  </math> <math>\displaystyle \mathcal{L}_{1}  </math> są zamknięte
Turinga należy wyobrażać sobie następująco. W pierwszym etapie na
ze względu na
taśmę zostają zapisane symbole słowa wejściowego (z alfabetu
#  sumę mnogościową,
<math>\Sigma_I</math>), a następnie komórki przyległe zostają oznaczone
#  iloczyn mnogościowy,
symbolami <math>\sharp</math>. Jednocześnie maszyna jest sprowadzana do stanu
#  katenację,
<math>s_0</math>, a głowica zostaje ustawiona nad pierwszym symbolem słowa
#  iterację `{} <math>\displaystyle *  </math> `{},
wejściowego. W tym momencie rozpoczyna się sekwencyjne przetwarzanie
# odbicie zwierciadlane.
zawartości taśmy przez maszynę. Jeśli maszyna "zatrzyma się", tzn.
w dwóch kolejnych chwilach czasowych nie wykona ruchu i jednocześnie
nie zmieni stanu i symbolu taśmy, sprawdzany jest jej aktualny stan.
Jeśli stan był akceptujący (czyli należał do zbioru <math>S_F</math>), to
maszyna zaakceptowała słowo, w przeciwnym razie - słowo odrzuciła
(gdyż nie może już osiągnąć stanu ze zbioru <math>S_F</math>). Należy zwrócić
uwagę na to, że dla niektórych konfiguracji początkowych maszyna może
nigdy się nie zatrzymać, a mimo to słowo zostanie przez nią
zaakceptowane. To samo tyczy się odrzucania słów, jednak w tej
sytuacji dowód, że słowo nie zostanie zaakceptowane, może być
problematyczny. Zaprezentowane podejście ma na celu uproszczenie i
tak już dość technicznych dowodów twierdzeń pojawiających się w tym
wykładzie. Związki pomiędzy akceptowaniem a zatrzymywaniem maszyny
Turinga zostaną skomentowane później (zob. Wniosek [[#wn.4.1|4.1]]).
W pierwszej kolejności przedstawiamy dwa przykłady:


}}
{{przyklad|3.1||
Skonstruujemy maszynę Turinga <math>MT_1</math>, która rozpoznaje język postaci
<math>L=\left\{0^{2^n}\; : \; n\geqslant 0\right\}</math>. Zamierzone działanie maszyny
<math>MT_1</math> można opisać następująco:


{{dowod|||
# Przejdź od lewego markera do prawego, zaznaczając symbolem <math>\diamondsuit</math> co drugie <math>0</math>.
{}
# Jeśli było tylko jedno <math>0</math>, to '''akceptuj'''.
# Jeśli w kroku 1. obszar pomiędzy markerami zawierał nieparzystą ilość <math>0</math>, to '''odrzuć'''.
# Powróć do lewego markera.
# Powtórz działanie od 1.


[[##Lsuma|Uzupelnic Lsuma|]]. Niech dla  <math>\displaystyle i=1,2  \displaystyle G_{i}=(V_{N}^{i},V_{T},v_{0}^{i},P_{i})  </math>  będą gramatykami
Zwróćmy uwagę, że o ile jasne jest, w jaki sposób maszyna ma
typu  <math>\displaystyle (1) </math>  (odpowiednio typu  <math>\displaystyle (0)  </math> ), takimi, że  <math>\displaystyle V_{N}^{1}\cap V_{N}^{2}=\emptyset  </math> . I niech  <math>\displaystyle L_{i}=L(G_{i})  </math> .
akceptować słowa wejściowe, odrzucanie tych słów nie zostało
Określamy gramatykę  <math>\displaystyle G  </math>  typu  <math>\displaystyle (1) </math>  (typu  <math>\displaystyle (0)  </math> )
zdefiniowane. Aby ominąć ten problem, wprowadzimy jeden dodatkowy
generującą język  <math>\displaystyle L_{1}\cup L_{2}  </math> .
stan (nie należący do stanów końcowych), po osiągnięciu którego
maszyna się zatrzymuje (tzn. nie wykonuje ruchów i przepisuje na
taśmie wciąż ten sam symbol).


Jeśli  <math>\displaystyle 1\notin L_{1}\cup L_{2} </math> , to przyjmujemy
Określamy kolejno elementy składowe maszyny <math>MT_1</math>:
<center><math>
\Sigma_I=\left\{0\right\}\quad,\quad
\Sigma_T=\left\{0,\diamondsuit,\clubsuit,\sharp\right\}</math>,</center>


<center><math>\displaystyle G=(V_{N}^{1}\cup V_{N}^{2}\cup \left\{ v_{0}\right\}
<center><math>
,V_{T},v_{0},P_{1}\cup P_{2}\cup \left\{ v_{0}\rightarrow
S=\left\{s_0,s_1,s_2,s_3,s_4,s_A,s_R\right\}\quad, \quad S_F=\left\{s_A\right\}</math></center>
v_{0}^{1},\, v_{0}\rightarrow v_{0}^{2}\right\} ).</math></center>


Zauważmy, że wówczas w żadnej z gramatyk nie ma prawa wymazującego.
Pozostaje jeszcze zdefiniować funkcję przejść:
Jeśli natomiast  <math>\displaystyle 1\in L_{1}\cup L_{2} </math> , to konstruujemy
}}
gramatykę  <math>\displaystyle G  </math>  dla języków  <math>\displaystyle L_{1}\setminus \left\{ 1\right\}
</math>  i  <math>\displaystyle L_{2}\setminus \left\{ 1\right\}  </math> , jak powyżej, a
następnie dodajemy nowy symbol początkowy  <math>\displaystyle \overline{v}_{0}  </math>  i
prawa  <math>\displaystyle \overline{v}_{0}\rightarrow v_{0},\,
\overline{v}_{0}\rightarrow 1  </math> .


[[##Liloczyn|Uzupelnic Liloczyn|]]. Przecięcie udowodnimy tylko dla języków typu <math>\displaystyle (0)
<center><math>\begin{array} {c|c|c|c|c|} (s_0,\sharp)\mapsto (s_R,\sharp,0) & (s_1,\diamondsuit)\mapsto(s1,\diamondsuit,1)\\
</math> . Dowód dla języków kontekstowych został przeprowadzony
\hline (s_0,0)\mapsto(s_1,\clubsuit,1) & (s_1,0) \mapsto(s_2,\diamondsuit,1)\\
wcześniej.
\hline & (s_1,\sharp)\mapsto(s_A,\sharp,0)\\
\hline (s_2,\diamondsuit)\mapsto(s_2,\diamondsuit,1) & (s_3,0)\mapsto(s_2,\diamondsuit,1)\\
\hline (s_2,\sharp)\mapsto(s_4,\sharp,-1) & (s_3,\diamondsuit)\mapsto(s_3,\diamondsuit,1)\\
\hline (s_2,0)\mapsto(s_3,0,1) & (s_3,\sharp)\mapsto(s_R,\sharp,0)\\
\hline (s_4,0)\mapsto(s_4,0,-1) & \\
\hline (s_4,\diamondsuit)\mapsto(s_4,\diamondsuit,-1) & \\
\hline (s_4,\clubsuit)\mapsto(s_2,\clubsuit,1) & \\
\hline (s_A,\sharp)\mapsto(s_A,\sharp,0) & (s_R,\sharp)\mapsto(s_R,\sharp,0)\\
\hline \end{array}</math></center>


Niech dla  <math>\displaystyle i=1,2 \displaystyle G_{i}=(V_{N}^{i},V_{T},v_{0}^{i},P_{i})  </math>
W miejsce tabeli wygodniej jest zobrazować funkcję przejść maszyny
będą gramatykami typu  <math>\displaystyle (0)  </math> , takimi, że <math>\displaystyle V_{N}^{1}\cap
Turinga na etykietowanym grafie skierowanym. Zostało to zrobione na
V_{N}^{2}=\emptyset  </math> . Niech  <math>\displaystyle L_{i}=L(G_{i})  </math> . Określamy
poniższym rysunku:
gramatykę  <math>\displaystyle G  </math>  typu  <math>\displaystyle (0)  </math>  generującą język  <math>\displaystyle L_{1}\cap L_{2}
[[File:file=ja-lekcja12-w-rys1.mp4|350x350px|thumb|center|Rysunek 2]]
</math> przyjmując
Łatwo zauważyć, że wprowadzona funkcja przejścia określa maszynę
spełniającą postawione przez nas warunki. Symbol <math>\clubsuit</math> został wprowadzony dla odróżnienia wystąpienia pojedynczego zera od sytuacji, gdy liczba zer jest nieparzysta i większa od <math>1</math>.


<center><math>\displaystyle G=(V_{N}^{1}\cup V_{N}^{2}\cup V_{N},V_{T},v_{0},P_{1}\cup P_{2}\cup
Aby lepiej zrozumieć działanie maszyny <math>MT_1</math>, zasymulujemy jej działanie na dwóch słowach wejściowych, przy czym pierwsze z nich będzie należało do języka <math>L</math>, a drugie nie:
P),</math></center>
<center><math>
\begin{array} {c c c c c c c c}
&\sharp s_0 0000 \sharp & \mapsto & \sharp \clubsuit s_1 000 \sharp
&\mapsto & \sharp \clubsuit \diamondsuit s_2 00 \sharp &\mapsto &
\sharp \clubsuit \diamondsuit 0 s_3 0 \sharp\\
\mapsto & \sharp \clubsuit \diamondsuit 0 \diamondsuit s_2
\sharp&\mapsto& \sharp \clubsuit \diamondsuit 0 s_4 \diamondsuit
\sharp &\mapsto& \sharp \clubsuit \diamondsuit s_4 0 \diamondsuit
\sharp &\mapsto & \sharp \clubsuit s_4 \diamondsuit 0 \diamondsuit
\sharp
\\
\mapsto & \sharp s_4 \clubsuit \diamondsuit 0 \diamondsuit \sharp
&\mapsto & \sharp \clubsuit s_1 \diamondsuit 0 \diamondsuit \sharp
&\mapsto & \sharp \clubsuit \diamondsuit s_1 0 \diamondsuit \sharp
&\mapsto & \sharp \clubsuit \diamondsuit \diamondsuit s_2
\diamondsuit
\sharp\\
\mapsto & \sharp \clubsuit \diamondsuit \diamondsuit \diamondsuit
s_2 \sharp & \mapsto & \sharp \clubsuit \diamondsuit \diamondsuit
s_4 \diamondsuit \sharp & \mapsto & \sharp \clubsuit \diamondsuit
s_4 \diamondsuit \diamondsuit \sharp& \mapsto & \sharp \clubsuit s_4
\diamondsuit \diamondsuit \diamondsuit \sharp\\
\mapsto & \sharp s_4 \clubsuit \diamondsuit \diamondsuit
\diamondsuit \sharp& \mapsto & \sharp \clubsuit s_1 \diamondsuit
\diamondsuit \diamondsuit \sharp & \mapsto & \sharp \clubsuit
\diamondsuit s_1 \diamondsuit \diamondsuit \sharp& \mapsto & \sharp
\clubsuit \diamondsuit \diamondsuit s_1 \diamondsuit \sharp\\
\mapsto & \sharp \clubsuit \diamondsuit \diamondsuit \diamondsuit
s_1 \sharp &\mapsto & \sharp \clubsuit \diamondsuit \diamondsuit
\diamondsuit s_A \sharp& \circlearrowleft
\end{array}  
</math></center>


gdzie:  <math>\displaystyle V_{N}=\left\{ v_{a}\, :\, a\in V_{T}\right\} \cup \left\{ v_{0},\overline{v}_{1},\overline{v}_{2}\right\}  </math> ,
Wykazaliśmy więc, że <math>\sharp s_0 0000 \sharp
a do zbioru  <math>\displaystyle P  </math> należą prawa <br>
\mapsto^* \sharp \clubsuit \diamondsuit \diamondsuit \diamondsuit
(1)  <math>\displaystyle v_{0}\rightarrow \overline{v}_{1}v_{0}^{1}\overline{v}_{2}v_{0}^{2}\overline{v}_{1}  </math> <br>
s_A \sharp</math>. Zatem <math>0^4 \in L(MT_1)</math>.
(2)  <math>\displaystyle \overline{v}_{2}a\rightarrow v_{a}\overline{v}_{2}  </math>  dla  <math>\displaystyle \forall a\in V_{T}  </math> <br>
(3)  <math>\displaystyle bv_{a}\rightarrow v_{a}b  </math>  dla  <math>\displaystyle \forall a,b\in V_{T}  </math> <br>
(4)  <math>\displaystyle \overline{v}_{1}v_{a}a\rightarrow a\overline{v}_{1}  </math>  dla  <math>\displaystyle \forall a\in V_{T}  </math> <br>
(5)  <math>\displaystyle \overline{v}_{1}\overline{v}_{2}\overline{v}_{1}\rightarrow 1  </math> <br>
Przy pomocy prawa (1) i wszystkich praw ze zbioru  <math>\displaystyle P_{1}\cup P_{2}
</math> można wygenerować zbiór słów


<center><math>\displaystyle \left\{ \overline{v}_{1}w_{1}\overline{v}_{2}w_{2}\overline{v}_{1}\,
[[File:ja-lekcja12-w-anim1a.mp4|250x250px|thumb|center|Animacja 1]]
:\, w_{1}\in L_{1},\, w_{2}\in L_{2}\right\} .</math></center>


Z dowolnego słowa należącego do tego zbioru, korzystając
Dla porównania:
z praw (2)-(4) można wyprowadzić słowo  <math>\displaystyle w_{1}\overline{v}_{1}\overline{v}_{2}\overline{v}_{1} </math> wtedy i
<center><math>
tylko wtedy, gdy  <math>\displaystyle w_{1}=w_{2}  </math> . Korzystając z prawa (5)
\begin{array} {c c c c c c c c}
dostajemy słowo  <math>\displaystyle w_{1} </math> . A więc  <math>\displaystyle L(\overline{G})=L_{1}\cap
&\sharp s_0 000 \sharp & \mapsto & \sharp \clubsuit s_1 00 \sharp
L_{2}  </math> .
&\mapsto & \sharp \clubsuit \diamondsuit s_2 0 \sharp &\mapsto &
\sharp \clubsuit \diamondsuit 0 s_3 \sharp\\
\mapsto &\sharp \clubsuit \diamondsuit 0 s_R \sharp &
\circlearrowleft
\end{array}  
</math></center>


[[##Lkatenacja|Uzupelnic Lkatenacja|]]. Niech dla  <math>\displaystyle i=1,2  \displaystyle G_{i}=(V_{N}^{i},V_{T},v_{0}^{i},P_{i})  </math>  będą tak jak poprzednio
Czyli zgodnie z naszym założeniem <math>0^3\not \in L(MT_1)</math>.
gramatykami typu  <math>\displaystyle (1)  </math>  ( <math>\displaystyle (0)  </math> ) takimi, że  <math>\displaystyle V_{N}^{1}\cap V_{N}^{2}=\emptyset  </math>  oraz spełniającymi warunki
[[File:ja-lekcja12-w-anim1b.mp4|250x250px|thumb|center|Animacja 2]]
powyższego twierdzenia. Niech  <math>\displaystyle L_{i}=L(G_{i}) </math> . Określamy
gramatykę  <math>\displaystyle G  </math>  odpowiednio typu  <math>\displaystyle (1)  </math>  ( <math>\displaystyle (0)  </math> ) generującą
język  <math>\displaystyle L_{1}L_{2}  </math> .


Jeśli  <math>\displaystyle 1\notin L_{1}\cup L_{2} </math> , to przyjmujemy
{{przyklad|3.2||
Przedstawimy maszynę Turinga <math>MT_2</math> akceptującą język
<center><math>
L=\left\{w \overleftarrow{w} \ : : \ : w\in \left\{0,1\right\}^*\right\}</math>,</center>


<center><math>\displaystyle G=(V_{N}^{1}\cup V_{N}^{2}\cup \left\{ v_{0}\right\}
gdzie <math>\overleftarrow{w}</math> oznacza lustrzane odbicie słowa <math>w</math>.
,V_{T},v_{0},P_{1}\cup P_{2}\cup \left\{ v_{0}\rightarrow
Elementy języka <math>L</math> nazywamy palindromami. Definiujemy alfabet maszyny:
v_{0}^{1}v_{0}^{2}\right\} ).</math></center>
<center><math>
\Sigma_I=\left\{0,1\right\}\quad,\quad \Sigma_T=\left\{0,1,\sharp\right\}</math>,</center>


Jeśli  <math>\displaystyle 1\in L_{1}\cup L_{2}  </math> , to oznaczamy  <math>\displaystyle L_{1}'=L_{1}\setminus \left\{ 1\right\} ,\; \; L_{2}'=L_{2}\setminus
oraz zbiory stanów
\left\{ 1\right\}   </math> . Wówczas
<center><math>
S=\left\{s_0,r_0,r_0',q_0,r_1,r_1',q_1,l,s_A,s_R\right\}\quad, \quad
S_F=\left\{s_A\right\}</math></center>


<center><math>\displaystyle L_{1}L_{2}=\left\{ \begin{array} {lll}
}}
L_{1}'L_{2}'\cup L_{1}' & gdy & 1\in L_{2},\: 1\notin L_{1}\\
L_{1}'L_{2}'\cup L_{2}' & gdy & 1\in L_{1},\: 1\notin L_{2}\\
L_{1}'L_{2}'\cup L_{1}'\cup L_{2}'\cup \left\{ 1\right\}  & gdy &
1\in L_{1},\: 1\in L_{2}
\end{array} \right. </math></center>
 
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  <math>\displaystyle L_{1}  </math>  i  <math>\displaystyle L_{2}  </math> .


[[##Literacja|Uzupelnic Literacja|]]. Niech  <math>\displaystyle G=(V_{N},V_{T},v_{0},P)  </math> będzie
Funkcję przejść maszyny <math>MT_2</math> określa tabela:
gramatyką typu  <math>\displaystyle (1)  </math>  (typu  <math>\displaystyle (0)  </math> ) taką, że symbole
terminalne nie występują po lewej stronie żadnej produkcji z  <math>\displaystyle P
</math> . Załóżmy też, że  <math>\displaystyle 1\notin L=L(G)  </math> . Gramatyka


<center><math>\displaystyle \overline{G}=(V_{N}\cup \left\{
<center><math>\begin{array} {c|c|c|c|c|} (s_0,\sharp)\mapsto (s_A,\sharp,0) & (s_0,0)\mapsto (r_0,\sharp,1) & (s_0,1)\mapsto (r_1,\sharp,1)\\
\overline{v}_{0},\overline{v}_{1}\right\}
\hline (r_0,\sharp)\mapsto (s_R,\sharp,0) & (r_0,0)\mapsto (r_0',0,1) & (r_0,1)\mapsto (r_0',1,1)\\
,V_{T},\overline{v}_{0},\overline{P}),</math></center>
\hline (r_0',\sharp)\mapsto (q_0,\sharp,-1) & (r_0',0)\mapsto (r_0',0,1) & (r_0',1)\mapsto (r_0',1,1)\\
\hline  & (q_0,0)\mapsto (l,\sharp,-1) & (q_0,1)\mapsto (s_R,\sharp,-1)\\
\hline (r_1,\sharp)\mapsto (s_R,\sharp,0) & (r_1,0)\mapsto (r_1',0,1) & (r_1,1)\mapsto (r_1',1,1)\\
\hline (r_1',\sharp)\mapsto (q_1,\sharp,-1) & (r_1',0)\mapsto (r_1',0,1) & (r_1',1)\mapsto (r_1',1,1)\\
\hline  & (q_1,0)\mapsto (s_R,\sharp,0) & (q_1,1)\mapsto (l,\sharp,-1)\\
\hline (l,\sharp)\mapsto (s_0,\sharp,1) & (l,0)\mapsto (l,0,-1) & (l,1)\mapsto (l,1,-1)\\
\hline (s_R,\sharp)\mapsto (s_R,\sharp,0) &  & \\
\hline (s_A,\sharp)\mapsto (s_A,\sharp,0) &  & \\
\hline \end{array}</math></center>


gdzie
co dla przejrzystości zobrazowano na Rysunku 3.
[[File:file=ja-lekcja12-w-rys3.mp4|500x500px|thumb|center|Rysunek 3]]
==Inne możliwe definicje maszyn Turinga==


<center><math>\displaystyle \overline{P}=P\cup \begin{array} [t]{l}
Istnieje kilka możliwych definicji maszyny Turinga, które jak się
\left\{ \overline{v}_{0}\rightarrow 1,\: \overline{v}_{0}\rightarrow v_{0},\: \overline{v}_{0}\rightarrow \overline{v}_{1}v_{0}\right\} \cup \\
okazuje są równoważne pod względem możliwości obliczeniowych (tzn.
\left\{ \overline{v}_{1}a\rightarrow \overline{v}_{1}v_{0}a\, :\, a\in V_{T}\right\} \cup \\
rozpoznają dokładnie tę samą klasę języków). Naszkicujemy kilka
\left\{ \overline{v}_{1}a\rightarrow v_{0}a\, :\, a\in V_{T}\right\}
wybranych podejść.
\end{array} </math></center>


generuje język  <math>\displaystyle L^{*}  </math> . Jeśli  <math>\displaystyle 1\in L  </math> , to usuwamy prawo
===Maszyna wielotaśmowa===
wymazujące  <math>\displaystyle v_{0}\rightarrow 1  </math>  i dla języka  <math>\displaystyle L\setminus
\left\{ 1\right\}  </math>  konstruujemy gramatykę  <math>\displaystyle \overline{G}  </math> . Z
faktu, że  <math>\displaystyle (L\cup \left\{ 1\right\} )^{*}=L^{*}  </math> , wynika, że
również  <math>\displaystyle L(\overline{G})=L^{*}  </math> .


[[##Lodbicie|Uzupelnic Lodbicie|]]. Jeśli  <math>\displaystyle G=(V_{N},V_{T},v_{0},P)  </math>  jest gramatyką
W tym modelu zakłada się, że głowica ma do dyspozycji nie tylko jedną, ale wiele taśm, na których może zapisywać i odczytywać symbole. Zakłada się przy tym, że słowo wejściowe znajduje się na pierwszej taśmie. Aby symulować maszynę wielotaśmową na jednej taśmie, należy zamienić alfabet taśmy na alfabet <math>(\Sigma_T)^k</math>, gdzie <math>k</math> oznacza ilość taśm. W tym momencie zapis na taśmie <math>i</math>-tej jest realizowany przez zmianę odpowiedniej
typu  <math>\displaystyle (1) </math> (typu  <math>\displaystyle (0)  </math> ) taką, że  <math>\displaystyle L(G)=L  </math> , to gramatyka
współrzędnej litery z nowego alfabetu (zob. Rys. 4.a). Czyli w
<math>\displaystyle \overleftarrow{G}=(V_{N},V_{T},v_{0},\overleftarrow{P}) </math> , gdzie
opisywanym przypadku funkcja przejść będzie operowała na
<math>\displaystyle \overleftarrow{P}=\left\{ \overleftarrow{x}\rightarrow
następujących zbiorach:
\overleftarrow{y}\, :\, x\rightarrow y\in P\right\}   </math> generuje
<center><math>
język  <math>\displaystyle \overleftarrow{L}  </math> . }}
f:\ : (S\times \Sigma^k_{T} )\rightarrow (S \times \Sigma^k_{T}
\times \{-1,0,1\} )</math></center>


Zauważmy na koniec, że rodzina  <math>\displaystyle \mathcal{L}_{0}  </math>  nie jest
===Taśma jednostronnie nieskończona===
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  <math>\displaystyle \mathcal{L}_{0}  </math>  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  <math>\displaystyle \mathcal{L}_{1}  </math>  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} {
Model ten zakłada, że taśma jest ograniczona z jednej ze stron. Różnica w porównaniu z rozważaną przez nas maszyną Turinga polega na tym, że nie jest dozwolone przesuwanie lewego markera (tzn. funkcja przejść nie może zawierać przejść typu [[#pkt.5|punkt 5]] definicji 3.1. W tej sytuacji, aby symulować maszynę z taśmą obustronnie nieskończoną na maszynie z taśmą ograniczoną z jednej strony, wystarczy zasymulować taśmę obustronnie nieskończoną poprzez rozszerzenie alfabetu (zob. Rys. 4.b).
[[File:file=ja-lekcja12-w-rys4.mp4|350x350px|thumb|center|Rysunek 4]]
===Wielogłowicowa maszyna wielotaśmowa===


{| border=1
W tym
|+ <span style="font-variant:small-caps">Uzupelnij tytul</span>
podejściu zakłada się dodatkowo, że każda z taśm posiada swoją
|-  
głowicę. Inaczej mówiąc, mamy do czynienia z iloczynem kartezjańskim
|  ||  3 ||
<math>k</math> niezależnych maszyn jednotaśmowych. Akceptowany język jest w
2 ||  1 ||
tym momencie <math>k</math>-wymiarowy. Oczywiście, słowo postaci
0
<math>(w,1,\dots,1)\in (\Sigma_T^*)^k</math> można w naturalny sposób
|-
utożsamiać z <math>w\in \Sigma_T</math>. Z drugiej strony maszynę
|    <math>\displaystyle \cup  </math> ||  T ||  T ||  T ||
wielogłowicową można symulować na jednotaśmowej w następujący
T
sposób:
|-
# Jako zbiór stanów bierzemy <math>S^k</math>.
<math>\displaystyle \cdot  </math> ||  T ||  T ||  T ||
# Słowa startowe <math>w_1,\dots, w_k</math> zapisujemy jako konfigurację początkową maszyny jednotaśmowej w postaci: <center><math>\sharp (s_0)^k \$ \dot{1} w_1 \$ \dot{2} w_2 \$ \dots \$ \dot{k} w_k \$</math></center> Symbole <math>\$</math> mają za zadanie wirtualnego rozdzielenia taśm. Symbole <math>\dot{i}</math> wskazują na położenie <math>i</math>-tej głowicy na taśmie.
T
# W trakcie symulacji przechodzimy pomiędzy markerami i wykonujemy przejścia dla kolejnych głowic.
|-
<math>\displaystyle \star  </math> ||  T ||  T ||  T ||
T
|-
<math>\displaystyle \setminus  </math> ||  T ||  N ||  T ||
N
|-
<math>\displaystyle \cap  </math> ||  T ||  N ||  T ||
T
|-
|


|}
Widać już, że formalne podanie funkcji przejść jest w omawianym
przypadku bardzo techniczne. Musimy zapewnić możliwość poszerzania
obszaru zapisu na poszczególnych taśmach, co jest realizowane
poprzez dopisanie nowego symbolu i przepisywanie przyległych symboli,
aż do markera włącznie. Następnie należy wrócić do poprzedniego
miejsca zapisu i symulować działanie kolejnych głowic. Wymaga to
wprowadzenia sporej liczby stanów pomocniczych. Nie będziemy
zagłębiać się w te techniczne szczegóły. Mamy nadzieję że sama idea
konstrukcji jest w tym momencie zrozumiała.


}
Najbardziej ogólna definicja maszyny tego typu dopuszcza dodatkowo,
{0.3cm}
aby głowice mogły przeglądać pozostałe taśmy, dzięki czemu zapewnia
się komunikację między głowicami. Symulacja takiej maszyny na jednej
taśmie jest podobna w swej idei do metody przedstawionej wcześniej.


Na koniec podamy
===Maszyna niedeterministyczna===
twierdzenie o  wzajemnych relacjach pomiędzy
rodzinami języków z hierarchii Chomsky'ego. Dowód tego twierdzenia
wynika w&nbsp;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|||
Ten typ maszyn ma ogromne
Rodziny języków  hierarchii Chomsky'ego spełniają następujące relacje
znaczenie dla teorii złożoności. Z tego powodu przyglądniemy mu się
dokładniej. Różnica pomiędzy niedeterministyczną maszyną Turinga a
maszyną deterministyczną polega na tym, że funkcja przejść może
pozwalać na kilka różnych przejść na skutek tego samego symbolu
czytanego (gdyż funkcja przejść w tym przypadku będzie
multi-funkcją).


<center><math>\displaystyle \mathcal{L}_{0}\subseteq \! \! \! \! \! \! _{/}\, \mathcal{L}_{1}
{{definicja|4.1||
\subseteq \! \! \! \! \! \! _{/}\, \mathcal{L}_{2}
'''(Jednotaśmowa) niedeterministyczna maszyna Turinga''' jest to
\subseteq \! \! \! \! \! \! _{/}\, \mathcal{L}_{3}
system  <math>\mathbf{NMT}=(\Sigma _{T},S,f,s_{0},S_{F})</math>,  w którym
</math></center>
<math>\Sigma _{T}</math>  jest skończonym alfabetem,  <math>S</math>
skończonym zbiorem stanów,  <math>S\cap \Sigma _{T}=\emptyset</math>  oraz
wyróżniony jest podzbiór  <math>\Sigma _{I}\subset \Sigma _{T}</math> .
Podobnie jak poprzednio zbiór  <math>\Sigma _{T}</math>  zwany jest
alfabetem taśmy, a  <math>\Sigma _{I}</math>  - alfabetem
wejściowym. Wyróżnione są także: element  <math>\#\in \Sigma
_{T}\setminus \Sigma _{I}</math>  zwany markerem końca, stan początkowy
<math>s_{0}\in S</math>  oraz  <math>S_{F}\subset S</math>  - zbiór stanów
końcowych. Natomiast '''funkcja przejść''' jest funkcją częściową
<math>f:\ : (S\times \Sigma _{T})\rightarrow \mathcal{P}(S\times \Sigma
_{T}\times \{-1,0,1\})</math>  gdzie <math>\mathcal{P}(A)</math> oznacza zbiór
podzbiorów zbioru <math>A</math>.


.
'''Konfiguracją maszyny Turinga''' jest słowo  <math>vsw\in (\Sigma
_{T}\cup S)^{*}</math> , w którym  <math>s\in S,\; v,w\in \Sigma _{T}^{*}
</math> , przy czym pomiędzy dwiema konfiguracjami  <math>d_{1},d_{2}</math>
zachodzi '''relacja bezpośredniego następstwa'''  <math>d_{1}\mapsto
d_{2}</math>  wtedy i&nbsp;tylko wtedy, gdy spełniony jest jeden z niżej
wypisanych warunków, gdzie  <math>s_{1},s_{2}\in S</math> ,  <math>a,b,c\in
\Sigma _{T}</math>  oraz  <math>v,w\in \Sigma _{T}^{*}</math>:
#  <math>d_{1}=vs_{1}aw</math> ,  <math>d_{2}=vs_{2}bw</math>  oraz  <math>f(s_{1},a)\ni(s_{2},b,0)</math>
#  <math>d_{1}=vs_{1}aw</math> ,  <math>d_{2}=vbs_{2}w</math>  oraz  <math>f(s_{1},a)\ni(s_{2},b,1)</math> i  <math>w\neq 1</math>
#  <math>d_{1}=vs_{1}\#</math> ,  <math>d_{2}=vbs_{2}\#</math>  oraz  <math>f(s_{1},\#)\ni(s_{2},b,1)</math>
#  <math>d_{1}=vcs_{1}aw</math> ,  <math>d_{2}=vs_{2}cbw</math>  oraz  <math>f(s_{1},a)\ni(s_{2},b,-1)</math>
#  <math>d_{1}=s_{1}\#w</math> ,  <math>d_{2}=s_{2}\#bw</math>  oraz  <math>f(s_{1},\#)\ni(s_{2},b,-1)</math>


Tak jak poprzednio, przechodnie domknięcie relacji  <math>\mapsto</math>
oznaczać będziemy symbolem  <math>\mapsto^{*}</math> i określać mianem
'''obliczenia wykonanego''' przez maszynę Turinga. Konfiguracja
<math>d_{1}\in (\Sigma _{T}\cup S)^{*}</math>  jest '''końcowa''', jeśli
stąd, że  <math>d_{1}\mapsto d_{2}</math> , wynika  <math>d_{2}=d_{1}</math>
}}
}}


==Problemy rozstrzygalne==
Pomimo tego, że postawiona definicja maszyny niedeterministycznej
jest bardzo podobna do maszyny deterministycznej, występuje tutaj
jedna bardzo istotna różnica. Słowo wejściowe może prowadzić do
wielu różnych obliczeń wykonanych, w szczególności jedno z obliczeń
może doprowadzać do zatrzymania maszyny, a inne nie.


W poprzednim wykładzie uzasadniliśmy, że dla każdej
Przykład maszyny niedeterministycznej podamy później, przy okazji
deterministycznej maszyny Turinga jesteśmy w stanie wskazać taką
omawiania klas złożoności obliczeniowej.
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
{{definicja|4.2||
wykładzie i jest ono znane.
Język rozpoznawany przez niedeterministyczną maszynę Turinga  <math>NMT
Przypomnijmy więc tylko,
</math>  jest to zbiór
ż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
<center><math>L(\mathbf{NMT})=\left\{ w\in \Sigma _{T}^{*}\ : :\ : \sharp
przyzwyczajeni jesteśmy, że algorytmy (programy) rozwiązują pewne,
s_{0}w\sharp \mapsto^{*}\sharp w_{1}s_{F}w_{2}\sharp ,\; dla\ :
niekiedy bardzo skomplikowane problemy (określone przy pomocy list,
pewnych\ : w_{1},w_{2}\in \Sigma _{T}^{*},s_{F}\in S_{F}\right\}</math>.</center>
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
Język  <math>L\subset \Sigma _{I}^{*}</math>  jest rozpoznawany (akceptowany)
w&nbsp;klasie jezyków regularnych. Problem ten jest rozstrzygalny, bo w
przez niedeterministyczną maszynę Turinga, jeśli istnieje  <math>\mathcal{NMT}</math>  taka, że <math>L(\mathcal{NMT})=L</math>
oparciu o lemat o&nbsp;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
Podkreślamy fakt, że aby maszyna niedeterministyczna zaakceptowała
nie oznacza, podkreślmy, niemożliwości rozwiazania konkretnego zadania z tej
słowo wejściowe, wystarczy, aby wśród wszystkich możliwych obliczeń
klasy. Nierostrzygalność oznacza niemożliwość rozwiązania za pomocą
znalazło się co najmniej jedno akceptujące.
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
Wprost z definicji wynika że każda maszyna deterministyczna jest
rozstrzygalności  problemy z dziedziny
także maszyną niedeterministyczną, co oznacza, że języki rozpoznawane
języków formalnych w ramach hierarchii Chomsky'ego.
przez maszyny deterministyczne są zawarte w klasie języków
Litera R oznacza rozstrzygalność problemu, N
rozpoznawanych przez maszyny niedeterministyczne. Przeciwna inkluzja
nierostrzygalność, a znak - pojawiający się przy problemie
jest gwarantowana przez następujące twierdzenie.
jednoznaczności oznacza, że problemu tego nie formułuje się dla
gramatyk kontekstowych i typu '''(0)'''.


{0.3cm} {  
{{kotwica|prz.1b|}}{{twierdzenie|4.1||


{| border=1
Dla każdej niedeterministycznej maszyny Turinga <math>\mathcal{NMT}</math>
|+ <span style="font-variant:small-caps">Uzupelnij tytul</span>
istnieje maszyna deterministyczna <math>\mathcal{MT}</math> taka, że
|-
<center><math>
|
L(\mathcal{NMT})=L(\mathcal{MT})</math></center>
własność ||  '''(3)''' ||  '''(2)''' ||  '''(1)''' ||
'''(0)'''
|-
|  należenie  <math>\displaystyle w\in L  </math> ||  R ||  R ||  R ||
N
|-
|  inkluzja  <math>\displaystyle L_{1}\subset L_{2} </math> ||  R ||  N ||  N ||
N
|-
|  równoważność ||  R ||  N ||  N ||
N
|-
|  pustość  <math>\displaystyle L=\emptyset  </math> ||  R ||  R ||  N ||
N
|-
|  nieskończoność  <math>\displaystyle card\, L=\aleph _{0} </math> ||  R ||  R ||  N ||
N
|-
|  jednoznaczność gramatyki ||  R ||  N ||  - ||
-
|-
|


|}
}}


}
{{dowod|||
{0.3cm}
''(Szkic)''. Aby sprawdzić, czy maszyna
niedeterministyczna akceptuje dane słowo wejściowe, należy przejrzeć
wszystkie możliwe obliczenia wykonywane, tworzące drzewo obliczeń.
Poziomy drzewa tworzone są przez kroki czasowe, wierzchołki stanowią
obliczenia wykonane w danym kroku czasowym, a gałęzie zadane są przez
relację bezpośredniego następstwa. W celu sprawdzenia, czy maszyna
akceptuje dane słowo, przeglądamy drzewo obliczeń poziomami (por.
algorytm BFS) i akceptujemy, gdy przeglądana konfiguracja była
akceptująca. Tą techniką przeglądamy wszystkie możliwe obliczenia
wykonane w <math>1,2,3,\dots</math> krokach.


Najczęściej używaną metodą dowodzenia nierozstrzygalności problemu
Do dokonania symulacji najwygodniej jest użyć maszyny <math>3</math>-głowicowej
<math>\displaystyle P  </math> jest redukcja tego problemu do innego, powiedzmy  <math>\displaystyle P'
z możliwością czytania na wszystkich taśmach. Wprowadzamy te taśmy
</math> , dla którego nierozstrzygalność została ustalona wcześniej.
kolejno do przechowywania słowa wejściowego, symulacji działania
Redukcja taka prowadzi do sformułowania implikacji:
maszyny niedeterministycznej i adresowania wyboru przejść ze zbioru
przejść danego przez funkcję przejść. Symulacja przebiega w
czterech krokach:
# Rozpocznij ze słowem wejściowym <math>w</math> na taśmie <math>1</math> oraz pustymi taśmami <math>2</math> i <math>3</math>.
# Przekopiuj taśmę <math>1</math> na taśmę <math>2</math>.
# Użyj taśmy <math>2</math> do symulacji <math>w</math>, wykorzystując taśmę <math>3</math> do wyboru przejść funkcji przejść <math>f</math>. Jeśli po wykonaniu skończonego zbioru instrukcji według adresowania z taśmy <math>3</math> otrzymano konfigurację akceptującą, to akceptuj. W przeciwnym razie, przejdź do następnego punktu.
# Zamień ciąg adresowy na następny w kolejności leksykograficznej. Jeśli zapisany ciąg jest ostatnim możliwym ciągiem adresowym o długości <math>N</math>, zapisz na taśmie <math>3</math> pierwszy w kolejności leksykograficznej ciąg adresowy o długości <math>N+1</math> oraz przejdź do <math>2</math>.


jeśli  <math>\displaystyle P  </math>  byłby
}}
rozstrzygalny, to i  <math>\displaystyle P'  </math>  byłby rozstrzygalny.


A ponieważ to
{{kotwica|wn.4.1|}}{{wniosek|4.1||
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
Dla każdej maszyny Turinga <math>\mathcal{MT}</math> istnieje maszyna Turinga
problemów uniwersalnych (takich jak problem Posta rozważany dalej)
<math>\mathcal{MT}'</math> taka, że
wiążą się z konstrukcją odpowiednich maszyn Turinga, kodowaniem
<center><math>
problemu, a następnie dowodem uzasadniającym, że problem jest
L(\mathcal{MT})=L(\mathcal{MT}')
rzeczywiście nierozstrzygalny. Tematyka ta
</math></center>
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.
 
&nbsp;
 
'''Problem''' '''Posta'''
 
Dla dowolnego alfabetu  <math>\displaystyle A  </math> , o co najmniej dwóch elementach ( <math>\displaystyle \sharp A\geq 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|||
W klasie gramatyk bezkontekstowych problem
niejednoznaczności jest nierozstrzygalny.


oraz dla każdego <math>w\in L(\mathcal{MT}')</math> maszyna <math>\mathcal{MT}'</math>
zatrzymuje się na <math>w</math>.
}}
}}


{{dowod|||
{{dowod|||
Udowodnimy, że problem jest nierozstrzygalny dla gramatyk
Wystarczy przerobić maszynę <math>\mathcal{MT}</math> na maszynę
bezkontekstowych generujących jązyki nad alfabetem
niedeterministyczną <math>\mathcal{NMT}</math> posiadającą dodatkowy stan <math>s_A</math>
dwuelementowym  <math>\displaystyle A=\{a,b\} </math> . Oznaczmy  <math>\displaystyle B=\{d,e\} </math> i
oraz taką, że dla każdego stanu ze zbioru <math>S_F</math> pod wpływem dowolnego
określmy homomorfizm  <math>\displaystyle h:B^{*}\longrightarrow A^{*}  </math> ,
symbolu z <math>\Sigma_T</math> maszyna <math>\mathcal{NMT}</math> posiada dodatkowe
przyjmując  <math>\displaystyle h(d)=ba^{2}  </math>  oraz <math>\displaystyle h(e)=ba^{3}  </math> . Niech  <math>\displaystyle u  </math>
przejście do <math>s_A</math>, w którym już pozostaje i nic nie zmienia. Stąd widać, że <math>L(\mathcal{MT})=L(\mathcal{NMT})</math>.
będzie ciągiem  <math>\displaystyle u_{1},...,u_{n}\in B^{+}  </math> dowolnie wybranych
i&nbsp;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\geq 1,\: 1\leq i_{j}\leq 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> <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\geq 1,1\leq i_{j}\leq n\right\} \\
L_{w} &= \left\{ ba^{i_{k}}b\ldots ba^{i_{1}}cw_{i_{1}}\ldots
w_{i_{k}}\, :\, k\geq 1,1\leq i_{j}\leq 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|||
Języki  <math>\displaystyle L,\: L_{PP},\: A_{3}^{*}\setminus L,\: A_{3}^{*}\setminus
L_{PP}  </math> są bezkontekstowe.


Twierdzenie [[#prz.1b|4.1]] pozwala na otrzymanie maszyny
<math>\mathcal{MT}'</math> akceptującej ten sam język co <math>\mathcal{NMT}</math> z
dodatkowym założeniem, że gdy <math>\mathcal{NMT}</math> osiąga stan <math>s_A</math>,
maszyna <math>\mathcal{MT}'</math> się zatrzymuje. Zauważmy, że stan <math>s_A</math> można
osiągnąć tylko dla słów akceptowanych prze <math>\mathcal{NMT}</math>, a z drugiej strony, każde słowo akceptowane przez <math>\mathcal{NMT}</math> prowadzi do co najmniej jednego obliczenia kończącego się w <math>s_A</math>.
}}
}}
Dla języków  <math>\displaystyle L  </math>  i  <math>\displaystyle L_{PP}  </math>  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  <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\geq 1,1\leq
i_{j}\leq 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.

Aktualna wersja na dzień 21:57, 15 wrz 2023

W tym wykładzie omówimy języki i gramatyki kontekstowe oraz ich własności. Wprowadzimy automat liniowo ograniczony i uzasadnimy równość rodziny języków kontekstowych i rodziny języków rozpoznawanych przez automaty liniowo ograniczone. Zdefiniujemy maszynę Turinga i pokażemy równoważność tego modelu z wybranymi innymi modelami obliczeń.

W tym wykładzie omówimy kolejną rodzinę języków hierarchii Chomsky'ego, a mianowicie języki kontekstowe. Przedstawimy kilka własnosci gramatyk kontekstowych, czyli typu (1) oraz wprowadzimy pojęcie automatu liniowo ograniczonego. Wprowadzimy też najogólniejszy model obliczeń, a mianowicie maszynę Turinga.

Języki kontekstowe

Języki kontekstowe to kolejna rodzina języków w hierarchii Chomsky'ego. Rozszerza ona istotnie rodzinę języków bezkontekstowych. Wykorzystanie tej rodziny języków formalnych jest dość ograniczone. Brak jest bowiem praktycznych metod konstrukcji parserów dla tych gramatyk.

Ta część wykładu prezentuje gramatyki równoważne gramatykom kontekstowym, posiadające pewne określone własności. Te własności wykorzystuje się przy uzasadnieniu faktu, że rodzina języków kontekstowych pokrywa się z rodziną języków rozpoznawanych przez automaty liniowo ograniczone. Biorąc pod uwagę to, że zastosowania tej rodziny języków formalnych nie są powszechne oraz to, że dowody dla przedstawionych poniżej twierdzeń są mocno techniczne, postanowiliśmy zrezygnować z rygorystycznej prezentacji tego materiału i pominąć dowody. Zainteresowany Student może je znaleźć w literaturze wskazanej do tego przedmiotu.

Definicja 1.1

Gramatykę G=(VN,VT,v0,P) nazywamy rozszerzającą, jeśli każde prawo jest postaci xy , gdzie x,y(VNVT)* i spełniona jest nierówność xy lub jest to prawo v01 i wtedy v0 nie występuje po prawej stronie w żadnej produkcji z P .

Wprost z definicji wynika, że gramatyka kontekstowa jest gramatyką rozszerzającą. Prawdziwe jest również następujące twierdzenie.

Twierdzenie 1.1

Dla dowolnej gramatyki G=(VN,VT,v0,P) rozszerzającej istnieje równoważna gramatyka kontekstowa.

Wprowadzimy teraz gramatyki z markerem końca.

Definicja 1.2

Gramatyką z markerem końca nazywamy gramatykę G=(VN{},VT,v0,P) taką, że VNVT oraz prawa są postaci: uv , uv lub uv , gdzie u,v(VNVT)* i w słowie u występuje co najmniej jeden symbol nieterminalny z VN . Językiem generowanym przez tę gramatykę nazywamy zbiór

L(G)={wVT*: :v0*w}

Gramatyka z markerem końca G jest kontekstowa (typu 1 ), jeśli jej prawa po wymazaniu markera spełniają warunki gramatyki rozszerzającej. Oczywiście dla dowolnej gramatyki kontekstowej istnieje równoważna gramatyka kontekstowa z markerem końca. Prawdziwe jest również następujące twierdzenie:

Twierdzenie 1.2

Dla dowolnej gramatyki kontekstowej z markerem końca istnieje równoważna gramatyka kontekstowa.

Dowód

Niech G=(VN{},VT,v0,P) będzie dowolną gramatyką kontekstową z markerem końca. Zakładamy, bez ograniczania ogólności rozważań, że w zbiorze P nie występuje prawo v01 (po wymazaniu markera ). Dla każdego symbolu x ze zbioru V=VNVT określamy trzy symbole x,x, :x oraz oznaczamy odpowiednio przez V,V,V zbiory tych symboli. Dla u=u1...uk takiego, że k1 i uiV dla i=1,,k wprowadzamy także następujące oznaczenia:

u=u1u2...uk , u=u1...uk1uk oraz u=u1u2...uk1uk gdy k>1 .

Przy takich oznaczeniach definiujemy gramatykę

G1=(VNVVV,VT,v0,P1)

w której zbiór praw P1 składa się ze wszystkich praw uzyskanych zgodnie z poniższymi warunkami:

  1. jeśli uwP , to uw, :#u#w, :u#w#, :#u##w#P1
  2. jeśli #u#wP , to  :u#w#, :#u##w#P1
  3. jeśli u#w#P , to u#w#, :#u##w#P1
  4. #xx, :x#x, :#x#xP1

dla wszystkich xV .

Określona w ten sposób gramatyka G1 jest gramatyką rozszerzającą i równoważną wyjściowej. Dla gramatyki G1 istnieje, zgodnie z poprzednim twierdzeniem, równoważna gramatyka kontekstowa, co kończy dowód twierdzenia.

Prawdziwe jest także następujące twierdzenie (porównaj z 1.1).

Twierdzenie 1.3

Dla dowolnej gramatyki kontekstowej (rozszerzającej) istnieje równoważna gramatyka kontekstowa (rozszerzająca) o tej własności, że każde prawo, w którym występuje symbol terminalny, jest postaci va , gdzie vVN, :aVT .

Mówimy, że gramatyka G jest rzędu n>0 , jeśli dla każdego prawa xy tej gramatyki spełniony jest warunek xn i yn . Kolejne twierdzenie stwierdza możliwość dalszego uproszczenia praw gramatyki rozszerzającej.

Twierdzenie 1.4

Dla każdej gramatyki rozszerzającej istnieje równoważna gramatyka rozszerzająca rzędu 2 .

Na koniec wprowadzimy jeszcze jeden rodzaj gramatyk równoważnych gramatykom kontekstowym. Są to mianowicie gramatyki liniowo ograniczone.

Definicja 1.3

Gramatyka G=(VN,VT,v0,P) jest liniowo ograniczona, jeśli każde prawo jest jednej z następujących postaci:

v0v0v, :v1v2z1z2, :vx

gdzie xVNVT, :v,v1,v2,z1,z2VN oraz v0{x,z1,z2,v} .

Twierdzenie 1.5

Dla dowolnej gramatyki kontekstowej G istnieje gramatyka liniowo ograniczona G1 , która jest równoważna G lub też generuje język L(G){1} .

Dowód

W świetle poprzednich twierdzeń możemy przyjąć, że gramatyka kontekstowa G=(VN,VT,v0,P) ma prawa wyłącznie w następujących postaciach:

  1. v01
  2. vx gdzie vVN, :xVNVT
  3. vv1v2 gdzie v,v1,v2VN
  4. v1v2v3v4 gdzie v1,v2,v3,v4VN

Określamy gramatykę G1=(VN{z0,z1},VT,z0,P1) , gdzie z1,z2 są nowymi symbolami nieterminalnymi, a więc nie należą do VN . Natomiast zbiór praw P1 składa się ze wszystkich praw ze zbioru P postaci 2 i 4 oraz z0z0z1, :z0v0, : praw z1vvz1, :vz1z1v dla vVN i praw v1z1v3v4 dla każdego prawa postaci 4 w gramatyce G . Skonstruowana gramatyka jest liniowo ograniczona i spełnia tezę twierdzenia.

Automat liniowo ograniczony

Określimy teraz systemy, zwane automatami liniowo ograniczonymi, który rozpoznają języki kontekstowe.

Definicja 2.1

Automatem liniowo ograniczonym nazywamy system 𝒜LO=(ΣT,S,P,s0,SF) , w którym ΣT jest skończonym alfabetem, S skończonym zbiorem stanów, SΣT= oraz wyróżniony jest podzbiór ΣIΣT . Zbiór ΣT zwany jest alfabetem taśmy, a ΣI - alfabetem wejściowym. Wyróżnione są także: element #ΣTΣI zwany markerem końca, stan początkowy s0S oraz SFS - zbiór stanów końcowych. Natomiast relacja przejść P(S×ΣT)×(S×ΣT×{1,0,1}) spełnia następujące warunki:

  1. jeśli (s1,#)P(s2,a,k) , to a=#
  2. jeśli (s1,a)P(s2,#,k) , to a=#

Fakt, że (s1,a)P(s2,b,k) , zapisujemy zazwyczaj jako (s1,a)(s2,b,k) . Do opisu działania automatu liniowo ograniczonego wygodnie jest wprowadzić pojęcie konfiguracji (podobnie jak dla automatów ze stosem).

Konfiguracją automatu liniowo ograniczonego jest słowo vsw(ΣTS)* , w którym sS,v,wΣT* . Pomiędzy dwoma konfiguracjami d1,d2 zachodzi relacja bezpośredniego następstwa d1d2 wtedy i tylko wtedy, gdy spełniony jest jeden z niżej wypisanych warunków, gdzie s1,s2S , a,b,cΣT oraz v,wΣT*:

  1. d1=vs1aw , d2=vs2bw oraz (s1,a)P(s2,b,0)
  2. d1=vs1aw , d2=vbs2w oraz (s1,a)P(s2,b,1)
  3. d1=vcs1aw , d2=vs2cbw oraz (s1,a)P(s2,b,1)

Przechodnie domknięcie relacji oznaczać będziemy symbolem * i określać mianem obliczenia wykonanego przez automat liniowo ograniczony.

Język rozpoznawany przez automat liniowo ograniczony 𝒜LO to zbiór słów nad alfabetem ΣI , pod działaniem których automat wykonuje obliczenie prowadzące do stanu końcowego, czyli

L(𝒜LO)={wΣI* :: :s0#w#*vs,vΣT*,sSF}.

Język LΣI* jest rozpoznawany (akceptowany) przez automat liniowo ograniczony, jeśli istnieje automat 𝒜LO taki, że (𝒜LO)=L

<flash>file=Wyklad12_rysunek1.swf|width=200|height=200</flash> <div.thumbcaption>Rysunek 1


Opiszemy teraz możliwe ruchy automatu liniowo ograniczonego. Automat ten może czytać słowo wejściowe w dwóch kierunkach. Jego głowica może poruszać się w lewo lub w prawo. Automat może wymieniać czytaną literę na inną, ale nie rozszerza miejsca zajętego na taśmie przez czytane słowo. Działa niedeterministycznie. Czytając literę a, będąc w stanie s, automat ma kilka możliwości działania. Może mianowicie:

  1. zamienić literę na inną literę i/lub zmienić stan na inny - zgodnie z warunkiem 1. Głowica czytająca automatu pozostaje w poprzedniej pozycji,
  2. zamienić literę na inną literę i/lub zmienić stan na inny - zgodnie z warunkiem 2. Głowica czytająca automatu przesuwa się w prawo,
  3. zamienić literę na inną literę i/lub zmienić stan na inny - zgodnie z warunkiem 3. Głowica czytająca automatu przesuwa się w lewo.

Związek pomiędzy rodziną języków kontekstowych a wprowadzoną rodziną automatów liniowo ograniczonych ustalają poniższe twierdzenia.

Twierdzenie 2.1

Dla dowolnego języka kontekstowego L istnieje automat liniowo ograniczony 𝒜LO taki, że (𝒜LO)=L .

Dowód

Można założyć, bez ograniczenia ogólności naszych rozważań, że gramatyka G=(VN,VT,v0,P) generująca język L ma prawa wyłącznie następujących postaci:

  1. (G) vx , gdzie vVN,xVNVT,xv0
  2. (G) v0v0v1 , gdzie v1VN,v1v0
  3. (G) v1v2v3v4 , gdzie v1,,v4VN,v3,v4v0
  4. (G) v01 jeśli 1L .

Określamy automat liniowo ograniczony 𝒜LO=(ΣT,S,P,s0,SF) , przyjmując ΣT=VNVT{#,} , S={s0,s1,s2,s3,s4}{sv1:v1v2v3v4P} , ΣI=VNVT , SF={s3} , s0 - stan początkowy. Relacja przejść automatu 𝒜LO zdefiniowana jest poniżej:

  1. (A) (s0,#)(s0,#,1)
  2. (A) (s0,#)(s4,#,1) jeśli 1L
  3. (A) (s0,x)(s0,x,1) , (s0,x)(s0,x,1) dla każdego xVNVT
  4. (A) (s0,x)(s0,v,0) jeśli vxP i xv0
  5. (A) (s0,v3)(sv1,v1,1),(sv1,v4)(s0,v2,0) jeśli v1v2v3v4P
  6. (A) (s0,v0)(s1,v0,1)
  7. (A) (s1,#)(s2,#,1)
  8. (A) (s1,)(s2,,1)
  9. (A) (s2,v0)(s3,,1)
  10. (A) (s3,v1)(s0,v0,0) , gdy v0v0v1P
  11. (A) (s3,#)s3,#,1),(s4,#)(s3,#,1)

Określony automat 𝒜LO rozpoznaje tylko te słowa, które są generowane przez gramatykę G , symulując wstecz każde wyprowadzenie gramatyki G .

Prawdziwe jest również następujące twierdzenie.

Twierdzenie 2.2

Dla dowolnego języka L rozpoznawanego przez automat liniowo ograniczony 𝒜LO istnieje gramatyka kontekstowa G taka, że L(G)=L .

W dowodzie konstruuje się odpowiednią gramatykę.Zasada tej konstrukcji jest następująca. Z symbolu startowego gramatyka generuje dowolne słowa, ustawiając zawsze na prawym końcu symbol nieterminalny związany z przejściem automatu do stanu końcowego. Następnie korzysta się z możliwości zamiany takiego symbolu nieterminalnego na inne. W ten sposób gramatyka symuluje wstecz działanie automatu, wprowadzając symbole nieterminalne odpowiadające stanom automatu. Dojście do stanu początkowego automatu w tej symulacji jest równoznaczne z usunięciem ostatniego symbolu nieterminalnego i wygenerowaniem słowa dokładnie tego samego, które rozpoznaje automat.

Udowownimy teraz zamkniętość rodziny języków kontekstowych ze względu na iloczyn mnogościowy.

Twierdzenie 2.3

Dla dowolnych języków kontekstowych L1,L2A* iloczyn mnogościowy tych języków L1L2 jest językiem kontekstowym.

Dowód

(szkic) Załóżmy, że języki L1,L2 są rozpoznawane przez automaty liniowo ograniczone, 𝒜LO1 i 𝒜LO2 . Opiszemy konstrukcję automatu liniowo ograniczonego 𝒜LO , który rozpoznawać będzie wyłącznie słowa akceptowane równocześnie przez oba automaty. Działanie tego automatu jest następujące. Każde słowo będzie czytane trzy razy. Przy pierwszym czytaniu automat 𝒜LO dubluje litery, to znaczy w miejsce litery a wprowadza parę (a,a) . Po zakończeniu tej procedury automat wraca do skrajnej lewej pozycji i rozpoczyna symulację automatu 𝒜LO1 . Jeśli ta symulacja doprowadzi do zaakceptowania czytanego słowa przez automat 𝒜LO1 , to automat 𝒜LO rozpoczyna obliczenie od początku, symulując teraz pracę automatu 𝒜LO2 . Jeśli i ta symulacja zakończy się zaakceptowaniem czytanego słowa, to automat przechodzi do ustalonego stanu końcowego, a to oznacza akceptację tego słowa. Działając w opisany sposób, automat 𝒜LO rozpoznaje język L1L2 , a to w świetle udowodnionego powyżej twierdzenia oznacza, że przecięcie języków kontekstowych L1L2 jest językiem kontekstowym.

Ponieważ dalsze własności domkniętości rodziny języków kontekstowych pokrywają się z własnościami języków typu (0), więc omówimy te własności wspólnie, co będzie mieć miejsce w następnym wykładzie.

Maszyna Turinga

Alan Turing (1912-1954)
Zobacz biografię

Przejdziemy teraz do prezentacji ogólnego modelu maszyny liczącej, który został wprowadzony w 1936 roku przez Alana M. Turinga. Na cześć swego autora został on nazwany (jednotaśmową) maszyną Turinga. Model ten jest podobny w swojej idei do rozważanych wcześniej automatów liniowo ograniczonych, przy czym jednym z podstawowych założeń (i różnic względem automatów) jest nieskończony dostęp do pamięci. Maszyna Turinga może wydawać się na początku pojęciem bardzo abstrakcyjnym. Jednak, jak później zobaczymy, stanowi ona jedną z podstawowych koncepcji współczesnej informatyki. Pozwala na formalne zdefiniowanie pojęcia algorytmu oraz jego złożoności obliczeniowej. Jako model obliczeń pozwala odpowiedzieć także na bardzo ważne pytanie: czy każdy problem można rozwiązać algorytmicznie?

Jednotaśmowa maszyna Turinga jest podobna w swej idei do automatu liniowo ograniczonego, pominięte jednak zostaje, jak wspomnieliśmy, ograniczenie dostępu do pamięci. Omawiana maszyna jest abstrakcyjnym tworem w skład którego wchodzą:

  • dwustronnie nieskończona taśma zbudowana z komórek zawierających symbole z pewnego zadanego alfabetu,
  • głowica, która może czytać i zapisywać symbole w komórkach taśmy oraz poruszać się w prawo lub lewo o jedną komórkę lub pozostawać na tej samej pozycji podczas jednego kroku czasowego,
  • działający sekwencyjnie mechanizm odpowiedzialny za sterowanie maszyną; mechanizm ten na podstawie symbolu odczytanego z komórki pod głowicą oraz stanu, w którym aktualnie znajduje się maszyna, dokonuje zapisu symbolu w tejże komórce, przechodzi do kolejnego stanu i przesuwa głowicę w prawo, lewo lub też nie zmienia pozycji głowicy.

Podamy teraz formalną definicję maszyny Turinga. Aby zachować analogię do poprzednich wykładów, zdefiniujemy maszynę w języku konfiguracji.

Definicja 3.1

(Jednotaśmowa deterministyczna) maszyna Turinga jest to system 𝐌𝐓=(ΣT,S,f,s0,SF) , w którym ΣT jest skończonym alfabetem, S skończonym zbiorem stanów, SΣT= oraz wyróżniony jest podzbiór ΣIΣT . Zbiór ΣT zwany jest alfabetem taśmy, a ΣI - alfabetem wejściowym. Wyróżnione są także: element #ΣTΣI zwany markerem końca, stan początkowy s0S oraz SFS - zbiór stanów końcowych. Natomiast funkcja przejść jest funkcją częściową f: :(S×ΣT)(S×ΣT×{1,0,1} .

Konfiguracją maszyny Turinga jest słowo vsw(ΣTS)* , w którym sS,v,wΣT* . Pomiędzy dwiema konfiguracjami d1,d2 zachodzi relacja bezpośredniego następstwa d1d2 wtedy i tylko wtedy, gdy spełniony jest jeden z niżej wypisanych warunków, gdzie s1,s2S , a,b,cΣT oraz v,wΣT*:

  1. d1=vs1aw , d2=vs2bw oraz f(s1,a)=(s2,b,0)
  2. d1=vs1aw , d2=vbs2w oraz f(s1,a)=(s2,b,1) i w1
  3. d1=vs1# , d2=vbs2# oraz f(s1,#)=(s2,b,1)
  4. d1=vcs1aw , d2=vs2cbw oraz f(s1,a)=(s2,b,1)
  5. d1=s1#w , d2=s2#bw oraz f(s1,#)=(s2,b,1)

Przechodnie domknięcie relacji oznaczać będziemy symbolem * i określać mianem obliczenia wykonanego przez maszynę Turinga. Konfiguracja d1(ΣTS)* jest końcowa, jeśli stąd, że d1d2 , wynika d2=d1 Mówimy, że maszyna Turinga zatrzymuje się w d1 wtedy i tylko wtedy, gdy d1 jest konfiguracją końcową.

Zauważmy, że wprowadzenie markera końca jest zabiegiem czysto formalnym. Pozwala on z jednej strony na oznaczenie słowa wejściowego, a z drugiej strony wskazuje na elementy taśmy, które były zmieniane (czy to przez wprowadzenie słowa wejściowego, czy też poprzez ruch głowicy).

Definicja 3.2

Język rozpoznawany przez maszynę Turinga MT jest to zbiór

L(𝐌𝐓)={wΣT* :: :s0w*w1sFw2,dla :pewnych :w1,w2ΣT*,sFSF}.

Język LΣI* jest rozpoznawany (akceptowany) przez maszynę Turinga, jeśli istnieje MT taka, że L(𝒯)=L Klasę języków rozpoznawanych przez maszynę Turinga oznaczamy (MT) .

We wprowadzonym przez nas ujęciu formalnym, działanie maszyny Turinga należy wyobrażać sobie następująco. W pierwszym etapie na taśmę zostają zapisane symbole słowa wejściowego (z alfabetu ΣI), a następnie komórki przyległe zostają oznaczone symbolami . Jednocześnie maszyna jest sprowadzana do stanu s0, a głowica zostaje ustawiona nad pierwszym symbolem słowa wejściowego. W tym momencie rozpoczyna się sekwencyjne przetwarzanie zawartości taśmy przez maszynę. Jeśli maszyna "zatrzyma się", tzn. w dwóch kolejnych chwilach czasowych nie wykona ruchu i jednocześnie nie zmieni stanu i symbolu taśmy, sprawdzany jest jej aktualny stan. Jeśli stan był akceptujący (czyli należał do zbioru SF), to maszyna zaakceptowała słowo, w przeciwnym razie - słowo odrzuciła (gdyż nie może już osiągnąć stanu ze zbioru SF). Należy zwrócić uwagę na to, że dla niektórych konfiguracji początkowych maszyna może nigdy się nie zatrzymać, a mimo to słowo zostanie przez nią zaakceptowane. To samo tyczy się odrzucania słów, jednak w tej sytuacji dowód, że słowo nie zostanie zaakceptowane, może być problematyczny. Zaprezentowane podejście ma na celu uproszczenie i tak już dość technicznych dowodów twierdzeń pojawiających się w tym wykładzie. Związki pomiędzy akceptowaniem a zatrzymywaniem maszyny Turinga zostaną skomentowane później (zob. Wniosek 4.1). W pierwszej kolejności przedstawiamy dwa przykłady:

Przykład 3.1

Skonstruujemy maszynę Turinga MT1, która rozpoznaje język postaci L={02n:n0}. Zamierzone działanie maszyny MT1 można opisać następująco:

  1. Przejdź od lewego markera do prawego, zaznaczając symbolem co drugie 0.
  2. Jeśli było tylko jedno 0, to akceptuj.
  3. Jeśli w kroku 1. obszar pomiędzy markerami zawierał nieparzystą ilość 0, to odrzuć.
  4. Powróć do lewego markera.
  5. Powtórz działanie od 1.

Zwróćmy uwagę, że o ile jasne jest, w jaki sposób maszyna ma akceptować słowa wejściowe, odrzucanie tych słów nie zostało zdefiniowane. Aby ominąć ten problem, wprowadzimy jeden dodatkowy stan (nie należący do stanów końcowych), po osiągnięciu którego maszyna się zatrzymuje (tzn. nie wykonuje ruchów i przepisuje na taśmie wciąż ten sam symbol).

Określamy kolejno elementy składowe maszyny MT1:

ΣI={0},ΣT={0,,,},
S={s0,s1,s2,s3,s4,sA,sR},SF={sA}

Pozostaje jeszcze zdefiniować funkcję przejść:

(s0,)(sR,,0)(s1,)(s1,,1)(s0,0)(s1,,1)(s1,0)(s2,,1)(s1,)(sA,,0)(s2,)(s2,,1)(s3,0)(s2,,1)(s2,)(s4,,1)(s3,)(s3,,1)(s2,0)(s3,0,1)(s3,)(sR,,0)(s4,0)(s4,0,1)(s4,)(s4,,1)(s4,)(s2,,1)(sA,)(sA,,0)(sR,)(sR,,0)

W miejsce tabeli wygodniej jest zobrazować funkcję przejść maszyny Turinga na etykietowanym grafie skierowanym. Zostało to zrobione na poniższym rysunku:

Plik:File=ja-lekcja12-w-rys1.mp4
Rysunek 2

Łatwo zauważyć, że wprowadzona funkcja przejścia określa maszynę spełniającą postawione przez nas warunki. Symbol został wprowadzony dla odróżnienia wystąpienia pojedynczego zera od sytuacji, gdy liczba zer jest nieparzysta i większa od 1.

Aby lepiej zrozumieć działanie maszyny MT1, zasymulujemy jej działanie na dwóch słowach wejściowych, przy czym pierwsze z nich będzie należało do języka L, a drugie nie:

s00000s1000s2000s300s20s4s40s40s40s10s10s2s2s4s4s4s4s1s1s1s1sA

Wykazaliśmy więc, że s00000*sA. Zatem 04L(MT1).

Animacja 1

Dla porównania:

s0000s100s200s30sR

Czyli zgodnie z naszym założeniem 03∉L(MT1).

Animacja 2

Przykład 3.2

Przedstawimy maszynę Turinga MT2 akceptującą język

L={ww :: :w{0,1}*},

gdzie w oznacza lustrzane odbicie słowa w. Elementy języka L nazywamy palindromami. Definiujemy alfabet maszyny:

ΣI={0,1},ΣT={0,1,},

oraz zbiory stanów

S={s0,r0,r0,q0,r1,r1,q1,l,sA,sR},SF={sA}

Funkcję przejść maszyny MT2 określa tabela:

(s0,)(sA,,0)(s0,0)(r0,,1)(s0,1)(r1,,1)(r0,)(sR,,0)(r0,0)(r0,0,1)(r0,1)(r0,1,1)(r0,)(q0,,1)(r0,0)(r0,0,1)(r0,1)(r0,1,1)(q0,0)(l,,1)(q0,1)(sR,,1)(r1,)(sR,,0)(r1,0)(r1,0,1)(r1,1)(r1,1,1)(r1,)(q1,,1)(r1,0)(r1,0,1)(r1,1)(r1,1,1)(q1,0)(sR,,0)(q1,1)(l,,1)(l,)(s0,,1)(l,0)(l,0,1)(l,1)(l,1,1)(sR,)(sR,,0)(sA,)(sA,,0)

co dla przejrzystości zobrazowano na Rysunku 3.

Plik:File=ja-lekcja12-w-rys3.mp4
Rysunek 3

Inne możliwe definicje maszyn Turinga

Istnieje kilka możliwych definicji maszyny Turinga, które jak się okazuje są równoważne pod względem możliwości obliczeniowych (tzn. rozpoznają dokładnie tę samą klasę języków). Naszkicujemy kilka wybranych podejść.

Maszyna wielotaśmowa

W tym modelu zakłada się, że głowica ma do dyspozycji nie tylko jedną, ale wiele taśm, na których może zapisywać i odczytywać symbole. Zakłada się przy tym, że słowo wejściowe znajduje się na pierwszej taśmie. Aby symulować maszynę wielotaśmową na jednej taśmie, należy zamienić alfabet taśmy na alfabet (ΣT)k, gdzie k oznacza ilość taśm. W tym momencie zapis na taśmie i-tej jest realizowany przez zmianę odpowiedniej współrzędnej litery z nowego alfabetu (zob. Rys. 4.a). Czyli w opisywanym przypadku funkcja przejść będzie operowała na następujących zbiorach:

f: :(S×ΣTk)(S×ΣTk×{1,0,1})

Taśma jednostronnie nieskończona

Model ten zakłada, że taśma jest ograniczona z jednej ze stron. Różnica w porównaniu z rozważaną przez nas maszyną Turinga polega na tym, że nie jest dozwolone przesuwanie lewego markera (tzn. funkcja przejść nie może zawierać przejść typu punkt 5 definicji 3.1. W tej sytuacji, aby symulować maszynę z taśmą obustronnie nieskończoną na maszynie z taśmą ograniczoną z jednej strony, wystarczy zasymulować taśmę obustronnie nieskończoną poprzez rozszerzenie alfabetu (zob. Rys. 4.b).

Plik:File=ja-lekcja12-w-rys4.mp4
Rysunek 4

Wielogłowicowa maszyna wielotaśmowa

W tym podejściu zakłada się dodatkowo, że każda z taśm posiada swoją głowicę. Inaczej mówiąc, mamy do czynienia z iloczynem kartezjańskim k niezależnych maszyn jednotaśmowych. Akceptowany język jest w tym momencie k-wymiarowy. Oczywiście, słowo postaci (w,1,,1)(ΣT*)k można w naturalny sposób utożsamiać z wΣT. Z drugiej strony maszynę wielogłowicową można symulować na jednotaśmowej w następujący sposób:

  1. Jako zbiór stanów bierzemy Sk.
  2. Słowa startowe w1,,wk zapisujemy jako konfigurację początkową maszyny jednotaśmowej w postaci:
    (s0)k$1˙w1$2˙w2$$k˙wk$
    Symbole $ mają za zadanie wirtualnego rozdzielenia taśm. Symbole i˙ wskazują na położenie i-tej głowicy na taśmie.
  3. W trakcie symulacji przechodzimy pomiędzy markerami i wykonujemy przejścia dla kolejnych głowic.

Widać już, że formalne podanie funkcji przejść jest w omawianym przypadku bardzo techniczne. Musimy zapewnić możliwość poszerzania obszaru zapisu na poszczególnych taśmach, co jest realizowane poprzez dopisanie nowego symbolu i przepisywanie przyległych symboli, aż do markera włącznie. Następnie należy wrócić do poprzedniego miejsca zapisu i symulować działanie kolejnych głowic. Wymaga to wprowadzenia sporej liczby stanów pomocniczych. Nie będziemy zagłębiać się w te techniczne szczegóły. Mamy nadzieję że sama idea konstrukcji jest w tym momencie zrozumiała.

Najbardziej ogólna definicja maszyny tego typu dopuszcza dodatkowo, aby głowice mogły przeglądać pozostałe taśmy, dzięki czemu zapewnia się komunikację między głowicami. Symulacja takiej maszyny na jednej taśmie jest podobna w swej idei do metody przedstawionej wcześniej.

Maszyna niedeterministyczna

Ten typ maszyn ma ogromne znaczenie dla teorii złożoności. Z tego powodu przyglądniemy mu się dokładniej. Różnica pomiędzy niedeterministyczną maszyną Turinga a maszyną deterministyczną polega na tym, że funkcja przejść może pozwalać na kilka różnych przejść na skutek tego samego symbolu czytanego (gdyż funkcja przejść w tym przypadku będzie multi-funkcją).

Definicja 4.1

(Jednotaśmowa) niedeterministyczna maszyna Turinga jest to system 𝐍𝐌𝐓=(ΣT,S,f,s0,SF), w którym ΣT jest skończonym alfabetem, S skończonym zbiorem stanów, SΣT= oraz wyróżniony jest podzbiór ΣIΣT . Podobnie jak poprzednio zbiór ΣT zwany jest alfabetem taśmy, a ΣI - alfabetem wejściowym. Wyróżnione są także: element #ΣTΣI zwany markerem końca, stan początkowy s0S oraz SFS - zbiór stanów końcowych. Natomiast funkcja przejść jest funkcją częściową f: :(S×ΣT)𝒫(S×ΣT×{1,0,1}) gdzie 𝒫(A) oznacza zbiór podzbiorów zbioru A.

Konfiguracją maszyny Turinga jest słowo vsw(ΣTS)* , w którym sS,v,wΣT* , przy czym pomiędzy dwiema konfiguracjami d1,d2 zachodzi relacja bezpośredniego następstwa d1d2 wtedy i tylko wtedy, gdy spełniony jest jeden z niżej wypisanych warunków, gdzie s1,s2S , a,b,cΣT oraz v,wΣT*:

  1. d1=vs1aw , d2=vs2bw oraz f(s1,a)(s2,b,0)
  2. d1=vs1aw , d2=vbs2w oraz f(s1,a)(s2,b,1) i w1
  3. d1=vs1# , d2=vbs2# oraz f(s1,#)(s2,b,1)
  4. d1=vcs1aw , d2=vs2cbw oraz f(s1,a)(s2,b,1)
  5. d1=s1#w , d2=s2#bw oraz f(s1,#)(s2,b,1)

Tak jak poprzednio, przechodnie domknięcie relacji oznaczać będziemy symbolem * i określać mianem obliczenia wykonanego przez maszynę Turinga. Konfiguracja d1(ΣTS)* jest końcowa, jeśli stąd, że d1d2 , wynika d2=d1

Pomimo tego, że postawiona definicja maszyny niedeterministycznej jest bardzo podobna do maszyny deterministycznej, występuje tutaj jedna bardzo istotna różnica. Słowo wejściowe może prowadzić do wielu różnych obliczeń wykonanych, w szczególności jedno z obliczeń może doprowadzać do zatrzymania maszyny, a inne nie.

Przykład maszyny niedeterministycznej podamy później, przy okazji omawiania klas złożoności obliczeniowej.

Definicja 4.2

Język rozpoznawany przez niedeterministyczną maszynę Turinga NMT jest to zbiór

L(𝐍𝐌𝐓)={wΣT* :: :s0w*w1sFw2,dla :pewnych :w1,w2ΣT*,sFSF}.

Język LΣI* jest rozpoznawany (akceptowany) przez niedeterministyczną maszynę Turinga, jeśli istnieje 𝒩𝒯 taka, że L(𝒩𝒯)=L

Podkreślamy fakt, że aby maszyna niedeterministyczna zaakceptowała słowo wejściowe, wystarczy, aby wśród wszystkich możliwych obliczeń znalazło się co najmniej jedno akceptujące.

Wprost z definicji wynika że każda maszyna deterministyczna jest także maszyną niedeterministyczną, co oznacza, że języki rozpoznawane przez maszyny deterministyczne są zawarte w klasie języków rozpoznawanych przez maszyny niedeterministyczne. Przeciwna inkluzja jest gwarantowana przez następujące twierdzenie.

Twierdzenie 4.1

Dla każdej niedeterministycznej maszyny Turinga 𝒩𝒯 istnieje maszyna deterministyczna 𝒯 taka, że

L(𝒩𝒯)=L(𝒯)

Dowód

(Szkic). Aby sprawdzić, czy maszyna niedeterministyczna akceptuje dane słowo wejściowe, należy przejrzeć wszystkie możliwe obliczenia wykonywane, tworzące drzewo obliczeń. Poziomy drzewa tworzone są przez kroki czasowe, wierzchołki stanowią obliczenia wykonane w danym kroku czasowym, a gałęzie zadane są przez relację bezpośredniego następstwa. W celu sprawdzenia, czy maszyna akceptuje dane słowo, przeglądamy drzewo obliczeń poziomami (por. algorytm BFS) i akceptujemy, gdy przeglądana konfiguracja była akceptująca. Tą techniką przeglądamy wszystkie możliwe obliczenia wykonane w 1,2,3, krokach.

Do dokonania symulacji najwygodniej jest użyć maszyny 3-głowicowej z możliwością czytania na wszystkich taśmach. Wprowadzamy te taśmy kolejno do przechowywania słowa wejściowego, symulacji działania maszyny niedeterministycznej i adresowania wyboru przejść ze zbioru przejść danego przez funkcję przejść. Symulacja przebiega w czterech krokach:

  1. Rozpocznij ze słowem wejściowym w na taśmie 1 oraz pustymi taśmami 2 i 3.
  2. Przekopiuj taśmę 1 na taśmę 2.
  3. Użyj taśmy 2 do symulacji w, wykorzystując taśmę 3 do wyboru przejść funkcji przejść f. Jeśli po wykonaniu skończonego zbioru instrukcji według adresowania z taśmy 3 otrzymano konfigurację akceptującą, to akceptuj. W przeciwnym razie, przejdź do następnego punktu.
  4. Zamień ciąg adresowy na następny w kolejności leksykograficznej. Jeśli zapisany ciąg jest ostatnim możliwym ciągiem adresowym o długości N, zapisz na taśmie 3 pierwszy w kolejności leksykograficznej ciąg adresowy o długości N+1 oraz przejdź do 2.

Wniosek 4.1

Dla każdej maszyny Turinga 𝒯 istnieje maszyna Turinga 𝒯 taka, że

L(𝒯)=L(𝒯)

oraz dla każdego wL(𝒯) maszyna 𝒯 zatrzymuje się na w.

Dowód

Wystarczy przerobić maszynę 𝒯 na maszynę niedeterministyczną 𝒩𝒯 posiadającą dodatkowy stan sA oraz taką, że dla każdego stanu ze zbioru SF pod wpływem dowolnego symbolu z ΣT maszyna 𝒩𝒯 posiada dodatkowe przejście do sA, w którym już pozostaje i nic nie zmienia. Stąd widać, że L(𝒯)=L(𝒩𝒯).

Twierdzenie 4.1 pozwala na otrzymanie maszyny 𝒯 akceptującej ten sam język co 𝒩𝒯 z dodatkowym założeniem, że gdy 𝒩𝒯 osiąga stan sA, maszyna 𝒯 się zatrzymuje. Zauważmy, że stan sA można osiągnąć tylko dla słów akceptowanych prze 𝒩𝒯, a z drugiej strony, każde słowo akceptowane przez 𝒩𝒯 prowadzi do co najmniej jednego obliczenia kończącego się w sA.