图灵机

图灵机


2021-08-02 13:49:03 数学 形式语言与自动机 计算理论 自动机

图灵机(Turing Machine, TM)在自动机领域也只是大大小小机器中的一个,但因其与可计算函数的等价性使得它成为自动机领域一类比较特殊的机器。

# 确定的图灵机的形式化定义

M = ( Q , Σ , Γ , δ , q 0 , B , F ) M=(Q,\Sigma,\Gamma,\delta,q_0,B,F)

  • Q Q :有穷状态集
  • Σ \Sigma :字母表(有穷输入符号集)
  • Γ \Gamma :所有可以放置在输入字符串中的字符(有穷带符号集), Σ Γ \Sigma\subseteq\Gamma
  • δ \delta :状态转移函数, δ : Q × Γ Q × Γ × { L , R } \delta:Q\times\Gamma\rightarrow Q\times\Gamma\times\{L,R\}
  • q 0 q_0
  • B B :空格符号, B Γ Σ B\in\Gamma-\Sigma
  • F F :终结状态集(接受状态集), F Q F\subseteq Q

状态转移函数 δ \delta 表示当前状态和输入符号的笛卡尔积到下一个状态、写入符号和移动方向的映射;它的输入是当前状态+字符串中的一个符号,输出下一个状态+要将字符串中的当前符号改变为什么符号+接下来读取该字符左边还是右边的字符(不能停止不动,字符串向左向右都是无限长)。

当图灵机到达 F F 中的某个状态时结束。

例如 ( q 1 , Y , L ) = δ ( q 0 , X ) (q_1,Y,L)=\delta(q_0,X)

# 确定的图灵机的瞬时描述(Instantaneous Description, ID)

图灵机的输入虽然是有限长,在有限步内所到达的字符串的非空内容总是有限的,因此可以使用字符串和状态 q q 以及 q q 在字符串上的位置定义图灵机的瞬时描述:

X 1 X 2 . . . X i 1 q X i X i + 1 . . . X n X_1X_2...X_{i-1}qX_iX_{i+1}...X_n

  • q q 为图灵机的当前状态
  • i i 为图灵机当前读取的位置
  • X i , i [ 1 , n ] X_i,i\in[1,n]

# ID转移: \vdash

在图灵机 M M 中, ( q 1 , Y , L ) = δ ( q 0 , X ) (q_1,Y,L)=\delta(q_0,X)

X 1 X 2 . . . X i 1 q 0 X i X i + 1 . . . X n M X 1 X 2 . . . X i 2 q 1 X i 1 Y X i + 1 . . . X n X_1X_2...X_{i-1}q_0X_iX_{i+1}...X_n\vdash_MX_1X_2...X_{i-2}q_1X_{i-1}YX_{i+1}...X_n

在图灵机 M M 中, ( q 1 , Y , R ) = δ ( q 0 , X ) (q_1,Y,R)=\delta(q_0,X)

X 1 X 2 . . . X i 1 q 0 X i X i + 1 . . . X n M X 1 X 2 . . . X i 1 Y q 1 X i + 1 X i + 2 . . . X n X_1X_2...X_{i-1}q_0X_iX_{i+1}...X_n\vdash_MX_1X_2...X_{i-1}Yq_1X_{i+1}X_{i+2}...X_n

若某ID I 1 I_1

# 图灵机的语言

某个 图灵机 定义为 M = ( Q , Σ , Γ , δ , q 0 , B , F ) M=(Q,\Sigma,\Gamma,\delta,q_0,B,F)

L ( M ) = { w Σ ( p F , α Γ , β Γ ) q 0 w M α p β } \bm L(M)=\{w\in\Sigma^*|(\exist p\in F,\alpha\in\Gamma^*,\beta\in\Gamma^*)q_0w\vdash_M^*\alpha p\beta\}

  • 递归可枚举语言/图灵可识别语言 L = L ( M ) L=\bm L(M)
  • 递归语言/可判定语言 L = L ( M ) ( w Γ ) M能停机 L=\bm L(M)\wedge(\forall w\in\Gamma^*)\text{M能停机}

注:图灵机不保证对所有字符串输入都停机。保证停机的图灵机在实际应用中是算法的好模型,是算法概念的形式化。

# 图灵机变种

以下的图灵机都可证明与确定的图灵机等价 ,但可以让图灵机的设计更加简单。

# 可以存储有限个符号的图灵机

M = ( Q , Σ , Γ , δ , q 0 , B , F ) M=(Q',\Sigma,\Gamma,\delta,q_0',B,F)

  • Q = Q × Γ × . . . × Γ Q'=Q\times\Gamma\times...\times\Gamma
  • q 0 = [ q 0 , B , . . . , B ] q_0'=[q_0,B,...,B]

# 多道图灵机

M = ( Q , Σ , Γ , δ , q 0 , B , F ) M=(Q,\Sigma,\Gamma',\delta,q_0,B',F)

  • Γ = Γ × Γ × . . . × Γ \Gamma'=\Gamma\times\Gamma\times...\times\Gamma

多道图灵机

# 半无穷带图灵机

字符串输入只有一侧是无穷的

# 多带图灵机

  • 字符串输入有多个
  • 图灵机在每个字符串上可以处于不同的位置
  • 图灵机在每个字符串上的位置移动相互独立
  • 图灵机在字符串上的移动除向左向右外,还可以是停止状态

多带图灵机

# 非确定的图灵机(Nondeterministic Turing Machine, NTM)

M = ( Q , Σ , Γ , δ , q 0 , B , F ) M=(Q,\Sigma,\Gamma,\delta,q_0,B,F)

  • δ \delta :状态转移函数, δ : Q × Γ 2 Q × Γ × { L , R } \delta:Q\times\Gamma\rightarrow 2^{Q\times\Gamma\times\{L,R\}}

# 计算复杂性引入

  • 运行时间 :图灵机在某个输入上停机前移动的步数

  • 时间复杂度 T ( n ) T(n) :图灵机 M M 在所有长度为 n n 的输入上的运行时间的最大值。

  • 只有保证停机的图灵机 T ( n ) T(n) 才有意义

  • 只有多项式时间的 T ( n ) T(n) 才能在实际的计算机上可解

上面这些图灵机变种都与确定的图灵机等价,它们都能用来模拟确定的图灵机(显然),也都能被确定的图灵机所模拟。接下来看看如何模拟并分析一下模拟的时间复杂度。

# 用确定的图灵机模拟可以存储有限个符号的图灵机

显然,令确定的图灵机的状态集合为可以存储有限个符号的图灵机的所有可能的状态和存储符号的组合即可。模拟移动 n n 步的时间复杂度为 O ( n ) O(n)

# 用确定的图灵机模拟多道图灵机

显然,令确定的图灵机的输入为字符元组就是一个多道图灵机了。模拟移动 n n 步的时间复杂度为 O ( n ) O(n)

# 用确定的图灵机模拟可以存储有限个符号的多道图灵机

显然,令确定的图灵机的状态集合为可以存储有限个符号的图灵机的所有可能的状态和存储符号的组合,并令其输入为字符元组即可。模拟移动 n n 步的时间复杂度为 O ( n ) O(n)

# 用可以存储有限个符号的多道图灵机模拟多带图灵机

思路:对于 k k 带图灵机,用 2 k 2k 道图灵机模拟之。对于每个带,都用两个道模拟,一个道存带的内容,一个道存图灵机在当前带的位置。

  1. 从左到右扫描一次,存储图灵机在所有带的位置和对应位置的输入
  2. 执行状态转移函数,存储图灵机在所有带的移动状态和要修改动作
  3. 从右到左扫描一次,按照移动状态修改道上的位置记录、按照修改动作修改道上的数据
  4. 重复1~3直到可接受状态

模拟移动1步需要左右扫描一次,时间复杂度 O ( n ) O(n) ,因此模拟移动 n n 步的时间复杂度为 O ( n 2 ) O(n^2)

# 用多带图灵机 M M 模拟NTM N N :广度优先搜索

思路:同NDA一样,NTM的运行过程也可以看作是树,其节点是ID,分支是由于NTM选择了多个状态转移而产生多个ID转移进而产生多个ID。若要用“串行”的图灵机模拟之,则可考虑对NTM运行时树上的ID进行广度优先搜索。

M M 有两条带,第一条带保存 N N 中产生而未处理的ID,第二条带用于对ID进行处理。

  1. 把第一条带开头的ID复制到第二条带
  2. 若第二条带上的ID可接受则停止
  3. 否则将第二条带上的可能的ID转移复制到第一条带的末端
  4. 抹去第二条带开头的ID
  5. 重复1~4

模拟每个ID都要读取复制和删除长度为 n n 的ID,时间复杂度 O ( n ) O(n) ,若每一个ID至多产生 m m 个选择,那经过 n n 步要模拟 i = 1 n m i = m n + 1 1 m 1 \sum_{i=1}^nm^i=\frac{m^{n+1}-1}{m-1}

# P = N P P=NP

前面分析出来了用NTM能用多带图灵机进行模拟,但模拟需要指数时间,但这只是一种最直观的模拟方法,是否存在多项式时间的模拟方法?目前还是未知的。

这个问题可以概括为:NTM以多项式时间解决的问题,TM是否也可以以多项式时间解决?

简称 P = N P P=NP

  • P P 表示“Polynomial”——“多项式”,指 确定的图灵机 多项式时间内 可以解决的问题的问题类
  • N P NP 表示“Non-Deterministic Polynomial”——“非确定的多项式”,指 非确定的图灵机 多项式时间内 可以解决的问题的问题类
  • N P NP 完全”表示任何NP问题都可以在多项式时间内规约到这个问题

虽然问题目前还没解决,但是实际应用中通常认为 P N P P\not ={NP}

# 图灵机的二进制表示

显然,由 0 0 1 1 组成的字符串可以编码任何的字符系统,因此所有的图灵机都可以编码为 Σ = { 0 , 1 } \Sigma=\{0,1\}

# Σ = ( 0 + 1 ) \Sigma^\ast=(\bm 0+\bm 1)^\ast

( 0 + 1 ) (\bm 0+\bm 1)^*

( i ) 2 = 1 w i (i)_2=1w_i

因此可以构造如下编码

i i 1 1 2 2 3 3 4 4 5 5 6 6 7 7 \dots
( i ) 2 (i)_2 1 ε 1\varepsilon 10 10 11 11 100 100 101 101 110 110 111 111 \dots
w i w_i ε \varepsilon 0 0 1 1 00 00 01 01 10 10 11 11 \dots

# 对图灵机的状态转移函数编码

  • Q = { q 1 , q 2 , , q Q } Q=\{q_1,q_2,\dots,q_{|Q|}\}
  • Γ = { X 1 , X 2 , , X Γ } \Gamma=\{X_1,X_2,\dots,X_{|\Gamma|}\}
  • 令移动方向 L = D 1 L=D_1

因此,图灵机的每一个状态、输入符号和移动方向都可以由一个数字表示,进而根据 01 01 字符串的编码规则,它们也都可以由 ( 0 + 1 ) (\bm 0+\bm 1)^*

由于图灵机的状态转移函数 δ : Q × Γ 2 Q × Γ × { L , R } \delta:Q\times\Gamma\rightarrow 2^{Q\times\Gamma\times\{L,R\}}

Δ = { ( q , X ) ( q , X , D ) q , q Q X , X Γ D { L , R } } \Delta=\left\{(q,X)\rightarrow(q',X',D)|q,q'\in Q\wedge X,X'\in\Gamma\wedge D\in\{L,R\}\right\}

在此定义下的状态转移函数则表示为:

δ ( q , X ) = ( q , X , D ) ( q , X ) ( q , X , D ) Δ \delta(q,X)=(q',X',D)\quad(q,X)\rightarrow(q',X',D)\in\Delta

而根据上述编码规则,任何一个转移规则 ( q i , X j ) ( q k , X l , D m ) Δ (q_i,X_j)\rightarrow(q_k,X_l,D_m)\in\Delta

C = 0 i 1 0 j 1 0 k 1 0 l 1 0 m δ ( q i , X j ) = ( q k , X l , D m ) C=0^i10^j10^k10^l10^m\quad\delta(q_i,X_j)=(q_k,X_l,D_m)

# 对图灵机编码

根据上面的分析可以看出,所有的图灵机的状态、输入符号和移动方向都可以由相同的编码方式表示,不同的图灵机本质上只在转移规则上有所不同,因此对一个图灵机的编码就是对其转移规则的编码。

因此,根据上述对图灵机的状态转移函数编码规则,我们可以将图灵机编码为一个由状态转移规则的编码组成的字符串,中间用两个字符 1 1 分隔:

C 1 11 C 2 11 C 3 11 C n 1 11 C n C_111C_211C_311\dots C_{n-1}11C_n

即得到图灵机编码,也即图灵机的二进制表示。

进而根据对 Σ = ( 0 + 1 ) \Sigma^*=(\bm 0+\bm 1)^*

图灵机 M i : = 编码为 w i 的图灵机 \text{图灵机}M_i:=\text{编码为}w_i\text{的图灵机}

# 通用图灵机

# 对角化语言 L d L_d

对角化语言是所有不能接受自身编码的图灵机的编码组成的集合:

L d = { w i w i ∉ L ( M i ) } L_d=\{w_i|w_i\not\in\bm L(M_i)\}

注: L d L_d

图灵机 \rightarrow
字符串 \downarrow M 1 M_1 M 2 M_2 M 3 M_3 M 4 M_4 M 5 M_5 \dots
w 1 w_1 拒绝 拒绝 接受 接受 拒绝
w 2 w_2 接受 拒绝 拒绝 接受 拒绝
w 3 w_3 拒绝 接受 接受 拒绝 拒绝
w 4 w_4 拒绝 拒绝 接受 接受 接受
w 5 w_5 接受 接受 拒绝 拒绝 拒绝
\vdots

# 证明对角化语言不是图灵可识别语言(不存在识别它的图灵机)

假设有一个图灵机 M i M_i

L d = L ( M i ) L_d=\bm L(M_i)

那么有对于它的编码 w i w_i

w i L d w i { w i w i ∉ L ( M i ) } L d 的定义 w i ∉ L ( M i ) L d 的定义 w i ∉ L d L d = L ( M i ) 矛盾 \begin{aligned} &w_i\in L_d\\ \Leftrightarrow&w_i\in\{w_i|w_i\not\in\bm L(M_i)\}&L_d\text{的定义}\\ \Leftrightarrow&w_i\not\in\bm L(M_i)&L_d\text{的定义}\\ \Leftrightarrow&w_i\not\in L_d&L_d=\bm L(M_i)\\ \Rightarrow&\text{矛盾}\\ \end{aligned}

因此识别对角化语言的图灵机不存在,故对角化语言不是递归可枚举语言。

# 通用语言 L u L_u

根据上文所属的编码方式,我们可以将图灵机 M i M_i

w i 111 w w_i111w

进而构造一种“通用语言”:

L u = { w i 111 w w L ( M i ) i N } L_u=\{w_i111w|w\in L(M_i)\wedge i\in\mathbb N\}

# 证明通用语言是图灵可识别语言(通用图灵机 U U

可以构造一个多带图灵机 U U ,当输入 w i 111 w L u w_i111w\in L_u

  1. 读取 w i w_i
  2. 读取 w w 写到第二条带上
  3. 第三条带存储 M i M_i

从而模拟图灵机 M i M_i

这里的 U U 被称为“通用图灵机”,是现代计算机的理论基础。 U U 的编码是可以写出来的,罗杰 · 彭罗斯在《皇帝的新脑》中就给出过一个 U = M i U=M_i

# 证明通用语言不是可判定语言(不能保证所有输入全部停机)

我们可以用通用语言 L u L_u

L d u = { w i 111 w i w i ∉ L ( M i ) } L u L_{du}=\{w_i111w_i|w_i\not\in\bm L(M_i)\}\subset L_u

进而:

L u 是可判定语言 U L u 上保证停机 可判定语言定义 U L d u 上保证停机 L d u L u U 可识别 L d L d u L u 等价 L d 是图灵可识别语言 图灵可识别语言定义 矛盾 L d 不是图灵可识别语言 \begin{aligned} &L_u\text{是可判定语言}&\\ \Leftrightarrow&U\text{在}L_u\text{上保证停机}&\text{可判定语言定义}\\ \Rightarrow&U\text{在}L_{du}\text{上保证停机}&L_{du}\subset L_u\\ \Leftrightarrow&U\text{可识别}L_d&L_{du}\text{和}L_u\text{等价}\\ \Rightarrow&L_d\text{是图灵可识别语言}&\text{图灵可识别语言定义}\\ \Rightarrow&\text{矛盾}&L_d\text{不是图灵可识别语言}