《人工智能现代方法(第4版)》 第7章 逻辑智能体 学习笔记

🎯 本章要解决什么?让智能体学会"用证据说话"

想象以下场景:

  • 你妈怀疑你偷玩游戏:"路由器灯在闪!你手机发烫!你眼神躲闪!→ 你肯定在玩!"
  • 中医看病:"舌苔厚、脉象沉、面色黄 → 湿气重"
  • 破案片侦探:"门锁没坏、贵重物没丢、熟人作案 → 凶手是..."

这些都是逻辑推理!本章要教智能体: 当你的"眼睛"(传感器)看不到全部真相时,如何用"脑子"(推理)补全信息,做出正确决策。


一、基于知识的智能体:不做"无脑莽夫"

🧠 核心升级:从"反射弧"到"动脑子"

智能体类型 决策依据 人类比喻 缺点
反射型(第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. 部分可观测:只能看到当前格和相邻格的提示
  2. 需要推理:"这里有臭味,说明相邻四格中至少一格有怪物"
  3. 有逻辑结构:可以用逻辑公式精确描述规则

🎮 推理过程演示

复制代码
你开局在(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章思维升华

逻辑智能体的核心价值

  1. 弥补感官不足:眼睛看不到怪物,但鼻子闻到臭味+逻辑推理 = 知道怪物在哪
  2. 内部一致性:不会做出矛盾决策(既去东又去西)
  3. 可解释性:决策过程像侦探推理,有迹可循(不像神经网络黑箱)

命题逻辑的局限性

  • 啰嗦:n×n网格需要O(n²)个变量
  • 不能表达"有些":"所有陷阱都有风"容易,"有些陷阱没风"难
  • 不能量化:"至少有一个怪物"需要枚举所有格子

这就是为什么需要第8章"一阶逻辑":可以表达"存在x使得..."、"对所有y...")

从矿工到侦探的转变

  • 第2-4章智能体:凭直觉/搜索行动(像新手矿工)
  • 第7章智能体:记录证据、推理规律、谨慎决策(像福尔摩斯探矿)

最后一句大实话
命题逻辑像"乐高基础块"------能搭任何东西,但搭大城堡需要太多小块。
生活中我们常用模糊推理:"大概率是..."而不是"100%是..."。
但当你需要绝对严谨时(法律合同、程序验证),逻辑就是你的铁甲。

相关推荐
陈广亮9 分钟前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬18 分钟前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia1 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区1 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两4 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
前端付豪4 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
strayCat232554 小时前
Clawdbot 源码解读 7: 扩展机制
人工智能·开源
王鑫星4 小时前
SWE-bench 首次突破 80%:Claude Opus 4.5 发布,Anthropic 的野心不止于写代码
人工智能
lnix4 小时前
当“大龙虾”养在本地:我们离“反SaaS”的AI未来还有多远?
人工智能·aigc