🎯 本章要解决什么?让智能体学会"用证据说话"
想象以下场景:
- 你妈怀疑你偷玩游戏:"路由器灯在闪!你手机发烫!你眼神躲闪!→ 你肯定在玩!"
- 中医看病:"舌苔厚、脉象沉、面色黄 → 湿气重"
- 破案片侦探:"门锁没坏、贵重物没丢、熟人作案 → 凶手是..."
这些都是逻辑推理!本章要教智能体: 当你的"眼睛"(传感器)看不到全部真相时,如何用"脑子"(推理)补全信息,做出正确决策。
一、基于知识的智能体:不做"无脑莽夫"
🧠 核心升级:从"反射弧"到"动脑子"
| 智能体类型 | 决策依据 | 人类比喻 | 缺点 |
|---|---|---|---|
| 反射型(第2章) | 当前感知直接触发动作 | 烫手就缩回 | 被骗:看到刹车灯就刹,但可能是尾灯 |
| 基于知识型(本章) | 感知 + 已有知识 → 推理 → 动作 | 看到烟 → 推理有火 → 逃跑 | 需要"知识库"和"推理引擎" |
📦 知识型智能体的两个核心部件
class 知识型智能体:
def __init__(self):
self.知识库 = [] # 存放"世界规律"
self.推理引擎 = None # 大脑的"推理算法"
def 运行(self):
while True:
感知 = 获取感知() # 眼睛看
告诉知识库(感知) # "我闻到了怪味"
动作 = 问知识库("现在该做什么动作?") # "根据所有线索,我该跑吗?"
执行(动作)
睡觉(1)
关键思想:智能体内部有个"小本本"(知识库),记录已知事实和规律,推理引擎就是"翻小本本找答案"的过程。
二、Wumpus世界:推理智能体的"新手训练营"
🌍 游戏规则(简化版扫雷+怪物)
4×4网格世界:
- 你:▲(探险家)
- 怪物:W(Wumpus,被它碰到就死)
- 陷阱:P(无底洞,掉进去死)
- 金子:G(找到就赢)
感知:
- 在怪物相邻格 → 闻到臭味(Stench)
- 在陷阱相邻格 → 感觉有风(Breeze)
- 在金子上 → 看到金光(Glitter)
- 撞墙 → 感到撞击(Bump)
- 怪物死时 → 听到惨叫(Scream)
🧩 为什么选这个游戏?
- 部分可观测:只能看到当前格和相邻格的提示
- 需要推理:"这里有臭味,说明相邻四格中至少一格有怪物"
- 有逻辑结构:可以用逻辑公式精确描述规则
🎮 推理过程演示
你开局在(1,1),感觉有风 → Breeze₁,₁为真
知识库规则:"如果某格有风,则它的四个邻居至少有一个是陷阱"
问:我该往(1,2)走吗?
推理:
已知:(1,1)有风
规则:Breeze₁,₁ → (P₁,₂ ∨ P₂,₁ ∨ P₁,₀ ∨ P₀,₁) # 但(1,0)和(0,1)不存在
所以:(1,2)或(2,1)可能有陷阱
不确定哪个 → 先去安全的(2,1)?
等等!还要结合更多感知...
三、命题逻辑:给"侦探笔记"定格式
📝 为什么要形式化逻辑?
人类自然语言 :"如果下雨且你没带伞,你就会湿" 歧义:"没带伞"包括忘带了、伞坏了、伞被别人用了...
命题逻辑:给每个原子事实一个符号,用逻辑符号连接
设:R = 下雨, U = 你有可用伞, W = 你湿了
公式:R ∧ ¬U → W # 精确无歧义
🧱 命题逻辑三件套
1. 语法(造句规则):什么公式合法?
# 原子命题:P, Q, R(大写字母,代表一个基本事实)
# 逻辑连接词:
¬P # 非P(P不成立)
P ∧ Q # P且Q(两个都成立)
P ∨ Q # P或Q(至少一个成立)
P → Q # 如果P则Q(P成立时Q必须成立)
P ↔ Q # P当且仅当Q(要么都成立,要么都不成立)
# 例子:Wumpus规则
# "(1,3)有臭味 当且仅当 它的邻居有怪物"
Stench₁,₃ ↔ (Wumpus₁,₂ ∨ Wumpus₂,₃ ∨ Wumpus₁,₄ ∨ Wumpus₀,₃)
2. 语义(含义解释):公式什么时候为真?
# 真值表:定义每个连接词的意思
P Q | P∧Q P∨Q P→Q P↔Q
--------------------------------
真 真 | 真 真 真 真
真 假 | 假 真 假 假
假 真 | 假 真 真 假
假 假 | 假 假 真 真
# 注意:P→Q 在P为假时恒为真!
# "如果太阳从西边出来,我就是秦始皇" → 真(因为前提假)
# 这叫"空真"(vacuous truth)
3. 知识库:侦探的笔记本
KB = [
# 感知到的
¬Breeze₁,₁, # (1,1)没风
Breeze₂,₁, # (2,1)有风
¬Stench₁,₁, # (1,1)没臭味
Stench₂,₁, # (2,1)有臭味
# 世界规则
Breeze₁,₁ ↔ (P₁,₂ ∨ P₂,₁), # 风来自邻居陷阱
Stench₂,₁ ↔ (W₁,₁ ∨ W₂,₂ ∨ W₃,₁), # 臭味来自邻居怪物
# 常识
¬P₁,₁, # 起点没陷阱
¬W₁,₁, # 起点没怪物
...
]
🔍 推理的核心概念
蕴含:知识库"强迫"某个结论
KB ⊨ α # α是KB的逻辑结论
含义:在任何让KB所有公式为真的情况下,α也必须为真
比喻:破案时,所有证据都指向"凶手是A",那么"凶手是A"就是蕴含的结论
有效性与可满足性
有效性:公式在所有可能情况下都为真(永真式)
例:P ∨ ¬P # "要么下雨,要么不下雨",必然真
可满足性:至少存在一种情况让公式为真
例:P ∧ Q # "下雨且带伞",可能真可能假
矛盾:在任何情况下都为假
例:P ∧ ¬P # "下雨且没下雨",不可能
四、命题定理证明:侦探的推理方法
⚖️ 推断与证明
目标:证明 KB ⊨ α
方法:从KB出发,应用推理规则,一步步推导出α
就像:已知证据链,用法律条文推导出判决
🎯 归结证明法:逻辑"消消乐"
基本思想:否定结论,推出矛盾
要证:KB ⊨ α
方法:
1. 假设 ¬α 成立(否定想证的结论)
2. 把 KB 和 ¬α 都化成"子句形式"
3. 不断做"归结"(resolution):找互补文字消掉
4. 如果推出空子句(□),说明假设¬α导致矛盾 → 原结论α成立!
什么是子句?
子句 = 多个文字的或(∨)
例:¬P ∨ Q ∨ R # "P假,或Q真,或R真"
文字 = 原子命题或其否定
归结规则:消消乐玩法
规则:如果有两个子句:
(P ∨ Q) # 第一个说"P或Q"
(¬P ∨ R) # 第二个说"非P或R"
归结得:(Q ∨ R) # 消掉P,合并剩下部分
逻辑:要么P真(则R真),要么P假(则Q真) → 总之Q或R至少一个真
🌰 归结证明实例(书上图9-10简化)
已知:
1. American(West) # 韦斯特是美国人
2. Weapon(M1) # M1是武器
3. Sells(West, M1, Nono) # 韦斯特卖M1给诺诺
4. Hostile(Nono) # 诺诺是敌对的
5. ∀x∀y(American(x)∧Weapon(y)∧Sells(x,y,z)∧Hostile(z)→Criminal(x))
# "美国人卖武器给敌国的人是罪犯"
要证:Criminal(West) # 韦斯特是罪犯
归结过程(简化版):
1. 把规则5转化成子句:¬American(x)∨¬Weapon(y)∨¬Sells(x,y,z)∨¬Hostile(z)∨Criminal(x)
2. 假设结论假:¬Criminal(West)
3. 不断归结,最终推出空子句□ → 矛盾!所以原结论成立。
🔗 前向链接与反向链接
前向链接:从已知事实往前推
就像"已知线索,推所有可能结论"
已知:A, B, A→C, B∧C→D
推导:
第1步:由A和A→C得C
第2步:由B和C得B∧C
第3步:由B∧C和B∧C→D得D
结果:知道D成立
适用:数据驱动,感知到新事实就触发推导
反向链接:从目标往回找证据
就像"为了证明结论,找需要什么前提"
要证:D
查规则:要D成立需要B∧C成立
要证B:已知B成立 ✓
要证C:需要A成立(因为A→C)
要证A:已知A成立 ✓
结果:所有前提都满足 → D成立
适用:目标驱动,回答特定查询时高效
霍恩子句:让推理更高效的特例
形式:至多有一个正文字的析取式
例:¬P ∨ ¬Q ∨ R # 等价于 P∧Q→R
¬P ∨ ¬Q # 等价于 P∧Q→False
P # 单个正文字
好处:前向/反向链接在线性时间内完成
现实:很多实际问题都能用霍恩子句表达
五、高效命题模型检验
🔍 当推理不够用时:直接"暴力枚举"
有时规则太复杂,推理链太长
干脆:列出所有可能情况(模型),检查哪些情况让KB为真,再看α是否在其中
🧠 三种模型检验算法
1. DPLL算法:聪明的暴力枚举
def DPLL(子句集合, 赋值):
if 所有子句满足: return True
if 有子句不满足: return False
# 启发式1:纯符号(pure symbol)
# 如果某个文字在所有子句中都以同一种形式出现
# 例:P只以¬P出现,没有P → 直接设P=False
# 启发式2:单元子句(unit clause)
# 如果某子句只剩一个文字未赋值
# 例:(P∨¬Q)中Q已真,只剩P → 必须设P=True才能满足
# 递归尝试赋值
选一个未赋值的变量V
return DPLL(赋值∪{V=True}) or DPLL(赋值∪{V=False})
2. 爬山算法:局部搜索
随机给所有变量赋值
while 不满足所有子句:
选一个不满足的子句
翻转其中一个变量值,看能否减少不满足子句数
选最优的翻转
像:调收音机找信号,微调旋钮直到清晰
3. 模拟退火:避免局部最优
允许有时"往坏处走"(以一定概率接受更差的解)
随着时间降低接受概率
像:和面时开始大力摔打(允许变差),最后轻柔整理(只接受变好)
六、基于命题逻辑的智能体实现
🔧 用命题逻辑构建Wumpus智能体
1. 跟踪当前状态
变量:L₁,₁, L₁,₂, ... # 每个格子是否有活物
B₁,₁, B₁,₂, ... # 每个格子是否有风
S₁,₁, S₁,₂, ... # 每个格子是否有臭味
规则:B₁,₁ ↔ (P₁,₂ ∨ P₂,₁) # 风来自邻居陷阱
2. 逻辑状态估计
每走一步,感知新信息
更新知识库
问知识库:P₂,₂? # (2,2)有陷阱吗?
如果KB ⊨ P₂,₂,则确定有陷阱
如果KB ⊨ ¬P₂,₂,则确定安全
如果都不蕴含,则未知
3. 用命题推断做规划
目标:G₃,₃为真(金子位置)
可用动作:Forward, TurnLeft, TurnRight, Shoot, Grab, Climb
规划:
确保安全:¬P₂,₂ ∧ ¬W₂,₂
路径可达:L₁,₁ → (Forward → L₂,₁) # 从(1,1)向前到(2,1)
最终:在(3,3)执行Grab
4. 混合智能体:逻辑+其他
用逻辑推理安全区域
用搜索算法(第3章)在安全区域内找路径
用效用理论(第16章)权衡风险收益
🧠 第7章思维升华
逻辑智能体的核心价值
- 弥补感官不足:眼睛看不到怪物,但鼻子闻到臭味+逻辑推理 = 知道怪物在哪
- 内部一致性:不会做出矛盾决策(既去东又去西)
- 可解释性:决策过程像侦探推理,有迹可循(不像神经网络黑箱)
命题逻辑的局限性
- 啰嗦:n×n网格需要O(n²)个变量
- 不能表达"有些":"所有陷阱都有风"容易,"有些陷阱没风"难
- 不能量化:"至少有一个怪物"需要枚举所有格子
(这就是为什么需要第8章"一阶逻辑":可以表达"存在x使得..."、"对所有y...")
从矿工到侦探的转变
- 第2-4章智能体:凭直觉/搜索行动(像新手矿工)
- 第7章智能体:记录证据、推理规律、谨慎决策(像福尔摩斯探矿)
最后一句大实话 :
命题逻辑像"乐高基础块"------能搭任何东西,但搭大城堡需要太多小块。
生活中我们常用模糊推理:"大概率是..."而不是"100%是..."。
但当你需要绝对严谨时(法律合同、程序验证),逻辑就是你的铁甲。