停机问题的理解

来源:互联网 发布:linux文件系统 编辑:程序博客网 时间:2024/04/29 23:42

关于停机问题维基百科给出的定义是:

停机问题(halting problem)是逻辑数学中可计算性理论的一个问题。通俗的说,停机问题就是判断任意一个程序是否会在有限的时间之内结束运行的问题。该问题等价于如下的判定问题:给定一个程序P和输入w, 程序P在输入w下是否能够最终停止。

这个问题的结论是一个可以解决停机问题的通用算法是不存在的。问题倒是很好理解,关键在于怎么证明它的结论——很简单,利用两个方法构成一个悖论。

证明如下:

设停机问题有解,即:存在过程H(P, I)可以给出程序P在输入I的情况下是否可停机。假设若P在输入I时可停机,H输出“停机”,反之输出“死循环”(就是一直在运行)。

再设有一个过程K(P)可以给出在某个输入P下K是否可以停机。

伪代码如下:

int H(procedure,Input); // 这里的H函数有两种返回值,死循环(1) 或 停机(0)int K(P){    if (H(P,P) == 1){//如果P死循环        return 0; //这里会停机    }else{//如果P停机        while(1){} // 这里会死循环    }}

现在假设H的输入为K,则H变为H(K,K),K的输入为它自己,即K(K)。

  1. 假设H(K,K)==1,即如果输入K时程序K一直运行,则返回0,表示K停机,产生矛盾。
  2. 假设H(K,k)!=1,即如果输入K时程序K停机,则执行死循环,表示K一直运行,产生矛盾。
证明完毕,也就是说如果存在H(P,I)则会产生上述悖论,所以不存在解决停机问题的方法。
0 0