简单介绍停机问题:
是否存在一个通用算法来判断, 特定的程序P在遇到输入I后不陷入无限循环, 总能停机?
简单分析:
似乎很容易, 有没有循环不是一眼就能看穿吗? 但如果遇到复杂的goto语句群组成的意大利面条式代码, 你还能轻而易举判断吗?
结论是不存在这样的通用算法。下面是我在反复看了多个证明后, 根据自己理解重新组织的证明。后面所有根据别人的思路理解了后重新整理的都会加[反刍]这个标签。
反证法:
假设停机问题有解, 则有程序Halt(P,I)可以判断任意的程序P对于任意输入I是否可以停机, 若可停机, 返回True, 否则F
之后, 构建函数N(P)如下:
void N(P){
if (Halt(P,P)==1)
while(1); //不停机
else
return; //停机
}
尝试执行①Halt(N, N), 那么就是要判断下列程序是否停机
void N(N){
if (②Halt(N,N)==1)
while(1); //不停机
else
return; //停机
}
如果①返回真, 那么说明②的值也为真, 那么N(N)应该是不停机, 出现了矛盾的状况。
由此知假设有误, 停机问题无解。
总结:"停机问题无解"的结论不是说我们就无法判定某一个程序是否会停机, 而是说不存在通用的算法。因此对于特定程序, 还是有很大概率能分析出来它最终是否停机。
另外, 由于停机问题是基于图灵机的, 而目前一切的可计算问题都有一个图灵机模型。因此, 如果能把某个问题归约(转化)成停机问题, 则可知该问题同样无通用解。
标签:通用,Halt,反刍,停机,程序,停机问题 From: https://www.cnblogs.com/lynnzixing/p/17716988.html