“Rice 定理把大量逐题归约压缩成统一原则,用于证明程序等价、语言性质和部分函数性质不可判定。可接受编号说明索引如何指向程序行为,$s$ $m$ $n$ 定理提供有效代码参数化,Kleene…”
形式陈述 ​
令
语言
直觉
自指构造抓住的不是某种编程语言的漏洞,而是任何足够通用的程序分析器都会面临的对角冲突。假想的通用停机判定器把程序行为压成可靠的二值预测,反转程序则在判定器预测它会停机时故意循环、预测它循环时立即停机;将反转程序自身的编码作为输入后,预测与行为无法同时成立。这个论证也说明,增加测试样例或延长模拟时间永远只能覆盖更多实例,不能变成全域判定。
例子与边界
为了看到矛盾本身,先假设
构造
这并不否定所有局部终止性证明:对有限状态机、固定循环上界的程序或带可证明递减度量的递归函数,停机仍可判定。不可判定性否定的是对任意程序与输入都正确且总停机的统一完备算法;静态分析器可以选择保守近似,代价是报告假阳性或放弃某些实例。
推论与应用
图灵机 的停机问题是构造其他不可判定性结果的标准源头:通过 映射归约,可把停机行为编码进等价性、可达性或其他程序语义性质,证明它们不可判定。Rice 定理 进一步把这种现象概括为所有非平凡语义性质;终止性证明器、模型检查器和类型系统则通常通过限制语言或接受不完备性来获得可用算法。
参考资料
- Alan M. Turing, “On Computable Numbers, with an Application to the Entscheidungsproblem,” 1936.
- Michael Sipser, Introduction to the Theory of Computation, 3rd ed., Cengage, 2013, §5.1.