人工智能:现代方法读书笔记(九)

第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 的关键差别

UIEI
可应用次数任意多次仅一次(用完丢弃原句)
结果与原句关系逻辑等价(原句蕴涵结果)推理等价(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)):

pppqqqθ=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 引擎、ReteProlog、XSB、专家系统Vampire、E、SPASS
适用场景事实流式到达、需全部结论、监控明确查询、诊断问答、逻辑编程数学定理证明、形式验证、任意 FOL

局限性汇总

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

4. 关键图示/表格说明

4.1 合一示例对照表

pppqqqMGU θ\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}
xxxf(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 章 机器人 KRsituation 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 推理系统的第一步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是慎独

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值