Test GR4: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Rogoda (dyskusja | edycje)
Nie podano opisu zmian
Rogoda (dyskusja | edycje)
Nie podano opisu zmian
Linia 1: Linia 1:
Sformułujemy definicje podstawowych klas
\newtheorem{thm}{Twierdzenie}
złożoności w języku maszyn Turinga oraz metodę ich porównywania.
\newtheorem{obs}[thm]{Obserwacja}
Przeanalizujemy związki między rodziną języków określonych przez maszyny Turinga a
\newtheorem{con}[thm]{Wniosek}
rodziną języków typu '''(0)''' z hierarchii Chomsky'ego.  Podamy dalsze własności
\newtheorem{exrr}{Zadanie}
języków kontekstowych i typu '''(0)'''.
Wprowadzimy pojęcie języka rekurencyjnie
przeliczalnego oraz przedstawimy tezę Churcha. Następnie omówimy
teoretyczne podstawy teorii rozstrzygalności oraz przeanalizujemy
kilka problemów nierozstrzygalnych w teorii języków.


__FORCETOC__
{


==Klasy złożoności obliczeniowej==
\parindent 0mm


Jednym z podstawowych celów wprowadzania maszyn Turinga jest dążenie
'''#1'''
do formalnej definicji złożoności obliczeniowej. Na podstawie
\parindent 10mm }{\hfill{ <math>\displaystyle \square </math> }
wcześniejszych uwag możemy '''utożsamiać akceptację słowa'''
przez maszynę Turinga z jej '''zatrzymaniem się'''. Intuicyjnie,
można takie zachowanie maszyny Turinga utożsamić z wykonaniem
programu, który zwraca odpowiedź "Tak" na postawione przez nas
pytanie.


{{definicja|1.1||
}
Ustalmy funkcje <math>\displaystyle t,s:\mathbb{N}\rightarrow \mathbb{N}</math>. Mówimy, że
maszyna Turinga <math>\displaystyle \mathcal{MT}</math> (deterministyczna lub
niedeterministyczna) '''akceptuje słowo <math>\displaystyle w\in \Sigma_I^*</math> w
czasie <math>\displaystyle t(|w|)</math>''', jeśli istnieje ciąg <math>\displaystyle k\leqslant t(|w|)</math> konfiguracji
<math>\displaystyle d_1,d_2,\dots, d_k</math> takich, że <math>\displaystyle d_1=\sharp s_0 w \sharp</math>, <math>\displaystyle d_k=
\sharp w_{1}s_{F}w_{2}\sharp</math> dla pewnych <math>\displaystyle w_{1},w_{2}\in \Sigma
_{T}^{*},s_{F}\in S_{F}</math> oraz <math>\displaystyle d_i \mapsto d_{i+1}</math> dla
<math>\displaystyle i=1,\dots,k-1</math>.


Jeśli istnieje ciąg konfiguracji <math>\displaystyle d_1 \mapsto d_2 \mapsto \dots
{article}
\mapsto d_m</math>, gdzie <math>\displaystyle d_1=\sharp s_0 w \sharp</math>, <math>\displaystyle d_m</math> jest
\input{../makraT}
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|\leqslant 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>
\newpage
(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|1.1||
\parindent 0mm
W niektórych podejściach wykorzystuje się, do definicji złożoności
\beginLarge
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\geqslant 1</math>, zatem nie ma
potrzeby dodatkowego definiowania maszyn Turinga off-line.
}}


{{definicja|1.2||
{| border=1
Oznaczmy przez <math>\displaystyle Dtime(t(n))</math> oraz <math>\displaystyle Dspace(s(n))</math> rodzinę języków
|+ <span style="font-variant:small-caps">Uzupelnij tytul</span>
akceptowanych w czasie <math>\displaystyle t(n)</math> i odpowiednio pamięci <math>\displaystyle s(n)</math> przez
|-
deterministyczną maszynę Turinga. Dla maszyn niedeterministycznych
| '''Indukcja'''
wprowadzamy w identyczny sposób klasy <math>\displaystyle Ntime(t(n))</math> oraz
|-
<math>\displaystyle Nspace(s(n))</math>.
|


Określamy następujące klasy złożoności (klasy języków):
|}


<center><math>\displaystyle \aligned  \textbd{P} \displaystyle =\bigcup_{k=0}^\infty Dtime(n^k), &\qquad\qquad&
  \endLarge
\textbd{NP} \displaystyle  =\bigcup_{k=0}^\infty Ntime(n^k),
\parindent 10mm
\\
\textbd{PSPACE} \displaystyle  =\bigcup_{k=0}^\infty Dspace(n^k), &&
\textbd{NSPACE} \displaystyle  =\bigcup_{k=0}^\infty Nspace(n^k).
\endaligned</math></center>


}}
; Zaznacz zdania prawdziwe dotyczące podłogi i sufitu:
:;  <math>\displaystyle n\geq 2^{\left\lceil \log_2 n \right\rceil} </math> ,
::
:;  <math>\displaystyle n\leq 2^{\left\lceil \log_2 n \right\rceil} </math> ,
::
:;  <math>\displaystyle \left\lceil \log_2 \left\lceil n/2 \right\rceil \right\rceil=\left\lceil \log_2 \left( n/2 \right) \right\rceil </math> ,
::
:;  <math>\displaystyle \left\lfloor \log_2 \left\lceil n/2 \right\rceil \right\rfloor=\left\lfloor \log_2 \left( n/2 \right) \right\rfloor </math> .
::
 
; Dowolny niepusty podzbiór  <math>\displaystyle S\subseteq \mathbb{N} </math>  zbioru liczb naturalnych
:; ma w sobie liczbę największą
::
:; ma w sobie liczbę najmniejszą
::
:; ma w sobie liczbę największą oraz liczbę najmniejszą
::
:; ma w sobie liczbę najmniejszą ale nigdy nie ma największej
::
 
; Zbiór  <math>\displaystyle S\subseteq\mathbb{N} </math>  jest taki, że jeśli  <math>\displaystyle s\in S </math>  to  <math>\displaystyle s+1\in S </math> .
Jeśli  <math>\displaystyle 9\in S </math> , to:


Wprost z definicji otrzymujemy zależności '''P''' <math>\displaystyle \subset </math> '''NP''' oraz '''PSPACE''' <math>\displaystyle \subset </math> '''NPSPACE''' . W dalszej części wykładu udowodnimy kilka mniej oczywistych zależności.
:; <math>\displaystyle S=\mathbb{N} </math>  
::


{{przyklad|1.1||
:<math>\displaystyle S=\mathbb{N}-\left\lbrace 0,1,2,3,4,5,6,7,8 \right\rbrace </math>  
Rozważmy język:
::
<center><math>\displaystyle  
L=\left\{1^i 2^j 3^k\: k=i\cdot j,\: i,j\geqslant 1\right\}.
</math></center>


Język <math>\displaystyle L\in </math> '''P''' . Deterministyczna maszyna Turinga
:; <math>\displaystyle S\subseteq\mathbb{N}-\left\lbrace 0,1,2,3,4,5,6,7,8 \right\rbrace </math>  
<math>\displaystyle MT_3</math> akceptująca taki język może wyglądać następująco (zaczynamy
::
od konfiguracji <math>\displaystyle \sharp s_0 w \sharp</math>):
# Jeśli symbol pod głowicą, 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
:;  <math>\displaystyle S\supseteq\mathbb{N}-\left\lbrace 0,1,2,3,4,5,6,7,8 \right\rbrace </math>
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.
; Zbiór  <math>\displaystyle S\subseteq\mathbb{N} </math>  jest taki, że jeśli  <math>\displaystyle a,b\in S </math> ,
}}
to  <math>\displaystyle a+b\in S </math> oraz <math>\displaystyle a+b+1\not\in S </math> .
Jeśli  <math>\displaystyle 0,2 \in S </math> , to:


{{kotwica|prz.1.2|}}{{przyklad|1.2||
:;  <math>\displaystyle S=\mathbb{N} </math>
::


Rozważmy teraz język
:; zbiór  <math>\displaystyle S </math>  zawiera wszystkie liczby naturalne, które są parzyste
<center><math>\displaystyle  
::
L=\left\{3^k\: : \: k=i\cdot j  </math>  dla pewnych  <math>\displaystyle  i,j> 1\rbrace.
</math></center>


Najprostszą metodą uzasadnienia, że <math>\displaystyle L\in  </math> '''NP''' jest
:; zbiór  <math>\displaystyle S </math>  jest zawarty w zbiorze liczb naturalnych, które są parzyste
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:
:; zbiór  <math>\displaystyle S </math> jest zbiorem wszystkich liczb naturalnych, które są parzyste
# 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>.
; Ostatnią cyfrą liczby  <math>\displaystyle 3^{3^n} </math> jest:
# 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
:; zawsze  <math>\displaystyle 3 </math>
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ę
:; zawsze  <math>\displaystyle 3 </math> lub  <math>\displaystyle 7 </math>  
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 1. prowadzi do konstrukcji odpowiedniego słowa na drugiej taśmie. Nie wiemy, jaka dokładnie ścieżka obliczeń ma być wykorzystana, ale dla akceptacji języka <math>\displaystyle L</math> nie ma to znaczenia.
:; zawsze <math>\displaystyle 7 </math>  
::


Zastanów się, czy da się wykazać, że także <math>\displaystyle L\in </math> '''P'''
:; jakakolwiek z cyfr  <math>\displaystyle 0,1,2,3,4,5,6,7,8,9 </math>
(Ćwiczenie '''1.3''', do tego wykładu).
::
}}
 
;  Jeśli  <math>\displaystyle Z \subseteq \mathbb{N} </math> jest jakimś zbiorem liczb naturalnych,
który wraz z każdym początkowym fragmentem zbioru  <math>\displaystyle \mathbb{N} </math>
postaci  <math>\displaystyle \left\lbrace 0,\ldots,k-1 \right\rbrace </math>  zawiera również kolejną liczbę  <math>\displaystyle k </math> , to wtedy


{{definicja|1.3||
:; zbiór  <math>\displaystyle Z </math> zawiera wszystkie liczby naturalne poza skończonym podzbiorem
Funkcja <math>\displaystyle s(n)</math> jest '''konstruowalna pamięciowo''', jeśli istnieje maszyna Turinga <math>\displaystyle \mathcal{MT}=(\Sigma _{T},S,f,s_{0},S_{F})</math>, dla
::
której <math>\displaystyle d_1 \mapsto^* d_2</math>, gdzie <math>\displaystyle d_1=\sharp s_0 1^n \sharp</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
(\Sigma_T\setminus \left\{1\right\})^*</math> oraz dodatkowo <math>\displaystyle d_2</math> jest
konfiguracją końcową.
}}


Inaczej mówiąc, funkcję <math>\displaystyle s(n)</math> nazywamy konstruowalną pamięciowo, jeśli istnieje maszyna Turinga <math>\displaystyle \mathcal{MT}</math>, otrzymując na wejściu
:; zbiór  <math>\displaystyle Z </math> zawiera wszystkie liczby naturalne
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|1.3||
:; zbiór  <math>\displaystyle Z </math> zawiera nieskończenie wiele liczb naturalnych
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.


}}
:; zbiór  <math>\displaystyle Z </math>  jest pusty
:: 
 
; Grupa uczniów stojących przed klasą skłóciła się do tego stopnia,
że nikt z nikim się nie lubił.
Jeden z nich, aby naprawić relacje, wymyślił,
że jeżeli wszyscy znajdujący się wewnątrz klasy będą pogodzeni,
to nie powinno być problemu,
aby któryś stojący na zewnątrz klasy wszedł do środka i pogodził się ze wszystkimi,
będącymi w klasie.
Drugi z nich zauważył jednak,
że nic z tego nie wyjdzie, bo w środku nikogo nie ma.
Czy klasa jest w stanie się pogodzić?


{{kotwica|tw.1.1|}}{{twierdzenie|1.1 liniowa kompresja pamięci||
:; klasa na pewno się nie pogodzi
::


Niech będzie dany język <math>\displaystyle L</math> oraz maszyna Turinga
:; klasa się pogodzi, jeżeli każdy pójdzie za radą pierwszego ucznia
<math>\displaystyle \mathcal{TM}</math> akceptująca <math>\displaystyle L</math> w pamięci <math>\displaystyle s(n)</math>. Dla dowolnego
::
<math>\displaystyle \varepsilon>0</math> istnieje maszyna Turinga <math>\displaystyle \mathcal{TM}'</math> akceptująca <math>\displaystyle L</math> w
pamięci <math>\displaystyle \max\left\{n,\varepsilon s(n)\right\}</math>.
}}


{{dowod|||
:; jeżeli w klasie byłaby już jedna osoba, to reszta klasy miałaby szansę się pogodzić
(''Szkic'')
::
Ustalamy liczbę naturalną <math>\displaystyle k</math>, dla której <math>\displaystyle \varepsilon k\geqslant 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>
:; jeżeli w klasie byłyby już co najmniej dwie osoby,  
komórek pamięci do odczytania słowa wejściowego. Kompresja taśmy
przy czym osoby w klasie byłyby ze sobą pogodzone,  
zapewnia, że podczas symulowania maszyny <math>\displaystyle \mathcal{MT}</math> nie
to reszta klasy miałaby szansę się pogodzić
wykorzystamy więcej niż <math>\displaystyle \lceil \frac{s(n)}{k}\rceil \leqslant \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
; Jeśli <math>\displaystyle S\subseteq\mathbb{N} </math> , to:
symulowania <math>\displaystyle \mathcal{MT}</math>.
:   
}}
   
 
:; zbiór <math>\displaystyle S </math>  ma element największy
{{twierdzenie|1.2 Savitch||
::
 
   
Dla dowolnej funkcji <math>\displaystyle s(n)</math> konstruowalnej pamięciowo spełniającej
:; zbiór <math>\displaystyle S </math>  ma element najmniejszy
warunek <math>\displaystyle s(n)\geqslant \log_2 n</math> prawdziwa jest inkluzja
::
<math>\displaystyle Nspace(s(n))\subset DSpace(s^2(n))</math>.
   
}}
:; zbiór <math>\displaystyle S </math>  ma element największy, o ile <math>\displaystyle S </math> jest niepusty
 
::
{{dowod|||
Niech <math>\displaystyle \mathcal{NMT}</math> będzie niedeterministyczną maszyną Turinga
:; zbiór  <math>\displaystyle S </math>  ma element najmniejszy, o ile <math>\displaystyle S </math> jest niepusty
akceptującą język <math>\displaystyle L=L(\mathcal{NMT})</math> w pamięci <math>\displaystyle s(n)</math>. Niech
::
<math>\displaystyle k(n)</math> oznacza liczbę konfiguracji potrzebną do zaakceptowania słowa
o długości <math>\displaystyle n</math>. Istnieje liczba <math>\displaystyle c>1</math>, dla której <math>\displaystyle k(n)\leqslant c^{s(n)}</math>, co z kolei oznacza, że każde słowo o długości <math>\displaystyle n</math> jest akceptowane w <math>\displaystyle c^{s(n)}</math> krokach czasowych.
}}
Rozważmy algorytm:  
 
{{algorytm|||
  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|\leqslant s(n)</math>
  4    '''do if''' Test(<math>\displaystyle \sharp s_0 w \sharp</math>, <math>\displaystyle d_A</math>, <math>\displaystyle s(n) \log_2 c</math>) '''then''' akceptuj
}}
 
gdzie procedura Test ma następującą postać:
 
{{algorytm|'''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    '''else for''' każda konfiguracja <math>\displaystyle d''</math> dla której <math>\displaystyle |d''|\leqslant s(n)</math>
  3      '''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        '''then return true''';
  5 '''return false'''
}}
 
Przedstawiony algorytm można zrealizować za pomocą wielotaśmowej
maszyny Turinga. Założenie dotyczące konstruowalności pamięciowej
jest istotnie wykorzystywane w tej konstrukcji przy implementacji
linii 3 algorytmu i linii 2 procedury Test. Musimy zaznaczyć <math>\displaystyle s(n)</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 [[#tw.1.1|1.1]] 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|1.1||
<center> '''PSPACE''' <math>\displaystyle = </math> '''NPSPACE''' </center>
 
}}
 
{{lemat|1.1||
Jeśli <math>\displaystyle g(n)\geqslant 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|||
Niech będzie dana maszyna deterministyczna <math>\displaystyle \mathcal{MT}</math>
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 co najwyżej <math>\displaystyle g(n)</math> kroków
czasowych, czyli odwiedza co najwyżej <math>\displaystyle g(n)+1</math> komórek taśmy.
 
Na podstawie Twierdzenia [[#tw.1.1|1.1]] istnieje maszyna Turinga
<math>\displaystyle \mathcal{MT}'</math> wykorzystująca
<center><math>\displaystyle
\max \left\{n, \frac{1}{2}(g(n)+1)\right\}\leqslant g(n)
</math></center>
 
komórek pamięci. Dla niedeterministycznych maszyn Turinga argumentacja
jest identyczna.
}}
 
{{wniosek|1.2||
<center> '''P''' <math>\displaystyle  \subset </math> '''NP''' <math>\displaystyle \subset
</math> '''PSPACE''' <math>\displaystyle = </math> '''NPSPACE''' </center>
 
}}
 
{{uwaga|1.2||
Nie jest znany przykład wykazujący silną inkluzję '''P''' <math>\displaystyle  \varsubsetneq </math> '''NP''' ani dowód 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 [[#prz.1.2|1.2]], nawet w
przypadku konkretnego języka <math>\displaystyle L\in  </math> '''NP''', problem
uzasadnienia, ż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==
 
{{definicja|2.1 transformacja wielomianowa||
 
Niech <math>\displaystyle L_1,L_2</math> będą dowolnymi językami nad pewnym alfabetem
<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
<center><math>\displaystyle
w\in L_1 \quad \Longleftrightarrow \quad w' \in L_2.
</math></center>
 
}}
 
{{lemat|2.1||
Załóżmy, że <math>\displaystyle L_1 \propto L_2</math>. Wtedy zachodzą implikacje:
# <math>\displaystyle L_2 \in  </math> '''P''' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<math>\displaystyle \quad \Longrightarrow \quad L_1 \in  </math> '''P''',
# <math>\displaystyle L_2 \in  </math> '''NP''' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<math>\displaystyle \quad \Longrightarrow \quad L_1 \in </math> '''NP''',
# <math>\displaystyle L_2 \in  </math> '''PSPACE''' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<math>\displaystyle \quad \Longrightarrow \quad L_1 \in </math> '''PSPACE'''.
 
}}
 
{{dowod|||
Dane słowo <math>\displaystyle w</math> transformujemy do <math>\displaystyle w'</math> w czasie wielomianowym, co gwarantuje założenie <math>\displaystyle L_1 \propto L_2</math>. Dzięki założeniu <math>\displaystyle L_2 \in </math> '''P'''  możemy rozstrzygnąć, czy <math>\displaystyle w'\in L_2</math> (tzn. jeśli akceptujemy <math>\displaystyle w'</math>, to robimy to w czasie wielomianowym). Tym sposobem (korzystając z definicji transformacji wielomianowej) akceptujemy <math>\displaystyle w</math> w czasie wielomianowym, o ile tylko <math>\displaystyle w\in L_1</math>. Dowód dla pozostałych implikacji jest identyczny.
}}
 
{{definicja|2.2||
Niech <math>\displaystyle \mathcal{C}</math> oznacza pewną klasę języków. Język <math>\displaystyle L</math> nazywamy '''<math>\displaystyle \mathcal{C}</math>-trudnym''', jeśli spełniony jest warunek:
<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 on 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|2.1||
Rozważając klasę  '''P''' , '''NP'''  i '''PSPACE''', możemy mówić o językach (problemach) '''P''' -zupełnych,  '''NP''' -zupełnych, czy też '''PSPACE''' -zupełnych. To samo odnosi się do
języków trudnych (tzn. klasa języków  '''P''' -trudnych, itd.).
}}
 
{{przyklad|2.1||
Rozważmy języki:
<center><math>\displaystyle  
L_1=\left\{1^i 2^j 3^k\: k=i\cdot j,\: i,j\geqslant 1\right\}\quad,\quad
L_2=\left\{1^i 2^j 4^{2k}\: k=i\cdot j,\: i,j\geqslant 1\right\}.
</math></center>
 
Języki: <math>\displaystyle L_1</math> oraz <math>\displaystyle L_2</math> wyglądają na bardzo podobne, zatem wydaje się, że <math>\displaystyle L_1 \propto L_2</math> oraz <math>\displaystyle L_2 \propto L_1</math>. Uzasadnienie tego faktu jest prawie natychmiastowe.
}}
Konstruujemy deterministyczną maszynę Turinga która działa w
następujący sposób:
# {{kotwica|prz.1|}} Jeśli słowo wejściowe jest puste, to stop.
# Przejdź do prawego ogranicznika. Jeśli przy ograniczniku nie występuje symbol <math>\displaystyle 4</math>, to wykonaj krok [[#prz.1|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\geqslant 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 [[#prz.1|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 [[#prz.1|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
</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
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>).

Wersja z 18:39, 14 wrz 2006

\newtheorem{thm}{Twierdzenie} \newtheorem{obs}[thm]{Obserwacja} \newtheorem{con}[thm]{Wniosek} \newtheorem{exrr}{Zadanie}

{

\parindent 0mm

#1 \parindent 10mm }{\hfill{ }

}

{article} \input{../makraT}

\newpage

\parindent 0mm \beginLarge

Uzupelnij tytul
Indukcja
\endLarge 

\parindent 10mm

Zaznacz zdania prawdziwe dotyczące podłogi i sufitu
n2log2n ,
n2log2n ,
log2n/2=log2(n/2) ,
log2n/2=log2(n/2) .
Dowolny niepusty podzbiór S zbioru liczb naturalnych
ma w sobie liczbę największą
ma w sobie liczbę najmniejszą
ma w sobie liczbę największą oraz liczbę najmniejszą
ma w sobie liczbę najmniejszą ale nigdy nie ma największej
Zbiór S jest taki, że jeśli sS to s+1S .

Jeśli 9S , to:

S=
S={0,1,2,3,4,5,6,7,8}
S{0,1,2,3,4,5,6,7,8}
S{0,1,2,3,4,5,6,7,8}
Zbiór S jest taki, że jeśli a,bS ,

to a+bS oraz a+b+1∉S . Jeśli 0,2S , to:

S=
zbiór S zawiera wszystkie liczby naturalne, które są parzyste
zbiór S jest zawarty w zbiorze liczb naturalnych, które są parzyste
zbiór S jest zbiorem wszystkich liczb naturalnych, które są parzyste
Ostatnią cyfrą liczby 33n jest
zawsze 3
zawsze 3 lub 7
zawsze 7
jakakolwiek z cyfr 0,1,2,3,4,5,6,7,8,9
Jeśli Z jest jakimś zbiorem liczb naturalnych,

który wraz z każdym początkowym fragmentem zbioru postaci {0,,k1} zawiera również kolejną liczbę k , to wtedy

zbiór Z zawiera wszystkie liczby naturalne poza skończonym podzbiorem
zbiór Z zawiera wszystkie liczby naturalne
zbiór Z zawiera nieskończenie wiele liczb naturalnych
zbiór Z jest pusty
Grupa uczniów stojących przed klasą skłóciła się do tego stopnia,

że nikt z nikim się nie lubił. Jeden z nich, aby naprawić relacje, wymyślił, że jeżeli wszyscy znajdujący się wewnątrz klasy będą pogodzeni, to nie powinno być problemu, aby któryś stojący na zewnątrz klasy wszedł do środka i pogodził się ze wszystkimi, będącymi w klasie. Drugi z nich zauważył jednak, że nic z tego nie wyjdzie, bo w środku nikogo nie ma. Czy klasa jest w stanie się pogodzić?

klasa na pewno się nie pogodzi
klasa się pogodzi, jeżeli każdy pójdzie za radą pierwszego ucznia
jeżeli w klasie byłaby już jedna osoba, to reszta klasy miałaby szansę się pogodzić
jeżeli w klasie byłyby już co najmniej dwie osoby,

przy czym osoby w klasie byłyby ze sobą pogodzone, to reszta klasy miałaby szansę się pogodzić

Jeśli S , to
zbiór S ma element największy
zbiór S ma element najmniejszy
zbiór S ma element największy, o ile S jest niepusty
zbiór S ma element najmniejszy, o ile S jest niepusty