圖靈機

圖靈機（Turing machine），又稱確定型圖靈機，是英國數學家艾倫·圖靈於1936年提出的一種將人的計算行為抽象化的數理邏輯機，其更抽象的意義為一種計算模型，可以看作等價於任何有限邏輯，數學過程的強大可計算機器。

## 圖靈的基本思想

圖靈的基本思想是用機器來模擬人們用紙筆進行數學運算的過程，他把這樣的過程看作下列兩種簡單的動作：

- 在紙上寫上或擦除某個符號。
- 把注意力從紙的一處移動到另一處。

而在每個階段，人要決定下一步的動作，依賴於（a）此人當前所關注的紙上某個位置的符號和（b）此人當前思維的狀態。

為了模擬人的這種運算過程，圖靈構造出一台假想的機器，該機器由以下幾個部分組成：

- 一條無限長的紙帶TAPE。紙帶被劃分為一個接一個的小格子，每個格子上包含一個來自有限字母表的符號，字母表中有一個特殊的符號$\square$表示空白。紙帶上的格子從左到右依次被編號為0, 1, 2, ...，紙帶的右端可以無限伸展。
- 一個讀寫頭HEAD。它可以在紙帶上左右移動，能讀出當前所指的格子上的符號，並能改變它。
- 一套控制規則數量有限的TABLE（A finite table of instructions）。它根據當前機器所處的狀態以及當前讀寫頭所指的格子上的符號來確定讀寫頭下一步的動作，並改變狀態寄存器的值，令機器進入一個新的狀態。按照以下順序告知圖靈機命令：
- 1. 寫入（替換）或擦除當前符號。
- 2. 移動 HEAD， 'L'向左， 'R'向右或者'N'不移動。
- 3. 保持當前狀態或者轉到另一狀態。
- 一個狀態寄存器。它用來保存圖靈機當前所處的狀態。圖靈機的所有可能狀態的數目是有限的，並且有一個特殊的狀態，稱為停機狀態。參見停機問題。

注意這個機器的每一部分都是有限的，但它有一個潛在的無限長的紙帶，因此這種機器只是一個理想的設備。圖靈認為這樣的一台機器就能模擬人類所能進行的任何計算過程。

## 圖靈機的形式定義

一台圖靈機是一個七元有序組$M = \langle Q, \Gamma, b, \Sigma, \delta, q_0, F \rangle$，滿足：

- $Q$是非空有限狀態集合。
- $\Gamma$是非空有限帶字母表且$\Sigma \subset \Gamma$。
- $b \in \Gamma$ 是空白符（唯一允許出現在帶上無限次的字符）。
- $\Sigma\subseteq\Gamma\setminus\{b\}$是非空有限輸入字母表，也就是出現在初始帶上的字符集合。
- $\delta: (Q \setminus F) \times \Gamma \rightharpoonup Q \times \Gamma \times \{L,R\}$是轉移函數，其中$L$表示讀寫頭是向左移，$R$表示讀寫頭是向右移。
- $q_0 \in Q$是起始狀態。
- $F \subseteq Q$是最終狀態的集合。

圖靈機將以如下方式運作：

開始的時候將輸入符號串$$\omega=\omega_0\omega_1\ldots\omega_{n-1} \in \Sigma^*$$ 從左到右依此填在紙帶的第$0, 1, \ldots , n-1$號格子上，其他格子保持空白（即填以空白符$b$）。

$M$的讀寫頭指向第0號格子。

$M$處於狀態$q_0$。機器開始運行後，按照轉移函數$\delta$所描述的規則進行計算。例如，若當前機器的狀態為$q$，讀寫頭所指的格子中的符號為$x$，設$\delta(q,x) =(q', x', L)$，則機器進入新狀態$q'$，將讀寫頭所指的格子中的符號改為$x'$，然後將讀寫頭向左移動一個格子。若在某一時刻，讀寫頭所指的是第0號格子，但根據轉移函數它下一步將繼續向左移，這時它停在原地不動。換句話說，讀寫頭始終不移出紙帶的左邊界。若在某個時刻$M$根據轉移函數進入了狀態$q \in F$，則它立刻停機並接受輸入的字串。

注意，轉移函數$\delta$是一個部分函數，換句話說對於某些$q$,$x$，$\delta(q,x)$可能沒有定義，如果在運行中遇到下一個操作沒有定義的情況，機器將立刻停機。

## 圖靈機的基本術語

設 $M = \langle Q, \Gamma, b, \Sigma, \delta, q_0, F \rangle$ 是一台圖靈機。

- $M$的帶描述（tape description）是一個函數$D: \mathbb{N} \to \Gamma$，其中$D(i)$表示$M$的帶上第$i$個格子中的符號。
- $M$的格局（configuration）是一個三元組$(D, q, e)$，其中$D: \mathbb{N} \to \Gamma$是當前的帶描述，$q \in Q$是當前的狀態，$e \in \mathbb{N}$是當前讀寫頭所處的位置。
- 設$C_1 =(F_1, q_1, e_1)$, $C_2 =(F_2, q_2, e_2)$是$M$的格局，設$\delta(q_1, D_1(e_1)) =(q, x, d)$，若滿足$q_2=q$，$e_2=\begin{cases} e_1 - 1 & d = L \\ e_1 + 1 & d = R \end{cases}$以及$D_2(i)=\begin{cases} D_1(i) & i \neq e_1 \\ x & i = e_1 \end{cases}$則稱$M$從格局$C_1$ 產生格局$C_2$，記作$C_1 \to_M C_2$。
- 設$C =(D, q, e)$為$M$的格局，若$q = q_{accept}$則稱$C$為接受格局；若$q = q_{reject}$則稱$C$為拒絕格局；接受格局和拒絕格局統稱為停機格局。

設$M$是一台圖靈機，將字串$$\omega=\omega_0\omega_1\ldots\omega_{n-1}$$ 作為其輸入，若存在格局序列$C_1, C_2, \ldots, C_k$，使得

- $C_1$是$M$在輸入$\omega$上的起始格局，即$C_1 =(D,q_0,0)$，其中$F_1(i) = \begin{cases} \omega_i & 0 \leq i \leq n-1 \\ b & \mbox{otherwise} \end{cases}$
- $C_i \to_M C_{i+1}$，其中$i = 1, 2, \ldots, k-1$。
- $C_k$是接受格局。

則稱$M$ 接受字串$\omega$，且$C_1, C_2, \ldots, C_k$稱為圖靈機$M$在輸入$\omega$上的接受計算歷史。同理，若$C_k$是拒絕格局，則稱$M$ 拒絕$\omega$，且$C_1, C_2, \ldots, C_k$稱為圖靈機$M$在輸入$\omega$上的拒絕計算歷史。$M$所接受的所有字串的集合稱為$M$的語言，記作$L(M)$。

## 圖靈機的例子

設$M=(\{A,B,C,D,S\}, \{0,1,b\}, b, \{0,1\}, \delta, A, \{S\})$和$\delta:\{A,B,C,D\}\times\{0,1,b\}\to\{A,B,C,D,S\}\times\{0,1,b\}\times\{R,L\}$.

比如做一個以1的個數表示數值的加法運算，在磁帶上的數據是0000001110110000，就是3+2的意思。程序$\delta$如下：

A,0 -> A,0R

A,1 -> B,1R

B,0 -> C,1R

B,1 -> B,1R

C,0 -> D,0L

C,1 -> S,0R

第一行程序0,0->0,0R意思就是如果機器讀到0，就將其變成0，狀態變為0，讀寫頭向右移動一格. R就是向右移動一格，L就是向左移一格，E是錯誤，S是停機. xx,y -> aa,b中xx是當前狀態, y是當前格子的值, aa是程序下一步的狀態, b是當前格的修改值。

雖然這裡給出與上面不同形式的定義，但兩者是等價的，這裡的定義能完成的工作並不比上面的定義多。

步數｜狀態（執行前）｜轉移函數｜狀態（執行後）｜磁帶（執行前）｜磁帶（執行後）

1｜0｜A,0 -> A,0R｜A｜0000001110110000｜0000001110110000

2｜A｜A,0 -> A,0R｜A｜0000001110110000｜0000001110110000

3｜A｜A,0 -> A,0R｜A｜0000001110110000｜0000001110110000

4｜A｜A,0 -> A,0R｜A｜0000001110110000｜0000001110110000

5｜A｜A,0 -> A,0R｜A｜0000001110110000｜0000001110110000

6｜A｜A,0 -> A,0R｜A｜0000001110110000｜0000001110110000

7｜A｜A,1 -> B,1R｜B｜0000001110110000｜0000001110110000

8｜B｜B,1 -> B,1R｜B｜0000001110110000｜0000001110110000

9｜B｜B,1 -> B,1R｜B｜0000001110110000｜0000001110110000

10｜B｜B,0 -> C,1R｜C｜0000001110110000｜0000001111110000

11｜C｜C,1 -> C,1R｜C｜0000001111110000｜0000001111110000

12｜C｜C,1 -> C,1R｜C｜0000001111110000｜0000001111110000

13｜C｜C,0 -> D,0L｜D｜0000001111110000｜0000001111110000

14｜D｜C,1 -> S,0R｜S｜0000001111110000｜0000001111100000

## 通用圖靈機

對於任意一個圖靈機，因為它的描述是有限的，因此我們總可以用某種方式將其編碼為字串。我們用$\langle M \rangle$表示圖靈機$M$的編碼。

我們可以構造出一個特殊的圖靈機，它接受任意一個圖靈機$M$的編碼$\langle M\rangle$，然後模擬圖靈機$M$的運作，這樣的圖靈機稱為通用圖靈機（Universal Turing Machine）。現代電子計算機的計算模型其實就是這樣一種通用圖靈機，它先接受一段描述另一圖靈機，例如圖靈機$X$的action table的字串，然後運行寫給圖靈機$X$的程序$Y$，這樣通用圖靈機執行程序$Y$就像圖靈機$X$一樣，能正確執行並實現程序$Y$所描述的演算法。

## 圖靈機的變體

圖靈機有很多變種，但可以證明這些變種的計算能力都是等價的，即它們識別同樣的語言類。證明兩個計算模型$A$和$B$的計算能力等價的基本思想是：用$A$和$B$相互模擬，若$A$可模擬$B$且$B$可模擬$A$，顯然他們的計算能力等價。注意這裡我們暫時不考慮計算的效率，只考慮計算的理論上「可行性」。

首先我們可以發現，改變圖靈機的帶字母表並不會改變其計算能力。例如我們可以限制圖靈機的帶字母表為$\{0,1\}$，這並不會改變圖靈機的計算能力，因為我們顯然可以用帶字母表為$\{0,1\}$的圖靈機模擬帶字母表為任意有限集合$\Gamma$的圖靈機。

另一個要注意的是，如果我們允許圖靈機的紙帶兩端都可以無限伸展，這並不能增加圖靈機的計算能力，因為我們顯然可以用只有紙帶一端能無限伸展的圖靈機來模擬這種紙帶兩端都可以無限伸展的圖靈機。

如果我們允許圖靈機的讀寫頭在某一步保持原地不動，那也不會增加其計算能力，因為我們可以用向左移動一次再向右移動一次來代替在原地不動。

其它的常見圖靈機變種包括：

- 多帶圖靈機
- 非確定型圖靈機
- 交替式圖靈機
- 枚舉器

## 圖靈可計算性

- 圖靈可識別語言
- 圖靈可判定語言
- 遞歸可枚舉語言
- 可計算函數
- 遞歸函數
- 停機問題
- 可判定性
- 不可判定性
- 不可解度

## 其它等價的計算模型

除了圖靈機以外，人們還發明了很多其它的計算模型。包括：

- 寄存器機
- 遞歸函數
- λ演算
- 生命遊戲
- 馬爾可夫算法

然而這些模型無一例外地都和圖靈機的計算能力等價，因此邱奇，圖靈和哥德爾提出了著名的邱奇-圖靈論題：一切直覺上能計算的函數都可用圖靈機計算，反之亦然。

## 定理

- 克萊尼–波斯特定理
- 弗里德堡–穆奇尼克定理
- 波斯納–羅賓遜定理
- 跳躍逆轉定理

## 外部連結

- Visual Turing, a Turing machine interactive simulator/IDE（free software for Windows）。
- Suzanne Brittons Turing Machine Simulator（java applet）。
- C++ Simulator of a Nondeterministic and Deterministic Turing Machine（free software）。
- Citations from CiteSeer