停机问题的理解

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

停机问题(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)则会产生上述悖论,所以不存在解决停机问题的方法。
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值