哥德尔不完备定理
哥德尔不完备定理是库尔特·哥德尔(Kurt Friedrich Gödel)于1931年证明并发表的两条定理。简单地说,第一条定理指出:
任何自洽的形式系统,只要蕴涵皮亚诺算术公理,就可以在其中构造在体系中不能被证明的真命题,因此通过推理演绎不能得到所有真命题
把第一条定理的证明过程在体系内部形式化后,哥德尔证明了第二条定理。该定理指出:
任何逻辑自洽的形式系统,只要蕴涵皮亚诺算术公理,它就不能用于证明其本身的自洽性。
我们在这里不证明哥德尔不完备定理,仅仅用它说明停机问题。
停机问题
停机问题就是判断任意一个程序是否能在有限的时间之内结束运行的问题。该问题等价于如下的判定问题:
是否存在一个程序P,对于任意输入的程序w,能够判断w会在有限时间内结束或者死循环。
停机问题可解吗
任何自洽的形式系统,只要蕴涵皮亚诺算术公理,就可以在其中构造在体系中不能被证明的真命题,因此通过推理演绎不能得到所有真命题
从这条定理我们可以得知,首先在程序中一定会出现编译器无法检查出,却实际上会造成错误的语句。比如一台打印机,输入P*X这条指令会打印X,输入NP*X则一定不会打印X,那么如果我输入P*NP*NP*会怎么样呢?
任何逻辑自洽的形式系统,只要蕴涵皮亚诺算术公理,它就不能用于证明其本身的自洽性。
这条定理又意味着一个系统无法判断自己到底一不一致,也就是说如果假定系统是相容的,最后证明的结果就是不相容的,这个用数学解释起来比较难懂,我们可以用著名的罗素悖论来理解
一座小城里有位理发师, 他有一项规定: 他给并且只给那些不给自己理发的人理发.他该给自己理发吗?
在编程中,我们可以理解为有一个程序p,它的功能是接受一个函数,并判断这个函数是否能够结束(停机),如果结束了返回true,如果无法结束就返回false,这恰好就是停机问题!
由哥德尔不完备定理我们可以得知永远不会有这么一个程序出现。
总结
哥德尔不完备定理告诉了我们没有完美的数学系统,所以更没有完美的程序。
我们不能过于依赖编译器的错误提示,来不管不顾的使用丑陋的代码完成业务功能,只要能跑起来就行。
功能的错误是很好解决的,但是不清晰的代码造成的混乱才是问题的根源。
要记住,代码能跑起来并不意味着写出了正确的程序,只不过是这个世界的缺陷才让垃圾代码通过了编译,使用高密度的逻辑几行解决问题的代码通常要比废话连篇的代码造成的混乱更多!