视频封面

视频元信息

  • 课程:MIT 6.001 SICP(1986 原版)
  • 本讲主题:符号微分(Symbolic Differentiation)与引用(Quotation)
  • 时长:约 40 分钟

内容摘要(TL;DR)

本讲从"程序即规则"的抽象思想切入,讲解如何用 Lisp 的列表结构表示代数表达式,并编写一个符号微分程序。核心在于:微分规则是"归约规则",天然适合递归;而积分方向则因规则多重匹配、表达式膨胀而难以机械实现。课程后半段引入引用(quote)这一关键概念,解释"谈论表达式本身"与"求值表达式"的区别,并指出引用会破坏"等量代换"这一语言基本性质。


一、抽象分层与语言构建思想 [00:19]

理解:本节是上一讲"抽象分层"思想的延续,为符号微分程序的构建提供哲学基础。

  • 核心观点:在问题的每一层分解中,我们实际上是在隐式地解决某一类问题,而不只是当前这一个具体问题。
  • 做法:在每一层细节上构造一种语言,使得这一层所面对的那一类问题的解都能在该语言中被表达。
  • 好处:当问题发生变化时,通常只需要做小的局部修改,而不必重构整个系统。
  • 重点:抽象屏障(Abstraction Barrier) 是控制复杂性的核心武器——把"微分规则"与"表达式的表示"彻底分开。

二、从数值微分到符号微分 [02:46]

  • 上一讲介绍的是数值近似求导:通过函数在两点处的取值差商逼近导数。
  • 本讲转向符号微分:直接操作代数表达式本身,得到精确的导数表达式,而非数值近似。
  • 引用的微积分规则(来自教科书):
    • 常数的导数为 0;
    • 变量对自身的导数为 1;
    • 常数乘以函数的导数 = 常数乘以该函数的导数;
    • 和、积的求导法则等。

思考:数值微分"打开不了函数",只能看到输入输出;符号微分看的是表达式"怎么写",因此是语法现象(syntactic phenomenon)。


三、为什么微分容易而积分难 [04:37]

这是本讲最精彩的分析之一。

  • 微分方向 = 归约方向(reduction):
    • 每条规则左边匹配表达式,右边是导数;
    • 右边含有"导数"的部分,都是左边的真子表达式(proper sub-expression);
    • 大问题被拆成小问题,再合并结果——完美契合递归。
  • 积分方向 = 反向,问题重重:
    • 一个表达式可能同时匹配多条规则,无法确定该走哪条;
    • 表达式在积分方向会不断变大;
    • 没有终止保证,只有偶然的抵消才能结束;
    • 因此积分是复杂的搜索过程,本质上难做。

易错点: 微分与积分互为逆运算、共享同一套规则,但方向性决定了计算复杂度天差地别。这是理解"归约规则"威力的关键案例。


四、编写微分程序:先写规则,后管表示 [06:23]

  • 程序结构:对表达式做分情况分析(case analysis),这是递归的必备起点。
  • 各分支规则:
    • 表达式是常数 → 结果为 0;
    • 表达式就是求导变量 → 结果为 1;
    • 表达式是和 → 各部分导数之和(addend + augend);
    • 表达式是积 → m1·d(m2) + d(m1)·m2。
  • 重点:谓词命名约定——返回真/假的谓词过程名应以问号 ? 结尾(如 sum?、product?)。这只是给人类读代码的约定,Lisp 本身不在乎。
  • 此时程序是"一厢情愿"的:还没定义表达式如何表示。

理解:这正是抽象屏障的体现——先把"规则层"写清楚,表示层可以稍后再定。


五、用列表结构表示代数表达式 [11:00]

  • 关键"双关"(pun):用编写程序的语言本身来表示代数表达式。
  • 例如 (a*x*x + b*x + c) 表示为 (+ (* a (* x x)) (* b x) c)。
  • 这种表示的便利:
    • car 就是运算符;
    • cdr 的各个 car 就是操作数;
    • 无需自己解析,列表结构已经完成了语法分析。

5.1 常数与变量的判定

  • constant?:表达式是原子(atomic)且不等于求导变量。
    • 原子 = 不可再分、没有 car/cdr 的对象;
    • 变量用符号(如 x、y)表示。
  • same-variable?:表达式是原子且与变量相同。

5.2 和与积的构造与选择函数

  • sum?:非原子且 car 为符号 +;
  • make-sum:构造 (list '+ a1 a2);
  • addend = (car (cdr expr)),augend = (car (cdr (cdr expr)));
  • 积同理,运算符符号为 *,选择函数为 multiplier 和 multiplicand。

拓展:car/cdr 名字源于 1958 年 IBM 704 机器的地址寄存器(address register)与减量寄存器(decrement register),是历史遗留。之所以没被 left/right 取代,是因为 Lisp 程序员喜欢电话里念 cadadr 这类连读,比"左的右"更清晰。


六、引用(Quotation):本讲的核心概念 [16:50]

6.1 为什么需要 quote

  • 若直接写 +,程序会去求值它,即寻找 + 这个加法运算符过程;
  • 但我们想问的是:"(car expr) 这个元素是不是符号 +?"
  • 因此需要 (quote +),简写为 '+——表示谈论这个符号本身,而不是它的值。

理解:这类似于自然语言中"说你的名字"与"说,你的名字"的歧义,书面语用引号区分。

6.2 引用带来的深刻问题:指称晦涩语境

  • 等量代换原则:"相等的可以互相替换"——但引用破坏了它。
  • 经典反例:
    • "Chicago" 有 7 个字母;
    • Chicago = 伊利诺伊州最大的城市;
    • 若盲目替换,会得出"伊利诺伊州最大的城市有 7 个字母"——谬误。
  • 原因:引用是指称晦涩(referentially opaque)的典型语境,我们讨论的是词而非词所指的对象。

考点: 引用是"名称与提及(name and mention)"这一两千年哲学问题的操作化体现。加入引用后,语言不能再无条件地"等量代换",必须小心处理。

6.3 学生提问:去掉 quote 会怎样

  • 若去掉 + 前的 quote,程序会去引用 + 所定义的过程;
  • 理论上可以比较过程的同一性,但"比较两个过程是否相同"这一概念本身含义不明,可能毫无意义;
  • 因此我们只比较符号——符号的含义是清晰的。

七、程序的运行结果与"表达式膨胀"问题 [25:30]

  • 输入:f(x) = ax² + bx + c;
  • 输出:一长串"可怕"的表达式,如 x·1 + 1·x、a·(x·1+1·x) + 0·x² + b + 一堆 0;
  • 结果数学上正确,但形式未化简,考试会被扣分。

7.1 为什么会膨胀

  • 过程的形式由局部规则展开而成(呼应前面讲过的斐波那契例子);
  • 程序在表达式的树结构上行走,答案的每一部分都来自问题的某一部分;
  • 唯一的自由度是:某个小表达式是常数还是求导变量,从而产生 0 或 1 的差异;
  • 对 a、b、c 分别求导,表达式形状相同,只是 0 和 1 的位置不同。

思考:这与上一讲有理数运算得到 6/3、3/4 未化简的问题本质相同——规则正确,但结果未简化。


八、通过改变表示来化简:智能构造器 [28:40]

  • 解决思路(与上一讲一致):改变表示层,在构造器中加入化简步骤。
  • 在抽象屏障下,只需修改 make-sum / make-product,微分规则层完全不动。

8.1 智能 make-sum 的规则

  • 若 a1 和 a2 都是数字 → 直接相加返回数字;
  • 若 a1 是数字且为 0 → 返回 a2;
  • 若 a2 是数字且为 0 → 返回 a1;
  • 否则才构造 (list '+ a1 a2)。
  • make-product 同理(乘 0 得 0,乘 1 得自身,双数字直接相乘)。

8.2 改进后的效果

  • f(x) = ax² + bx + c 的导数直接得到 2ax + b;
  • 对 a 求导得 x·x(即 x²),对 b 求导得 x,对 c 求导得 1;
  • 结果已相当理想,考试最多扣 1/4 分。

拓展:完整的代数化简(合并同类项等)极其复杂。MIT 开发的著名系统 Macsyma/Maxima 就是约 5000 页的列表代码,其中大部分是代数化简操作。


九、总结:引用带来的威力与风险 [36:00]

  • 本讲真正的主线不只是"写一个微分程序",而是:
    • 用抽象语法而非具体语法来操作表达式;
    • 利用抽象屏障控制表达式的构造;
    • 表示与语言本身同构,从而必须引入 quote。
  • 因为语言能书写"谈论语言自身表达式"的表达式,所以需要 quote 来区分"谈论"与"求值"。
  • 拥有这种能力后,可以在语言之上层层构建更强大的语言,甚至解释完全不同的语言。

重点: 引用让我们跨过了一条关键界线,获得了巨大威力——但也因此必须谨慎。正如讲师所言:"我们已经造好了大锤,必须小心选择要敲的苍蝇。"


关键标签 / 关键词

SICP 符号微分 符号求导 引用 quotation quote 抽象屏障 抽象语法 列表结构 Lisp car/cdr 归约规则 递归 积分难题 表达式化简 智能构造器 指称晦涩 name and mention Macsyma MIT 6.001


生成时间:2026-10-11 17:00:51 生成平台:VideoNote www.xygy.top