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:
{tw}{Twierdzenie}[section]
Sformułujemy definicje podstawowych klas
{fa}[tw]{Fakt}
złożoności w języku maszyn Turinga oraz metodę ich porównywania.
{AZbioruPustego}{Aksjomat Zbioru Pustego}
Przeanalizujemy związki między rodziną języków określonych przez maszyny Turinga a
{APary}{Aksjomat Pary}
rodziną języków typu '''(0)''' z hierarchii Chomsky'ego.  Podamy dalsze własności
{ASumy}{Aksjomat Sumy}
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.


{}{0pt}
__FORCETOC__
{}{0pt}
{}{0in}
{}{-0.5in}
{}{6.3in}
{}{9in}


{cwicz}[section]
==Klasy złożoności obliczeniowej==
{obra}[section]
{hint}


{thm}{Twierdzenie}[section]
Jednym z podstawowych celów wprowadzania maszyn Turinga jest dążenie
{defn}[thm]{Definicja}
do formalnej definicji złożoności obliczeniowej. Na podstawie
wcześniejszych uwag możemy '''utożsamiać akceptację słowa'''
przez maszynę Turinga z jej '''zatrzymaniem się'''. Intuicyjnie,
można takie zachowanie maszyny Turinga utożsamić z wykonaniem
programu, który zwraca odpowiedź "Tak" na postawione przez nas
pytanie.


{Zadanie}[thm]{Zadanie}
{{definicja|1.1||
{Uwaga}[thm]{Uwaga}
Ustalmy funkcje <math>\displaystyle t,s:\mathbb{N}\rightarrow \mathbb{N}</math>. Mówimy, że
{Przykład}[thm]{Przykład}
maszyna Turinga <math>\displaystyle \mathcal{MT}</math> (deterministyczna lub
{Rozwiązanie}[thm]{Rozwiązanie}
niedeterministyczna) '''akceptuje słowo <math>\displaystyle w\in \Sigma_I^*</math> w
{Hint}[thm]{Hint}
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>.


{equation}{section}
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|\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>'''.


{kuba_preamble1}
Mówimy, że '''język <math>\displaystyle L</math> jest akceptowany w czasie <math>\displaystyle t(n)</math>
{kuba_preamble2}
(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).
}}


0mm
{{uwaga|1.1||
2ex
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\geqslant 1</math>, zatem nie ma
potrzeby dodatkowego definiowania maszyn Turinga off-line.
}}


{lem}[thm]{ Lemat  }
{{definicja|1.2||
{fakt}{ Fakt  }
Oznaczmy przez <math>\displaystyle Dtime(t(n))</math> oraz <math>\displaystyle Dspace(s(n))</math> rodzinę języków
{mtw}[tw]{Meta twierdzenie}
akceptowanych w czasie <math>\displaystyle t(n)</math> i odpowiednio pamięci <math>\displaystyle s(n)</math> przez
deterministyczną maszynę Turinga. Dla maszyn niedeterministycznych
wprowadzamy w identyczny sposób klasy <math>\displaystyle Ntime(t(n))</math> oraz
<math>\displaystyle Nspace(s(n))</math>.


{CwiczenieINS}[thm]{Ćwiczenie}
Określamy następujące klasy złożoności (klasy języków):


''' Logika i teoria mnogości'''
<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>


'''Wykład 8'''
}}


Zawartość wykładu: Konstrukcje liczbowe, liczby całkowite,
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.
wymierne, konstrukcja Cantora liczb rzeczywistych: działania i
porządek na liczbach.


==Liczby całkowite==
{{przyklad|1.1||
 
Rozważmy język:
Na wykładzie poprzednim skonstruowaliśmy przy pomocy aksjomatu
<center><math>\displaystyle
nieskończoności liczby naturalne. Określiliśmy dla nich podstawowe
L=\left\{1^i 2^j 3^k\: k=i\cdot j,\: i,j\geqslant 1\right\}.
operacje takie jak dodawanie i mnożenie. Teraz własności tych
operacji będą użyte do dalszych konstrukcji liczbowych. Pokażemy,
że mając liczby naturalne zbudowane na bazie liczby <math>0</math> czyli
zbioru pustego możemy definiować bardziej skomplikowane twory
liczbowe takie jak liczby całkowite, wymierne i w końcu liczby
rzeczywiste. Wszystkie te obiekty maja ogromne zastosowanie w
praktyce matematycznej i informatycznej. Będziemy później w innych
wykładach odwoływać się do niebanalnej reprezentacji tych
obiektów, które stworzymy w tym rozdziale.
 
===Konstrukcja liczb całkowitych===
 
Niech <math>\approx</math> będzie relacją określoną na
<math>\mathbb{N} \times \mathbb{N}</math> następująco:
 
<center><math>(n,k)\approx (p,q) \mbox{  wtw  } n+q = k+p
</math></center>
</math></center>


Relacja <math>\approx</math> jest relacją równoważności o polu
Język <math>\displaystyle L\in  </math> '''P''' . Deterministyczna maszyna Turinga
<math>\mathbb{N} \times \mathbb{N}</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.


{hint}{0}
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.
}}


; Rozwiązanie.
{{kotwica|prz.1.2|}}{{przyklad|1.2||
: Wykażemy, że relacja <math>\approx</math> jest relacją równoważności na
<math>\mathbb{N} \times \mathbb{N}</math>. Dla dowolnych liczb naturalnych <math>n</math> i <math>k</math>
mamy <math>(n,k)\approx (n,k)</math> ponieważ <math>n+k = n+k</math>, więc relacja jest
zwrotna. Podobnie, dla dowolnych liczb <math>n, k, p, q</math> jeśli
<math>(n,k)\approx(p,q)</math>, to <math>n+q = k+p</math> i, korzystając z
przemienności dodawania, otrzymujemy <math>p+k = q+n</math> czyli
<math>(p,q)\approx(n,k)</math> i relacja jest symetryczna.


Aby wykazać przechodniość ustalmy trzy dowolne pary <math>(n,k),(p,q)</math>
Rozważmy teraz język
i <math>(m,l)</math> spełniające <math>(n,k)\approx (p,q)</math> oraz <math>(p,q)\approx
<center><math>\displaystyle
(m,l)</math>. Wtedy <math>n+q = k+p</math> oraz <math>p+l=q+m</math>, więc <math>(n+q)+(p+l) =
L=\left\{3^k\: : \: k=i\cdot j </math>  dla pewnych  <math>\displaystyle  i,j> 1\rbrace.
(k+p)+(q+m)</math> i na mocy łączności i przemienności dodawania w
liczbach naturalnych otrzymujemy <math>(n+l) + (q+p) = (k+m)+(q+p)</math>.
Skracamy czynnik <math>(p+q)</math>&nbsp;(na mocy własności skracania dla
dodawanie) i otrzymujemy <math>n+l=k+m</math>, czyli <math>(n,k)\approx (m,l)</math> co
dowodzi przechodniości relacji <math>\approx</math>. Wykazaliśmy, że
<math>\approx</math> jest relacją równoważności.
'''Koniec ćwiczenia
''' 
 
Wykaż, że dla dowolnej pary <math>(n,k)\in\mathbb{N}\times \mathbb{N}</math> istnieje
para <math>(p,q)\in \mathbb{N}\times \mathbb{N}</math> taka, że <math>(n,k)\approx (p,q)</math>
oraz <math>p=0</math> lub <math>q=0</math>.  {hint}{0}
 
; Rozwiązanie.
: Ustalmy dowolną parę
<math>(n,k)\in\mathbb{N}\times \mathbb{N}</math>. Jeśli <math>n=k</math>, to mamy
<math>(n,k)\approx(0,0)</math> i warunek jest spełniony. Jeśli <math>n\neq k</math> to,
na mocy własności liczb naturalnych, istnieje liczba naturalna <math>l</math>
taka, że <math>n=k+l</math>&nbsp;(lub, że <math>n+l =k</math>). Wtedy <math>n+0=k+l</math>&nbsp;(lub <math>n+l =
k+0</math>), czyli <math>(n,k)\approx(l,0)</math>&nbsp;(lub <math>(n,k)\approx(0,l)</math>) co
należało dowieść.
'''Koniec ćwiczenia
''' 
Niech <math>\mathbb{Z} =  \mathbb{N}
\times\mathbb{N} / \approx</math>
 
Które z liczb całkowitych <math>[(n,k)]_{\approx}</math> są relacjami równoważności
na <math>\mathbb{N}</math>?  {hint}{0}
 
; Rozwiązanie.
: Aby liczb całkowita była relacją
równoważności koniecznym jest <math>(0,0)\in[(k,n)]_{\approx}</math>, a więc
jedynym kandydatem na liczbę będącą relacją równoważności na
<math>\mathbb{N}</math> jest <math>[(0,0)]_{\approx}</math>. Weźmy teraz dowolną parę liczb
naturalnych <math>(n,k)</math>, jeśli <math>(0,0)\approx(n,k)</math>, to <math>0+k = n+0</math>,
czyli <math>n=k</math>. Liczba całkowita <math>[(0,0)]_{\approx}</math> jest relacją
równoważności na <math>\mathbb{N}</math> i żadna inna liczba całkowita nie jest
relacją równoważności.
'''Koniec ćwiczenia
''' 
 
=== Operacje na <math>\mathbb{Z}</math> ===
 
Element zero <math>0 \in \mathbb{Z}</math> to element <math>[ (0,0) ]_{\approx}</math>.
 
Element przeciwny do danego: jeżeli <math>x = [ (n,k) ]_{\approx}</math> to
przez <math>-x = [ (k,n) ]_{\approx}</math>
 
Dodawanie: <math>[ (n,k) ]_{\approx} + [ (p,q) ]_{\approx} = [
(n+p,k+q) ]_{\approx}</math>.
 
Mnożenie: <math>[ (n,k) ]_{\approx} \cdot [ (p,q) ]_{\approx} = [ (n
\cdot p + k \cdot q \;,\; n \cdot q + k \cdot p )
]_{\approx}</math>{Dla przejrzystości zapisu będziemy czasami
pomijać znak <math>\cdot</math> pisząc <math>xy</math> zamiast <math>x\cdot y</math>}.
 
Odejmowanie: <math>x-y = x+ (-y)</math>
 
Proszę o zwrócenie uwagi na pewną kolizję oznaczeń. Po lewej
stronie definicji (dodawania, mnożenia i odejmowania) używamy tych
samych znaków działań co po stronie prawej. Jest to ewidentna
kolizja oznaczeń, którą wykonujemy z pełną świadomością. W
praktyce matematycznej i informatycznej przyjęło się używać te
same znaki działań wiedząc, że mają one zgoła inne znaczenie.
Również element <math>0</math> będziemy oznaczać identycznie jak <math>0</math> w
liczbach naturalnych pomimo, że jest to zupełnie inny zbiór. Pod
koniec tej konstrukcji podamy naturalne włożenie (iniekcje
wkładającą liczby naturalne w całkowite) takie, które zachowuje
działania na liczbach co upewni nas, że stosowanie tych samych
oznaczeń nie grozi konfliktem.
 
Pokazać, że działania na liczbach całkowitych są dobrze określone.
To znaczy pokazać, że zbiory (klasy równoważności) będące wynikiem
działań nie nie zależą od wyboru reprezentantów : {hint}{0}
{hint}{1}
; Wskazówka .
: Zapisz w jaki sposób wynik działań jest niezależny od wyboru
reprezentantów.
 
; Rozwiązanie.
: Dla dowodu wykazującego dobre zdefiniowanie operacji na
liczbach całkowitych ustalmy dowolne pary
<math>(n,k),(p,q),(m,l),(r,s)</math> spełniające <math>(n,k)\approx (m,l)</math> oraz
<math>(p,q)\approx (r,s)</math>.
 
Dla dowodu dobrego zdefiniowania elementów przeciwnych musimy
wykazać, że <math>-[(n,k)]_{\approx} = -[(m,l)]_{\approx}</math>, czyli, że
<math>[(k,n)]_{\approx} =[(l,m)]_{\approx}</math>. Potrzebujemy
<math>(k,n)\approx(l,m)</math> co jest równoważne stwierdzeniu, że <math>k+m =
n+l</math>, który to fakt jest oczywistą konsekwencją <math>(n,k)\approx
(m,l)</math>. Wykazaliśmy, że definicja elementu przeciwnego nie zależy
od wyboru reprezentantów dla klas.
 
Analogiczny dowód przeprowadzamy dla dodawania. Musimy wykazać, że
<math>[(n,k)]_{\approx}+[(p,q)]_{\approx} = [(m,l)]_{\approx} + [(r,s)]_{\approx}</math>. Równość ta
jest prawdą wtedy i tylko wtedy, kiedy <math>[(n+p,k+q)]_{\approx}
=[(m+r,l+s)]_{\approx}</math>, czyli kiedy <math>(n+p,k+q)\approx(m+r,l+s)</math>.
Korzystając z definicji relacji <math>\approx</math> potrzebujemy
<math>(n+p)+(l+s) = (k+q)+(m+r)</math>. Z założeń wynika, że <math>n+l=k+m</math>, oraz
<math>p+s = q+r</math> -- dodając te równości stronami i korzystając z
łączności i przemienności dodawania w liczbach naturalnych
otrzymujemy żądany fakt.
 
Wykażemy, że mnożenie dwóch liczb całkowitych nie zależy od wyboru
reprezentantów w klasach równoważności. Niewątpliwie, używając
założeń i przemienności, łączności i definicji mnożenia mamy
 
<center><math>(n+l+k+m)(q+r) = 2 (k+m)(q+r)  = 2(q+r)(k+m) = (p+s+q+r)(k+m)
</math></center>
</math></center>


i dalej, używając rozdzielności mnożenia
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.


<center><math>n(q+r)+l(q+r)+k(q+r)+m(q+r) = p(k+m)+s(k+m)+q(k+m)+r(k+m).
W naszym przykładzie Etap 1 wygląda następująco:
</math></center>
# 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>).


Używamy raz jeszcze założeń i dostajemy
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ść).


<center><math>n(p+s)+l(q+r)+k(q+r)+m(p+s) = p(k+m) + s(l+n) +q(l+n)+r(k+m)
Etap 2 polega na weryfikacji, czy na taśmie drugiej znajduje się
</math></center>
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.


co, po wymnożeniu daje
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.


<center><math>np + ns + lq + lr + kq + kr +mp + ms = pk + pm + sl +sn + ql +qn
Zastanów się, czy da się wykazać, że także <math>\displaystyle L\in  </math> '''P'''
+rk+rm.
(Ćwiczenie '''1.3''', do tego wykładu).
</math></center>
}}


Stosujemy prawo skracania dla liczb naturalnych do <math> ns + lq + kr
{{definicja|1.3||
+mp</math> i dostajemy
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ą.
}}


<center><math>np+lr +kq + ms = pk + sl + qn + rm
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
</math></center>
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>).


co, używając przemienności mnożenia i przemienności i łączności
{{przyklad|1.3||
dodawania daje
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.


<center><math>(np +kq, nq + kp)\approx (mr +ls, ms +lr).
}}
</math></center>


Wywnioskowaliśmy, że <math>[(n,k)]_{\approx}\cdot [(p,q)]_{\approx} =
{{kotwica|tw.1.1|}}{{twierdzenie|1.1 liniowa kompresja pamięci||
[(m,l)]_{\approx}\cdot [(r,s)]_{\approx}</math>, co oznacza, że definicja mnożenia
nie zależy od wyboru reprezentantów dla klas.
'''Koniec ćwiczenia
''' 


Pokaż własności działań dodawania i mnożenia. Dla dowolnych liczb
Niech będzie dany język <math>\displaystyle L</math> oraz maszyna Turinga
całkowitych <math>x,y,z</math> zachodzą równości:
<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>.
}}


# <math>x+y = y+x</math> (przemienność dodawania)
{{dowod|||
(''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>.


# <math>x \cdot y = y \cdot x</math> (przemienność mnożenia)
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 \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
symulowania <math>\displaystyle \mathcal{MT}</math>.
}}


# <math> x \cdot y = z \cdot y</math> oraz  <math>y\neq 0</math> to <math> x=z</math> (prawo
{{twierdzenie|1.2 Savitch||
skracania)


# <math>x \cdot(y+z) = x\cdot y + x\cdot z</math> (rozdzielność)
Dla dowolnej funkcji <math>\displaystyle s(n)</math> konstruowalnej pamięciowo spełniającej
warunek <math>\displaystyle s(n)\geqslant \log_2 n</math> prawdziwa jest inkluzja
<math>\displaystyle Nspace(s(n))\subset DSpace(s^2(n))</math>.
}}


{hint}{0}
{{dowod|||
{hint}{1}
Niech <math>\displaystyle \mathcal{NMT}</math> będzie niedeterministyczną maszyną Turinga
; Wskazówka .
akceptującą język <math>\displaystyle L=L(\mathcal{NMT})</math> w pamięci <math>\displaystyle s(n)</math>. Niech
: Zapisz każde z powyższych praw ujawniając strukturę
<math>\displaystyle k(n)</math> oznacza liczbę konfiguracji potrzebną do zaakceptowania słowa
liczb całkowitych.
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.
Zauważ, że w dowodzie będą interweniowały udowodnione już prawa
}}
łączności, przemienności i prawo skreśleń i skracania dla
Rozważmy algorytm:
liczb naturalnych.


; Rozwiązanie.
{{algorytm|||
: Dla dowodu powyższych własności ustalmy dowolne liczby
  1  Wejście: słowo <math>\displaystyle w</math> długości <math>\displaystyle |w|=n</math>
całkowite <math>[(n,k)]_{\approx},[(p,q)]_{\approx},[(m,l)]_{\approx}</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
}}


:# Dla dowodu przemienności dodawania zauważmy,
gdzie procedura Test ma następującą postać:
że <math>[(n,k)]_{\approx} + [(p,q)]_{\approx} = [(n+p,k+q)]_{\approx}</math> i korzystając z
przemienności dodawania dla liczb naturalnych otrzymujemy
<math>[(n+p,k+q)]_{\approx} = [(p+n,q+k)]_{\approx} =[(p,q)]_{\approx}+[(n,k)]_{\approx}</math>.
Wykazaliśmy, że dodawanie liczb całkowitych jest przemienne.


:# Podobne rozumowanie stosujemy dla mnożenia
{{algorytm|'''Procedure''' Test(<math>\displaystyle d</math>,<math>\displaystyle d'</math>,<math>\displaystyle i</math>)||
<math>[(n,k)]_{\approx}\cdot[(p,q)]_{\approx} = [(np+kq,nq+kp)]_{\approx}</math> i, stosując
  1  '''if''' <math>\displaystyle i=0</math> '''and''' [ (<math>\displaystyle d=d'</math>) '''or''' (<math>\displaystyle d\mapsto d'</math>)] '''then return true'''
przemienność mnożenia i dodawania <math>[(np+kq,nq+kp)]_{\approx} =
  2    '''else for''' każda konfiguracja <math>\displaystyle d''</math> dla której <math>\displaystyle |d''|\leqslant s(n)</math>
[(pn+qk,pk+qn)]_{\approx} =[(p,q)]_{\approx}\cdot[(n,k)]_{\approx}</math> co należało
  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>)
wykazać.
  4        '''then return true''';
:# Dla dowodu prawa skracania dla liczb całkowitych
  5 '''return false'''
załóżmy, że
}}
<math>[(n,k)]_{\approx}\cdot[(p,q)]_{\approx}=[(m,l)]_{\approx}\cdot[(p,q)]_{\approx}</math>, oraz,
że dokładnie jedna z liczb <math>p, q</math> jest równa zero. Na mocy
Ćwiczenia&nbsp;[[##Cw:reprzero|Uzupelnic Cw:reprzero|]] reprezentacja taka istnieje dla
każdej, różnej od zera, liczby całkowitej. Wnioskujemy, że
<math>[(np+kq,nq+kp)]_{\approx}=[(mp+lq,mq+lp)]_{\approx}</math>. Wnioskujemy stąd, że
<math>(np+kq,nq+kp)\approx(mp+lq,mq+lp)</math>, czyli, że <math>np+kq+mq+lp =
nq+kp+mp+lq</math>.  Jeśli <math>p=0</math> to otrzymujemy, korzystając z
rozdzielności,  <math>(k+m)q = (n+l)q</math> i, korzystając z prawa skracania
dla liczb naturalnych <math>k+m =n+l</math>, czyli <math>[(k,l)]_{\approx}=[(m,l)]_{\approx}</math>
co należało dowieść. Podobnie, jeśli <math>q=0</math> to <math>(n+l)p = (k+m)p</math> i,
podobnie jak w poprzednim przypadku <math>[(k,l)]_{\approx}=[(m,l)]_{\approx}</math>.
Wykazaliśmy, że mnożenie liczb całkowitych jest skracalne.
:# Dla dowodu rozdzielności postępujemy następująco. Liczby
<math>[(n,k)]_{\approx}\cdot([(p,q)]_{\approx}+[(m,l)]_{\approx})=[(n(p+m) +
k(q+l),n(q+l)+k(p+m))]_{\approx}</math>. Korzystając z rozdzielności,
przemienności i łączności działań na liczbach naturalnych
dostajemy <math>[(n(p+m) + k(q+l),n(q+l)+k(p+m))]_{\approx}= [((np + kq)
+
(nm+kl),(nq+kp)+(nl+km)]_{\approx}=[(np+kq,nq+kp)]_{\approx}+[(nm+kl,nl+km)]_{\approx}</math>,
co równa się <math>[(n,k)]_{\approx}\cdot
[(p,q)]_{\approx}+[(n,k)]_{\approx}\cdot[(m,l)]_{\approx}</math> co należało wykazać.
 
'''Koniec ćwiczenia
'''
 
===Porządek liczb całkowitych===
 
Liczba <math>[ (n,k) ]_{\approx} \leq [ (p,q) ]_{\approx}</math> zachodzi gdy
<math>n+q \leq p+k</math>.
 
Pokaż, że definicja porządku nie jest zależna od wyboru
reprezentanta.  {hint}{0}
{hint}{1}
; Wskazówka .
: Do dowodu zastosuj własności dodawania
liczb naturalnych.
; Rozwiązanie.
: Niech <math>(n,k),(m,l),(p,q),(r,s)</math> będą
parami liczb naturalnych takimi, że <math>(n,k)\approx (m,l)</math> oraz
<math>(p,q)\approx (r,s)</math>. Załóżmy dodatkowo, że
<math>[(n,k)]_{\approx}\leq[(p,q)]_{\approx}</math>. Wykażemy, że w takim przypadku
również <math>[(m,l)]_{\approx}\leq [(r,s)]_{\approx}</math>, czyli, że porządek na
liczbach całkowitych jest niezależny od wyboru reprezentantów dla
klas równoważności. Skoro <math>[(n,k)]_{\approx}\leq[(p,q)]_{\approx}</math>, to <math>n+q
\leq p+k</math> i z wykładu o liczbach naturalnych wiemy, że istnieje
liczba naturalna <math>t</math> taka, że <math>n+q+t = p+k</math>. Równocześnie nasze
założenia gwarantują, że <math>n+l=k+m</math> i <math>p+s=q+r</math>, czyli, że
 
<center><math>n+l+q+r = k+m+p+s.
</math></center>
 
Korzystając z udowodnionej własności <math>t</math> podstawiamy liczby do
wzoru otrzymując
 
<center><math>n+l+q+r=n+m+q+t+s,
</math></center>
 
co z kolei możemy skrócić przez <math>n+q</math> otrzymując
 
<center><math>l+r =  m+s+t \text{ co oznacza } l+r\geq m+s.
</math></center>
 
Czyli <math>[(m,l)]_{\approx}\leq[(r,s)]_{\approx}</math>, co należało wykazać.
'''Koniec ćwiczenia
'''
 
Pokaż, że porządek liczb całkowitych spełnia postulaty porządku
liniowego to znaczy jest zwrotny, antysymetryczny, przechodni i
spójny.  {hint}{0}
{hint}{1}
; Wskazówka .
: Do dowodu zastosuj własności dodawania liczb
naturalnych i porządku liczb naturalnych.
; Rozwiązanie.
: Porządek na
liczbach całkowitych jest zwrotny. Dla dowolnej liczby całkowitej
<math>[(n,k)]_{\approx}</math> mamy <math>[(n,k)]_{\approx}\leq [(n,k)]_{\approx}</math> ponieważ <math>
n+k\leq n+k</math>.
 
Dla dowodu antysymetrii załóżmy, że dla dwu liczb całkowitych mamy
<math>[(n,k)]_{\approx}\leq [(p,q)]_{\approx}</math> oraz <math>[(p,q)]_{\approx}\leq [(n,k)]_{\approx}</math>.
Wnioskujemy natychmiast, że <math>n+q\leq k+p</math> oraz, że <math>p+k \leq q+n</math>.
Korzystając z przemienności dodawania, przechodniości i
antysymetrii porządku na liczbach naturalnych dostajemy <math>n+q =
k+p</math>, czyli <math>(n,k)\approx(p,q)</math>, co należało wykazać.
 
Aby wykazać przechodniość ustalmy trzy dowolne liczby całkowite,
takie, że <math>[(n,k)]_{\approx}\leq [(p,q)]_{\approx}\leq [(m,l)]_{\approx}</math>. Definicja
porządku gwarantuje, że
 
<center><math>n+q\leq k+p \text{ oraz, że } p+l\leq q+m.
</math></center>
 
Operując ćwiczeniami z Wykład 7 możemy łatwo pokazać, że
jeśli dodamy do obu stron nierówności tą samą liczbę, to
nierówność pozostanie zachowana. W związku z tym
 
<center><math>n+q+l\leq k+p+l \text{ oraz, że } p+l+k\leq q+m+k.
</math></center>
 
i używając przechodniości dostajemy <math> n+q+l\leq q+m+k</math>. Jeszcze
raz wykorzystując ćwiczenia dotyczące liczb naturalnych możemy
skrócić <math>q</math> i otrzymać <math>n+l\leq m+k</math>, czyli <math>[(n,k)]_{\approx}\leq
[(m,l)]_{\approx}</math>, co należało wykazać.
 
Dowód spójności porządku na liczbach całkowitych jest trywialną
konsekwencją faktu, że dla dowolnych dwóch par liczb naturalnych
<math>(n,k)</math> i <math>(p,q)</math> mamy <math>n+q\leq p+k</math> lub <math>p+k\leq q+n</math>.
'''Koniec ćwiczenia
'''
 
Rozważmy funkcje <math>i:\mathbb{N} \rightarrow \mathbb{Z}</math> zadaną wzorem
 
<center><math>i(n) = [ (n,0)]_{\approx}
</math></center>
 
Funkcja ta jest naturalnym włożeniem zbioru <math>\mathbb{N}</math> w zbiór
<math>\mathbb{Z}</math>. Jako ćwiczenie pokażemy, że funkcja <math>i</math> jest
iniektywna i zgodna z działaniami. Dzięki włożeniu <math>i</math> będziemy
utożsamiali liczbę naturalną <math>n</math> z odpowiadającą jej liczbą
całkowitą <math>i(n)</math>. W ten sposób każdą liczbę naturalną możemy
traktować jak całkowitą.
 
Pokaż, że funkcja <math>i</math> jest iniekcją. Pokaż, że <math>i</math> jest zgodne z
działaniami i porządkiem to znaczy:
 
# <math>i(0) =0</math>
 
# <math>i(n+m) = i(n)+i(m)</math>
 
# <math>i(n \cdot m) = i(n) \cdot i(m)</math>
 
# jeżeli <math>n \leq k</math> to <math>i(n) \leq i(k)</math>
 
{hint}{0}
{hint}{1}
; Wskazówka .
: Pamiętaj, że znaki działań i porządku (oraz <math>0</math>) po
prawej i po lewej stronie równości znaczą co innego. Zapisz każde
z powyższych praw ujawniając strukturę liczb całkowitych. Zauważ,
że w dowodzie będą interweniowały udowodnione już prawa
łączności, przemienności, prawo skreśleń i skracania oraz własności
porządkowe
dla liczb naturalnych.
 
; Rozwiązanie.
: Aby wykazać iniektywność funkcji <math>i</math> wybierzmy dwie dowolne
liczby naturalne <math>m,n</math>. Jeśli <math>i(n)=i(m)</math>, to
<math>[(n,0)]_{\approx}=[(m,0)]_{\approx}</math>, czyli <math>n+0=m+0</math> i używając prawa
skracania dla liczb naturalnych dostajemy <math>n=m</math>, co należało
wykazać. Nasze rozumowanie wykazało, że funkcja <math>i</math> jest iniekcją.
Przechodzimy teraz do dowodu własności funkcji <math>i</math>.
 
:# Oczywiście <math>i(0)=0</math>, ponieważ <math>i(0)=[(0,0)]_{\approx} = 0</math>.
:# Dla
dowolnych dwóch liczb naturalnych <math>n,m</math> mamy <math>i(n+m) = [(n+m,0)]_{\approx} =
[(n,0)]_{\approx}+[(m,0)]_{\approx} = i(n) +i(m)</math>, co należało wykazać.
:# Podobnie jak w poprzednim przypadku ustalmy dowolne dwie liczby
naturalne <math>n</math> i <math>m</math>. Wtedy, używając całego arsenału identyczności
prawdziwych dla liczb naturalnych, mamy  <math>i(n\cdot m) = [(nm,0)]_{\approx} =
[(nm+00,n0+0m)]_{\approx}=[(n,0)]_{\approx}\cdot[(m,0)]_{\approx}=i(n)\cdot i(m)</math>, co
należało wykazać.
:# Jeśli <math>n\leq k</math>, to niewątpliwie <math> n+0\leq
k+0</math>, czyli <math>[(n,0)]_{\approx}\leq [(k,0)]_{\approx}</math> co oznacza, że <math>i(n)\leq
i(k)</math>. Dowód jest zakończony.
 
'''Koniec ćwiczenia
'''
 
==Liczby wymierne==
 
Niech <math>\mathbb{Z}^* = \mathbb{Z} \setminus \left\{\emptyset\right\}\$.
Określamy relację  na zbiorze </math>{Z}
{Z}^*<math> następująco.
 
</math></center>(a,b)  (c,d)  wtw  a  d <nowiki>=</nowiki> c  b
<center><math>
 
\beginCwiczenieINS 
Relacja  jest równoważnością.
 
\endCwiczenieINS \setcounter{hint}{0}
 
\addtocounter{hint}{1}
; Wskazówka \thehint.
: Zwrotność i symetria  są trywialne. Przy dowodzie
przechodniości zastosuj prawo skracania
[[##wlasnosci liczb_calkowitych|Uzupelnic wlasnosci liczb_calkowitych|]]
dla liczb całkowitych.
 
; Rozwiązanie.
: Zwrotność relacji  wynika z faktu, że dla dowolnych
liczb całkowitych mamy </math>a b <nowiki>=</nowiki> a b<math>.
 
Dla dowodu symetrii załóżmy, że </math>(a,b)  (c,d)<math>. Wtedy </math>a
d <nowiki>=</nowiki> c b<math>, czyli </math>c b<nowiki>=</nowiki>a d<math> co oznacza, że </math>(c,d)
(a,b)<math>. Wykazaliśmy symetrię relacji .
 
Aby dowieść przechodniości ustalmy trzy dowolne elementy
</math>{Z}  {Z}^*<math> spełniające </math>(a,b)  (c,d)<math>
oraz </math>(c,d)(e,f)<math>. Wtedy </math>a d <nowiki>=</nowiki> c b<math>, oraz </math>c f
<nowiki>=</nowiki> e d<math> używając przemienności i łączności\footnote{Dowód
łączności mnożenia liczb całkowitych zostawiamy zainteresowanym
czytelnikom} mnożenia liczb całkowitych otrzymujemy </math>a d
f <nowiki>=</nowiki> c b f <nowiki>=</nowiki> e b d<math>. Korzystając z prawa
skracania dla liczb całkowitych, korzystając z założenia, że
</math>d 0<math>, dostajemy </math>a f <nowiki>=</nowiki> e b<math>, czyli </math>(a,b)
(e,f)<math> co należało wykazać.
{\bf Koniec ćwiczenia
\thethm}\par\noindent\ignorespacesafterend 
 
\begindefn  Niech </math>{Q} <nowiki>=</nowiki>  {Z}
{Z}^* / <math>
\enddefn 
 
OZNACZENIE:  Będziemy tradycyjne oznaczać ułamek
</math>{a}{b}<math>. Oznacza on zbiór </math>[ (a,b) ]_{}<math>.
\beginCwiczenieINS 
Dla jakich liczb wymiernych </math>[(a,b)]_{}<math> mamy </math>
[(a,b)]_{} <nowiki>=</nowiki> {Z}<math>? \endCwiczenieINS \setcounter{hint}{0}
 
; Rozwiązanie.
: Po pierwsze zauważmy, że
</math> [(a,b)]_{} <nowiki>=</nowiki> c{Z}: d
(a,b) (c,d)  (a,b) (d,c) <math>. Niewątpliwie musimy więc
mieć </math>(0,d)(a,b)<math> dla pewnego </math>d{Z}<math>~(gdyż </math>0<math> nie
może występować na drugiej współrzędnej). Definicja relacji
implikuje, że </math>0 b <nowiki>=</nowiki> d a<math>, czyli, że </math>a<nowiki>=</nowiki>0<math>. Co więcej
dla dowolnej liczby całkowitej </math>c<math> mamy </math>(0,d)(0,c)<math> ponieważ
</math>0 c <nowiki>=</nowiki> 0 d<math>. Tak więc jedyną klasą równoważności relacji
spełniającą nasz warunek jest zbiór
 
</math></center>(0,d): d{Z}0,
<center><math>
 
który zostanie później nazwany ``zerem'' liczb wymiernych.
{\bf Koniec ćwiczenia
\thethm}\par\noindent\ignorespacesafterend 
 
===Działania na ułamkach===
 
Definiujemy stałe i standardowe działania na ułamkach.
 
* Zero w liczbach wymiernych </math>0  {Q}<math> to </math>[(0, 1) ]_{}<math>.
 
* Jedynka w liczbach wymiernych </math>1  {Q}<math> to ułamek </math>[(1, 1) ]_{}<math>.
 
* </math> - [ (a,b) ]_{} <nowiki>=</nowiki> [(-a, b) ]_{}<math>
 
* dodawanie </math>[ (a,b) ]_{} + [ (c,d) ]_{} <nowiki>=</nowiki> [(ad +bc, bd) ]_{}<math>
 
* odejmowanie </math>[ (a,b) ]_{} - [ (c,d) ]_{} <nowiki>=</nowiki> [(ad - bc, bd)]_{}<math>
 
* mnożenie </math>[ (a,b) ]_{}  [ (c,d) ]_{} <nowiki>=</nowiki>
[(ac, bd) ]_{}<math>
 
* dzielenie, </math>[ (a,b) ]_{} : [ (c,d) ]_{} <nowiki>=</nowiki> [(ad, bc)
]_{}<math> gdy </math>[ (c,d) ]_{}  [(0, d)  ]_{}<math>
 
Tak jak poprzednio w przypadku liczb całkowitych będziemy starali
się utożsamiać liczby całkowite z pewnymi ułamkami.
 
Proszę tak jak poprzednio o zwrócenie uwagi na kolizję oznaczeń.
Jest to zamierzona kolizja oznaczeń, którą
wprowadzamy z pełną świadomością. Po lewej stronie definicji
(dodawania, mnożenia, odejmowania i liczby przeciwnej) używamy
tych samych znaków działań co po stronie prawej.  Pod koniec tej
konstrukcji podamy naturalne włożenie (iniekcje wkładającą liczby
całkowite w wymierne) takie, które zachowuje działania na
liczbach. Upewni nas to, że stosowanie tych samych oznaczeń de
facto nie grozi konfliktem.
 
\beginCwiczenieINS 
Pokazać, że działania na liczbach wymiernych są dobrze określone.
To znaczy pokazać, że zbiory (klasy równoważności) będące wynikiem
działań nie nie zależą od wyboru reprezentantów:
 
\endCwiczenieINS \setcounter{hint}{0}
 
\addtocounter{hint}{1}
; Wskazówka \thehint.
: Zapisz w jaki sposób wynik działań jest niezależny od wyboru
reprezentantów.
 
; Rozwiązanie.
: Pierwszym działaniem, które może zależeć od reprezentantów z
wybranych z klasy równoważności jest branie elementu przeciwnego.
Załóżmy, że </math>(a,b) (c,d)<math>. Wtedy </math>ad<nowiki>=</nowiki>cb<math> i korzystając z
własności liczb całkowitych\footnote{Tylko niektóre z niezbędnych
własności liczb całkowitych zostały wykazane we wcześniejszej
części wykładu. Pozostawiamy dociekliwym czytelnikom możliwość
dowiedzenie wszystkich faktów niezbędnych do rozumowań na liczbach
wymiernych}, </math>(-1) a d <nowiki>=</nowiki> (-1) c  b<math> i dalej
</math>-a d <nowiki>=</nowiki> -c b<math>, czyli </math>[(-a,b)]_{}<nowiki>=</nowiki>[(-c,d)]_{}<math>, co
należało wykazać.
 
Aby dowieść niezależności dodawania ustalmy cztery elementy
</math>{Z}{Z}^*<math> takie, że </math>(a,b) (e,f)<math>, oraz
</math>(c,d)(g,h)<math>. Natychmiast wnioskujemy, że </math>a f <nowiki>=</nowiki> e
b<math>, oraz </math>c h <nowiki>=</nowiki> g d<math> i dalej
 
</math></center>a f  d  h <nowiki>=</nowiki> e  b  d  h { oraz }
c  h  b  f <nowiki>=</nowiki> g  d  b  f.
<center><math>
 
Sumując obie równości i wyłączając wspólne czynniki otrzymujemy
 
</math></center>(f h) (a d + c b) <nowiki>=</nowiki> (b d) ( e h
+ g f)
<center><math>
 
czyli </math>(a d + c b, b d) ( e h + g f,
f h)<math> i dalej
 
</math></center>[(a,b)]_{}+[(c,d)]_{} <nowiki>=</nowiki> [(a d + c b,b d)]_{} <nowiki>=</nowiki>
[(e h + g f,f h)]_{} <nowiki>=</nowiki> [(e,f)]_{} + [(g,h)]_{},
<center><math>
 
co należało wykazać.
 
Niezależność odejmowania jest bezpośrednią konsekwencją faktów
dowiedzionych powyżej. Wystarczy zauważyć, że
</math>[(a,b)]_{}-[(c,d)]_{} <nowiki>=</nowiki> [(a,b)]_{}+ (-[(c,d)]_{})<math>, co wynika
wprost z definicji odejmowania. Ponieważ dodawanie i znajdowanie
elementu przeciwnego są niezależne od wyboru reprezentantów z klas
to również ich złożenie jest od niego niezależne -- czego należało
dowieść.
 
Dla dowodu mnożenia ustalmy cztery elementy
</math>{Z}{Z}^*<math> takie, że </math>(a,b) (e,f)<math>, oraz
</math>(c,d)(g,h)<math>. Z założeń wnioskujemy, że </math>af <nowiki>=</nowiki> be<math>, oraz, że
</math>ch <nowiki>=</nowiki> dg<math>. W związku z tym </math>afch <nowiki>=</nowiki> bedg<math> i, korzystając z
przemienności i łączności mnożenia liczb całkowitych </math>(ac,bd)
(eg,fh)<math>, czyli
 
</math></center>[(a,b)]_{}[(c,d)]_{} <nowiki>=</nowiki> [(ac,bd)]_{}
<nowiki>=</nowiki>[(eg,fh)]_{}<nowiki>=</nowiki>[(e,f)]_{}[(g,h)]_{},
<center><math>
 
co należało wykazać.
 
Dla dowodu dzielenia zauważmy, że dla dowolnego
</math>(c,d)(g,h)<math>~(</math>c,g<math> różne od </math>0<math>) mamy </math>(d,c)(h,g)<math>,
ponieważ oba fakty są równoważne </math>ch<nowiki>=</nowiki>gd<math>~(korzystając z
przemienności mnożenia liczb całkowitych). W związku z tym
``zamiana miejscami'' nie zależy od wyboru reprezentanta klasy
równoważności.  Zauważmy, że </math>[(a,b)]_{}:[(c,d)]_{}
<nowiki>=</nowiki>[(a,b)]_{}[(d,c)]_{}<math> i ponieważ założyliśmy </math>c 0<math>, to
dzielenie jest złożeniem dwóch operacji niezależnych od wyboru
reprezentantów dla klas równoważności -- co należało wykazać.
{\bf Koniec ćwiczenia
\thethm}\par\noindent\ignorespacesafterend 
 
===Porządek ułamków.===
 
\begindefn
 
</math> {a}{b}  {c}{d}<math> gdy </math>(a d - b  c)
b  d  0<math>
\enddefn
 
\beginCwiczenieINS 
Pokaż, że definicja porządku nie jest zależna od wyboru
reprezentanta.
 
\endCwiczenieINS \setcounter{hint}{0}
\addtocounter{hint}{1}
; Wskazówka \thehint.
: Do dowodu zastosuj własności dodawania, mnożenia i
odejmowania liczb całkowitych.
 
; Rozwiązanie.
: Ustalmy dowolne </math>{a}{b} {c}{d}<math>. Wtedy </math>(a
d - b  c)  b  d  0<math> jest równoważne </math>((a d
- b  c) 1 -(b d) 0 )( b  d) 1
0<math>, co z kolej znaczy, że
</math>{a}{b}-{c}{d}{0}{1}<math>. Ponieważ wykazaliśmy
wcześniej, że odejmowanie liczb wymiernych nie zależy od wyboru
reprezentantów dla klasy pozostaje wykazać, że dla
</math>{a}{b}<nowiki>=</nowiki>{e}{f}<math> mamy </math>{a}{b}{0}{1}<math> wtedy
i tylko wtedy, kiedy </math>{e}{f}{0}{1}<math>. Pierwsza
nierówność jest prawdą wtedy i tylko wtedy, kiedy </math>(a 1 -
b 0) b 1<nowiki>=</nowiki>a b 0<math>, a druga, kiedy </math>e f
0<math>. W świetle założenia mówiącego, że
</math>{a}{b}<nowiki>=</nowiki>{e}{f}<math>, czyli, że </math>a f <nowiki>=</nowiki> b e<math>
równoważność otrzymujemy przez analizę dodatniości </math>a,b,e<math> i </math>f<math>.
{\bf Koniec ćwiczenia
\thethm}\par\noindent\ignorespacesafterend  
 
\beginCwiczenieINS 
Pokaż, że porządek liczb wymiernych spełnia postulaty porządku
liniowego to znaczy jest zwrotny, antysymetryczny, przechodni i
spójny.
 
\endCwiczenieINS \setcounter{hint}{0}
\addtocounter{hint}{1}
; Wskazówka \thehint.
: Do dowodu zastosuj własności dodawania liczb
całkowitych i porządku dla liczb całkowitych.
; Rozwiązanie.
: Zwrotność
porządku na liczbach wymiernych jest trywialna. Nierówność
</math>{a}{b}{a}{b}<math> oznacza </math>(ab-ba)bb 0<math> co jest
zawsze prawdą.
 
Dla dowodu antysymetrii załóżmy, że </math>{a}{b}{c}{d}<math>,
oraz </math>{c}{d} {a}{b}<math>. Wtedy </math>(ad-bc)bd 0<math> i
</math>(cb-da)db 0<math>. Ponieważ definicja liczb wymiernych gwarantuje,
że </math>db 0<math> to </math>ad-bc<nowiki>=</nowiki>0<math>, czyli </math>ad<nowiki>=</nowiki>bc<math> co jest definicją
równości </math>{a}{b}<nowiki>=</nowiki>{c}{d}<math>. Antysymetria jest pokazana.
 
Aby pokazać przechodniość wybierzmy trzy liczby wymierne
</math>{a}{b}{c}{d}{e}{f}<math>. Z założeń wynika, że
</math>(ad-bc)bd 0<math>, oraz </math>(cf-de)df 0<math>. Wnioskujemy, że
 
</math></center>adbd bcbd  oraz  cfdf dedf
<center><math>
 
mnożąc nierówności przez, odpowiednio </math>ff<math> i </math>bb<math>~(założenia
gwarantują </math>f 0 b<math>) otrzymujemy
 
</math></center>adbdff bcbdff  oraz  cfdfbb dedfbb
<center><math>


i korzystając z przechodniości nierówności </math>adbdff dedfbb<math>, co
Przedstawiony algorytm można zrealizować za pomocą wielotaśmowej
możemy przekształcić do </math>(af-be)bfdd 0<math>. Ponieważ założenia
maszyny Turinga. Założenie dotyczące konstruowalności pamięciowej
gwarantują, że </math>d 0<math>, to </math>(af-be)bf 0<math>, czyli
jest istotnie wykorzystywane w tej konstrukcji przy implementacji
</math>{a}{b}{e}{f}<math>, co należało pokazać.
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>.


Pozostała nam do wykazania spójność porządku. Bardzo łatwo
Zauważmy, że ilość konfiguracji jest ograniczona przez <math>\displaystyle s(n)</math>, a
zauważyć, że dla dwóch liczb wymiernych </math>{a}{b}<math> i
głębokość rekursji przez <math>\displaystyle \log c^{s(n)}</math>. Oznacza to, że jesteśmy w
</math>{c}{d}<math> mamy </math>(ad-bc)bd 0<math> lub </math>(bc-ad)db 0<math> co
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>.
kończy dowód spójności.
{\bf Koniec ćwiczenia
\thethm}\par\noindent\ignorespacesafterend 


Do rozważań nad konstrukcją liczb rzeczywistych potrzebna nam będzie
{{wniosek|1.1||
definicja wartości bezwzględnej
<center> '''PSPACE''' <math>\displaystyle  = </math> '''NPSPACE''' </center>


\begindefn
</math> | x |  <nowiki>=</nowiki>
x & { gdy }, x 0 <br>
-x & { w przeciwnym przypadku}.
<math>
\enddefn
\beginCwiczenieINS 
Pokaż, warunek trójkąta czyli:
</math></center> | x+y |    | x | + | y |  <center><math>
\endCwiczenieINS \setcounter{hint}{0}
\addtocounter{hint}{1}
; Wskazówka \thehint.
: Rozważ przypadki, kiedy obie liczby są dodatnie, obie
ujemne, jedna dodatnia a druga ujemna. W każdym z przypadków
rozumowanie jest trywialne.
; Rozwiązanie.
: Dowód przeprowadzimy wprowadzając podobną notację dla liczb
całkowitych. Jeśli uda nam się zdefiniować funkcję moduł w ten
sposób, że </math> | n+k |  | n | + | k | <math>,
</math> | nk | <nowiki>=</nowiki> | n |  | k | <math>, </math> | n |  0<math> dla dowolnych
liczb całkowitych, oraz
</math> | {a}{b} | <nowiki>=</nowiki>{ | a | }{ | b | }<math>, to
</math></center> | {a}{b}+{c}{d} |  <nowiki>=</nowiki>  | {ad+bc}{bd} |  <nowiki>=</nowiki>
{ | ad+bc | }{ | bd | }
<center><math>
oraz
</math></center> | {a}{b} |  + | {c}{d} |  <nowiki>=</nowiki>
{ | a | }{ | b | }+{ | c | }{ | d | } <nowiki>=</nowiki>
{ | a |  | d | + | b |  | c | }{ | b |  | d | }.
<center><math>
Żądana nierówność będzie prawdą, jeśli uda nam się wykazać, że
</math></center>[( | a |  | d | + | b |  | c | ) | bd |  -
| ad+bc |  | b |  | d | ] | b |  | d |  | bd |
0,
<center><math>
ale korzystając z właściwości modułu dla liczb całkowitych~(które
wkrótce wykażemy) przekształcamy wzór do
</math></center>[( | ad | + | bc | -
| ad+bc | ] | b |  | c |  | b |  | d |  | b |  | d |
0,
<center><math>
i ponieważ </math> | b | <math> i </math> | d | <math> są stale większe od zera, a
</math> | ad | + | bc |  | ad+bc | <math> w liczbach całkowitych,
nierówność jest dowiedziona.
Pozostaje zdefiniować funkcję moduł w liczbach całkowitych.
Definiujemy ją jako: </math> | [(n,k)]_{} |  <nowiki>=</nowiki> [(l,0)]_{}<math> gdzie </math>l<math>
jest unikalną liczbą naturalną taką, że </math>[(n,k)]_{}<nowiki>=</nowiki>[(l,0)]_{}<math>
lub </math>[(n,k)]_{}<nowiki>=</nowiki>[(0,l)]_{}<math>. Liczba taka istnieje na podstawie
Ćwiczenia~[[##Cw:reprzero|Uzupelnic Cw:reprzero|]] i jest unikalna, ponieważ
</math>[(l,0)]_{}<nowiki>=</nowiki>[(0,p)]_{}<math> implikuje </math>p<nowiki>=</nowiki>l<nowiki>=</nowiki>0<math>, a
</math>[(l,0)]_{}<nowiki>=</nowiki>[(p,0)]_{}<math> implikuje </math>p<nowiki>=</nowiki>l<math>. Pozostaje wykazać
wymagane fakty o funkcji moduł.
Ustalmy dwie liczby całkowite </math>[(n,k)]_{}<math> i </math>[(l,m)]_{}<math> --
wykażemy, że </math> | [(n,k)]_{} +[(l,m)]_{} |
| [(n,k)]_{} |  + | [(l,m)]_{} | <math>. Ponieważ zarówno
dodawanie, jak i porządek nie zależą od wyboru reprezentantów dla
klas równoważności możemy założyć, że </math>n<nowiki>=</nowiki>0<math> lub </math>k<nowiki>=</nowiki>0<math>~(i
równocześnie </math>l<nowiki>=</nowiki>0<math> lub </math>m<nowiki>=</nowiki>0<math>). Jeśli </math>k<nowiki>=</nowiki>0<math> oraz </math>m<nowiki>=</nowiki>0<math> to mamy
</math> | [(n,k)]_{} |  <nowiki>=</nowiki> [(n,k)]_{}<math> oraz
</math> | [(l,m)]_{} | <nowiki>=</nowiki>[(l,m)]_{}<math> i nierówność jest prawdziwa.
Jeśli z kolei </math>n<nowiki>=</nowiki>0<math> i </math>l<nowiki>=</nowiki>0<math>, to
</math></center> | [(n,k)]_{} +[(l,m)]_{} |  <nowiki>=</nowiki>  | [(0,k+m)]_{} |  <nowiki>=</nowiki>
[(k+m,0)]_{} <nowiki>=</nowiki>[(k,0)]_{}+[(m,0)]_{} <nowiki>=</nowiki>  | [(0,k)]_{} |
+ | [(0,m)]_{} |
<center><math>
i nierówność znowu jest spełniona. Pozostają dwa symetryczne
przypadki. Bez straty ogólności możemy założyć, że </math>n<nowiki>=</nowiki>0<math> i </math>m<nowiki>=</nowiki>0<math>.
Wtedy </math> | [(n,k)]_{} +[(l,m)]_{} |  <nowiki>=</nowiki>  | [(l,k)]_{} | <math>
jest niewątpliwie mniejszy od
</math> | [(k,n)]_{} | + | [(l,m)]_{} |  <nowiki>=</nowiki> [(l+k,0)]_{}<math>
ponieważ, zgodnie z definicją modułu pierwsza współrzędna
</math> | [(l,k)]_{} | <math> jest mniejsza lub równa większej z liczb
</math>k<math>, </math>l<math>, która jest z kolei mniejsza lub równa </math>l+k<math>.
Aby dowieść, że w liczbach całkowitych moduł jest rozdzielny
względem mnożenia ustalmy dwie liczby </math>[(n,k)]_{}<math> i
</math>[(l,m)]_{}<math> i, podobnie jak poprzednio, załóżmy, że że </math>n<nowiki>=</nowiki>0<math> lub
</math>k<nowiki>=</nowiki>0<math>~(i równocześnie </math>l<nowiki>=</nowiki>0<math> lub </math>m<nowiki>=</nowiki>0<math>). Wtedy
</math>[(n,k)]_{}[(l,m)]_{} <nowiki>=</nowiki> [(nl+km,lk+mn)]_{}<math>, gdzie co
najwyżej jeden z czterech sumandów jest niezerowy. Moduł
otrzymanej liczby będzie liczbą całkowitą posiadającą na pierwszej
współrzędnej ten właśnie sumand, a na drugiej zero. Równocześnie
</math> | [(n,k)]_{} |  | [(l,m)]_{} | <math> będzie posiadał na
pierwszej współrzędnej dokładnie ten sumand, a na drugiej zero, co
dowodzi żądanej równości.
Aby dowieść, że </math> | [(n,k)]_{} |  0<math> wystarczy zauważyć, że
druga współrzędna pary reprezentującej liczbę jest równa zero i w
związku z tym warunek nierówności jest zawsze spełniony.
Pozostaje wykazać, że
</math> | {a}{b} | <nowiki>=</nowiki>{ | a | }{ | b | }<math>. Rozważmy dwa
przypadki: jeśli </math>{a}{b} 0<math>, to </math> | {a}{b} |  <nowiki>=</nowiki>
{a}{b}<math>. W tym przypadku nierówność implikuje, że
</math>(a1-b0)b1 0<math>, czyli, że </math>a<math> i </math>b<math> są liczbami całkowitymi
tego samego znaku. To znaczy, że posiadają reprezentacje postacie
</math>[(n,0)]_{}<math>  i </math>[(k,0)]_{}<math>~(lub </math>[(0,n)]_{}<math>  i
</math>[(0,k)]_{}<math>). Wnioskujemy, że </math>a  | b |  <nowiki>=</nowiki> b
| a | <math>, czyli </math>{a}{b} <nowiki>=</nowiki> { | a | }{ | b | }<math> co
należało wykazać. W drugim przypadku mamy </math>{a}{b}< 0<math>, czyli
</math>(a1-b0)b1< 0<math>, więc znaki </math>a<math> i </math>b<math> są przeciwne~(posiadają
reprezentacje </math>[(n,0)]_{}<math> i </math>[(0,k)]_{}<math>, lub na odwrót). Wtedy
mamy </math> | {a}{b} |  <nowiki>=</nowiki> {-a}{b}<math> i znowu </math>-a
| b |  <nowiki>=</nowiki> b  | a | <math> jest prawdą. Wykazaliśmy, że moduł
zdefiniowany w liczbach wymiernych jest zgodny z modułem dla liczb
całkowitych, co było ostatnim brakującym faktem w dowodzie.
{\bf Koniec ćwiczenia
\thethm}\par\noindent\ignorespacesafterend 
\begindefn
Rozważmy teraz funkcje </math>j:{Z}  {Q}<math>
identyfikującą liczby całkowite jako pewne specjalne liczby
wymierne zadaną wzorem
</math></center>j(a) <nowiki>=</nowiki> [ (a,1)]_{}
<center><math>
\enddefn
Funkcja ta jest naturalnym włożeniem zbioru </math>{Z}<math> w zbiór
</math>{Q}<math>. Jest iniektywna, zgodna z działaniami i zachowująca
stałe. Pokazanie tych własności będzie treścią następnego
ćwiczenia.
\beginCwiczenieINS 
Pokaż własności włożenia </math>j<math>.
# </math>j(0) <nowiki>=</nowiki> 0<math>
# </math>j(1)<nowiki>=</nowiki>1<math>
# </math>j(a+b) <nowiki>=</nowiki> j(a)+j(b)<math>
# </math>j(a-b) <nowiki>=</nowiki> j(a)-j(b)<math>
# </math>j(a  b) <nowiki>=</nowiki> j(a)  j(b)<math>
# jeżeli </math>x  y<math> to </math>j(x)  j(y)<math>
\endCwiczenieINS \setcounter{hint}{0}
\addtocounter{hint}{1}
; Wskazówka \thehint.
: Pamiętaj, że znaki działań i porządku (oraz </math>0<math> i
</math>1<math>) po prawej i po lewej stronie równości znaczą co innego.
Zapisz każde z powyższych praw ujawniając strukturę liczb
wymiernych.
Zauważ, że w dowodzie będą interweniowały udowodnione już prawa
łączności, przemienności, prawo skreśleń i skracania oraz własności
porządkowe dla liczb całkowitych.
; Rozwiązanie.
: Włożenie </math>j<math> przekształca </math>0<math>
w </math>0<math> i
</math>1<math> w </math>1<math>, co jest trywialną konsekwencją definicji funkcji </math>j<math>.
Aby wykazać, że włożenie jest zgodne z dodawanie, ustalmy dwie
dowolne liczby całkowite </math>a<math> i </math>b<math>. Wtedy
</math>j(a+b)<nowiki>=</nowiki>[(a+b,1)]_{}<nowiki>=</nowiki>[((a1+1b)11,11)]_{} <nowiki>=</nowiki> [(a,1)]_{}
+[(b,1)]_{} <nowiki>=</nowiki> j(a) + j(b)<math> co należało wykazać.
Dla dowodu różnicy ustalmy ponownie </math>a<math> i </math>b<math>, wtedy
</math>j(a-b)<nowiki>=</nowiki>[(a-b,1)]_{}<nowiki>=</nowiki>[((a1-1b)11,11)]_{} <nowiki>=</nowiki> [(a,1)]_{}
-[(b,1)]_{} <nowiki>=</nowiki> j(a) - j(b)<math>, co kończy dowód podobnie jak w
poprzednim przypadku.
Dla dowodu iloczynu, ustalmy znów </math>a<math> i </math>b<math> mamy </math>j(a b) <nowiki>=</nowiki>
[(ab,1)]_{} <nowiki>=</nowiki> [(ab,11)]_{} <nowiki>=</nowiki> [(a,1)]_{}[(b,1)]_{} <nowiki>=</nowiki>
j(a) j(b)<math>, co dowodzi wymaganego faktu.
Dla dowodu zgodności z porządkiem załóżmy, że </math>a b<math> wtedy
</math>b-a 0<math> i dalej </math>(b1-1a)11 0<math> co oznacza, że
</math>[(b,1)]_{}[(a,1)]_{}<math>.
{\bf Koniec ćwiczenia
\thethm}\par\noindent\ignorespacesafterend 
Dzięki włożeniu </math>j<math> będziemy utożsamiali liczbę całkowitą </math>a<math> z
odpowiadającą jej liczbą wymierną </math>j(a) <nowiki>=</nowiki> [ (a,1)]_{}<math>.
==Konstrukcja Cantora liczb rzeczywistych==
\begindefn  Ciągiem elementów zbioru </math>A<math> nazywamy
każdą funkcje </math>a: {N}  A<math>.
Przez </math>a_n<math> oznaczamy element ciągu  </math>a(n)<math>.
\enddefn 
Konstrukcja liczb rzeczywistych pochodzi od \underline{\bf Georg Cantor}\ . Genialny
pomysł \underline{\bf Georg Cantor}\  polega na rozważaniu nieskończonych ciągów liczb
wymiernych spełniających warunek \underline{\bf Augustin Louis Cauchy}\ . Wiemy z analizy (patrz
wykład analiza 1), że ciągi takie są zbieżne. Dlatego ciąg ten
można uważać za aproksymacje liczby rzeczywistej. Będziemy za
liczbę rzeczywistą brać wszystkie takie ciągi aproksymacji, które
w sensie poniższych definicji będą \emph{dowolnie bliskie siebie}.
\begindefn  Ciągiem Cauchy'ego zbioru liczb
wymiernych </math>{Q}<math> nazywamy każdy taki ciąg </math>a: {N}
{Q}<math> który spełnia warunek (Cauchy'ego)
</math></center>_{  {Q} {0.1mm} 
>0}  _{n_0  {N}}  _{p,k  {N}}  (
p>n_0  k >n_0 {0.1mm}    | a_p - a_k |  <  )
<center><math>
\enddefn 
\begindefn  Ciąg  </math>a: {N}
{Q}<math> nazywamy ograniczonym gdy spełnia:
</math></center>_{M>0}  _{n  {N}}    | a_n |  <M
<center><math>
\enddefn 
\bigskip
{{fakt|[Uzupelnij]||
Ciągi Cauchy'ego są ograniczone
}}
}}


{{dowod|[Uzupelnij]||
{{lemat|1.1||
 
Jeśli <math>\displaystyle g(n)\geqslant n</math>, to <math>\displaystyle Dtime(g(n))\subset Dspace(g(n))</math> oraz
Do ciągu Cauchy'ego </math>a<math> będziemy dobierać ograniczenie </math>M<math>.
<math>\displaystyle Ntime(g(n))\subset Nspace(g(n))</math>.
Weźmy dodatnią liczbę wymierną . Dla niej, zgodnie z
definicją  [[##defn:ciagc|Uzupelnic defn:ciagc|]] znajdziemy
tak duże </math>n_0<math>, że dla wszystkich liczb naturalnych </math>p,k<math> poczynając
od </math>n_0 +1<math> będzie zachodzić </math> | a_p - a_k |  < <math>.
Połóżmy za </math>M<math> największą z pośród liczb </math> | a_0 | ,...
| a_{n_0} | <math> oraz </math> | a_{n_0 +1} |  + <math> powiększoną o </math>1<math>.
Łatwo sprawdzić, że tak zdefiniowane </math>M<math> majoryzuje moduły wszystkich
liczb ciągu.
}}
}}


Poniżej wprowadzimy relacje równoważności na zborze ciągów
{{dowod|||
Cauchy'ego,  taką która skleja ciągi, które leżą \emph{dowolnie
Niech będzie dana maszyna deterministyczna <math>\displaystyle \mathcal{MT}</math>
blisko}. Każdy taki ciąg będzie inną aproksymacją tej samej liczby
akceptująca dany język <math>\displaystyle L</math> w czasie <math>\displaystyle g(n)</math>. Do akceptacji słowa <math>\displaystyle w</math>
rzeczywistej. Zbiór wszystkich takich aproksymacji będzie dla nas
o długości <math>\displaystyle n</math> maszyna wykorzystuje co najwyżej <math>\displaystyle g(n)</math> kroków
właśnie liczbą rzeczywistą.
czasowych, czyli odwiedza co najwyżej <math>\displaystyle g(n)+1</math> komórek taśmy.
 
\begindefn  Niech
</math>X<nowiki>=</nowiki> a: {N}
{Q} : a  jest ciągiem Cauchy'ego 
 
Na zbiorze <math>X</math> ciągów Cauchy'ego określamy relację następująco:
dwa ciągi <math>a</math> i <math>b</math> są równoważne co zapisujemy jako <math>a \simeq b</math>
gdy:
 
<center><math>\forall_{\varepsilon >0} \;\; \exists_{n_0 \in \mathbb{N}} \;\; \forall_{n
\in \mathbb{N}} \;\; ( n>n_0 \hspace*{0.1mm} \Rightarrow  \left| a_n - b_n \right|  < \varepsilon )
 
</math></center>
 
{{twierdzenie|[Uzupelnij]||
Relacja <math>\simeq </math> określona na <math>X</math> jest relacją
równoważności. }}
 
{{dowod|[Uzupelnij]||
 
Zwrotność i symetria relacji <math>\simeq </math> są oczywiste. Zajmijmy się
dowodem przechodniości. Niech <math>a \simeq b</math> oraz <math>b\simeq c</math>.
Oznacza to:
 
<center><math>\aligned\forall_{\varepsilon >0} \;\; \exists_{n_1 \in \mathbb{N}} \;\; \forall_{n
\in \mathbb{N}} \;\; ( n>n_1 \hspace*{0.1mm} \Rightarrow  \left| a_n - b_n \right|  < \varepsilon )  \\
\forall_{\varepsilon >0} \;\; \exists_{n_2 \in \mathbb{N}} \;\; \forall_{n
\in \mathbb{N}} \;\; ( n>n_0 \hspace*{0.1mm} \Rightarrow  \left| b_n - c_n \right|  < \varepsilon )
\endaligned</math></center>
 
Weźmy <math>\varepsilon >0</math>. Będziemy dobierać niezależnie liczby <math>n_1</math>
i <math>n_2</math> do <math>\varepsilon /2</math> dla pierwszej i drugiej pary ciągów.
Mamy zatem parę nierówności: dla <math>n>n_1</math> zachodzi  <math> \left| a_n -
b_n \right|  < \varepsilon/2</math> oraz dla <math>n>n_2</math> zachodzi  <math> \left| b_n -
c_n \right|  < \varepsilon/2</math>. Biorąc większą z tych dwóch liczb będziemy
oczywiście jednocześnie spełniać obie nierówności. Zatem dla
<math>n>\max(n_1 , n_2)</math> zachodzą <math> \left| a_n - b_n \right|  < \varepsilon/2</math>
oraz <math> \left| b_n - c_n \right|  < \varepsilon/2</math>. Używając nierówności
trójkąta udowodnionego w ćwiczeniu w rozdziale
[[##cwiczenie_nier_troj|Uzupelnic cwiczenie_nier_troj|]] mamy:


<center><math> \left| a_n - c_n \right|  \leq  \left| a_n - b_n \right|  + \left| b_n - c_n \right|  <
Na podstawie Twierdzenia [[#tw.1.1|1.1]] istnieje maszyna Turinga
\varepsilon/2 + \varepsilon/2 = \varepsilon
<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>
</math></center>


co kończy dowód.
komórek pamięci. Dla niedeterministycznych maszyn Turinga argumentacja
jest identyczna.
}}
}}


Przez liczby rzeczywiste będziemy rozumieli zbiór <math>X/\simeq </math> i
{{wniosek|1.2||
oznaczamy przez <math>\mathbb{R}</math>.
<center> '''P''' <math>\displaystyle  \subset </math> '''NP''' <math>\displaystyle \subset
 
</math> '''PSPACE''' <math>\displaystyle = </math> '''NPSPACE''' </center>
Liczbą rzeczywistą jest zatem zbiór ciągów Cauchy'ego które leżą
''dowolnie blisko'' siebie.  Na każdy taki ciąg można patrzeć
jak na pewną aproksymacje danej liczby rzeczywistej.
 
Ile razy należy poprzedzić znakiem <math>\bigcup</math> zbiór <math>\mathbb{R}</math>,
aby otrzymać <math>\mathbb{N}</math>? {hint}{0}
 
; Rozwiązanie.
: Mamy <math>\mathbb{R}\subseteq
\mathcal{P}(\mathcal{P}(\mathbb{N}\times\mathbb{Q}))</math>, a więc
<math>\bigcup\bigcup\bigcup\bigcup \mathbb{R}\subseteq
\mathbb{N}\cup\mathbb{Q}</math>. Rozumując dalej mamy
<math>\mathbb{Q}\subseteq\mathcal{P}(\mathbb{Z}\times\mathbb{Z})</math>, a więc
<math>\bigcup\bigcup\bigcup\mathbb{Q}\subseteq \mathbb{Z}</math>. W końcu
<math>\mathbb{Z}\subseteq\mathcal{P}(\mathbb{N}\times\mathbb{N})</math> i
<math>\bigcup\bigcup\bigcup\mathbb{Z}\subseteq \mathbb{N}</math>. Reasumując
otrzymujemy
 
<center><math>\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup(\mathbb{R})
\subseteq
\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup(\mathbb{N}\cup
\mathbb{Q}) \subseteq \mathbb{N}.
</math></center>
 
Pozostaje wykazać, że po tylu iteracjach nie otrzymamy niczego mniejszego niż
<math>\mathbb{N}</math>. Niech <math>z:\mathbb{N}\rightarrow\mathbb{Q}</math> będzie funkcją taką, że <math>z(n) = [(0,1)]_{\sim}</math>
dla dowolnego <math>n</math>. Wtedy <math>z</math> jest ciągiem Cauchego i <math>[z]_{\simeq}\in\mathbb{R}</math>.
Ponieważ <math>\bigcup\bigcup z = \mathbb{N}\cup\{[(0,1)]_{\sim}\}</math>, to <math>\bigcup\bigcup\bigcup
[z]_{\simeq} \supset \mathbb{N}\cup\{[(0,1)]_{\sim}\}</math> co implikuje, że
 
<center><math>\mathbb{N}\subseteq\bigcup\bigcup\bigcup\bigcup\mathbb{R},
</math></center>
 
a ponieważ <math>\bigcup\mathbb{N} = \mathbb{N}</math>
 
<center><math>\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\mathbb{R }
=\mathbb{N}
</math></center>
 
i każda większa ilość jest również odpowiednia.
'''Koniec ćwiczenia
'''
 
===Działania na <math>\mathbb{R}</math>===
 
Dla ciągów <math>a</math> i <math>b</math> ciąg <math>a+ b</math> oraz <math>a \cdot b</math> oznaczają ciągi
zadane jako <math>(a +b)(i) = a(i) + b(i)</math> dla każdego <math>i</math>. Tak samo
definiujemy mnożenie: <math>(a \cdot b)(i) = a(i) \cdot b(i)</math>
 
Dodawanie i mnożenie ciągów liczb wymiernych definiujemy po
współrzędnych to znaczy:
 
* dodawanie <math>[ a ]_{\simeq} + [b]_{\simeq} = [a+b]_{\simeq}</math>
 
* mnożenie <math>[ a ]_{\simeq} \cdot [b]_{\simeq} = [a \cdot b]_{\simeq}</math>
 
Poniższe ćwiczenie odpowiada dowodowi ciągłości dodawania i
mnożenia. W innej wersji będziecie państwo zapoznawać się z tym
zagadnieniem na wykładzie 8 analizy matematycznej. Pokazać, że
definicja dodawania i mnożenia liczb rzeczywistych jest poprawna i
niezależna od wyboru reprezentantów:
 
{hint}{0}
{hint}{1}
; Wskazówka .
: Dowód poprawności definicji dodawania oprzeć na
dowodzie twierdzenia [[##thm:def_R|Uzupelnic thm:def_R|]].
 
; Rozwiązanie.
: Pokażemy poprawność definicji mnożenia (lub ciągłość mnożenia w
sensie wykładu 8 analizy matematycznej)
 
{{dowod|[Uzupelnij]||
 
Niech <math>[ a ]_{\simeq} = [a']_{\simeq}</math> oraz  <math>[ b ]_{\simeq} =
[b']_{\simeq}</math>. Pokazujemy, że <math>[ a\cdot b ]_{\simeq} = [a' \cdot
b']_{\simeq}</math>. Weźmy <math>\varepsilon >0</math>. Ciągi <math>a'</math> i <math>b</math> jako ciągi
Cauchy'ego są ograniczone. Niech <math>M</math> będzie wspólnym ograniczeniem
tych ciągów. Dla <math>\varepsilon/(2 \cdot M)</math> dobierzmy takie <math>n_1</math> i
<math>n_2</math> aby  <math> \left| a_k - a'_k \right|  < \varepsilon/(2 \cdot M)</math> i
<math> \left| b_p - b'_p \right| < \varepsilon/(2 \cdot M)</math> dla <math>k>n_1</math> i
<math>p>n_2</math>. Obie nierówności będą zachodzić jednocześnie dla
wszystkich <math>k</math> poczynając od <math>\max(n_1 ,n_2)</math>. Prosty rachunek
korzystający z nierówności trójkąta kończy dowód:
 
<center><math>\aligned \left| a_k \cdot b_k - a'_k \cdot b'_k \right|  =
\left| (a_k - a'_k)\cdot b_k + (b_k - b'_k)\cdot a'_k \right|  & \leq & \nonumber \\
\left| (a_k - a'_k)\cdot b_k \right|  +  \left| (b_k - b'_k)\cdot a'_k \right|  =
\left| (a_k - a'_k) \right| \cdot  \left| b_k \right|  +  \left| (b_k - b'_k) \right| \cdot  \left| a'_k \right|
& \leq & \nonumber\\
\varepsilon/(2 \cdot M ) \cdot M +
\varepsilon/(2 \cdot M ) \cdot M = \varepsilon \nonumber
\endaligned</math></center>


}}
}}


'''Koniec ćwiczenia
{{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:
===Porządek  na <math>\mathbb{R}</math>===
<center> '''P''' <math>\displaystyle  \neq </math> '''NP'''. </center>
 
Relacja <math> [ a ]_{\simeq} < [b]_{\simeq}</math> na
zbiorze liczb rzeczywistych <math>\mathbb{R}</math> jest zdefiniowana jako
 
<center><math>\exists_{\varepsilon > 0} \;\; \exists_{n_0 \in
\mathbb{N}} \;\; \forall_{k>n_0} \;\; a_k +\varepsilon <b_k
</math></center>
 
Będziemy mówili, że liczba wymierna <math>\varepsilon > 0</math> rozdziela
dwa ciągi Cauchy'ego poczynając od elementu <math>a_{n_0 +1}</math>.
 
Słaby porządek definiujemy tak jak zazwyczaj: dla liczb
rzeczywistych <math>x \leq y</math> gdy <math>x < y</math> (patrz definicja
[[##defn:porzadeknaR|Uzupelnic defn:porzadeknaR|]]) lub gdy <math>x=y</math> (patrz definicja
[[##relacja_na_ciagach_Cauchyego|Uzupelnic relacja_na_ciagach_Cauchyego|]]).
 
{{twierdzenie|[Uzupelnij]||


Porządek na <math>\mathbb{R}</math> jest liniowy.
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'''  .
}}
}}


{{dowod|[Uzupelnij]||
==Redukcja i problemy zupełne==


Pokażemy, że dla dowolnych ciągów Cauchy'ego <math>a</math> i <math>b</math> jeżeli  <math> [
{{definicja|2.1 transformacja wielomianowa||
a ]_{\simeq} \neq [b]_{\simeq}</math> to <math> [ a ]_{\simeq} <
[b]_{\simeq}</math> lub <math> [ a ]_{\simeq} > [b]_{\simeq}</math>. Niech zatem <math>
[ a ]_{\simeq} \neq [b]_{\simeq}</math>. Zgodnie z definicją <math>\simeq</math>
oznacza to:


<center><math>
Niech <math>\displaystyle L_1,L_2</math> będą dowolnymi językami nad pewnym alfabetem
\exists_{\varepsilon>0} \;\; \forall_{n\in\mathbb{N}} \;\; \exists_{p\in\mathbb{N}} \;\; p>n \hspace*{0.1mm} \wedge  \left| a_p -b_p \right| \geq \varepsilon
<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>
</math></center>


Dobierzmy do <math>\varepsilon/3</math> liczby <math>n_a</math> i <math>n_b</math> odpowiednio dla ciągów <math>a</math> i <math>b</math>
oraz
tak aby dla wszystkich <math>k,r > \max(n_a ,n_b)</math> zachodziło
<center><math>\displaystyle
<math> \left| a_k - a_r \right|  < \varepsilon/3</math> oraz
w\in L_1 \quad \Longleftrightarrow \quad w' \in L_2.
<math> \left| b_k - b_r \right|  < \varepsilon/3</math>.
Zgodnie z formulą powyżej dla <math> \max(n_a ,n_b)</math> musi istnieć
<math>p_0 > \max(n_a ,n_b)</math>
takie,  że <math> \left| a_{p_0} -b_{p_0} \right| \geq \varepsilon</math>. Ustalmy, że to
<math> a_{p_0} < b_{p_0}</math> (gdy będzie odwrotnie rozumowania jest identyczne).
Weźmy zatem dowolne <math>k>p_0</math>. Zachodzą następujące nierówności:
 
<center><math>\aligneda_{p_0} + \varepsilon & \leq  & b_{p_0} \\
a_k - \varepsilon/3  & < & a_{p_0} < a_k + \varepsilon/3 \\
b_k - \varepsilon/3  & < & b_{p_0} < b_k + \varepsilon/3
\endaligned</math></center>
 
Łatwo pokazać stosując powyższe nierówności, że poczynając od
<math>p_0</math> liczba wymierna <math>\varepsilon/3</math> będzie rozdzielała obydwa
ciągi Cauchy'ego. Mianowicie,
 
<center><math>a_k + \varepsilon/3 <  a_{p_0} + 2 \varepsilon/3 \leq b_{p_0} -
\varepsilon/3 < b_{p_0}
</math></center>
</math></center>


}}
}}


===Włożenie <math>\mathbb{Q}</math> w <math>\mathbb{R}</math>===
{{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'''.


Rozważmy funkcje <math>k:\mathbb{Q} \rightarrow \mathbb{R}</math> zadaną
}}
następująco: dla liczby wymiernej <math>q\in \mathbb{Q}</math> liczba
rzeczywista  <math>k(q)</math> jest klasą równoważności ciągu stale równego
<math>q</math> czyli <math>k(q) = [b]_{\simeq}</math> gdzie <math>b(n) = q</math>. Tak więc liczby
wymierne stają się częścią liczb rzeczywistych. Funkcja <math>k</math> jest
naturalnym włożeniem zbioru <math>\mathbb{Q}</math> w zbiór <math>\mathbb{R}</math>.
Jest ona iniektywna i zgodna z działaniami i porządkiem.
 
# <math>k(a+b) = k(a)+k(b)</math>
 
# <math>k(a-b) = k(a)-k(b)</math>
 
# <math>k(a \cdot b) = k(a) \cdot k(b)</math>
 
# jeżeli <math>a<b</math> to <math>k(a) < k(b)</math>
 
Dzięki włożeniu <math>k</math> będziemy utożsamiali liczbę wymierną <math>q</math> z
odpowiadającą jej liczbą rzeczywistą <math>k(q)</math>.
 
===Rozwijanie liczb rzeczywistych przy podstawie <math>2</math>===
 
{{twierdzenie|[Uzupelnij]||
Dla każdej liczby rzeczywistej <math>0\leq
x <1</math> istnieje ciąg <math>a_x \in 2^{\mathbb{N}}</math> taki, że ciąg jego
sum częściowych <math>b_x: \mathbb{N} \rightarrow \mathbb{Q}</math> dany jako <math> b_k
= \sum_{i=0}^{k} \frac{a_i}{2^{i+1}} </math> spełnia:
 
# <math>b_x</math> jest ciągiem Cauchy'ego
 
# <math>[ b_x ]_{\simeq} = x</math>


Taki ciąg <math>a_x</math> nazywamy rozwinięciem liczby <math>x</math> przy
{{dowod|||
podstawie <math>2</math>.
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.
}}
}}


{{dowod|[Uzupelnij]||
{{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:
Dla liczby rzeczywistej <math>x</math> podamy indukcyjną konstrukcję ciągu
<center><math>\displaystyle
<math>a</math> będącego rozwinięciem dwójkowym liczby <math>x</math> i równolegle ciąg
\forall\; L' \in \mathcal{C} \quad L'\propto L.
<math>b</math> jego sum częściowych. Jeżeli <math>0 \leq x < 1/2</math> to definiujemy
<math>a_0 = 0</math>, w przeciwnym wypadku to znaczy kiedy <math>1/2 \leq x < 1</math>
definiujemy <math>a_0 =1</math>. Załóżmy, że mamy zdefiniowany ciąg <math>a</math> do
wyrazu <math>k</math>. Wyraz <math>k+1</math> definiujemy
 
{| border=1
|+ <span style="font-variant:small-caps">Uzupelnij tytul</span>
|-
| definiujemy <math>a_{k+1} = 1</math>  ||  jeżeli <math>\sum_{i=0}^{k}
\frac{a_i}{2^{i+1}} + \frac{1}{2^{k+2}} \leq x</math>  
|-
| definiujemy <math>a_{k+1} = 0</math> ||  jeżeli <math>\sum_{i=0}^{k}
\frac{a_i}{2^{i+1} }+ \frac{1}{2^{k+2}} > x</math>
 
|}
 
Ciąg <math>b</math> definiujemy tak jak w tezie twierdzenia to znaczy,
<math>b_k = \sum_{i=0}^{k} \frac{a_i}{2^{i+1}}</math>.
 
Pokażemy indukcyjnie, że dla każdego <math>k</math> zachodzi
 
<center><math>
\sum_{i=0}^{k} \frac{a_i}{2^{i+1}} \leq x \leq \sum_{i=0}^{k}
\frac{a_i}{2^{i+1}} + \frac{1}{2^{k+1}} .
</math></center>
</math></center>


Dowód tego faktu pozostawimy jako ćwiczenie [[##do_tw_o_rozwijaniu|Uzupelnic do_tw_o_rozwijaniu|]].
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'''.
Z powyższej nierówności mamy pierwszy  fakt, a mianowicie ciąg sum częściowych
<math>b</math> jest ciągiem Cauchy'ego.
 
}}
}}


Uzupełnij dowód indukcyjny nierówności
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
[[##tw_nierownosc_tw_rozwiniecie|Uzupelnic tw_nierownosc_tw_rozwiniecie|]] pierwszej części tezy
<math>\displaystyle \mathcal{C}</math>, choć sam nie musi do niej należeć.
twierdzenia [[##thm:rozwiniecie|Uzupelnic thm:rozwiniecie|]]. Wykonaj dowód drugiej części
tezy twierdzenia  [[##thm:rozwiniecie|Uzupelnic thm:rozwiniecie|]]. poprzedzającego to
ćwiczenie.
 
{hint}{0}
 
; Rozwiązanie.
: Dowód części drugiej <math>[ b ]_{\simeq} = x</math>.  Niech <math>c</math> będzie
dowolnym ciągiem Cauchy'ego wyznaczającym liczbę rzeczywistą <math>x</math>
czyli  niech <math>[ c ]_{\simeq} = x</math>. Należy pokazać, że ciągi <math>b</math> i <math>c</math> są
równoważne w sensie <math>{\simeq}</math>. Weźmy <math>\varepsilon >0</math>.
Dobierzmy tak duże <math>k</math> aby <math> \frac{1}{2^{k+1}} < \varepsilon</math>.
Dalej wynika trywialnie z nierówności
[[##tw_nierownosc_tw_rozwiniecie|Uzupelnic tw_nierownosc_tw_rozwiniecie|]].
'''Koniec ćwiczenia
''' 
 
Konstrukcja przedstawiona powyżej rozwija liczbę rzeczywistą z przedziału
<math>[0,1)</math> przy podstawie <math>2</math>. Na każdym etapie konstrukcji
sprawdzamy czy w przedziale w którym pracujemy aktualnie liczba znajduje się w
lewej czy tez prawej połówce przedziału. Stosownie do tego wybieramy cyfrę
<math>0</math> lub <math>1</math> rozwinięcia.
Jak łatwo można przypuścić podobną konstrukcję jak w twierdzeniu
[[##thm:rozwiniecie|Uzupelnic thm:rozwiniecie|]]
można wykonać przy dowolnej innej podstawie <math>k\geq 2</math>. W takim
wypadku aktualny analizowany przedział dzielilibyśmy na <math>k</math>
podprzedziałów i
stosownie do położenia liczby wybieralibyśmy jedną z <math>k</math> cyfr
ze zbioru <math>\left\{0,\ldots k-1\right\}\$. Przykładowo gdy za </math>k<math> wybierzemy
</math>k<nowiki>=</nowiki>10<math> dostaniemy przy pomocy takiej konstrukcji rozwinięcie dziesiętne
danej liczby rzeczywistej.
 
Twierdzenie poniżej upewni nas o pewnej ciekawej
własności rozwinięć. Otóż rozwinięcie przy podstawie </math>k<nowiki>=</nowiki>2<math> otrzymane
przy pomocy twierdzenia [[##thm:rozwiniecie|Uzupelnic thm:rozwiniecie|]] zawsze jest takie, że
zera w tym rozwinięciu występują dowolnie daleko. Innymi słowy, nie
jest możliwe aby w rozwinięciu od pewnego miejsca występowały same
jedynki. W przykładzie dotyczącym rozwinięcia dziesiętnego liczby
odpowiada to sytuacji w której nie występują ciągi które  stale od pewnego
miejsca mają cyfrę </math>9<math>.
 
{{twierdzenie|[Uzupelnij]||
Rozwinięcia </math>a<math> uzyskane przy pomocy
konstrukcji twierdzenia [[##thm:rozwiniecie|Uzupelnic thm:rozwiniecie|]] dla liczby  </math>0 x
<1<math> jest zawsze takie że:
 
</math></center>_{k}  _{n>k}  a_n <nowiki>=</nowiki> 0
<center><math>


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


{{dowod|[Uzupelnij]||
{{przyklad|2.1||
 
Rozważmy języki:
Przypuśćmy, że jest przeciwnie niż mówi teza czyli
<center><math>\displaystyle
</math>_{k}  _{n>k}  a_n <nowiki>=</nowiki> 0<math>. Weźmy najmniejsze takie
L_1=\left\{1^i 2^j 3^k\: k=i\cdot j,\: i,j\geqslant 1\right\}\quad,\quad
</math>k<math> i nazwijmy go </math>k_0<math>. Mamy zatem </math>a_{k_0} <nowiki>=</nowiki> 0<math> oraz wszystkie
L_2=\left\{1^i 2^j 4^{2k}\: k=i\cdot j,\: i,j\geqslant 1\right\}.
późniejsze wyrazy </math>a_i <nowiki>=</nowiki>1<math> dla </math>i>k_0<math>. Rozwijana liczba </math>x<math>
</math></center>
spełniać będzie dla każdego </math>p 1<math> nierówność
[[##tw_nierownosc_tw_rozwiniecie|Uzupelnic tw_nierownosc_tw_rozwiniecie|]] czyli zachodzić będzie:
 
</math></center>b_{k_0 -1} + {1}{2^{k_0 +2}} + ...  +{1}{2^{k_0 +p+1}}
x  b_{k_0 -1} + {1}{2^{k_0 +2}} + ...
+{1}{2^{k_0+ p+1}}  +  {1}{2^{k_0 p+ 1}}
<center><math>
 
Liczbą, która spełnia wszystkie te nierówności jest </math> b_{k_0 -1} +
{1}{2^{k_0 +1}}<math>. Mamy zatem zamiast rozwinięcia, które
nieformalnie zapiszemy jako </math>a_0 ... a_{k_0 -1} 0 1 1 1 ...<math>
rozwinięcie </math>a_0 ... a_{k_0 -1} 1 0 0 0  ...<math>. To właśnie to
drugie rozwinięcie zostanie znalezione przez procedurę
rekurencyjną przedstawioną w twierdzeniu [[##thm:rozwiniecie|Uzupelnic thm:rozwiniecie|]].
}}


{{twierdzenie|[Uzupelnij]||
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.
Istnieje bijekcja pomiędzy odcinkiem </math>[0;1)<math>
a zbiorem
</math>a 2^{{N}}: _{k}  _{n>k}  a_n <nowiki>=</nowiki> 0
}}
}}
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ę.


{{dowod|[Uzupelnij]||
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>
Bijekcja jest zdefiniowana przy pomocy techniki wprowadzonej w
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>.
twierdzeniu [[##thm:rozwiniecie|Uzupelnic thm:rozwiniecie|]]. Istnienie funkcji przypisującej
liczbie rzeczywistej <math>x</math> jej rozwinięcie dwójkowe zostało tam
opisane. Własność tego rozwinięcia
<math>\forall_{k} \;\; \exists_{n>k} \;\; a_n = 0</math> została pokazana w
twierdzeniu [[##thm:rozwiniecie2|Uzupelnic thm:rozwiniecie2|]]. Pozostaje uzasadnić
iniektywność takiego przypisania. Niech <math>x \neq y</math>. Załóżmy,
że <math>x < y</math>. Rozważmy zatem ciągi <math>a</math> oraz <math>a'</math> rozwinięć dwójkowych
<math>x</math> i <math>y</math>. Nazwijmy ciągi ich sum częściowych odpowiednio przez <math>b</math> i <math>b'</math>.
Ciągi sum wyznaczają te liczby czyli <math>[ b ]_{\simeq} = x , [b']_{\simeq} =
y</math>. Ciągi <math>b</math> i <math>b'</math> muszą być różne bo inaczej wyznaczałyby te
same liczby. W takim razie ciągi rozwinięć <math>a</math> i <math>a'</math> muszą być
różne.
}}


Powyższe twierdzenie będzie miało fundamentalne znaczenie  w
Warunek <math>\displaystyle L_1 \propto L_2</math> otrzymujemy w sposób identyczny. Trzeba
teorii mocy o którym mowa będzie w wykładzie 9. Pokazuje bowiem że
tylko wypisać odpowiednią ilość symboli <math>\displaystyle 4</math> (a wiemy już, jak
liczby rzeczywiste są równoliczne ze zbiorem <math>2^\mathbb{N}</math>.
konstruować liczbę <math>\displaystyle 2n</math>, mając dane <math>\displaystyle n</math>).

Wersja z 19:24, 3 wrz 2006

Sformułujemy definicje podstawowych klas złożoności w języku maszyn Turinga oraz metodę ich porównywania. Przeanalizujemy związki między rodziną języków określonych przez maszyny Turinga a rodziną języków typu (0) z hierarchii Chomsky'ego. Podamy dalsze własności języków kontekstowych i typu (0). Wprowadzimy pojęcie języka rekurencyjnie przeliczalnego oraz przedstawimy tezę Churcha. Następnie omówimy teoretyczne podstawy teorii rozstrzygalności oraz przeanalizujemy kilka problemów nierozstrzygalnych w teorii języków.


Klasy złożoności obliczeniowej

Jednym z podstawowych celów wprowadzania maszyn Turinga jest dążenie do formalnej definicji złożoności obliczeniowej. Na podstawie wcześniejszych uwag możemy utożsamiać akceptację słowa przez maszynę Turinga z jej zatrzymaniem się. Intuicyjnie, można takie zachowanie maszyny Turinga utożsamić z wykonaniem programu, który zwraca odpowiedź "Tak" na postawione przez nas pytanie.

Definicja 1.1

Ustalmy funkcje t,s:. Mówimy, że maszyna Turinga 𝒯 (deterministyczna lub niedeterministyczna) akceptuje słowo wΣI* w czasie t(|w|), jeśli istnieje ciąg kt(|w|) konfiguracji d1,d2,,dk takich, że d1=s0w, dk=w1sFw2 dla pewnych w1,w2ΣT*,sFSF oraz didi+1 dla i=1,,k1.

Jeśli istnieje ciąg konfiguracji d1d2dm, gdzie d1=s0w, dm jest konfiguracją akceptującą (tzn. dm=w1sFw2 dla pewnych w1,w2ΣT*,sFSF) oraz dodatkowo |di|s(|w|)+2, to mówimy, że maszyna 𝒯 akceptuje słowo wΣI* w pamięci s(|w|).

Mówimy, że język L jest akceptowany w czasie t(n) (pamięci s(n)), jeśli istnieje maszyna Turinga 𝒯, dla której L(𝒯)=L oraz każde słowo wL jest akceptowane w czasie t(|w|) (pamięci s(|w|) odpowiednio).

Uwaga 1.1

W niektórych podejściach wykorzystuje się, do definicji złożoności pamięciowej, tak zwanych maszyn Turinga off-line. Pomysł polega na tym, aby nie uwzględniać komórek taśmy, z których maszyna czytała informacje, a jedynie te, do których następował zapis. Dzięki temu zabiegowi można w sposób "rozsądny" mówić o akceptacji słowa w pamięci logn itp. W ujęciu prezentowanym w tym wykładzie zajmujemy się akceptacją w pamięci nk, dla k1, zatem nie ma potrzeby dodatkowego definiowania maszyn Turinga off-line.

Definicja 1.2

Oznaczmy przez Dtime(t(n)) oraz Dspace(s(n)) rodzinę języków akceptowanych w czasie t(n) i odpowiednio pamięci s(n) przez deterministyczną maszynę Turinga. Dla maszyn niedeterministycznych wprowadzamy w identyczny sposób klasy Ntime(t(n)) oraz Nspace(s(n)).

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

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned \textbd{P} \displaystyle =\bigcup_{k=0}^\infty Dtime(n^k), &\qquad\qquad& \textbd{NP} \displaystyle =\bigcup_{k=0}^\infty Ntime(n^k), \\ \textbd{PSPACE} \displaystyle =\bigcup_{k=0}^\infty Dspace(n^k), && \textbd{NSPACE} \displaystyle =\bigcup_{k=0}^\infty Nspace(n^k). \endaligned}

Wprost z definicji otrzymujemy zależności P NP oraz PSPACE NPSPACE . W dalszej części wykładu udowodnimy kilka mniej oczywistych zależności.

Przykład 1.1

Rozważmy język:

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L=\left\{1^i 2^j 3^k\: k=i\cdot j,\: i,j\geqslant 1\right\}. }

Język L P . Deterministyczna maszyna Turinga MT3 akceptująca taki język może wyglądać następująco (zaczynamy od konfiguracji s0w):

  1. Jeśli symbol pod głowicą, to 1 zamień go na . Inaczej odrzuć.
  2. Przejdź od lewego ogranicznika do prawego, sprawdzając, czy po 1 występuje 1 lub 2, po 2 tylko 2 lub 3, a po 3 kolejny symbol 3 lub ogranicznik. Jeśli ta zależność nie jest spełniona, odrzuć. Gdy osiągniesz ogranicznik wykonaj następny krok.
  3. Gdy przed ogranicznikiem nie znajduje się symbol 3, odrzuć. W przeciwnym razie zamień symbol 3 na , a następnie poruszaj się w lewo, aż dotrzesz do symbolu innego niż 3 i .
  4. Jeśli symbol do którego dotarłeś to 2, zamień go na . Sprawdź symbol po lewej. Jeśli to 2, poruszaj się w prawo aż do ogranicznika. Następnie przejdź do kroku 3.
  5. Jeśli dotarłeś do symbolu 1, poruszaj się w lewo aż do ogranicznika. Zamień symbol 1 przy ograniczniku na , a następnie idź w prawo, zamieniając wszystkie symbole na 2. Gdy dojdziesz do ogranicznika, przejdź do kroku 3.
  6. Jeśli dotarłeś do ogranicznika, oznacza to, że skasowano już wszystkie symbole 1. Przejdź w prawo aż do ogranicznika. Jeśli natrafisz na symbol 3, odrzuć. W przeciwnym przypadku, akceptuj.

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

Przykład 1.2

Rozważmy teraz język

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L=\left\{3^k\: : \: k=i\cdot j } dla pewnych i,j>1}.

Najprostszą metodą uzasadnienia, że L NP jest konstrukcja tak zwanej wyroczni. Polega ona na następującej dwuetapowej procedurze:

  1. Skonstruuj niedeterministyczną maszynę Turinga (wyrocznia) generującą pewne słowo (certyfikat).
  2. Zweryfikuj w sposób deterministyczny spełnienie założeń przez certyfikat.

W naszym przykładzie Etap 1 wygląda następująco:

  1. Użyj dwóch taśm. Na pierwszej z nich znajduje się 3k.
  2. Idź po pierwszej taśmie, wykorzystując niedeterministyczną funkcję przejść. Napotykając 3, możesz wypisać 1 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.
  3. Powróć do początku pierwszej taśmy. Wykonaj sekwencję jak w kroku 2, z tą różnicą, że teraz na drugiej taśmie wypisuj symbole 2.
  4. Jako ostatnią część tego etapu przekopiuj symbole 3 z pierwszej taśmy na drugą (po symbolach 1 i 2).

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 1i2j3k, gdzie i,j>1 oraz k=ij. Jeśli tak, to słowo wejściowe 3k pochodziło z języka L 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 L, 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 L nie ma to znaczenia.

Zastanów się, czy da się wykazać, że także L P (Ćwiczenie 1.3, do tego wykładu).

Definicja 1.3

Funkcja s(n) jest konstruowalna pamięciowo, jeśli istnieje maszyna Turinga 𝒯=(ΣT,S,f,s0,SF), dla której d1*d2, gdzie d1=s01n, d2=s11s(n)w dla s1SF, w(ΣT{1})* oraz dodatkowo d2 jest konfiguracją końcową.

Inaczej mówiąc, funkcję s(n) nazywamy konstruowalną pamięciowo, jeśli istnieje maszyna Turinga 𝒯, otrzymując na wejściu słowo w długości |w|=n, zaznacza na taśmie roboczej s(n) klatek i zatrzymuje się (akceptując słowo w).

Przykład 1.3

Funkcja s(n)=2n jest konstruowalna pamięciowo. Maszyna MT4, która konstruuje s(n) działa według schematu:

  1. Przejdź do prawego markera. Jeśli napotkano symbol inny niż 1, to odrzuć.
  2. Idź w lewo aż do pierwszego symbolu 1 lub markera
  3. Jeśli napotkałeś symbol 1, zamień go na i przejdź do prawego markera. Dopisz do słowa symbol (zwiększając tym samym długość słowa na taśmie o 1). Następnie powtórz cykl od 2.
  4. Jeśli napotkałeś marker, idź w prawo, zamieniając wszystkie wystąpienia na 1. Następnie wracaj do lewego markera i zatrzymaj się, akceptując.

Twierdzenie 1.1 liniowa kompresja pamięci

Niech będzie dany język L oraz maszyna Turinga 𝒯 akceptująca L w pamięci s(n). Dla dowolnego ε>0 istnieje maszyna Turinga 𝒯 akceptująca L w pamięci max{n,εs(n)}.

Dowód

(Szkic) Ustalamy liczbę naturalną k, dla której εk2. Maszynę 𝒯 definiujemy następująco:

  1. Przekoduj słowo wejściowe, łącząc po r kolejnych symboli w jeden blok stanowiący nowy symbol na taśmie.
  2. Symuluj maszynę 𝒯 na skompresowanej taśmie. Położenie głowicy wewnątrz bloku zakoduj w stanach maszyny 𝒯.

Zauważmy, że w kroku 1. maszyna 𝒯 wykorzystuje n komórek pamięci do odczytania słowa wejściowego. Kompresja taśmy zapewnia, że podczas symulowania maszyny 𝒯 nie wykorzystamy więcej niż s(n)kεs(n) komórek. Jednocześnie można założyć, że 𝒯 akceptuje słowa wejściowe z języka L o długości mniejszej niż k bez symulowania 𝒯.

Twierdzenie 1.2 Savitch

Dla dowolnej funkcji s(n) konstruowalnej pamięciowo spełniającej warunek s(n)log2n prawdziwa jest inkluzja Nspace(s(n))DSpace(s2(n)).

Dowód

Niech 𝒩𝒯 będzie niedeterministyczną maszyną Turinga akceptującą język L=L(𝒩𝒯) w pamięci s(n). Niech k(n) oznacza liczbę konfiguracji potrzebną do zaakceptowania słowa o długości n. Istnieje liczba c>1, dla której k(n)cs(n), co z kolei oznacza, że każde słowo o długości n jest akceptowane w cs(n) krokach czasowych.

Rozważmy algorytm:

Algorytm


  1  Wejście: słowo w długości |w|=n
  2  oblicz s(n)
  3  for każda konfiguracja akceptująca dA dla której |dA|s(n)
  4    do if Test(s0w, dA, s(n)log2c) then akceptuj

gdzie procedura Test ma następującą postać:

Algorytm Procedure Test(d,d,i)


  1  if i=0 and [ (d=d) or (dd)] then return true
  2    else for każda konfiguracja d dla której |d|s(n)
  3      do if Test(d,d,i1) and Test d,d,i1)
  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ć s(n) komórek taśmy, aby móc konstruować konfiguracje o długości ograniczonej przez s(n) i móc następnie wykonywać na nich symulację maszyny 𝒩𝒯.

Zauważmy, że ilość konfiguracji jest ograniczona przez s(n), a głębokość rekursji przez logcs(n). Oznacza to, że jesteśmy w stanie skonstruować maszynę Turinga, która wymaga cs2(n) pamięci, gdzie c jest pewną stałą. Na mocy Twierdzenia 1.1 jesteśmy w stanie określić maszynę 𝒯 działającą w pamięci s2(n).

Wniosek 1.1

PSPACE = NPSPACE

Lemat 1.1

Jeśli g(n)n, to Dtime(g(n))Dspace(g(n)) oraz Ntime(g(n))Nspace(g(n)).

Dowód

Niech będzie dana maszyna deterministyczna 𝒯 akceptująca dany język L w czasie g(n). Do akceptacji słowa w o długości n maszyna wykorzystuje co najwyżej g(n) kroków czasowych, czyli odwiedza co najwyżej g(n)+1 komórek taśmy.

Na podstawie Twierdzenia 1.1 istnieje maszyna Turinga 𝒯 wykorzystująca

max{n,12(g(n)+1)}g(n)

komórek pamięci. Dla niedeterministycznych maszyn Turinga argumentacja jest identyczna.

Wniosek 1.2

P NP PSPACE = NPSPACE
Uwaga 1.2

Nie jest znany przykład wykazujący silną inkluzję P NP ani dowód wykluczający istnienie takiego przykładu. Powszechnie uznawana hipoteza głosi:

P NP.

Rozstrzygnięcie jej prawdziwości lub fałszywości stanowi jeden z najważniejszych, a zarazem najtrudniejszych problemów współczesnej informatyki. Jak widzieliśmy w Przykładzie 1.2, nawet w przypadku konkretnego języka L NP, problem uzasadnienia, że także L P, jest nietrywialny, gdyż wymaga zazwyczaj konstrukcji całkiem nowej maszyny Turinga niż ta do weryfikacji L NP .

Redukcja i problemy zupełne

Definicja 2.1 transformacja wielomianowa

Niech L1,L2 będą dowolnymi językami nad pewnym alfabetem ΣI. Mówimy, że L1 redukuje się do L2 w czasie wielomianowym, co oznaczamy L1L2, gdy istnieje deterministyczna maszyna Turinga 𝒯=(ΣT,S,f,s0,SF) taka, że dla dowolnego wΣI* istnieje wΣI* i stan s1SF o własności

s0w*s1w

oraz

wL1wL2.

Lemat 2.1

Załóżmy, że L1L2. Wtedy zachodzą implikacje:

  1. L2 P      L1 P,
  2. L2 NP      L1 NP,
  3. L2 PSPACE      L1 PSPACE.

Dowód

Dane słowo w transformujemy do w w czasie wielomianowym, co gwarantuje założenie L1L2. Dzięki założeniu L2 P możemy rozstrzygnąć, czy wL2 (tzn. jeśli akceptujemy w, to robimy to w czasie wielomianowym). Tym sposobem (korzystając z definicji transformacji wielomianowej) akceptujemy w w czasie wielomianowym, o ile tylko wL1. Dowód dla pozostałych implikacji jest identyczny.

Definicja 2.2

Niech 𝒞 oznacza pewną klasę języków. Język L nazywamy 𝒞-trudnym, jeśli spełniony jest warunek:

L𝒞LL.

Jeżeli dodatkowo spełniony jest warunek L𝒞, to język L nazywamy 𝒞-zupełnym.

Intuicyjnie, fakt, że język jest 𝒞-zupełny, oznacza, że jest on najbardziej skomplikowany (pod względem obliczeniowym) wśród języków z klasy 𝒞, natomiast język 𝒞-trudny jest bardziej skomplikowany niż każdy z klasy 𝒞, choć sam nie musi do niej należeć.

Uwaga 2.1

Rozważając klasę P , NP i PSPACE, możemy mówić o językach (problemach) P -zupełnych, NP -zupełnych, czy też PSPACE -zupełnych. To samo odnosi się do języków trudnych (tzn. klasa języków P -trudnych, itd.).

Przykład 2.1

Rozważmy języki:

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L_1=\left\{1^i 2^j 3^k\: k=i\cdot j,\: i,j\geqslant 1\right\}\quad,\quad L_2=\left\{1^i 2^j 4^{2k}\: k=i\cdot j,\: i,j\geqslant 1\right\}. }

Języki: L1 oraz L2 wyglądają na bardzo podobne, zatem wydaje się, że L1L2 oraz L2L1. Uzasadnienie tego faktu jest prawie natychmiastowe.

Konstruujemy deterministyczną maszynę Turinga która działa w następujący sposób:

  1. Jeśli słowo wejściowe jest puste, to stop.
  2. Przejdź do prawego ogranicznika. Jeśli przy ograniczniku nie występuje symbol 4, to wykonaj krok 1.
  3. Jeśli w słowie wejściowym występuje symbol 4, to sprawdź, czy słowo przetwarzane jest postaci w4s, gdzie s1 oraz w(ΣI{4})* oraz czy dodatkowo s jest liczbą parzystą. Jeśli nie, to wykonaj krok 1.
  4. Zamień słowo 4s na słowo 3s2s2 i wykonaj krok 1.
  5. Przejdź nad pierwszy symbol po lewym ograniczniku i zatrzymaj się.

W ten sposób zawsze przeprowadzamy konfigurację s0w na konfigurację s1w, przy czym w=1i2j3k tylko, gdy w=1i2j42k. Zatem wL2 wtedy i tylko wtedy, gdy wL1. Wykazaliśmy, że L2L1.

Warunek L1L2 otrzymujemy w sposób identyczny. Trzeba tylko wypisać odpowiednią ilość symboli 4 (a wiemy już, jak konstruować liczbę 2n, mając dane n).