你能用一段程序证明停机问题无解吗?

909 阅读1分钟

本文来源于公众号:勾勾的Java宇宙(微信号:Javagogo),莫得推广,全是干货!

原文链接:mp.weixin.qq.com/s/50Nzr0rAd… 作者:林䭽


可不可以构造一段程序证明停机问题无解? 如果可以,请用自己熟悉的语言写出这段程序。

【解析】

这是一个问题,拿到这道题,先从问题的抽象入手。

  1. 判断一段程序是否会停机的方法可以抽象成一个函数。

  2. 一段程序,也可以抽象成一个函数。

因此,问题可以转换为——

存不存在一个通用函数判断另一个函数是否会停止?

接下来,构造冲突。

假设存在一个函数 willStop,它只有一个参数 funcwillStop 可以判断任意函数 func 是否会停止:

  • 如果会停止,返回 true

  • 如果不会停止返回 false

willStop 具体如何实现我们无法给出,这里只是做一个假设。

func willStop(func){
   //...
}

下面我们构造一组冲突,构造一个叫作 wrappedWillStop 的函数,它调用 willStop 构造冲突。

function wrappedWillStop(){
  if( willStop(wrappedWillStop) ) {
    while(true){}
  } else {
    return
  }
}
wrappedWillStop()

wrapped 版本构造冲突方法如下:

调用 willStop 并把自己传进去。如果 willStop 认为 wrapped 会停止,那么就执行一个死循环。 如果 willStop 认为 wrapped 不会停止,就直接返回。

通过上述的方法,我们就知道 willStop 这样的函数肯定是无法被实现的。

也就是停机问题无解


欢迎大佬们关注公众号 勾勾的Java宇宙(微信号:Javagogo),拒绝水文,收获干货!