我正在通过Sipser讨论计算理论介绍中的停止问题的证据,我的主要关注点是下面的证据:
如果TM M不知道它何时循环(它不能接受或拒绝这就是为什么TM对所有字符串都是图灵可识别的),那么决策者H怎么能决定M是否可能在循环中?当TM D进行处理时,同样的问题将继续存在。
答案 0 :(得分:27)
在阅读本文并尝试可视化证明之后,我想出了这段代码,这是this answer中相关问题代码的简化版本:
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
的定义相矛盾1}}。因此,函数halts
是不可能的。
答案 1 :(得分:18)
这是一个“矛盾的证明”,一个 reductio ad absurdum 。 (拉丁短语在理论课上总是很好......当然,只要它们有意义。)
这个程序 H 只是一个带有两个输入的程序:一个表示某个机器程序的字符串和一个输入。出于证明的目的,您只需假设程序H是正确的:如果M接受 w ,它只是将停止并接受。你不需要考虑如何它会这样做;事实上,我们即将证明它不能,没有这样的程序 H 可以存在,......
因为的
如果存在这样的程序,我们可以立即构建 H 无法决定的另一个程序 H'。但是,根据这个假设,没有这样的程序: H 可以决定一切。因此,我们不得不得出结论,我们定义的 H 是不可能的。
顺便说一句, reductio 证明方法比您预期的更具争议性,考虑其使用频率,特别是在计算机科学中。发现它有点奇怪,你不应该感到尴尬。这个神奇的术语是“非建设性的”,如果你真的有野心,可以向你的一位教授询问Errett Bishop对非建设性数学的批评。
答案 2 :(得分:0)
我花了两年时间创建(完全可操作的)x86utm 操作系统,以使用用 C 编写的暂停决策程序具体解决暂停问题。这个部分暂停决策程序调用 x86 模拟器以在调试步骤模式下执行其输入。输入是转换为 32 位无符号整数的 x86 函数的机器地址。
在模拟每条 x86 指令后,它会立即检查此输入的完整执行跟踪。一旦部分停止决策器识别出非终止行为模式,它就会中止模拟并报告未停止。
#define u32 uint32_t
int D(u32 P) // P is a machine address
{
if ( H(P, P) )
return 0 // reject when H accepts
return 1; // accept when H rejects
}
int main()
{
H((u32)D, (u32)D );
}
当 H 是一个模拟暂停决策者时,H(D,D) 拒绝其输入作为暂停计算,因为 H(D,D) 指定了对 H 的无限嵌套模拟,除非 H 中止其对 D(D) 的模拟。
_D()
[00000cd0](01) 55 push ebp
[00000cd1](02) 8bec mov ebp,esp
[00000cd3](03) 8b4508 mov eax,[ebp+08]
[00000cd6](01) 50 push eax
[00000cd7](03) 8b4d08 mov ecx,[ebp+08]
[00000cda](01) 51 push ecx
[00000cdb](05) e800feffff call 00000ae0
[00000ce0](03) 83c408 add esp,+08
[00000ce3](02) 85c0 test eax,eax
[00000ce5](02) 7404 jz 00000ceb
[00000ce7](02) 33c0 xor eax,eax
[00000ce9](02) eb05 jmp 00000cf0
[00000ceb](05) b801000000 mov eax,00000001
[00000cf0](01) 5d pop ebp
[00000cf1](01) c3 ret
Size in bytes:(0034) [00000cf1]
_main()
[00000d00](01) 55 push ebp
[00000d01](02) 8bec mov ebp,esp
[00000d03](05) 68d00c0000 push 00000cd0
[00000d08](05) 68d00c0000 push 00000cd0
[00000d0d](05) e8cefdffff call 00000ae0
[00000d12](03) 83c408 add esp,+08
[00000d15](02) 33c0 xor eax,eax
[00000d17](01) 5d pop ebp
[00000d18](01) c3 ret
Size in bytes:(0025) [00000d18]
===============================
...[00000d00][00101730][00000000](01) 55 push ebp
...[00000d01][00101730][00000000](02) 8bec mov ebp,esp
...[00000d03][0010172c][00000cd0](05) 68d00c0000 push 00000cd0
...[00000d08][00101728][00000cd0](05) 68d00c0000 push 00000cd0
...[00000d0d][00101724][00000d12](05) e8cefdffff call 00000ae0
Begin Local Halt Decider Simulation at Machine Address:cd0
...[00000cd0][002117d0][002117d4](01) 55 push ebp
...[00000cd1][002117d0][002117d4](02) 8bec mov ebp,esp
...[00000cd3][002117d0][002117d4](03) 8b4508 mov eax,[ebp+08]
...[00000cd6][002117cc][00000cd0](01) 50 push eax
...[00000cd7][002117cc][00000cd0](03) 8b4d08 mov ecx,[ebp+08]
...[00000cda][002117c8][00000cd0](01) 51 push ecx
...[00000cdb][002117c4][00000ce0](05) e800feffff call 00000ae0
...[00000cd0][0025c1f8][0025c1fc](01) 55 push ebp
...[00000cd1][0025c1f8][0025c1fc](02) 8bec mov ebp,esp
...[00000cd3][0025c1f8][0025c1fc](03) 8b4508 mov eax,[ebp+08]
...[00000cd6][0025c1f4][00000cd0](01) 50 push eax
...[00000cd7][0025c1f4][00000cd0](03) 8b4d08 mov ecx,[ebp+08]
...[00000cda][0025c1f0][00000cd0](01) 51 push ecx
...[00000cdb][0025c1ec][00000ce0](05) e800feffff call 00000ae0
Local Halt Decider: Infinite Recursion Detected Simulation Stopped
...[00000d12][00101730][00000000](03) 83c408 add esp,+08
...[00000d15][00101730][00000000](02) 33c0 xor eax,eax
...[00000d17][00101734][00100000](01) 5d pop ebp
...[00000d18][00101738][00000058](01) c3 ret
Number_of_User_Instructions(23)
Number of Instructions Executed(23826)