停机问题

来源:互联网 发布:国内三大期刊数据库 编辑:程序博客网 时间:2024/04/29 14:06

停机问题

停机问题(halting problem)是目前逻辑数学的焦点,和第三次数学危机的解决方案。其本质问题是: 给定一个图灵机 T,和一个任意语言集合 S, 是否 T 会最终停机于每一个 s /in S。其意义相同于可确定语言。显然任意有限 S 是可判定性的,可数的(countable) S 也是可停机的,在使用 oracle 输入的帮助下。

通俗的说,停机问题就是判断任意一个程序是否会在有限的时间之内结束运行的问题。如果这个问题可以在有限的时间之内解决,可以有一个程序判断其本身是否会停机并做出相反的行为。这时候显然不管停机问题的结果是什么都不会符合要求。所以这是一个不可解的问题。

停机问题本质是一阶逻辑的不自恰性和不完备性。类似的命题有理发师悖论、全能悖论等。

证明

设停机问题有解,即:存在过程H(P, I)可以给出程序P在输入I的情况下是否可停机。假设若P在输入I时可停机,H输出“停机”,反之输出“死循环”,即可导出矛盾:

显然,程序本身可以被视作数据,因此它可以被作为输入,故H应该可以判定当将P作为P的输入时,P是否会停机。所以我们设过程K(P)的流程如下:首先,它调用H(P, P),如果H(P, P)输出“死循环”,则K(P)停机,反之K(P)死循环。即K(P)做与H(P, P)的输出相反的动作。

现在假设求K(K),则若H(K, K)输出停机,K(K)死循环,但由定义知二者矛盾。反之,H(K, K)输出死循环,则K(K)停机,两者一样矛盾。

因此,H不是总能给出正确答案,故而不存在解决停机问题的方法。[1]

 

 

------------------------------------------------------------------------------------------

计算机科学中最有趣的非编程(原文non-programming,译者注)问题之一是研究什么问题能(以及不能)被计算。例如这个问题,“这个程序能不能完整执行?”,也就是说,判断它(程序)会不会进入死循环。对于任意一段代码,你将如何做出回答呢?你可以尝试去运行这个程序。不过假如它会运行很长时间呢?你要等待多长时间呢?

我们可以思考一下,这个问题是否存在一个通用的解决方案——一种适用于任意一段C代码的方法,它可以判断这段代码最终是否可以停止运行。

让我们假设你发现了这样一个解决程序(为明确起见以下简称为S程序,译者注)。这是一个有两个参数的程序:要判断的程序代码(为明确起见以下简称为P程序,译者注),以及它的输入。如果P程序在给定输入下执行并最终结束,则S程序返回Ture(真),如果P程序陷入无限循环,则S程序返回False(假)。我们可以把S程序命名为DOES-HALT,这个程序可以使用如下语法:
DOES-HALT(program, input)

现在,给定DOES-HALT,让我们看看它所作的事情有多酷。好的,现在任何程序不管它运行多长时间,我们都可以让它通行无阻,并且为它运行提供保护。它可以被用来证明极其复杂的,含有大量递归以及循环结构的程序是否有效。

我们也可以用DOES-HALT快速的计算一个程序是否可以通过所有的测试用例。这是一个小技巧。对于一个特定的输入来说,我们如何用DOES-HALT判断程序是否产生了一个恰当的输出呢?要知道DOES-HALT仅仅是用来判断程序是否停机的。那又怎么样,我们完全可以编写第二个程序,可以把它叫做COMPARE-OUTPUT(比较输出),它将会有三个参数:要检测的程序,程序的输入以及期待的输出,并且它不会陷入死循环。现在,我们所要做的全部事情就是运行DOES-HALT(COMPARE-OUTPUT, [program, input, expected output]) ,这样一来我们就会知道程序是否通过了测试用例,输入,和输出预期的输出。如果它停机了,好的,它通过了;否则它就没有通过。

想想看这个程序会在我们测试复杂的算法时给我们提供多大的帮助!

让我们看看接下来的情况。特别是,如果把一个程序自身当作它的输入是会发生什么,我们需要编写一个怎忙的程序来测试它呢?例如*nix(*nix,即Unix,Linux等Unix核心的操作系统,译者注)下的程序cat(cat是Linux中一个察看文件内容的命令,译者注),当运行它自己时,将会输出可执行文件的二进制内容。有些程序在把它们自己当作输入运行时,可能永远不会停下来,既然这样——那么让我们用DOES-HALT编写一端伪代码,用它来测试当一个程序把它自己作为输入参数时会发生什么好了。我们称它为SELF-HALT(意为自停机,译者注),这个程序(SELF-HALT)将会在输入程序自运行(在这里用自运行作为程序把自己作为参数运行的简单说法,译者)非停机状态时停机。

SELF-HALT(program)
{
 if(DOES-HALT(program, program))
 infinite loop
 else
 halt
}

这段代码非常清晰:如果程序在自运行时停机,则SELF-HALT进入死循环,否则SELF-HALT停机。

太漂亮了,因为我们可以用它来分辨一个用来分析其他程序的程序(例如DOES-HALT),当该程序用自己作为输入时是否会停机。

现在,如果我们用SELF-HALT来分析它自己会怎么样呢?好的,让我们来看看。如果DOES-HALT(SELF-HALT, SELF-HALT),则SELF-HALT(SELF-HALT) 将会永远循环。因此假如SELF-HALT在运行它自己时停机了,那么它会永远循环(死循环)。

这没有道理,因此DOES-HALT(SELF-HALT, SELF-HALT)必须为False(假)。SELF-HALT(SELF-HALT)必须不停机。但是如果DOES-HALT(SELF-HALT, SELF-HALT)为假(False),SELF-HALT(SELF-HALT) 必须停机!一个悖论。

那么我们在哪儿出问题了呢?我们的SELF-HALT结构非常完美,没有任何问题。我们的依据也都完美无缺,没有任何错误。实际上,所有问题的根源都在于我们使用了DOES-HALT 这个程序。

事实是,上面的所有论证都是建立在停机问题成立的基础上的,然而停机问题仅仅是一个名词,在一般情况下我们根本无法实现它。DOES-HALT永远不会存在,假如它存在的话就会产生上述悖论——当一个程序无限循环时才会停机,并且当它停机时才会无限循环。

---------------------------------------------------------------------------

停机问题

(2009-04-13 08:14:09)
转载
标签:

文化

学术

计算机

数学

杂谈

分类:学术园地

停机问题
在课堂上,我已经说明了:语言和图灵机分别是不可数集合和可数集合,因此,图灵机(计算机)不是万能的。接着,我又用“停机问题”作为具体例子强化了我们对图灵机不是万能的理解。但是,“停机问题”远不止是为“图灵机不是万能的”这一论断提供了一个具体的例子,它也为许多关于形式系统的定理提供了例子。


公理系统一文中,我提到了哥德尔的“不完备性定理”,即:一个形式系统,如果是一致的(=相容的=无矛盾的),那么,就一定存在一个命题,这个命题在该系统中不能被证明,也不能被否证。换一种说法,这个命题在该系统中不能被证明,它的反命题在该系统中也不能被证明。


哥德尔是个天才,他的贡献还不止是这个定理,这个定理被称之为“哥德尔第一定理”。更进一步,还有一个“哥德尔第二定理”,即:任何一个被认为是一致的系统,它的一致性是不能在系统内部得到证明的。

 

停机问题
这个很要命,特别是当你从哲学的角度来看这个定理。我的理解,他是在说:世界是不可知的。或者,世界就没有“真理”这件事。一个系统的一致性不能在这个系统内部证明,那应该怎么知道系统是一致的呢?因为,没有一致性,逻辑就破产了。你会说:“既然一个系统的一致性不能在该系统内部得到证明,我可以通过另一个已经被证明是一致性的系统来证明这个系统的一致性,就好比你自己无法证明自己是好人,但是,你可以通过另外一个好人来证明你是好人啊。” 明眼人一看就知道这是很无谓的循环,请问:这“另一个已经被证明是一致性的系统”的一致性是如何得到证明的呢?如果你回答说:“它的一致性是通过其它的已经被证明是一致性的系统来证明。” 那我继续追问:其它的系统的一致性又是怎么被证明的呢?你继续回答,我可以同样继续追问,会有结果吗?类似地,你也无法通过另一个所谓“好人”来证明你是一个好人,因为,逻辑上,另一个人要证明他自己是好人的话,他遇到的问题与你没有区别,也是如此无限循环下去的。


难道说,世界上就没有一致性的系统吗?事实是:不知道!我们假设我们有,所有的证明通过上述追问最终都归结到了假设,或者公理,通过首先承认这些公理的不言自明之正确性,我们才逐渐发展出我们自以为“严密的”逻辑。同样,通过承认“政府”、“嘻嘻TV”、“人民大众”或“某个人”是好的,才能“证明”你是好人。当然“政府、嘻嘻TV、人民大众或某个人是好的”也完全是假设。

 

停机问题
这样的不断追问和思考你能发现什么?你会发现:科学本身建立的基础是靠不住的,因为公理(假设)是靠不住的,科学历史上这样的事情屡次发生:牛顿理论的困境、宇称守恒定理的破产......。类似地,好人也是靠不住的,因为,政府、嘻嘻TV甚至人民大众的正确性是靠不住的。人类历史上这样的事也是屡屡发生:政府的无义,苏格拉底被人民大众投票处死......。

 

也难怪波普尔在《猜想与反驳》一书中定义:科学命题是“可证伪”而不是“可证实”的东西。比如,“世界上所有的人都是白人”是科学命题,因为,我们能证伪它,世界上有些人不是白人。“人都是要是死的”也是科学命题,因为它的反说法是:“有些人是长生不老的”,这很容易被证伪。可是,“上帝是万能的”不是科学命题,因为,我问:“上帝能不能制造出一块他自己搬不动的石头?” 你能怎么回答呢?既然这样,“上帝不是万能的”应该就是科学命题了喽?也不是,因为你也没法证伪这句话,原因是我们谁也没见过上帝,因此,既没有实例也没有进一步的无矛盾的逻辑公理作为出发点去证伪“上帝不是万能的”。这是悖论,悖论不是科学命题。其实,“上帝问题”是一个宗教信仰问题,在宗教世界里,“上帝是万能的”本身被当作公理,不言自明,必须承认这一点才有资格成为信徒。有意思的是:神学理论里,就是在“上帝是万能的”这样一个“公理”的基础上逻辑得出其他论断的。如果你承认了“上帝是存在的而且是万能的”这个“公理”,那么神学中的其他逻辑结论也都是有理有据的,你不得不信。但是,如果你不承认这个“公理”,你还能相信宗教世界里的其他逻辑结论吗?

 

“上帝是否万能?”、甚至“上帝是否存在?”是不可证的,在信徒眼里,对“上帝是否存在”的证明本身就是对上帝的亵渎。在信徒们眼里,上帝是存在的,但他的存在不能被我们非信徒感知、也不能被证明,只能存在于人的精神创造中。既然上帝是人创造出来的(而且是精神产品、不是实物产品),他的存在就是可有可无的了,也难怪有人信,有人不信。仔细想想,我们也很幸运,因为,世界是多样的,世界上除了科学逻辑,还有宗教、艺术、文学、心理学等等,因此,我们才能共同生存在一起,也才有人坚信好人的存在。女人凭直觉判断,男人凭逻辑判断。直觉上看,可以相信有些人是好人,但是,前面已经说过了,逻辑上看,却无法知道世界上有没有好人,因此,凭科学逻辑生活的男人很痛苦!女人不是完全不讲逻辑,因而才不至于胡说八道,男人也不是完全没有直觉,因而才不至于痛不欲生。


为什么说是“证伪”而不是“证明”或“证实”呢?简单点说,是因为在逻辑上和实践中,“证伪”比“证实”更让人安心。习惯上,我们仍然将“证明”一词挂在嘴边,谢天谢地,我们能“证明”什么?谁知道呢,就这么稀里糊涂的证明下去吧。


如果不让哥德尔第二定理将我们引向不可知论或虚无主义,他也至少告诉了我们:没有完美的和无所不能的东西。因此,“停机问题”的出现就很自然了。


不论有多少种不同的“停机问题”表述形式,通俗地说就是:“有没有能判断自己是否停机的图灵机?” 答案在课堂上都讲过了:不存在这样的图灵机。如果有这样的图灵机存在,那么也就意味着有人在睡着的时候对你说:“我现在睡着了”。你在睡着的时候能告诉我说你自己睡着了吗?如果是,那我要祝贺你,妖怪!

原创粉丝点击