图灵机

<image>

图灵机（Turing machine），又称确定型图灵机，是英国数学家艾伦·图灵于1936年提出的一种将人的计算行为抽象化的数理逻辑机，其更抽象的意义为一种计算模型，可以看作等价于任何有限逻辑，数学过程的强大可计算机器。

## 图灵的基本思想

图灵的基本思想是用机器来模拟人们用纸笔进行数学运算的过程，他把这样的过程看作下列两种简单的动作：

- 在纸上写上或擦除某个符号。
- 把注意力从纸的一处移动到另一处。

而在每个阶段，人要决定下一步的动作，依赖于（a）此人当前所关注的纸上某个位置的符号和（b）此人当前思维的状态。

<image>

<image>

为了模拟人的这种运算过程，图灵构造出一台假想的机器，该机器由以下几个部分组成：

- 一条无限长的纸带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