暂停问题

来自Citizendium
跳转到导航 跳转到搜索
这篇文章正在开发中,尚未获得批准。
主要文章
讨论
相关文章 [?]
参考文献 [?]
外部链接 [?]
可引用版本 [?]
 
此可编辑的主要文章是正在开发中并受免责声明.

这个暂停问题对未来操作的可预测性提出了一个特别有限的问题计算机程序:仅仅通过检查一个特定的程序,是否可以判断它是否会终止(即,进入指示它停止操作的指令步骤)。

1936年,“不”这个令人惊讶的答案以邱奇-图灵论题(由于阿隆佐·邱奇阿兰·图灵). 这个定理证明了不存在系统方法,或者可以存在,它可以可靠地预测全部的计算机程序。特定的程序可能是可预测的,但总会有其他程序的长期行为是不可预测的。

这是最早的结果之一不可判定性结果。当时,由于哥德尔不完全性定理1931年,它证明了数学中的某些定理虽然正确,但无法证明。换句话说,形式的、公理化的推理的力量已经被发现了极限。停机问题可以被视为该结果在以下领域的变体计算; 发现了计算过程分析能力的局限性。

换言之,有时没有比程序本身的操作更简单的方法来建模程序的操作,而准确发现它将做什么的唯一方法是运行它并观察它。这与许多细胞自动机比如电脑游戏生活没有捷径可以可靠地预测许多模式的未来演化,只能让它们演化并观察。

细节

更正式地说,暂停问题旨在确定,对于任何给定的程序P,

P会终止(停止)还是无限期继续?

这个解决方案是为所有程序P寻找的,也就是说,我们可以编写一个“暂停检测器”程序H,它将读取任何程序P并确定P是否终止。

直觉上,人们可能会建议简单地执行P,然后看看会发生什么。这方面的问题是,人们永远无法确定自己等待P终止的时间是否足够长;可能是在看了P一段时间后,放弃了,认为它不会终止,它可能会在不久后自行终止。换言之,人们只能断言P已经被观察到终止,或者已经通过N个步骤被观察到,并且它还没有终止;根据观察,人们不能断言它永远不会终止。

必须保证暂停检测器H在有限的时间内终止。(换言之,如果程序H本身可能永远不会停止,那么程序H可以确定P是否会停止是没有用的。如果是这样的话,人们会遇到与以前P完全相同的问题,只是现在有了H:人们可能会放弃没有终止的H的特定运行,从而使人们无法回答P是否停止的问题将终止。)

如果H存在(它不存在),它确实是一个有价值的工具。知道程序停止相当于知道它是成功的例如,它将确定一个反例是否哥德巴赫猜想(每个偶数都是两个素数的和)是存在的。只需编写一个提升偶数的程序Pg,测试每个数是否是两个素数的和。如果存在暂停检测器H,它可以确定Pg是否终止(通过计算H(Pg)),从而处理哥德巴赫猜想。

许多程序自然而然地被编写为继续运行,直到找到某种东西或达到某种条件。其他程序总是可以进行简单的修改,以实现这种行为。关于程序最终行为的任何定义明确的问题都可以从停止的角度重新表述。因此,暂停问题实际上是关于程序长期行为的问题。

替代证明草图

这绝不是丘吉尔定理的历史发展。相反,这个草图是为了让熟悉计算机编程的现代读者相信这个定理是正确的。

假设我们有一种编程语言“like”(与Lisp同构)。虽然编程语言在风格上有所不同,但所有“足够强大”的语言在执行计算方面都是相同的。(就本次讨论而言,对较弱的语言不感兴趣。)因此,语言的选择是任意的。

“Quine”引理:程序可以将自己的源代码赋给变量名。

这里我们省略了证据;这是给计算机科学专业学生提出的一个常见难题。换言之,“编写一个打印出自己源代码的程序。”为了阻止“欺骗”,例如,通过读取源代码的磁盘,我们添加了一个条件:无法访问程序运行之前填充的内存。也就是说,如果不扫描磁盘或RAM中偶然出现的源代码,程序必须“手动”组装其代码。这通常被称为“奎宁”。(这个词是指威拉德?范?奥曼?奎因,也许道格拉斯?霍夫斯塔特(Douglas Hofstadter)在其普利策获奖作品《哥德尔、埃舍尔、巴赫:永恒的金辫子》(Godel,Escher,Bach:An Eternal Golden Braid)中首次使用了这个词。)

这为假设暂停问题是可解的情况下的自我参照悖论奠定了基础。

假设存在一个暂停检测器H(P)。H读取任何程序P,只有当P停止时才返回True。

我们构建了一个程序Spite,它通过设计挑战H。我们提供以下伪代码:

定义Spite:
如果H(Spite)为True,则挂起无限循环。如果H(Spite)为False,则终止。

斯皮特用奎因骗局让H撒谎。

因此H不可能存在。