Izračunljivost#
Turingovi stroji#
Turingov stroj \(M\) je peterica \((\Gamma, \Box, Q, q_0, \delta)\), kjer je:
\(\Gamma\) končna množica simbolov
\(\Box \in \Gamma\) prazni simbol
\(Q\) končna množica stanj
\(q_0 \in Q\) začetno stanje
\(\delta : \Gamma \times Q \rightharpoonup \Gamma \times Q \times \{ \mathtt{L}, \mathtt{R} \}\) prehodna funkcija.
V nadaljevanju naj \(M\) označuje Turingov stroj podan s peterico \((\Gamma, \Box, Q, q_0, \delta)\). Označimo \(f(x) \uparrow\), kadar delna funkcija \(f : X \rightharpoonup Y\) na \(x \in X\) ni definirana.
Množica trakov \(\mathbb{T}_M\) Turingovega stroja \(M\) je množica vseh funkcij \(t : \mathbb{Z} \to \Gamma\), ki so povsod razen na končno mnogo vrednostih enake praznemu simbolu:
Konfiguracija Turingovega stroja \(M\) je trojica \((q, t, i) \in \mathbb{K}_M = Q \times \mathbb{T} \times \mathbb{Z}\), kjer \(q\) opisuje trenutno stanje, \(t\) vsebino traku, \(i\) pa mesto glave na traku.
Delna funkcija \(\mathsf{step}_M : \mathbb{K}_M \rightharpoonup \mathbb{K}_M\), ki na konfiguraciji izvede en korak Turingovega stroja.
kjer \(t[i \mapsto a]\) označuje trak, ki je pri \(i\) enak \(a\), drugje pa enak kot \(t\):
Delna funkcija \(\mathsf{run}_M : \mathbb{K}_M \rightharpoonup \mathbb{T}_M\) Turingov stroj izvaja, dokler se ne ustavi:
Pozor: funkcija \(\mathsf{run}_M\) je definirana le v primeru, kadar se stroj ustavi, torej če \(\mathsf{step}_M\) na neki konfiguraciji ni definiran. Če stroj vedno lahko naredi še en korak, se nikoli ne ustavi in zato \(\mathsf{run}_M\) ni definirana.
Fiksirajmo \(\Gamma = \{ 0, 1, \Box \}\). Naj bo \(\underline{n}\) trak, ki predstavlja število \(n \in \mathbb{N}\), zapisano v dvojiškem zapisu. Na primer:
Za Turingov stroj \(M\) definirajmo funkcijo \(\mathsf{eval}_M : \mathbb{N} \rightharpoonup \mathbb{N}\), kot
Funkcija \(f : \mathbb{N} \rightharpoonup \mathbb{N}\) je izračunljiva natanko tedaj, kadar obstaja Turingov stroj \(M\), da je \(f = \mathsf{eval}_M\).
Definicijo lahko razširimo na funkcije več spremenljivk \(\mathsf{eval}_M : \mathbb{N}^k \rightharpoonup \mathbb{N}\) tako, da na trak zapišemo več števil, ločenih s presledki
Univerzalni Turingov stroj#
Obstaja univerzalni Turingov stroj \(\mathcal{U}\), da za vsak Turingov stroj \(M\) obstaja njegova koda \(k_M \in \mathbb{N}\), tako da za vse \(n \in \mathbb{N}\) velja
V resnici lahko univerzalni Turingov stroj simulira \(M\) na vseh vhodih, ne le na \(\underline{n}\), ampak zgornja trditev je enostavnejša in hkrati dovolj za našo uporabo.
Ustavitveni problem#
Ne obstaja Turingov stroj \(\mathcal{H}\), da bi za vsak Turingov stroj \(M\) veljalo
Proof. Recimo, da tak stroj obstaja. Tedaj lahko definiramo tudi stroj \(X\), ki se bo na vhodu \(k_M\) obnašal ravno nasprotno kot \(M\): če se bo \(M\) na \(k_M\) ustavil, bo \(X\) divergiral, in obratno.
Toda tudi stroj \(X\) mora imeti neko kodo \(k_X\), zato velja
Torej \(X\) na \(k_X\) divergira natanko takrat, kadar konvergira in obratno. To pa je protislovje.