命题逻辑
命题逻辑(Propositional Logic),也称为语句逻辑(Sentential Logic),是逻辑学和数学中最基础的一个分支。它研究的是命题(Propositions)以及如何通过逻辑连接词(Connectives)将简单命题组合成复杂命题,并分析这些命题的真假值(Truth Values)。
基础概念
命题、语法与语义
命题 (Proposition)
命题是一个可以判断真假的陈述句。在命题逻辑中,我们通常用大写字母(如 \(P, Q, R\))来代表一个命题。
- 是命题的例子:
- "北京是中国的首都。"(真命题,True)
- "1 + 1 = 3。"(假命题,False)
- "今天在下雨。"(可能真可能假,但必然居其一)
- 不是命题的例子:
- "你好吗?"(疑问句,无真假可言)
- "快跑!"(命令句,无真假可言)
- "x + 1 = 2"(除非指定 \(x\) 的值,否则无法判断真假——这属于谓词逻辑的范畴)
语法 (Syntax)
语法规定了什么样的句子结构是合法的(即"形式良好",Well-formed)。它只关心符号的排列规则,不关心含义。
例如,在代数中:
- \(x + y = 4\) 是合法的(符合语法规则)。
- \(x4y+=\) 是非法的(不符合语法规则,就像乱码)。
在命题逻辑中,语法使用 \(P_1, P_2, \dots\) 等符号来代表基本命题(例如:"今天是星期一")。如果 \(S\) 是一个句子,那么 \(\neg S\) 也是一个句子(\(\neg\) 读作 "not")。
语义 (Semantics)
语义定义句子的真值(Truth Value),即赋予符号意义,判断句子是"真"还是"假"。一个句子的真假取决于我们所处的"世界"或"上下文"(即变量的具体取值)。
例子: 句子 \(s: x + y = 4\)
- 在 \(x=3, y=1\) 的世界里,它是真(True)的。
- 在 \(x=1, y=1\) 的世界里,它是假(False)的。
在命题逻辑中,\(\neg S\) 为真,当且仅当(iff)\(S\) 为假:
- 当 \(P\) 是 T 时,\(\neg P\) 是 F。
- 当 \(P\) 是 F 时,\(\neg P\) 是 T。
逻辑连接词 (Logical Connectives)
命题逻辑不关心命题内部的细节(比如"谁"做了"什么"),它只关心命题之间是如何连接的。最常用的逻辑连接词包括:
-
否定 (Negation, NOT)
- 符号:\(\neg\) 或 \(\sim\)
- 含义:如果 \(P\) 是真,\(\neg P\) 就是假。
- 例子:\(P\) = "在下雨",\(\neg P\) = "没在下雨"。
- 合取 (Conjunction, AND)
- 符号:\(\wedge\)
- 含义:只有当 \(P\) 和 \(Q\) 都为真时,\(P \wedge Q\) 才为真。
- 例子:"我在吃饭 并且 我在看电视"。
- 析取 (Disjunction, OR)
- 符号:\(\vee\)
- 含义:只要 \(P\) 或 \(Q\) 其中一个为真(或都为真),\(P \vee Q\) 就为真。
- 例子:"今天是周六 或者 今天是周日"。
- 蕴含 (Implication, IF...THEN)
- 符号:\(\rightarrow\) 或 \(\Rightarrow\)
- 含义:\(S_1 \Rightarrow S_2\) 为真,当且仅当 \(S_1\) 为假 或者 \(S_2\) 为真。逻辑蕴涵只有一种情况为假:"前提为真,但结论为假"(T \(\Rightarrow\) F)。
- 箭头左边叫做前件(Antecedent),相当于条件;箭头右边叫做后件(Consequent),相当于结论。只要前件为 False,整个蕴含式无法被证伪,直接判定为 True;只有当前件为 True 而后件为 False 时,蕴含式才为 False。
- ※ 转化为 CNF 时,可将 \(A \rightarrow B\) 等价改写为 \(\neg A \vee B\)。
- 双条件 (Biconditional, IF AND ONLY IF)
- 符号:\(\leftrightarrow\) 或 \(\Leftrightarrow\)
- 含义:当且仅当 \(P\) 和 \(Q\) 的真假值相同时,\(P \leftrightarrow Q\) 为真。等价于 \((P \Rightarrow Q)\wedge(Q \Rightarrow P)\) 同时成立。
常见符号速查
| 符号 | 名称 | 读法 |
|---|---|---|
| \(\neg\) | 否定 | Not(非) |
| \(\wedge\) | 合取 | And(且) |
| \(\vee\) | 析取 | Or(或) |
| \(\rightarrow\) | 蕴含 | Implies(蕴含) |
| \(\leftrightarrow\) | 双条件 | If and only if(当且仅当) |
真值表与公式分类
真值表(Truth Table)列出一个命题在所有可能情况下的真假结果。
例如,\(P \wedge Q\)(P 且 Q)的真值表:
| P | Q | P ∧ Q |
|---|---|---|
| T | T | T |
| T | F | F |
| F | T | F |
| F | F | F |
根据真值表的结果,我们将公式分为三类:
- 永真式(Valid / Tautology):在所有模型下都为真(全是 T)。例如:\(A \vee \neg A\)(排中律,无论 A 是真是假,结果恒真)。
- 可满足式(Satisfiable):在某些模型下为真,在某些下为假(有 T 有 F)。例如:\(A \wedge B\)(当 A、B 都为真时成立)。
- 矛盾式(Unsatisfiable / Contradiction):在所有模型下都为假(全是 F)。例如:\(A \wedge \neg A\)(A 不可能既真又假,没有任何模型能让它成立)。
逻辑等价与化简规则
逻辑等价性 (Logical Equivalence)
如果两个逻辑公式在所有可能的真值组合(Truth assignments)下结果都完全相同,它们就是逻辑等价的,用符号 \(\equiv\) 或 \(\iff\) 表示。我们可以利用等价关系来操作和简化复杂的逻辑公式。
核心化简规则(转化为 CNF 的必备工具)
在实际解题中,最常用以下几个规则:
① 蕴含消除(Implication Elimination)
重要性:这是将逻辑式转化为 CNF 的第一步,能将所有箭头去掉,只留下 \(\neg\)、\(\vee\)、\(\wedge\)。
② 德摩根定律(De Morgan's Laws)
否定一个复合命题时,否定每个项并交换析取与合取算子。这是处理"或"与"且"之间否定变换的核心工具。
③ 分配律(Distributive Laws)
类似于数学里的乘法分配律,是整理公式结构、将其转化为 CNF 的关键步骤。
完整逻辑恒等式列表
以下是命题逻辑中所有常用的逻辑等价式:
- 交换律(Commutative):\(p \vee q \equiv q \vee p\),\(p \wedge q \equiv q \wedge p\) 说明:逻辑算子的顺序不影响结果。
- 结合律(Associative):\((p \vee q) \vee r \equiv p \vee (q \vee r)\),\((p \wedge q) \wedge r \equiv p \wedge (q \wedge r)\) 说明:多个相同算子相连时,结合顺序不影响结果。
- 分配律(Distributive):\(p \vee (q \wedge r) \equiv (p \vee q) \wedge (p \vee r)\),\(p \wedge (q \vee r) \equiv (p \wedge q) \vee (p \wedge r)\)
- 幂等律(Idempotent):\(p \vee p \equiv p\),\(p \wedge p \equiv p\) 说明:一个命题与自身析取或合取,结果不变。
- 德摩根定律(De Morgan's):\(\neg(p \vee q) \equiv \neg p \wedge \neg q\),\(\neg(p \wedge q) \equiv \neg p \vee \neg q\)
- 排中律(Excluded Middle):\(p \vee \neg p \equiv T\),\(p \wedge \neg p \equiv F\) 说明:一个命题与其否定必有一个为真(永真),不能同时为真(永假)。
- 单位律(Identity):\(p \vee F \equiv p\),\(p \wedge T \equiv p\) 说明:命题与恒假项析取,或与恒真项合取,结果不变。
- 支配律(Domination):\(p \vee T \equiv T\),\(p \wedge F \equiv F\)
- 逆否等价(Contrapositive):\(p \Rightarrow q \equiv \neg q \Rightarrow \neg p\) 说明:原命题与其逆否命题在逻辑上等价。
- 蕴含转析取(Implication as Disjunction):\(p \Rightarrow q \equiv \neg p \vee q\)
- 蕴含式的否定(Negation of Implication):\(\neg(p \Rightarrow q) \equiv p \wedge \neg q\) 说明:蕴含式的否定等价于前件为真且后件为假。
- 双重否定律(Double Negation):\(\neg(\neg p) \equiv p\)
基于知识的智能体 (Knowledge-Based Agents)
基于知识的智能体(Knowledge-Based Agents,KB 智能体) 是一种利用逻辑推理来做决策的 AI 系统。它的"大脑"是一个知识库(Knowledge Base, KB),由许多句子(sentences)组成,这些句子代表对世界的断言(assertions)或已知事实。
推理:从已知到未知
Inference(推理)是从已有的句子中推导出新句子的过程。

经典三段论示例:
- 已知规则(KB):"All humans are mortal"(所有人类都会死)。
- 新事实:"Prof. S is a human"(S 教授是人类)。
- 推理过程:逻辑引擎结合两条信息。
- 结论:"Prof. S is mortal"(S 教授会死)——这个结论在 KB 中原本没有被显式写出。
模型与蕴含
模型 (Model)
模型是一个具体的"可能世界"或"环境"。在这个环境中,所有变量都有确定的取值,因此每个句子的真假都可以被判定。如果句子 \(s\) 在模型 \(m\) 中为真,我们说 \(m\) 满足(satisfies)\(s\)。
例子: 句子 \(s: x + y = 4\)(在自然数集上)
- 模型 \(\{x=3, y=1\}\):\(3+1=4\),满足 \(s\)。
- 模型 \(\{x=1, y=1\}\):\(1+1 \neq 4\),不满足 \(s\)。
符号 \(M(s)\) 表示所有满足句子 \(s\) 的模型的集合。对于 \(x+y=4\),\(M(s)\) 包含 \(\{x=0, y=4\}\)、\(\{x=1, y=3\}\)、\(\{x=2, y=2\}\) 等等。
蕴含 Entailment(\(\vDash\))
- \(KB \vDash \alpha\) 读作"KB 蕴含 \(\alpha\)",意思是"\(\alpha\) 是 KB 的逻辑推论"。
- 直观含义:如果你知道"所有人都会死"且"S 教授是人",那么逻辑上必然得出"S 教授会死"。
蕴含的两种等价定义:
-
基于真值的定义:
$$ KB \vDash \alpha \iff \alpha \text{ is true in every situation in which } KB \text{ is true} $$
在所有让知识库 \(KB\) 为真的"世界"里,\(\alpha\) 也必然为真。不存在"\(KB\) 为真但 \(\alpha\) 为假"的反例。 2. 基于模型的定义(集合论视角):
$$ KB \vDash \alpha \iff M(KB) \subseteq M(\alpha) $$
- \(M(KB)\) 是所有让知识库为真的模型集合。
- \(M(\alpha)\) 是所有让 \(\alpha\) 为真的模型集合。
- 如果 \(M(KB)\) 被包含在 \(M(\alpha)\) 中,蕴含成立。
- 通俗理解:只要你处于一个 KB 成立的世界里,你也一定处于 \(\alpha\) 成立的圈子里。
推理算法的质量标准
\(KB \vdash_P \alpha\) 表示:利用推理过程 \(P\),可以从知识库 \(KB\) 中推导出语句 \(\alpha\)。
- \(KB\)(Knowledge Base):已掌握的所有信息、规则和事实。
- \(\alpha\)(Alpha):你想验证的目标结论。
- \(P\)(Procedure):具体的推理算法。同样的 KB,不同的算法 \(P\) 会有不同的效率。
- \(\vdash\)(Turnstile):读作"derives"(推导出)。
衡量推理过程 \(P\) 质量的两个标准:
-
可靠性(Soundness)
- 定义:\(P\) 推出的任何语句 \(\alpha\) 都是 \(KB\) 逻辑蕴含的(推出的结论保证为真)。
- 公式:\(KB \vdash_P \alpha \implies KB \models \alpha\)
- 通俗理解:不做假阳性,推出来的都是对的。
- 完备性(Completeness)
- 定义:\(P\) 能够推出 \(KB\) 蕴含的所有语句(不遗漏任何真结论)。
- 公式:\(KB \models \alpha \implies KB \vdash_P \alpha\)
- 通俗理解:不做假阴性,所有对的都能被推出来。
经典案例:Wumpus World
Wumpus World 是 AI 中一个经典的寻宝游戏,非常适合用来展示逻辑推理的力量。
游戏设定:一个探险家(AI 机器人)被扔进 \(4 \times 4\) 的黑暗洞穴。
- 目标:找到金子,然后活着出来。
-
危险:
- Wumpus(怪兽):碰到就被吃掉。
-
Pit(深坑,符号 \(P\)):掉进去就摔死。 * 传感器(线索):机器人看不到周围,只能靠"感觉":
-
Breeze(微风,符号 \(B\)):如果你站在深坑的隔壁格子里,会感觉到微风。
- Stench(臭气):如果你在怪兽旁边,会闻到臭气。

机器人必须根据感知到的线索,通过逻辑推理判断哪些格子安全、哪些格子有危险——这正是命题逻辑推理的用武之地。
朴素推理算法:模型检测 (Model Checking)
模型检测是最直接的推理方法:枚举所有可能的"世界",找出哪些世界让 KB 成立,再检查结论在这些世界里是否也成立。
工作原理:
- 枚举所有命题符号的可能真值组合,构建真值表。
- 找出使 KB 中所有语句都为真的行(即"有效模型")。
- 检查结论 \(\alpha\) 在这些行中是否也全为真。
推导示例(Wumpus World):
- 确定无坑:在所有有效模型里,如果 \(P_{1,2}\) 全为 False,则可推出该位置没有坑(\(\neg P_{1,2}\))。
- 确定有坑范围:如果所有有效模型里 \(P_{2,2}\) 或 \(P_{3,1}\) 总有一个为 True,则推出 \(P_{2,2} \lor P_{3,1}\)(两个位置中必有一个有坑)。
性能分析:
| 理论上 | 可靠(Sound)且完备(Complete) |
| 实际上 | 计算上极度低效 |
| 时间复杂度 | \(O(2^n)\)(\(n\) 为命题符号数量,指数级爆炸) |
计算成本示例:
- 10 个符号 \(\approx 0.000001\) 秒
- 50 个符号 \(\approx 13\) 天
- 100 个符号 \(\approx 40.2\) 万亿年(\(40.2 \times 10^{12}\) years)
结论:简单的模型检测无法处理复杂问题。我们需要更聪明的推理算法——这就引出了接下来的归结(Resolution)。
Resolution(归结推理)
归结原理(Resolution) 是命题逻辑中用于自动证明定理的重要方法。相比于模型检测(穷举真值表),归结法效率更高,是一种通用的推理规则。
归结基于反证法(Proof by Contradiction):
- 想证明 \(KB \models \alpha\),不需要直接证明 \(\alpha\) 为真。
- 假设 \(\alpha\) 为假(加入 \(\neg \alpha\)),看 \(KB \wedge \neg \alpha\) 是否产生矛盾(即 Unsatisfiable)。
- 如果产生矛盾(推出空集 \(\emptyset\)),则假设不成立,\(\alpha\) 必然为真。
CNF (合取范式)
归结算法要求所有公式必须先转换为合取范式(CNF)。
CNF 的结构:
- 文字(Literal):\(P\) 或 \(\neg P\)(一个变量或其否定)。
- 子句(Clause):文字的析取(OR),例如 \((A \vee B \vee \neg C)\)。
- CNF:子句的合取(AND),例如 \((A \vee B) \wedge (C \vee \neg D)\)。
简单说:CNF = AND of ORs(一堆括号用 \(\wedge\) 连接,括号里面全是 \(\vee\) 连接的文字)。
例如:\((\neg P_1 \vee P_2) \wedge (P_3 \vee P_4 \vee \neg P_5) \wedge P_6\)
为什么需要 CNF?
当公式是 CNF 形式时,可以以最快的速度发现逻辑矛盾。例如,给定子句 \((A \lor B)\) 和子句 \((\neg A \lor C)\):
- \(A\) 要么真要么假。
- 若 \(A\) 真:第二个子句要求 \(C\) 为真。
- 若 \(A\) 假:第一个子句要求 \(B\) 为真。
- 因此直接得出 \((B \lor C)\),无需逐行穷举真值表。
任何命题逻辑公式都可以转化为 CNF。
如何将任意公式转化为 CNF(三步骤)
以 \((p \to q) \lor (r \wedge s)\) 为例:
第一步:消除蕴含和双条件
CNF 只能包含 \(\neg\)、\(\lor\)、\(\wedge\),所以先用蕴含等价律消掉箭头:
- 规则:\(A \to B \equiv \neg A \lor B\)
- 操作:将 \((p \to q)\) 替换为 \((\neg p \lor q)\)。
- 结果:\((\neg p \lor q) \lor (r \wedge s)\)
第二步:内移否定符号
如果括号外面有 \(\neg\)(如 \(\neg(p \lor q)\)),用德摩根定律把它移进去。
- 本题中 \(\neg\) 只在 \(p\) 前面,不需要移动。
- 结果:依然是 \((\neg p \lor q) \lor (r \wedge s)\)
第三步:应用分配律(关键步骤)
目标是让 \(\wedge\) 跑到外层、让 \(\lor\) 缩进括号里。
- 规则:\(A \lor (B \wedge C) \equiv (A \lor B) \wedge (A \lor C)\)
- 将 \((\neg p \lor q)\) 看作整体 \(A\),\(r\) 看作 \(B\),\(s\) 看作 \(C\):
这就是 CNF 形式。
归结推理规则 (Resolution Inference Rule)
这是整个归结算法的"引擎"。
互补文字 (Complementary Literals)
互补文字指一对互为否定的文字,例如 \(P\) 和 \(\neg P\)。
归结规则
如果两个子句分别包含互补文字,可以将互补的部分消去,把两个子句的剩余文字合并成一个新子句:
直觉解释: 因为 \(P\) 要么真要么假:
- 若 \(P\) 为真:\(\neg P\) 为假,第二个子句成立要求 \(B\) 必须为真。
- 若 \(P\) 为假:第一个子句成立要求 \(A\) 必须为真。
- 因此,\(A\) 和 \(B\) 中至少有一个为真,即 \((A \vee B)\)。
用真值表理解归结:从两变量到多变量
例 1:两个变量的情形
已知两个子句:\((P_{1,3} \vee P_{2,2})\) 和 \((\neg P_{2,2})\)。
\(P_{2,2}\) 和 \(\neg P_{2,2}\) 是互补文字。列出所有可能的世界:
| \(P_{1,3}\) | \(P_{2,2}\) | \(P_{1,3} \vee P_{2,2}\) | \(\neg P_{2,2}\) | 两个前提都为真? |
|---|---|---|---|---|
| F | F | F | T | ✗(子句1为假) |
| F | T | T | F | ✗(子句2为假) |
| T | F | T | T | ✓ |
| T | T | T | F | ✗(子句2为假) |
在两个前提都为真的所有世界中,只有第三行满足条件,此时 \(P_{1,3} = T\)。
因此可以归结出:\(P_{1,3}\)。
例 2:三个变量的情形
已知两个子句:\((P_{1,1} \vee P_{3,3} \vee P_{2,4})\) 和 \((\neg P_{2,4})\)。
\(P_{2,4}\) 和 \(\neg P_{2,4}\) 是互补文字。子句2(\(\neg P_{2,4}\))要求 \(P_{2,4} = F\)。在 \(P_{2,4}=F\) 的条件下列出所有可能世界:
| \(P_{1,1}\) | \(P_{3,3}\) | \(P_{2,4}\) | 子句1 | 子句2 | 两个前提都为真? | \(P_{1,1} \vee P_{3,3}\) |
|---|---|---|---|---|---|---|
| F | F | F | F | T | ✗(子句1为假) | F |
| F | T | F | T | T | ✓ | T |
| T | F | F | T | T | ✓ | T |
| T | T | F | T | T | ✓ | T |
在两个前提都为真的所有世界中(✓行),无法单独确定 \(P_{1,1}\) 或 \(P_{3,3}\) 的值(可能一个真,也可能两个都真),但可以确定 \((P_{1,1} \vee P_{3,3})\) 在所有这些世界里必然为真。
因此可以归结出:\((P_{1,1} \vee P_{3,3})\)。
一般形式
若子句 \(l_1 \vee \cdots \vee l_i \vee \cdots \vee l_k\) 和子句 \(m_1 \vee \cdots \vee m_j \vee \cdots \vee m_n\) 中,\(l_i\) 和 \(m_j\) 是互补文字,则归结后得到:
简言之:将两个子句中的互补文字消去,把剩余所有文字合并成一个新子句。
归结算法完整例题
任务:
已知知识库 KB:
- \((R \vee Q) \rightarrow \neg P\)
- \(S \vee P\)
- \(Q\)
求证:\(S\)
详细步骤:
第一步:将 KB 转化为 CNF
- \((R \vee Q) \rightarrow \neg P\),利用蕴含消除变成 \(\neg(R \vee Q) \vee \neg P\),再用德摩根定律变成 \((\neg R \wedge \neg Q) \vee \neg P\),最后用分配律展开得 \((\neg R \vee \neg P) \wedge (\neg Q \vee \neg P)\)。
- 子句集:\(\{\neg R \vee \neg P,\; \neg Q \vee \neg P,\; S \vee P,\; Q\}\)
第二步:加入目标的否定
- 要证 \(S\),所以加入假设 \(\neg S\)。
- 当前所有子句:
- \(\neg R \vee \neg P\)
- \(\neg Q \vee \neg P\)
- \(S \vee P\)
- \(Q\)
- \(\neg S\)(来自目标的否定)
第三步:执行归结
- 子句 3(\(S \vee P\))和子句 5(\(\neg S\))归结 → 消掉 \(S\),剩下 \(P\)。
- 子句 2(\(\neg Q \vee \neg P\))和子句 4(\(Q\))归结 → 消掉 \(Q\),剩下 \(\neg P\)。
- 新结论 \(P\) 和 \(\neg P\) 归结 → 产生空集 \(\emptyset\)。
第四步:结论
- 推出了空集(逻辑矛盾),说明假设 \(\neg S\) 不成立。
- 因此 \(S\) 是正确的,得证 \(KB \models S\)。
启发式策略
优先尝试归结那些源自"目标否定"的子句。这称为"支持集策略"(Set of Support),能让推理更有方向性,避免漫无目的地生成大量无用子句。
Modus Ponens 与链接推理
归结虽然通用,但当知识库中只包含确切子句(Definite Clauses)或霍恩子句(Horn Clauses)时,我们可以反复应用肯定前件(Modus Ponens)进行推理。这种方式在线性时间 \(O(n)\) 内运行,可靠且完备,比归结法更快。
确切子句与霍恩子句
为了实现快速推理,知识库的规则必须遵循特定格式:
-
确切子句(Definite Clauses):
\[ P_1 \land P_2 \land \dots \land P_n \Rightarrow C \]如果前提中的所有条件 \(P\) 都为真,那么结论 \(C\) 也为真。
例子:如果下雨 \(\land\) 没带伞 \(\Rightarrow\) 会淋湿。 * 霍恩子句(Horn Clauses):确切子句的"放松版",规定一个子句中最多只有一个正文字(positive literal)。所有确切子句都是霍恩子句。
为什么要限制形式?
如果知识库只包含这些简单规则,就可以反复使用肯定前件(Modus Ponens) 进行推理,这种推理可靠且完备,并且运行在线性时间内——远快于归结法的指数级复杂度。
前向链接 (Forward Chaining)
前向链接是一种数据驱动(Data-driven)的推理方式。它从已知事实出发,一步步触发规则,直到推导出目标(Query)或无法再推导出新知识为止。
算法步骤:
-
初始化(Setup)
- Count(计数器):对每条规则,计算还有多少前提尚未满足。例如规则 \(A \land B \Rightarrow L\),初始 Count = 2。
- Queue(队列):把所有已知为真的事实放入队列。初始已知事实:\(A\) 和 \(B\)。 2. 触发与传播(Fire & Propagate)
- 从队列中取出一个事实(如 \(A\))。
- 找到所有前提中包含 \(A\) 的规则,把这些规则的 Count 减 1(意思是:这条规则又有一个条件被满足了)。 3. 推导新事实(Inference)
- 若某规则的 Count 变为 0,说明所有前提都满足了。
- 根据肯定前件,该规则的结论(Head)必定为真——将它加入队列。 4. 循环(Repeat),直到找到目标或队列为空:
- 已知 \(A, B\) → 满足 \(A \land B \Rightarrow L\),推出 \(L\)。
- 有了 \(L\),满足 \(B \land L \Rightarrow M\),推出 \(M\)。
- 随着 \(M\) 的加入,进一步推出 \(P\)。
- 知道了 \(P\),满足 \(P \Rightarrow Q\),最终推出目标 \(Q\)。 5. 结束:找到目标返回 SUCCESS;队列空了仍未找到则说明推导不出。
性质:
- 可靠(Sound)且完备(Complete)。
- 优点:能挖掘出所有隐含知识。
- 缺点:可能推导出大量与当前目标无关的结论——如果有一个特定目标,用后向链接更高效。
后向链接 (Backwards Chaining)
后向链接是一种目标驱动(Goal-directed) 的推理方式。它不关心所有已知事实,只关注那些能帮助证明目标的事实,方向是从结论倒推回已知条件。
算法步骤(递归的"图搜索"):
- 设定目标:假设要证明 \(Q\) 是真的。
- 查找规则:在 KB 中找以 \(Q\) 作为结论(Head) 的规则,如 \(P \Rightarrow Q\)。
- 生成子目标(Sub-goals):为让 \(Q\) 成立,必须证明规则的前提 \(P\) 成立——任务变成:证明 \(P\)。
- 递归重复:继续为 \(P\) 找规则,直到找到最底层的已知事实(Ground Truth) 为止。
两种算法对比
| 特性 | 前向链接(Forward Chaining) | 后向链接(Backwards Chaining) |
|---|---|---|
| 驱动方式 | 数据驱动(Data-driven) | 目标驱动(Goal-directed) |
| 出发点 | 从已知事实(Facts)开始 | 从想要证明的结论(Query)开始 |
| 效率 | 可能推导出大量无用结论 | 只查看相关事实,避免浪费计算资源 |
| 适用场景 | 想要挖掘所有隐含信息时 | 想要验证某个特定假设是否成立时 |
总结:只要我们限制逻辑规则的形式(只用确切子句),就能把原本复杂的逻辑推理变成极其快速的线性时间算法。