什么是运算律
最近做了一些有关运算律的思考,和大家分享一下。
名词解释
词 | 含义 |
---|---|
数 | 不可再分的原子,可以判断两个数是否相等 |
代数 | 用字母表示数 |
线性代数 | 定义了加法和数乘两种运算,它们满足一组运算律 |
运算律
首先,运算律一定是关于运算的,而运算一定是关于表达式的。运算就是把表达式映射到值。
词 | 含义 |
---|---|
具体表达式 | 由数和算符组成的表达式,有一个值 |
抽象表达式 | 含有字母的表达式,是一组具体表达式,没有值 |
具体表达式:
一 | 二 | |
---|---|---|
具体表达式 | +(2, 4) | +(4, 2) |
值 | 6 | 6 |
抽象表达式:
考虑 +(a, b) 和 +(b, a) | |
---|---|
逻辑事实 | 任意a, b,+(a, b)的值 = +(b, a)的值 |
运算律 | +(a, b) == +(b, a) |
可见,运算律就是将一个 用逻辑语言描述的有关表达式的值的事实 定义为 表达式之间的等价关系。
与之相关的,抽象代数就是研究任意运算律的后果。
编程语言
想清楚了上述问题,我们可以提问,编程语言是否是一个代数系统,从而在抽象代数的研究范围内?
我想,答案几乎是否定的。最主要的原因是,编程语言中广泛使用的 “状态” 在代数中找不到合适的对应概念。这是怎么回事呢?
首先,“状态” 是一个有关求值过程的概念,似乎位于数学最不关心的地方(数学不关心用逻辑语言描述的值该怎样求出来,算法就是用来填补这个缺口的)。
更加不妙的是,如果我们故技重施,用程序语言表示计算过程,再把程序抽象成数,定义一个计算结果是图灵机状态的 “执行” 算子,我们会失望地发现,算子 “执行” 几乎没有任何性质。即,我们对 “执行” 无话可说!
计算过程
我们用代码表示计算过程,而实际上,计算过程是对图灵机状态转移的指示。可以说,“状态” 就来自图灵机(和几个更弱的机器)。
你可能知道,λ 演算和图灵机是等价的。λ 演算定义了函数。函数是一种独特的数,函数体是一个抽象表达式,函数的运算只有 “应用” 这一种。即便如此,函数还是有一些有趣的性质,比如“不动点”,即 Y 组合子。
但前途并非一片光明。实践经验表明,不使用状态,有些问题会难以解决。你在编程时禁止自己使用可变数据结构,就可以体会到。
之所以过程和抽象表达式函数在编程语言中可以混用,是因为从逻辑层面上它们没有区别,都是逻辑函数的实现。如,在 Java 中,可以将逻辑函数定义为接口。
所以,我们应当明辨,代数何时开口,何时沉默。