符号与机器(二):符号,计算抽象
我想寻求这样一张特殊的字母表,其元素表示的不是声音而是概念。有了这样一个符号系统,我们就可以发展出一种语言,我们仅凭符号演算,就可以确定用这种语言写成的哪些句子为真,以及它们之间存在着什么样的逻辑关系。 — —莱布尼兹的愿望
上篇文章讨论了函数的语义混乱和 lambda 演算,并产生了函数定义,参数传递,函数调用三个操作概念,三个操作组合在一起精确定义了数学中函数混乱的语义,算是一个引言吧。我们继续。
两个问题
- 计算这个名称本属于代数系统(加减乘除和未知量),为什么会进入到逻辑(true 和 false)主导的领域?
- 抽象能力決定一个人的编程能力,那么抽象是什么?如何抽象?
计算和逻辑
代数源于人类的实践,代数中代表着数量和运算的符号服从不多的几条基本规则,正是源于对人类社会和自然活动规则的抽象,代数符号系统无需什么帮助就能奇迹般地产生出问题的正确答案,代数"强大的力量"正是源于此。而同样的规则也可适用手其他形形色色的对象和运算,因此也可以被赋 予"强大的力量”。简单代数系统可以表达为:
数量属性:
- 1 是自然数
- 每一个自然数 a 都有一个后继 a+1
数量值运算:
+ - × /
为了实践莱布尼茨的愿望,布尔发现去掉算术系统中数字及其的属性,保留对数字的操作,用逻辑值(true和false)代替数值,而逻辑值有自己的属性和意义,就形成了布尔逻辑系统。这样布尔逻辑系统就是只存在1 (true)和0 (false) 两个数值运算的代数系统。
逻辑值属性:
只有两个数值:true 和 false 或者 0 和 1
逻辑值运算:
0+1 = 1
1+1 = 1
0×1 = 0
1×1 = 1
......
其他运算可以参照代数逻辑推演出来。这样布尔就把逻辑规约成代数运算系统,发现代数系统中的运算法则(结合,交换,分配法则)同样也适用于逻辑系统。有了逻辑系统,我们就可以对句子进行推理,也就实现了开头莱布尼兹的愿望。
比如:
- 下雨了没有太阳
- 晒被子有太阳
- 下雨了,小明在晒被子
如果句子1为true,那么句子2肯定为false,句子3就是1(true)×2(false)=false,所以3是不可能的。我们甚至可以把这个推理过程表达成某种符号做成软件,名字就叫“小明今天晒被子吗”程序。
这样代数系统就有了推理能力。推理能力正是布尔逻辑产生的原因,也是其最重要的意义所在。而推理是比代数运算更具有普适性的运算,因此,推理反过来又可以构建代数系统,甚至可以用来构建任何系统,信不信由你,适合的话后面会对推理继续深入的。
抽象
用Python简单表达一下抽象过程:
class Number:
def __init__(self, value):
self.value = value
def __repr__(self):
return '%s' % self.value
def __add__(self, other):
return Number (self.value + other.value)
class Bool:
def __init__(self, value):
self.value = value
def __repr__(self):
return '%s' % self.value
def __add__(self, other):
if self.value == 0:
return Bool(other.value)
else:
return Bool(self.value)
a = Number (1)
b = Number (2)
print a + b #Output:3
a = Bool (1)
b = Bool (0)
print a + b #Output:1
这样也用编程语言实现了这一过程,明白这一点也就明白了计算机中的抽象的本质,明白了如何去构建一个可用的抽象系统,计算理论中有一个名词,图灵可归约,其实是一个意思。希望你们看过这个篇文章,以后再观察或者学习其他事物的时候,能够看出更多相似抽象的概念。
结尾
所以计算到底是什么呢?想象一条河流,河水沿着河床顺流而下,遇到大大小小的石头,翻起一个个回旋,大大小小水流的方向改变,汇入,消逝,继续向前。
禁止转载。