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)
Arek (dyskusja | edycje)
Nie podano opisu zmian
Linia 1: Linia 1:
{Złożoność obliczeniowa. Języki maszyn Turinga i typu '''(0)'''. Rozstrzygalność}
{Języki kontekstowe i automat liniowo ograniczony. Maszyna Turinga}


'''Wprowadzenie:''' Sformułujemy definicje podstawowych klas
; Wprowadzenie
złożoności w języku maszyn Turinga oraz metodę ich porównywania.
: W tym wykładzie omówimy języki i gramatyki kontekstowe oraz ich własności. Wprowadzimy
Przeanalizujemy związki między rodziną języków określonych przez maszyny Turinga a
automat liniowo ograniczony i uzasadnimy równość rodziny języków kontekstowych
rodziną języków typu '''(0)''' z hierarchii Chomsky'ego. Podamy dalsze własności
i rodziny języków rozpoznawanych przez automaty liniowo ograniczone.
języków kontekstowych i typu '''(0)'''.
Zdefiniujemy maszynę Turinga i pokażemy równoważność tego modelu z wybranymi
Wprowadzimy pojęcie języka rekurencyjnie
innymi modelami obliczeń.
przeliczalnego oraz przedstawimy tezę Churcha. Następnie omówimy
; Słowa kluczowe
teoretyczne podstawy teorii rozstrzygalności oraz przeanalizujemy
: gramatyka: kontekstowa, rozszerzająca, z markerem końca,
kilka problemów nierozstrzygalnych w teorii języków.
liniowo ograniczona, automat liniowo ograniczony, maszyna Turinga, maszyna wielotaśmowa,
maszyna niedeterministyczna.


'''Słowa kluczowe:'''
W tym wykładzie  omówimy kolejną rodzinę języków hierarchii Chomsky'ego,
klasy złożoności obliczeniowej, redukcja wielomianowa, problemy zupełne, teza Churcha,
a mianowicie języki kontekstowe. Przedstawimy kilka własnosci gramatyk kontekstowych,
język rekurencyjnie
czyli typu  '''(1)''' oraz wprowadzimy pojęcie automatu liniowo ograniczonego. Wprowadzimy
przeliczalny, zamkniętość na działania, rozstrzygalność, nierozstrzygalność.
też najogólniejszy model obliczeń, a mianowicie maszynę Turinga.


==Klasy złożoności obliczeniowej==
==Języki kontekstowe==


Jednym z podstawowych celów wprowadzania maszyn Turinga jest dążenie
Języki kontekstowe to kolejna rodzina języków w hierarchii Chomsky'ego. Rozszerza ona
do formalnej definicji złożoności obliczeniowej. Na podstawie
istotnie rodzinę języków bezkontekstowych. Wykorzystanie tej rodziny języków
wcześniejszych uwag możemy '''utożsamiać akceptację słowa'''
formalnych jest dość ograniczone. Brak jest bowiem praktycznych metod konstrukcji parserów
przez maszynę Turinga z jej '''zatrzymaniem się'''. Intuicyjnie,
dla tych gramatyk.
można takie zachowanie maszyny Turinga utożsamić z wykonaniem
programu który zwraca odpowiedź "Tak" na postawione przez nas
pytanie.


{{definicja|||
Ta część wykładu  prezentuje gramatyki równoważne gramatykom
Ustalmy funkcje <math>\displaystyle t,s:\mathbb{N}\rightarrow \mathbb{N}</math>. Mówimy, że
kontekstowym, posiadające pewne określone własności. Te własności wykorzystuje się
maszyna Turinga <math>\displaystyle \mathcal{MT}</math> (deterministyczna lub
przy uzasadnieniu faktu, że rodzina języków kontekstowych pokrywa się z rodziną
niedeterministyczna) '''akceptuje słowo <math>\displaystyle w\in \Sigma_I^*</math> w
języków rozpoznawanych przez automaty liniowo ograniczone. Biorąc pod uwagę  to, że
czasie <math>\displaystyle t(|w|)</math>''' jeśli istnieje ciąg <math>\displaystyle k\leq t(|w|)</math> konfiguracji
zastosowania tej rodziny języków formalnych nie są powszechne
<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=
oraz to, że dowody dla przedstawionych poniżej twierdzeń
\sharp w_{1}s_{F}w_{2}\sharp</math> dla pewnych <math>\displaystyle w_{1},w_{2}\in \Sigma
są mocno techniczne postanowiliśmy  zrezygnować z rygorystycznej  prezentacji tego materiału
_{T}^{*},s_{F}\in S_{F}</math> oraz <math>\displaystyle d_i \mapsto d_{i+1}</math> dla
i pominąć dowody. Zainteresowany Student może je znaleźć w literaturze wskazanej
<math>\displaystyle i=1,\dots,k-1</math>.
do tego przedmiotu.
 
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|||
{{definicja|||
Oznaczmy przez <math>\displaystyle Dtime(t(n))</math> oraz <math>\displaystyle Dspace(s(n))</math> rodzinę języków
Gramatykę  <math>\displaystyle G=(V_{N},V_{T},v_{0},P) </math> nazywamy rozszerzającą,
akceptowanych w czasie <math>\displaystyle t(n)</math> i odpowiednio pamięci <math>\displaystyle s(n)</math> przez
jeśli każde prawo jest postaci  <math>\displaystyle x\rightarrow y  </math> , gdzie  <math>\displaystyle x,y\in (V_{N}\cup V_{T})^{*}  </math> i spełniona
deterministyczną maszynę Turinga. Dla maszyn niedeterministycznych
jest nierówność  <math>\displaystyle \mid x\mid \leq \mid y\mid  </math> lub jest to prawo  <math>\displaystyle v_{0}\rightarrow 1  </math>  
wprowadzamy w identyczny sposób klasy <math>\displaystyle Ntime(t(n))</math> oraz
i wtedy  <math>\displaystyle v_{0} </math> nie występuje  po prawej stronie w żadnej produkcji z  <math>\displaystyle P  </math> .
<math>\displaystyle Nspace(s(n))</math>.
 
Określamy następujące klasy złożoności (klasy języków):
 
<center><math>\displaystyle \aligned  \textbd{P} \displaystyle =\bigcup_{k=0}^\infty Dtime(n^k) &\qquad\qquad&
\textbd{NP} \displaystyle  =\bigcup_{k=0}^\infty Ntime(n^k)
\\
\textbd{PSPACE} \displaystyle  =\bigcup_{k=0}^\infty Dspace(n^k) &&
\textbd{NSPACE} \displaystyle  =\bigcup_{k=0}^\infty Nspace(n^k)
\endaligned</math></center>


}}
}}


Wprost z definicji otrzymujemy zależności
Wprost z definicji wynika, że gramatyka kontekstowa
'''P''' <math>\displaystyle  \subset  </math> '''NP'''  oraz
jest gramatyką rozszerzającą. Prawdziwe jest również następujące twierdzenie.
'''PSPACE''' <math>\displaystyle  \subset  </math> '''NPSPACE''' . W
dalszej części wykładu udowodnimy kilka mniej oczywistych
zależności.


{{przyklad|||
{{twierdzenie|||
Rozważmy język:
<center><math>\displaystyle
L=\left\{1^i 2^j 3^k\: k=i\cdot j,\: i,j\geq 1\right\}
</math></center>


Język <math>\displaystyle L\in </math> '''P''' . Deterministyczna maszyna Turinga
Dla dowolnej gramatyki <math>\displaystyle G=(V_{N},V_{T},v_{0},P)  </math> rozszerzającej  istnieje
<math>\displaystyle MT_3</math> akceptująca taki język może wyglądać następująco (zaczynamy
równoważna gramatyka kontekstowa.
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|||
Wprowadzimy teraz gramatyki z markerem końca.
 
Rozważmy teraz język
<center><math>\displaystyle
L=\left\{3^k\: : \: k=i\cdot j  </math>  dla pewnych  <math>\displaystyle  i,j> 1\right\}
</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ę
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
tak to słowo wejściowe <math>\displaystyle 3^k</math> pochodziło z języka <math>\displaystyle L</math> i akceptujemy.
Można do tego wykorzystać deterministyczną maszynę Turinga niemal
identyczną z opisaną w przykładzie poprzednim.
 
Jeśli słowo wejściowe pochodzi z języka <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|||
{{definicja|||
Funkcja <math>\displaystyle s(n)</math> jest '''konstruowalną pamięciowo''' jeśli istnieje
Gramatyką z markerem końca  <math>\displaystyle \sharp  </math> nazywamy
maszyna Turinga <math>\displaystyle \mathcal{MT}=(\Sigma _{T},S,f,s_{0},S_{F})</math> dla
gramatykę  <math>\displaystyle G_{\sharp }=(V_{N}\cup \{\sharp \},V_{T},v_{0},P) </math> taką, że
której <math>\displaystyle d_1 \mapsto^* d_2</math> gdzie <math>\displaystyle d_1=\sharp s_0 1^n \sharp</math>,
<math>\displaystyle \sharp \notin V_{N}\cup V_{T}  </math> oraz prawa są postaci:  <math>\displaystyle u\rightarrow v  </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
, <math>\displaystyle \sharp u\rightarrow \sharp </math> lub  <math>\displaystyle u\sharp \rightarrow v\sharp  </math> ,
(\Sigma_T\setminus \left\{1\right\})^*</math> oraz dodatkowo <math>\displaystyle d_2</math> jest
gdzie  <math>\displaystyle u,v\in (V_{N}\cup V_{T})^{*</math> i w słowie  <math>\displaystyle </math> występuje co najmniej
konfiguracją końcową.
jeden symbol nieterminalny z  <math>\displaystyle V_{N}  </math> .
}}
Językiem generowanym przez tę gramatykę
nazywamy zbiór


Inaczej mówiąc funkcję <math>\displaystyle s(n)</math> nazywamy konstruowalną pamięciowo
<center><math>\displaystyle L(G_{\sharp })=\{w\in V_{T}^{*}:\: \sharp v_{0}\sharp \mapsto^{*}\sharp w\sharp \}. </math></center>
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||
Gramatyka z markerem końca  <math>\displaystyle G_{\sharp }  </math>  jest kontekstowa (typu  <math>\displaystyle 1  </math> ), jeśli
jej prawa
po wymazaniu markera  <math>\displaystyle \sharp  </math>  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:


Niech będzie dany język <math>\displaystyle L</math> oraz maszyna Turinga
{{twierdzenie|||
<math>\displaystyle \mathcal{TM}</math> akceptująca <math>\displaystyle L</math> w pamięci <math>\displaystyle s(n)</math>. Dla dowolnego
Dla dowolnej gramatyki kontekstowej z markerem końca istnieje
<math>\displaystyle \varepsilon>0</math> istnieje maszyna Turinga <math>\displaystyle \mathcal{TM}'</math> akceptująca <math>\displaystyle L</math> w
równoważna gramatyka
pamięci <math>\displaystyle \max\left\{n,\varepsilon s(n)\right\}</math>.
kontekstowa.
}}


{{dowod|||
(''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>
komórek pamięci do odczytania słowa wejściowego. Kompresja taśmy
zapewnia, że podczas symulowania maszyny <math>\displaystyle \mathcal{MT}</math> nie
wykorzystamy więcej niż <math>\displaystyle \lceil \frac{s(n)}{k}\rceil \leq \varepsilon s(n)</math>
komórek. Jednocześnie można założyć, że <math>\displaystyle \mathcal{MT}'</math> akceptuje
słowa wejściowe z języka <math>\displaystyle L</math> o długości mniejszej niż <math>\displaystyle k</math> bez
symulowania <math>\displaystyle \mathcal{MT}</math>.
}}
{{twierdzenie|Savitch||
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|||
{{dowod|||
Niech <math>\displaystyle \mathcal{NMT}</math> będzie niedeterministyczną maszyną Turinga
Niech <math>\displaystyle G_{\sharp }=(V_{N}\cup \{\sharp \},V_{T},v_{0},P)  </math> będzie dowolną
akceptującą język <math>\displaystyle L=L(\mathcal{NMT})</math> w pamięci <math>\displaystyle s(n)</math>. Niech
gramatyką kontekstową z markerem końca. Zakładamy, bez ograniczania ogólności
<math>\displaystyle k(n)</math> oznacza liczbę konfiguracji potrzebną do zaakceptowania słowa
rozważań, że w&nbsp;zbiorze  <math>\displaystyle P  </math>  nie występuje prawo  <math>\displaystyle v_{0}\rightarrow 1  </math>  
o długości <math>\displaystyle n</math>. Istnieje liczba <math>\displaystyle c>1</math> dla której <math>\displaystyle k(n)\leq
(po wymazaniu markera  <math>\displaystyle \sharp  </math> ). Dla każdego symbolu  <math>\displaystyle </math> ze zbioru
c^{s(n)}</math>, co z kolei oznacza, że każde słowo o długości <math>\displaystyle n</math> jest
<math>\displaystyle V=V_{N}\cup V_{T}  </math> określamy trzy symbole  <math>\displaystyle \, ^{\sharp }x,x^{\sharp },^{\: \sharp }x^{\sharp }  </math>  
akceptowane w <math>\displaystyle c^{s(n)}</math> krokach czasowych.
oraz oznaczamy odpowiednio przez  <math>\displaystyle \, ^{\sharp }V,V^{\sharp },^{\sharp }V^{\sharp }  </math>
zbiory tych symboli.  Dla  <math>\displaystyle u=u_{1}...u_{k} </math>  
takiego, że <math>\displaystyle k\geq 1  </math> <math>\displaystyle u_{i}\in V  </math> dla  <math>\displaystyle i=1,...,k  </math>  wprowadzamy także następujące oznaczenia:


Rozważmy algorytm:
<math>\displaystyle \, ^{\sharp }u=\, ^{\sharp }u_{1}u_{2}...u_{k}  </math>  ,  <math>\displaystyle u^{\sharp }=u_{1}...u_{k-1}u_{k}^{\sharp }  </math>
oraz  <math>\displaystyle \, ^{\sharp }u^{\sharp }=\, ^{\sharp }u_{1}u_{2}...u_{k-1}u_{k}^{\sharp }  </math>
gdy  <math>\displaystyle k>1  </math> .


{| border=1
Przy takich oznaczeniach definiujemy gramatykę
|+ <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
|-
|


|-
<center><math>\displaystyle G_{1}=(V_{N}\cup \, ^{\sharp }V\cup V^{\sharp }\cup ^{\sharp }V^{\sharp },V_{T},\, ^{\sharp }v_{0}^{\sharp },P_{1}), </math></center>
|


|}
w której zbiór praw  <math>\displaystyle P_{1} </math>  składa się ze wszystkich praw uzyskanych zgodnie
z poniższymi warunkami:
# jeśli  <math>\displaystyle u\rightarrow w\in P  </math>  , to  <math>\displaystyle u\rightarrow w,\: ^{\#}u\rightarrow \, ^{\#}w,\: u^{\#}\rightarrow w^{\#},\: ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1}  </math>
# jeśli  <math>\displaystyle \, ^{\#}u\rightarrow \, ^{\#}w\in P  </math>  , to  <math>\displaystyle \: u^{\#}\rightarrow w^{\#},\: ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1}  </math>
# jeśli  <math>\displaystyle u^{\#}\rightarrow w^{\#}\in P  </math>  , to  <math>\displaystyle u^{\#}\rightarrow w^{\#},\: ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1}  </math>
#  <math>\displaystyle \, ^{\#}x\rightarrow x,\: x^{\#}\rightarrow x,\: ^{\#}x^{\#}\rightarrow x\in P_{1}  </math>
dla wszystkich  <math>\displaystyle x\in V  </math> .


gdzie procedura Test ma następującą postać:
Określona w ten sposób gramatyka  <math>\displaystyle G_{1}  </math>  jest gramatyką rozszerzającą i równoważną
wyjściowej.
Dla gramatyki  <math>\displaystyle G_{1}  </math>  istnieje, zgodnie z poprzednim twierdzeniem,
równoważna gramatyka kontekstowa, co kończy dowód twierdzenia.


{| border=1
<math>\displaystyle \diamondsuit</math>   }}
|+ <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'''
|-
|


|}
Prawdziwe jest także następujące twierdzenie (porównaj [[##thr_1|Uzupelnic thr_1|]])


Przedstawiony algorytm można zrealizować za pomocą wielo-taśmowej
{{twierdzenie|||
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>\displaystyle v\rightarrow a  </math> , gdzie  <math>\displaystyle 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>\displaystyle G  </math>  jest rzędu  <math>\displaystyle n>0  </math> , jeśli dla każdego
<center> '''PSPACE''' <math>\displaystyle  = </math> '''NPSPACE''' </center>
prawa  <math>\displaystyle x\rightarrow y  </math> tej gramatyki spełniony jest warunek  <math>\displaystyle \mid x\mid \leq n </math>  
i  <math>\displaystyle \mid y\mid \leq n  </math> . Kolejne twierdzenie stwierdza możliwość dalszego
uproszczenia praw gramatyki rozszerzającej.


}}
{{twierdzenie|||
Dla każdej gramatyki rozszerzającej istnieje równoważna gramatyka rozszerzająca
rzędu  <math>\displaystyle 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|||
<math>\displaystyle \mathcal{MT}'</math> wykorzystująca
Gramatyka  <math>\displaystyle 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>\displaystyle 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>\displaystyle 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>\displaystyle v_{0}\notin \{x,z_{1},z_{2},v\} </math> .
</math> '''PSPACE''' <math>\displaystyle = </math> '''NPSPACE''' </center>


}}
}}


{{uwaga|||
{{twierdzenie|||
Nie jest znany przykład wykazujący silną inkluzję
Dla dowolnej gramatyki kontekstowej <math>\displaystyle G </math>  istnieje gramatyka liniowo ograniczona
  '''P''' <math>\displaystyle \varsubsetneq </math> '''NP''' ani dowód
<math>\displaystyle G_{1}  </math> , która jest równoważna  <math>\displaystyle G  </math> lub też generuje język <math>\displaystyle 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>\displaystyle G=(V_{N},V_{T},v_{0},P)  </math>
ma prawa wyłącznie w następujących postaciach:
#  <math>\displaystyle v_{0}\rightarrow 1  </math>
#  <math>\displaystyle v\rightarrow x  </math>  gdzie  <math>\displaystyle v\in V_{N},\: x\in V_{N}\cup V_{T}  </math>
#  <math>\displaystyle v\rightarrow v_{1}v_{2}  </math>  gdzie  <math>\displaystyle v,v_{1},v_{2}\in V_{N}  </math>
#  <math>\displaystyle v_{1}v_{2}\rightarrow v_{3}v_{4}  </math>  gdzie  <math>\displaystyle v_{1},v_{2},v_{3},v_{4}\in V_{N}  </math>


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


Niech <math>\displaystyle L_1,L_2</math> będą dowolnymi językami nad pewnym alfabetem
<math>\displaystyle \diamondsuit</math>   }}
<math>\displaystyle \Sigma_I</math>. Mówimy, że <math>\displaystyle L_1</math> redukuje się do <math>\displaystyle L_2</math> w czasie
wielomianowym, co oznaczamy <math>\displaystyle L_1 \propto L_2</math>, gdy istnieje
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
==Automat liniowo ograniczony==
<center><math>\displaystyle
w\in L_1 \quad \Longleftrightarrow \quad w' \in L_2.
</math></center>


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


{{lemat|||
{{definicja|||
Załóżmy, że <math>\displaystyle L_1 \propto L_2</math>. Wtedy zachodzą implikacje
Automatem liniowo ograniczonym nazywamy
# <math>\displaystyle L_2 \in </math> '''P''' <math>\displaystyle   \quad \Longrightarrow \quad L_1 \in </math> '''P'''
system  <math>\displaystyle \mathcal{A}_{LO}=(\Sigma _{T},S,P,s_{0},S_{F})  </math> , w którym  <math>\displaystyle \Sigma _{T}  </math>
# <math>\displaystyle L_2 \in  </math> '''NP''' <math>\displaystyle   \quad \Longrightarrow \quad L_1 \in </math> '''NP'''
jest skończonym alfabetem,  <math>\displaystyle S  </math>  skończonym zbiorem stanów, <math>\displaystyle S\cap \Sigma _{T}=\emptyset  </math>
# <math>\displaystyle L_2 \in </math> '''PSPACE''' <math>\displaystyle   \quad \Longrightarrow \quad L_1 \in </math> '''PSPACE'''
oraz wyróżniony jest podzbiór  <math>\displaystyle \Sigma _{I}\subset \Sigma _{T}  </math> . Zbiór  <math>\displaystyle \Sigma _{T}  </math>
zwany jest alfabetem ta{s}my, a  <math>\displaystyle \Sigma _{I} </math> - alfabetem wej{s}ciowym.
Wyróżnione są także: element  <math>\displaystyle \#\in \Sigma _{T}\setminus \Sigma _{I} </math> zwany
markerem końca, stan pocz{a}tkowy  <math>\displaystyle s_{0}\in S  </math>  oraz  <math>\displaystyle S_{F}\subset S </math>  
- zbiór stanów ko{n}cowych. Natomiast relacja przejść  <math>\displaystyle 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>\displaystyle (s_{1},\#)P(s_{2},a,k) </math> , to  <math>\displaystyle a=\#,  </math>
# jeśli  <math>\displaystyle (s_{1},a)P(s_{2},\#,k)  </math> , to  <math>\displaystyle a=\#. </math>  


}}
Fakt, że  <math>\displaystyle (s_{1},a)P(s_{2},b,k)  </math> ,  zapisujemy zazwyczaj jako  <math>\displaystyle (s_{1},a)\rightarrow (s_{2},b,k)  </math> .
Do opisu działania automatu liniowo ograniczonego wygodnie jest wprowadzić pojęcie
konfiguracji (podobnie jak dla automatów ze stosem).


{{dowod|||
Konfiguracją automatu liniowo ograniczonego jest
Dane słowo <math>\displaystyle w</math> transformujemy do <math>\displaystyle w'</math> w czasie wielomianowym, co
słowo  <math>\displaystyle vsw\in (\Sigma _{T}\cup S)^{*}  </math> ,
gwarantuje założenie <math>\displaystyle L_1 \propto L_2</math>. Dzięki założeniu <math>\displaystyle L_2 \in
w&nbsp;którym  <math>\displaystyle s\in S,\; v,w\in \Sigma _{T}^{*}  </math> . Pomiędzy dwoma konfiguracjami
</math> '''P''' możemy rozstrzygnąć czy <math>\displaystyle w'\in L_2</math> (tzn. jeśli
<math>\displaystyle d_{1},d_{2}  </math> zachodzi relacja bezpośredniego następstwa  <math>\displaystyle d_{1}\mapsto d_{2}  </math>  
akceptujemy <math>\displaystyle w'</math> to robimy to w czasie wielomianowym). Tym sposobem
wtedy i tylko wtedy, gdy spełniony jest jeden z&nbsp;niżej wypisanych warunków, gdzie
(korzystając z definicji transformacji wielomianowej) akceptujemy
<math>\displaystyle s_{1},s_{2}\in S  </math> <math>\displaystyle a,b,c\in \Sigma _{T}  </math>  oraz  <math>\displaystyle v,w\in \Sigma _{T}^{*}  </math>  
<math>\displaystyle w</math> w czasie wielomianowym, o ile tylko <math>\displaystyle w\in L_1</math>. Dowód dla
#  <math>\displaystyle d_{1}=vs_{1}aw  </math> ,  <math>\displaystyle d_{2}=vs_{2}bw  </math> oraz  <math>\displaystyle (s_{1},a)P(s_{2},b,0) </math>
pozostałych implikacji jest identyczny.
<math>\displaystyle d_{1}=vs_{1}aw  </math> , <math>\displaystyle d_{2}=vbs_{2}w </math>  oraz  <math>\displaystyle (s_{1},a)P(s_{2},b,1)  </math>  
}}
#  <math>\displaystyle d_{1}=vcs_{1}aw  </math> ,  <math>\displaystyle d_{2}=vs_{2}cbw  </math>  oraz  <math>\displaystyle (s_{1},a)P(s_{2},b,-1)  </math>


{{definicja|||
Przechodnie domknięcie relacji  <math>\displaystyle \mapsto  </math> oznaczać będziemy symbolem
Niech <math>\displaystyle \mathcal{C}</math> oznacza pewną klasę języków. Język <math>\displaystyle L</math> nazywamy
<math>\displaystyle \mapsto^{*} </math> i określać mianem obliczenia wykonanego przez automat
'''<math>\displaystyle \mathcal{C}</math>-trudnym''' jeśli spełniony jest warunek:
liniowo ograniczony.
<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
<math>\displaystyle L</math> nazywamy '''<math>\displaystyle \mathcal{C}</math>-zupełnym'''.
}}
}}


Intuicyjnie, fakt że język jest <math>\displaystyle \mathcal{C}</math>-zupełny oznacza że
{}
jest ona najbardziej skomplikowany (pod względem obliczeniowym)
wśród języków z klasy <math>\displaystyle \mathcal{C}</math>, natomiast język
<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>\displaystyle \mathcal{A}_{LO} </math>
Rozważmy języki:
to zbiór słów nad alfabetem  <math>\displaystyle \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
<center><math>\displaystyle 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>
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
Język  <math>\displaystyle L\subset \Sigma _{I}^{*</math> jest rozpoznawany (akceptowany) przez
następujący sposób:
automat liniowo ograniczony, jeśli istnieje automat  <math>\displaystyle \mathcal{A}_{LO}  </math> taki,
# Jeśli słowo wejściowe jest puste to stop.
że  <math>\displaystyle \mathcal{L}(\mathcal{A}_{LO})=L.  </math>  
# 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
{}{2900sp}
</math> na konfigurację <math>\displaystyle \sharp s_1 w' \sharp</math>, przy czym <math>\displaystyle w'=1^i 2^j 3^k</math>
tylko gdy <math>\displaystyle w=1^i 2^j 4^{2k}</math>. Zatem <math>\displaystyle w\in L_2</math> wtedy i tylko wtedy
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
(2256,2000)(1100,-1200)
tylko wypisać odpowiednią ilość symboli <math>\displaystyle 4</math> (a wiemy już jak
konstruować liczbę <math>\displaystyle 2n</math> mając dane <math>\displaystyle n</math>).
}}


==Języki maszyn Turinga i rodzina <math>\displaystyle \mathcal{L}_{0}</math>==
(1000,0){( 1, 0){3400}}


Powstaje naturalne pytanie o związki pomiędzy  klasą
(1100,0)(300,0){3}{(0, 1){300}}
języków rozpoznawanych przez maszyny Turinga, a klasami zadanymi
poprzez gramatyki. Odpowiemy na to pytanie w tej części
wykładu.


{{twierdzenie|||
(1200,100){ <math>\displaystyle {\sharp }  </math> }
Każdy język akceptowany przez maszynę Turinga jest typu
'''(0)'''.


<center><math>\displaystyle \mathcal{L}(MT)\subset \mathcal{L}_{0}</math></center>
(1900,100){ <math>\displaystyle {\cdots } </math> }


}}
(2300,0)(300,0){3}{(0, 1){300}}


{{dowod|||
(2400,100){ <math>\displaystyle { c}  </math> }
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
<math>\displaystyle f(s_{0},\#)=(s',\#,1)  </math> , jeśli para  <math>\displaystyle (s_{0},\#)  </math>  należy do
dziedziny funkcji przejść  <math>\displaystyle f  </math>  maszyny Turinga. Założenie to nie
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,
jak wskazuje oznaczenie, skojarzone są ze stanami końcowymi. Do
zbioru  <math>\displaystyle \overline{S}_{F}  </math>  należy każdy stan  <math>\displaystyle \overline{s}\in S
</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
<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
(2700,100){ <math>\displaystyle { a}  </math> }
symboli nieterminalnych  <math>\displaystyle V_{N}  </math>  zawiera wyłącznie
następujące symbole:
# dla każdego stanu  <math>\displaystyle s\in S  </math>  i  <math>\displaystyle a\in \Sigma _{T}\setminus \{\#\}  </math>  symbole
<math>\displaystyle v_{sa},\: ^{\#}v_{sa},\: v_{sa}^{\#},\: ^{\#}v_{sa}^{\#}  </math>
# dla każdej litery  <math>\displaystyle a\in \Sigma _{T}\setminus \{\#\}  </math> symbole  <math>\displaystyle \, ^{\#}a  </math>
i  <math>\displaystyle a^{\#}  </math>
# wszystkie elementy zbioru  <math>\displaystyle \Sigma _{T}\setminus (\Sigma _{I}\cup \{\#\})  </math>
# symbole  <math>\displaystyle v_{0},\: v_{1}  </math>  nie należące do  <math>\displaystyle \Sigma _{T}  </math>


Zbiór praw  <math>\displaystyle P  </math>  składa się z praw wymienionych poniżej:
(3100,100){ <math>\displaystyle {\cdots }  </math> }
#  <math>\displaystyle v_{0}\rightarrow \, ^{\#}v_{sa}^{\#}  </math> ,  <math>\displaystyle v_{0}\rightarrow v_{1}v_{sa}^{\#}  </math>
jeśli  <math>\displaystyle f(s,a)=(\overline{s},b,1)  </math>  dla pewnego  <math>\displaystyle b\in \Sigma
_{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
(3600,0)(300,0){3}{(0, 1){300}}
'''(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
(4000,100){ <math>\displaystyle {\sharp } </math> }
vbs_{k}'\#\rightarrow vs_{1}b\#</math></center>


jest traktowana jako jeden krok w
(1707,0){( 1, 0){2393}}
obliczeniu prowadzonym przez maszynę Turinga. I analogicznie
traktujemy sekwencję z markerem  <math>\displaystyle \#  </math>  występującym po lewej
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
(1000,300){( 1, 0){3400}}
bs_{k}'\#\rightarrow b\#s_{1},\quad s_{1}\in S_{F}.</math></center>


Wynika to z
{(2750,-342){( 0, 1){300}} }
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
(5450,0){( 1, 0){3400}}
_{TM}^{*}\#u\#s_{1}, </math></center>


gdzie  <math>\displaystyle u\in (\Sigma _{I}\setminus
(5600,0)(300,0){3}{(0, 1){300}}
\{\#\})^{*} </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'''
(5700,100){ <math>\displaystyle {\sharp }  </math> }
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
(6400,100){ <math>\displaystyle {\cdots } </math> }
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|||
(6800,0)(300,0){3}{(0, 1){300}}
Każdy język typu '''(0)''' jest językiem rekurencyjnie
przeliczalnym, czyli  <math>\displaystyle \mathcal{L}_{0}\subset \mathcal{RP} </math> .


}}
(6900,100){ <math>\displaystyle { c} </math> }


Język  <math>\displaystyle L  </math>  nazywamy '''rekurencyjnym'''
(7200,100){ <math>\displaystyle { b}  </math> }
jeśli istnieje efektywny algorytm
rozstrzygający dla każdego słowa  <math>\displaystyle w\in A^{*}  </math> jego
przynależność do języka  <math>\displaystyle L  </math> . Klasę języków
rekurencyjnych oznaczamy symbolem  <math>\displaystyle \mathcal{R} </math> .


Klasa języków kontekstowych zawiera się istotnie w klasie
(7600,100){ <math>\displaystyle {\cdots }  </math> }
języków rekurencyjnych, o czym przekonuje poniższe
twierdzenie.


{{twierdzenie|||
(8100,0)(300,0){3}{(0, 1){300}}
Każdy język kontekstowy ''''''jest językiem rekurencyjnym, czyli
<math>\displaystyle \mathcal{L}_{1}\subset \mathcal{R}.  </math>


}}
(8500,100){ <math>\displaystyle \sharp  </math> }


{{dowod|||
(5450,300){( 1, 0){3400}}
Niech  <math>\displaystyle L  </math>  będzie dowolnym językiem kontekstowym. Istnieje więc
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
kontekstowej wynika, że słowo puste  <math>\displaystyle 1\in L  </math>  wtedy i tylko
wtedy, gdy  <math>\displaystyle v_{0}\rightarrow 1\in P  </math> . Załóżmy teraz, że dane
jest słowo  <math>\displaystyle w\in V^{*}_{T} </math> , o którym mamy zadecydować,  czy
należy do języka  <math>\displaystyle L  </math> . W tym celu rozważmy wszystkie ciągi słów


<center><math>\displaystyle y_{0}=v_{0},\: y_{1},...,y_{n-1},\: y_{n}=w</math></center>
{(6950,-342){( 0, 1){300}} }


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
(2257,-1235){(893,893){ <math>\displaystyle { \large s_{1}} </math> }}
</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
(6500,-1235){(893,893){ <math>\displaystyle { \large s_{2}} </math> }}
y_{n-1}\rightarrow y_{n}=w. </math></center>


Ponieważ ilość ciągów podlegających rozważaniom jest
{0.2cm}
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:
Opiszemy teraz możliwe ruchy automatu liniowo ograniczonego. Automat ten
mo{z}e czyta{c} s{}owo wej{s}ciowe w
dwóch kierunkach. Jego głowica mo{z}e porusza{c} si{e} w lewo lub w
prawo. Automat mo{z}e wymienia{c} czytan{a} liter{e} na inn{a},
ale nie rozszerza miejsca zaj{e}tego na ta{s}mie przez czytane słowo.
Działa  niedeterministycznie. Czytaj{a}c liter{e}  <math>\displaystyle a  </math>  będąc
w stanie  <math>\displaystyle s  </math>  automat ma kilka mo{z}liwo{s}ci dzia{}ania. Może
mianowicie:
# zamieni{c} literę na inn{a} liter{e} i/lub zmienić stan na inny - zgodnie
z warunkiem 1. Głowica czytająca automatu pozostaje w poprzedniej pozycji,
# zamieni{c} literę na inn{a} liter{e} i/lub zmienić stan na inny - zgodnie
z warunkiem 2. Głowica czytająca automatu przesuwa się w prawo,
# zamieni{c} literę na inn{a} liter{e} i/lub zmienić stan na inny - zgodnie
z warunkiem 3. Głowica czytająca automatu przesuwa się w lewo.


<center><math>\displaystyle \mathcal{L}(MT)\subset \mathcal{L}_{0}\subset \mathcal{RP}</math></center>
Związek pomiędzy rodziną języków kontekstowych a wprowadzoną rodziną automatów liniowo
ograniczonych ustalają ponizsze twierdzenia.


W określeniu języka rekurencyjnie przeliczalnego oraz języka
{{twierdzenie|||
rekurencyjnego wystąpiło pojęcie efektywnego algorytmu,
Dla dowolnego języka kontekstowego  <math>\displaystyle L  </math>  istnieje automat liniowo ograniczony
efektywnej procedury. Pojęcie to, intuicyjnie dość jasne, nie
<math>\displaystyle \mathcal{A}_{LO}  </math>  taki, że <math>\displaystyle \mathcal{L}(\mathcal{A}_{LO})=L  </math> .
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'''
}}


''Każda efektywna''
{{dowod|||
''procedura (algorytm) da się opisać przez maszynę Turinga. ''
Można założyć,
 
bez ograniczenia ogólności naszych rozważań, że gramatyka  <math>\displaystyle G=(V_{N},V_{T},v_{0},P) </math>
Konsekwencją przyjęcia Tezy Churcha jest inkluzja <math>\displaystyle \mathcal{RP}\subset \mathcal{L}(MT)  </math> . Biorąc pod uwagę udowodnione
generująca język  <math>\displaystyle L  </math>  ma prawa wyłącznie następujących postaci:
powyżej twierdzenia mamy
# (G)  <math>\displaystyle v\rightarrow x  </math> , gdzie <math>\displaystyle v\in V_{N},x\in V_{N}\cup V_{T},x\neq v_{0}  </math>
# (G)  <math>\displaystyle v_{0}\rightarrow v_{0}v_{1}  </math> , gdzie  <math>\displaystyle v_{1}\in V_{N},v_{1}\neq v_{0} </math>
# (G) <math>\displaystyle v_{1}v_{2}\rightarrow v_{3}v_{4} </math> , gdzie  <math>\displaystyle v_{1},...,v_{4}\in V_{N},v_{3},v_{4}\neq v_{0}  </math>
# (G)  <math>\displaystyle v_{0}\rightarrow 1,  </math>  jeśli  <math>\displaystyle 1\in L  </math> .


<center><math>\displaystyle \mathcal{L}(MT)\subset \mathcal{L}_{0}\subset \mathcal{RP}</math></center>
Określamy automat liniowo ograniczony  <math>\displaystyle \mathcal{A}_{LO}=(\Sigma _{T},S,P,s_{0},S_{F})  </math> ,
przyjmując  <math>\displaystyle \Sigma _{T}=V_{N}\cup V_{T}\cup \{\#,\flat \}  </math> ,  <math>\displaystyle S=\{s_{0},s_{1},s_{2},s_{3},s_{4}\}\cup \{s_{v_{1}}:  \displaystyle v_{1}v_{2}\rightarrow v_{3}v_{4}\in P\}  </math> ,
<math>\displaystyle \Sigma _{I}=V_{N}\cup V_{T}  </math>  ,  <math>\displaystyle S_{F}=\{s_{3}\}  </math> ,  <math>\displaystyle s_{0}  </math>  -
stan początkowy. Relacja przejść automatu  <math>\displaystyle \mathcal{A}_{LO}  </math>  zdefiniowana
jest poniżej:
# (A)  <math>\displaystyle (s_{0},\#)\rightarrow (s_{0},\#,1)  </math>
# (A)  <math>\displaystyle (s_{0},\#)\rightarrow (s_{4},\#,1)  </math>  jeśli  <math>\displaystyle 1\in L </math>
# (A)  <math>\displaystyle (s_{0},x)\rightarrow (s_{0},x,1)  </math>  ,  <math>\displaystyle (s_{0},x)\rightarrow (s_{0},x,-1)  </math>
dla każdego  <math>\displaystyle x\in V_{N}\cup V_{T}  </math>
# (A)  <math>\displaystyle (s_{0},x)\rightarrow (s_{0},v,0)  </math>  jeśli  <math>\displaystyle v\rightarrow x\in P  </math>
i  <math>\displaystyle x\neq v_{0}  </math>
# (A)  <math>\displaystyle (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>\displaystyle v_{1}v_{2}\rightarrow v_{3}v_{4}\in P  </math>
# (A)  <math>\displaystyle (s_{0},v_{0})\rightarrow (s_{1},v_{0},-1)  </math>
# (A)  <math>\displaystyle (s_{1},\#)\rightarrow (s_{2},\#,1)  </math>
# (A) <math>\displaystyle (s_{1},\flat )\rightarrow (s_{2},\flat ,1)  </math>
# (A)  <math>\displaystyle (s_{2},v_{0})\rightarrow (s_{3},\flat ,1)  </math>
# (A)  <math>\displaystyle (s_{3},v_{1})\rightarrow (s_{0},v_{0},0)  </math> , gdy  <math>\displaystyle v_{0}\rightarrow v_{0}v_{1}\in P  </math>  
# (A)  <math>\displaystyle (s_{3},\#)\rightarrow s_{3},\#,1),\; (s_{4},\#)\rightarrow (s_{3},\#,1)  </math>  


co ostatecznie prowadzi do równości <math>\displaystyle \mathcal{L}_{0}=\mathcal{L}(MT) </math> .
Określony automat <math>\displaystyle \mathcal{A}_{LO} </math>  rozpoznaje
tylko te słowa, które są generowane przez gramatykę  <math>\displaystyle G  </math> , symulując wstecz
każde wyprowadzenie gramatyki  <math>\displaystyle G </math> .


==Rodziny <math>\displaystyle \mathcal{L}_{1}</math> i <math>\displaystyle \mathcal{L}_{0}</math> - zamkniętość na działania==
<math>\displaystyle \diamondsuit</math>   }}


Dla kompletności tej części wykładu przedstawimy własności
Prawdziwe jest również następujące twierdzenie.
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|||
{{twierdzenie|||
Dla każdej gramatyki istnieje równoważna gramatyka tego
Dla dowolnego języka  <math>\displaystyle L  </math>  rozpoznawanego przez automat liniowo ograniczony
samego typu taka, że każda produkcja, w której występuje symbol
<math>\displaystyle \mathcal{A}_{LO}  </math>  istnieje gramatyka kontekstowa <math>\displaystyle G </math> taka, że <math>\displaystyle L(G)=L </math> .
terminalny <math>\displaystyle a </math> , jest postaci <math>\displaystyle v\longrightarrow a </math> .


}}
}}


Elementarny dowód tej własności pozostawiamy jako zadanie
W dowodzie konstruuje się odpowiednią gramatykę.Zasada tej konstrukcji
domowe.
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|||
{{twierdzenie|||
Rodziny <math>\displaystyle \mathcal{L}_{0}  </math>  i <math>\displaystyle \mathcal{L}_{1} </math>  są zamknięte
Dla dowolnych języków kontekstowych <math>\displaystyle L_{1},L_{2}\subset A^{*}  </math>  iloczyn
ze względu na
mnogościowy tych języków <math>\displaystyle L_{1}\cap L_{2}  </math>  jest językiem kontekstowym
#  sumę mnogościową,
#  iloczyn mnogościowy,
#  katenację,
#  iterację `{} <math>\displaystyle * </math> `{},
# odbicie zwierciadlane.


}}
}}


{{dowod|||
{{dowod|||
{}
( szkic)
Załóżmy, że języki  <math>\displaystyle L_{1},L_{2}  </math>  są rozpoznawane przez automaty
liniowo ograniczone,  <math>\displaystyle \mathcal{A}^{1}_{LO}  </math>  i  <math>\displaystyle \mathcal{A}_{LO}^{2}  </math> .
Opiszemy konstrukcję automatu liniowo ograniczonego  <math>\displaystyle \mathcal{A}_{LO}  </math> ,
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  <math>\displaystyle \mathcal{A}_{LO}  </math>  dubluje litery,
to znaczy w miejsce litery  <math>\displaystyle a  </math>  wprowadza parę  <math>\displaystyle (a,a)  </math> . Po zakończeniu
tej procedury automat wraca do skrajnej lewej pozycji i rozpoczyna symulację
automatu  <math>\displaystyle \mathcal{A}^{1}_{LO}  </math> . Jeśli ta symulacja doprowadzi do zaakceptowania
czytanego słowa przez automat  <math>\displaystyle \mathcal{A}^{1}_{LO}  </math> , to automat  <math>\displaystyle \mathcal{A}_{LO}  </math>
rozpoczyna obliczenie od początku, symulując teraz pracę automatu  <math>\displaystyle \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>\displaystyle \mathcal{A}_{LO}  </math>  rozpoznaje
język  <math>\displaystyle L_{1}\cap L_{2}  </math> , a to w świetle udowodnionego powyżej twierdzenia
oznacza, że przecięcie języków kontekstowych  <math>\displaystyle L_{1}\cap L_{2}  </math>  jest językiem
kontekstowym.
<math>\displaystyle \diamondsuit</math>  }}
 
Ponieważ dalsze własności domknietoś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 bedzie mieć
miejsce w następnym wykładzie.
 
==Maszyna Turinga==
 
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 ?


[[##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
Jednotaśmowa maszyna Turinga jest podobna w swej idei do automatu
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> .
liniowo ograniczonego, pominięte jednak zostaje, jak wspomnieliśmy, ograniczenie
Określamy gramatykę  <math>\displaystyle G  </math>  typu  <math>\displaystyle (1)  </math>  (typu  <math>\displaystyle (0)  </math> )
dostępu do pamięci. Omawiana maszyna jest abstrakcyjnym tworem w
generującą język  <math>\displaystyle L_{1}\cup L_{2}  </math> .
skład którego wchodzą:


Jeśli <math>\displaystyle 1\notin L_{1}\cup L_{2}  </math> , to przyjmujemy
; --
: dwustronnie nieskończona taśma zbudowana z komórek
zawierających symbole z pewnego zadanego alfabetu


<center><math>\displaystyle G=(V_{N}^{1}\cup V_{N}^{2}\cup \left\{ v_{0}\right\}
; --
,V_{T},v_{0},P_{1}\cup P_{2}\cup \left\{ v_{0}\rightarrow
:  głowica która może czytać i zapisywać symbole w
v_{0}^{1},\, v_{0}\rightarrow v_{0}^{2}\right\} ).</math></center>
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


Zauważmy, że wówczas w żadnej z gramatyk nie ma prawa wymazującego.
; --
Jeśli natomiast <math>\displaystyle 1\in L_{1}\cup L_{2}  </math> , to konstruujemy
: działający sekwencyjnie mechanizm odpowiedzialny za sterowanie maszyną.
gramatykę  <math>\displaystyle G  </math>  dla języków  <math>\displaystyle L_{1}\setminus \left\{ 1\right\}
Mechanizm ten na podstawie symbolu odczytanego z komórki pod głowicą
</math>  i  <math>\displaystyle L_{2}\setminus \left\{ 1\right\}  </math> , jak powyżej, a
oraz stanu w którym aktualnie znajduje się maszyna, dokonuje zapisu
następnie dodajemy nowy symbol początkowy  <math>\displaystyle \overline{v}_{0}  </math>  i
symbolu w tejże komórce, przechodzi do kolejnego stanu i przesuwa
prawa  <math>\displaystyle \overline{v}_{0}\rightarrow v_{0},\,
głowicę w prawo, lewo lub też nie zmienia pozycji głowicy.
\overline{v}_{0}\rightarrow 1  </math> .


[[##Liloczyn|Uzupelnic Liloczyn|]]. Przecięcie udowodnimy tylko dla języków typu  <math>\displaystyle (0)
Podamy teraz formalną
</math> . Dowód dla języków kontekstowych został przeprowadzony
definicję maszyny Turinga. Aby zachować analogię do poprzednich wykładów,
wcześniej.
zdefiniujemy maszynę  w języku konfiguracji.


Niech dla <math>\displaystyle i=1,2  \displaystyle G_{i}=(V_{N}^{i},V_{T},v_{0}^{i},P_{i}) </math>  
{{definicja|||
będą gramatykami typu <math>\displaystyle (0) </math> , takimi, że <math>\displaystyle V_{N}^{1}\cap
'''(Jednotaśmowa deterministyczna) maszyna Turinga''' jest to
V_{N}^{2}=\emptyset  </math> . Niech <math>\displaystyle L_{i}=L(G_{i}) </math> . Określamy
system <math>\displaystyle \mathbf{MT}=(\Sigma _{T},S,f,s_{0},S_{F})  </math> , w którym
gramatykę <math>\displaystyle G </math>  typu <math>\displaystyle (0) </math>  generującą język <math>\displaystyle L_{1}\cap L_{2}
<math>\displaystyle \Sigma _{T}  </math> jest skończonym alfabetem, <math>\displaystyle S </math>  
</math> przyjmując
skończonym zbiorem stanów,  <math>\displaystyle S\cap \Sigma _{T}=\emptyset  </math>  oraz
wyróżniony jest podzbiór  <math>\displaystyle \Sigma _{I}\subset \Sigma _{T}  </math> . Zbiór
<math>\displaystyle \Sigma _{T} </math>  zwany jest alfabetem taśmy, a  <math>\displaystyle \Sigma _{I}
</math> - alfabetem wejściowym. Wyróżnione są także: element <math>\displaystyle \#\in \Sigma _{T}\setminus \Sigma _{I}  </math> zwany markerem końca, stan
początkowy <math>\displaystyle s_{0}\in S </math>  oraz <math>\displaystyle S_{F}\subset S </math>  - zbiór
stanów końcowych. Natomiast '''funkcja przejść''' jest funkcją
częściową <math>\displaystyle f:\: (S\times \Sigma _{T})\rightarrow (S\times \Sigma
_{T}\times \{-1,0,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
'''Konfiguracją maszyny Turinga''' jest słowo  <math>\displaystyle vsw\in (\Sigma
P),</math></center>
_{T}\cup S)^{*}  </math> , w którym  <math>\displaystyle s\in S,\; v,w\in \Sigma _{T}^{*}
</math> . Pomiędzy dwiema konfiguracjami  <math>\displaystyle d_{1},d_{2}  </math>  zachodzi
'''relacja bezpośredniego następstwa'''  <math>\displaystyle d_{1}\mapsto d_{2} </math>
wtedy i&nbsp;tylko wtedy, gdy spełniony jest jeden z niżej wypisanych
warunków, gdzie  <math>\displaystyle s_{1},s_{2}\in S  </math> , <math>\displaystyle a,b,c\in \Sigma _{T} </math>
oraz  <math>\displaystyle v,w\in \Sigma _{T}^{*}  </math>
#  <math>\displaystyle d_{1}=vs_{1}aw  </math> ,  <math>\displaystyle d_{2}=vs_{2}bw  </math>  oraz  <math>\displaystyle f(s_{1},a)=(s_{2},b,0)  </math>
#  <math>\displaystyle d_{1}=vs_{1}aw  </math> , <math>\displaystyle d_{2}=vbs_{2}w  </math>  oraz  <math>\displaystyle f(s_{1},a)=(s_{2},b,1)  </math>
i  <math>\displaystyle w\neq 1  </math>
#  <math>\displaystyle d_{1}=vs_{1}\#  </math> ,  <math>\displaystyle d_{2}=vbs_{2}\#  </math>  oraz  <math>\displaystyle f(s_{1},\#)=(s_{2},b,1)  </math>
#  <math>\displaystyle d_{1}=vcs_{1}aw  </math> ,  <math>\displaystyle d_{2}=vs_{2}cbw  </math>  oraz  <math>\displaystyle f(s_{1},a)=(s_{2},b,-1)  </math>
#  <math>\displaystyle d_{1}=s_{1}\#w  </math> , <math>\displaystyle d_{2}=s_{2}\#bw  </math> oraz  <math>\displaystyle f(s_{1},\#)=(s_{2},b,-1)  </math>  


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> ,
Przechodnie domknięcie relacji <math>\displaystyle \mapsto </math>  oznaczać będziemy
a do zbioru  <math>\displaystyle P </math>  należą prawa <br>
symbolem <math>\displaystyle \mapsto^{*}  </math> i określać mianem '''obliczenia
(1) <math>\displaystyle v_{0}\rightarrow \overline{v}_{1}v_{0}^{1}\overline{v}_{2}v_{0}^{2}\overline{v}_{1}  </math> <br>
wykonanego''' przez maszynę Turinga. Konfiguracja <math>\displaystyle d_{1}\in (\Sigma
(2) <math>\displaystyle \overline{v}_{2}a\rightarrow v_{a}\overline{v}_{2} </math>  dla  <math>\displaystyle \forall a\in V_{T}  </math> <br>
_{T}\cup S)^{*}  </math> jest '''końcowa''', jeśli stąd, że <math>\displaystyle d_{1}\mapsto d_{2}  </math> , wynika <math>\displaystyle d_{2}=d_{1}. </math>  Mówimy, że maszyna
(3) <math>\displaystyle bv_{a}\rightarrow v_{a}b </math> dla  <math>\displaystyle \forall a,b\in V_{T}  </math> <br>
Turinga '''zatrzymuje się''' w <math>\displaystyle d_{1}  </math> wtedy i tylko wtedy,
(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>
gdy <math>\displaystyle d_{1} </math>  jest konfiguracją końcową.
(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}\,
}}
:\, w_{1}\in L_{1},\, w_{2}\in L_{2}\right\} .</math></center>


Z dowolnego słowa należącego do tego zbioru, korzystając
Zauważmy, że wprowadzenie markera końca jest zabiegiem czysto formalnym. Pozwala
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
on z jednej strony na oznaczenie słowa wejściowego a z drugiej
tylko wtedy, gdy  <math>\displaystyle w_{1}=w_{2}  </math> . Korzystając z prawa (5)
strony wskazuje na elementy taśmy które były zmieniane (czy to przez
dostajemy słowo  <math>\displaystyle w_{1}  </math> . A więc  <math>\displaystyle L(\overline{G})=L_{1}\cap
wprowadzenie słowa wejściowego czy też poprzez ruch głowicy).
L_{2}  </math> .


[[##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
{{definicja|||
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
Język rozpoznawany przez maszynę Turinga <math>\displaystyle MT </math>  jest to zbiór
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
<center><math>\displaystyle 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>


<center><math>\displaystyle G=(V_{N}^{1}\cup V_{N}^{2}\cup \left\{ v_{0}\right\}
}}
,V_{T},v_{0},P_{1}\cup P_{2}\cup \left\{ v_{0}\rightarrow
v_{0}^{1}v_{0}^{2}\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
Język <math>\displaystyle L\subset \Sigma _{I}^{*}  </math> jest rozpoznawany (akceptowany)
\left\{ 1\right\}   </math> . Wówczas
przez maszynę Turinga, jeśli istnieje <math>\displaystyle MT  </math>  taka, że  <math>\displaystyle L(\mathcal{MT})=L.  </math>  Klasę języków rozpoznawanych przez maszynę
Turinga oznaczamy  <math>\displaystyle \mathcal{L}(MT)  </math> .


<center><math>\displaystyle L_{1}L_{2}=\left\{ \begin{array} {lll}
We wprowadzonym przez nas ujęciu formalnym, działanie maszyny
L_{1}'L_{2}'\cup L_{1}' & gdy & 1\in L_{2},\: 1\notin L_{1}\\
Turinga należy wyobrażać sobie następująco. W pierwszym etapie na
L_{1}'L_{2}'\cup L_{2}' & gdy & 1\in L_{1},\: 1\notin L_{2}\\
taśmę zostają zapisane symbole słowa wejściowego (z alfabetu
L_{1}'L_{2}'\cup L_{1}'\cup L_{2}'\cup \left\{ 1\right\}  & gdy &
<math>\displaystyle \Sigma_I</math>) a następnie komórki przyległe zostają oznaczone
1\in L_{1},\: 1\in L_{2}
symbolami <math>\displaystyle \sharp</math>. Jednocześnie maszyna jest sprowadzana do stanu
\end{array} \right. </math></center>
<math>\displaystyle s_0</math> 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 <math>\displaystyle 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>\displaystyle 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&nbsp;[[##WnL+Stop|Uzupelnic WnL+Stop|]]).
W pierwszej kolejności przedstawiamy dwa przykłady:


Wykorzystując poprzednią konstrukcję i zamkniętość
{{przyklad|||
ze względu na sumę w każdym z tych przypadków otrzymujemy gramatykę
Skonstruujemy maszynę Turinga <math>\displaystyle MT_1</math> która rozpoznaje język postaci
generującą katenację języków  <math>\displaystyle L_{1}  </math> <math>\displaystyle L_{2} </math> .
<math>\displaystyle L=\left\{0^{2^n}\; : \; n\geq 0\right\}</math>. Zamierzone działanie maszyny
<math>\displaystyle MT_1</math> można opisać następująco:


[[##Literacja|Uzupelnic Literacja|]]. Niech  <math>\displaystyle G=(V_{N},V_{T},v_{0},P)  </math>  będzie
; 1.
gramatyką typu <math>\displaystyle (1)  </math>  (typu  <math>\displaystyle (0)  </math> ) taką, że symbole
: Przejdź od lewego markera do prawego zaznaczając symbolem <math>\displaystyle \diamondsuit</math> co
terminalne nie występują po lewej stronie żadnej produkcji z  <math>\displaystyle P
drugie <math>\displaystyle 0</math>.
</math> . Załóżmy też, że  <math>\displaystyle 1\notin L=L(G)  </math> . Gramatyka


<center><math>\displaystyle \overline{G}=(V_{N}\cup \left\{
; 2.
\overline{v}_{0},\overline{v}_{1}\right\}
:  Jeśli było tylko jedno <math>\displaystyle 0</math> to '''akceptuj'''.
,V_{T},\overline{v}_{0},\overline{P}),</math></center>


gdzie
; 3.
:  Jeśli w kroku 1. obszar pomiędzy markerami zawierał
nieparzystą ilość <math>\displaystyle 0</math> to '''odrzuć'''.


<center><math>\displaystyle \overline{P}=P\cup \begin{array} [t]{l}
; 4.
\left\{ \overline{v}_{0}\rightarrow 1,\: \overline{v}_{0}\rightarrow v_{0},\: \overline{v}_{0}\rightarrow \overline{v}_{1}v_{0}\right\} \cup \\
: Powróć do lewego markera.
\left\{ \overline{v}_{1}a\rightarrow \overline{v}_{1}v_{0}a\, :\, a\in V_{T}\right\} \cup \\
\left\{ \overline{v}_{1}a\rightarrow v_{0}a\, :\, a\in V_{T}\right\}
\end{array} </math></center>


generuje język  <math>\displaystyle L^{*}  </math> . Jeśli  <math>\displaystyle 1\in L  </math> , to usuwamy prawo
; 5.
wymazujące <math>\displaystyle v_{0}\rightarrow 1 </math>  i dla języka  <math>\displaystyle L\setminus
: Powtórz działanie od 1.
\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ą
Zwróćmy uwagę, że o ile jasne jest w jaki sposób maszyna ma
typu  <math>\displaystyle (1)  </math>  (typu  <math>\displaystyle (0)  </math> ) taką, że  <math>\displaystyle L(G)=L  </math> , to gramatyka
akceptować słowa wejściowe, odrzucanie tych słów nie zostało
<math>\displaystyle \overleftarrow{G}=(V_{N},V_{T},v_{0},\overleftarrow{P}) </math> , gdzie
zdefiniowane. Aby ominąć ten problem, wprowadzimy jeden dodatkowy
<math>\displaystyle \overleftarrow{P}=\left\{ \overleftarrow{x}\rightarrow
stan (nie należący do stanów końcowych) po osiągnięciu którego
\overleftarrow{y}\, :\, x\rightarrow y\in P\right\}  </math>  generuje
maszyna się zatrzymuje (tzn. nie wykonuje ruchów i przepisuje na
język  <math>\displaystyle \overleftarrow{L}  </math> . }}
taśmie wciąż ten sam symbol).


Zauważmy na koniec, że rodzina  <math>\displaystyle \mathcal{L}_{0}  </math> nie jest
Określamy kolejno elementy składowe maszyny <math>\displaystyle MT_1</math>:
zamknięta ze względu na uzupełnienie.
<center><math>\displaystyle  
Stwierdzenie to
\Sigma_I=\left\{0\right\}\quad,\quad
wynika z przyjęcia jako obowiązujacej Tezy Churcha, która w tym
\Sigma_T=\left\{0,\diamondsuit,\clubsuit,\sharp\right\}
wypadku implikuje równość rodziny języków  <math>\displaystyle \mathcal{L}_{0}  </math>  i
</math></center>
rodziny języków rekurencyjnie przeliczalnych oraz z faktu,
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} {  
<center><math>\displaystyle
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>
 
Pozostaje jeszcze zdefiniować funkcję przejść.


{| border=1
{| border=1
|+ <span style="font-variant:small-caps">Uzupelnij tytul</span>
|+ <span style="font-variant:small-caps">Uzupelnij tytul</span>
|-  
|-  
|   ||  3 ||  
|  
2 ||  1 ||  
<math>\displaystyle (s_0,\sharp)\mapsto (s_R,\sharp,0)</math>  ||  <math>\displaystyle (s_1,\diamondsuit)\mapsto(s1,\diamondsuit,1)</math>
0
|-
|  
<math>\displaystyle (s_0,0)\mapsto(s_1,\clubsuit,1)</math>  ||  <math>\displaystyle (s_1,0)\mapsto(s_2,\diamondsuit,1)</math>
|-
|  || <math>\displaystyle (s_1,\sharp)\mapsto(s_A,\sharp,0)</math>
|-
|
<math>\displaystyle (s_2,\diamondsuit)\mapsto(s_2,\diamondsuit,1)</math>  ||  <math>\displaystyle (s_3,0)\mapsto(s_2,\diamondsuit,1)</math>
|-
|-
|   <math>\displaystyle \cup  </math>  ||  T ||  T ||  T ||
|  
T
<math>\displaystyle (s_2,\sharp)\mapsto(s_4,\sharp,-1)</math>  ||  <math>\displaystyle (s_3,\diamondsuit)\mapsto(s_3,\diamondsuit,1)</math>
|-
|-
|   <math>\displaystyle \cdot  </math>  ||  T ||  T ||  T ||
|  
T
<math>\displaystyle (s_2,0)\mapsto(s_3,0,1)</math>  ||  <math>\displaystyle (s_3,\sharp)\mapsto(s_R,\sharp,0)</math>
|-
|-
|   <math>\displaystyle \star  </math> ||  T ||  T ||  T ||
|
T
<math>\displaystyle (s_4,0)\mapsto(s_4,0,-1)</math>  
|-
|-
|   <math>\displaystyle \setminus  </math> ||  T ||  N ||  T ||
| <math>\displaystyle (s_4,\diamondsuit)\mapsto(s_4,\diamondsuit,-1)</math>  
N
|-
|-
|   <math>\displaystyle \cap  </math> ||  T || N ||  T ||
| <math>\displaystyle (s_4,\clubsuit)\mapsto(s_2,\clubsuit,1)</math>  
T
|-
|   
<math>\displaystyle (s_A,\sharp)\mapsto(s_A,\sharp,0)</math> ||  <math>\displaystyle (s_R,\sharp)\mapsto(s_R,\sharp,0)</math>
|-
|-
|  
|  
Linia 856: Linia 590:
|}
|}


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


Na koniec podamy
RYSUNEK ja-lekcja12-w-rys1 <br>       
twierdzenie o  wzajemnych relacjach pomiędzy
Łatwo zauważyć że wprowadzona funkcja przejścia określa maszynę
rodzinami języków z hierarchii Chomsky'ego. Dowód tego twierdzenia
spełniającą postawione przez nas warunki. Symbol <math>\displaystyle \clubsuit</math> został
wynika w&nbsp;części  z definicji typów gramatyk wprowadzonych na wykładzie 2, a w części
wprowadzony dla odróżnienia wystąpienia pojedynczego zera od
z udowodnionych własności poszczególnych rodzin języków z
sytuacji gdy liczba zer jest nieparzysta i większa od <math>\displaystyle 1</math>.
hierarchii Chomsky'ego (zakładając obowiązywanie Tezy Churcha).


{{twierdzenie|||
Aby lepiej zrozumieć działanie maszyny <math>\displaystyle MT_1</math> zasymulujemy jej
Rodziny języków  hierarchii Chomsky'ego spełniają następujące relacje
działanie na dwóch słowach wejściowych, przy czym pierwsze z nich
 
będzie należało do języka <math>\displaystyle L</math>, a drugie nie.
<center><math>\displaystyle \mathcal{L}_{0}\subseteq \! \! \! \! \! \! _{/}\, \mathcal{L}_{1}
<center><math>\displaystyle  
\subseteq \! \! \! \! \! \! _{/}\, \mathcal{L}_{2}
\begin{array} {c c c c c c c c}
\subseteq \! \! \! \! \! \! _{/}\, \mathcal{L}_{3}
&\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>
</math></center>


.
Wykazaliśmy więc, że <math>\displaystyle \sharp s_0 0000 \sharp
\mapsto^* \sharp \clubsuit \diamondsuit \diamondsuit \diamondsuit
s_A \sharp</math>. Zatem <math>\displaystyle 0^4 \in L(MT_1)</math>.


}}
ANIMACJA  ja-lekcja12-w-anim1         


==Problemy rozstrzygalne==
Dla porównania:
<center><math>\displaystyle
\begin{array} {c c c c c c c c}
&\sharp s_0 000 \sharp & \mapsto & \sharp \clubsuit s_1 00 \sharp
&\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>


W poprzednim wykładzie uzasadniliśmy, że dla każdej
Czyli zgodnie z naszym założeniem <math>\displaystyle 0^3\not \in L(MT_1)</math>
deterministycznej maszyny Turinga jesteśmy w stanie wskazać taką
która akceptuje dany język i jednocześnie zatrzymuje się tylko na
słowach akceptowanych. Wymagało to przejścia przez maszynę
niedeterministyczną a następnie jej symulację na maszynie
deterministycznej. Z tego powodu ograniczamy się w dalszej części
wykładu tylko do tego typu maszyn Turinga (akceptacja<nowiki>=</nowiki>stop). Jak to
uzasadniono wcześniej, przy założeniu Tezy Churcha, maszyna Turinga
może być rozpatrywana jako matematycznie ścisła definicja algorytmu.


Pojęcie rozstrzygalnego problemu zostało wprowadzone wcześniej, na innym
ANIMACJA  ja-lekcja12-w-anim1    }}
wykładzie i jest ono znane.
Przypomnijmy więc tylko,
że rozstrzygalność czy też
nierozstrzygalność odnosi się do pewnej klasy, którą tworzą
określone przypadki ustalonego problemu. Jeśli istnieje algorytm,
który rozwiązuje taki problem dla wszystkich przypadków w tej
klasy, to mówimy, że problem jest rozstrzygalny (w tej klasie). Zatem
taki algorytm jest uniwersalnym sposobem rozwiązywania problemu dla
wszystkich danych wejściowych określających poszczególne przypadki w tej
klasie. Jak łatwo zauważyć dla ustalenia rozstrzygalności problemu wystarczy się
opierać na intuicyjnym pojęciu algorytmu. Są jednak
takie problemy, dla których nie istnieje, w rozważanej klasie
przypadków, uniwersalny sposób ich rozwiazywania. Takie problemy
nazywamy nierozstrzygalnymi w danej klasie. Aby wykazać
nierozstrzygalność jakiegoś problemu, nieodzownym jest sformalizowanie pojęcia
algorytmu.
Standardowo taką formalizacją jest, o czym
wspomniano już wcześniej, maszyna Turinga.


Zwróćmy uwagę, że maszyna Turinga akceptuje języki, gdy tym czasem
{{przyklad|||
przyzwyczajeni jesteśmy, że algorytmy (programy) rozwiązują pewne,
Przedstawimy maszynę Turinga <math>\displaystyle MT_2</math> akceptującą język
niekiedy bardzo skomplikowane problemy (określone przy pomocy list,
<center><math>\displaystyle  
kolejek, grafów itp.). Zwracamy zatem uwagę na fakt, że w przypadku
L=\left\{w \overleftarrow{w} \: : \: w\in \left\{0,1\right\}^*\right\}
maszyny Turinga musimy wykonać wstępne umowne kodowanie naszego
</math></center>
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
gdzie <math>\displaystyle \overleftarrow{w}</math> oznacza lustrzane odbicie słowa <math>\displaystyle w</math>.
w&nbsp;klasie jezyków regularnych. Problem ten jest rozstrzygalny, bo w
Elementy języka <math>\displaystyle L</math> nazywamy palindromami. Definiujemy alfabet
oparciu o lemat o&nbsp;pompowaniu można skonstruować algorytm,
maszyny
który dla dowolnego języka regularnego rozstrzygnie,
<center><math>\displaystyle
czyli odpowie twierdząco lub przecząco na pytanie o jego
\Sigma_I=\left\{0,1\right\}\quad,\quad \Sigma_T=\left\{0,1,\sharp\right\}
skończoność. W tym przypadku można np. przyjąć, że jako słowo
</math></center>
wejściowe podajemy zakodowany opis gramatyki generującej język.


Nierozstrzygalność algorytmiczna problemu w ustalonej klasie
oraz zbiory stanów
nie oznacza, podkreślmy, niemożliwości rozwiazania konkretnego zadania z tej
<center><math>\displaystyle
klasy. Nierostrzygalność oznacza niemożliwość rozwiązania za pomocą
S=\left\{s_0,r_0,r_0',q_0,r_1,r_1',q_1,l,s_A,s_R\right\}\quad, \quad
tego samego algorytmu, tej samej metody, wszystkich przypadków tego
S_F=\left\{s_A\right\}
problemu należących do danej klasy.
</math></center>


W zamieszczonej poniżej tabeli przedstawiamy najczęściej rozważane pod kątem
Funkcję przejść maszyny <math>\displaystyle MT_2</math> określa tabela:
rozstrzygalności  problemy z dziedziny
języków formalnych w ramach hierarchii Chomsky'ego.
Litera R oznacza rozstrzygalność problemu, N
nierostrzygalność, a znak - pojawiający się przy problemie
jednoznaczności oznacza, że problemu tego nie formułuje się dla
gramatyk kontekstowych i typu '''(0)'''.
 
{0.3cm} {


{| border=1
{| border=1
Linia 950: Linia 682:
|-  
|-  
|  
|  
własność ||  '''(3)''' ||  '''(2)''' ||  '''(1)''' ||  
<math>\displaystyle (s_0,\sharp)\mapsto (s_A,\sharp,0)</math>  ||  <math>\displaystyle (s_0,0)\mapsto (r_0,\sharp,1)</math>  ||  <math>\displaystyle (s_0,1)\mapsto (r_1,\sharp,1)</math>
'''(0)'''
|-
<math>\displaystyle (r_0,\sharp)\mapsto (s_R,\sharp,0)</math>  ||  <math>\displaystyle (r_0,0)\mapsto (r_0',0,1)</math>  ||  <math>\displaystyle (r_0,1)\mapsto (r_0',1,1)</math>
|-
|   
<math>\displaystyle (r_0',\sharp)\mapsto (q_0,\sharp,-1)</math>  ||  <math>\displaystyle (r_0',0)\mapsto (r_0',0,1)</math>  ||  <math>\displaystyle (r_0',1)\mapsto (r_0',1,1)</math>
|-
|
||  <math>\displaystyle (q_0,0)\mapsto (l,\sharp,-1)</math>  ||  <math>\displaystyle (q_0,1)\mapsto (s_R,\sharp,-1)</math>
|-
|-
|   należenie <math>\displaystyle w\in L  </math>  ||  R || R ||  R ||
|   
N
<math>\displaystyle (r_1,\sharp)\mapsto (s_R,\sharp,0)</math>  ||  <math>\displaystyle (r_1,0)\mapsto (r_1',0,1)</math> ||  <math>\displaystyle (r_1,1)\mapsto (r_1',1,1)</math>
|-
|-
inkluzja  <math>\displaystyle L_{1}\subset L_{2}  </math>  ||  R || N ||  N ||
|   
N
<math>\displaystyle (r_1',\sharp)\mapsto (q_1,\sharp,-1)</math>  ||  <math>\displaystyle (r_1',0)\mapsto (r_1',0,1)</math> ||  <math>\displaystyle (r_1',1)\mapsto (r_1',1,1)</math>
|-
|-
równoważność ||  R || N ||  N ||
|   
N
||  <math>\displaystyle (q_1,0)\mapsto (s_R,\sharp,0)</math> ||  <math>\displaystyle (q_1,1)\mapsto (l,\sharp,-1)</math>
|-
|-
pustość  <math>\displaystyle L=\emptyset  </math>  ||  R || R ||  N ||
|   
N
<math>\displaystyle (l,\sharp)\mapsto (s_0,\sharp,1)</math>  ||  <math>\displaystyle (l,0)\mapsto (l,0,-1)</math> ||  <math>\displaystyle (l,1)\mapsto (l,1,-1)</math>
|-
|-
nieskończoność  <math>\displaystyle card\, L=\aleph _{0</math> ||  R ||  R || N ||
|   
N
<math>\displaystyle (s_R,\sharp)\mapsto (s_R,\sharp,0)</math> ||  ||  
|-
|-
jednoznaczność gramatyki ||  R ||  N ||  - ||  
|   
-
<math>\displaystyle (s_A,\sharp)\mapsto (s_A,\sharp,0)</math> ||  ||  
|-
|-
|  
|  
Linia 975: Linia 715:
|}
|}


}
co dla przejrzystości zobrazowano na Rysunku.
{0.3cm}
 
RYSUNEK ja-lekcja12-w-rys3<br>     
}}


Najczęściej używaną metodą dowodzenia nierozstrzygalności problemu
==Inne możliwe definicje maszyn Turinga==
<math>\displaystyle P  </math>  jest redukcja tego problemu do innego, powiedzmy  <math>\displaystyle P'
</math> , dla którego nierozstrzygalność została ustalona wcześniej.
Redukcja taka prowadzi do sformułowania implikacji:


jeśli  <math>\displaystyle </math> byłby
Istnieje kilka możliwych definicji maszyny Turinga, które jak się
rozstrzygalny, to i <math>\displaystyle P'  </math> byłby rozstrzygalny.
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śma 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>\displaystyle (\Sigma_T)^k</math> gdzie <math>\displaystyle k</math> oznacza ilość taśm. W tym momencie
zapis na taśmie <math>\displaystyle i</math>-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:
<center><math>\displaystyle  
f:\: (S\times \Sigma^k_{T} )\rightarrow (S \times \Sigma^k_{T}
\times \{-1,0,1\} ).
</math></center>


A ponieważ to
===Taśma jednostronnie nieskończona===
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
Model ten zakłada że
problemów uniwersalnych (takich jak problem Posta rozważany dalej)
taśma jest ograniczona z jednej ze stron. Różnica w porównaniu z
wiążą się z konstrukcją odpowiednich maszyn Turinga, kodowaniem
rozważaną przez nas maszyną Turinga polega na tym że nie jest
problemu, a następnie dowodem uzasadniającym, że problem jest
dozwolone przesuwanie lewego markera (tzn. funkcja przejść nie
rzeczywiście nierozstrzygalny. Tematyka ta
może zawierać przejść typu ([[##trans5|Uzupelnic trans5|]])). W tej sytuacji aby
wykracza  poza ramy wykładu. Z tego też powodu ograniczymy się  tutaj
symulować maszynę z taśmą obustronnie nieskończoną na maszynie z
do zaprezentowania jednego ze znanych problemów nierozstrzygalnych
taśmą ograniczoną z jednej strony wystarczy zasymulować taśmę
bez dowodu nierozstrzygalności.
obustronnie nieskończoną poprzez rozszerzenie alfabetu (zob. Rys.
4.b).


Najczęściej występującym w literaturze problemem nierozstrzygalnym jest, bez wątpienia,
RYSUNEK ja-lekcja12-w-rys4<br>           
problem
===Wielogłowicowa maszyna wielotaśmowa===
Posta przedstawiony poniżej.


&nbsp;
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
<math>\displaystyle k</math> niezależnych maszyn jednotaśmowych. Akceptowany język jest w
tym momencie <math>\displaystyle k</math>-wymiarowy. Oczywiście, słowo postaci
<math>\displaystyle (w,1,\dots,1)\in (\Sigma_T^*)^k</math> można w naturalny sposób
utożsamiać z <math>\displaystyle w\in \Sigma_T</math>. Z drugiej strony maszynę
wielogłowicową można symulować na jednotaśmowej w następujący
sposób:
# Jako zbiór stanów bierzemy <math>\displaystyle S^k</math>.
# Słowa startowe <math>\displaystyle w_1,\dots, w_k</math> zapisujemy jako konfigurację
początkową maszyny jednotaśmowej w postaci:
<center><math>\displaystyle
\sharp (s_0)^k \$ \dot{1} w_1 \$ \dot{2} w_2 \$ \dots \$ \dot{k} w_k
\$
</math></center>


'''Problem''' '''Posta'''
Symbole <math>\displaystyle \$</math> mają za zadanie wirtualnego rozdzielenia taśm. Symbole
<math>\displaystyle \dot{i}</math> wskazują na położenie <math>\displaystyle i</math>-tej głowicy na taśmie.
# W trakcie symulacji przechodzimy pomiędzy markerami i
wykonujemy przejścia dla kolejnych głowic.


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
Widać już, że formalne podanie funkcji przejść jest w omawianym
par słów ''' <math>\displaystyle \left( u_{1},w_{1}\right) \: \left(
przypadku bardzo techniczne. Musimy zapewnić możliwość poszerzania
u_{2},w_{2}\right) \: \ldots \left( u_{n},w_{n}\right),    </math> ''' gdzie
obszaru zapisu na poszczególnych taśmach, co jest realizowane
<math>\displaystyle u_{i},w_{i}\in A^{+}  </math> ,  <math>\displaystyle n\in \Bbb N  </math> . Mówimy, że taka lista ma własność
poprzez dopisanie nowego symbolu i przepisywanie przyległych symboli
Posta (problem Posta ma rozwiązanie), jeśli istnieje ciąg indeksów
aż do markera włącznie. Następnie należy wrócić do poprzedniego
<math>\displaystyle i_{1},\ldots ,i_{k}\in \{1,...,n\}  </math>  taki, że
miejsca zapisu i symulować działanie kolejnych głowic. Wymaga to
wprowadzenia sporej liczby stanów pomocniczych. Nie będziemy
wchodzić w te techniczne szczegóły. Mamy nadzieję że sama idea
konstrukcji jest w tym momencie jasna.


<center><math>\displaystyle u_{i_{1}}\ldots u_{i_{k}}=w_{i_{1}}\ldots w_{i_{k}}.</math></center>
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.


Jest to w ogólnym przypadku problem nierozstrzygalny.
===Maszyna niedeterministyczna===


Problem ten można sformułować równoważnie następująco. Niech  <math>\displaystyle A  </math>  będzie
Ten typ maszyn ma ogromne
alfabetem interpretowanym jako zbiór indeksów, a <math>\displaystyle B
znaczenie dla teorii złożoności. Z tego powodu przyglądniemy mu się
</math>  dowolnym alfabetem. Niech  <math>\displaystyle h:A^{*}\longrightarrow
dokładniej. Różnica pomiędzy niedeterministyczną maszyną Turinga a
B^{*},\: g:A^{*}\longrightarrow B^{*}  </math> będą dowolnymi
maszyną deterministyczną polega na tym że funkcja przejść może
homomorfizmami. Problem Posta, inaczej sformułowany, polega na odpowiedzi
pozwalać na kilka różnych przejść na skutek tego samego symbolu
na pytanie, czy istnieje słowo  <math>\displaystyle x\in A^{+}  </math>  takie, że  <math>\displaystyle h(x)=g(x) </math> .
czytanego (gdyż funkcja przejść w tym przypadku będzie
multi-funkcją).


Dwa kolejne przykłady ilustrują technikę redukcji pewnych
{{definicja|||
problemów do problemu Posta. W efekcie
'''(Jednotaśmowa) niedeterministyczna maszyna Turinga''' jest to
uzyskujemy nierozstrzygalność w sposób opisany powyżej.
system  <math>\displaystyle \mathbf{NMT}=(\Sigma _{T},S,f,s_{0},S_{F})  </math>  w którym
<math>\displaystyle \Sigma _{T}  </math>  jest skończonym alfabetem,  <math>\displaystyle S  </math>
skończonym zbiorem stanów,  <math>\displaystyle S\cap \Sigma _{T}=\emptyset  </math>  oraz
wyróżniony jest podzbiór  <math>\displaystyle \Sigma _{I}\subset \Sigma _{T}  </math> .
Podobnie jak poprzednio zbiór  <math>\displaystyle \Sigma _{T}  </math>  zwany jest
alfabetem taśmy, a  <math>\displaystyle \Sigma _{I}  </math>  - alfabetem
wejściowym. Wyróżnione są także: element  <math>\displaystyle \#\in \Sigma
_{T}\setminus \Sigma _{I}  </math>  zwany markerem końca, stan początkowy
<math>\displaystyle s_{0}\in S  </math>  oraz  <math>\displaystyle S_{F}\subset S  </math>  - zbiór stanów
końcowych. Natomiast '''funkcja przejść''' jest funkcją częściową
<math>\displaystyle f:\: (S\times \Sigma _{T})\rightarrow \mathcal{P}(S\times \Sigma
_{T}\times \{-1,0,1\})  </math>  gdzie <math>\displaystyle \mathcal{P}(A)</math> oznacza zbiór
podzbiorów zbioru <math>\displaystyle A</math>.


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


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


{{dowod|||
Pomimo tego, że postawiona definicja maszyny niedeterministycznej
Udowodnimy, że problem jest nierozstrzygalny dla gramatyk
jest bardzo podobna do maszyny deterministycznej występuje tutaj
bezkontekstowych generujących jązyki nad alfabetem
jedna bardzo istotna różnica. Słowo wejściowe może prowadzić do
dwuelementowym  <math>\displaystyle A=\{a,b\}  </math> . Oznaczmy  <math>\displaystyle B=\{d,e\}  </math>  i
wielu różnych obliczeń wykonanych, w szczególności jedno z obliczeń
określmy homomorfizm  <math>\displaystyle h:B^{*}\longrightarrow A^{*}  </math> ,
może doprowadzać do zatrzymania maszyny a inne nie.
przyjmując  <math>\displaystyle h(d)=ba^{2}  </math>  oraz  <math>\displaystyle h(e)=ba^{3}  </math> . Niech  <math>\displaystyle u  </math>
będzie ciągiem  <math>\displaystyle u_{1},...,u_{n}\in B^{+}  </math> dowolnie wybranych
i&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
Przykład maszyny niedeterministycznej podamy później, przy okazji
A^{*}\: :\: k\geq 1,\: 1\leq i_{j}\leq n\}</math></center>
omawiania klas złożoności obliczeniowej.


jest językiem
{{definicja|||
bezkontekstowym, jako generowany  przez gramatykę <math>\displaystyle G_{u}=(V_{N},V_{T},v_{0},P_{u})  </math> , dla której
Język rozpoznawany przez niedeterministyczną maszynę Turinga <math>\displaystyle NMT
</math> jest to zbiór


<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}),\:
<center><math>\displaystyle L(\mathbf{NMT})=\left\{ w\in \Sigma _{T}^{*}\: :\: \sharp
v_{u}\rightarrow h(\overline{i})bah(u_{i})\} </math> .
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>


Niech teraz <math>\displaystyle u  </math>  i  <math>\displaystyle w  </math>  oznaczają ciągi dowolnie wybranych i
Język <math>\displaystyle L\subset \Sigma _{I}^{*}  </math>  jest rozpoznawany (akceptowany)
ustalonych słów  <math>\displaystyle u_{1},...,u_{n}\in B^{+}  </math>  i  <math>\displaystyle w_{1},...,w_{n}\in B^{+}  </math> . Tworzą one listę słów ''' <math>\displaystyle \left( u_{1},w_{1}\right) \: \left( u_{2},w_{2}\right) \: \ldots
przez niedeterministyczną maszynę Turinga, jeśli istnieje <math>\displaystyle \mathcal{NMT}  </math>  taka, że  <math>\displaystyle L(\mathcal{NMT})=L.  </math>  
\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
Podkreślamy fakt, że aby maszyna niedeterministyczna zaakceptowała
język
słowo wejściowe wystarczy aby wśród wszystkich możliwych obliczeń
znalazło się co najmniej jedno akceptujące.


<center><math>\displaystyle L=\left\{ v_{1}cv_{2}c\overleftarrow{v}_{2}c\overleftarrow{v}_{1}\,
Wprost z definicji wynika że każda maszyna deterministyczna jest
:\, v_{1},v_{2}\in A_{2}^{*}\right\}. </math></center>
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.


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> '''
{{twierdzenie|||
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\} \\
Dla każdej niedeterministycznej maszyny Turinga <math>\displaystyle \mathcal{NMT}</math>
L_{w} &= \left\{ ba^{i_{k}}b\ldots ba^{i_{1}}cw_{i_{1}}\ldots
istnieje maszyna deterministyczna <math>\displaystyle \mathcal{MT}</math> taka, że
w_{i_{k}}\, :\, k\geq 1,1\leq i_{j}\leq n\right\}
<center><math>\displaystyle
\endaligned</math></center>
L(\mathcal{NMT})=L(\mathcal{MT})
</math></center>


oraz definiujemy język
}}


<center><math>\displaystyle L_{PP}=L_{u}c\overleftarrow{L}_{w}.</math></center>
{{dowod|||
''(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>\displaystyle 1,2,3,\dots</math> krokach.


Określone powyżej języki nad alfabetem  <math>\displaystyle A_{3</math> mają
Do dokonania symulacji najwygodniej jest użyć maszyny <math>\displaystyle 3</math>-głowicowej
własności konieczne do zastosowania  lematu, który przytoczymy bez
z możliwością czytania na wszystkich taśmach. Wprowadzamy te taśmy
dowodu.
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:
# Rozpocznij ze słowem wejściowym <math>\displaystyle w</math> na taśmie <math>\displaystyle 1</math> oraz pustymi
taśmami <math>\displaystyle 2</math> i <math>\displaystyle 3</math>.
# Przekopiuj taśmę <math>\displaystyle 1</math> na taśmę <math>\displaystyle 2</math>.
# Użyj taśmy <math>\displaystyle 2</math> do symulacji <math>\displaystyle w</math> wykorzystując taśmę <math>\displaystyle 3</math> do
wyboru przejść funkcji przejść <math>\displaystyle f</math>. Jeśli po wykonaniu skończonego
zbioru instrukcji według adresowania z taśmy <math>\displaystyle 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>\displaystyle N</math> zapisz na taśmie <math>\displaystyle 3</math> pierwszy w
kolejności leksykograficznej ciąg adresowy o długości <math>\displaystyle N+1</math> oraz
przejdź do <math>\displaystyle 2</math>.


{{lemat|||
}}
Języki  <math>\displaystyle L,\: L_{PP},\: A_{3}^{*}\setminus L,\: A_{3}^{*}\setminus
L_{PP}  </math>  są bezkontekstowe.


}}
{{wniosek|||


Dla języków  <math>\displaystyle </math> <math>\displaystyle L_{PP} </math> uzasadnienie ich bezkontekstowości jest proste
Dla każdej maszyny Turinga <math>\displaystyle \mathcal{MT}</math> istnieje maszyna Turinga
poprzezkonstrukcję odpowiednich
<math>\displaystyle \mathcal{MT}'</math> taka że
gramatyk. Aby uzyskać bezkontekstowość ich uzupełnień,
<center><math>\displaystyle
należy
L(\mathcal{MT})=L(\mathcal{MT}')
podzielić rozważane języki na rozłączne podzbiory i konstruować
</math></center>
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
oraz dla każdego <math>\displaystyle w\in L(\mathcal{MT}')</math> maszyna <math>\displaystyle \mathcal{MT}'</math>
alfabetem  <math>\displaystyle A_{3} </math> jest równoważne temu, że  <math>\displaystyle L_{PP}\cap
zatrzymuje się na <math>\displaystyle w</math>.
L\neq \emptyset  </math> .
}}


Jeśli bowiem  <math>\displaystyle L_{PP}\cap L\ni ba^{i_{k}}\ldots
{{dowod|||
ba^{i_{1}}cu_{i_{1}}\ldots u_{i_{k}}c\overleftarrow{w_{i_{1}}\ldots
Wystarczy przerobić maszynę <math>\displaystyle \mathcal{MT}</math> na maszynę
w_{i_{k}}}ca^{i_{1}}b\ldots a^{i_{k}}</math> , gdzie  <math>\displaystyle k\geq 1,1\leq
niedeterministyczną <math>\displaystyle \mathcal{NMT}</math> posiadającą dodatkowy stan <math>\displaystyle s_A</math>
i_{j}\leq n  </math> , to oczywiście  <math>\displaystyle u_{i_{1}}\ldots u_{i_{k}}=w_{i_{1}}\ldots
oraz taką że dla każdego stanu ze zbioru <math>\displaystyle S_F</math> pod wpływem dowolnego
w_{i_{k}}  </math> . Jeśli ciąg  <math>\displaystyle i_{1},\ldots ,i_{k}  </math> jest
symbolu z <math>\displaystyle \Sigma_T</math> maszyna <math>\displaystyle \mathcal{NMT}</math> posiada dodatkowe
rozwiązaniem problemu Posta, to  <math>\displaystyle (i_{1},\ldots
przejście do <math>\displaystyle s_A</math> w którym już pozostaje i nic nie zmienia. Jasno
,i_{k})(i_{1},\ldots ,i_{k})  </math> też. Zatem jeśli  <math>\displaystyle L_{PP}\cap L\neq
widać, że <math>\displaystyle L(\mathcal{MT})=L(\mathcal{NMT})</math>.
\emptyset  </math> , to język  <math>\displaystyle L_{PP}\cap L  </math> jest nieskończony.


Wobec nierozstrzygalności problemu Posta wnioskujemy, że
Twierdzenie&nbsp;[[##TwND<nowiki>=</nowiki>D|Uzupelnic TwND<nowiki>=</nowiki>D|]] pozwala na otrzymanie maszyny
nierozstrzygalny jest problem pustości i problem nieskończoności
<math>\displaystyle \mathcal{MT}'</math> akceptującej ten sam język co <math>\displaystyle \mathcal{NMT}</math> z
przecięcia  <math>\displaystyle L_{1}\cap L_{2} </math> w klasie języków
dodatkowym założeniem, że gdy <math>\displaystyle \mathcal{NMT}</math> osiąga stan <math>\displaystyle s_A</math>
bezkontekstowych.
maszyna <math>\displaystyle \mathcal{MT}'</math> się zatrzymuje. Zauważmy że stan <math>\displaystyle s_A</math> można
osiągnąć tylko dla słów akceptowanych prze <math>\displaystyle \mathcal{NMT}</math> a z
drugiej strony każde słowo akceptowane przez <math>\displaystyle \mathcal{NMT}</math>
prowadzi do conajmniej jednego obliczenia kończącego się w
<math>\displaystyle s_A</math>.
}}

Wersja z 18:36, 22 sie 2006

{Języki kontekstowe i automat liniowo ograniczony. Maszyna Turinga}

Wprowadzenie
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ń.

Słowa kluczowe
gramatyka: kontekstowa, rozszerzająca, z markerem końca,

liniowo ograniczona, automat liniowo ograniczony, maszyna Turinga, maszyna wielotaśmowa, maszyna niedeterministyczna.

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

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

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

Wprowadzimy teraz gramatyki z markerem końca.

Definicja

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

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L(G_{\sharp })=\{w\in V_{T}^{*}:\: \sharp v_{0}\sharp \mapsto^{*}\sharp w\sharp \}. }

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

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 Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle \, ^{\sharp }x,x^{\sharp },^{\: \sharp }x^{\sharp } } 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 Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle u\rightarrow w,\: ^{\#}u\rightarrow \, ^{\#}w,\: u^{\#}\rightarrow w^{\#},\: ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1} }
  2. jeśli #u#wP , to Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle \: u^{\#}\rightarrow w^{\#},\: ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1} }
  3. jeśli u#w#P , to Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle u^{\#}\rightarrow w^{\#},\: ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1} }
  4. Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle \, ^{\#}x\rightarrow x,\: x^{\#}\rightarrow x,\: ^{\#}x^{\#}\rightarrow x\in P_{1} }

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 Uzupelnic thr_1|)

Twierdzenie

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 Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle v\in V_{N},\: a\in V_{T} } .

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

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

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

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle v_{0}\rightarrow v_{0}v,\: v_{1}v_{2}\rightarrow z_{1}z_{2},\: v\rightarrow x, }

gdzie Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle x\in V_{N}\cup V_{T},\: v,v_{1},v_{2},z_{1},z_{2}\in V_{N} } oraz v0{x,z1,z2,v} .

Twierdzenie

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 Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle v\in V_{N},\: x\in V_{N}\cup V_{T} }
  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 Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle z_{0}\rightarrow z_{0}z_{1},\: z_{0}\rightarrow v_{0},\: } praw Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle z_{1}v\rightarrow vz_{1},\: vz_{1}\rightarrow z_{1}v } 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

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{s}my, a ΣI - alfabetem wej{s}ciowym. Wyróżnione są także: element #ΣTΣI zwany markerem końca, stan pocz{a}tkowy s0S oraz SFS - zbiór stanów ko{n}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

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L(\mathcal{A}_{LO})=\left\{ w\in \Sigma _{I}^{*}\: :\: s_{0}\#w\#\mapsto^{*}vs,\; v\in \Sigma _{T}^{*},\, s\in S_{F}\right\} .}

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

{}{2900sp}

(2256,2000)(1100,-1200)

(1000,0){( 1, 0){3400}}

(1100,0)(300,0){3}{(0, 1){300}}

(1200,100){ }

(1900,100){ }

(2300,0)(300,0){3}{(0, 1){300}}

(2400,100){ c }

(2700,100){ a }

(3100,100){ }

(3600,0)(300,0){3}{(0, 1){300}}

(4000,100){ }

(1707,0){( 1, 0){2393}}

(1000,300){( 1, 0){3400}}

{(2750,-342){( 0, 1){300}} }

(5450,0){( 1, 0){3400}}

(5600,0)(300,0){3}{(0, 1){300}}

(5700,100){ }

(6400,100){ }

(6800,0)(300,0){3}{(0, 1){300}}

(6900,100){ c }

(7200,100){ b }

(7600,100){ }

(8100,0)(300,0){3}{(0, 1){300}}

(8500,100){ }

(5450,300){( 1, 0){3400}}

{(6950,-342){( 0, 1){300}} }

(2257,-1235){(893,893){ Parser nie mógł rozpoznać (nieznana funkcja „\large”): {\displaystyle \displaystyle { \large s_{1}} } }}

(6500,-1235){(893,893){ Parser nie mógł rozpoznać (nieznana funkcja „\large”): {\displaystyle \displaystyle { \large s_{2}} } }}

{0.2cm}

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

  1. zamieni{c} literę na inn{a} liter{e} i/lub zmienić stan na inny - zgodnie

z warunkiem 1. Głowica czytająca automatu pozostaje w poprzedniej pozycji,

  1. zamieni{c} literę na inn{a} liter{e} i/lub zmienić stan na inny - zgodnie

z warunkiem 2. Głowica czytająca automatu przesuwa się w prawo,

  1. zamieni{c} literę na inn{a} liter{e} 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ą ponizsze twierdzenia.

Twierdzenie

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

  1. (A) (s0,x)(s0,v,0) jeśli vxP

i xv0

  1. (A) (s0,v3)(sv1,v1,1),(sv1,v4)(s0,v2,0)

jeśli v1v2v3v4P

  1. (A) (s0,v0)(s1,v0,1)
  2. (A) (s1,#)(s2,#,1)
  3. (A) (s1,)(s2,,1)
  4. (A) (s2,v0)(s3,,1)
  5. (A) (s3,v1)(s0,v0,0) , gdy v0v0v1P
  6. (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

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

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 domknietoś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 bedzie mieć miejsce w następnym wykładzie.

Maszyna Turinga

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

(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ą Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle f:\: (S\times \Sigma _{T})\rightarrow (S\times \Sigma _{T}\times \{-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

  1. d1=vs1# , d2=vbs2# oraz f(s1,#)=(s2,b,1)
  2. d1=vcs1aw , d2=vs2cbw oraz f(s1,a)=(s2,b,1)
  3. 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

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

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle 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\} .}

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 Uzupelnic WnL+Stop|). W pierwszej kolejności przedstawiamy dwa przykłady:

Przykład

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ść.

{

Przykład

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

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L=\left\{w \overleftarrow{w} \: : \: w\in \left\{0,1\right\}^*\right\} }

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:

{

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śma 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:

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle f:\: (S\times \Sigma^k_{T} )\rightarrow (S \times \Sigma^k_{T} \times \{-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 (Uzupelnic trans5|)). 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).

RYSUNEK ja-lekcja12-w-rys4

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.

  1. 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 wchodzić w te techniczne szczegóły. Mamy nadzieję że sama idea konstrukcji jest w tym momencie jasna.

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

(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ą Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle f:\: (S\times \Sigma _{T})\rightarrow \mathcal{P}(S\times \Sigma _{T}\times \{-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

  1. d1=vs1# , d2=vbs2# oraz f(s1,#)(s2,b,1)
  2. d1=vcs1aw , d2=vs2cbw oraz f(s1,a)(s2,b,1)
  3. 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

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

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L(\mathbf{NMT})=\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\} .}

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

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.

  1. Przekopiuj taśmę 1 na taśmę 2.
  2. 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.

  1. 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

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. Jasno widać, że L(𝒯)=L(𝒩𝒯).

Twierdzenie [[##TwND=D|Uzupelnic TwND=D|]] 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 conajmniej jednego obliczenia kończącego się w sA.