跳到主要内容

一阶逻辑与知识表示 — 从符号到世界,再从世界到常识

这一章讲三件事: 一阶逻辑凭什么能把「上亿条」压成「10 条」; 它的推断算法比命题版多了什么、贵了多少;以及用这门语言 写常识知识时会撞上的那些坑(自然类、时间、信念、默认规则)。 读完你会理解为什么 GOFAI 的兴衰都写在这一章的语言里。

1. 这一章讲什么

命题逻辑在 wumpus 世界撞墙的样子,上一章末尾已经见过:每个方格、每个时刻 一个符号,100×100 场地 1000 步要上亿条语句。一阶逻辑(FOL)加的东西 恰好对症:世界由有关系的对象组成——这既是它对「世界」的本体论承诺, 也是它表达力的来源1。同一张地图,大约 10 条语句写完2

这一章分三段:语言(FOL 的语法语义)、推断(合一如何「提升」命题算法)、 内容(用 FOL 表述类别、事件、精神状态的工程学)。

2. 顶层全景

语言:对象+关系+函数;∀ 与 ∃;数据库语义(3 条假设)

推断(把命题算法「提升」到带变量的语句上):
合一 Unify 找最一般置换 θ
├─ 前向链接/反向链接(确定子句;Prolog=反向链接+数据库语义)
└─ 归结:CNF + 斯科伦化消 ∃;完备(反演完备)

内容(知识工程):
类别/继承/物化 · 自然类(番茄没有完备定义)
事件演算(T/Happens/Initiates)· 精神对象与模态逻辑
语义网络/描述逻辑 · 非单调(尼克松菱形)/限定/缺省逻辑
真值维护(JTMS/ATMS)

图说:语言是地基,推断是楼板,内容是家具——GOFAI 的全部家当; 最后一排同时是它的账单。

3. 核心原理

3.1 语言:量词与两条搭配纪律

FOL 的模型=对象的域+一套解释(符号指到哪个对象/关系/函数)。 规模感受:两个常量符号、不超过 6 个对象,可能的模型就有 137,506,194,466 个——枚举模型这条路彻底堵死3

量词是表达力的关键,而它有两条新手必踩的搭配纪律4:

  • ∀ 配 ⇒。「所有国王都是人」写作 ∀x King(x)⇒Person(x)。 把它展开成逐对象断言:对腿、王冠这些「不是国王」的对象, 前提为假、蕴涵式自动为真——什么也没多说,正合本意。 反过来写成 ∀x King(x)∧Person(x) 就要求理查的左腿也是国王, 语句凭空多了断言。
  • ∃ 配 ∧。「约翰头顶有王冠」是 ∃x Crown(x)∧On(x,John)。 写成 ∃x Crown(x)⇒On(x,John) 的话,任何一个不是王冠的对象 都能让蕴涵式为真——语句基本什么都没说5

等词用来数数:「理查至少有两个兄弟」必须写成 ∃x,∃y Brother(x,Richard)∧Brother(y,Richard)∧¬(x=y)—— 不写 ¬(x=y),x、y 可以指同一个人6

最后是数据库语义:唯一名称假设(不同符号=不同对象)、 封闭世界假设(没说的都是假)、域闭包(对象不多于名字)。 三条假设让「理查的兄弟是约翰和杰弗里」一句就成立——标准语义下 要排除「还有别的兄弟」「约翰=杰弗里」得写一长串。书里的裁断很清醒: 逻辑没有「正确的」语义,数据库语义适合「对象身份全知」的场景, 其余场合用标准语义7

3.2 主走查:一个犯罪问题,两条推断路

主走查的输入是书里贯穿两章的例子:

美国人将武器出售给敌对国家是犯罪。诺诺国是美国的敌人、拥有导弹, 所有导弹都是韦斯特上校卖的,韦斯特是美国人。 问:韦斯特是罪犯吗?8

写成确定子句(∃ 的导弹实例化成新常量 M1): American(West)∧Missile(M1)∧Owns(Nono,M1)∧Enemy(Nono,America)∧ ∀x American(x)∧Weapon(x)∧Sells(x,y,z)∧Hostile(z)⇒Criminal(x)……

第一条路:前向链接。 数据在队列里滚动:

第 1 轮 Missile(M1) + Owns(Nono,M1) 触发「导弹是武器」类规则 → Weapon(M1)
Enemy(Nono,America) 触发「美国之敌是敌对国」→ Hostile(Nono)
第 2 轮 American(West)+Weapon(M1)+Sells(West,Nono,M1)+Hostile(Nono)
凑齐大规则的全部前提,合一 θ={x/West} → Criminal(West) ✓

9

第二条路:归结。 把 KB 与 ¬Criminal(West) 全部转成 CNF (消 ⇒、¬ 内移、变量标准化、斯科伦化消 ∃、消 ∀、分配律), 然后一对对找互补文字归结。证明树是一条「主线」:从目标子句出发 一路归结到空子句。书里点破了一个漂亮的对应:这条主线上的子句, 恰好就是反向链接算法里目标变量的取值序列——反向链接是归结的一个特例, 只是控制策略不同10

两条路里共同的发动机是合一:找出让两条语句看起来相同的置换 θ。 Knows(John,x) 与 Knows(John,Elizabeth) 合一时,x 不能同时等于 John 和 Elizabeth——先标准化分离(把变量改名成 x17)再合11。 可合一的表达式都有唯一的最一般合一子(MGU);算法有一个昂贵的检查: 出现检查(S(x) 不能与 S(S(x)) 合一,因为 x 出现在待代入的项里), Prolog 干脆砍掉它,把安全责任推给用户12

3.3 逻辑编程:数据库语义的代价

Prolog = 反向链接 + 数据库语义 + 一条粗暴规则「否定即失败」 (查询失败⟹断言其否定)。它的推导是深度优先的,于是有两个职业病: 冗余推断与无限循环(书里给了控制手段:先试 Facts 规则等)13。 约束逻辑编程再把「等式求解」塞进推理,缓解纯搜索的浪费14

归结一侧同样付出了代价:CNF 可读性极差(「爱所有动物的每个人被某些人爱」 斯科伦化后出现斯科伦函数 F(x)、G(x),书里坦言「比原本含蕴涵的语句 难读多了……人类很少需要考察 CNF——翻译过程很容易自动化」)15。 这个方向的天花板由哥德尔钉死:一阶逻辑本身是完备的, 但只要把算术的归纳原理加进来,不完备性定理立刻生效—— 存在真而不可证的命题。书里对「机器因此不如人」的卢卡斯式论证 留到第 18 章拆解16

3.4 用 FOL 写常识:四个工程难题

类别与继承。 类别可以当谓词(Basketballs(b)),也可以「物化」成对象 (Member(b, Basketballs)、Subset(Basketballs, Balls))。继承随之而来: 食物可食用 ⊆ 水果 ⊆ 苹果 ⟹ 苹果可食用17。但自然类没有完备定义: 番茄有黄的有绿的,圣女果都小;维特根斯坦用「游戏」说明家族相似性; 奎因连「单身汉=未婚成年男性」都质疑(教皇算吗?)18。 工程出路是区分「所有实例都真」与「典型实例才真」(Typical(Tomatoes))19

事件与时间。 后继状态公理假设动作瞬时、离散。事件演算改用 T(流在区间为真)、Happens(事件发生)、Initiates/Terminates(事件启动/ 终止流)——物化事件的好处是能随意加属性:Bumpy(E1)「那趟航班很颠簸」20。 时间用间隔 algebra(Meet/Before/Overlap……)表达:「伊丽莎白二世的统治 紧接乔治六世;猫王的年代与 20 世纪 50 年代 Overlap」21。 一个反直觉的点:President(USA) 在 FOL 里必须是一个跨时间的单一对象 (「1789–1797 年是华盛顿」是它的子事件与华盛顿的子事件相等), 因为项在模型里只能指一个东西22

精神状态。 「Lois 相信 Superman 会飞,但不相信 Clark Kent 会飞」—— 两个词指同一人,信念却不同。等词替换在信念语境里失效, 这逼出了模态逻辑;书里把它归为「引用不透明」问题23

默认与例外。 「鸟会飞,Tweety 是鸟 ⟹ Tweety 会飞」——但企鹅呢? 经典逻辑是单调的(加事实只会多结论),而常识推理会改主意。 两条技术路线:限定(circumscription,把异常谓词 Ab1 的外延压到最小, 「尼克松菱形」里贵格会教徒默认和平主义、共和党默认不和平, 两个偏好模型并存,限定器不可知,除非再加优先级)与缺省逻辑 (规则「P:C 若 J 与 KB 一致」)24。书里还给了最务实的一句: 缺省规则其实是阈值概率——「我的刹车一直很好」的实质是 「没有别的信息时,刹车的可靠度足够高,最优决策是不检查直接开」; 开着重卡下陡坡时,同样的规则突然失效,虽然没有任何新证据25

改动知识库还牵出真值维护:收回 P 时,由 P 推出的 Q 怎么办? JTMS 给每条语句记「论证」(由哪些语句推出),收回 P 只删「全部论证 都依赖 P」的语句,其余保留;ATMS 更进一步,同时维护所有假设世界 (罗马尼亚奥委会挑场馆的例子里,改一个假设不用从头重算)26

3.5 描述逻辑与语义网络:限定表达力换可判定性

语义网络(节点+isa/instance 链)是 FOL 的图形子集,继承即传播27。 描述逻辑(如 Classic)把「类别定义」做成代数: 单身汉=And(Man, AtMost(0, Wife), …);它保证包容检测是多项式的, 代价一样明确——要么说不出否定与析取,要么描述指数膨胀。 书里的判语:「这乍听起来不错,直到你发现它只导致两个后果之一」28

4. 作者的判断与证据

  • (书内定理) 一阶归结反演完备(埃尔布朗定理+提升引理); 前向/反向链接在确定子句上线性29
  • (书内工程数据) 心脏病诊断网络:去掉隐变量 HeartDisease, 参数从 78 涨到 708(第 13 章回收);FOL 十条语句 vs 命题上亿条30
  • (作者的立场,有历史注脚) 乔姆斯基 1957 年的论断——概率模型看不出句法(合法句子如何搭起来的结构)——使得 无洞见」的论断让统计方法被冷落了二十年——书里在 NLP(自然语言处理)那两章明确翻案31
  • (书内方法论) 「没有『正确的』语义」:语义的有用性取决于 表示是否简洁、推断规则是否自然7。这句话是对整个知识表示年代的总结。

5. 边界与局限

  • FOL 推断最坏不可判定级别地贵;表达力每涨一级,推断代价跟着涨 (原子→因子化→结构化,第 2 章的表示轴在这里兑现)。
  • 哥德尔:把算术纳进来后,真而不可证的命题永远存在—— 「完备的知识库」在数学领域原则上不存在16
  • 非单调推理悬而未决的问题,书里列了三个:矛盾的缺省知识意味着什么、 好的缺省规则集怎么造、缺省信念怎么进决策32
  • 知识工程的成本(专家时间、公理维护)是专家系统崩溃的直接原因之一; 这条历史教训在第 12 章的「学出来的表示」处完成反转。

6. 可带走的

  1. ∀ 配 ⇒、∃ 配 ∧:两句口诀避免 90% 的形式化事故。
  2. 合一是「带变量的搜索」的核心原语(最基础的操作件);看到出现检查被砍,先问安全问题。
  3. 前向链接管「数据来了顺带推什么」,反向链接管「这个问题需要什么」; 选错方向,代价差一个数量级。
  4. 反向链接=归结的霍恩特例——两套教材术语,一个引擎。
  5. 数据库语义的封闭世界假设在概率系统里不成立(第 9 章 RPM 特意收回它)。
  6. 自然类没有完备定义;用「典型实例」写知识,别硬凑充要条件。
  7. 缺省规则 = 阈值概率。写出「什么情况下这条规则失效」比写出规则本身更重要。

7. 原文地图

主题原书章原文位置
编程语言的短板/合成性8.1text/10-fm.txt:8407(搜「编程语言」) · text/10-fm.txt:8421(搜「合成性」)
对象/关系/函数8.1.2text/10-fm.txt:8503(搜「对象、关系和函数」)
本体论/认识论约定表8.1.2text/10-fm.txt:8527(搜「本体论约定」) · text/10-fm.txt:8534(搜「本体论约定」)
137 亿模型8.2.2text/10-fm.txt:8675(搜「137 506 194 466」)
项不是子程序8.2.3text/10-fm.txt:8684(搜「子程」)
∀ 配 ⇒8.2.6text/10-fm.txt:8755(搜「前提为假」) · text/10-fm.txt:8758(搜「常见错误」)
∃ 配 ∧8.2.6text/10-fm.txt:8784(搜「⇒ 是能自然地」) · text/10-fm.txt:8796(搜「基本上什么都没说」)
等词数兄弟8.2.7text/10-fm.txt:8845(搜「两个兄弟」)
数据库语义三假设8.2.8text/10-fm.txt:8863(搜「唯一名称假设」)
没有正确的语义8.2.8text/10-fm.txt:8884(搜「正确的」)
合一与标准化分离9.2.1text/10-fm.txt:9447(搜「合并」) · text/10-fm.txt:9463(搜「标准化分离」)
MGU 与出现检查9.2.1text/10-fm.txt:9469(搜「最一般合一子」) · text/10-fm.txt:9476(搜「出现检验」)
包容格9.2.2text/10-fm.txt:9529(搜「包容格」)
犯罪问题9.3.1text/10-fm.txt:9562(搜「韦斯特」) · text/10-fm.txt:9583(搜「数据日志」)
前向链接两轮9.3.2text/10-fm.txt:3547(搜「两次迭代」) · text/10-fm.txt:9618(搜「M1」)
反向链接=归结特例9.5.3text/10-fm.txt:10009(搜「主线」) · text/10-fm.txt:10011(搜「特例」)
斯科伦化9.5.1text/10-fm.txt:9964(搜「斯科伦化」) · text/10-fm.txt:9973(搜「斯科伦函数」)
好奇心害死猫9.5.3text/10-fm.txt:10019(搜「all animals」) · text/10-fm.txt:10046(搜「好奇心」)
反演完备9.5.4text/10-fm.txt:10063(搜「反演完备」)
哥德尔9.5.4text/10-fm.txt:10082(搜「不完全性定理」)
Prolog9.4.4text/10-fm.txt:9884(搜「Prolog」)
物化 reification10.2text/10-fm.txt:10503(搜「物化」)
继承与分类法10.2text/10-fm.txt:10491(搜「继承」) · text/10-fm.txt:10494(搜「分类学」)
自然类/单身汉质疑10.2text/10-fm.txt:10600(搜「自然类」) · text/10-fm.txt:10622(搜「单身汉」)
束与质10.2.1text/10-fm.txt:10554(搜「Apple1、Apple2 和 Apple3」)
量度与排序10.2.2text/10-fm.txt:10569(搜「量度」) · text/10-fm.txt:10590(搜「诺维格」)
事件演算谓词表10.3text/10-fm.txt:10670(搜「事件演算」) · text/10-fm.txt:10689(搜「Initiates」)
间隔关系10.3.1text/10-fm.txt:10720(搜「间隔关系」) · text/10-fm.txt:10724(搜「伊丽莎白」)
President(USA) 对象10.3.2text/10-fm.txt:1555(搜「总统」) · text/10-fm.txt:10736(搜「一个对象」)
精神对象/模态10.4text/10-fm.txt:10750(搜「信念」)
语义网络10.5.1text/10-fm.txt:10855(搜「语义网络」)
描述逻辑 Classic10.5.2text/10-fm.txt:10926(搜「描述逻辑」) · text/10-fm.txt:10967(搜「两个后果」)
非单调与 4 轮车10.6.1text/10-fm.txt:10986(搜「4 个轮子」)
尼克松菱形10.6.1text/10-fm.txt:11011(搜「尼克松」)
缺省=阈值概率10.6.1text/10-fm.txt:570(搜「刹车」)
JTMS/ATMS10.6.2text/10-fm.txt:11066(搜「JTMS」) · text/10-fm.txt:11088(搜「ATMS」)

Footnotes

  1. 出处:「一阶逻辑」第 8531 段(text/10-fm.txt:8531,搜「具有关系的对象」)。

  2. 出处:「逻辑智能体」第 8259 段(text/10-fm.txt:8259,搜「10 条」)。

  3. 出处:「一阶逻辑」第 8675 段(text/10-fm.txt:8675,搜「137 506 194 466」)。

  4. 出处:「一阶逻辑」第 8755 段(text/10-fm.txt:8755,搜「前提为假」)。

  5. 出处:「一阶逻辑」第 8796 段(text/10-fm.txt:8796,搜「基本上什么都没说」)。

  6. 出处:「一阶逻辑」第 8845 段(text/10-fm.txt:8845,搜「两个兄弟」)。

  7. 出处:「一阶逻辑」第 8884 段(text/10-fm.txt:8884,搜「正确的」)。 2

  8. 出处:「一阶逻辑中的推断」第 9562 段(text/10-fm.txt:9562,搜「韦斯特」)。

  9. 出处:「一阶逻辑中的推断」第 3547 段(text/10-fm.txt:3547,搜「两次迭代」)。 两条规则触发的明细在 9618–9621 段。

  10. 出处:「一阶逻辑中的推断」第 10009 段(text/10-fm.txt:10009,搜「主线」)与 第 10011 段(text/10-fm.txt:10011,搜「特例」)。

  11. 出处:「一阶逻辑中的推断」第 9456 段(text/10-fm.txt:9456,搜「Elizabeth」)与 第 9463 段(text/10-fm.txt:9463,搜「标准化分离」)。

  12. 出处:「一阶逻辑中的推断」第 9469 段(text/10-fm.txt:9469,搜「最一般合一子」)与 第 9476 段(text/10-fm.txt:9476,搜「出现检验」)。

  13. 出处:「一阶逻辑中的推断」第 9849 段(text/10-fm.txt:9849,搜「冗余推断和无限循环」)。

  14. 出处:「一阶逻辑中的推断」第 9905 段(text/10-fm.txt:9905,搜「约束逻辑编程」)。

  15. 出处:「一阶逻辑中的推断」第 9983 段(text/10-fm.txt:9983,搜「难读多了」)。 「爱所有动物」例句在 9942 段。

  16. 出处:「一阶逻辑中的推断」第 10082 段(text/10-fm.txt:10082,搜「不完全性定理」)。 2

  17. 出处:「知识表示」第 10491 段(text/10-fm.txt:10491,搜「继承」)。

  18. 出处:「知识表示」第 10600 段(text/10-fm.txt:10600,搜「自然类」)与 第 10622 段(text/10-fm.txt:10622,搜「单身汉」)。

  19. 出处:「知识表示」第 10612 段(text/10-fm.txt:10612,搜「典型实例」)。

  20. 出处:「知识表示」第 10670 段(text/10-fm.txt:10670,搜「事件演算」)与 第 10676 段(text/10-fm.txt:10676,搜「Bumpy(E1)」)。

  21. 出处:「知识表示」第 10724 段(text/10-fm.txt:10724,搜「伊丽莎白」)。

  22. 出处:「知识表示」第 10736 段(text/10-fm.txt:10736,搜「一个对象」)。

  23. 出处:「知识表示」第 10750 段(text/10-fm.txt:10750,搜「它们都不具有关于信念」)。

  24. 出处:「知识表示」第 11011 段(text/10-fm.txt:11011,搜「尼克松」)与 第 11019 段(text/10-fm.txt:11019,搜「缺省逻辑」)。

  25. 出处:「知识表示」第 570 段(text/10-fm.txt:570,搜「刹车」)。

  26. 出处:「知识表示」第 11066 段(text/10-fm.txt:11066,搜「JTMS」)与 第 11088 段(text/10-fm.txt:11088,搜「ATMS」)。 罗马尼亚奥委会例子在 11080 段。

  27. 出处:「知识表示」第 10855 段(text/10-fm.txt:10855,搜「语义网络」)。

  28. 出处:「知识表示」第 10967 段(text/10-fm.txt:10967,搜「两个后果」)。

  29. 出处:「一阶逻辑中的推断」第 10063 段(text/10-fm.txt:10063,搜「反演完备」)。

  30. 出处:「概率模型学习」第 23741 段(text/10-fm.txt:23741,搜「其总数为 78」)。

  31. 出处:「自然语言处理」第 1016 段(text/10-fm.txt:1016,搜「乔姆斯基」)。

  32. 出处:「知识表示」第 11039 段(text/10-fm.txt:11039,搜「尚未解决的问题」)。