为什么不能有一个程序来检查另一个程序

时间:2010-04-28 21:56:08

标签: turing-machines turing-complete halting-problem

我正在尝试找到逻辑解释为什么不能有一个程序来检查另一个程序。

我记得我们在计算过程中学到了但是现在我找不到解决方案, 我需要在工作中向某人解释一下。

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

您正在寻找halting problem

  阿兰图灵在1936年证明了这一点   解决暂停的一般算法   所有可能的程序输入的问题   对不可能存在。我们说的   停止问题是不可判定的   图灵机。

答案 1 :(得分:2)

此处有wikipedia条目......

但基本上,为了确定是否有任何足够复杂的程序可以停止,你必须运行它才能跟踪执行路径。这意味着你回到一个程序运行另一个程序,如果该程序没有停止,正在观看它的程序也不会停止。

就像计算pi的数字一样 - 它会停止吗?你怎么能说它在运行时是无限的,而不是遇到一些计算问题呢?我们知道这个特定的问题是无限的,但其他相似的问题尚未得到证实。

答案 2 :(得分:2)

“检查另一个程序”非常广泛。实际上,可以检查程序的某些功能,例如Java程序类型是否检查。但是,检查Java程序的类型也会拒绝某些程序,这些程序在运行时永远不会产生类型错误,例如:

int foo() {
    if (true) return 5;
    else return null;
}

此方法实际上永远不会返回null,但类型检查器无法看到此内容。但是,我们不能只制作一个更智能的类型系统吗?

不幸的是,答案是否定的。请考虑以下程序:

int bar() {
    if (infiniteComputation()) return 5;
    else return null;
}

由于halting problem,类型检查程序无法检查infiniteComputation是否会返回false。

另一个相关的定理是Rice's Theorem,它可能比你的问题更接近于停止问题。

值得指出的是,该定理仅表明没有可以准确检查的程序属性,仍然可以很好地近似这些检查以用于实际目的。一个例子是类型系统,我们接受一些“正确”的程序被拒绝,就像上面的代码片段一样。编译器也可以在很多情况下消除死代码,即使在每个情况下都无法做到。

答案 3 :(得分:0)

拜伦的回答应该指出你的重要信息。另外,您可以使用程序检查特定程序。你不能拥有的程序可以检查任意程序的正确性。