Skip to content

命题逻辑

命题逻辑(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

根据真值表的结果,我们将公式分为三类:

  1. 永真式(Valid / Tautology):在所有模型下都为真(全是 T)。例如:\(A \vee \neg A\)(排中律,无论 A 是真是假,结果恒真)。
  2. 可满足式(Satisfiable):在某些模型下为真,在某些下为假(有 T 有 F)。例如:\(A \wedge B\)(当 A、B 都为真时成立)。
  3. 矛盾式(Unsatisfiable / Contradiction):在所有模型下都为假(全是 F)。例如:\(A \wedge \neg A\)(A 不可能既真又假,没有任何模型能让它成立)。

逻辑等价与化简规则

逻辑等价性 (Logical Equivalence)

如果两个逻辑公式在所有可能的真值组合(Truth assignments)下结果都完全相同,它们就是逻辑等价的,用符号 \(\equiv\)\(\iff\) 表示。我们可以利用等价关系来操作和简化复杂的逻辑公式。

核心化简规则(转化为 CNF 的必备工具)

在实际解题中,最常用以下几个规则:

① 蕴含消除(Implication Elimination)

\[ A \leftrightarrow B \equiv (A \rightarrow B) \wedge (B \rightarrow A) \]
\[ A \rightarrow B \equiv \neg A \vee B \]

重要性:这是将逻辑式转化为 CNF 的第一步,能将所有箭头去掉,只留下 \(\neg\)\(\vee\)\(\wedge\)

② 德摩根定律(De Morgan's Laws)

\[ \neg(A \wedge B) \equiv \neg A \vee \neg B \]
\[ \neg(A \vee B) \equiv \neg A \wedge \neg B \]

否定一个复合命题时,否定每个项并交换析取与合取算子。这是处理"或"与"且"之间否定变换的核心工具。

③ 分配律(Distributive Laws)

\[ A \vee (B \wedge C) \equiv (A \vee B) \wedge (A \vee C) \]
\[ A \wedge (B \vee C) \equiv (A \wedge B) \vee (A \wedge C) \]

类似于数学里的乘法分配律,是整理公式结构、将其转化为 CNF 的关键步骤。

完整逻辑恒等式列表

以下是命题逻辑中所有常用的逻辑等价式:

  1. 交换律(Commutative)\(p \vee q \equiv q \vee p\)\(p \wedge q \equiv q \wedge p\) 说明:逻辑算子的顺序不影响结果。
  2. 结合律(Associative)\((p \vee q) \vee r \equiv p \vee (q \vee r)\)\((p \wedge q) \wedge r \equiv p \wedge (q \wedge r)\) 说明:多个相同算子相连时,结合顺序不影响结果。
  3. 分配律(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)\)
  4. 幂等律(Idempotent)\(p \vee p \equiv p\)\(p \wedge p \equiv p\) 说明:一个命题与自身析取或合取,结果不变。
  5. 德摩根定律(De Morgan's)\(\neg(p \vee q) \equiv \neg p \wedge \neg q\)\(\neg(p \wedge q) \equiv \neg p \vee \neg q\)
  6. 排中律(Excluded Middle)\(p \vee \neg p \equiv T\)\(p \wedge \neg p \equiv F\) 说明:一个命题与其否定必有一个为真(永真),不能同时为真(永假)。
  7. 单位律(Identity)\(p \vee F \equiv p\)\(p \wedge T \equiv p\) 说明:命题与恒假项析取,或与恒真项合取,结果不变。
  8. 支配律(Domination)\(p \vee T \equiv T\)\(p \wedge F \equiv F\)
  9. 逆否等价(Contrapositive)\(p \Rightarrow q \equiv \neg q \Rightarrow \neg p\) 说明:原命题与其逆否命题在逻辑上等价。
  10. 蕴含转析取(Implication as Disjunction)\(p \Rightarrow q \equiv \neg p \vee q\)
  11. 蕴含式的否定(Negation of Implication)\(\neg(p \Rightarrow q) \equiv p \wedge \neg q\) 说明:蕴含式的否定等价于前件为真且后件为假。
  12. 双重否定律(Double Negation)\(\neg(\neg p) \equiv p\)

基于知识的智能体 (Knowledge-Based Agents)

基于知识的智能体(Knowledge-Based Agents,KB 智能体) 是一种利用逻辑推理来做决策的 AI 系统。它的"大脑"是一个知识库(Knowledge Base, KB),由许多句子(sentences)组成,这些句子代表对世界的断言(assertions)或已知事实。

推理:从已知到未知

Inference(推理)是从已有的句子中推导出新句子的过程。

1770852779802

经典三段论示例:

  • 已知规则(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 教授会死"。

蕴含的两种等价定义:

  1. 基于真值的定义:

    $$ 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\) 的黑暗洞穴。

  • 目标:找到金子,然后活着出来。
  • 危险

    1. Wumpus(怪兽):碰到就被吃掉。
    2. Pit(深坑,符号 \(P\):掉进去就摔死。 * 传感器(线索):机器人看不到周围,只能靠"感觉":

    3. Breeze(微风,符号 \(B\):如果你站在深坑的隔壁格子里,会感觉到微风。

    4. Stench(臭气):如果你在怪兽旁边,会闻到臭气。

1770855635327

机器人必须根据感知到的线索,通过逻辑推理判断哪些格子安全、哪些格子有危险——这正是命题逻辑推理的用武之地。

朴素推理算法:模型检测 (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)

  1. 想证明 \(KB \models \alpha\),不需要直接证明 \(\alpha\) 为真。
  2. 假设 \(\alpha\) 为假(加入 \(\neg \alpha\)),看 \(KB \wedge \neg \alpha\) 是否产生矛盾(即 Unsatisfiable)。
  3. 如果产生矛盾(推出空集 \(\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\)
\[ ((\neg p \lor q) \lor r) \wedge ((\neg p \lor q) \lor s) \]

这就是 CNF 形式。

归结推理规则 (Resolution Inference Rule)

这是整个归结算法的"引擎"。

互补文字 (Complementary Literals)

互补文字指一对互为否定的文字,例如 \(P\)\(\neg P\)

归结规则

如果两个子句分别包含互补文字,可以将互补的部分消去,把两个子句的剩余文字合并成一个新子句:

\[ \frac{(P \vee A) \quad (\neg P \vee B)}{A \vee B} \]

直觉解释: 因为 \(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\) 是互补文字,则归结后得到:

\[ (l_1 \vee \cdots \vee l_{i-1} \vee l_{i+1} \vee \cdots \vee l_k \vee m_1 \vee \cdots \vee m_{j-1} \vee m_{j+1} \vee \cdots \vee m_n) \]

简言之:将两个子句中的互补文字消去,把剩余所有文字合并成一个新子句。

归结算法完整例题

任务:

已知知识库 KB:

  1. \((R \vee Q) \rightarrow \neg P\)
  2. \(S \vee P\)
  3. \(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\)
  • 当前所有子句:
    1. \(\neg R \vee \neg P\)
    2. \(\neg Q \vee \neg P\)
    3. \(S \vee P\)
    4. \(Q\)
    5. \(\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)或无法再推导出新知识为止。

算法步骤:

  1. 初始化(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) 的推理方式。它不关心所有已知事实,只关注那些能帮助证明目标的事实,方向是从结论倒推回已知条件。

算法步骤(递归的"图搜索"):

  1. 设定目标:假设要证明 \(Q\) 是真的。
  2. 查找规则:在 KB 中找以 \(Q\) 作为结论(Head) 的规则,如 \(P \Rightarrow Q\)
  3. 生成子目标(Sub-goals):为让 \(Q\) 成立,必须证明规则的前提 \(P\) 成立——任务变成:证明 \(P\)
  4. 递归重复:继续为 \(P\) 找规则,直到找到最底层的已知事实(Ground Truth) 为止。

两种算法对比

特性 前向链接(Forward Chaining) 后向链接(Backwards Chaining)
驱动方式 数据驱动(Data-driven) 目标驱动(Goal-directed)
出发点 从已知事实(Facts)开始 从想要证明的结论(Query)开始
效率 可能推导出大量无用结论 只查看相关事实,避免浪费计算资源
适用场景 想要挖掘所有隐含信息时 想要验证某个特定假设是否成立时

总结:只要我们限制逻辑规则的形式(只用确切子句),就能把原本复杂的逻辑推理变成极其快速的线性时间算法。


评论 #