按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
为此我们可以在Q的磁带上以和在H中一样的方式对n和m编码。我们得到Q(n;m)=Tn(m)×H(n;m)。
现在我们应用乔治?康托的“对角线删除法”的天才的和强有力的技巧的变种。(下一章将看到康托对角线删除法的原型。)考虑现在用粗体字标明的对角线元素:这些元素提供了某一序列0,0,1,2,1,0,3,7,1,……现在把它的每一元素都加上1就得到1,1,2,3,2,1,4,8,2,……
假设我们的表是计算地产生的,那么这就清楚地是一个可计算的步骤,而且它为我们提供了某一个新的可计算的序列,事实上为1+Q(n;n);也就是1+Tn(n)×H(n;n)
(由于对角线是令m等于n而得到的)。但是,我们的表包括了每一可计算的序列,所以我们新的序列必须在表中的某一行。然而,这是不可能的!由于我们新序列和第一行在第一元素处不同,和第二行在第二元素处不同,和第三行在第三元素处不同等等。这是一个明显的冲突。正是这个冲突,建立了我们所要证明的,即在事实上图灵机H不存在!不存在决定一台图灵机将来停止与否的普适算法。另一种重述这个论证的方法是注意到,在假定H存在时,对于算法1+Q(n;n)(对角线步骤!)存在某一图灵机号码,譬如k,这样我们有1+Tn(n)×H(n;n)=Tn(n)。
但是,如果我们在这个关系中代入n=k就得到1+Tk(k)×H(k;k)=Tk(k)。因为如果Tk(k)停止我们就得到了不可能的关系式1+Tk(k)=Tk(k),(由于H(k;k)=1),而如果Tk(k)不停止(这样H(k;k)=0),我们有同样不协调的结果1+0=□,所以前面的假定导致一个矛盾。一台特定的图灵机是否停止是一个定义完好的数学问题(反过来,我们已经看到,各种有意义的数学问题可被重述成图灵机的停机问题)。这样,依靠显示不存在决定图灵机停机问题的算法,图灵(正如撤屈用自己十分不同的手段)指出,不存在决定数学问题的一般算法。希尔伯特的判决问题没有解答!
这不是说,在任何个别的情形下,我们不可能决定某些特殊数学问题的真理或非真理;或者决定某一台给定的图灵机是否会停止。我们可以利用一些技巧或者仅仅是常识,就能在一定情况下决定这种问题。(例如,如果一台图灵机的程序表中不包括STOP指令,或者只包含STOP指令,那么常识就足以告诉我们它会不会停止!)但是,不存在一个对所有的数学问题,也不存在对所有图灵机以及所有它们可能作用的数都有效的一个算法。我们似乎现在已经建立了,至少存在某些非决定的数学问题。然而,我们从未做过这种事!我们还没有展示过,存在某种特别尴尬的数时,它在某种绝对的意义上,不可能决定该机器是否停止。的确,正如我们很快就要看到的,情况刚好相反。我们关于单独问题的不可解性一点也没提,仅仅是说关于问题的族的算法的不可解性。在任何单独的情形下,答案或者为“是”或者为“非”,所以肯定存在一个决定那个特定情形的算法,也就是在它面临该问题时,依情况而定,会简单地讲“是”或“非”。当然,困难在于我们可能不知道用这些算法中的哪一个。那就是决定一个单独陈述而不是决定一族陈述的数学真理的问题。重要的是要意识到,算法本身不能决定数学真理。一个算法的成立总是必须由外界的手段来建立起来。如何超过算法我们在以后论及哥德尔定理时再回到决定数学陈述的真理性问题(参阅
第四章)。我希望在此刻指出,图灵的论证比我迄今仿佛所暗示的更具
建设性而更少负面性。我们肯定还没有展示出一台特殊的图灵机,它在某种绝对的意义上不能决定其是否停止的问题。的确,如果我们仔细地考察该论证就会发现,我们步骤本身实际上已经隐含地告诉我们,对这利用图灵步骤建造的似乎“极端荒谬”的机器的答案!我们看看这是怎么来的。假定我们有某一个算法,它有时有效地告诉我们什么时候一台图灵机将不停止。正如在上面概述的,图灵步骤将明白地展现了一台图灵机计算,对这计算那个特殊算法不能决定其是否停止。
然而,在这样做的同时,它实际上使我们在这情况下看到了答案!我们展现的特殊的图灵机计算的确不会停止。为了仔细考查这怎么引起的,假定我们具有一个这样有时有效的算法。正如以前那样,我们用H来标志这个算法(图灵机),但是现在允许该算法有时不能告诉我们一台图灵机在实际上将不停止:
H(n m) =0 T (m) =1 T (m); 或□如果 □如果 停止。nnìí?这样,当 Tn(m)=□时H(n;m)=□是一种可能性。实际上存在许多这种算法H(n;m)。(例如,只要Tn(m)一停止,H(n;m)就能简单地产生1,尽管那个特殊的算法几乎没有什么实际的用处!)
除了不把所有的□用0来取代而留下一些以外,我们可以像上述那样仔细地顺着图灵的步骤。正如以前那样,对角线过程提供了对角线上的第n个元素1+Tn(n)×H(n;n)。(只要H(n;m)=□,我们就将得到一个□。注意□×□=□,1+□=□。)
这是一个完好的计算,所以它是由某一台,譬如讲第n台图灵机得到的,而且现在我们确实有1+Tn(n)×H(n;n)=Tk(n)。
我们看第k个对角元素,也就是n=k,就会得到1+Tk(k)×H(k;k)=Tk(k)。如果计算Tk(k)停止,我们就有了一个矛盾 (由于假定只要Tk(k)停止H(k;k)就为1,则方程导致不协调性:1+Tk(k)=Tk(k)。所以Tk(k)。不能停止,也就是Tk(k)=□。但是,算法不能“知道”这个。因为如果该算法给出H(k;k)=0,则我们应该又导致矛盾(我们得到了在符号上不成立的关系:1+0=□)。这样,如果我们能找到k,就将知道如何去建造击败我们知道其答案的算法的特别计算!我们怎么找到k呢?这是一项艰巨的工作。我们需要做的是仔细考察H(n;m)和Tn(m)的构造,然后仔细弄清1+Tn(n)×H(n;n)作为一台图灵机是如何动作的。我们发现这台图灵机的号码为k。要把这一切要弄透彻肯定是复杂的,但它是可以办得到的①。由于这种复杂性,若不是因为我们为了击败H而特地制造Tk(k)的这个事实, 我们对计算Tk(k)
毫无兴趣!重要的是,我们有了定义很好的步骤,不管我们的H是哪一个,该步骤都能找到合适的k,使得Tk(k)击败H,因此这样我们可以比该算法做得更好。如果我们认为自己仅仅比算法更好些,也许会给我们带来一些小安慰!事实上,该过程被定义得如此之好,以至于在给定的H下,我们可找到产生k的一个算法。这样,在我们过于得意之前必须意识到,由于这个算法事实上“知道”Tk(k)=□,所以它能改善9H,是不是?在上面提到一个算法时,用拟人化的术语“知道”是有助的。然而,该算法仅仅是跟随我们预先告诉它去跟随的法则,这难道不是我们在“知道”吗?或者我们自己,仅仅是在跟随我们的头脑的构造和我们的环境所预先编排我们去跟随的规则?这问题实在不只是简单的算法问题,而且是人们如何判断何为真何为伪的问题。这是我们必须重新讨论的中心问题。数学真理(以及其非算法性质)的问题将在
第四章考虑。现在我们至少对术语“算法”和“可
计算性”的意义以及某些相关的问题已有些领略。
① 事实上,由于在上面建造普适图灵机U 已使我们能把Tn(n)写成作用于n上的一台图灵机,所以已经得到这个最难的部分。撤屈拉姆达计算法可计算性的概念是一个非常重要和美丽的数学观念。它又是相当近代的,具有这样基本性质的事体进入数学的王国是本世纪三十年代的事。这个观念已经渗透到数学的所有领域中去(虽然这一点确实是真的,但是大多数数学家通常不去忧虑可计算性的问题)。该观念的威力有一部分来自于这一个事实,即数学中一些定义得很好的运算实际上不是可计算的(例如图灵机的停机问题;第四章还可以看到其他例子)。因为如果不存在这
种不可计算的事体,则可计算性的概念便没有多少数学的兴趣。数学家毕竟喜欢困惑的东西。让他们决定某些数学运算是否为可计算的可能是非常迷人的困惑。因为那个困惑的一般解答本身是不可计算的,这一点尤其迷人!有一件事要弄清楚。可计算性是一个真正“绝对的”数学概念。它是一种抽象的观念,它完全超越按照我们描述的“图灵机”的任何特别实现之外。正如我在以前所评论的,我们不必对表征图灵的天才而特别的手段的“磁带”和“内态”等等赋予任何特别的意义。还有表达可计算性观念的其他方法,历史上最早的是美国逻辑学家阿伦佐?撤屈在斯蒂芬?C?克利涅协助下提出的杰出的“拉姆达计算法”。撤屈的步骤和图灵的完全不同,并且更为抽象得多。事实上,在撤屈陈述他观念的形式中,在它们和任何可以称作“机械的”东西之间只有一点明显的连接。撤屈步骤背后的关键观念在其最本质上的确是抽象的,实际上撤屈把这步骤称为“抽象化”的一个数学运算。不仅是因为撤屈方案强调可计算性是一个独立于计算机器的任何特别概念的数学观念,而且它阐明了在数学中抽象观念的威力,所以我感到值得花一点时间来简要地描述它。对数学观念不熟悉或者对这件事本身不感好奇的读者,在这一阶段可以跳到下一章去,这不会对论证的过程产生多少损失。尽管如此,这样的读者若愿意和我多忍受一阵会得到好处,并且能见证撤屈方案的某些魔术般的经济性(参见撤屈1941)。人们在此方案中关心的是,譬如由以下表示的对象的“宇宙”
a,b,c,d,…,z,a′,b′,…,z′,a′′,b′′,…,a′′′,…,a′′′′,…其中每一元素代表一个数学运算或函数。(带撇字母的原因简单地是,无限地提供以表示这种函数的符号。)这些函数的“自变量”,即它们所作用的东西,是同一类型的其他东西,也就是函数。此外,一个这种函数作用于另一个函数的结果(或“值”)仍是一个函数。(在撤屈的系统中的确具有美妙的概念经济性。)这样,当我们写a=bc① 一种更熟悉的记号是写成a=b(c),但这些特别的括号不是真正必要的,在习惯上把它们忽略去更好些。时,我们是指函数b作用于函数c的结果为另一函数a。要在这个方案中表达两个或更多变量的函数的观念并没有困难。如果我们希望把f认为两个变量,譬如讲p和q的函数,我们可以简单地写(fp)q(这是函数fp作用于q的结果)。对于三变量函数我们考虑((fp)q)r,等等。让我们引进抽象化的有力的运算。为此我们使用希腊字母λ(拉姆达),而且有它后面紧跟着的是代表一个撤屈函数的一个字母,譬如讲x,我们把它当成“哑变量”。任何发生于紧跟在这后面的方括号内的表达式中的变量x是仅仅被当作一个“口”,可以往里面代入任何跟在整个表达式后的任何东西。这样,如果我们写λx.〔fx〕,我们是说,当它作用到譬如讲函数a上时,就产生结果fa。那就是(λx.〔fx〕)a=fa。换言之,λx.〔fx〕简单地就是函数f;即λx.〔fx〕=f。这里只用一点思维就够了。数学的一个美妙在于,初看起来是如此卖弄学识的、琐碎的东西,也是人们非常容易完全失去要点的东西。让我们考虑从中学数学取来的一个熟悉的例子。我们取函数f为对一个角度取正弦的三角运算,这样抽象的函数“sin”被定义为λx.〔sinx〕=sin。
(不必为何以“函数”x可当作一个角度而忧虑。我们很快就会看到数可被当成函数的某种方法;而一个角度只是一个数。)迄今为止的一切的确是相当无聊的。让我们设想,记号“sin”还没被发明,但是我们熟悉sinx的级数展开表达式x x x - …。 1611203 5+ …然后我们可以定义sin 。' ' = … + lx x x x1611203 5-… 。请注意,我们甚至可以更简单地定义,譬如讲“六分之一立方”的运算,它并没有标准的“函数”记号Q x x = l 。' '
163,而且发现,例如如果把它们一律都保留着,就会导致相当的繁琐,诸如表达式(f(p))(q)和((f(p))(q))(r)可分别简化成(fp)q 和((fp)q)r。Q a a a a a ( ) ( ) + = + = + + + 1161161212163 3 2。从撤屈的基本函数运算简单地构造的表达式对于现在的讨论更为贴切,例如λf。〔f(fx)〕。