[反刍]停机问题

简单介绍停机问题:

是否存在一个通用算法来判断, 特定的程序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)应该是不停机, 出现了矛盾的状况。

由此知假设有误, 停机问题无解。

 

总结:"停机问题无解"的结论不是说我们就无法判定某一个程序是否会停机, 而是说不存在通用的算法。因此对于特定程序, 还是有很大概率能分析出来它最终是否停机。

另外, 由于停机问题是基于图灵机的, 而目前一切的可计算问题都有一个图灵机模型。因此, 如果能把某个问题归约(转化)成停机问题, 则可知该问题同样无通用解。

posted @ 2023-09-20 11:53  lynnzixing  阅读(47)  评论(0编辑  收藏  举报