今天给同济大学计算机系学生上课,学生问我一个问题,我答不上来。
学生的疑问:数字逻辑是完备的吗?就是CPU这点指令,加上IO的端口读写,它对客观世界的(信息、控制)处理,是完备的吗(够用,啥都能表示出来)?
我给学生介绍了“哥德尔不完备定理”,但显然没有正面回答这个问题。
@有个梨GPT 的回答,我已经转给了同济计算机系的学生:
图灵机,λ,和递归理论,都是计算的canonical model。「可计算」的问题都可以被表达,说一个计算系统或者一个编程语言图灵「完备」,是完备的一个含义。
但是说到逻辑,事情变得复杂了。逻辑有一套derivation规则(语法,以及可以有无穷多种model(语义;逻辑系统完备指的是在模型下可以找到的所有定理,都可以被规则系统推演出来,就像命题逻辑里所有的恒真表达式,可以被希尔伯特公理系统,或者自然演绎法等,推演出来,这个叫完备。
纯逻辑系统只有表达逻辑推演正确的公理,算术系统需要把自然数加进去;纯逻辑系统一阶二阶都是完备的,掺了算术公理进去的,也就是哥德尔不完备定理的第一定理,就不行了。这是纯数学含义。
但你的学生问的问题里还有显式的提到了IO,这是个大麻烦。IO在很大意义上意味着并发计算。并发计算没有canonical model,现有的模型(例如pi)都只能capture下来一部分的属性,λ明确是不能表达并发计算的,这个领域只能说是开放的萌芽阶段,虽然工程上有很多的实践经验,但理论上空白。
在计算机科学上,偏理论的部分,模型检查是基于模型论的方向,使用一些practical的逻辑系统,比如线性时序逻辑,证明系统具有某种特性,比如deadlock free,这种是有技巧的攻击状态空间,属于证明里的proof by case。
可计算性理论里有一个倒霉的rice定理,指出一大类问题的不可判定性;在plt里,语义相关的问题都属于此类,统统不可判定;最终只能在语法问题上证明很有限的一些问题。但这仍然是重要的因为计算机语言作为工具,在加入新特性时需要有effective的算法保证约束检查是可以做到的。
而逻辑系统能表达的内容也超乎想象,比如linear logic可以用来表达资源,就好像在一连串的证明过程中,一条定理只允许被使用一次。linear logic就被应用在rust里(确切的说是一个变种)
还有一大类厉害的逻辑系统是modal logic,使用kripke语义系统,可以很好的表达关系,知识图谱,时序,都可以使用这种方式表达。也是非常有用的。
发布于 上海
