Lec8
图灵机

Definition:
$$M=(K,s,\Sigma,\delta)$$
- $K$:有限状态集合
- $s$:初始状态
- $\Sigma$:有限符号集合,即纸带的内容可以是什么,这里是 $\{0,1,\sqcup,\rhd\}$
- $\delta$ :转移函数:
$$K\times\Sigma\rightarrow K\times\Sigma\times\{L,R,S,H\}$$
根据当前的状态以及所在位置的符号,决定下一个状态、更新当前位置的符号以及读写头的移动方向:
- $L$:左移
- $R$:右移
- $S$:不动
- $H$:停机
Progress:
注意点1:
转移函数要保证:
$$a=\rhd\text{ iff. }T[i]=\rhd$$
即最左端的 $\rhd$ 唯一且不可覆盖。
注意点2:
每个循环结尾,若停机,则输出 $\rhd$ 和第一个空格之间(开区间)的内容;若不停机,则没有输出。
本次 Lec 中,我们要证明的是:图灵机和 python 等价。
NAND-TM
直接证明图灵机和 python 等价比较复杂,我们先引入一个简单的编程语言 NAND-TM。
Definition:
NAND-TM 是 NAND-CIRC 的强化版本,即 NAND-CIRC + 数组 + 真循环。
Definition
真循环: 循环次数与输入有关
假循环: 循环次数与输入无关
性质1:
有两类数值,一类是整数,只用作数组下标;另一类是布尔值。
性质2:
有两类变量,一类是布尔变量;另一类是数组变量,数组变量的每个元素都是布尔值。
其中,数组可以无限长,但共用一个下标 $i$,即如果 $i$ 不变,则数组 $A$ 和数组 $B$ 只能同时访问 $A[i]$ 和 $B[i]$,不能一个访问 $A[i]$,另一个访问 $B[i+1]$。
性质3:
输入 $x$ 和输出 $y$ 也是数组。
性质4:
程序的最后一行是特殊函数 $\text{MODANDJUMP}(a,b)$,有两个作用:
- 作用1:跳回程序开头,实现循环
- 作用2:更新 $i$
- $a=1,b=1$:$i=i+1$
- $a=0,b=1$:$i=i-1$
- $a=1,b=0$:$i=i$
- $a=0,b=0$:停机
性质5:
所有变量的初始值都为 $0$,除了输入。
这里有一个问题:怎么判断输入 $x$ 中的 $0$ 是输入值还是填充值?
解决方法:使用对应的指示数组,例如输入为 $0100$,则指示数组的前四位为 $1$,表示有效输入;后面的位均为 $0$,表示填充值。

Progress:
Example
函数 INC:若输入为 $x_0x_1\dots x_{n-1}$(对应正整数 $\sum\limits_{i=0}^{n-1}x_i\cdot2^i$),返回这个数加一的结果 $y_0y_1\dots y_n$ (对应正整数 $\sum\limits_{i=0}^ny_i\cdot2^i=\sum\limits_{i=0}^{n-1}x_i\cdot2^i+1$)。
Note
IF、XOR、AND 都可以用 NAND 实现。
图灵机与 NAND-TM 的等价性
我们已经能直观地感受出一些二者的对应关系:
- TM 的状态 $\Longleftrightarrow$ NAND-TM 的布尔变量(组合在一起)
- TM 的纸带 $\Longleftrightarrow$ NAND-TM 的数组变量
- TM 的读写头位置 $\Longleftrightarrow$ NAND-TM 的下标 $i$
- TM 的读写头移动 $\Longleftrightarrow$ NAND-TM 的 MODANDJUMP 更新 $i$
TM 用 NAND-TM 实现:
假设 TM 有 $k$ 个状态,那么在 NAND-TM 中可以用 $\lceil\log k\rceil$ 个布尔变量来表示当前状态。
假设 TM 的符号集合为 $\Sigma$,元素个数为 $|\Sigma|$,那么在 NAND-TM 中可以用 $\lceil\log |\Sigma|\rceil$ 个数组来表示纸带。
例如:

对于 TM 的四种移动操作 $\{L,R,S,H\}$,可以分别编码成 $\{01,11,10,00\}$,也只要两个布尔变量作为 MODANDJUMP 的输入即可。
相对麻烦的是转移函数 $\delta$:
$$K\times\Sigma\rightarrow K\times\Sigma\times\{L,R,S,H\}$$
实际上是一个输入和输出长度固定的有限函数:
$$\{0,1\}^{\lceil\log k\rceil+\lceil\log\Sigma\rceil}\rightarrow\{0,1\}^{\lceil\log k\rceil+\lceil\log\Sigma\rceil+2}$$
我们知道有限函数可以用 NAND-CIRC 实现,即一系列 NAND 门。因此,最终这台 TM 可以被等价地实现为一段 NAND-TM 程序:
NAND-TM 用 TM 实现:
其实就是倒过来的过程。
如果 NAND-TM 中有 $k$ 个布尔变量,则对应到 TM 中有 $2^k$ 个状态。如果 NAND-TM 中有 $l$ 个数组变量,则对应到 TM 中有 $2^l$ 个符号。
对于 NAND-TM 除去最后一行 MODANDJUMP 的其他行(都是 NAND 门),涉及 $k+l$ 个变量,也就是说,这些行实现了一个有限函数:
$$\{0,1\}^{k+l}\rightarrow\{0,1\}^{k+l}$$
那么,只要再加上最后一行 MODANDJUMP 告诉我们的两个参数的取值,就可以确定下来读写头的动作,从而完整地定义出 TM 的转移函数 $\delta$。
NAND-TM 与 Python 的等价性
接下来,我们要想办法强化 NAND-TM 到 Python,通过二者的等价性,最终证明图灵机和 Python 的等价性。
goto:
对于一个固定行数的 NAND-TM:
其可以写成如下的等价形式:
Note
由于行数固定,因此 line 可以用固定长度的布尔变量表示;if 条件判断也可以用 NAND-CIRC 实现。
因此,只需要改变 line=... 的内容,就可以实现 goto。
while:
实现了 goto 之后,就可以实现 while 循环:
记 do bar 的第一行标签为 "loop",do blah 的第一行标签为 "not",则上面的 while 等价于下面的 goto 形式:
Note
如果以汇编的视角观察 python,那么上述程序已经和 python 很接近了。
多个 index:
Warning
略
多维数组:
Warning
略
NAND-RAM:
NAND-RAM 有以下特性:
- 内存:每一格存一个 word,支持随机访问
- 寄存器:可以与内存交换数据
- 变量从布尔变量变成整数变量
- 寄存器支持算术运算
NAND-TM 和 NAND-RAM 等价,证明略。