认识图灵机

293 阅读4分钟

大道至简,计算机也一样,任何复杂的背后有着非常纯粹、简单的原理,对计算机模型来说离不开对图灵机的认识。

本文摘自外文:link

图灵机是数学家艾伦·图灵在 1936 年提出的一种假象的机器。尽管它看起来很简单,但该机器可以模拟任何计算机算法,无论算法是多么复杂!

img

上图是图灵机一个非常简单的表示,它表示一条无限长的纸带,纸带的每个格子都可以记录符号(类似于传统计算机里面的内存、或其他存储介质)。纸带上的格子在开头处往往是空白的,每个格子都可以被写入任何符号。在本文的场景中,我们假设图灵机只能处理0、1、""(空白格)三种符号,称为3-符号图灵机。

任何时候都有一个控制头悬在纸带某格子的上方,通过这个控制头图灵机能执行3种非常简单的操作:

  1. 读取当前所指格子的符号内容
  2. 对所指格子进行新符号的写入(或擦除)操作
  3. 每次向左或向右滑动一格纸带,使得控制头能对相邻的格子进行下一步操作

一个简单的例子

为方便描述,我们先尝试在空白的纸带上写入1、1、0三个符号:

initially blank tape

首先,在控制头下方先写入1:

write 1 on the square

然后,将纸带向左移动一格:

move tape left

现在再开始写入1:

write 1 on new square

按此操作执行后,纸带最终的状态为:

write a 0 on new square

一个简单的程序

上面纸带已经包含了1、1、0三个字符,我们尝试将纸带上的符号1全部替换为0(0也换为1),这个操作称为位反转。我们可以将下方的指令注入到图灵机,图灵机可以读取指令并执行相应的动作,这些指令组成了一个简单的程序:

我们做个演示来看看图灵机是如何执行每个指令的:图灵机会先读取控制头下方的符号并做写入操作,然后向左或向右滑动纸带,以此反复执行完所有指令。

img

当前指向的符号是0,所以控制头开始写入1并将纸带向右滑动一格。

img

现在执行的符号是1,因此写入0并把纸带继续向右滑动一格:

img

接下来还是读取到1,开始执行一样的操作:

img

最后将读到空白的格子,按上述编写的程序,图灵机的控制头读到空白格后不做其它处理,将一直保持在重复读空白格的状态。

实际上这个程序是不完整的,程序什么时候无休止的重复执行指令、什么时候进入到终止状态,程序需要新增一个状态的概念来告诉图灵机。

机器状态

要让程序能完整地执行,必须考虑程序执行过程中状态变化。下表新增了“状态”列,可以称为是状态表:

每个指令执行后都将转移到一个新的状态,按上表的设定,图灵机将一直在原状态下不断执行读-写-移动纸带的操作(除非读到空格)。如果读到空格,图灵机将进入到停止状态,表示程序结束。我们将上面编写的程序新增一个状态属性,使得图灵机在该状态下会执行对应的指令。

有限状态机

单单加个状态属性似乎还不能很好体现出其意义,现在我们对程序新增一个状态,该状态下将对格子的0、0、1符号进行反转,复原到原先的1、1、0符号值。有了两个状态后,图灵机更像是在执行一个有限状态机,被称为3-符号两状态图灵机。

对于写指令,把“无操作”替换为“写空白”来统一描述。

除了用表格描述,也可以用状态图表达:

finite state machine

之前的程序读到空格时将处于“无操作”或停止状态,新的程序在切换到状态1前将会把纸带向左移动一格。

more Turing tape

如上图,控制头开始指向符号:0,进入到状态1后将开始做位取反操作,期间将向左滑动纸带(而不是右):

even more Turing tape

最后将读到空白格,按指令将向右滑动纸带一格并进入到终止状态。

end of Turing tape

通过向程序注入更多状态,我们可以驱动图灵机执行更复杂的功能,现代计算机借助此思想可以运行任何算法。