Lecture 4. Turing Machines 图灵机
图灵机与有穷自动机的区别
- 图灵机既能读也能写
- 图灵机的读写头,可以向左右两边移动(但是只能挪一个格子)
- 图灵机的带子长度无限
- 图灵机进入接受状态或拒绝状态则立即停机
- 图灵机在任意时刻都可以进入接受或拒绝状态,不一定是要在输入结束的时候
图灵机形式化定义
图灵机是一个七元组 ,其中, 都是有穷集,且:
- 是状态集
- 是输入字母表。特殊空白符号
- 是纸带的字母表。输入字母表是纸带字母表的子集,即 且特殊空白符号 (于是应该能推出 )。
- 是转移函数。即:当机器处于状态 ,读写头所在的带子位置的符号是 ,则当 时,机器写下符号 来取代 ,进入状态 ,并让 读写头 向左或者向右移动。更进一步:如果要弄一个非确定性的图灵机,把转移函数改成 ,也就是像 DFA 到 NFA 或者 PDA 到 NPDA 的转变一样,弄一个幂集出来,这样每一步的转移都可以是一个集合,意味着有多个分支。
- 是起始状态, 是接受状态, 是拒绝状态,且
初始状态下,图灵机带子上从左到右前 个格子填写了输入串 ,其余部分保持空白。然后读写头从最左边的位置开始移动(根据转移函数描述的规则)。如果读写头已经处于最左边但是还有向左移动的指令,则停在原地不动。一旦进入接受状态或拒绝状态则立即停机(halt),否则永远持续运行(永远运行,即永不进入接受状态,相当于拒绝了)。
不过图灵机的这种形式化定义显得太麻烦了,所以有时候直接用自然语言描述会更简单。比如,刚刚证明过的 不是 CFL,这里设计一个图灵机来识别它。这个图灵机的工作流程可以用自然语言描述如下:
- 从左到右读完整个输入,直到遇到第一个 代表输入结束。读的时候检查这个读入是否是 的形式。如果不是,立即拒绝
- 读写头回到左端点
- 从左往右扫描。将第一个 划掉(即用 来代替,不是擦除):
- 如果替换的 都是最后一个,则进入接受状态
- 如果 当中,有的是最后一个,有的不是最后一个,意味着数量不相等,进入拒绝状态
- 如果 都还有剩余,则重复这个过程
一点新概念
图灵机 接受的字符串的集合,就是被 识别的语言,记作 。
如果一个语言能被图灵机识别,则称这个语言是 图灵可识别的(Turing-recognizable)。此外,一个语言是图灵可识别的,当且仅当存在一台 队列自动机(queue automaton) 识别(类似下推自动机,栈换成了队列)它。此外,还有的课本,把图灵可识别的语言称为递归可枚举语言,因为一个语言是图灵可识别的,当且仅当它是递归可枚举的。
如果一个图灵机对于任何输入,都永不无限运行,则这个图灵机称为 判定器(decider)。假如判定器 可以识别语言 ,则称 判定 。如果一个语言能被某个判定器判定,则称这个语言是 图灵可判定的(Turing-decidable),简称 可判定的(decidable)。
图灵可判定比图灵可识别的定义更加严格,因此图灵可判定的语言的集合,是图灵可识别的语言的集合的子集。同时,CFL 也是图灵可判定的集合的子集,正则语言是 CFL 的子集。

这张关系图会在「可判定性」章节中继续讨论。
格局
图灵机有一个新的概念叫做 格局(configuration),是指(当前状态、当前纸带内容、读写头位置)三者的结合。
格局可以用 表示: 表示当前状态, 是当前纸带上的字符串(即 连接 ),当前的读写头在 的第一个符号的位置, 以后的内容全都是空白符。
比如格局: 表示:当前纸带内容是 ,状态是 ,读写头位于第二个出现的 上。

如果图灵机能合法的从格局 一步进入格局 ,则称格局 产生(yields) 格局 。
一个图灵机 接受输入 的条件是,存在一个格局的序列 ,满足以下条件:
- 是 对于输入 的起始格局()
- 产生
- 是接受格局()
图灵机示例
语言 ,即所有长度是 的幂的仅含 的串串。
识别这个语言的图灵机的自然语言描述如下:
- 从左往右扫描,每隔一个字符就划掉一个零
- 如果一个零都划不动,说明是 的形式,接受
- 如果划完一遍之后,剩下奇数个零,拒绝
- 返回左端点,重复前三步

- 既是起始状态,也类似递归的终止条件:必须遇到至少一个,否则直接拒绝;一旦遇到 就进入
- : 这个状态没有确定的是奇数还是偶数。第一次走到 状态意味着当前已经遇到了确切的一个 ,所以不停往右边走,如果被叉掉了就跳过,一旦遇到 就进入偶数状态 ;遇到右端点说明 的个数是恰好一个,符合递归终止条件,接受。如果是从 回来的,这时候 的状态就变成了偶数个零,因为 是从 来的。
- : 是已经遇到偶数个 的状态, 是奇数个 的状态,两个奇偶互补,每隔一个 叉掉一个,同时右移; 如果叉掉一个之后遇到右端点则进入 , 遇到右端点说明 的个数不是偶数,拒绝
- : 不管读到什么东西,都一直往左边跑,直到回到最左端点,进入 状态
格局表如下。要记得格局的表示形式: 后面紧跟的才是当前读写头的位置。

图灵机的变形
多带图灵机 Multi-tape Turing Machine
转移函数发生变化。对于 条纸带的图灵机,转移函数是:,其中 是 stay 的意思,就是保持不动。也有的教材认为 ,就是必须挪走。
定理:每一个多带图灵机,都等价于一个单带图灵机。也就是可以用一个单带图灵机去模拟多带图灵机。
单带图灵机当中,用 来作为分隔符(delimiter),分割所有的纸带;头顶上有一圆点的表示每个纸带的读写头所在的字符。

然而单带图灵机的控制器 S 会比多带图灵机的控制器 M 麻烦不少。
推论:一个语言是图灵可识别的,当且仅当存在一个多带图灵机识别它。
非确定性图灵机 Nondeterministic Turing Machine
转移函数变成了:,幂集表示非确定性。
像 NFA 一样,非确定性图灵机的计算过程,也可以想象为一棵多叉树。不仅如此,每个非确定性图灵机和确定性图灵机也是等价的,即:每个非确定性图灵机也可以转化为一个确定性图灵机(状态个数变成 2 的幂)。
下图表示用确定性图灵机模拟非确定性图灵机。

推论:一个语言是图灵可识别的,当且仅当存在一个非确定性图灵机识别它。
推论:一个语言是可判定的,当且仅当存在一个非确定性图灵机判定它。
枚举器 Enumerator
枚举器就是附带了一个打印机的图灵机。打印机相当于一个输出设备。
枚举器的工作过程:
- 以空白输入的纸带开始运行
- 如果不停机,可能会打印出来无限多个串
- 枚举器 所枚举的语言是最终打印出的所有串串的集合
- 生成的串是任意顺序的,可能会有重复
定理:一个语言是图灵可识别的,当且仅当存在一个枚举器可以枚举它。
要证明当且仅当,需要从两个方向证明。
首先正向证明:如果有一个枚举器 枚举语言 ,则能找到一个图灵机 ,识别这个枚举器枚举的语言。这个图灵机 是这样的(对于输入串 )
运行枚举器 。每当 打印了一个串,则与输入比较
一旦找到相同的,就接受
于是很显然的, 接受所有能被 打印的串。证毕。
然后反向证明:如果有一台图灵机识别语言 ,则能找到一个枚举器 可以枚举 。这个枚举器的构造如下(忽略掉输入串):
假设 是所有可能的串串,对于 ,重复以下步骤:
对于 当中的每一个, 以其作为输入串,运行 步。这大概是为了避免图灵机死循环
如果有计算接受,则打印出相应的
刚才这一坨看起来很麻烦,反正大概意思就是对于所有串串都运行一下图灵机 ,接受的全都输出
算法的定义
丘奇使用称为 演算(-calculus)的记号系统(notation system)来定义算法,图灵用图灵机来定义算法。这两个定义事实上是等价的。这两者之间的联系,叫做 丘奇图灵论题 Church-Turing Thesis。
令 ,希尔伯特第十题要求设计一个算法,检测一个多项式是否具有整数根,相当于提问: 是否是可判定的。答案是,不存在检测多项式是否具有整数根的算法,因此 不可判定。然而, 是图灵可识别的。
先考虑简单的情形。令 ,下面设计一个图灵机 识别 :
- 的输入是一个关于变量 的多项式 ,注意多项式是可以用字符串的形式来表示的
- 将 赋值为 ,不断地检查是否满足 。如果满足,就接受。否则继续。
于是图灵机 就设计出来了,因此 是可识别的。然而这个图灵机可能会无限运行下去,因此不符合判定器的定义,于是 不是可识别的。
假如多项式 的变量个数不止一个,那也是类似,反正就不停的赋值然后试一下~
描述图灵机的术语 Terminology for Describing Turing Machine
描述图灵机有三种不同的级别。
- 最低等级是形式化的描述,就一堆数学式子,写出状态和转移函数,不过是最详细的
- 中档等级,称为 实现描述(implementation description),就是用自然语言描述图灵机怎么移动啊、怎么存储数据啊之类的,不指定状态和转移的细节
- 最高等级,是 高层次描述(high level description),同样是用自然语言来描述,但是连实现的细节都忽略了,也就是不提及如何管理纸带和读写头,相当于描述了一个算法
图灵机的记号
图灵机输入的都是字符串。如果要以其他对象(比如多项式、图)作为输入,就需要编码成字符串。
对象 的字符串编码,用 表示。例如: 表示一个语言,包含所有的联通的无向图的编码串。
这里可以使用的无向图的编码格式是:(节点列表)((边), (边), (边), ...))

判定无向图是否联通的图灵机(判定器)的高层次描述是:
- 标记节点列表当中的第一个节点
- 重复第三步,直到无法再标记新的节点
- 任选一个节点,如果这个节点的一条边连接到一个已经被标记的节点,就把这个节点也标记上
- 检查,是否所有节点都被标记过。如果是,则接受,否则拒绝。