符号主义与自动推理

从形式逻辑系统到消解原理与 Prolog 的自动推理方法

Posted by CloudingYu on June 5, 2026

一、符号主义概述

1.1 核心思想

符号主义是人工智能实现的第三条途径,也是最古老的方法。其核心思想是:机器可以不了解符号的实际物理世界含义,仅通过符号的改写来完成与人推理结果相同的推理,即实现自动推理(Automatic Reasoning)。

符号主义与另外两条 AI 路径形成对比:

  • 仿生学/连接主义:基于神经系统构造神经网络模型,目前已成为机器学习与人工智能中最大的领域,近十几年的主要 AI 进展主要来自于此。
  • 进化主义:将优化问题转化为基因表达,通过选择、交叉、变异三个算子使种群向最优解靠拢,目前在三大 AI 学派中相对处于劣势,主要退化为组合优化技术。

1.2 本章四部分

  1. 逻辑学基础:符号主义的理论基础
  2. 逻辑学系统的本质:有哪些逻辑系统及其可计算性问题
  3. 消解原理(Resolution Principle):将符号主义变成可在计算机内部自动运行的算法
  4. Prolog 语言:基于消解原理的编程语言(Programming in Logic)

二、逻辑学系统基础

2.1 逻辑学系统的三部分

  • 逻辑学(Logic):帮助判断系统中的逻辑断言是否包含冗余,或各表达式之间是否存在矛盾的形式化系统
  • 本体论(Ontology):规定形式化系统中出现的符号必须有明确的含义。核心原则——所有概念在逻辑系统中有唯一的字符串表示(名称不同即对象不同,无歧义)
  • 计算理论结合:只有与计算理论结合后,才能将逻辑系统放入计算机内自动推理

2.2 认识逻辑系统的五个维度

任何一个逻辑学系统,从以下五方面分析即可理解其本质:

  1. 符号(Symbols):系统引入了哪些符号
  2. (Terms):符号如何定义——常元(constant)、变元(variable)、函元(function)
  3. 语句(Expressions/Sentences):如何用连接算子从基础命题构造复杂语句
  4. 语义(Semantics):如何解释语句的真假
  5. 推理算法(Inference Algorithm):如何进行自动化推理

三、命题逻辑

命题逻辑(Propositional Logic):最基础、最简单的逻辑系统。

3.1 符号系统

  • 命题符号:大写字母 P, Q, R, S… 表示命题(断言)
  • 真值:True(真)或 False(假),二值逻辑
  • 连接算子(Logical Connectives):
    • $\land$(合取/Conjunction):两个命题都为真时,合取表达式才为真
    • $\lor$(析取/Disjunction):只要有一个命题为真,析取表达式即为真
    • $\neg$(否定/Negation)
    • $\rightarrow$(蕴含/Implication)
    • $\equiv$(等价/Equivalence)

3.2 语义与善意推定

命题逻辑的语义通过真值表定义。

善意推定(Benevolent Assumption)是蕴含式的语义规定:在逻辑学系统中,如果前提是 False,不管结论是 True 还是 False,该蕴含式都被认为成立。唯一不被认可的情况是前提为 True 但结论为 False。

以”下雨 → 地湿”为例:

下雨 地湿 是否认可
F F
F T ✓(地湿可能是其他原因)
T F ✗(不能接受)
T T

关键结论:计算机内部自动推理的本质——在定义了符号系统之后,利用等价公式对符号进行纯语法层面的改写(计算机不知道 P 代表”下雨”、Q 代表”地湿”)。

3.3 真值表推理的局限

  • 有 $N$ 个命题时,需要考虑 $2^N$ 种世界(解释)
  • 复杂度指数级增长,效率低下
  • 真值表证明方式复杂度太高,需要更好的方法

3.4 命题逻辑的致命缺陷

给定”所有人都会死”和”苏格拉底是人”,在命题逻辑中计算机无法推导出”苏格拉底会死”。因为命题逻辑不区分个体集合之间的关系——计算机只能做字符串的完全匹配,缺乏变量替换机制。


四、一阶谓词逻辑

一阶谓词逻辑(First-Order Predicate Logic, FOL):在命题逻辑基础上引入集合(变量)的概念。

4.1 新增符号

除了保留命题逻辑的 True/False 和五个连接算子外,新增:

  • 常元(Constant):如 “Socrates”(苏格拉底)
  • 变元(Variable):如 $x, y, z$,可代表集合中的任意个体
  • 函元(Function):如 $\text{mother}(x), \text{father}(x)$
  • 谓词(Predicate):表示个体间的关系,如 $\text{man}(x), \text{die}(x), \text{parent}(x, y)$

新增两个量词(Quantifier):

量词 符号 含义 来源
全称量词(Universal Quantifier) $\forall$ 对所有的… All 的 A 倒写
存在量词(Existential Quantifier) $\exists$ 存在某个… Exist 的 E 反转

4.2 解决命题逻辑的缺陷

苏格拉底问题在一阶谓词逻辑中被解决:

\[\forall x (\text{man}(x) \rightarrow \text{die}(x))\]

因为 $x$ 在全称量词辖域内,可以替换为任意个体。将 $x$ 替换为 Socrates:

\[\text{man}(\text{Socrates}) \rightarrow \text{die}(\text{Socrates})\]

与事实 $\text{man}(\text{Socrates})$ 匹配后,直接推导出 $\text{die}(\text{Socrates})$。

4.3 表达能力

一阶谓词逻辑可以表达丰富的领域知识:

  • 数学领域:常元是数字(0、1、自然数、浮点数、无理数),函元是数学函数($\sin, \log, +$),谓词表示相等($=$)、小于($<$)、共轭关系等
  • 人物关系分析(如《红楼梦》):常元是人物(贾宝玉、史湘云、刘姥姥),变元代表任意集合(男性集合、女性集合),谓词表示父亲、母亲、兄弟等关系

形式化系统提供了严谨的表达领域知识的方法:将所有知识编码为逻辑表达式,让计算机自动推理。

4.4 与深度学习的对比

符号主义方法有两个深度学习不具备的优势:

  1. 知识复用的高效性:一条规则就能让系统理解关系(深度学习需要大量样本)
  2. 可解释性:推理链条可追踪,可以知道新知识是利用了哪些已有知识推导出来的

符号神经计算(Symbolic Neural Computing)是一个新兴领域,试图结合符号主义的数学优雅、知识利用高效性和可解释性,与神经网络对复杂模式的挖掘能力。


五、推理的数学基础

5.1 推理的定义

推理(Inference):给定一组用逻辑表达式表示的知识集合,推导出新的正确表达式。

5.2 逻辑蕴含的判断条件

核心问题:什么时候能断言新推导出来的知识是原有知识的必然逻辑结果(Logical Consequence)?

判断条件(基于可满足性/Satisfiability):所有能够满足知识库 S(使 S 中所有表达式为真)的解释,是否也都能满足新表达式 X?如果能,X 就是 S 的必然逻辑结果。

  • 可满足(Satisfiable):能找到一个解释(世界)使表达式为真
  • 不可满足(Unsatisfiable):在所有解释下表达式都为假
  • 推理时只关心知识库中所有表达式都为真的那些世界(因为前提为假时,善意推定使得结论真假无法判断)

5.3 封闭世界假设与开放世界假设

封闭世界假设(Closed World Assumption, CWA):如果无法证明某个命题为真,就默认它为假。这是多数逻辑系统遵循的原则。

CWA 并非总是正确。以 Oedipus 希腊神话为例:在封闭世界假设下会推导出不合理的结论。

描述逻辑(Description Logic)遵循与 CWA 不同的假设:

  • 描述逻辑遵循开放世界假设(Open World Assumption):可以对未知真假的事物做假设
  • 描述逻辑是现代知识图谱(Knowledge Graph)的理论基础
  • 开放世界假设更合理,但计算复杂度更高

六、消解原理

消解原理为给定公理或定理的情况下,机器能够自动完成推理奠定了理论基础。

6.1 核心思想(反证法)

要证明新命题 $E$ 是知识库 $KB = \{A, B, C, D\}$ 的必然逻辑结果:

  1. 将 $E$ 的否定 $\neg E$ 加入知识库,得到扩展集合 $\{A, B, C, D, \neg E\}$
  2. 尝试证明扩展集合不可满足(产生矛盾)
  3. 如果产生矛盾(消解出空子句),说明 $\neg E$ 与 KB 不相容
  4. 在 KB 都为真的世界中,$\neg E$ 必为假 → $E$ 必为真 → $E$ 是 KB 的必然逻辑结果

其逻辑是:将待证命题的否定放入系统,如果能推导出矛盾(空子句/否认),则表明新添加的命题造成了不相容——因为 KB 本身是可满足的。因此,必然在原 KB 都为真的世界里,$\neg E$ 为假 → $E$ 为真 → $E$ 是原 KB 的必然逻辑结果。

6.2 消解步骤

每一步消解:

  1. 找一对逻辑表达式,其中一个包含正文字(如 $P$),另一个包含副文字(如 $\neg P$),且这两个文字对应同一谓词
  2. 进行变量替换(统一化/Unification),使两个文字完全相同
  3. 消去这一对正/副文字,剩余部分合并(析取关系保留)

重复此过程。如果最终消解出空子句($\square$,即矛盾),则证明成功。

6.3 保真性(Soundness)

消解是保真的:任何情况下,消解产生的结果都是原两个表达式的必然逻辑结果。

证明(分情况讨论):

  • 若正文字为 True → 另一表达式中的副文字为 False → 该表达式必须依赖其他析取项为 True
  • 若正文字为 False → 同理,另一表达式的其他析取项必须使整体为 True
  • 无论哪种情况,消去正副文字对后剩余的部分必为真

6.4 示例:Fido 会死吗?

知识库

  1. $\forall x (\text{dog}(x) \rightarrow \text{animal}(x))$
  2. $\forall y (\text{animal}(y) \rightarrow \text{die}(y))$
  3. $\text{dog}(\text{Fido})$

问题:Fido 会死吗?即证明 $\text{die}(\text{Fido})$。

消解过程

  1. 将蕴含式转为析取范式:$\neg\text{dog}(x) \lor \text{animal}(x)$,$\neg\text{animal}(y) \lor \text{die}(y)$
  2. 将 $\neg\text{die}(\text{Fido})$ 加入
  3. 变量替换 $y \rightarrow x$,消去 $\text{animal}(x)$ 和 $\neg\text{animal}(x)$ → 得到 $\neg\text{dog}(x) \lor \text{die}(x)$
  4. 变量替换 $x \rightarrow \text{Fido}$,$\neg\text{dog}(\text{Fido})$ 与 $\text{dog}(\text{Fido})$ 消去 → 得到 $\text{die}(\text{Fido})$
  5. $\text{die}(\text{Fido})$ 与 $\neg\text{die}(\text{Fido})$ 消去 → 空子句

七、自然语言到消解:完整流程与例题

7.1 完整流程

将自然语言描述的知识库用于消解证明的完整流程:

  1. 逐条转换为逻辑表达式
  2. 转换为析取范式
  3. 用消解原理进行推理证明

7.2 例题一:Happy Student(快乐学生)

自然语言

  1. 任何人通过历史考试且赢得彩票 → 快乐
  2. 任何人学习或幸运 → 可通过任何考试
  3. John 不学习但幸运
  4. 任何幸运的人 → 赢得彩票

问题:John 快乐吗?

逻辑表达式

  1. $\forall x [\text{pass}(x, \text{history}) \land \text{win}(x, \text{lottery}) \rightarrow \text{happy}(x)]$
  2. $\forall x \forall y [\text{study}(x) \lor \text{lucky}(x) \rightarrow \text{pass}(x, y)]$
  3. $\neg\text{study}(\text{John}) \land \text{lucky}(\text{John})$
  4. $\forall x [\text{lucky}(x) \rightarrow \text{win}(x, \text{lottery})]$

消解证明:依次消去 win、happy、pass、lucky 对应的正副文字对,最终得空子句 → John 是快乐的

7.3 例题二:Exciting Life(精彩人生)

自然语言

  1. 所有人如果不穷(rich 且 smart)→ happy
  2. 能阅读的人不愚蠢(阅读 → smart)
  3. John 能阅读且 wealthy(not poor)
  4. Happy people have exciting life

问题:是否存在某个人拥有 exciting life?(非指名道姓的问题)

关键区别:问题涉及存在量词 $\exists w(\text{exciting}(w))$。消解过程中的变量替换会在答案中揭示这个人是谁——沿消解路径回溯变量替换即可:$w \rightarrow Z \rightarrow X \rightarrow Y \rightarrow \text{John}$,所以答案就是 John

7.4 例题三:Great Grandparents(曾祖父母)

自然语言

  1. 每一个人都有一个 parent
  2. Parent 的 parent 是 grandparent
  3. John 有没有 grandparent?

关键:第一条 $\forall x \exists y (\text{parent}(y, x))$ 含有存在量词。

Skolem 化:将存在量词 $y$ 替换为函元 $\text{pa}(x)$(表示 x 的 parent),消除存在量词。

消解完成后答案:John 的 grandparent 是 $\text{pa}(\text{pa}(\text{John}))$ — 即 John 的 parent 的 parent。


八、析取范式的九步转换

将任意一阶谓词逻辑表达式转为析取范式(CNF/Clausal Form)的九个步骤:

步骤 操作 说明
1 消去蕴含 $A \rightarrow B \equiv \neg A \lor B$,$A \equiv B \equiv (\neg A \lor B) \land (A \lor \neg B)$
2 否定内移 将否定符号 $\neg$ 移到原子命题前。$\neg\forall x P \equiv \exists x \neg P$,$\neg\exists x P \equiv \forall x \neg P$;De Morgan 定律
3 变量换名 不同量词辖域内的变量名必须不同(避免同名冲突)
4 量词前移 将所有量词移到表达式最前面(保持原顺序)
5 Skolem 化 消除存在量词:$\forall x \exists y P(x,y) \rightarrow \forall x P(x, f(x))$,引入新的函元 $f$ 代替依赖于 $x$ 的 $y$
6 去除全称量词 Skolem 化后只剩全称量词,默认所有变量均受全称量词约束,可省略
7 合取分配 $A \lor (B \land C) \equiv (A \lor B) \land (A \lor C)$,拆成多个子句
8 拆分子句 合取连接的多个子句拆成独立的逻辑表达式
9 再次换名 不同子句间的变量名保持独立

九、消解策略与算法效率

9.1 消解策略

实际编程实现消解原理时需要考虑策略选择(每一步可能有多对表达式可消解):

策略 说明 特点
宽度优先(Breadth-First) 每一层尝试所有可能的消解对 完备但复杂度极高,不可用
支撑集策略(Set of Support) 消解对中至少一个来自”支撑集”(问题的否定或由其产生的子句) 缩小搜索空间
线性消解(Linear Resolution) 每次消解对中必有一个是上一步消解的结果 高效,是支撑集策略的特例
单元优先(Unit Preference) 优先选择只有一个谓词的单元子句进行消解(使析取项减少最快) 加速收敛

9.2 线性消解不完备

线性消解虽然高效,但不具备完备性(Completeness)——某些本可证明的命题用线性消解可能陷入无限循环。

不完备示例:集合 $\{P \lor Q, \neg P \lor Q, P \lor \neg Q, \neg P \lor \neg Q\}$ 本身不可满足(可消解出空子句),但线性消解会陷入无限循环($\neg Q, \neg P, Q, P, \neg Q, \dots$)。

9.3 Soundness 与 Completeness

  • 合理性(Soundness):推理算法推导出的所有结论都是正确的
  • 完备性(Completeness):所有可推导的正确结论,算法都能推导出来

十、一阶谓词逻辑的不可判定性

10.1 半可判定性

一阶谓词逻辑是半可判定的(Semi-decidable):

  • 如果待证命题与知识库不相容(逻辑蕴含成立)→ 算法一定会停机,告知结果
  • 如果待证命题与知识库相容(逻辑蕴含不成立)→ 算法可能永不停止

10.2 Herbrand 结构与无穷论域

只要逻辑系统中有:

  • 至少一个常元(如 $a$)
  • 至少一个函元(如 $f(x)$)

就可以产生无穷序列:$a, f(a), f(f(a)), f(f(f(a))), \dots$

这意味着论域是无穷的。在无穷论域上全称量词和存在量词的验证都需要遍历无穷多个体,因此无法停机。

10.3 语义树分析

逻辑表达式的可满足性问题可以用语义树(Semantic Tree)来分析:

  • 树的每条从根到叶的路径对应一种解释(对系统中谓词的真假规定)
  • 如果集合不可满足,树的每个分支都会在某处截断(矛盾出现,无需继续扩展)
  • 如果集合可满足,某些分支会因函元的无穷嵌套而永远扩展下去

10.4 与计算理论的关系

  • 逻辑推理的核心问题就是可满足性问题(SAT/Satisfiability)
  • SAT 问题是 NP 完全问题的”最高端”——所有 NP 完全问题(哈密尔顿圈、旅行商、背包等)都是 SAT 的演化版本
  • 命题逻辑的 SAT 是 NP 完全的(P 类),一阶谓词逻辑是不可判定的

10.5 逻辑系统的三分法

类别 代表 表达能力 计算复杂度
表达能力弱 命题逻辑 不能表示个体与集合的关系 P 类(近似线性)
表达能力极强 一阶谓词逻辑、高阶逻辑 可表示丰富的领域知识 不可判定
折中 描述逻辑的子集 有一定表达能力 可判定

其他逻辑系统:缺省逻辑(Default Logic,处理”鸟会飞但鸵鸟不会”这类带例外的知识)、模态逻辑(Modal Logic,引入”必然”和”可能”算子,在软件工程中用于程序验证)。


十一、霍恩子句与 Prolog

11.1 从一阶谓词逻辑到霍恩子句

为了让推理算法高效且可判定,必须在一阶谓词逻辑基础上做语法限制——每个逻辑表达式最多只有一个正文字(其余均为副文字),这就是霍恩子句(Horn Clause)。

霍恩子句的形式(析取范式视角):

\[\neg B_1 \lor \neg B_2 \lor \dots \lor \neg B_n \lor A\]

等价于蕴含形式:

\[B_1 \land B_2 \land \dots \land B_n \rightarrow A\]
  • 右边($A$)只有一个正文字 ← 这是霍恩子句的核心限制
  • 左边可以有多个条件

霍恩子句的高效之处:

  • 消解时只需找到一个正文字对应的副文字即可对消
  • 消去一个事实(无条件子句)→ 子目标直接减少
  • 消去一个规则 → 子目标可能增多(展开为规则的条件)

11.2 Prolog 语言基础

Prolog = Programming in Logic

Prolog 中霍恩子句的三种形式:

形式 Prolog 语法 逻辑含义
事实(Fact) A. 无条件成立的断言(只有正文字)
规则(Rule) A :- B1, B2, ..., Bn. $B_1 \land \dots \land B_n \rightarrow A$
目标(Goal) ?- G1, G2, ..., Gn. 将 $\neg G$ 放入系统,启动消解证明

语法对应

  • ,(逗号)= 合取 $\land$
  • ;(分号)= 析取 $\lor$
  • :- = 蕴含 $\leftarrow$(反向书写)
  • not = 否定 $\neg$

11.3 Prolog 的执行机制

Prolog 的推理过程与消解原理完全一致:

  1. 从目标出发,取第一个子目标
  2. 在知识库中寻找头部(正文字)与该子目标匹配的规则或事实
  3. 进行变量替换(Unification)使两者相同
  4. 消去该子目标,若匹配的是事实:子目标被消除;若匹配的是规则:子目标被替换为规则的条件部分
  5. 重复直到所有子目标被消去(成功)或无可匹配项(失败)

Prolog 采用深度优先搜索 + 回溯(Backtracking):

  • 按子句在程序中出现的顺序依次尝试匹配
  • 当一条路径失败时,回溯到上一个选择点尝试其他可能
  • 使用 Cut 运算符!)阻止对已匹配部分进行回溯

11.4 列表与模式匹配

Prolog 中列表的表示:

  • [a, b, c] — 普通列表
  • [H|T] — H 是头部(第一个元素),T 是尾部(剩余列表)
  • [] — 空列表
  • 列表可嵌套

Cut(|)匹配规则

  • 竖线前面只能匹配一个元素
  • 竖线后面可以匹配多个元素(包括零个)

11.5 例题:骑士巡游问题

在 3×3 棋盘上,马按国际象棋走法(日字形),求从格子 1 到格子 3 的路径。

Prolog 解法只需:

  1. 枚举所有一步可到达的事实(如 move(1,6). move(1,8). ...
  2. 两条规则:
    • 到达目标则结束
    • 否则找中间路径(避免重复访问),继续探索

短短几行代码即可解决——这正是 Prolog 的强大之处:只需写知识和规则,推理引擎自动完成搜索。

11.6 例题:农夫过河问题

农夫带狼、羊、菜过河,每次只能带一个。Prolog 建模:

  • 用状态向量 (F, W, G, C) 表示各方在西岸(0)还是东岸(1)
  • 定义合法的一步转移(move)
  • 用路径搜索规则寻找从初始状态到目标状态的路径

11.7 Prolog 编程注意事项

Prolog 编写规则时必须注意顺序:

  1. 简单规则写在前面,复杂规则写在后面 — 否则推理时间显著增加
  2. 简单条件写在前面,复杂条件写在后面 — 否则可能永不停止

永不停机示例:若将递归规则 ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y) 写在基础规则 ancestor(X,Y) :- parent(X,Y) 之前,且复杂条件在前面,Prolog 每次都会先尝试递归,导致无限展开。


十二、总结:符号主义自动推理的发展脉络

人工智能的第三种实现思路——符号主义,旨在将人类知识编码为形式化系统,使系统能自动推理。

发展脉络

  1. 最早关注命题逻辑 → 表达能力太弱(不能区分个体和集合)
  2. 转向一阶谓词逻辑 → 引入变量、全称量词、存在量词
  3. 发现推理的核心本质是逻辑表达式的可满足性问题
  4. 理论证明一阶谓词逻辑不可判定(半可判定)
  5. 退而求其次,限制表达能力 → 霍恩子句(每条最多一个正文字)
  6. 基于霍恩子句发展出 Prolog 编程语言

Prolog 的核心(反向推理/目标驱动):

  • 从目标出发 → 找证据 → 匹配消去 → 直到空(成功)
  • 消去事实:子目标减少;消去规则:子目标可能增加
  • 内置回溯机制

Prolog 推导的结果具有严谨的逻辑学基础保证其正确性,这与深度学习在 AI for Science(如数学证明)中只能提供灵感、存在严重幻觉形成对比。

Prolog 曾被日本指定为下一代 AI 的主要编程语言,并开发了专门的 Prolog 硬件推理机,可见符号主义推理在 AI 历史上曾受到的重视程度。