符号主义是人工智能学科最早的流派之一,其主要是为了解决计算机如何像人类一样进行逻辑推理而诞生的。因此,学习这部分时,一个很好的类比就是如何做数学的证明题。
文章是按罗老师讲义第一章符号主义的顺序来写的。
知识表示
用自然语言表达的基本数学公理 表达为 形式化的符号语言的这个过程,称之为知识表示。
简单来说,把所有的偶数都能被2整除 这句话,用形式化的符号语言表达出来,这个过程就称为知识表示。
知识推理
以形式化语言表述的知识库和查询为输入,用一个自动化的算法,自动运行以得到最终的答案;这一步称为知识推理。
我们用做数学的证明题来对知识表示和知识推理进行理解:
首先,我们要读题干,把题干中的条件用数学语言表达出来(即知识表示),然后把所有的条件汇总(即构成了该题的知识库),然后我们通过思考来进行推理(可以把思考的过程看作大脑自动运行了某个算法,即知识推理)。
模型
逻辑里的 “模型”,其实就是能让某个(些)句子 “成真” 的具体情况 / 场景。
比如有个句子是 “今天下雨,而且地面湿”:
- 如果你今天出门看到 “大雨哗哗下,小区的路全泡在水里”—— 这个具体的天气 + 地面状态,就是这个句子的一个模型(因为它让句子变成真的了);
- 但如果今天 “没下雨,地面是干的”—— 这个情况就不是这个句子的模型(因为句子在这情况里是假的)。
再比如命题 “我是学生”:
- “我今年读大二,每天去学校上课”—— 这个我的身份 / 状态,就是这个命题的模型;
- “我已经工作 5 年了”—— 这个情况就不是它的模型。
M(α) 就是 “所有能让句子α成真的模型(具体情况)凑成的集合”。比如α是 “猫会跳”,那 “加菲猫会跳”“布偶猫会跳” 这些具体的猫 + 动作的情况,全都是α的模型,这些情况合起来就是M(α)。
逻辑蕴含
蕴含这个词,从字面上非常好理解,仍然说证明题,所有证明题的答案,都蕴含在题干中。这句话肯定是正确的,如果不蕴含,那说明题出错了。
从定义上来说,如果一个知识库可以推导出某个结论,那说明该结论蕴含在该知识库中。反过来,如果不能推导出某个结论,那么该结论就不蕴含在知识库中。
蕴含不关心 “前提和结论有没有现实因果关系”,只关心 “真假搭配”—— 所有能让前提为真的场景,结论都必须为真;只要有一个场景是 “前提真但结论假”,就不算蕴含。
再用几个例子辅助理解:
- “x 是偶数” 蕴含 “x 能被 2 整除”:只要 x 是偶数(前提真),就一定能被 2 整除(结论真),没有例外;
- “下雨了” 蕴含 “地会湿”:如果前提 “下雨了” 是真的,结论 “地会湿” 就不可能假(不考虑盖了棚子这种额外情况,蕴含只看 “前提本身能推导结论”);
- 但 “地湿了” 不蕴含 “下雨了”:因为地湿可能是洒水、拖地导致的,存在 “地湿(前提真)但没下雨(结论假)” 的情况,所以这不是蕴含。
命题逻辑
语法
这里告诉我们,原子命题是可以赋值的。
命题逻辑的语法结构
其实就是原子命题+连接词
例题
两组符号的联系
设 α,β 是形式逻辑中的句子,M(α) 表示 “使 α 为真的所有模型构成的集合”,则:
- 逻辑连接词 ∧(合取)对应集合运算 ∩(交集):M(α∧β)=M(α)∩M(β)(α∧β 为真,当且仅当模型同时使 α、β 为真);
- 逻辑连接词 ∨(析取)对应集合运算 ∪(并集):M(α∨β)=M(α)∪M(β)(α∨β 为真,当且仅当模型使 α 为真或使 β 为真)。
两个符号的用途
⊨(逻辑蕴含):是语义层面的关系符号,用于描述 “句子集合与句子之间的推导关系”:若 Σ⊨α(Σ 是句子集合,α 是句子),表示 “所有使 Σ 中所有句子为真的模型,都能使 α 为真”,即 “前提为真时结论必为真”,是语义上的 “必然推导”。
⇒(条件连接词):是形式语言的语法连接词,用于构造复合句子:将两个句子 α,β 组合为新的复合句子 α⇒β(读作 “若 α 则 β”),其真值由 α,β 的真值决定(仅当 α 真且 β 假时,α⇒β 为假;其余情况为真),是构成复杂句子的语法工具。
真值表
真值表很好理解,本质上就是枚举。通过给每个原子命题赋值,来观察最终的命题的值如何变化,以此得出最终命题是否正确。
语义
语义就是对五种逻辑连接词的规定,和上面的真值表一样
这里仅解释一下⇒ 条件
我们拿 “如果我今天发工资(P),就请你吃饭(Q)” 这个承诺来分情况看:
- P 真 Q 真:发工资了,也请吃饭了→承诺兑现,所以 “P⇒Q” 是真的;
- P 真 Q 假:发工资了,但没请吃饭→承诺被打破,所以 “P⇒Q” 是假的(这就是你已经知道的情况);
- P 假 Q 真:没发工资,但还是请你吃饭了→承诺是 “发工资才请”,没发工资的情况我没说 “不请”,所以承诺没被打破→“P⇒Q” 是真的;
- P 假 Q 假:没发工资,也没请吃饭→承诺的 “发工资请吃饭” 根本没触发,自然不存在 “打破承诺”→“P⇒Q” 还是真的。
核心逻辑在于:P 为假时,“P⇒Q” 的承诺 “没机会被打破”,因此,其只有P真Q假这一种情况为假。
实例
(其实这里直接去看罗老师的讲义就行)
1. 案例前提与目标
- 前提:①小偷会说谎,无辜者不会说谎;②小 A、小 B、小 C 三人中仅 1 人是小偷。
- 目标:通过三人的陈述,结合前提推理出谁是小偷。
2. 命题符号设定
用简单命题代表 “某人是小偷”(因 “小偷 = 说谎”,也等价于 “某人说谎”):
3. 知识库归纳(将案例信息转化为命题逻辑公式)
- 小偷唯一性:三人仅 1 人是小偷,对应公式:(A∧¬B∧¬C)∨(¬A∧B∧¬C)∨(¬A∧¬B∧C)。
- 三人陈述的逻辑转化(“某人没说谎” 等价于 “其陈述为真”):
- 小 A 称 “自己不是小偷、小 B 是小偷”,对应:¬A↔B(小 A 没说谎,当且仅当小 B 是小偷);
- 小 B 的陈述对应:¬B↔C;
- 小 C 的陈述对应:¬C↔(A∨B)。
至此,就完成了一个自然语言的问题向形式化语言表达的过程,这就是逻辑蕴含负责的问题。
证明逻辑蕴含的自动算法
本质上就是通过真值表枚举
从真值表可以看出使四个表达式同时为真的只有一种情况:即B为小偷
(罗老师讲义上还有另一个例子,也推荐大家去看看加深理解)
逻辑蕴含的性质
永真(Validity)
可满足(Satisfiable)与不可满足(Unsatisfiable)
这种通过真值指派的自动推理算法,本质上是枚举,因此时间复杂度非常高,实际问题中难以应用。
命题逻辑的形式推演
把 “Σ” 当成 “数学题的已知条件”,“A” 当成 “题目的答案”,“形式推演规则” 当成 “课本里的公式、定理(比如‘等式两边同时加一个数,等式仍成立’)”。“Σ⊢A” 就相当于:用已知条件(Σ),反复用这些公式 / 定理(形式推演规则),只需要有限步操作,就能算出答案(A)。
它的核心特点是:只看 “符号怎么按规则折腾”,不管这些符号的 “实际意思对不对”—— 哪怕前提 Σ 是 “1+1=3”(现实里错的),只要按规则(比如 “两边乘 2”)推出 A=“2+2=6”,那也算 “形式可推演”,因为这是严格按规则来的。
可靠性
完备性
可靠性是说形式推演出的句子一定是正确的,就是可被逻辑蕴含的;完备性是说任意能被正确的蕴含的句子,都可以被这种算法形式推出。一个推演系统是否具有完备性和可靠性是判断一个推演体系能否使用的重要标准。如果把知识库比喻一群涉案人员和一些有关犯罪嫌疑人的线索的话,我们要找的结论比喻成藏在涉案人员中真正的罪犯,那么推演体系就是找罪犯的流程。可靠性代表在推理过程中不会错误地得出一个无辜的人是罪犯的结论,而完备性代表不会漏下一个坏人。
第一套推演系统:11条规则
这些规则相当于证明题中的定理,但是,这种推演系统需要不断使用十一条规则中的某一条,来推出结论。但每次使用哪条规则,并没有明确的方法。因此,这种方法并不是机械化的过程,难以写成一个算法。
第二套推演系统:归结原理
基本概念
文字与互补文字
子句与合取范式
在归结原理体系中,合取范式是所有命题的统一表现形式。而合取范式实际上就是将子句写成合取的形式。事实上,任意句子都可以写成合取范式的形式。
归结规则
仅从做题的角度,并不需要理解归结规则,只需要知道怎么用就行:
归结规则的操作步骤(像 “抵消法”):
- 找两个子句里的互补文字(比如子句 1 有 “B”,子句 2 有 “¬B”);
- 把这对互补的文字 “抵消掉”;
- 把两个子句里剩下的部分,用 “或(∨)” 连起来,得到新子句。
下面仍然用抓小偷的例子来解释:假设B是小偷(α),用¬α合取构建初始合取范式。
首先假设B
第一步归结:拿初始子句
¬B和B∨C归结- 互补文字是
B和¬B(一正一反),抵消后剩下C,得到新子句C(意思是 “C 必须为真”)。
- 互补文字是
第二步归结:拿初始子句
A∨B和¬C∨¬B归结- 互补文字是
B和¬B,抵消后剩下A∨¬C,得到新子句A∨¬C(意思是 “A 成立,或者 C 不成立”)。
- 互补文字是
第三步归结:拿新子句
A∨¬C和初始子句¬A∨¬C归结- 互补文字是
A和¬A,抵消后剩下¬C,得到新子句¬C(意思是 “C 必须为假”)。
- 互补文字是
最后一步归结:拿之前得到的
C和¬C归结- 这俩是互补文字(C 和 ¬C),抵消后什么都没剩下,得到 “空子句(Φ)”
得到空子句,说明假设成立。如果没得到,那么假设不成立。
归结原理为什么能抵消?
归结规则能 “抵消”,核心是互补文字的 “矛盾特性”+ 子句的 “析取逻辑”—— 这不是 “随便消”,而是逻辑上 “必须成立” 的结果。
先明确两个基础逻辑特性:
- 互补文字的矛盾性:比如 “B” 和 “¬B”(一正一反),这俩不可能同时为真(要么 B 真、¬B 假,要么 B 假、¬B 真);
- 子句的析取逻辑:子句是 “用∨(或)连起来的命题”,只要其中至少一个命题为真,整个子句就为真。
举个例子:
- 已知子句 1:“A∨B”(意思是 “A 成立,或者 B 成立”);
- 已知子句 2:“¬B”(意思是 “B 不成立”)。
现在要让这两个子句同时为真(因为是基于 “已知条件为真” 来推理):
- 子句 2 说 “B 不成立”,那子句 1 里的 “B” 就是假的;
- 但子句 1 必须为真(已知条件),所以子句 1 里剩下的 “A”必须为真。
这就是 “抵消 B 和 ¬B 后得到 A” 的原因 —— 是因为 “B 和 ¬B 必有一假”,为了让两个子句都真,剩下的部分必须成立。
再推广到一般情况(比如子句 1 是 “P∨C”,子句 2 是 “¬P∨D”):
- 要让两个子句同时为真,“P” 和 “¬P” 必有一假;
- 如果 P 真,那 ¬P 假,子句 2 要真就得 D 真;
- 如果 ¬P 真,那 P 假,子句 1 要真就得 C 真;
- 不管哪种情况,“C∨D” 一定为真。
所以归结规则的 “抵消”,本质是利用 “互补文字不能同时为真” 的矛盾性,逼着剩下的部分必须成立。
归结原理是可靠的、完备的。具体证明可以看罗老师讲义。归结原理的复杂度也非常高,和枚举区别不大。
第三套推演系统:Modus Ponens 规则
和归结原理系统类似,Modus Ponens 规则也只有一条推出新子句的规则。
该规则的本质是凑齐条件就能得出结论。
第一步:先把规则对应到 “确定子句” 的形式
确定子句有两种形式:
- 单个正文字:比如 “今天下雨(a₁)”“没带伞(a₂)”—— 这是 “事实”;
- (多个正文字的合取) ⇒ 正文字:比如 “如果今天下雨 ∧ 没带伞,那么会淋湿(β)”—— 这是 “条件句”(对应规则里的
a₁∧…∧aₙ ⇒ β)。
第二步:理解这个规则的 “操作逻辑”
规则的式子a₁,…,aₙ, a₁∧…∧aₙ ⇒ β ├ β翻译成人话是:
如果你已经知道所有条件(a₁到 aₙ,都是 “事实”,对应确定子句的第一种形式),同时知道 “这些条件都满足时,会得到结论 β” 的条件句(对应确定子句的第二种形式),那么你就能直接推出结论 β。
第三步:用生活例子代入规则
比如:
- 事实(a₁):今天是周一;
- 事实(a₂):我周一有逻辑课;
- 条件句(a₁∧a₂ ⇒ β):如果 “今天是周一” 且 “我周一有逻辑课”,那么 “我要去教室(β)”;
按照这个规则,把 “今天是周一”“我周一有逻辑课” 这两个事实,和条件句凑在一起,就能直接推出 “我要去教室”。
其实该规则,就是把做数学证明题的逻辑复述了一遍。(反正我感觉这个规则说了跟没说一样)
实例
推理过程如下:
同样的,Modus Ponens规则也是可靠的、完备的。具体证明仍然可以看罗老师讲义。Modus Ponens的复杂度大大降低了,几乎是线性的,但其要求确定子句,因此无法表示一些场景。
可判定的
一阶谓词逻辑
我觉得一阶谓词逻辑理解上不困难,但是要写出来就比较难了,主要是不容易将自然语言转化为形式语言,推导过程和命题逻辑基本上没有区别,同样也是用那几个规则。
基本概念
全称量词和存在量词高中用的很多,这里的用法和高中完全一致,应该是不难理解的
一阶谓词逻辑表示知识
看应该还是多少看得懂的,但是真让我写就。。。
一阶谓词逻辑的蕴含推理
由于变量的引入,一阶谓词逻辑的蕴含推理(枚举)就不像命题逻辑那样可以通过真值表来进行,其枚举所需要的组合数量非常大,因此其几乎无法进行蕴含推理。
一阶谓词逻辑的形式推理
合一算子
一阶谓词逻辑的归结原理
首先转化合取范式
然后使用归结原理进行推理
罗老师的讲义中给出了一个实例,和命题逻辑不同之处在于要进行合一替换。大家配合AI自行食用,真考到了我建议直接放弃(bushi。
一阶谓词逻辑的 Modus Ponens 规则
同样的,建议问AI。
一阶谓词逻辑的两个推理规则都是可靠且完备的。