我正在审查Sipser的《计算理论导论》中停机问题的证明,我主要关注以下证明:
如果TM M不知道它何时循环(它不能接受或拒绝任何字符串,这就是为什么TM对于所有字符串都是图灵可识别的),那么决策器H如何确定M是否可能进入循环?当TM D进行处理时,同样的问题也会出现。
如果TM M不知道它何时循环(它不能接受或拒绝任何字符串,这就是为什么TM对于所有字符串都是图灵可识别的),那么决策器H如何确定M是否可能进入循环?当TM D进行处理时,同样的问题也会出现。
在阅读并尝试理解证明后,我编写了以下代码,这是此答案中类似问题代码的简化版本:
function halts(func) {
// Insert code here that returns "true" if "func" halts and "false" otherwise.
}
function deceiver() {
if(halts(deceiver))
while(true) { }
}
如果 halts(deceiver)
返回 true
,deceiver
将永远运行,如果返回 false
,deceiver
将停止,这与 halts
的定义相矛盾。因此,函数 halts
是不可能的。这是一种“反证法”,一种“归谬法”(拉丁短语在理论课上总是不错的,当然前提是它们有意义)。
这个程序 H 只是一个带有两个输入的程序:一个表示某个机器程序的字符串和一个输入。为了证明目的,你只需要假设程序H是正确的:如果M接受w,则它将简单地停止并接受。你不需要考虑它如何做到这一点;事实上,我们即将证明它不能这样做,没有这样的程序H 存在...
因为
如果这样的程序存在,我们可以立即构造另一个程序H', 使得H无法决定。但是,根据假设,没有这样的程序:H能决定所有东西。因此,我们被迫得出结论:我们定义的程序H 不存在。
顺便说一下,证明方法中的“归谬法”比你想象的更有争议,特别是在计算机科学中经常使用。如果你觉得它有点奇怪,也不用感到尴尬。这种魔术术语是“非构造性的”,如果你非常有雄心壮志,可以问一下你的教授关于Errett Bishop对非构造性数学的批评。