不可解问题

本文探讨了图灵在1936年提出的不可解问题——停机问题,该问题证明了无法存在一个通用算法判断任意程序在特定输入下是否会终止。通过构造Satan_algo,展示了即使假设有万能算法God_algo,也会导致逻辑上的矛盾,揭示了计算的局限性和某些问题的不可判定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  不可解问题(Undecidable Decision Problem)指的是这样一种问题:它无论如何也不可能有一个正确的算法来解决。虽然不可思议,但这种问题被证明确实是存在的。图灵在1936年提出了第一个不可解问题的实例:The Halting Problem
  The Halting Problem是指,输入一段程序代码和一个针对此程序的输入,能否编程判断运行这个程序后程序是否会终止。这个问题的答案是否定的,也就是说不可能有一种算法可以正确判断一个指定的程序运行后,给予指定的输入,程序最后出不出得来。换句话说,The Halting Problem是一个不可解问题。
  假设我们某一天真做出了这么一个极度聪明的万能算法(就叫God_algo吧),你只要给它一段程序(二进制描述),再给它这段程序的输入,它就能告诉你这段程序在这个输入上会不会结束(停机)。我们来编写一下这个算法:

bool God_algo ( char *program, char *input ) {
    if ( <program> halts on <input> ) {
        return true;
    }

    return false;
}

这里假设if的判断语句里面是天才思考的结晶,它能够像上帝一样洞察一切程序的宿命。现在从这个God_algo出发,导出一个新的算法:

bool Satan_algo ( char *program ) {
    if ( God_algo ( program, program ) ) {
        while ( 1 ); /* loop forever! */
        return false; /* can never get here! */
    } else {
        return true;
    }
}

正如它的名字所暗示的那样,这个算法便是一切邪恶的根源了。当我们把这个算法运用到它自身身上时,会发生什么呢?

Satan_algo ( Satan_algo );

我们来分析一下这行简单的调用:显然Satan_algo(Satan_algo)要么能够运行结束返回(停机),要么不能返回(loop forever)。如果它能够结束,那么Santa_algo算法里面的那个if判断就会成立(因为God_algo(Santa_algo, Santa_algo)将会返回true),从而程序便进入那个包含一个无穷循环while(1);if分支,于是这个Satan_algo(Satan_algo)调用便永远不会返回(结束)了。如果不能结束(停机),则if判断就会失败,从而选择另一个if分支并返回false,即Satan_algo(Satan_algo)又能够返回(停机)。可以得到如下结论:

  • Satan_algo能够停机 => Satan_algo(Satan_algo)不能停机。
  • Satan_algo不能停机 => Satan_algo(Satan_algo)能够停机。

于是得到矛盾的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值