什么是图灵停机问题?

正式开始本篇的文章之前,回顾一下我们为什么会思考题目列出的这个问题?其实,所有的开始都源自于我们对区块链的学习和研究。

我们研究过比特币,对最近比较热门的以太坊平台也饶有兴趣,但是还不得法门。如果我们还记得以太坊的一些历史就知道,当时Vitalik在提出建立以太坊的想法的时候,提出的最重要的就是一点:一个具备图灵完备的智能合约的区块链开发平台。什么是图灵完备的智能合约请回顾前期文章。

在文章里我们提到,因为“图灵停机问题”经证明:

不存在这样一个程序或算法,它能够计算任何程序或算法在给定的输入上是否会结束(停机)。

也因此,对于在一个分布式的网络——以太坊上,运行着这样一个程序——智能合约,以太坊的所有节点——矿机无法判断这个程序何时终止,那么面临的风险是:如果出现不能停机的情况,则整个网络将会陷入“浩劫”——网络一直忙于处理这个程序,无法响应其他的请求。

其实,对于区块链这样的应用或网络,我们可以把它当做一台超级计算机,只不过这台计算机必须一直运转下去,就像互联网一直存在一样。

那么,我们再看看,关于上面这个“图灵停机问题”的结论,该如何证明呢?下面这段证明来自网络(http://blog.csdn.net/niushuai666/article/details/7260957),关键部分我会进行介绍:

采用反证法。

假设我们某一天真做出了这么一个极度聪明的万能算法(就叫God_algo吧),你只要给它一段程序(二进制描述),再给它这段程序的输入,它就能告诉你这段程序在这个输入上会不会结束(停机),我们来编写一下我们的这个算法吧:

bool God_algo(char* program, char* input)  //higer注:程序是program,输入是input

{

if( <program> halts on <input> )   //higer注:如果(if)程序(program)能够通过输入                                                               //(input)判断停机(halt)

       return true;                              //higer注: 这个程序判断出来了

return false;                                    //higer注: 这个程序不能判断出来

}

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

bool Satan_algo(char* program)  //higer注: 继续判断是否有这样一个程序program

{

if( God_algo(program, program) ) //higer注: 使用之前那个万能算法检查成功了

{

while(1);                                         // higer注:永远循环下去!

return false;                              //higer注: 这个地方永远执行不到,false是与下方true匹配

}

else

return true;                                    //higer注: 万能程序没有检查出来

}

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

Satan_algo(Satan_algo);

我们来分析一下这行简单的调用:

显然,Satan_algo(Satan_algo)这个调用要么能够运行结束返回(停机),要么不能返回(loop forever)。      //higer注: 就如同要么对,要么错

如果它能够结束,那么Santa_algo算法里面的那个if判断就会成立(因为God_algo(Santa_algo,Santa_algo)将会返回true),从而程序便进入那个包含一个无穷循环while(1);的if分支,于是这个Satan_algo(Satan_algo)调用便永远不会返回(结束)了。 //higer注: 意即,假设对,结果证明错

如果不能结束(停机),则if判断就会失败,从而选择另一个if分支并返回true,即Satan_algo(Satan_algo)又能够返回(停机)。 //higer注: 意即,假设错,结果证明对

总之,我们有:

Satan_algo(Satan_algo)能够停机=> 它不能停机

Satan_algo(Satan_algo)不能停机=> 它能够停机

所以它停也不是,不停也不是,左右矛盾。

反证法是数学里一种非常基本而重要的证明方法,在思考一些逻辑问题的时候对大家也是很有帮助的。

通过上面的一段证明,大家或许大致懂了不可能存在这么一个如上帝般的程序,能够根据所输入的内容判断程序是否能够终止(停机),从而证明了“图灵停机问题”所描述的结论。这也是为何以太坊要添加运算成本(gas)的根本原因。

或许你对上面的程序非常困惑和头大,可能是由于你对一些计算机编程方面的内容感觉有些恐怖和陌生。相信我,如果你静下心来,保持耐心,结合我上面标注的注释,你慢慢总能看懂并理解这里面表达的意思的。

在学习区块链的过程中会碰到不少像这样的障碍,我有办法让你一步步跨过去,比如前期关于智能合约的练习,很多群内的同学都交上了漂亮的作业,并体验了一把编程+虚拟世界体验的快感,你找一下“区块链研习社专栏”,你会看到大家的学习成果。

如果你想更多一些理解程序的世界,可关注我们的课程“零基础入门编程”的课程。

就这样一步一步,只要每天在进步和成长,我们总会达到前方的彼岸。关于以太坊的学习,一个很重要的环节是gas的生成机制是什么,ETH与gas是什么样的关系,后期会介绍。敬请关注。

    原文作者:higer
    原文地址: https://www.jianshu.com/p/37e2caf3ed63
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞