停机问题——感觉很有哲理的问题

n 一个很哲学的计算机问题:停机问题——
给定一个计算机程序和一个特定的输入,判断该程序是进入死循环,还是可以停机。
证明:(反证法)设停机问题有解,即:存在过程H(P, I)可以给出程序P在输入I的情况下是否可停机。假设若P在输入I时可停机,H输出停机,反之输出死循环,即可导出矛盾:

  显然,程序本身可以被视作数据,因此它可以被作为输入,故H应该可以判定当将P作为P的输入时,P是否会停机。所以我们设过程K(P)的流程如下: 首先,它调用H(P, P),如果H(P, P)输出死循环,则K(P)停机,反之K(P)死循环。即K(P)做与H(P, P)的输出相反的动作。

  现在假设求K(K),则若H(K, K)输出死循环,K(K)停机,但由定义知二者矛盾。反之,H(K, K)输出停机,则K(K)死循环,两者一样矛盾。

  因此,H不是总能给出正确答案,故而不存在解决停机问题的方法。


 

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

显然,程序本身可以被视作数据,因此它可以被作为输入,故H应该可以判定当将P作为P的输入时,P是否会停机。所以我们设过程K(P)的流程如下:首先,它调用H(P, P),如果H(P, P)输出“死循环”,则K(P)停机,反之K(P)死循环。即K(P)做与H(P, P)的输出相反的动作。

伪代码表示如下

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

现在假设求K(K),则若H(K, K)输出停机,K(K)死循环,但由定义知二者矛盾。反之,H(K, K)输出死循环,则K(K)停机,两者一样矛盾。

因此,H不是总能给出正确答案,故而不存在解决停机问题的方法。[1]

另外还有两个本质上相似的悖论:

理发师悖论村子里有个理发师,这个理发师有条原则是,对于村里所有人,当且仅当这个人不自己理发,理发师就给这个人理发。如果这个人自己理发,理发师就不给这个人理发。无法回答的问题是,理发师给自己理发么?

停机测试悖论计算机里有个测试程序,这个测试程序的原则是,对于计算机里所有程序,当且仅当这个程序不递归调用自己(输出停机),测试程序就调用它(对应不停机)。如果这个程序递归调用自己(对应不停机),测试程序就不调用它(对应停机)。无法回答的问题是,测试程序递归调用自己么?

还有就是判断一个程序中是否包含计算机病毒



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值