第09章 一阶逻辑推理

摘要:本章系统阐述一阶逻辑(FOL)推理的核心理论与算法,核心思想是提升(lifting)——通过合一(unification)在变量层面执行推理,避免命题化带来的组合爆炸。主要内容包括:(1)基础概念:替换、全称/存在实例化、命题化与Herbrand定理;(2)核心算法:合一算法、前向链接(数据驱动)、后向链接(目标驱动)及归结(反演完备);(3)效率优化:Rete网络、表格逻辑编程、归结策略;(4)延伸讨论:合一与注意力机制对比、神经引导定理证明、AI对齐中不可判定性的启示。关键结论:FOL推理是半可判定的,需在表达力、完备性、效率间权衡;Datalog(无函数符号的定子句)落在工业应用的"甜点"上。

对应 Artificial Intelligence: A Modern Approach, 4th Edition 第 9 章 Inference in First-Order Logic


1. 章节概述

第 8 章解决了"怎么说"——一阶逻辑(FOL)提供了描述对象、关系、函数与量化断言的语言。本章解决"怎么算"——如何从 FOL 知识库中高效地推导结论。

朴素的思路是把 FOL 归约为命题逻辑:既然 ∀x P(x)\forall x\ P(x)x P(x) 语义上等价于对论域中每个对象的合取,那就把所有变量替换成所有可能的常量,得到一个(可能巨大的)命题逻辑 KB,再用第 7 章的 DPLL/归结求解。这条路线理论上可行(Herbrand 定理保证了它的完备性),但实践中灾难性地低效kkk 元谓词、nnn 个常量会产生 nkn^knk 个命题符号;有函数符号时项集甚至无限。

本章的核心贡献是 提升(lifting) 思想:

不要把变量实例化成所有可能的常量,而是只在必要时、只做必要的替换——这正是 合一(unification) 算法的作用。带合一的推理规则(lifted inference rules)在变量层面一步完成命题层面需要 nkn^knk 步的工作。

本章主线:

  1. 命题化(propositionalization)与 Herbrand 定理:理论桥梁,说明 FOL 推理"可以"归约为命题推理。
  2. 量词消去:全称实例化(UI)、存在实例化(EI)、Skolem 化。
  3. 合一(unification):FOL 推理的引擎,求最一般合一子(MGU)。
  4. 提升的推理规则:广义 Modus Ponens(GMP)。
  5. 前向链接(forward chaining):Datalog、模式匹配、增量式、Rete 网络。
  6. 后向链接(backward chaining):Prolog、SLD 消解、答案抽取。
  7. 归结(resolution):CNF 转换、Skolem 化、二元归结、因子化、完备性证明梗概、实用策略。
  8. 逻辑程序设计与定理证明器的工程实践

读者应带走的核心直觉

合一是"让两个表达式长得一样"的最小努力;提升是"用一个变量层面的推理步,代替指数多个常量层面的推理步"。所有高效 FOL 推理的秘密都在这两句话里。


2. 关键概念与定义

2.1 替换(Substitution)

替换是变量到项的映射,写作 θ={v1/t1,v2/t2,… }\theta = \{v_1/t_1, v_2/t_2, \dots\}θ={v1/t1,v2/t2,}

  • SUBST(θ,α)SUBST(\theta, \alpha)SUBST(θ,α) 表示把 θ\thetaθ 应用到句子 α\alphaα 上的结果。
  • 例:SUBST({x/Sam}, Likes(x,IceCream))=Likes(Sam,IceCream)SUBST(\{x/Sam\},\ Likes(x, IceCream)) = Likes(Sam, IceCream)SUBST({x/Sam}, Likes(x,IceCream))=Likes(Sam,IceCream)

术语

  • 基项(ground term):不含变量的项,如 Father(John)Father(John)Father(John)
  • 基句子 / 基原子(ground sentence / ground atom):不含变量的句子。
  • 实例化(instantiation):用替换消去变量的过程。
  • 更一般 / 更特殊:若 θ1\theta_1θ1 的结果可通过再施加某替换得到 θ2\theta_2θ2 的结果,则 θ1\theta_1θ1 更一般

2.2 全称实例化(Universal Instantiation, UI)

∀v  αSUBST({v/g}, α)g 为任意基项\frac{\forall v\ \ \alpha}{SUBST(\{v/g\},\ \alpha)}\qquad g \text{ 为任意基项}SUBST({v/g}, α)v  αg 为任意基项

从"所有国王且贪婪者皆恶":

∀x  King(x)∧Greedy(x)⇒Evil(x)\forall x\ \ King(x)\wedge Greedy(x) \Rightarrow Evil(x)x  King(x)Greedy(x)Evil(x)

可实例化出无穷多句子:

King(John)∧Greedy(John)⇒Evil(John)King(Richard)∧Greedy(Richard)⇒Evil(Richard)King(Father(John))∧Greedy(Father(John))⇒Evil(Father(John))⋯ \begin{aligned} &King(John)\wedge Greedy(John)\Rightarrow Evil(John)\\ &King(Richard)\wedge Greedy(Richard)\Rightarrow Evil(Richard)\\ &King(Father(John))\wedge Greedy(Father(John))\Rightarrow Evil(Father(John))\\ &\cdots \end{aligned} King(John)Greedy(John)Evil(John)King(Richard)Greedy(Richard)Evil(Richard)King(Father(John))Greedy(Father(John))Evil(Father(John))

⚠️ UI 可应用任意多次,原句子保留在 KB 中。

2.3 存在实例化(Existential Instantiation, EI)

∃v  αSUBST({v/k}, α)k 为 KB 中未出现过的新常量\frac{\exists v\ \ \alpha}{SUBST(\{v/k\},\ \alpha)}\qquad k \text{ 为 KB 中未出现过的新常量}SUBST({v/k}, α)v  αk  KB 中未出现过的新常量

kkk 称为 Skolem 常量(Skolem constant)。

例:∃x Crown(x)∧OnHead(x,John)\exists x\ Crown(x)\wedge OnHead(x, John)x Crown(x)OnHead(x,John) 可推出

Crown(C1)∧OnHead(C1,John)Crown(C_1)\wedge OnHead(C_1, John)Crown(C1)OnHead(C1,John)

只要 C1C_1C1 是全新符号。

UI 与 EI 的关键差别

UI EI
可应用次数 任意多次 仅一次(用完丢弃原句)
结果与原句关系 逻辑等价(原句蕴涵结果) 推理等价(inferentially equivalent):新 KB 可满足 iff 原 KB 可满足
新符号 不引入 引入 Skolem 常量

为什么 EI 只能用一次∃x P(x)\exists x\ P(x)x P(x) 只保证"至少有一个",若用两次引入 C1,C2C_1, C_2C1,C2,就错误地断言了"至少两个"。

为什么 Skolem 常量必须是新的:若复用已有常量 JohnJohnJohn,则等于额外断言"那个满足 PPP 的对象就是 John",这是原句没有的信息。

2.4 命题化与 Herbrand 定理

命题化(propositionalization):把 FOL KB 中所有量化句用 UI/EI 展开为基句子,再把每个基原子(如 King(John)King(John)King(John))当作一个命题符号,从而得到一个命题逻辑 KB。

问题:若 KB 含函数符号,基项集合是无限的:
John, Father(John), Father(Father(John)), …John,\ Father(John),\ Father(Father(John)),\ \dotsJohn, Father(John), Father(Father(John)), 

Herbrand 定理(Herbrand, 1930):

若一个句子 α\alphaα 被 FOL 知识库 KBKBKB 蕴涵,则存在 KBKBKB有限基句子子集蕴涵 α\alphaα

Herbrand 论域(Herbrand universe):由 KB 中的常量与函数符号能构造出的所有基项的集合。
Herbrand 基(Herbrand base):所有基原子的集合。

由 Herbrand 定理导出的算法(半可判定过程):

for n = 0, 1, 2, ... do
    生成深度 ≤ n 的所有基项
    构造对应的命题化 KB
    用命题推理(DPLL/归结)检查是否蕴涵 α
    if 蕴涵 then return true
  • 完备性:若 KB⊨αKB\models\alphaKBα,某个有限 nnn 必然成功。
  • 不可判定性体现:若 KB⊭αKB\not\models\alphaKBα,循环永不终止。

Turing (1936) 与 Church (1936):FOL 蕴涵是半可判定的(semi-decidable)——存在算法证明蕴涵,但不存在算法在不蕴涵时总能报告"否"。

命题化的两大低效

  1. 无关实例化:为回答 Evil(John)Evil(John)Evil(John),生成了 Evil(Richard)Evil(Richard)Evil(Richard)Evil(Father(John))Evil(Father(John))Evil(Father(John)) 等无用句子。
  2. 组合爆炸pppkkk 元谓词 + nnn 个常量 ⇒ p⋅nkp\cdot n^kpnk 个命题符号。

⇒ 需要 lifting

2.5 合一(Unification)

定义:合一是找一个替换 θ\thetaθ,使两个(或多个)逻辑表达式语法上完全相同

UNIFY(p,q)=θ使得SUBST(θ,p)=SUBST(θ,q)UNIFY(p, q) = \theta \quad\text{使得}\quad SUBST(\theta, p) = SUBST(\theta, q)UNIFY(p,q)=θ使得SUBST(θ,p)=SUBST(θ,q)

θ\thetaθ 称为合一子(unifier)。

示例(设 KB 含 Knows(John,x)Knows(John, x)Knows(John,x)):

ppp qqq θ=UNIFY(p,q)\theta = UNIFY(p,q)θ=UNIFY(p,q)
Knows(John,x)Knows(John,x)Knows(John,x) Knows(John,Jane)Knows(John, Jane)Knows(John,Jane) {x/Jane}\{x/Jane\}{x/Jane}
Knows(John,x)Knows(John,x)Knows(John,x) Knows(y,Bill)Knows(y, Bill)Knows(y,Bill) {x/Bill, y/John}\{x/Bill,\ y/John\}{x/Bill, y/John}
Knows(John,x)Knows(John,x)Knows(John,x) Knows(y,Mother(y))Knows(y, Mother(y))Knows(y,Mother(y)) {y/John, x/Mother(John)}\{y/John,\ x/Mother(John)\}{y/John, x/Mother(John)}
Knows(John,x)Knows(John,x)Knows(John,x) Knows(x,Elizabeth)Knows(x, Elizabeth)Knows(x,Elizabeth) fail

最后一例失败的原因:同一个变量名 xxx 在两句中指代不同事物。解决办法是 标准化分离(standardizing apart):把其中一句的变量重命名,如 Knows(x17,Elizabeth)Knows(x_{17}, Elizabeth)Knows(x17,Elizabeth),则可合一 {x/Elizabeth, x17/John}\{x/Elizabeth,\ x_{17}/John\}{x/Elizabeth, x17/John}

最一般合一子(Most General Unifier, MGU)

多个合一子可能存在。UNIFY(Knows(John,x), Knows(y,z))UNIFY(Knows(John,x),\ Knows(y,z))UNIFY(Knows(John,x), Knows(y,z)) 可得:

  • θ1={y/John, x/z}\theta_1 = \{y/John,\ x/z\}θ1={y/John, x/z}MGU
  • θ2={y/John, x/John, z/John}\theta_2 = \{y/John,\ x/John,\ z/John\}θ2={y/John, x/John, z/John} ← 更特殊

MGU 对变量施加的约束最少,其他所有合一子都是 MGU 的实例。MGU 在变量换名意义下唯一

2.6 广义 Modus Ponens(Generalized Modus Ponens, GMP)

p1′, p2′, …, pn′,(p1∧p2∧⋯∧pn⇒q)SUBST(θ,q) \frac{p_1',\ p_2',\ \dots,\ p_n',\quad (p_1\wedge p_2\wedge\cdots\wedge p_n \Rightarrow q)} {SUBST(\theta, q)} SUBST(θ,q)p1, p2, , pn,(p1p2pnq)

其中存在 θ\thetaθ 使得对所有 iiiSUBST(θ,pi′)=SUBST(θ,pi)SUBST(\theta, p_i') = SUBST(\theta, p_i)SUBST(θ,pi)=SUBST(θ,pi)

示例

  • p1′=King(John)p_1' = King(John)p1=King(John)p1=King(x)p_1 = King(x)p1=King(x)
  • p2′=Greedy(y)p_2' = Greedy(y)p2=Greedy(y)p2=Greedy(x)p_2 = Greedy(x)p2=Greedy(x)
  • 规则:King(x)∧Greedy(x)⇒Evil(x)King(x)\wedge Greedy(x)\Rightarrow Evil(x)King(x)Greedy(x)Evil(x)
  • θ={x/John, y/John}\theta = \{x/John,\ y/John\}θ={x/John, y/John}
  • 结论:Evil(John)Evil(John)Evil(John)

GMP 是提升版(lifted)的 Modus Ponens:一步完成命题版需要先用 UI 枚举再匹配的工作。

可靠性证明:由 UI,∀x (p1∧⋯∧pn⇒q)⊨SUBST(θ,p1∧⋯∧pn⇒q)\forall x\ (p_1\wedge\cdots\wedge p_n\Rightarrow q) \models SUBST(\theta, p_1\wedge\cdots\wedge p_n\Rightarrow q)x (p1pnq)SUBST(θ,p1pnq);由前提 pi′p_i'piSUBST(θ,pi′)=SUBST(θ,pi)SUBST(\theta,p_i')=SUBST(\theta,p_i)SUBST(θ,pi)=SUBST(θ,pi),命题版 Modus Ponens 给出 SUBST(θ,q)SUBST(\theta,q)SUBST(θ,q)。∎

2.7 一阶定子句与 Datalog

  • 一阶定子句(first-order definite clause):形如 p1∧⋯∧pn⇒qp_1\wedge\cdots\wedge p_n\Rightarrow qp1pnq 的蕴涵式,其中所有 pip_ipiqqq 是正原子;变量隐含全称量化。原子事实(n=0n=0n=0)也算。
  • Datalog无函数符号的一阶定子句语言。
    • 关键性质:Herbrand 论域有限(只有常量),因此推理可判定
    • 广泛用于演绎数据库、图查询、程序分析。

⚠️ 有函数符号的定子句(如 Prolog)失去可判定性——因为可以生成无限多项。


3. 核心理论与算法

3.1 合一算法(UNIFY)

function UNIFY(x, y, θ=empty) returns 一个替换,使 x 与 y 相同,或 failure
    inputs: x, y —— 变量、常量、列表或复合表达式
            θ   —— 到目前为止建立的替换(默认为空)

    if θ = failure then return failure
    else if x = y then return θ
    else if VARIABLE?(x) then return UNIFY-VAR(x, y, θ)
    else if VARIABLE?(y) then return UNIFY-VAR(y, x, θ)
    else if COMPOUND?(x) and COMPOUND?(y) then
        return UNIFY(x.ARGS, y.ARGS, UNIFY(x.OP, y.OP, θ))
    else if LIST?(x) and LIST?(y) then
        return UNIFY(x.REST, y.REST, UNIFY(x.FIRST, y.FIRST, θ))
    else return failure


function UNIFY-VAR(var, x, θ) returns 一个替换
    if {var/val} ∈ θ for some val then return UNIFY(val, x, θ)
    else if {x/val}  ∈ θ for some val then return UNIFY(var, val, θ)
    else if OCCUR-CHECK?(var, x) then return failure
    else return add {var/x} to θ

逐行解读

  1. 递归结构:从表达式外层向内层递归,逐对比较对应位置。
  2. 变量绑定:遇到变量就尝试绑定;若变量已有绑定,递归合一其绑定值。
  3. OCCUR-CHECK(出现检验):检查 varvarvar 是否出现在 xxx 内部。若 UNIFY(x, f(x))UNIFY(x,\ f(x))UNIFY(x, f(x)) 不做检验,会产生无限项 f(f(f(… )))f(f(f(\dots)))f(f(f()))
  • 代价:朴素实现使合一从 O(size)O(size)O(size) 变为 O(n2)O(n^2)O(n2)
  • Prolog 的选择:默认省略 occur-check,因此 Prolog 的推理不可靠(unsound)——但在实践中极少出问题,换来了显著的速度。这是工程与理论的经典权衡。
  1. 复杂度:朴素实现 O(n2)O(n^2)O(n2);使用结构共享(structure sharing)与并查集的算法可达 线性时间 O(n)O(n)O(n)(Martelli–Montanari 算法、Paterson–Wegman 算法)。

MGU 保证:该算法返回的合一子总是最一般的——因为它只在必要时绑定变量,且优先绑定变量到变量。

关键设计要点:标准化分离(standardizing apart)
每次使用 KB 中的规则前,必须把规则中的变量重命名为全新变量。否则不同规则实例间会发生变量名冲突,导致错误的失败或过度约束。

3.2 前向链接(Forward Chaining)

3.2.1 一阶定子句的前向链接算法
function FOL-FC-ASK(KB, α) returns 一个替换或 false
    inputs: KB —— 一阶定子句知识库
            α  —— 查询(原子句子)

    while true do
        new ← {}                     // 本轮新推出的句子
        for each rule in KB do
            (p₁ ∧ ... ∧ pₙ ⇒ q) ← STANDARDIZE-VARIABLES(rule)
            for each θ such that SUBST(θ, p₁ ∧ ... ∧ pₙ)
                                = SUBST(θ, p₁' ∧ ... ∧ pₙ')
                for some p₁',...,pₙ' in KB do
                    q' ← SUBST(θ, q)
                    if q' 不与 KB 或 new 中已有句子 unify then
                        add q' to new
                        φ ← UNIFY(q', α)
                        if φ is not failure then return φ
        if new = {} then return false
        add new to KB

经典示例(“West 是罪犯”)

KB:
R1: American(x)∧Weapon(y)∧Sells(x,y,z)∧Hostile(z)⇒Criminal(x)R2: Missile(x)∧Owns(Nono,x)⇒Sells(West,x,Nono)R3: Missile(x)⇒Weapon(x)R4: Enemy(x,America)⇒Hostile(x)F1: Owns(Nono,M1)F2: Missile(M1)F3: American(West)F4: Enemy(Nono,America) \begin{aligned} &\text{R1: } American(x)\wedge Weapon(y)\wedge Sells(x,y,z)\wedge Hostile(z)\Rightarrow Criminal(x)\\ &\text{R2: } Missile(x)\wedge Owns(Nono,x)\Rightarrow Sells(West, x, Nono)\\ &\text{R3: } Missile(x)\Rightarrow Weapon(x)\\ &\text{R4: } Enemy(x, America)\Rightarrow Hostile(x)\\ &\text{F1: } Owns(Nono, M_1)\quad \text{F2: } Missile(M_1)\\ &\text{F3: } American(West)\quad \text{F4: } Enemy(Nono, America) \end{aligned} R1: American(x)Weapon(y)Sells(x,y,z)Hostile(z)Criminal(x)R2: Missile(x)Owns(Nono,x)Sells(West,x,Nono)R3: Missile(x)Weapon(x)R4: Enemy(x,America)Hostile(x)F1: Owns(Nono,M1)F2: Missile(M1)F3: American(West)F4: Enemy(Nono,America)

推理过程:

第 1 轮:
  R3 + F2 → Weapon(M₁)
  R2 + F2,F1 → Sells(West, M₁, Nono)
  R4 + F4 → Hostile(Nono)
第 2 轮:
  R1 + F3, Weapon(M₁), Sells(West,M₁,Nono), Hostile(Nono)
     → Criminal(West)   ✓

⚠️ 注意 ∃x …\exists x\ \dotsx  形式的存在句在此前需先 Skolem 化,Owns(Nono,M1)Owns(Nono, M_1)Owns(Nono,M1) 中的 M1M_1M1 即 Skolem 常量。

3.2.2 性质分析
性质 说明
可靠性 GMP 可靠 ⇒ 前向链接可靠
完备性 一阶定子句 KB 完备(证明用 Herbrand 模型构造)
终止性 Datalog(无函数符号):必然终止,最多 p⋅nkp\cdot n^kpnk 个基事实
有函数符号:可能不终止(如 NatNum(x)⇒NatNum(S(x))NatNum(x)\Rightarrow NatNum(S(x))NatNum(x)NatNum(S(x)) 无限生成)
复杂度 Datalog:O(p⋅nk)O(p\cdot n^k)O(pnk) 个可能事实,判定蕴涵是 数据复杂度 P-完全、组合复杂度 EXPTIME
3.2.3 三大效率问题与对策

问题 1:模式匹配代价高(Matching)

在每轮中为规则找到所有满足的 θ\thetaθ,本质是一个 约束满足问题(CSP)。例如:

Missile(x)∧Owns(Nono,x)⇒…Missile(x)\wedge Owns(Nono,x)\Rightarrow \dotsMissile(x)Owns(Nono,x)

要在成千上万事实中找所有匹配。结论:规则匹配等价于 CSP,因此是 NP-难 的(一般情形)。

对策:

  • CSP 技术:变量排序(最受约束优先)、弧相容。
  • 合取序优化:先匹配约束最强的合取项(如 Owns(Nono,x)Owns(Nono,x)Owns(Nono,x) 通常比 Missile(x)Missile(x)Missile(x) 更具选择性)——这是 conjunct ordering 问题,本身 NP-难,用启发式(最小剩余值 MRV)。
  • 数据索引:为谓词建立哈希表/多路索引(如按谓词名+参数位置建 index),使检索 O(1)O(1)O(1)

问题 2:重复推理(Incremental Forward Chaining)

朴素算法每轮重推所有规则,重复大量工作。

关键洞察

ttt 轮推出的每个新事实,必然使用了第 t−1t-1t1新推出的某个事实。

增量式前向链接:只对至少匹配一个"上一轮新事实"的规则做匹配。

Rete 算法(Forgy, 1982):

  • 把所有规则的前提编译成一个共享的数据流网络(dataflow network)。
  • 公共子表达式在网络中共享节点,避免重复计算。
  • 事实的增删只沿网络传播增量。
  • 生产系统(production system)如 OPS-5、CLIPS、Jess、Drools 的核心,也是许多规则引擎、XCON 专家系统的基础。

问题 3:无关事实(Irrelevant Facts)

前向链接会推出大量与查询无关的结论。

对策:

  • 魔集变换(magic sets):一种规则重写技术,把后向链接的目标导向性"编译进"前向链接规则。通过给规则加上"magic 谓词"作为额外前提,限制只推理与查询相关的实例。这是演绎数据库领域的标准优化。
  • 直接改用后向链接。

适用场景总结

  • ✓ 事实增量到达、需推出全部结论(监控系统、实时规则引擎、演绎数据库物化视图)。
  • ✗ 目标明确且 KB 巨大(应改用后向链接)。

3.3 后向链接(Backward Chaining)

3.3.1 算法
function FOL-BC-ASK(KB, query) returns 替换的生成器
    return FOL-BC-OR(KB, query, { })

function FOL-BC-OR(KB, goal, θ) returns 替换
    for each rule (lhs ⇒ rhs) in FETCH-RULES-FOR-GOAL(KB, goal) do
        (lhs, rhs) ← STANDARDIZE-VARIABLES((lhs, rhs))
        for each θ' in FOL-BC-AND(KB, lhs, UNIFY(rhs, goal, θ)) do
            yield θ'

function FOL-BC-AND(KB, goals, θ) returns 替换
    if θ = failure then return
    else if LENGTH(goals) = 0 then yield θ
    else
        first, rest ← FIRST(goals), REST(goals)
        for each θ' in FOL-BC-OR(KB, SUBST(θ, first), θ) do
            for each θ'' in FOL-BC-AND(KB, rest, θ') do
                yield θ''

结构解读

  • AND-OR 树:一条规则的多个前提是 AND 分支(都要证明);同一目标的多条规则是 OR 分支(任一成功即可)。
  • 生成器(generator):返回替换流,支持"要一个解就停"或"要全部解"。
  • 深度优先 + 回溯:空间复杂度线性于证明深度,但不完备(可能陷入无限循环)。

证明树示例Criminal(West)Criminal(West)Criminal(West)):

Criminal(West)
 └─ 用 R1,θ = {x/West}
    ├─ American(West)                    ✓ (F3)
    ├─ Weapon(y)
    │   └─ 用 R3,θ = {y/M₁}
    │       └─ Missile(M₁)               ✓ (F2)
    ├─ Sells(West, M₁, z)
    │   └─ 用 R2,θ = {z/Nono}
    │       ├─ Missile(M₁)               ✓ (F2)
    │       └─ Owns(Nono, M₁)            ✓ (F1)
    └─ Hostile(Nono)
        └─ 用 R4
            └─ Enemy(Nono, America)      ✓ (F4)
3.3.2 逻辑程序设计(Prolog)

Prolog 是后向链接的工业实现,语法特点:

  • 大写为变量,小写为常量:criminal(X) :- american(X), weapon(Y), sells(X,Y,Z), hostile(Z).
  • 规则按书写顺序尝试,前提按从左到右求解 ⇒ 深度优先、从左到右的搜索策略。

Prolog 的关键工程决策与代价

决策 收益 代价
深度优先搜索 空间 O(depth)O(depth)O(depth),速度快 不完备:左递归规则 path(X,Y) :- path(X,Z), edge(Z,Y). 无限循环
省略 occur-check 合一 O(n)O(n)O(n) 推理不可靠(unsound)
封闭世界 + 否定即失败(NAF) 高效表示"不成立" 非单调,与经典逻辑语义不同
cut(! 剪枝控制,提升效率 破坏声明式语义,程序难以理解

否定即失败(Negation as Failure)\+ P 意为"P 无法被证明",而非"P 为假"。这是非单调推理:加入新事实可能推翻旧结论。它对应封闭世界假设

关键优化技术

  • 编译到 WAM(Warren Abstract Machine):把 Prolog 程序编译成抽象机指令,比解释执行快数量级。
  • 开放列表 / 差分表(open list, difference list):实现 O(1)O(1)O(1) 的列表拼接。
  • OR-并行 与 AND-并行:多个规则/多个前提并行求解。
3.3.3 冗余与记忆化:表格逻辑编程

问题:后向链接会重复求解相同子目标。斐波那契式重复导致指数爆炸。

表格逻辑编程(tabled logic programming / SLG resolution)

  • 记忆化(memoization)缓存子目标的解。
  • 效果:把指数复杂度降为多项式;保证 Datalog 程序终止且完备
  • 实现:XSB Prolog、SWI-Prolog 的 :- table 指令。
  • 本质:动态规划 + 后向链接,与前向链接的完备性对齐。

3.4 归结(Resolution)—— 提升版

3.4.1 FOL 的 CNF 转换

比命题逻辑多两步:变量标准化Skolem 化

完整步骤(以 ∀x [∀y Animal(y)⇒Loves(x,y)]⇒[∃y Loves(y,x)]\forall x\ [\forall y\ Animal(y)\Rightarrow Loves(x,y)]\Rightarrow[\exists y\ Loves(y,x)]x [y Animal(y)Loves(x,y)][y Loves(y,x)] 为例,“爱所有动物的人会被某人爱”):

Step 1. 消去 ⇔\Leftrightarrow⇒\Rightarrow

∀x [¬∀y ¬Animal(y)∨Loves(x,y)]∨[∃y Loves(y,x)]\forall x\ [\neg\forall y\ \neg Animal(y)\vee Loves(x,y)]\vee[\exists y\ Loves(y,x)]x [¬∀y ¬Animal(y)Loves(x,y)][y Loves(y,x)]

Step 2. 否定内移(De Morgan + 量词对偶 ¬∀x p≡∃x ¬p\neg\forall x\ p \equiv \exists x\ \neg p¬∀x px ¬p

∀x [∃y ¬(¬Animal(y)∨Loves(x,y))]∨[∃y Loves(y,x)]∀x [∃y  Animal(y)∧¬Loves(x,y)]∨[∃y Loves(y,x)] \begin{aligned} &\forall x\ [\exists y\ \neg(\neg Animal(y)\vee Loves(x,y))]\vee[\exists y\ Loves(y,x)]\\ &\forall x\ [\exists y\ \ Animal(y)\wedge\neg Loves(x,y)]\vee[\exists y\ Loves(y,x)] \end{aligned} x [y ¬(¬Animal(y)Loves(x,y))][y Loves(y,x)]x [y  Animal(y)¬Loves(x,y)][y Loves(y,x)]

Step 3. 变量标准化(同名不同辖域的变量重命名)

∀x [∃y Animal(y)∧¬Loves(x,y)]∨[∃z Loves(z,x)]\forall x\ [\exists y\ Animal(y)\wedge\neg Loves(x,y)]\vee[\exists z\ Loves(z,x)]x [y Animal(y)¬Loves(x,y)][z Loves(z,x)]

Step 4. Skolem 化(消去 ∃\exists

⚠️ 这里是难点yyyzzz 都在 ∀x\forall xx 的辖域内,其取值依赖于 xxx,因此不能用常量,必须用 Skolem 函数

∀x [Animal(F(x))∧¬Loves(x,F(x))]∨Loves(G(x),x)\forall x\ [Animal(F(x))\wedge\neg Loves(x, F(x))]\vee Loves(G(x), x)x [Animal(F(x))¬Loves(x,F(x))]Loves(G(x),x)

Skolem 化通则

每个存在量化变量替换为一个 Skolem 函数,其参数是所有外层全称量化变量。若无外层 ∀\forall,则退化为 Skolem 常量。

∀x1…∀xn ∃y  ϕ⇝∀x1…∀xn  ϕ[y/f(x1,…,xn)]\forall x_1\dots\forall x_n\ \exists y\ \ \phi \quad\leadsto\quad \forall x_1\dots\forall x_n\ \ \phi[y/f(x_1,\dots,x_n)]x1xn y  ϕx1xn  ϕ[y/f(x1,,xn)]

Skolem 化保持可满足性(satisfiability-preserving),不保持逻辑等价。

Step 5. 丢弃全称量词(此时所有变量都是全称量化的,可隐含)

[Animal(F(x))∧¬Loves(x,F(x))]∨Loves(G(x),x)[Animal(F(x))\wedge\neg Loves(x,F(x))]\vee Loves(G(x),x)[Animal(F(x))¬Loves(x,F(x))]Loves(G(x),x)

Step 6. 分配 ∨\vee over ∧\wedge

[Animal(F(x))∨Loves(G(x),x)]∧[¬Loves(x,F(x))∨Loves(G(x),x)][Animal(F(x))\vee Loves(G(x),x)] \wedge [\neg Loves(x,F(x))\vee Loves(G(x),x)][Animal(F(x))Loves(G(x),x)][¬Loves(x,F(x))Loves(G(x),x)]

得到两个子句。✓

3.4.2 提升的归结规则(Lifted / Binary Resolution)

ℓ1∨⋯∨ℓk,m1∨⋯∨mnSUBST(θ, ℓ1∨⋯ℓi−1∨ℓi+1⋯∨ℓk∨m1⋯mj−1∨mj+1⋯∨mn) \frac{\ell_1\vee\cdots\vee\ell_k,\qquad m_1\vee\cdots\vee m_n} {SUBST(\theta,\ \ell_1\vee\cdots\ell_{i-1}\vee\ell_{i+1}\cdots\vee\ell_k\vee m_1\cdots m_{j-1}\vee m_{j+1}\cdots\vee m_n)} SUBST(θ, 1i1i+1km1mj1mj+1mn)1k,m1mn

其中 θ=UNIFY(ℓi, ¬mj)\theta = UNIFY(\ell_i,\ \neg m_j)θ=UNIFY(i, ¬mj)

示例

[Animal(F(x))∨Loves(G(x),x)],[¬Loves(u,v)∨¬Kills(u,v)][Animal(F(x))∨¬Kills(G(x),x)] \frac{[Animal(F(x))\vee Loves(G(x),x)],\qquad [\neg Loves(u,v)\vee \neg Kills(u,v)]} {[Animal(F(x))\vee\neg Kills(G(x), x)]} [Animal(F(x))¬Kills(G(x),x)][Animal(F(x))Loves(G(x),x)],[¬Loves(u,v)¬Kills(u,v)]

θ={u/G(x), v/x}\theta = \{u/G(x),\ v/x\}θ={u/G(x), v/x}

因子化(factoring):若一个子句中两个文字可合一,须合并。例:Loves(x,Cat)∨Loves(John,y)Loves(x, Cat)\vee Loves(John, y)Loves(x,Cat)Loves(John,y) 可因子化为 Loves(John,Cat)Loves(John, Cat)Loves(John,Cat)(用 θ={x/John,y/Cat}\theta=\{x/John, y/Cat\}θ={x/John,y/Cat})。

⚠️ 没有因子化,归结不完备。这是 Robinson 归结的必要组成部分。

3.4.3 归结反演算法
function FOL-RESOLUTION(KB, α) returns true or false
    clauses ← CNF(KB ∧ ¬α)
    new ← {}
    loop do
        for each pair (Ci, Cj) of clauses do
            (Ci, Cj) ← STANDARDIZE-APART(Ci, Cj)
            resolvents ← RESOLVE(Ci, Cj)           // 含 unification + factoring
            if □ ∈ resolvents then return true      // 空子句 ⇒ 矛盾 ⇒ KB ⊨ α
            new ← new ∪ resolvents
        if new ⊆ clauses then return false
        clauses ← clauses ∪ new

“Curiosity killed the cat” 完整证明(书中经典例题):

前提(自然语言):

  1. 所有爱一切动物的人,都被某人爱。
  2. 任何杀死动物的人,不被任何人爱。
  3. Jack 爱所有动物。
  4. Jack 或 Curiosity 杀死了猫 Tuna。
  5. Tuna 是猫。6. 所有猫都是动物。

目标:Kills(Curiosity,Tuna)Kills(Curiosity, Tuna)Kills(Curiosity,Tuna)

CNF 子句:

A1. ¬Animal(y) ∨ Loves(F(x), x)   ... [由 1 Skolem 化]
A2. ¬Loves(x, F(x)) ∨ Loves(G(x), x)
B.  ¬Loves(y,x) ∨ ¬Animal(z) ∨ ¬Kills(x,z)
C.  ¬Animal(x) ∨ Loves(Jack, x)
D.  Kills(Jack,Tuna) ∨ Kills(Curiosity,Tuna)
E.  Cat(Tuna)
F.  ¬Cat(x) ∨ Animal(x)
¬G. ¬Kills(Curiosity, Tuna)      [目标否定]

归结链(简述):

E + F                  → Animal(Tuna)
D + ¬G                 → Kills(Jack, Tuna)
Animal(Tuna) + C       → Loves(Jack, Tuna)  ... 实际需配合 A1/A2
... + B + Kills(Jack,Tuna)  → ¬Loves(y, Jack)     [没人爱 Jack]
A1/A2 + C 归结         → Loves(G(Jack), Jack)     [有人爱 Jack]
两者归结               → □                        ✓

归结产生矛盾,故 KB⊨Kills(Curiosity,Tuna)KB\models Kills(Curiosity, Tuna)KBKills(Curiosity,Tuna)

注意其中的"反证结构":从否定目标出发,推出"Jack 杀了 Tuna" ⇒ “没人爱 Jack”;但前提 1+3 又推出"有人爱 Jack" ⇒ 矛盾。这是一个人类也需要动脑的推理,展示了归结的威力。

3.4.4 完备性

Gödel 完备性定理(1930)+ Robinson (1965)

归结对 FOL 是 反演完备的(refutation-complete):若 SSS 是不可满足的子句集,则归结必能推出空子句。

证明梗概(三步):

  1. Herbrand 定理:若 SSS 不可满足,则存在有限的基实例集 S′S'S 不可满足。
  2. Ground Resolution Theorem(第 7 章):命题层面的归结对 S′S'S 完备,能推出 □\square
  3. 提升引理(Lifting Lemma):若基句子层面存在归结证明,则变量层面存在对应的证明,且基证明是提升证明的实例。

C1, C2C (ground)⟹C1′, C2′C′ (lifted),  C=SUBST(θ,C′)\frac{C_1,\ C_2}{C}\ \text{(ground)} \quad\Longrightarrow\quad \frac{C_1',\ C_2'}{C'}\ \text{(lifted)},\ \ C = SUBST(\theta, C')CC1, C2 (ground)CC1, C2 (lifted),  C=SUBST(θ,C)

3.4.5 归结策略(Resolution Strategies)

朴素归结的搜索空间呈指数爆炸,实用系统必须用策略:

策略 原理 完备性
单元优先(unit preference) 优先归结含单个文字的子句,快速缩短子句 保持完备(作为排序启发式)
支持集(set of support) 每步至少一个归结项来自"支持集"(通常初始为否定目标及其后代) 若支持集选择恰当(如 KB 本身可满足),保持完备
输入归结(input resolution) 每步至少一个归结项来自原始输入子句 对 Horn 子句完备,一般 FOL 不完备
线性归结(linear resolution) 允许与祖先子句归结 完备(输入归结的完备化)
subsumption(子句包含) 删除被更一般子句蕴涵的特殊子句 保持完备,大幅剪枝
学习 / lemma 复用 缓存已证子目标 类似 tabling

SLD 消解(Selective Linear Definite clause resolution):

线性归结 + 定子句 + 选择函数 = Prolog 的推理机制。对定子句完备。

其他实用技术

  • 索引(indexing):predicate indexingsubsumption latticediscrimination tree 加速子句检索。
  • 等词处理:单纯把 === 当普通谓词并加公理(自反、对称、传递、替换)效率极差。实用方案:
    • 解调(demodulation):用单元等式 x=yx = yx=y 定向重写项。
    • 超调 / 旁路(paramodulation):更一般的等式归结规则,对带等词的 FOL 完备。
    • 合一模等理论(E-unification)、Knuth–Bendix 完备化:把等式集编译成合流终止的重写系统。

现代定理证明器:Vampire、E、SPASS、Prover9、Z3(SMT)。它们已解决多个开放数学问题(如 Robbins 猜想由 EQP 于 1996 年证明)。

3.5 前向 vs 后向:完备性与效率总结

维度 前向链接 后向链接 归结
输入限制 一阶定子句 一阶定子句 任意 FOL(转 CNF)
驱动方式 数据驱动(bottom-up) 目标驱动(top-down) 反演(refutation)
可靠性 ✓(Prolog 因省 occur-check 而不严格可靠)
完备性 ✓(对定子句) ✓(若用 BFS/tabling);Prolog 的 DFS 不完备 ✓(反演完备,对全 FOL)
终止性 Datalog ✓;有函数符号 ✗ 可能左递归死循环;tabling 可救 半可判定,可能不终止
空间 存储所有推出事实,可能巨大 O(depth)O(depth)O(depth),很省 子句集增长,可能巨大
无关推理 严重(可用 magic sets 缓解) 很少(目标导向) 中等(可用 set of support 缓解)
典型系统 CLIPS、Drools、Datalog 引擎、Rete Prolog、XSB、专家系统 Vampire、E、SPASS
适用场景 事实流式到达、需全部结论、监控 明确查询、诊断问答、逻辑编程 数学定理证明、形式验证、任意 FOL

局限性汇总

  1. 定子句限制:前向/后向链接无法处理析取结论P⇒Q∨RP \Rightarrow Q\vee RPQR)与否定——这正是需要完整归结的原因。
  2. 半可判定性:任何完备的 FOL 推理算法在"不蕴涵"时都可能不终止。实用系统必须设资源上限。
  3. 等词爆炸:朴素等词公理化使搜索空间急剧膨胀。
  4. 命题化不可取nkn^knk 爆炸,且函数符号导致无限论域。

4. 关键图示/表格说明

4.1 合一示例对照表

ppp qqq MGU θ\thetaθ 说明
Knows(John,x)Knows(John, x)Knows(John,x) Knows(John,Jane)Knows(John, Jane)Knows(John,Jane) {x/Jane}\{x/Jane\}{x/Jane} 变量绑定到常量
Knows(John,x)Knows(John, x)Knows(John,x) Knows(y,Bill)Knows(y, Bill)Knows(y,Bill) {x/Bill, y/John}\{x/Bill,\ y/John\}{x/Bill, y/John} 双向绑定
Knows(John,x)Knows(John, x)Knows(John,x) Knows(y,Mother(y))Knows(y, Mother(y))Knows(y,Mother(y)) {y/John, x/Mother(John)}\{y/John,\ x/Mother(John)\}{y/John, x/Mother(John)} 绑定到复合项,需级联
Knows(John,x)Knows(John, x)Knows(John,x) Knows(x,Elizabeth)Knows(x, Elizabeth)Knows(x,Elizabeth) fail 变量名冲突,需标准化分离
Knows(John,x)Knows(John,x)Knows(John,x) Knows(y,z)Knows(y,z)Knows(y,z) {y/John, x/z}\{y/John,\ x/z\}{y/John, x/z} MGU(非 {y/John,x/John,z/John}\{y/John,x/John,z/John\}{y/John,x/John,z/John}
xxx f(x)f(x)f(x) fail(occur-check) 无出现检验则产生无限项
f(a,g(x))f(a, g(x))f(a,g(x)) f(y,g(b))f(y, g(b))f(y,g(b)) {y/a, x/b}\{y/a,\ x/b\}{y/a, x/b} 结构递归
f(a)f(a)f(a) g(a)g(a)g(a) fail 函数符号不同

4.2 UI / EI / Skolem 化对照

原句 处理 结果
∀x P(x)\forall x\ P(x)x P(x) UI(可多次) P(a)P(a)P(a)P(b)P(b)P(b)P(f(a))P(f(a))P(f(a))
∃x P(x)\exists x\ P(x)x P(x) EI(一次) P(C1)P(C_1)P(C1)C1C_1C1 为新 Skolem 常量
∀x ∃y P(x,y)\forall x\ \exists y\ P(x,y)x y P(x,y) Skolem 化 ∀x P(x,f(x))\forall x\ P(x, f(x))x P(x,f(x))fff 为 Skolem 函数
∃y ∀x P(x,y)\exists y\ \forall x\ P(x,y)y x P(x,y) Skolem 化 ∀x P(x,C)\forall x\ P(x, C)x P(x,C)CCC 为 Skolem 常量

⚠️ 最后两行的对比极其重要:Skolem 函数的参数正是外层的全称变量,这准确地编码了"yyy 依赖 xxx"还是"yyy 不依赖 xxx"。

4.3 证明树(AND-OR 树)示意

后向链接的搜索空间:

                   Criminal(West)          ← 目标
                        │ OR (可用规则)
                    ┌───┴───┐
                   R1      (其他规则)
                    │ AND (所有前提)
    ┌───────┬───────┼──────────┬─────────┐
American  Weapon  Sells      Hostile
(West)     (y)   (West,y,z)   (z)
   │        │ OR     │ OR       │ OR
  ✓ F3     R3       R2         R4
            │ AND    │ AND      │ AND
        Missile(y)  ┌─┴──┐   Enemy(z,America)
            │    Missile  Owns      │
           ✓F2    (y)  (Nono,y)    ✓F4
                   │      │
                  ✓F2    ✓F1

读图要点

  • 圆形分叉 = OR(规则选择),需要任一成功。
  • 方形分叉 = AND(前提合取),需要全部成功。
  • 叶节点为 KB 中的事实。
  • 深度优先遍历此树 + 回溯 = Prolog 执行模型。
  • 替换 θ\thetaθ 沿树向下传播(合成),子目标的解绑定影响兄弟子目标。

4.4 归结证明的"反演"结构

        KB ∧ ¬α  的子句集
              │
        反复归结(unify + factor)
              ↓
        ...新子句...
              ↓
             □(空子句)
              │
      ⇒ KB ∧ ¬α 不可满足
      ⇒ KB ⊨ α                  ✓

对比第 7 章:结构完全相同,唯一差别是每一步归结内嵌了 unification。这正是"提升"的含义。

4.5 复杂度与可判定性总览

语言片段 蕴涵判定 前向链接终止 典型复杂度
命题定子句 可判定 O(n)O(n)O(n) 线性
Datalog(FOL 定子句,无函数符号) 可判定 数据复杂度 P-完全;组合复杂度 EXPTIME
FOL 定子句(有函数符号,即 Prolog) 半可判定 不可判定
完整 FOL 半可判定 不可判定(Church–Turing)
FOL + 等词 半可判定 需 paramodulation
描述逻辑 ALC\mathcal{ALC}ALC 可判定 PSPACE-完全

核心 takeaway表达力 ↔ 可判定性/效率是知识表示的永恒权衡。Datalog 之所以在工业界(数据库、程序分析、Souffle、Datomic)广泛应用,正是因为它落在"表达力够用 + 可判定 + 多项式数据复杂度"的甜点上。

4.6 Rete 网络示意(增量前向链接)

事实流 →  [α 节点:单谓词过滤]
             Missile(?x)      Owns(Nono,?y)
                  │                 │
                  └────┬────────────┘
                       ↓
            [β 节点:连接(join),约束 ?x = ?y]
                       ↓
                 [规则激活]
                Sells(West,?x,Nono)
  • α 网络:对单个事实做谓词与常量过滤。
  • β 网络:做多事实的连接(join),维护部分匹配的中间结果(记忆节点)。
  • 事实增加时只沿网络传播增量,事实删除时撤销传播。
  • 空间换时间:中间结果占用大量内存,是 Rete 的主要代价。

5. 与其他章节的关联

5.1 承前

章节 关联
第 7 章 归结、CNF、定子句、前向/后向链接的命题版本在此全部被"提升";Ground Resolution Theorem 是本章完备性证明的第 2 步
第 8 章 本章是第 8 章语言的计算实现;UI/EI 直接源自 FOL 的量词语义;Skolem 化处理的正是 ∃\exists
第 6 章 CSP §3.2.3 明确指出规则匹配 = CSP,因此 MRV、弧相容等技术可直接迁移到 conjunct ordering
第 3 章 搜索 后向链接 = AND-OR 图的深度优先搜索;归结 = 子句空间中的搜索,策略即启发式

5.2 启后

章节 关联
第 10 章 知识表示 描述逻辑(description logic)是为了可判定性而设计的 FOL 片段,其推理算法(tableau)与本章思路一脉相承;语义网 OWL 的推理机(Pellet、HermiT)即基于此
第 11 章 规划 规划器的动作实例化(grounding)本质是合一;PDDL 的前提匹配就是 §3.2.3 的模式匹配问题;GraphPlan 的 mutex 传播类似 Rete 的增量传播
第 12 章 机器人 KR situation calculus 的推理需要处理带 situation 项的合一;event calculus 常用 Prolog + abduction 实现
第 15 章 关系概率模型 lifted inference 的概率版本:lifted variable elimination、lifted belief propagation,思想完全一致——在变量层面而非基实例层面计算
第 19 章 ILP 归纳逻辑编程用 θ\thetaθ-subsumption(基于合一的一般性偏序)组织假设空间;逆归结(inverse resolution)是归结的反向操作

5.3 一条贯穿的技术线:Lifting

命题逻辑推理(第7章)
    │  变量实例化爆炸
    ↓
命题化 + Herbrand 定理(本章 §2.4)—— 理论可行但低效
    │  引入 unification
    ↓
Lifted inference:GMP / lifted resolution(本章)
    │  推广到概率
    ↓
Lifted probabilistic inference(第15章)
    │  推广到学习
    ↓
Inductive Logic Programming(第19章)

6. 延伸思考

6.1 合一 vs 注意力:LLM 有"变量绑定"吗?

合一(unification)是本章最核心的机制。它的功能可以概括为:在两个结构化表达式之间建立变量到项的一致映射,且这个映射对整个表达式全局一致

关键词是"全局一致":一旦 x/Johnx/Johnx/John,则表达式中所有 xxx 都必须是 JohnJohnJohn。这是 Transformer 注意力机制不天然具备的能力。

机制 合一(unification) 注意力(attention)
匹配方式 精确的结构递归匹配 连续的相似度加权
变量绑定 全局一致,硬约束 无显式变量概念
失败处理 明确 fail,触发回溯 软失败,产生低权重(仍输出)
复合项 递归处理任意深度 深度受层数限制
泛化到新常量 完全免费(变量与实例无关) 依赖训练分布

开放性问题 1

现代 LLM 在解决"链式推理"任务时,是在近似执行合一,还是在做表层模式检索

一个可判别的实验设计:

  • 构造一批 FOL 推理题,其中实体名从未在训练中出现(如 ZorblaxQuinthar)。
  • 若模型真的在做变量绑定,性能应与用常见名字(Alice、Bob)时几乎相同
  • 已有研究表明性能确实会下降,暗示模型部分依赖实体的分布式表示而非纯结构。

更深的问题:Transformer 的深度 LLL 限制了它能执行的串行推理步数(每层大致对应一步"计算")。而后向链接的证明树深度是无界的。这在理论上给出了一个根本性限制

固定深度的 Transformer 无法在单次前向传播中完成任意深度的逻辑推理链。CoT 通过把中间结果写进上下文来"外化"工作记忆,等效于把串行深度从 LLL 扩展到 L×TL\times TL×TTTT 为生成的 token 数)。

这与本章的 tabling / 记忆化(§3.3.3)思想惊人地相似——都是用外部存储换取推理深度。可以说,CoT 是"神经版的 SLG 消解":把子目标的中间结论显式写出来,避免重复计算,也突破单次计算的深度上限。

6.2 神经引导的定理证明:把 LLM 当作启发式函数

本章反复出现的瓶颈是搜索空间爆炸

  • 归结要选哪对子句归结?
  • 后向链接要先展开哪个子目标?
  • 前向链接的 conjunct ordering 怎么排?

这些都是启发式选择问题,而人类数学家的强项恰在于此。

当前进展

  • AlphaGeometry(2024):LLM 提出辅助构造(“作 BCBCBC 的中点 MMM”),符号引擎做演绎闭包。在 IMO 几何题上达到金牌水平。这完美对应本章的分工:LLM ≈ 决定引入哪个 Skolem 项 / 哪条引理;符号引擎 ≈ 可靠完备的归结。
  • LeanDojo / DeepSeek-Prover:LLM 生成 Lean 战术(tactic),证明助手验证每一步。验证器保证 soundness,LLM 提供 搜索效率
  • NeuroSAT / GNN for SAT:用图神经网络学习变量选择启发式,替代 VSIDS。

开放性问题 2

本章的完备性定理(归结反演完备)保证"只要给足时间就能找到证明"。神经引导只改变搜索顺序,不改变可达性。那么,一个"完备性由符号引擎保证、效率由神经网络提供"的混合架构,是否是可信 AI 推理的正确范式?

值得深思的几个层面:

  1. 可验证性不对称:证明的生成极难(搜索),验证极易(线性检查每步)。这个不对称性是混合架构成立的基础,也是 AI 安全中"可扩展监督"(scalable oversight)的希望所在——我们不需要理解 AI 如何想到答案,只需要能验证答案。

  2. 但不是所有任务都有廉价验证器。数学证明有(Lean/Coq);代码有(测试/类型系统);而"这个医疗建议是否恰当"、"这段文本是否有害"没有。本章的方法论只在可形式化的领域直接适用。

  3. Prolog 的教训值得警惕:§3.3.2 提到 Prolog 为效率牺牲了 occur-check(不可靠)和完备性(深度优先)。这在实践中"几乎总是没问题"——但"几乎"意味着存在静默失败的可能。今天用 LLM 做推理时,我们做的是更激进的同类权衡:牺牲所有形式保证,换取极大的适用范围。区别在于,Prolog 的不可靠性有精确刻画(我们知道它在什么情况下出错),而 LLM 的失效模式无法刻画

6.3 Lifted inference 与多模态、可扩展性

lifting 的核心思想——“在抽象层面一次性处理一整类实例”——远超逻辑范畴:

  • 概率推理(第 15 章):lifted variable elimination 处理"1000 万个用户,每个都有相同的概率结构",不必展开成 1000 万个变量。
  • 多模态感知:视频中的 100 个相同行人,是否需要 100 套独立参数?还是应该有一个"行人"的抽象模板 + 个体化的绑定?这正是 object-centric learning(Slot Attention、MONet)的核心问题——在感知层实现"变量与实例的分离"
  • 具身智能:机器人学会"拿起杯子"后,遇到没见过的杯子应该零样本迁移。这要求策略以变量化的方式表示(“拿起 ?x?x?x,其中 Graspable(?x)Graspable(?x)Graspable(?x)”),而非记忆具体像素。

一个具体的开放问题

目前的视觉基础模型(SAM、DINO)能分割和识别对象,但不能表达对象间的量化关系(“所有红色方块都在蓝色方块左边”)。要弥合这个鸿沟,是应该在视觉模型之上接一个符号层(做 scene graph → FOL → 推理),还是应该设计天然支持关系与量化的神经架构?

前者可行但脆弱(依赖场景图的质量,误差传播);后者优雅但至今没有令人信服的方案。这或许是神经-符号研究最有价值的未解问题

6.4 AI 对齐视角:不可判定性的启示

本章有一个容易被当作"技术细节"忽略、但对 AI 安全极为重要的结论:

FOL 蕴涵是半可判定的。

这意味着:

  • 若某条安全性质被违反,理论上可以找到证明(有限步)。
  • 若某条安全性质成立,可能永远无法确认

对形式化 AI 安全的直接后果:

  1. 验证不对称:找 bug(找反例)在原理上比证明"没有 bug"更容易。这解释了为什么红队测试(red-teaming)在实践中比形式验证更主流。
  2. 必须限制表达力:模型检验(model checking)之所以在硬件验证中成功,是因为它工作在有限状态(可判定)而非 FOL。要对 AI 系统做形式保证,可能必须把安全性质表达在可判定片段(时序逻辑 LTL/CTL、描述逻辑、Datalog)中。
  3. 资源界限即安全界限:任何实际的推理系统都有时间上限。当推理器"超时"时,系统应该默认拒绝(fail-safe)还是默认放行(fail-open)?在 Wumpus World 中,第 7 章的混合智能体选择了"只走能被证明安全的格子"——fail-safe。这个设计原则应当被写入 AI Agent 的动作授权层。

收束:本章看似是一堆技术算法,但它教给我们的元级教训是——可靠性、完备性、效率、表达力四者不可兼得。任何声称"全都要"的系统,一定在某处偷偷放弃了什么。识别出它放弃了什么,是评估任何 AI 推理系统的第一步。

更多推荐