返回
繁体
首页

阿基米德的报复

视觉:
关灯
护眼
字体:

第八章 图灵的通用计算机(2 / 3)
。计算机的“程序表”规定了计算机对于符号与状态的每一种可能组合将要做出的反应。

    举两数相加一例,将会非常清楚地阐明这些抽象概念。假定我们以“一元”的记号写出一些数字,其中整数 n用一串 n个*号来表示,在n个相连的单元内每单元一个*号。据此,**号表示2,*****表示5。一元记号的优点是只有一种符号*号,不需要10个不同的数字来表示任何已知的正整数。若要2加5,只要把**号和*****号打印在纸带上,它们之间有一个空白单元,这样两串*号就可以区别开。

    带有图解的程序表说明了计算机如何进行两数相加的运算。但在讨论程序表的特点之前,先要概括地描述加法的过程。聪明的计算机先找到两个数之间的空白单元,在空白单元打印一个* 号(那么在纸带上留有一串的8个* 号),而后继续下去,找到一串* 号的结束单元,并擦除掉最后一个* 号。这样,在纸带上就留有*******号,按一元记号,它就是7,即2加5的和。

    现在让我们再来看程序表。计算机的状态通常列在最左边的一栏内。在这个程序表内,共有3个状态,编号分别为0、1和2。符号(和表示空白单元的词“空白”)通常横列在程序表的上方。在这个表内只有一个符号*号。

    计算机在0状态中开始,按照惯例,扫描纸带上最左边的符号(换句话说,扫描**号中的第一个*号)。程序表描述了计算机如何运算状态0与符号*号的组合。计算机让符号留下不变,扫描到右边的下一个单元,并停留在状态0中,那么,计算机如何运算这个单元?由于计算机仍然处在状态0中,而且单元中的符号还是一个*号,计算机仍按前面所述进行运算:只让符号*号留下,扫描到右边的下一个单元,并停留在状态0中。

    现在换到空白单元。程序表中状态0与空白符号的组合说明了计算机是如何进行运算的。它打印了一个*号,再扫描到右边的下一个单元,即进入状态1。这时,这个单元中还是一个*号,而状态1和符号*号的组合就描述出计算机的行为:扫描到右边的下一个单元,并停留在状态1中。这个步骤要重复4次,因为每次都是一个*号继续出现。当计算机扫描到一串5个*号结束处的空白单元时,它会回到左边的一个单元,并进入状态2。这个单元中有一个*号,计算机会擦掉它。然后计算机停机,处于一种完成状态。这种方法的作用是:相同的程序表都可以生成任何两数的和,无论数的大小如何,只要以一元的记号写出,两数间有一个空白单元,就能算出。在状态0,计算机只是扫描第一个数的每个单元,一直扫描到空白单元,再在其上打印一个*号。在状态1,它则是扫描第二个数的每个单元,直到空白单元,再回扫,并停留在最后一个*号的单元上。在状态2,它只是擦掉这个*号。于是,纸带上就立即有了答案。

    这种加法是众所周知的有限数法,因为程序表包括数量有限的状态和数量有限的符号。然而这种有限数法却可以生成范围无限的数。图灵计算机要运算可以想象的任何数之和,纸带的长度就必须是无限的,也就是说,如果纸带仅有1,000个单元长,而它就不能运算大于1,000的数。

    在图灵计算机用这种方法完成两数相加的运算时,纸带将只有答案,而没有原来的两个数。如果有人试图编写一个带有原来两数的程序表,那么他一开始就应该想到,图灵计算机需要“计算”在两串*号中的8个*号。然而令人感到意外,图灵计算机不能进行这种计算。设想它扫描第一个*号时,就会跳入状态1。每当它扫描另一个*号时,就会跳入下一个状态。这样下去,在它扫描第五个*号后,计算机就已处在状态5中,扫描第二十三个*号之后,就处在状态23中。看来用这种方法,图灵计算机似乎能够计算任何*号的数;即当它扫描完所有*号时,它的状态数就相应于它的*号数。但是,这种方法是行不通的。你知道这是为什么吗?

    问题就在于这个方法不是有限数法。这种方法需要数目无限的状态。比方说,如果计算机仅有5个状态,那么它就不能计算多于5个的*号,因此它将被限制在和为5或小于5的数之内。如果它有50,000个状态,它也不能计算多于50,000个的*号。换句话说,对于有限数状态n,它不能计算多于n的*号。这种方法行不通,是因为我们所要寻找的是在任何情况下都可用于任何加法的方法。

    如果允许数字状态是无限的(或者符号数是无限的),那么程序表就编写不出来。而要求编写出有限数字的程序表,按照惯例,需要用机械的方式。

    现在需要探讨一个令人感兴趣的说法,即图灵计算机不必是一部机器,而是程序表(如果你愿意的话,可以叫它软件),那就是图灵计算机的定义。任何一个实体,它可以是一部计算机、一个人、一条美人鱼、一个游魂、或是克里姆林宫,只要它能够按照程序表进行运算,就是一部图灵计算机。如果你能够按照加法图表中的程序表在纸带上进行两数的加法运算,那么