停车问题是无法解决的 决策问题简单地说,这是不可能的程序,那当然停止,以决定是否需要其他程序停止或进行计算永远。
当然,可以判断一个程序是否会永远循环。为什么我们不能写一个程序来检查无限循环s、 如果控制 变量s得到增量当他们应该减量ed,程序是否包含返回 陈述等?这将是一个非常有用的程序,尤其适用于调试年龄。
此程序必须全部的和可计算的; 那一定是已定义(保证停止)任何输入,它必须能够实施计算机上的ed(即图灵机器). 毕竟我们不希望它永远循环,我们需要运行它。我们如何确保这个程序能够决定任何给定的程序是否会停止?寻找明显的无限的 环s是一个很好的开始方式,但这只是一个启发式的; 它很容易漏掉一些特殊情况你忘记检查了。只有这样它才能检查所有可能的结果s来自运行程序是到步通过程序的所有步骤,看看是否终止第条。
检查程序是否终止s是运行它的无限的 时间如果它在那之后停止了,那么它就是已定义。无限时间运行任何东西实际上都不是一个选项,因此我们必须回到启发式的方法。让我们假设我们发现愚蠢的 暂停问题解决程序让我们称之为小时。小时输入程序p,如果程序将停止,则输出TRUE,如果不停止,则为FALSE。
此程序的流程图(小时)会是这样的:
第页||v(v)/ \/第页\/\_______正确\暂停/是\ ? /\_/||没有|错误的
最酷的是小时甚至会自动运行,当然会输出TRUE,因为程序将始终停止。如果在测试暂停的问题解决程序时,我们意外地在末尾引入了无限循环,会发生什么?然后流程图如下所示:
第页||__v(v)__| ||H(H)||_____||__________输出(o)||| |/ \ ^/o \|/是\_______|\正确/是\ /\_/||没有|HALT公司
现在如果小时输出表示输入程序(p) 遗嘱停止然后小时不会停止,如果程序(p)不会停止,那么小时将停止。现在,如果我们给它自己(称之为它),我们的程序会说什么H’)作为输入?如果H’然后停下来H’将永远循环如果H’那么就永远循环H’将停止。这是不可能的因为H’不能同时停止和不停止。这就是霍夫施塔特会呼叫奇怪的回路因为如果是真的,它就会使自己变成假的反之亦然。
这里的问题在哪里?我们添加的只是一个小循环小时。我们知道循环是可计算的,即使它们不停止,因此不可能性必须在小时自身。这确实是问题所在,这就是我们如何知道停滞不前的问题所在无法解决的。
还有很多其他的无法解决的问题其中许多问题可以归结为停顿问题;事实上,将问题简化为停止是证明问题无法解决的一种非常有效的方法。以下是几个示例:
这个空置问题(E) :
空置问题解算器将告诉您是否有可能的程序输入(p)将允许它停止。这是一个非常简单的例子。如果你喂食电子它会告诉你是否有一个程序(p)允许电子终止。就是这样,它会告诉你电子将始终停止或不停止。这又是一个停滞不前的问题,所以这是不可能的。
这个比较问题(C):
这也称为等效性问题。A类比较求解器将告诉您两个程序(A和B)是否相等;也就是说,对于相同的输入,它们总是给出相同的输出。这个方法的诀窍就是用HALT指令覆盖其中一个输入(即A或B)。然后C会告诉您,对于所有输入,另一个程序是否会停止。听起来很熟悉吗?
资料来源:
雷丁大学J.M.Bishop博士关于计算机的讲座和笔记。
还有一点直觉!