哥德尔,图灵和康托尔 part 2 停机问题
图灵著名的停机问题对于软件开发者而已是非常熟悉的。下面简单描述停机问题:
假设给你一个计算机程序的源代码,也给你所有程序要用的数据,文件,硬盘,DVD等等,所有它需要处理的东西。你能告诉我程序最终是否能够输出我们需要的结果吗,并且在工作完成之后,程序是就退出,还是会永远运行下去不会停止呢?换句话所就是,对于它会不会停止这个问题, 检查程序和数据,是不是足以能够让你回答是或否呢?
图灵对于停机问题不可解决的证明是决定性的。没有一个软件仅靠检查另一个软件的源代码,就能够决定它是否会停止运行,还是会永远运行。这是从软件领域对哥德尔证明的重新表述。很多程度上这个证明与哥德尔的是相同的,只是更容易理解,这个证明可以表示成简单的软件代码,而不是令人费解的运行在逻辑语法上的函数。停机问题的证明对开发人员是很容易理解的,但对其它人来讲并没有太大用处,因此,我们这里就不去讲述了。可以自己去读。
不用枯燥的证明,我们用一个实际的例子来展示。比如我向你要一个预言,下面这个程序会不会停止呢?
从\(x=4\)开始。给我第一个素数\(p\),\(p\)小于\(x\)。如果\(x-p\)也是素数,把\(x\)加2然后继续。如果不是,让\(p\)作为下一个小的素数然后重新开始。重复以上直到\(p=2\)。如果\(x-p\)还不是素数,打印\(x\)然后退出。
问题并不复杂,而且对于任何现代的计算机语言来讲都很简单。假设我们不知道停机问题,那很可能会想这样简单的问题应该是容易预测的。
迷惑之处在于,我没有说是任何程序。上面的语句描述的是著名的哥德巴赫猜想,300年来都是不可证明的。软件仅仅检查这个语句“每个大于2的偶数能够用2个素数之和表示”是否为真,然后移到下一个偶数。对所有前4,000,000,000,000,000,000个数检查下来,我们仍然没有得到一个真正的数学证明。
关键在于,知道这几行代码是否停止_等于_证明哥德巴赫猜想!如果猜想是真则软件不会停止,检查所有直到无穷大的数,都不会发现任何一个破坏这个规则的数。如果猜想为假,那软件就会在找到第一个破坏规则的数之后停止。
有些有趣的东西正在发生。很明显软件只是另一个写逻辑形式系统的方法。我们能用语言或者软件,甚至更低级别的纯粹的哥德尔风格的逻辑算符,如果想的话。然而,基本上,几行语句就能够表示数学上最基础的问题。知道什么时候程序会停止-给出我们想要的结果-和证明难以置信的难题一样困难。我们甚至可以重新用哥德尔的递归函数来写这个软件,然后写这样一个语句“这个函数在某个数之后停止是否为真”。同样是又一次证明这个语句和证明哥德巴赫猜想是一样的。
哥德巴赫猜想目前是数学上一个很大的不可解问题。或者某天有人会真正找到证明;但很可能是某人不用其他公理,证明这个猜想是不可决定的。这样的证明不可思议地难,但类似的问题以前也曾经被证明过。
即使形式系统中最简单的表达式,比如几行软件代码,都能表示非常难的语句,对于我们目前的数学知识,其中一些是不能决定的。软件限制不了其他软件。软件又是如此普遍的存在,以至于行为完全不可预测。另一个软件不能预先告诉你结果会是什么。得到结果的唯一的办法,只有等他运行完毕-可能几小时,或者永远运行下去。
停机问题显示出硬币的另一面。如果一个语句是不可判定的,你不能作弊,只能写一个软件去检查它。软件轻易就可以表示那个语句,但它可能会用无尽的时间去完成它的工作。只要语句的不可判定无法证明,你就证明不了软件是不是会停止。无穷的知识,更多的证明就在那里:然而这些知识却触摸不到,只要我们受限于当前的系统。
既然现在我们开始处理无穷,就是时候了解更多了。大概40年前哥德尔打开大门时,另一个辉煌的思想正在分析关于无穷的问题。
初遇无穷
我们思考无穷的时候,第一个想到的就是无穷大。但比起一行简单递增的数字来讲,无穷变得更加有趣。我们考察自然数和实数。我们知道自然数是\(1,2,3\)这样的序列,用于计数。我们用实数来衡量真实世界里面的元素,-即,两点间的距离是1.23米之类。无穷的自然数和无穷的实数一样显而易见。
格奥尔格.康托尔证明了一个惊人的结论,称为康托尔对角证明,即就算用无穷的自然数,我们仍然不能对实数进行计数!不知道怎么了,无穷多个自然数其实不够“无穷”!而且有_不同_类型的无穷;由实数组成的无穷,要比自然数组成的无穷更强大。这个证明惊人地简单。
【证明略...对角引理】
很明显连续无穷更强大。那是属于我们周围真实世界的无穷,我们世界里的每个东西都是实数描述的。然而我们永远不知道任意这些实数的准确数字。我们永远局限在我们仪器的误差之中。我们的测量工具在某个地方舍弃了数据,包含无穷的数字的实数被截断。
【...】
这篇文章其实是一篇非常好的引入计算理论和lambda calculus的文章。读者可以知道图灵机实际上是数学问题,而lambda其实是一个逻辑系统。能够在二者之间建立起初步的概念。然后在Reducibility和NP之类的主题,就可以选择角度,互相参照。
哥德尔,图灵和康托尔 part 2 停机问题的更多相关文章
- 哥德尔,图灵和康托尔 part 1 哥德尔编号
在看计算理论相关的书的时候,偶然看到这个blog,http://skibinsky.com/godel-turing-and-cantor-the-math/,写的很好.我觉得用自动机的方式讲计算理论 ...
- 推举算法 AdaBoost 哥德尔奖 Godel Prize
推举算法 AdaBoost 2003年理论计算机科学界最高奖 哥德尔奖 Godel Prize
- matlab实现雅可比、高斯塞德尔、后项误差计算
稀疏矩阵生成: function [a, b] = aparsesetup(n) e = ones(n, 1); n2 = n / 2; a = spdiags([-e 3*e -e], -1:1, ...
- Kendall's tau-b(肯德尔)等级相关系数
Kendall's tau-b(肯德尔)等级相关系数:用于反映分类变量相关性的指标,适用于两个分类变量均为有序分类的情况.对相关的有序变量进行非参数相关检验:取值范围在-1-1之间,此检验适合于正方形 ...
- 德尔福 XE5 安卓权限设置
http://delphi.org/2013/10/delphi-xe5-android-uses-permissions/ The permissions required by a Delphi ...
- 德尔福 XE5 安卓调试
https://stackoverflow.com/questions/2604727/how-can-i-connect-to-android-with-adb-over-tcp?page=2&am ...
- 图灵的文章“Computing machinery and intelligence”译文
图灵奠基AI的力作“Computing machinery and intelligence”全文译完,摘自http://blog.sciencenet.cn/blog-2322490-112266 ...
- Y组合子
Y组合子 Y组合子的用处 作者:王霄池链接:https://www.zhihu.com/question/21099081/answer/18830200来源:知乎著作权归作者所有.商业转载请联系作者 ...
- heavy dark--读《《暗时间》》
本书名为<<暗时间>>,个人觉得是一个非常好的名字:1.迷茫的大学生有多少的业余时间,但又浪费多少的业余时间,浪费的这莫多时间就如同人在黑夜中一样,大脑是在休息的状态.这是第一 ...
随机推荐
- skynet的流程1
logpath = "."harbor = 1address = "127.0.0.1:2526"master = "127.0.0.1:2013&q ...
- Compiling Qt 5.5.1 (With Qtwebkit) With Visual Studio 2015
I usually avoid writing articles about building a specific version of a software project but this ti ...
- delphi 读网页线程TReadHtmlThread
读网页,通常是一个耗时操作.故把读网页放入线程是显得比较重要了. 本例用改进后的 TIdhttpEx 加上线程来实现读网页. 它的父类TSimpleThread 在此 本例程源码在此 源码中包含了所有 ...
- 实用chrome插件
2015年最实用的9款chrome插件 随着14年chrome浏览器的市场超过IE浏览器,chrome凭借它强劲性能和出色的使用体验真正的登上了平民级的殿堂.今天小编就为大家推荐9款自己常用的chro ...
- JVM(Java虚拟机)优化大全和案例实战
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- Linux网桥
linux网桥的功能 转发数据包 网桥的功能在延长网络跨度上类似于中继器,然而它能提供智能化连接服务,即根据帧的终点地址处于哪一网段来进行转发和滤除.网桥对站点所处网段的了解是靠"自学习&q ...
- overfitting
当模型复杂度上升时,可控制参数变多,VC dimension变大, 当VC dimension过大时,虽然Ein很小,但是Eout很大,产生overfitting 比喻:开车 开太快 ...
- 实现多文件上传在iOS开发中
该功能实现了实现多文件上传在iOS开发中,喜欢的朋友可以研究一下吧. NSURL* url = [NSURL URLWithString:@"xxx"]; ASIFormDataR ...
- usb键鼠标驱动分析
一.鼠标 linux下的usb鼠标驱动在/drivers/hid/usbhid/usbmouse.c中实现 1.加载初始化过程 1.1模块入口 module_init(usb_mouse_init); ...
- 我终于解决UM编辑器了 泪......
气死我了..... 好不容易测试好了....更显得我笨了..... 原来....什么都不用改 只改了2个小位置....真的是.....回首自己 不敢看 0.0 OK 记下步骤 以免以后忘记 将 ...