第八章 图灵的通用计算机
元的记号写出,两数间有一个空白单元,就能算出。在状态0,计算机只是扫描第一个数的每个单元,一直扫描到空白单元,再在其上打印一个*号。在状态1,它则是扫描第二个数的每个单元,直到空白单元,再回扫,并停留在最后一个*号的单元上。在状态2,它只是擦掉这个*号。于是,纸带上就立即有了答案。
这种加法是众所周知的有限数法,因为程序表包括数量有限的状态和数量有限的符号。然而这种有限数法却可以生成范围无限的数。图灵计算机要运算可以想象的任何数之和,纸带的长度就必须是无限的,也就是说,如果纸带仅有1,000个单元长,而它就不能运算大于1,000的数。
在图灵计算机用这种方法完成两数相加的运算时,纸带将只有答案,而没有原来的两个数。如果有人试图编写一个带有原来两数的程序表,那么他一开始就应该想到,图灵计算机需要“计算”在两串*号中的8个*号。然而令人感到意外,图灵计算机不能进行这种计算。设想它扫描第一个*号时,就会跳入状态1。每当它扫描另一个*号时,就会跳入下一个状态。这样下去,在它扫描第五个*号后,计算机就已处在状态5中,扫描第二十三个*号之后,就处在状态23中。看来用这种方法,图灵计算机似乎能够计算任何*号的数;即当它扫描完所有*号时,它的状态数就相应于它的*号数。但是,这种方法是行不通的。你知道这是为什么吗?
问题就在于这个方法不是有限数法。这种方法需要数目无限的状态。比方说,如果计算机仅有5个状态,那么它就不能计算多于5个的*号,因此它将被限制在和为5或小于5的数之内。如果它有50,000个状态,它也不能计算多于50,000个的*号。换句话说,对于有限数状态n,它不能计算多于n的*号。这种方法行不通,是因为我们所要寻找的是在任何情况下都可用于任何加法的方法。
如果允许数字状态是无限的(或者符号数是无限的),那么程序表就编写不出来。而要求编写出有限数字的程序表,按照惯例,需要用机械的方式。
现在需要探讨一个令人感兴趣的说法,即图灵计算机不必是一部机器,而是程序表(如果你愿意的话,可以叫它软件),那就是图灵计算机的定义。任何一个实体,它可以是一部计算机、一个人、一条美人鱼、一个游魂、或是克里姆林宫,只要它能够按照程序表进行运算,就是一部图灵计算机。如果你能够按照加法图表中的程序表在纸带上进行两数的加法运算,那么你就是一部图灵计算机。在一篇卓越的论文中,图灵在理论上和实践中已经能够证明;图灵计算机无法做到的,数学家和计算机都无法做到。一部超级计算机能够非常迅速地解出的问题,动作迟缓的图灵计算机也同样能够做出解答。
掌握图灵计算机的实质和具备有限数法的解题能力,最佳的方法是自己编写程序表。我想提出一个建议,请你编写一种程序表,使它可以用于图灵计算机的一元记号的减法运算。但要提醒你,在编写程序表时,应让计算机以某种方式知道它已完成计算,并把该方式写入程序表中。否则,由于纸带的长度可以任意长,常常可能使计算机一直连续扫描许多空白单元。下图显示出了减法用的程序表。当然,其他程序表也可以进行运算。
第二个问题是为计算机编写一种程序表,可用于检验编写在纸带上的符号P和Q顺序是否是回文式的,即正读与反读的顺序都一样。一种方法就是使计算机能够对第一个符号与最后一个符号进行比较,第二个符号与倒数第二个符号进行比较,以此类推。但要记住,这种方法必须是有限数字。如果顺序是回文式的,可以让计算机打印一个Y,如果不是,则打印一个N。这种方法是安德鲁·霍奇斯在为英国《新科学家》周刊撰写的一篇文