我正在尝试找到逻辑解释为什么不能有一个程序来检查另一个程序。
我记得我们在计算过程中学到了但是现在我找不到解决方案, 我需要在工作中向某人解释一下。
感谢您的帮助。
答案 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)
拜伦的回答应该指出你的重要信息。另外,您可以使用程序检查特定程序。你不能拥有的程序可以检查任意程序的正确性。