1.2 图灵机\
演草纸
演草纸包含k条带,每条带均由单向无限延伸的很多单元构成,每个单元能够存储称为机器的字母表的有限集Γ中的一个符号。每条带均有一个带头,它具有在带上每次读或写一个符号的能力。机器的计算划分为一系列离散的时间步骤,带头在每个步骤中能够向左或向右移动一个单元。
机器的第一条带是输入带,其带头只能从该带上读取符号而不能写符号,因此这是一条只读带。另外的k-1条读写带称为工作带,其中最后一条带是输出带,机器在计算终止前把最终计算结果写在输出带上。
图灵机还允许使用随机访问存储器。然而,已经证明,图灵机的这种变形与标准的图灵机具有相同的计算能力(参见习题1.9)。
有限操作/规则集
图灵机有有限种状态,表示为Q。机器有一个“寄存器”,它能够在任何时刻记录机器处于Q中的何种“状态”。状态确定了机器在下一个计算步骤要采取的动作,包括:(1)直接读取k个带头所在存储单元的符号;(2)在k-1条读写带上,将带头所在存储单元的符号替换为新的符号(也可以通过再次写下原来的符号而不改变带);(3)修改寄存器使其记录来自有限集Q中的另一种状态(状态也可以保持不变,这只需选择与之前相同的状态);(4)将每个带头向左或向右移动一个单元(或保持不动)。
图灵机可以看成是现代计算机的简化,它的带是计算机的内存,而转移函数和寄存器则是计算机的中央处理器(CPU)。虽然如此,但最好还是将图灵机视为描述算法的一种简单的形式化方法。尽管描述算法的最佳方法是用白话,但这种形式化的描述方法将有助于对算法的数学分析(与此类似,用程序设计语言描述算法则是为了在计算机上执行算法)。
形式定义
1.将输入复制到读写工作带上;
2.将输入带带头移动到输入的开始位置;
3.输入带带头向右移动,而工作带带头向左移动。如果机器在带头移动过程的任何时刻发现了两个不同的值,则停机并输出0。
4.停机并输出1。
显然,完整地描述一个图灵机非常繁琐,但却并不是总能提供更多的信息。尽管如此,你自己构造一两个完整的图灵机也是十分有益的(见习题1.1)。本书其余部分将不再像上例一样给出每个图灵机的每个细节,而将在更高的层次上描述图灵机。对于具备了部分编程经验的读者,例1.2将使他们(至少在原理上)了解到如何构造图灵机来求解通过编程能解决的各种计算任务。
1.2.1 图灵机的表达能力
我们的第一印象是,图灵机是否概括了关于计算的直觉概念还不甚明了。读者最好能自己做一些简单的练习14,比如将加法和乘法的标准算法用图灵机表示出来以完成相应的函数计算(参见习题1.1),这必将大有裨益。做完这样的练习,就可以考虑下面的例子,把你用熟悉的编程语言编写的程序转换为图灵机。(反之,大多数编程语言也能模拟图灵机。)
例1.2(用图灵机模拟一般编程语言) 本例需要关于计算的一些背景知识。我们概略地说明如何把用熟悉的编程语言(如C和Java)编写的程序转换为等价的图灵机。首先,用编程语言编写的程序可以(用编译技术)翻译成用机器语言表示的程序,也就是一个指令序列,每个指令均是如下的几种简单操作之一:(a)从内存读取数据放入一个寄存器中,寄存器的个数是有限的;(b)把某个寄存器中的数据写入内存;(c)将某两个寄存器的值相加后将结果存入第三个寄存器;(d)将某两个寄存器的值相乘后将结果存入第三个寄存器。所有这些操作均可以很容易地被图灵机模拟。内存和寄存器可以实现为图灵机的带,而指令则实现为图灵机的转移函数。例如,不难实现将两数相加或相乘的图灵机。2带图灵机可以用来模拟计算机内存,它用一条带表示被模拟的内存,另一条带则用来实现二进制到一进制的转换。这样,对每个用二进制表示的数i,图灵机可以借助第二条带将i转换成一进制,再据此读取或修改第一条带上的第i个位置的值。我们将上述过程的细节留作习题1.8。
练习1.10要求为定制的程序设计语言严格地证明上述模拟。