一口气看了图灵出版社的《罗素的故事》,对于里面的提到的一些问题还是比较有兴趣的,聊聊自己所想到的吧
比如逻辑的本质和定义是什么 逻辑的定义:一切新的,决定性的推理,这个有点像演算系统。本质是什么,里面貌似没有说,我个人理解逻辑的本质就是根据现有规则,进行演算的过程。
罗素悖论
罗素最重要的发现,就是我们听到的的:罗素悖论
什么罗素悖论:我记得少年包青天里面有一个故事,大概是一个王爷想惩罚包拯,给包拯出了一个题目,说如果包拯猜对了他在想什么,就可以放了他,如果猜错了,就要惩罚他。包拯就说:王爷想惩罚我。最后王爷没有惩罚包拯,因为如果包拯猜对了,王爷必须放了他,如果猜错了,说明王爷没有想惩罚包拯。
导致罗素悖论的最大问题就是自指性,个人感觉定义一个概念的时候,用到了这个概念本身。比如我们如何定义无穷大数字,可以这么定义:比无穷大还大的数字,但是这个是不合理的,什么是无穷大还是没有正确的说明。
关于罗素悖论,是从集合论推导出来的,集合的定义是这样的:所有具有共通属性的事物的集合
那么集合有两种性质:所有的集合的集合本身也是一个集合,所有数字的集合不是一个数,在第一种情况下,就包含了自指,就会产生悖论
那我们提出一个问题:所有不包括自身集合所组成的集合是否包含自身?
可以看出,这个是没有答案的,也就是不可证的。如果这个集合包含自身,那么他就不属于这样的集合,如果这个集合不包含自身,那么他应该在这个集合里面
可以用一个形象的例子来说明:假设有这样一种性质的网页,这种网页里面的每一个链接所在的域名,都不包含自身所在的域名,比如有一个网页 http://www.test.com/index.html 这个index.html里面定义的所有超链接都不包含test.com 域名。 那我想做一个这种性质的网页,这个网页要包含所有这种不包含自身超链接的所有网页,悖论来了,我做的这个网页到底应不应该包含自己的域名?
如果不包含自身,那么就不满足我自己的定义,因为我要找出所有这种性质的网页,我自己本身就具有这种性质,如果包含自身,也不满足我的定义,因为我定义了我要做一个不包含自身的网页。
为什么悖论重要
这个悖论为什么这么重要,其实说明了一个重要的问题,基于命题规则的演算系统,本身是不完备的。也就是在这个系统里面,存在一个命题,我们无法证明。
我们初中基础的欧式几何就存在这样的问题,我们来看看欧式几何的几个公里
欧式几何的五条公设是:
1、任意两个点可以通过一条直线连接。
2、任意线段能无限延伸成一条直线。
3、给定任意线段,可以以其一个端点作为圆心,该线段作为半径作一个圆。
4、所有直角都全等。
5、若两条直线都与第三条直线相交,并且在同一边的内角之和小于两个直角和,则这两条直线在这一边必定相交。
很多数学家都对第五条公里产生质疑,因为这个太复杂了,和前面四条基本公里没有任何联系,无法通过前面四个规则推导出来,也就是说,在欧式几何这一套体系里面,肯定存在一个命题,我们是没有办法证明的,也就是他是不完备的。很多数学家根据基本规则,推导出所有确定性的结论,这个是不可能的。
而其他数学家,如黎曼,则通过定义了球面集合的几个基本公理,也推导出来自包含的非欧式几何。我们小时候并不了解这个演算和推理过程背后的实质以及存在的问题,直到19世纪与20世纪一批牛逼的逻辑数学家解决了这个问题。
我们可以把这个公理当做基本规则,根据这个规则推导出来的所有命题的过程叫做演算,这样就形成了一个完整的体系。如果这个基本规则是相同的,那么无论通过何种演算过程推导出来的体系,肯定也是一致性的相容的,也就是说过在A体系里面推导出S命题是正确的,那么在B体系里面,根据相同规则推导出来的S'命题也是正确的。
和编程的关系
说了这么多,貌似和编程一点关系都没有,但是最近看到 函数式编程,我突然有点受到启发,怎么说了,函数式编程和这个演算过程很类似,
函数时编程 所定义的 lamda表达式就是一个演算系统,和欧式几何一样,先定义一套基本的规则,也就是lamda表达式,这个基本规则,对任何函数式编程都是一样的。后续的所有计算结果都是基于我们所定义的基本规则进行演算的过程。这一套规则不仅仅可以用来做我们熟悉的编程,还是做任何其他的事情,比如人工智能领域,因为规则和演算过程对于函数式编程语言来说,都是可以自我定义的。但是上面我们介绍了,这一套体系里面肯定会存在有一些命题是无法判定的,那么在函数式编程里面,就存在停机判定问题。
停机问题(halting problem)判断任意一个程序是否会在有限的时间之内结束运行的问题。如果这个问题可以在有限的时间之内解决,那么就可以有一个程序判断其本身是否会停机。但是,在程序停止之前,没有办法判断它会不会停止。所以这是一个不可解的问题。
下面来看看问题的证明
假设存在这种算法,我们用下列伪代码描述:
function halting(func, input) {
return if_func_will_halt_on_input;
}
我们构造另一函数:
function is_halt(func) {
if (halting(func, func)) {
for(;;) //死循环 }
}
接下来,调用:
is_halt(is_halt)
函数is_halt以is_halt为输入时,到底停机还是不停机? 其实就是罗素悖论,由于自指性,所以存在悖论。
在根据一致性结论,所有编程语言C,java,汇编,.net,lisp,由于都是在同一套规则上推导出来的,所以在逻辑上是等价,也就是说 能够用C语言实现的功能,都是可以用其他的语言来实现。
扯了这么多,这个也是自己的理解,有一些地方不一定正确,大家就当看看了解而已,之所以想写这个,只是发现编程的本质真的是数学,程序员应该多了解一些数学知识,数学能够帮你看到一些本质的问题