本书讲一门学问:范畴论——它研究的不是任何一类具体的数学对象,而是「对象与对象之间如何相处」。一定见过这样的场景:线性代数讲「积」,群论讲「直积」,拓扑讲「乘积空间」,集合论讲「笛卡儿积」——名字里都有「积」,构造却各写一遍。范畴论的回答干脆利落:这些「积」是同一个东西的不同读法——都用「一对投影的万有性」来定义,一次定义,处处生效。它带来一串朴素而深刻的问题:为什么「商群」「商空间」「商集」也是同一个构造?为什么「自由群」「自由模」「自由么半群」的构造法完全平行?为什么两个数学对象「一样」竟有不同的严格含义(同构与等价)?为什么说一个对象「是什么」不如说它「与别的东西如何相处」?从 Eilenberg 与 Mac Lane 1945 年的奠基论文〈范畴、函子与自然变换〉,到 Yoneda 引理与伴随函子定理,再到单子理论、拓扑斯与高阶范畴,范畴论八十年只做一件事:把「由关系定义对象」变成一门精确的学问。
本书按章组织:绪论从「每门课都在重复什么」讲起,说清范畴论关心什么、箭头的眼光从何而来;第一章立稳语言的骨架——范畴的定义、例子巡礼、同构与等价、单态射与满态射、始终对象与对偶原理;第二章让范畴之间架起桥——函子、自然变换、自然同构、切片范畴、可表函子与 Yoneda 引理;第三章登第一座主峰——泛性质与极限,积、余积、等化子、拉回、核与余核、指数对象统一为一个句法;第四章请出全册的心脏——伴随函子,自由与遗忘的辩证、单位与余单位、三角等式与伴随函子定理;第五章进入结构的自我生成——幺半范畴、单子、Eilenberg–Moore 与 Kleisli 范畴、伴随单子定理;第六章望向思想的地平线——逻辑即范畴、Curry–Howard 对应、拓扑斯、Lambek 演算与结构主义哲学;综合站用年表、人物谱、方法决策树、两个综合实验与二十四题自查收束全书。
写作的三条约束(本书的自我要求)。① 直觉与例子先行:每一个概念都从一张图、一个具体的小例子讲起——先看见 Set 中两个集合的积怎样「被投影唯一刻划」、自由群怎样「把字母排队再加约简」、列表单子怎样「把副作用装进盒子」,再抽成定义。② 一步一图:凡能画的都画——范畴的箭头图、泛性质的投标图、伴随的三角桥、单子的平方与代数、Lambek 演算的箭头推导。范畴论最迷人的地方,正藏在「同一个定义在不同范畴里长出不同面孔」这条线索里。③ 自给自足:所需工具在书内随用随补——集合与映射、群与环的最基本常识、线性代数的对偶观念、一点拓扑与偏序集,都在需要它的那一页现学现用,不假设手边另有教材。个别深刻的整体性结论(伴随函子定理、伴随单子定理、拓扑斯的公理化、高阶范畴的存在性)给出精确陈述、证明思路与文献指引,数值与程序对拍在实验页随附。
页型节奏。每章以 导引 开篇(一页说清这一章要解决什么);主体是 讲义 页(概念、定理、证明,一步一图);每章配 例题 与 习题 各两页(先示范再放手)、知识地图 一页(本章概念怎么连成网)、小结 两页(正面清单+易错清单)、思想卡(一句话立起本章的哲学)、挑战(一道通向文献的硬题)、实验(一段可复算的程序)、格物札记(中国算学传统里的平行直觉)、速查表(本章公式与记号一页备翻);章末另设 衔接讲义,把下一章的问题提前立起来。所有编号 可跳读:每一页都自带上下文,随手翻开一页也能读下去。
假设已修过几门数学课:微积分、线性代数、抽象代数、一点拓扑。回过头看,可以撞见一个奇怪的事实——每门课的开头几乎都在讲同一件事。集合论说:集合之间有映射,映射可以复合;抽象代数说:群之间有同态,同态可以复合;拓扑学说:空间之间有连续映射,也可以复合;就连线性代数,讲的也是线性空间之间的线性映射及其复合。
同一个句式重复了四遍、五遍、十遍。数学家对这种重复有一种职业敏感:凡是反复出现的模式,背后必有一个统一的结构。1942–1945 年,Eilenberg 与 Mac Lane 把这个结构正式写了出来:把每门课里的「对象」(集合、群、空间)与「箭头」(映射、同态、连续映射)一起收进同一个定义,命名为——范畴。
读法建议:本书按「章」推进——第一、二章搭起范畴与函子的公理骨架,第三章练成泛性质与极限的方法,第四、五章抵达伴随与单子的高地,第六章全章讨论范畴论给认识论、语言学与哲学的三重启发。若时间有限,读绪论、第一、二章的定义与 Yoneda、第六章全章即可把握主脉。
一句话直觉。范畴论是「关于数学的数学」:它不研究某一种具体的数学对象,而研究所有数学分支共同使用的结构模式——对象、箭头、复合。就像语法书不写小说,却说明了一切小说为什么会通顺。
范畴论(category theory)。以范畴为基本研究对象,以函子比较不同的范畴,以自然变换比较不同的函子。它的方法论信条是:一个数学对象重要与否,取决于它与其他对象的关系;一个定义优雅与否,取决于它是否只用箭头说出。
这门学问在数学里的位置,可以拿两样东西打比方。第一样是化学的周期表:门捷列夫不研究某一种化合物的具体性质,他排出了所有元素的位置,于是新元素还没被发现,表格里已为它留好了格子。范畴论对「结构」做的事与此相同——极限、伴随、单子这些概念一旦定义,会在群论、拓扑、逻辑、计算机科学里反复撞见它们,仿佛早已预约。
第二样是元语言:语言学家用一套语言去描述另一套语言,逻辑学家用元逻辑去证明某条公理系统的相容性。范畴论是数学的元语言——它的词汇(对象、态射、泛性质)足够抽象,因此足以谈论任何数学分支;又足够严格,因此谈论的每一句都可证明。1945 年 Eilenberg 与 Mac Lane 的奠基论文里,这个「元」的野心已经写在标题中:General Theory of Natural Equivalences(自然等价的一般理论)。
需要立刻打一剂预防针:范畴论的名声之一是「抽象」。但抽象在这里不是逃避具体,而是对具体的极致尊重——正因为把所有无关细节(元素是什么、集合多大、空间几维)统统扔掉,那些真正跨分支存活下来的性质才第一次显形。这与 Euler 处理七桥问题的方式一脉相承:扔掉桥的长短宽窄,只留「谁连谁」;范畴论扔得更彻底——连「对象内部有什么」都扔掉,只留箭头。
一册之约:本册将遵守一条纪律——凡能只用箭头说的定义,绝不偷用元素。这不是苦行,而是范畴论全部力量的来源。
范畴论的历史不足百年,却完成了从「代数拓扑的工具」到「数学的公共基础设施」再到「照见思想的镜子」三级跳。路线如下。
第一阶段:工具时代(1942–1957)。范畴诞生时身份卑微——Eilenberg 与 Mac Lane 只想给代数拓扑的「自然同构」一个严格定义,为此不得不先定义函子,又不得不先定义范畴。他们谨慎地预言这些概念「不应被过度使用」,历史很快开了玩笑:这三层概念成了二十世纪下半叶数学的主干语言。
第二阶段:公理时代(1957–1971)。Grothendieck 用 Abelian 范畴重写同调代数(相邻领域的主题正是从这里展开),Kan 发现伴随函子,Lawvere 提出用范畴公理替代集合论公理(ETCS,见第六章),Tierney 与之合作完成拓扑斯理论——逻辑学的「真值」本身可以被范畴化。
第三阶段:跨界时代(1958 至今)。Lambek 1958 年的句法演算把句子结构写成箭头的复合,Montague 把语义做成模型论,2010 年起 Coecke 等人的 DisCoCat 把二者合流并接上量子计算;Moggi 与 Wadler 把单子引入程序语言,今天 Haskell 程序员每天都在使用范畴论。第六章将逐一检视这些「数学之外的战果」。
传统数学如何看待一个集合?把它打开:看里面装了哪些元素。范畴论提议换一种眼光:不打开,只看它与世界之间的箭头。这个转变小得像一个动作,大得像一次世界观革命。
先看一个例子。两个集合什么时候「一样」?传统答案:存在元素之间的双射。范畴论的答案:可以完全不用元素——两个集合同构,当且仅当「从任何集合射向它们的箭头总是一样多」。换句话说,同构这件事可以只凭箭头判定。这不是换汤不换药:在群、拓扑空间这些范畴里,「元素」往往不好用(拓扑空间的点太多了、群的元素带有运算约束),而箭头永远好用。
结构主义(structuralism)的原则。数学对象没有「内在的 identity」,它是它在结构中所处的位置、与其它对象发生的关系的总和。同一结构中的两个「复本」(同构的对象)不必区分——这句话在范畴论中有精确的表述与证明(第一、二章「同构与等价」一节)。
哲学家会立刻认出这句话的家族相似:莱布尼茨说「没有两个完全不可区分的事物」(同一不可区分原则),结构主义者说「可区分者皆结构」。范畴论的独特贡献是:它把这句哲学口号变成了可证明的定理。这种「哲学直觉 → 数学定理」的转化将在第六章反复出现,也是本书点题的方向——范畴论对认识论、语言学与哲学的三重启发,源头都在这一页的「换眼」动作里。
一个测试:以后每遇到一个新定义,先问「它用了元素吗?」——若答案为是,试着只用箭头重写它。本册第三章将把这个游戏玩到极致(泛性质)。
范畴论的门槛不高,但需要四样工具趁手。本页集中检点,后文随取随用。
其一,集合与映射。记号从简:f: A → B 表示从 A 到 B 的映射,idA 表示恒等映射,复合写作 g ∘ f(先 f 后 g)。复合满足结合律 h ∘ (g ∘ f) = (h ∘ g) ∘ f——这条律,它即将升格为「范畴的公理」。
其二,映射的三种品格。单射(不撞车)、满射(全覆盖)、双射(一一对应)。双射即集合的同构。范畴论的第一个惊喜:单、满这两种品格也完全可以用「箭头的可 cancellation 性」重新刻画(第一、二章「单态射与满态射」一节),从而推广到没有元素的范畴。
其三,关系与等价。集合 A 上的二元关系 ~ 若自反、对称、传递,则称等价关系;等价类可以拼成商集 A/~。等价关系是「同一性」的数学化身——「在什么意义上两样东西算一样」,是贯穿本书的哲学暗线(第六章「同一性与 up to iso」专门回收)。
其四,序。自反、反对称、传递的二元关系称偏序;任意两元素可比的偏序称全序。偏序集(如数的整除关系、集合的包含关系)将为范畴论贡献最极简的例子——「薄范畴」:每个 Hom 集至多一个箭头,命题的真假推理本身就是一张箭头图。
| 工具 | 要义 | 在本书中的角色 |
|---|---|---|
| 映射与复合 | g ∘ f 可结合,id 为单位 | 范畴定义的两条公理的原型 |
| 单射·满射·双射 | 品格可用「消去律」刻画 | 单态射、满态射、同构(第一、二章) |
| 等价关系与商 | 把「视为相同」形式化 | 同构 / 等价 / 局部化的原型 |
| 偏序与全序 | 每对箭头至多一条的范畴 | 薄范畴、Galois 连接(第四、五章) |
若以上任何一项已生疏,不影响主线阅读——本书每用到一处工具,都会在原地给足说明。
范畴论的正式诞生在 1945 年的纽约,但它关怀的两个问题——如何按结构分类、如何由复合生新——在中国思想传统里有极早、极深的回响。
「类」:《墨经》的分类学。战国《墨经》提出「故、理、类」三物:「以故生,以理长,以类行」——论证凭理由展开,推理循条理延伸,而贯穿三者的钥匙是「类」:同类方可相推,异类须察其界。《墨经》又言「同异交得」:同与异在比较中生义,不在孤立中显形。这与范畴论的立场惊人地一致——对象在同类的网络中获得意义;也与我们第 5 页的结构主义遥相呼应:先有类(结构),后有物(个体)。
「术」:算法即箭头的复合。《九章算术》的每道「术」都是从已知量到未知量的一条程序:今有粟三斛,欲为粝饭,以「粟米术」化之;再求酒,又以一术继之——上一术的输出恰是下一术的输入,术与术可以串联复合。这正是范畴论眼里态射的复合:箭头必须首尾相接,复合满足结合律。刘徽注《九章》,更是把「率」作为贯穿诸术的枢纽——关系(率)先行,数值随后(第三章札记专述)。
珠算:口诀即复合的口诀化。程大位《算法统宗》的归除口诀「二一添作五,逢二进成十」——每句口诀是一个原子操作,连续念诵口诀,就是把原子操作依序复合。第一、二章札记将把这一观察精确化:《九章》之术即态射,珠算口诀链即复合律的民间形式。中国数学「重术」的传统常被误读为「轻理」;以范畴之眼重看,术正是箭头,术之链正是结构。
本册是 K2C 正文 C 段的一册,与姊妹诸册的分工如下。会认得其中三个概念的雏形(模范畴、函子与正合性);没读过的也完全无碍——本册自足,所有需要的背景都在绪论与第一、二章内备齐。
第一、二章「范畴与函子」:公理骨架。范畴定义、四大例子巡礼(Set、Grp、Top、Vec 加偏序集)、对偶原理、单态射与满态射、函子三层级(函子 / 自然变换 / 函子范畴),以 Yoneda 引理压轴——它是「关系即本质」的定理形式,全书第一根支柱。
第三章「泛性质与极限」:方法论。把「只用箭头下定义」练成体系:始与终、积与余积、等化子、拉回与推出,收拢为极限与余极限;指数对象与 Cartesian 闭范畴为第六章的逻辑篇埋线。方法论承诺:凡万有者必本质上唯一。
第四、五章「伴随与单子」:理论高地。伴随是范畴论最重要的单一定理——自由与遗忘的辩证、Galois 连接、右伴随保持极限;幺半范畴与张量积;单子把「结构来自复合」落成列表、Maybe、闭包等可执行的程序构造。
第六章「范畴、语言与思想」:本册的特色章,全章回答一个超越数学的问题——范畴论给人类思想带来了什么?分三线推进。语言学:Lambek 演算把句法做成范畴、组合语义把意义做成函子、DisCoCat 把文法接上计算;认识论:结构主义如何回答「数学对象是什么」、Yoneda 如何把「认识即知关系」变成定理、不变性如何重塑「客观性」;哲学:ETCS 与集合论基础之争、三大流派(柏拉图主义、形式主义、结构实在论)在范畴论视野下的重排、「up to iso」的世界观。
三重启发不是附录,而是正文的一半灵魂:前五章蓄水,第六章发电。绪论各页已为它们预留了伏笔——读到时「第六章回收」的标记。
全书 198 页的地形如下:一条明线(从箭头到思想)贯穿六章,一条暗线(结构先于个体)由绪论埋下、第六章收束;两根定理支柱(Yoneda、伴随)分别在第一、二章与第四、五章铸成;综合站收拢全景。
阅读的三条推荐路径:主线(全书顺序读,约一学期);思想线(绪论 → 第一、二章 Yoneda → 第六章全章,适合哲学与语言学背景的,数学细节可缓);计算线(绪论 → 第一、二章函子层 → 第四、五章单子 → 综合实验二,适合计算机背景的)。三条线殊途同归于同一句结语:结构先于个体。
站在地面看一座城市,看到的是一条条街道、一栋栋房子;坐上飞机俯瞰,看到的是街区之间的连接——环路如何串起新区,地铁线如何穿过老城。城市没有变,眼光变了,结构就显形了。
本章为全部数学拍这样一张航拍图。地面上,见过集合、群、拓扑空间、向量空间——每个分支有自己的对象、自己的映射、自己的公理;升到空中,它们都是同一样东西:一批对象,对象之间的一些箭头,箭头可以首尾相接。这个统一视角就叫范畴;而把一张地图叠到另一张地图上的对照关系,叫函子;函子之间的对照,叫自然变换——三层结构层层相套,构成本章的主楼梯。
本章路线:先立范畴的公理(两页定义、四页例子巡礼),再升第一层——函子;再升第二层——自然变换;然后两件利器登场:可表函子与Yoneda 引理(本章压轴,也是全书的支点)。章末各页照例:例题、习题、地图、小结、思想卡、挑战、实验、札记、速查。
一句话直觉。一个范畴就是一张有向箭头图,规则只有两条:箭头能接着走(复合),每处原地有不动箭头(单位元)。
范畴(category)。一个范畴 C 由以下数据组成:
① 一个对象类 Ob(C);② 对每对对象 A, B,一个态射集 Hom(A,B)(元素画成箭头 f: A → B);③ 复合运算 ∘:f: A → B 与 g: B → C 给出 g ∘ f: A → C;④ 每个对象 A 有单位态射 idA: A → A。它们须满足两条公理:
(结合律)h ∘ (g ∘ f) = (h ∘ g) ∘ f;(单位律)idB ∘ f = f = f ∘ idA。
注意定义里没有任何关于「元素」的话:对象可以不是集合,态射可以不是映射;要求的只是「箭头可接、接法规矩」。这种刻意的贫乏,正是它后来富有的原因——凡是满足两条公理的结构,范畴论的全部定理对它自动生效。
两条公理早已见过千百次:映射的复合满足它们,同态的复合满足它们,矩阵乘法也满足它们——这不是巧合,而是「它们都是某个范畴里的箭头」的第一声回响。
定义的价值要靠例子兑现。四大「实体范畴」登场——它们对象不同、箭头不同,但公理一字不差。
| 范畴 | 对象 | 态射 | 复合与单位 |
|---|---|---|---|
| Set | 集合 | 映射 | 通常复合;恒等映射 |
| Grp | 群 | 群同态 | 映射复合;恒同同态 |
| Top | 拓扑空间 | 连续映射 | 映射复合;恒同(连续) |
| Vec | 线性空间 | 线性映射 | 映射复合;恒等线性映射 |
逐行过一遍公理的「验票口」:Set——映射复合结合律是第 6 页的旧知识;Grp——两个同态的复合仍保结构(φ(ab) = φ(a)φ(b) 与 ψ 的同类等式串起来即可),结合律继承自集合层面;Top——连续映射的复合连续(ε–δ 或开集原像的旧题);Vec——线性映射的复合线性。四个范畴,「对象 + 保结构箭头」句式完全同构(绪论第 2 页的预告在此兑现)。
值得停下来想一秒的是 Top:连续映射的复合连续,这条在分析课里用了一学期的事实,在这里的角色只是验票——保证 Top 配得上「范畴」这个名字。范畴论把每门课的入场手续变成统一的仪式。
以后每遇一个新结构,先问两句:它的对象是什么?它的箭头是什么?——答案落进范畴定义的那一刻,全书积累的定理即刻为所用。
实体范畴之外,还有两个「瘦削」的例子——它们把范畴定义的弹性发挥到极致。
偏序集是范畴。设 (P, ≤) 为偏序集。造范畴 P 如下:对象=P 的元素;Hom(x,y) 在 x ≤ y 时取单点集 {∗},否则取空集。复合由「x ≤ y ≤ z ⟹ x ≤ z」(传递性)给出,单位元由自反性给出。两条公理自动成立——因为每对对象之间至多一条箭头,「怎么复合」没有第二种选择。
这样的范畴称薄范畴(thin category)。在薄范畴里,范畴论的命题全部退化为序论的命题:同构=元素相等(x ≤ y 且 y ≤ x,即反对称);「始对象」将是序论的最小元,「终对象」是最大元(第 17 页兑现);第四、五章的 Galois 连接,正是两个偏序集之间的一对特殊函子。序论曾经学过的每句话,都会在范畴论里找到它的「原型」。
幺半群是单对象范畴。设 (M, ·, e) 为幺半群(有单位元的半群)。造范畴 M:只有一个对象 ∗;Hom(∗,∗) = M——每个元素 m ∈ M 就是一条 ∗ 到自身的箭头;复合=幺半群乘法,单位元=e。结合律即幺半群结合律,一条不差。
反之,任何单对象范畴恰是一个幺半群。「范畴」同时推广了「偏序集」与「幺半群」:前者是每对对象至多一条箭头(序结构),后者是只有一个对象(代数结构)——两个看似无关的本科概念,原来是同一张蓝图的两块剪影。
把「同一种公理、不同贫富」排成谱系:幺半群(1 个对象)— 群范畴(对象多、箭头丰富)— 偏序集(箭头至多一条)— 离散范畴(只有单位箭头)。范畴论的定理在整条谱系上同时成立,这正是「抽象的力量」的兑现处。
范畴论有一种别处罕见的「买一送一」:每证明一个定理,免费获赠另一个定理。这份赠品的名字叫对偶原理。
反范畴(opposite category)。对范畴 C,其反范畴 Cop 定义为:对象与 C 相同;态射 fop: B → A 对应 C 中的 f: A → B——箭头全体调头;复合相应翻转:fop ∘ gop = (g ∘ f)op。
验证两条公理:结合律——hop ∘ (gop ∘ fop) = hop ∘ (f ∘ g)op = ((f ∘ g) ∘ h)op = (f ∘ (g ∘ h))op = (g ∘ h)op ∘ fop,与 C 中的结合律是同一句话的正反读法;单位律平凡。两次翻转复原:(Cop)op = C。
对偶原理。设 P 是一条只由「对象、态射、复合、单位」表述的命题。若 P 对一切范畴成立,则把 P 中所有箭头调头(即把 C 换成 Cop)所得的对偶命题 Pop 也对一切范畴成立。∎
证明只需一行:对一切范畴成立的命题,当然对一切 Cop 成立;而 Cop 中的 P 读出来恰是 C 中的 Pop。便宜归便宜,后果深远——比如「单态射」与「满态射」(第 16 页)、「始对象」与「终对象」(第 17 页)、「积」与「余积」(第三章)都是彼此的对偶:证明了一个,另一个不用再证。
使用对偶原理有一门小手艺:并非所有命题都有漂亮的镜像(「一切范畴有单位元」的对偶是它自己)。判别法:命题里出现「从……出发」之类的方向词,翻转后往往换一个概念的名字。本册对偶概念将成对出现,留意每对定义的「免费」标记。
「一样」有两档强度,先看弱的一档——对象层面的同构。
同构(态射层面)。f: A → B 称为同构,若存在 g: B → A 使 g ∘ f = idA 且 f ∘ g = idB。记作 A ≅ B。逆若存在必唯一:若 g, g' 都是逆,则 g = g ∘ id = g ∘ f ∘ g' = id ∘ g' = g'——只用结合律与单位律,这是范畴论式证明的第一次亮相。
在四大实体范畴里,同构就是老朋友:Set 中的双射、Grp 中的群同构、Top 中的同胚、Vec 中的线性同构——「保结构 + 可逆」在箭头语言里的统一表达。
再升一档,看范畴之间的「一样」。这需要函子(第 41 页),此处先给结论以供回望:
范畴的等价。函子 F: C → D 是范畴等价,若它(i)全忠实:每对 A,B,映射 Hom(A,B) → Hom(FA,FB) 是双射;(ii)本质满:每个 D-对象都同构于某个 FA。等价允许「漏掉同构的复本」——它数的是结构类,不是对象。
一个立竿见影的例子:设 vFd 为有限维线性空间范畴。任取维数 n,一切 n 维空间彼此同构;于是 vFd 在等价意义下的「清单」就是自然数集 0, 1, 2, …——这份去重后的清单称为骨架。vFd 与它的骨架范畴等价,却不同构(对象个数都对不上)。范畴论关心等价远胜于同构,这是它与集合论气质最深的分歧之一,也是第六章「up to iso」世界观的数学根。
一句话记忆:同构问「逐个对象能否配对」,等价问「结构类是否穷尽」。序论里已经用过等价的眼光——「偏序集的同构型」数的就是骨架,不是标记。
「单射」「满射」是元素语言的孩子;范畴论用消去律给它们换了箭头语言的父母。
单态射(monomorphism)。m: A → B 称为单态射,若对一切 g,h: X → A:m ∘ g = m ∘ h ⟹ g = h(可左消去)。
满态射(epimorphism)。e: A → B 称为满态射,若对一切 g,h: B → X:g ∘ e = h ∘ e ⟹ g = h(可右消去)。
两条定义互为对偶(第 14 页:把箭头调头、mono 换 epi,定义原样成立)——免费定理的机制第一次实战。验票:在 Set 中,设 m 非单射,取 a ≠ a' 同像,令 g,h: X → A 分别把某点送到 a, a'(其余点同值),则 m∘g = m∘h 而 g ≠ h,故单射 ⟹ 单态射;反过来的方向也容易(考察两点域 {0,1})。于是 Set 中单态射=单射、满态射=满射;Grp、Vec 同法验票通过。旧概念在箭头语言里顺利落地。
但箭头语言马上给出一个元素语言给不出的警告:在含幺交换环范畴 CRing 中,自然含入 ℤ → ℚ 是满态射却远非满射——两个环同态若在 ℤ 上相等,因它们必保 1,进而在所有整数上相等;而整数相等则分数四则(同态保逆)逼它们在 ℚ 上也相等。右消去成立,像却薄得很。教训:「满态射」不必「像覆盖全部」;在哪些范畴里两者重合,是需要逐个验票的定理,不是天经地义。
同构 ⟺ 既是单态射又是满态射吗?在 Set 成立;但在一般范畴这是需要条件的——「平衡范畴」的概念将在习题课(二)讨论。箭头语言处处在追问:哪些性质属于「结构」,哪些只是「元素的恩惠」。
范畴论的第一个「泛性质」定义不需要函子,现在就能读——它也是最短的一个。
始对象(initial object)。对象 I 称为始对象,若对每个对象 A,Hom(I,A) 恰有一个元素。
终对象(terminal object)。对象 T 称为终对象,若对每个对象 A,Hom(A,T) 恰有一个元素。
二者互为对偶(把 Hom 的箭头调头)。各自的速记:始=「出发的箭头唯一」,终=「抵达的箭头唯一」。巡礼验票:
| 范畴 | 始对象 | 终对象 |
|---|---|---|
| Set | 空集 ∅(到任何集合的唯一空映射) | 任一单点集 {∗} |
| Grp | 平凡群 {e} | 平凡群 {e} |
| CRing | 整数环 ℤ(保幺同态由像 1 定) | 零环 {0 = 1} |
| 偏序集(作范畴) | 最小元(若有) | 最大元(若有) |
注意 Set 行:始对象到 ∅ 自身有一条箭头(id),恰一条——「空映射」的存在是约定,而范畴语言把这条约定变成了公理的推论。再看 CRing 行:始对象是 ℤ,因为保幺环同态从 ℤ 出发别无选择(1 ↦ 1 逼出全部整数);这个「无选择」将在第 49 页升格为一句漂亮的话——ℤ 表示「取底集」这个函子。
命题(本质唯一)。两个始对象 I, I' 之间必存在唯一同构 I ≅ I'。
证。唯一箭头 f: I → I' 与唯一箭头 g: I' → I 存在;复合 g∘f: I → I 是 Hom(I,I) 的元素,而该集合恰含 idI,故 g∘f = idI;同法 f∘g = idI'。∎
证明只用了「恰有一个」四个字——这就是泛性质的方法论:**不指定对象是谁,只规定它与世界的关系,唯一性自动到账**。第三章的积、余积、极限,全是这台发动机的放大版。
对偶速查:始的对偶是终。「空与全」这对意象在 Set 里最直观——空集什么都给不出(所以从它出发的箭头只能唯一),单点集什么都装不下(所以抵达它的箭头只能唯一)。
一句话直觉。群论研究「元素相乘」,范畴论研究「箭头复合」——把一个群的所有元素看成同一支箭头的复本,乘法就成了复合。这不是比喻,而是精确的数学同构。
定理(群=单对象群胚)。一个群 G 恰等价于一个范畴 BG:BG 只有一个对象 •,其态射集 Hom(•, •) 取为 G 的元素,复合取群乘法,单位态射取单位元 e。每支箭头 g 都有逆箭头 g-1(群公理),这样的范畴称群胚(groupoid);只要求结合律与单位律而不要求逆元,得的是幺半群对应的范畴。
一句话直觉。范畴的公理只谈「箭头可接、接法规矩」,而「箭头全体」本身也要住在一个集合里——这就是 Hom 集合。把态射收进集合,「数箭头」「比较箭头集的大小」这类操作从此合法。
定义(Hom 集与局部小)。范畴 C 称局部小,若每对对象 A, B 的态射全体 HomC(A, B) 构成一个(真)集合。本册默认所论范畴皆局部小。记 End(A) = Hom(A, A)(自同态集),它自带复合乘法与单位元,是一个幺半群——上一页的群胚视角在这里落地。
一句话直觉。交换图是范畴论的「乐谱」:对象是音符,态射是旋律线,「两条路径必落在同一个音」是唯一的演奏规则。
定义(交换图)。一个由对象(顶点)与态射(边)组成的图称交换,若图中任意两个对象之间、沿任何两条有向路径的复合都相等。一个方块交换 = 一条等式 v ∘ f = f′ ∘ u;三角形交换 = h ∘ g = k。复杂的交换图由基本方块拼成,「图中每个方块交换」通常足以推出「整图交换」(拼图定理,1.11 给出典型手法)。
一句话直觉。追图法(diagram chase)= 在交换图上「沿着箭头走路」:想去哪儿,就把已知方块当桥,一步步把元素(或箭头)从起点送到终点。
一句话直觉。「两个范畴一样」有两档严格含义:同构(逐对象逐箭头对上,太苛刻)与等价(允许差一层同构的模糊,数学真正在用的那档)。等价的体检单有三张。
定义(范畴等价)。函子 F: C → D 称范畴等价,若它是忠实的(每对 A, B,Hom 映射单射)、满的(Hom 映射满射)且本质满(每个 D ∈ Ob(D) 同构于某 F(C))。此时记 C ≃ D。存在 G: D → C 与两支自然同构(单位与余单位的影子),使 GF ≅ id、FG ≅ id——「等价 = 带同构余论的逆」将在第二章用自然变换的语言重述。
一句话直觉。同构的对象彼此是复本;把复本扔掉、每类留一件真品,得到的就是骨架——范畴的「压缩包」,解开还是原范畴。
定义与定理(骨架)。范畴 C 的骨架是一个满子范畴 sk(C):每同构类恰含一个对象,且同构仅存在于恒等。包含函子 sk(C) ↪ C 是范畴等价(本质满:每类有代表;忠实·满:态射原样保留)。两范畴等价 ⟺ 它们的骨架同构——等价论由此归约为同构论。
一句话直觉。对偶原理是范畴论的制度性福利:证明一遍,白拿一份。1.4 已见反范畴的定义,本页把它升级成「定理生产线」。
对偶原理。设 P 是一条只由范畴论词汇(对象、态射、复合、Hom、单/满、始/终、积/余积……)写成的命题。若 P 对一切范畴成立,则 P 的对偶命题 P°(把每个词汇换成对偶词汇、箭头全部翻转)也对一切范畴成立。证:P 在 C 中成立 ⟹ P 在 C° 中成立(P 对一切范畴成立);而 C° 中的 P 恰是 C 中的 P° 照镜子。∎
一句话直觉。范畴不多——小数目的对象只撑得起少数几种合法的箭头图。把前几个 n 的范畴一个个列出来,抽象定义立刻变得可以「过目」。
一句话直觉。新语言的错误大多不是「不会算」,而是「拿旧直觉偷换新定义」。本页把第一章最常撞的五面墙钉在一张卡上。
例 1.定义映射 T: Set → Set:T(A) = A × A(有序对集合),T(f) = f × f(逐点作用)。问:T 是函子吗?
解。保复合:(g∘f)×(g∘f) 逐点作用等于先 f×f 再 g×g,即 T(g∘f) = Tg∘Tf;保单位:id×id = idA×A。两律成立,T 是函子。它是「平方」函子,且可表:Hom(2,−)(第 49 页)。∎
例 2.把拓扑空间 X 送到其连通分支集 π0(X),连续映射 f 送到「把每个分支送到其像所在分支」的映射。验证 π0: Top → Set 是函子。
解。关键观察:连续映射把连通集送成连通集,故 f 把整条分支送进同一条分支——定义合法。保复合:先 f 后 g 与直接 g∘f,分支归属一致(「像的像的分支=像的分支」由两步连通性合成);保单位显然。∎(π0 与 π1 是一对:π0 数「块」,π1 数「洞」。)
例 3.在 Set 中,唯一映射 m: ∅ → B 是单态射吗?是满态射吗?
解。单:对任意 g,h: X → ∅——若 X ≠ ∅,Hom(X,∅) = ∅,前提「m∘g = m∘h」空真,结论亦空真;若 X = ∅,则 g = h = id∅。故可左消去,是单态射。满:设 B 非空,取 g,h: B → {0,1} 分别常值 0、常值 1,则 g∘m = h∘m(都定义在空集上)而 g ≠ h——不可右消去,非满态射。∎(「从空出发只有一条路」与「空到非空堵不住别人」:始对象的两副面孔。)
例 4.范畴 Pos(对象=偏序集,态射=单调映射)的始对象与终对象是什么?与「偏序集作为范畴」的最小元、最大元如何区分?
解。始=空偏序集 ∅(到任何偏序集有唯一单调映射——空映射);终=任一单点偏序集 {∗}(任何元素唯一送到 ∗,单调性自动)。而「最小元/最大元」说的是一个偏序集内部(把它当薄范畴看)的始终对象——两个不同层面的同名概念:前者在 Cat 的对象层面提问,后者在薄范畴内部提问。∎(两层范畴的把戏,值得在草稿纸上重演一遍。)
判定类题目的通法:先写清「对象送什么、箭头送什么」,再逐条过两律;单满判定一律回到消去律,始终判定一律回到「恰有一个」。
例 1.完整验证双对偶的自然性:对线性映射 f: V → W,证明 ιW ∘ f = f∗∗ ∘ ιV。
解。两边都是 V → W∗∗ 的映射,逐点验证:对 v ∈ V、φ ∈ W∗,左边 ιW(f(v))(φ) = φ(f(v));右边 f∗∗(ιV(v))(φ),按 f∗(φ) = φ∘f 的双重对偶定义展开 = ιV(v)(f∗(φ)) = (f∗(φ))(v) = φ(f(v))。两缘相等,方块交换。∎(「双重转置不须选基」的每一代都显式写出——自然性从口号变成算术。)
例 2.对幂集函子 P: Set → Set(直接像版,第 42 页),构造自然变换 s: id ⇒ P,并验证。
解。取分量 sA: A → P(A),sA(a) = {a}(单点子集)。自然方块:对 f: A → B,P(f)(sA(a)) = f!({a}) = {f(a)} = sB(f(a)),即 P(f)∘sA = sB∘f。∎(「单点化」对一切映射兼容——又一例「默默用过的自然性」。)
例 3.证明:不存在自然同构 id ⇒ (−)∗(对 vFd 的恒等函子与单对偶函子——后者是反变函子,先把目标换成 (−)∗∘(−)op 使同为协变再谈)。
解。思路演示(完整论证留习题课(二)):若 αV: V → V∗ 自然,考虑 ℝ 与倍乘映射 mλ: ℝ → ℝ(x ↦ λx)。自然方块左缘给出 αℝ(λx) = λ·αℝ(x)(函数空间上以 λ 倍乘),右缘经 mλ∗(同样是倍乘)再算一遍,对 λ = −1 联立两式得 2αℝ(x) = 0,即 αℝ = 0——同构不可能为零,矛盾。∎(技术细节见习题课(二)第 6 题;此处体会「自然性是强到能挡住假同构的约束」。)
构造自然变换的三步流程:① 定分量(每个对象一根映射);② 验自然方块(对一切箭头);③ 若自称「同构」,逐对象验可逆。跳过第②步是初学第一大坑——「一族好映射」不等于「一个自然变换」。
习 1.证明:对象间的同构关系(A ≅ B)是等价关系。自反:id;对称:逆存在且唯一(第 15 页);传递:同构的复合仍是同构,逆为逆的复合(注意次序)。
习 2.证明 mono∘mono = mono、epi∘epi = epi;再举例说明 mono∘epi 不必是单也不必是满。用两次消去律串联;反例可回到 Set 用具体映射凑(如先满后单的「先挤后拉」)。
习 3.在 Set 中证明:满射是满态射。设 e 满、g∘e = h∘e;对 b ∈ B 取原像 a(选择公理),得 g(b) = g(e(a)) = h(e(a)) = h(b)。留意这里用到了选择——第 30 页第 3 题回望此事。
习 4.把「整除关系」的整数集 (ℕ, |) 看成薄范畴:写出其始对象、终对象;并说明「同构」在此范畴中意味着什么。1 整除一切(始);一切整除 0(终——0 被一切整除);反对称:互相整除 ⟹ 相等。
习 5.定义 O: Topop → Set:O(X)=X 的开集族;f: X → Y 送 f−1: O(Y) → O(X)(连续性的定义正是原像开)。验证 O 是(反变)函子,并把它翻成协变函子 O: Topop → Set 的等价说法。原像保并交(分析旧题)+ (g∘f)−1 = f−1∘g−1;「翻成」=第 43 页「反变即 Cop 上的协变」。
习 6.对群 G,构造双射 HomGrp(ℤ, G) ≅ U(G),并说明它对 G 是自然的(即给出 U ≅ Hom(ℤ,−) 的自然同构)。同态由 1 ↦ g 决定(ℤ 由 1 生成,n ↦ gn 是唯一的候选且确为同态);自然性:对同态 φ,两边都把 1 的像送成 φ(g)。
本页六题全部「基本功」——定义直用、无需新思想;目标是在动笔第三章前,把消去律、两律验票、「恰有一个」三个动作练到不假思索。
习 1.设 F: C → Set、α: Hom(A,−) ⇒ F。证明:α 自然当且仅当对一切 f: A → B 有 αB(f) = F(f)(αA(idA))。「拆引线」恒等式(第 50 页证明第②步)的正反两用:必要性令方块中的箭头取 f;充分性把方块两侧分别代入验证。
习 2.证明:在 Set 中,「既是单态射又是满态射」的映射必是双射(即 Set 是平衡范畴)。单态射=单射、满态射=满射(第 16 页+习 3),直接拼接。
习 3.在第 16 页「ℤ → ℚ 是满态射」的证明里,哪一步用到了「同态保逆」?把该步写成显式等式。设 g,h: ℚ → R 在 ℤ 上相等;对 p/q ∈ ℚ(p,q ∈ ℤ),g(p/q)·g(q) = g(p) = h(p) = h(p/q)·h(q),而 g(q) = h(q) 非零可消——「除法」正是保逆。
习 4.构造同构 Set/1 ≅ Set(1 为单点集),并构造等价 Set/({a,b}) ≃ Set × Set。前者:对象 f: X → 1 一一对应集合 X,三角交换自动;后者:逐纤维(a 袋与 b 袋)拆分与合并,单调映射=逐纤维映射。
习 5.证明 (−)op: Cat → Cat 是函子:F: C → D 应如何送出 Fop: Cop → Dop?两律如何过?对象不动、箭头 f 送 Ff 再调头;保复合要验 F(g∘f)op = Ffop∘Fgop——目标范畴里本就倒序。
习 6.补全例 3:写出 αℝ 在自然方块两缘的完整计算,证明 id ⇒ (−)∗(协变化后)无自然同构。关键一击:αℝ(−x) 沿左缘等于 αℝ(x)∘(−1)?——把 m−1 分别作用在「像函数的自变量」与「像函数本身」两处,联立即得 αℝ(x) = −αℝ(x)。若卡住,先用具体 x = 1 算一遍数值。
本页六题开始「进阶」:习 1 是 Yoneda 的心脏,习 5–6 涉及把「调头」当作数据使用。卡住时回到第 50 页的三行证明——答案全部藏在那里。
本章 16 节的地形:一条主轴(定义 → 例子 → 对偶 → 同构与等价 → 单/满 → 始/终),两座侧峰(把态射收进 Hom 集合;用交换图与追图法做计算),三条与相邻领域的接口用金色标注——它们不是装饰,是「这门语言可以向外说话」的证据。
三条「主线走法」:赶路者走金色主轴(p11 → p12–13 → p14 → p15 → p16 → p17);好古者沿棕色对偶线——对偶原理(p14)贯穿全章,p16 与 p17 的成对定义是它的第一批收成;接桥者走蓝色接口(p19 的 Hom 集合直通相邻领域的模与复形,p20–21 的交换图回望相邻领域的 π1)。三条线在「等价三件套」处汇合:范畴论只数结构,不数对象。
上半章六件带走。逐条给出页码,复习时先遮住细目自测复述。
一、公理骨架(p11)。范畴=对象 + Hom 集 + 复合 + 单位元,两条公理(结合律、单位律);刻意不谈元素——凡是满足公理者,定理通吃。局部小=每对对象之间的箭头成集。
二、例子谱系(p12–13)。实体范畴 Set/Grp/Top/Vec 共用同一句式「对象 + 保结构箭头」;偏序集=薄范畴(至多一条箭头)——序与代数同框。
三、群与幺半群的单对象读法(p18)。一个对象 + 一支自箭头 = 一个幺半群;再要求箭头可逆,就是群。群作用=从单对象范畴出发的函子;每个对象自带自同态幺半群 End(A)。
四、对偶原理(p14)。Cop 把箭头全体调头;一切「纯箭头命题」买一送一。mono/epi、始/终、积/余积皆成对出现。
五、「一样」的两档(p15)。态射同构(可逆 + 逆唯一);范畴等价(全忠实 + 本质满)——范畴论计「结构类」,不计「对象个数」。
六、箭头语言重写旧概念(p16–17)。mono/epi=左/右消去律(警告:CRing 中 ℤ → ℚ 是 epi 非满);始/终=「出发/抵达的箭头恰一条」,本质唯一。
上半章给出的是「名词」:对象、箭头、复合、同构、始与终。下半章给出「语法」——交换图与追图法,以及度量「两个范畴一样」的三件套。把这六件收好,第一章只剩收束。
正面清单(本页管下半章)。
易错清单。① 把等价当同构用(对象计数失义);② 把待证方块当已交换用(追图踩空);③ 对掺元素命题做对偶(免费失效);④ 骨架化后还想数复本(信息已删);⑤ 忘了 Hom 集合是「数据」——第 19 页一切都建立在它是集合之上。
与上半章的接口。上半章(定义、例子、单/满、始终对象)提供「名词」,下半章(图、追图、等价、对偶)提供「语法」。二者合起来,范畴已是一门可写可读的语言——但还没有「句子之间的翻译」。下一页的衔接讲义请出翻译官:函子。
Yoneda 引理说:知道一个对象与全世界的箭头关系,就完全知道了这个对象——Hom(A,−) 的全部取值复原本体,连「本体」这个说法都显得多余。
这不是技术,是立场。莱布尼茨说:若两个事物的一切属性皆同,则它们是同一事物(同一不可区分原则)。Yoneda 把「一切属性」精确化为「一切箭头」,把「同一事物」精确化为「本质唯一同构」——哲学直觉第一次拿到了定理编号。
于是范畴论给出一条认识论的纲领:要认识一物,不必打开它——去问它与一切他物的关系。对象是它的关系之总和;个体让位于位置,实体让位于网络。本章的每一个定义都是这条纲领的预演:单射不再「逐点看」,而是「可消去」;「空」不再「没有元素」,而是「出发的箭头恰一条」。
第六章(二)将把这条纲领系统展开为数学哲学中的结构主义;第四、五章的伴随将以「自由与遗忘互为镜像」给出它的动力学版本。此刻一句话:在范畴的疆域里,是谁,取决于与谁相连、如何相连。
回到第 5 页的「换眼」动作:当时是一个提议,如今是一个定理。下一页的挑战将说明:这条纲领如此之紧,连范畴公理本身都动它不得。
公理体系像石拱桥——抽走一块石头,桥塌还是自立?本页做两次「抽石头实验」,看看两条范畴公理谁也离不开谁,以及谁还能再省。
实验一:结合律救不了单位律。取「右零半群」:x·y = y(取后者)。结合律验证:(x·y)·z = z = x·(y·z) ✓。但单位元存在吗?需 e·x = x 且 x·e = x——第一条要求 x = e 对一切 x,多元素集合上不可能。结论:结合律 + 右单位不成单位律;左右单位须同时约定(或约定「双侧」)。顺手可得一个精致推论:若 e 只是左单位、且有右逆可消,则可推出双侧单位——「左单位 + 右零 + 可消」三角中最弱的一角也能撑起全局,这正是挑战的精神:搞清每条公理的承重结构。
实验二:只有单位律会怎样?取任意集合配「右投影」x·y = x。单位律要 e·x = x——即 e = x 对一切 x,多元素上又失败。而结合律呢?(x·y)·z = x·z = x = x·(y·z) ✓。两次实验合读:两条公理在「多元素」世界里相互独立——谁也不能从谁推出来;只在单元素世界里它们才彼此重合(此时一切运算自洽)。
实验三:单位元唯一性的省写。第 11 页证明了单位元唯一。能否更省:只要求存在左单位与右单位(不必是同一个),推出双侧单位存在且唯一?答案是可以——经典的「左右相遇」论证(习题课(一)第 4 题的升级版):设 eLx = x、x eR = x,则 eL = eLeR = eR。∎范畴定义的「每对象一根 id」写法,正是把这个省写预先打包。
延伸:范畴论文献里还有「半范畴」(无单位律)与「预序充盈」等削公理游戏——它们不是无聊练习,而是在测绘「定理的势力范围」:每条定理到底吃几条公理?Yoneda 吃「局部小 + 单位律」全餐,一个都不能少。
单对象范畴=幺半群(第 13 页)——这条等式让「范畴」可以被程序穷举。本实验:写一个验票器,把小集合上的一切「候选结构」过一遍公理安检。
# 半自动验票:给一张乘法表,判断它是否构成幺半群(= 单对象范畴)
def check(table, elems):
# table[(x,y)] = x*y ;elems 为元素列表
for x in elems:
for y in elems:
for z in elems: # 结合律
if table[(x, table[(y, z)])] != table[(table[(x, y)], z)]:
return False, "associativity"
for e in elems: # 找双侧单位元
if all(table[(e, x)] == x and table[(x, e)] == x for x in elems):
return True, ("unit = %s" % e)
return False, "no unit"
# 2 元素实验:枚举全部 24 = 16 张候选乘法表
from itertools import product
elems = [0, 1]
ok = [t for t in product(elems, repeat=4)
if check({(x, y): t[x * 2 + y] for x in elems for y in elems}, elems)[0]]
print(len(ok)) # 输出 4 :单位元 2 种选择 × 另一元素自乘 2 种去向
# 同构意义下仅 2 个:C2 型(另一元素自乘得单位)与 2 链型(自乘得自身)
实验报告三问。① 16 张表中,为何「单位元选择 ×2」乘「自乘去向 ×2」恰好穷尽?(提示:单位元素确定后,另一元素 a 的 e·a、a·e 被单位律锁死,唯一自由的是 a2。)② 把 4 张合格表逐个画出:哪张是 C2(二阶群),哪张是二链偏序集(min 或 max)?③ 换 3 个元素:候选表 39 = 19683 张——运行程序数出合格者(程序会自动数完),并与学生对拍结果;再思考:同构意义下还剩几个?(提示:先用单位元个数初筛,再做乘法表的同构搜索单。)
这枚小验票器正是范畴论「公理贫乏」的兑现:判定一个结构是不是「单对象范畴」,不需要任何群论、序论知识——两条公理,一份乘法表,程序即可代劳。第三章的实验将升级它:枚举「两条箭头的图」的全部锥形,亲眼看见极限的唯一性在枚举中浮出。
动手纪律:把 check() 中的结合律换成「只验单位律」再跑一遍 2 元枚举——合格表会变多吗?多出的是哪些「有单位不结合」的怪结构?(与第 35 页实验二互证。)
绪论第 7 页埋下伏笔:中国算学的「术」是箭头思维的算法形态。本页把这句话做成一张对照表与一张图——这枚札记是本册中西对照线的第一站,第四、五章(珠算口诀)与第六章(墨辩三物)将各自续一站。
「术」的箭头身份。《九章算术》粟米章开卷即立「今有术」:以所有数乘所求率为实,以所有率为法,实如法而一。译成现代话:已知量 A(所有数)在「所有率」r1 之下,换成所求量 B,取值 B = A × r2/r1。这是一条从「粟」到「米」、从「米」到「菽」的通用换算程序:它有明确的「出发点」(已知量)、明确的「抵达点」(所求量),并且——关键的一步——两段换算可以首尾相接:粟 → 米的术接着米 → 菽的术,效果恰是粟 → 菽的复合。刘徽注里反复出现的「术可相错」,说的正是复合的合法性;而「率」在诸术之间保持不变换算关系,正是复合的结合律在算学现场的运作。
为什么这是范畴论式的眼光?因为《九章》的作者们关心的从来不是「粟有几斗」这个对象,而是「怎样从一类量走到另一类量」这条箭头;诸术的编排(先化粟为米,再化米为菽)是纯粹的复合设计。以范畴之眼重读《九章》: 它是一部态射手册——九章各章是一个「态射库」,题是「态射的调用实例」,而「注」是「复合的合法说明书」。绪论说中国数学「重术」常被误读;现在可以说得更准:术正是箭头,重术即重关系——与 Yoneda 的纲领(对象是关系的总和)隔两千年级相视一笑。
下一站预告(第四、五章札记):珠算口诀「二一添作五」——单句口诀是原子箭头,口诀串是复合链,恰是第四、五章「单子」的民间预演。
| 条目 | 陈述 | 出处 |
|---|---|---|
| 范畴公理 | h∘(g∘f) = (h∘g)∘f;idB∘f = f = f∘idA | p11 |
| 局部小 | 每对对象 Hom(A, B) 是一个集合 | p11 |
| 对偶 | Cop:箭头调头;真命题 ⟹ 对偶真 | p14 |
| 同构 | g∘f = id 且 f∘g = id;逆唯一 | p15 |
| 范畴等价 | 全忠实 + 本质满;骨架=去重清单 | p15 |
| 单/满态射 | m∘g = m∘h ⟹ g = h;g∘e = h∘e ⟹ g = h | p16 |
| 始/终对象 | Hom(I, A) 恒单点;Hom(A, T) 恒单点;本质唯一 | p17 |
| 群/幺半群 | 单对象范畴;群=单对象群胚;End(A) 是幺半群 | p18 |
| Hom 集合 | 复合=乘法表;Set 中 |Hom(A, B)| = |B||A| | p19 |
| 交换图 | 两条路径给出同一箭头;拼图定理(外圈自动交换) | p20–21 |
| 等价三件套 | 忠实(不并案)· 满(无漏箭)· 本质满(不漏岛) | p22 |
| 骨架 | 每同构类留一名代表;C 与其骨架等价 | p23 |
| 对偶定理 | 命题证明一遍,对偶版免费 | p24 |
使用建议:本表按「定义—定理—接口」排列,复习时先遮出处列自测复述;第二章的速查表把「函子与自然变换」一族接续在「同构」一行之后,两表合读即得全书语汇的骨架。
第一章完成了什么。立稳一门语言的词汇与语法:范畴(名词)、态射(动词)、交换图(句法)、等价与对偶(修辞)。但每个范畴都是一座孤岛——「范畴与范畴之间」还是一片空白。
一句话直觉。函子是范畴之间的「保结构翻译」:把 C 的对象与态射整批送往 D,复合表与单位元原样保真。自然变换则比较两个翻译——要求「换一种译法,答案本质上一样」。
范畴立起来了,下一步是比较范畴。比较者必须自己守范畴的规矩——这就是函子。
(协变)函子。函子 F: C → D 由两部分数据组成:① 对象映射——每个 C-对象 A 送到 D-对象 FA;② 态射映射——每个箭头 f: A → B 送到 Ff: FA → FB。要求两条公理:
(保复合)F(g ∘ f) = Fg ∘ Ff;(保单位)F(idA) = idFA。∎
函子是「保结构的映射」的升级版:同态保乘法,连续映射保邻近,而函子保「复合结构」本身——它不问 C 与 D 里装的是什么,只要求箭头图被原样搬进目标范畴(交换图搬过去还是交换图)。验票两例:① 常值函子——一切对象送 B0,一切箭头送 idB0,两律立验;② 遗忘函子 U: Grp → Set——群送底集、同态送原映射,「保复合」自动(集合层面的复合没变)。
验票练习(例题课(一)将正式做):「把每个集合送到它的幂集、每个映射送到直接像」是 Set → Set 的函子;把「直接像」换成「原像」,两律还成立吗?——答案藏在第 43 页。
三个高频函子登场,它们将贯穿全书并在第四、五章结出「伴随」之果。
其一,幂集函子。P: Set → Set:集合 A 送幂集 P(A)(全体子集);映射 f: A → B 送直接像 f!: P(A) → P(B),f!(S) = {f(s) : s ∈ S}。验票:直接像的复合 (g∘f)! = g!∘f!(子集逐点过两道)与 id! 为恒等,两律成立。
其二,自由函子。F: Set → Grp:集合 X 送自由群 F(X)——以 X 为字母表、由「词」与约化规则构成的群(如 x y x−1 这样的字,相邻逆字母对消)。直觉:不施加任何额外关系,把集合「放生」成群。它的泛性质(任何映射 X → U(G) 唯一扩张为同态 F(X) → G)是第四、五章「伴随」的第一主角。
其三,遗忘函子。U: Grp → Set(也用于 Ring→Set、Top→Set……):把结构忘掉,只留底集。它「什么都不做」却绝不平凡——第四、五章将证明:自由与遗忘天生一对(伴随对),「造结构」与「拆结构」是同一枚硬币的两面。
检索旧知的接口:相邻领域第一、二章的「自由模与基」正是 F: Set → Vec 的实例;当时「基的唯一表出」,就是自由性。本册把这类现象一网打尽。
箭头也有逆行版本。第 41 页的验票练习在此揭晓:「原像」走的是反方向。
反变函子(contravariant functor)。F: C → D 称为反变函子,若它把 f: A → B 送到 Ff: FB → FA,且 F(g ∘ f) = Ff ∘ Fg、F(id) = id。
与协变只差两处:箭头调头、复合倒序。而这两处恰可合并成一句干净的话——反变函子 C → D 就是协变函子 Cop → D(也等价于 C → Dop)。对偶原理(第 14 页)在此兑现第一笔红利:本册此后只证协变版本,反变结论全部自动继承。
原像函子。P∗: Setop → Set:对象仍送幂集;f: A → B 送原像 f∗: P(B) → P(A),f∗(T) = f−1(T)。验票:(g∘f)−1 = f−1∘g−1——分析课的旧题,正是「倒序」公理。
对偶空间函子。线性代数的招牌例子:(−)∗: Vecop → Vec,空间 V 送对偶空间 V∗ = Hom(V, k)(线性函数全体);线性映射 f: V → W 送拉回 f∗: W∗ → V∗,f∗(φ) = φ ∘ f——函数本来就从 W 出发,被 f 一接,出发点变成 V,方向自然倒转。「行向量转置」「对偶基」「矩阵的转置」,全是这条函子在具体基下的面孔。
术语预警:本册「函子」默认协变;说反变时一定点名。凡遇反变命题,先翻成 Cop 的协变命题再动手——这是省一半笔力的固定动作。
函子能接龙吗?能——而且接法严丝合缝。
函子的复合。设 F: C → D、G: D → E。定义 G ∘ F: C → E:对象 A ↦ G(FA),箭头 f ↦ G(Ff)。两律验票:G(F(g∘f)) = G(Fg∘Ff) = GFg ∘ GFf(内层用 F 的保复合,外层用 G 的);单位律同理。∎
每个范畴 C 有恒等函子 idC。于是——「对象=小范畴,箭头=函子」恰好又是一个范畴!记作 Cat(严格说,对象取「小范畴」——对象集与 Hom 集皆为集合的范畴,避免集合论悖论)。这是范畴论的第一次自我复制:范畴论不但谈论一切数学,它自己也成了被谈论的一员。
自相似立刻给出新例子:偏序集的范畴 Pos、群的范畴 Grp(把每群看成单对象范畴后所得)、单对象子范畴的枚举……都是 Cat 里的对象。更妙的是,Cat 里的「同构」就是范畴同构,而「等价」正是第 15 页的范畴等价——vFd 与其骨架在 Cat 中等价的那句话,如今是 Cat 内部的一个箭头事实。
小范畴的尺寸纪律:Cat 只收「小」范畴(Hom 集都是集合)。Set 本身不小时,处理要靠更大宇宙的 Grothendieck 万有域技巧——本册点到为止,只提示:第 11 页「局部小」的括号,在此兑现。
范畴论的第三级楼梯:函子也要能相互比较。1942–45 年,Eilenberg 与 Mac Lane 正是为了说清「自然」二字才发明这一切——「自然变换」是整座大厦最初的心跳。
自然变换。设 F, G: C → D 为两个函子。自然变换 α: F ⇒ G 是一族 D-态射 {αA: FA → GAA∈Ob(C)}(每个对象一根「分量」),满足自然方块:对每个 f: A → B,
Gf ∘ αA = αB ∘ Ff。
方块说的是:先在 A 处「换轨」再运货(Gf∘αA),与先运货再在 B 处换轨(αB∘Ff)结果相同。「自然」的日常含义——不依赖任意选择——在此变成一条可验证的交换等式。若每根分量都是同构,称α 为自然同构(下一页专述)。
第一个实例:阿贝尔化。对每个群 G,商群 Gab = G/[G,G](换位子子群的商)是阿贝尔群;投射 ηG: G → Gab。取阿贝尔化是函子(同态 φ 送诱导商同态),而「取像为投射」这件事是自然的:对任何同态 φ: G → H,方块「先投射再诱导」=「先诱导再投射」——因为同态把换位子送成换位子,商结构兼容。一句话:η: id ⇒ ab 是自然变换。「任何同态都兼容商映射」——凡学过群论者都默默用过这个事实,范畴论把它点名成图。
分量符号 αA 的下标是对象,不是元素——「每个对象一根分量」,这就是函子之间比较的全部内容。例题课(二)将亲手验证两族分量是否合格。
当自然变换的每根分量都是同构,我们得到范畴论最常用的一个词——「本质上」。
自然同构。自然变换 α: F ⇒ G 称为自然同构,若每根分量 αA 都是同构;记作 F ≅ G。此时逆变换 α−1(分量取逆)自动自然——逆的方块由原方块「翻面」即得。∎
正例:有限维双对偶。对有限维线性空间 V,取 ιV: V → V∗∗,ιV(v)(φ) = φ(v)(把向量看成「给线性函数打分的人」)。每根分量是同构(维数相等、单射足够),而方块自动交换——ιW∘f = f∗∗∘ιV 两边都是 ιW(f(v))(φ) = φ(f(v)),逐点可验。于是 id ≅ (−)∗∗ 是自然同构。
反例:单对偶。V ≅ V∗ 在有限维也成立(维数相等),但不自然:每个同构都须先选一组基,把基映成对偶基;换一组基,同构跟着换。范畴论对「依赖基的选择」给出了精确判词——那是一个自然性不成立的同构族。教材里常说的「典范同构」「典范映射」,范畴论的翻译正是:自然(或不自然)。
「本质上唯一」句式预告:泛性质(第 17 页)证明的唯一性都「up to iso」——对象同构唯一;配上函子与自然变换后,整句话升级为「表示函子本质唯一」(第 49 页)。「本质」从此有严格语义。
把第 45–46 页的新居民安家:自然变换之间能不能复合?能——逐对象复合分量即可,且两律易验。于是又一轮「自我复制」:
函子范畴。设 C 为小范畴、D 为任意范畴。函子范畴 DC 的对象是函子 F: C → D,态射是自然变换 α: F ⇒ G;复合逐对象进行,单位元是 idF(每根分量取 idFA)。∎
第三层楼梯修完:对象、函子(一阶箭头)、自然变换(二阶箭头)——范畴论是一台三层发动机,且每层都守同一套公理。 Cat(第 44 页)与函子范畴 DC 的分工:前者以范畴为对象,后者以「固定两个范畴之间的函子」为对象——后者像把镜头对准一对城市之间的全部航线。
箭头图也是函子。最简单的小范畴之一:形如 • → • 的两点一箭范畴(记作 2)。一个函子 F: 2 → C 是什么?两个对象、一条箭头——就是 C 里的一张一箭图!三角范畴 3(三点三箭成三角形)的函子,是 C 里一张交换三角图。于是「画交换图」这个动作获得了严格身份:交换图=从图范畴出发的函子;「图交换」=函子性自动保证的等式。第三章的极限将把「图」用到极致——极限就是「对一张图取万有锥」,而已经掌握了图的严格定义。
三层总结:范畴论的所有「图」都活了——它们不是插图,而是函子;画的每张交换图都在声明一条定理级别的等式。本册的「一步一图」因此字字有据。
范畴论的又一种「取局部」手艺:不换范畴,而是站到某个对象之上看全局。
切片范畴(slice category)。设 C 为范畴、A 为其对象。切片范畴 C/A 定义为:对象=一切箭头 f: X → A(把 X「盖」在 A 上的方式);态射 f → g(其中 g: Y → A)是使三角交换的箭头 h: X → Y:g ∘ h = f。∎
验票:复合 h'∘h 后 g∘h'∘h = g∘h∘(?)——由 h 与 h' 各自的交换三角串联即得;单位元是 idX(f∘id = f)。两律成立,C/A 是货真价实的范畴。
Set 中的切片最直观。对象 f: X → A=「A-标记集」:每个 a ∈ A 头顶挂着一袋元素 f−1(a)(纤维)。态射=保标记的映射(h 必须把 a 头顶的元素送到 a 头顶)。于是 Set/A 恰是「逐纤维工作的集合论」——A = {红,蓝} 时,一个切片对象就是「一袋红元素 + 一袋蓝元素」。
两个速算:当 1 是终对象(单点集),Set/1 ≅ Set——盖在一点上毫无约束,切片退化回原范畴(习题课(二)第 4 题验票)。当 A = B ⊔ C(两个标记),Set/A ≅ Set × Set——标记集逐纤维分裂。切片是第三章「拉回」的伏笔:我们将证明,两个切片对象的「积」(在 C/A 里取)恰是原范畴中的拉回——届时「拉回」这一新名词将是免费赠品。
对偶地有余切片 A/C(对象=从 A 出发的箭头)——又一次免费镜像。切片的思想在几何里叫「在底空间上工作」,在层论里叫「茎」,在数据库里叫「按主键分组」:同一手艺,处处留名。
本章的两大主角即将同台。第一位:可表函子——它把「对象」翻译成「一整个提问程序」。
可表函子。函子 F: C → Set 称为可表示的,若存在对象 A 与自然同构 Hom(A, −) ≅ F;此时称 A 表示 F。
回忆第 11 页:Hom 是「数据」——对每个 B,集合 Hom(A,B) 数出「从 A 到 B 的方式」。Hom(A,−) 是函子(箭头 f: B → B' 以后复合送过去:Postf,两律即结合律)——它叫 A 的共变表示,或说「A 的提问程序」:到一个新对象 B,先问一句「从 A 出发能怎么走?」
两个好例子。① 在 Grp 中,「取底集」函子 U: Grp → Set 被整数加法群 ℤ 表示:HomGrp(ℤ, G) ≅ U(G)——同态由 1 ↦ g 的 g 唯一决定(第 17 页「无选择」的复述),且对 G 自然而然。② 在 Set 中,Hom(2, −)(2 = {0,1})把 B 送到 B × B ≅ B2——「带两个标签的取点」,它表示了「取有序对」这个操作;一般地 Hom(n,−) ≅ (−)n 是「取 n-元组」。
命题(表示本质上唯一)。若 A 与 A' 都表示 F,则 A ≅ A'。
证。两条自然同构串联给出 Hom(A,−) ≅ Hom(A',−);由第 50 页 Yoneda 的推论,这迫使 A ≅ A'。∎(第 17 页「始对象本质唯一」正是本命题对 F =常值单点函子的特例——始对象表示「一切 Hom 皆单点」的程序。)
逆过程也值一问:拿到一个 Set 值函子 F,何时它是某个对象的问卷?——「可表性定理」是高级课程的主题;本册满足于:凡是泛性质定义的东西,几乎都以可表函子的面目出现(积、指数、始与终……第三章逐一兑付)。
范畴论的第一定理。它短小到可以印在名片上,深刻到值得用第六章一整章消化。
Yoneda 引理。设 C 局部小,A 为对象,F: C → Set 为函子。则映射
Φ: Nat(Hom(A,−), F) → F(A), α ↦ αA(idA)
是双射。其逆把 x ∈ F(A) 送到自然变换 Φx,分量定义为
Φx(B): Hom(A,B) → F(B), f ↦ F(f)(x)。∎
证明(三行)。① Φx 自然:对 h: B → B',两边都算出 F(h∘f)(x)。② Φ 与逆互消:Φ(Φx) = Φx(A)(idA) = F(idA)(x) = x(保单位律);反过来,任一 α 的分量在 f 处,用自然方块「拆引线」(记 x = αA(idA) = Φ(α)):
αB(f) = αB(Hom(A,f)(idA)) = F(f)(αA(idA)) = Φx(B)(f)
——α 在任何处的取值,被它在 idA 处的取值完全决定,故 ΦΦ(α) = α。两条合成,双射到手。∎
推论(Yoneda 嵌入的核心)。Hom(A,−) ≅ Hom(B,−) 当且仅当 A ≅ B。
证。(⟸ 显然。)⟹:取 F = Hom(B,−),同构 α 对应 g = αA(idA): B → A;引理证明的「拆引线」恒等式表明 α 恰是前复合 g∘−。α 是自然同构,故每分量 g∘−: Hom(A,A) → Hom(B,A) 双射;由满取 k: A → B 使 g∘k = idB,由单(考察 g∘(k∘g) = (g∘k)∘g = g = g∘idA)得 k∘g = idA。∎
推论正读:若两个对象的「提问程序」完全相同,则它们同构——对象由它与全世界的箭头关系唯一决定。「关系即本质」不再是口号,而是三行证明撑起的定理。
记忆锚点:Yoneda 说「自然变换由一个点决定」——αA(idA) 这一个取值,像杠杆的支点,撬动全部分量。第 34 页思想卡给出它的哲学译文;第六章(二)给出它在认识论里的全面开花。
一句话直觉。Yoneda 引理(2.10)说「对象由它的关系决定」;Yoneda 嵌入把这进一步做实:把每个对象干脆替换成它的关系数据——范畴整体搬进函子世界,寸步不失。
定义(Yoneda 嵌入)。函子 Y: C → SetC°,Y(A) = Hom(−, A)(反变可表函子),箭头 f: A → B 送到自然变换 Hom(−, A) ⇒ Hom(−, B)(复合 − ∘ f)。定理:Y 忠实且满——是范畴等价到它的像上。
例 1(幂集函子是函子)。令 𝒫: Set → Set:对象 A ↦ 𝒫(A)(子集全体),态射 f: A → B 送到直接像 𝒫f(S) = f(S)。验证函子公理。① 复合:像的像=复合的像,𝒫(g ∘ f) = 𝒫g ∘ 𝒫f;② 单位:𝒫(idA)(S) = S。∎ 三行完毕——但:若把态射送到逆像 f-1(T),公理变成 (𝑔 ∘ f)-1 = f-1 ∘ g-1——次序颠倒,那是反变函子(2.3)。
例 2(忘却函子)。U: Grp → Set:群送到底集合、同态送到底映射。复合与单位在底层面自动成立。它「忘掉」了乘法表——第 42 页的自由–遗忘对从这里起跑。易错点:U 不保双射=同构——两个不同构的群可以有同构的底集合(ℤ/6 与 S3)。函子保同构(忠实即保单满),但不反射同构:底集合同构推不出群同构。
例 3(构造一个自然变换)。取双重对偶 ηV: V → V**(向量送入「求值泛函」)。对每个线性映射 f: V → W,验证方块交换:f** ∘ ηV = ηW ∘ f——两边都把 v 送到「对 φ ↦ φ(f(v)) 求值」。∎ 这就是 η: id ⇒ ** 的自然性;「不依赖基」正是自然性的代名词(第 46 页细讲)。
例 4(可表函子判定)。问:函子 F: Set → Set,F(X) = X × {0, 1}(双份拷贝),可表吗?判定:可表 ⟺ 存在集合 A 使 Hom(A, −) ≅ F。取 A = {0, 1}:一条箭头 A → X恰是「给两个标记各挑一个元素」= X × {0, 1} 的一点。自然性逐点验证(后复合 vs 后配对)。∎ 可表——表示对象是二元集。
例 5(不可表的旁观证)。G(X) = X ∗ X(自由积,两份拷贝的「字」)可表吗?若 G ≅ Hom(A, −),看单点集:|G(1)| 应等于 |A|;但 G(1) 是两字母自由幺半群的元素集——无穷。而 Hom(1, −) 读出的恰是 A 自己的元素个数——有限集 A 无从表示。(若允许无穷 A,再用 |G(2)| = |A|2 的两条约束联立即出矛盾。∎)方法总结:可表性判定=「在试探对象上读数、联立方程」。
例 6(从 Yoneda 读信息)。设 Hom(A, −) ≅ Hom(B, −)(自然同构)。由 Yoneda(2.10),取 F = Hom(B, −):Nat(Hom(A, −), Hom(B, −)) ≅ Hom(B, A) 的恒等同构给出箭头 B → A;对称地再给 A → B;两个复合各是恒等(再次用 Yoneda)。∎ A ≅ B——「探针读数完全相同则对象同构」,这是 Yoneda 最常用的姿势。
习 1(热身)。验证:常量函子(一切对象 ↦ 固定对象 D、一切态射 ↦ idD)确是函子;它在什么范畴间「保同构」?(答案提示:任何两个同构的对象被送到同构——但反射不出源的同构。)
习 2。P: Set → Set 的反变版:X ↦ 𝒫(X)、f ↦ f-1。验证公理(注意复合次序),并说明它与例 1 的协变版是「同一数据的两种朝向」。
习 3。证明:函子保同构——若 f: A ≅ B,则 Ff: FA ≅ FB。(两行:对 f ∘ f-1 = id 与 f-1 ∘ f = id 作用 F。)
习 4。找出一个函子 F 与一对不同构的对象 A, B 使 FA ≅ FB——(提示:U: Grp → Set 与 ℤ/6, S3;或「把一切对象送到 1」的常量函子。)结论记牢:函子保同构,不反射同构——反射是「忠实+满」以上才谈的事。
习 5(自然性计算)。双对偶 η(例 3)之外,再验证「有限维向量空间到自身的双重转置」 V ↦ V** 在态射上的自然性;并指出为何「V ≅ V*」不给出自然同构(提示:同构依赖基的选取;换基后方块破裂——这正是「自然」二字的反面教材。)
习 6。证明自然变换的竖直复合(α: F ⇒ G、β: G ⇒ H 给 β ∘ α: F ⇒ H)满足结合律,且每个函子有恒等自然变换——于是「函子+自然变换」自成一个范畴(函子范畴,2.7)。
习 7。在偏序集范畴(薄范畴)里:函子=单调映射;自然变换 α: F ⇒ G 存在 ⟺ 对每个 x 有 Fx ≤ Gx(分量箭头至多一支,存在即唯一)。据此写出:单调映射之间的「序」恰是逐点序——薄范畴把自然变换「压扁」成了不等号。
习 8(挑战级热身)。设 A 是 Set 的单点集。证明 Hom(1, −) 可表(它就是自己),且 Nat(Hom(1, −), F) ≅ F(1)——这正是 Yoneda 在 A = 1 的特例;试着不引用 Yoneda、直接构造双方射完成它(为 2.10 做手感训练)。
本章一句话。函子让范畴之间有了桥,自然变换给桥立了规矩,Yoneda 证明桥的读数足以还原对象——「由关系定义对象」从纪律变成定理。
正面清单(函子部分)。
易错清单。① 忘了反变函子的复合倒序;② 把「保同构」说成「反射同构」;③ 对真类大小的范畴滥用「函子范畴」(需局部小或小范畴假设);④ 常量函子的态射映射忘写 id。
正面清单(自然变换部分)。
易错清单。① 自然性方块的方向画反(分量箭头与源函子的箭头同向);② 把「分量皆同构」写成「存在整体逆」(需逐分量验证相容性才配称自然同构);③ Yoneda 里 Hom 的变位记反(反变版 Nat(Hom(−, A), F) ≅ F(A);协变版 Nat(Hom(A, −), F) ≅ F(A) 各自成立);④ 用 Yoneda 时忘了核对方块确实交换。
自然性是「不看元素」的承诺。
「自然」在日常语言里是「顺理成章」;在范畴论里它是一条可以逐字验证的契约——无论用哪个对象、哪条路径去问,答案都经同一张方块换算。双对偶 η 为什么自然?因为它对每个向量空间用同一个公式(求值泛函),公式里没有「先选一组基」这个动作。V ≅ V* 为什么不自然?因为「把向量映成坐标泛函」必须先挑基——挑法不同,方块就裂开。
这份承诺的深意在于:凡自然者,皆可搬运。自然变换在一切范畴、一切函子间通用——Eilenberg 与 Mac Lane 正是为了给「通用」二字立契约,才顺手发明了范畴论。读到第四章的伴随三角与第五章的单子平方,会一再遇见同一句话:那些最深刻等式的成立,都只因为它们自然。
一句话带走:看一个构造配不配称「好」,先问它换不换舞台都成立。
挑战:Yoneda 的推论串烧。不查文献,仅用 Yoneda 引理(2.10)与嵌入(2.11),依次证明以下四连推。每一步都只许用箭头语言。
突破口提示。四棒共用一个动作:把想证的箭头放进 Nat 的位置,让 Yoneda 把它换算成 F(A) 的元素。文献指引:Mac Lane《Categories for the Working Mathematician》§III.2–3(Yoneda 及其推论的标准清单)。
实验目的。在最小的玩具范畴——2 元素链与 3 元素链(薄范畴:函子=保序映射)——程序枚举全部函子、复合封性与 Yoneda 读数,让本章三个抽象概念各自交出一份可复算的数字。
from itertools import product
def mono(f): # 薄范畴(偏序集)上:函子 = 保序映射
return all(f[i] <= f[i+1] for i in range(len(f)-1))
up = [f for f in product(range(3), repeat=2) if mono(f)] # P(2链) -> Q(3链)
dn = [f for f in product(range(2), repeat=3) if mono(f)] # Q(3链) -> P(2链)
print('P->Q: 9 个映射里函子', len(up), '个;Q->P: 8 个里', len(dn), '个')
print('up 的 Hom(0,1) 像:', [f for f in up])
comp = [tuple(g[x] for x in f) for g in dn for f in up] # g∘f : P -> P
print('复合 g∘f 共', len(comp), '个,保序?', all(mono(c) for c in comp))
H = (1, 1) # 可表 Hom(0,-) 的薄编码:处处恰一支箭头
for F in [f for f in product((0, 1), repeat=2) if mono(f)]:
cnt = len([1 for a0 in ([1] if F[0] == 1 else [])
for a1 in ([1] if F[1] == 1 else [])])
print('F =', F, ' |Nat(H,F)| =', cnt, ' |F(0)| =', F[0],
'->', 'OK' if cnt == F[0] else 'BAD')
实跑输出。
〖札记〗珠算口诀与函子复合。
珠算的口诀体系是一套精致的「映射语言」:「三下五除二」把「见三」这一状态确定地映射为「拨珠动作」,口诀接口诀就是映射接映射——复合。更妙的是口诀的普适性:同一句「三下五除二」,不管珠盘上其他档是什么数、不管这道题是加是减,动作照旧——口诀与状态之间的对应不挑场合。这正是自然性的直觉内核:对应关系对一切对象用同一配方,换舞台不换规则。
《九章算术》的术文结构同样自觉:「术曰」之间互相引用,上一术的输出是下一术的输入——「今有术」之下,粟米、衰分、均输诸章的术皆「相生」,刘徽注谓之「术苟有据此以设问者,皆可广用」——方法一经写成复合安全的形状,就自动获得全域适用性。函子公理(保复合、保单位)不过是把这份手艺写成公理:翻译接翻译还是翻译,恒等翻译原地不动。
带走一句话:好的算法从来是函子——换题不换法,接题即复合。
第二章速查表(一页备翻)。
| 条目 | 定义 / 陈述 | 出处 |
|---|---|---|
| 函子 | 对象↦对象、态射↦态射;保复合、保单位 | 2.1 |
| 反变函子 | (g∘f) ↦ Ff ∘ Fg(次序倒) | 2.3 |
| Cat | 范畴(对象=小范畴、态射=函子) | 2.4 |
| 自然变换 | 分量 αA: FA → GA,对每支 f 方块交换 | 2.5 |
| 自然同构 | 每分量皆同构的自然变换(记 ≅) | 2.6 |
| 函子范畴 | SetC:函子为对象、自然变换为态射 | 2.7 |
| 切片范畴 | C/I:对象=箭头 X→I;态射保三角交换 | 2.8 |
| 可表函子 | Hom(A, −) 或 Hom(−, A);泛性质=可表 | 2.9 |
| Yoneda 引理 | Nat(Hom(−, A), F) ≅ F(A) | 2.10 |
| Yoneda 嵌入 | A ↦ Hom(−, A);忠实且满 | 2.11 |
| 保同构 | 函子保同构但不反射(ℤ/6 vs S3) | 例 2 |
| 自然性速记 | 不挑基、不挑代表元 ↔ 自然 | 思想卡 |
记号约定。≅ = 自然同构;≃ = 范畴等价;SetC 的上标记协变、C° 记反变源。
第二章完成了什么。架起范畴之间的桥(函子),给桥立了规矩(自然变换),并证明桥的读数足以还原对象(可表与 Yoneda)。「由关系定义对象」不再是纪律,而是定理。
先出一道冷静的题:什么是「两个集合的积」?会脱口而出——把元素摆成有序对。可再追一句:「有序对」本身是什么?数学家 Kuratowski 的答案是 (a,b) = {{a}, {a,b}}——一个奇怪的套盒。定义合法,却与直觉全然脱节:我们关心的从来不是这对括号怎么搭,而是那句更朴素的话——给出对,就能取第一分量、取第二分量;给出两个分量,就唯一还原出对。
把括号丢掉,剩下的是两句行为承诺:两条投影 π1、π2,加上「任何一对映射都唯一地经过它分解」。本章的全部主角——积、余积、等化子、拉回、极限、指数——都是这个句式的变奏。它们统称泛性质(universal property):不描述对象「是什么」,只立法规定它「如何与万物相处」。
本章的航线:先立总纲(投标句式),再依次拆解积与余积(第 67–69 页)、等化子与拉回(第 70–72 页),然后合拢为极限(第 73–74 页);最后两级台阶通向逻辑——指数与 Cartesian 闭范畴(第 75–76 页),并以「up to iso」收束全章(第 77 页)。暗线依旧:结构先于个体。
泛性质有一个统一的语法模板,像一场公开招标:出题人写下一份测试——「对每个竞争者,要求一条兼容箭头」;中标者是那个让测试有且仅有唯一解的对象。
泛性质(模板)。求对象 X 连同一批数据(如箭头 π1, π2),使得:对每个携带同样数据的竞争者 Q,存在唯一的箭头 Q → X(或反向),使整个图交换。∎
「对每个……存在唯一」是万有性的灵魂:存在,保证中标者不缺席;唯一,保证它不敷衍——解与解之间自动 compatible,逼出同构(第 77 页)。最朴素的两个泛性质已在第一、二章见过:终对象(每个对象到它恰有一条箭头)与始对象(从它到每个对象恰有一条)。它们是模板的零阶版本——竞争者不带任何额外数据,测试只剩一条箭头。
用箭头的语言重述:「映射进 X 的方式」与「竞争者的合法数据」一一对应。Hom(Q, X) ≅ {Q 上的合法数据}——这句话在可表函子(第 49 页)里已见过一次,本章它将以「极限函子的可表性」卷土重来(第 90 页挑战)。
第一主角登场。积的投标书只要求两份「读取权」:第一分量、第二分量。
积。范畴 C 中对象 A, B 的积是三元组 (P, π1: P → A, π2: P → B),使得对任意 Q 与任意 f: Q → A、g: Q → B,存在唯一箭头 ⟨f,g⟩: Q → P 使
π1 ∘ ⟨f,g⟩ = f, π2 ∘ ⟨f,g⟩ = g。∎
Set 里验票:A × B 为笛卡尔积,π1(a,b) = a;给 f, g,令 ⟨f,g⟩(x) = (f(x), g(x))——存在无疑;唯一性一句话说完:若 h 也满足两条方程,则 h(x) 的两个分量被钉死为 f(x) 与 g(x),故 h = ⟨f,g⟩。
用 Hom 集压缩成一行,积就是:Hom(Q, A × B) ≅ Hom(Q, A) × Hom(Q, B)——「进积的映射」恰是「一对映射」。映射集合本身做了一次积,这是泛性质自带的镜像(第 75 页将把它升级为指数定律)。
顺手收纳两个约定:三元积 A × B × C 由两步二重积归纳得到,万有性照抄;零个对象的积=终对象——没有任何投影要满足,只剩「从任何处恰一箭头」。终对象由此获得新身份:空积。
对偶原理第二次开工(第一次在第 14 页):把积的定义里所有箭头掉头,「存在唯一分解」原样保留,得到的就是余积。
余积。对象 A, B 的余积是三元组 (S, ι1: A → S, ι2: B → S),使得对任意 Q 与任意 f: A → Q、g: B → Q,存在唯一箭头 [f,g]: S → Q 使
[f,g] ∘ ι1 = f, [f,g] ∘ ι2 = g。∎
Set 里验票:余积是不交并 A ⊔ B。ι1, ι2 把两块各自装进左半、右半;[f,g] 在左半用 f、右半用 g 分段定义——唯一性由「每个点必有唯一来源」保证。基数账本顺势对上:|A ⊔ B| = |A| + |B|,而 |A × B| = |A| · |B|——余积是加法的结构化身,积是乘法的结构化身,范畴论把小学算术的两个动作升格为两种「相处方式」。
范畴不同,化身不同:Ab 的余积是直和 A ⊕ B(分量各自运算);Grp 的余积是自由积 A ∗ B(两群字母交替约化,自由性由此而来——第四、五章「自由构造」的直感预存);Pos 的余积是上界之最的离散并。同一张投标书,各范畴交出自己的答卷——这正是「由关系定义」的深意。
泛性质的价值在「验票」中显影。本页把积与余积在 Set 里的验票完整走一遍,往后各范畴的同款论证可以照抄骨架。
积的存在与唯一(Set)。① 构造:A × B = {(a,b)},投影取分量。② 存在:任何 f: Q → A、g: Q → B,令 ⟨f,g⟩(x) = (f(x),g(x)),两条方程立验。③ 唯一:若 h: Q → A × B 也满足 π1∘h = f、π2∘h = g,则 h(x) = (f(x),g(x))——对即唯一。∎
余积的存在与唯一(Set)。① 构造:A ⊔ B = ({0}×A) ∪ ({1}×B)——左半贴标签 0、右半贴标签 1,即便 A, B 有公共元素也不相撞。② 存在:[f,g](0,a) = f(a),[f,g](1,b) = g(b)。③ 唯一:每个点的来源(左或右)被 ι1, ι2 钉死,无自由度。∎
| 积 A × B | 余积 A ⊔ B | |
|---|---|---|
| 数据 | 投影 π1, π2(向外读) | 内含 ι1, ι2(向内装) |
| 万有性 | 一对 f,g 经 ⟨f,g⟩ 唯一分解 | 一对 f,g 经 [f,g] 唯一汇流 |
| Set 实现 | 有序对集合 | 贴标签不交并 |
| 基数语义 | 乘法 |A|·|B| | 加法 |A|+|B| |
| 对偶方向 | 箭头进积 | 箭头出余积 |
警惕一个误区:「积」不等于「笛卡尔积」。笛卡尔积只是 Set 这位投标人交上的答卷;换到 Grp,答卷要附带乘法——逐点运算 (a,b)·(a',b') = (aa',bb'),投影自动成为同态。结构不是白送的:它恰是「让投影保结构」的最省方案。泛性质只指路,不代劳——各范畴自备砖瓦。
检索旧知:相邻领域的乘积拓扑、相邻领域的直和,都是各范畴对同一张投标书的应答。回头看「乘积拓扑为什么取最细使投影连续」——那不是约定,是万有性的最小承诺。
第二对主角处理「两条路线的分歧」。给定平行的一对映射 f, g: A → B,问:哪些点让它们重合?
等化子。f, g: A → B 的等化子是 (E, e: E → A),满足 f ∘ e = g ∘ e,且对任何 h: X → A 使 f∘h = g∘h,存在唯一 u: X → E 使 e∘u = h。∎
Set 验票:E = {x ∈ A : f(x) = g(x)},e 为内含。万有性翻译成大白话:凡是让两条路线重合的映射,像必落在共识区里——一句话的证明。
余等化子是它的镜像:求 q: B → Q 使 q∘f = q∘g,且对一切 h: B → X 满足 h∘f = h∘g 者,h 必经 q 唯一分解。Set 里:Q 是把 f(x) ~ g(x) 逐点粘合后再取等价闭包的商集——「把分歧焊死」。Ab 里更干净:余等化子就是商掉 im(f − g)(第 84 页习题亲手算)。
一句口诀:等化子=「让两条路重合的最大来源」,余等化子=「把两条路的分歧焊死的最小目标」。一个收缩来源,一个焊接目标,对偶成对。
把「重合」从一维升到二维:两条映射 f: A → C、g: B → C 指向同一目标,求「它们相遇之处」。
拉回。f: A → C 与 g: B → C 的拉回是 (P, p1: P → A, p2: P → B),满足 f∘p1 = g∘p2,且对任何满足同款的 (Q, q1, q2),存在唯一 u: Q → P 使两条三角同时交换。∎
Set 验票:P = {(a,b) ∈ A × B : f(a) = g(b)}——「在 C 处对上号的配对」。拉回因此别名纤维积:固定 b,p2 的纤维 {(a,b)} ≅ f−1(g(b))——沿 g 搬运 f 的纤维,几何家的「限制在一张叶子上看」由此有了代数身份。
推出是拉回的镜像:把 f: C → A 与 g: C → B 的像焊接成最省的目标。Set 里:不交并 A ⊔ B 再商掉 f(c) ~ g(c)——「沿公共来源粘连」。拓扑学的粘合空间(把两块布沿缝线缝起)正是 Top 里的推出。
检索旧知:两个子集 A, B ⊆ X 的交 A ∩ B,正是两条内含映射沿 X 的拉回。「交是重合处」从比喻升格为定理。
线性代数与群论里如雷贯耳的「核」,在范畴语言里只是拉回的一个特例——代数的两条腿终于并到范畴的骨架上。
核与余核。在含零对象的范畴(如 Ab、Vec、Grp)中,f: A → B 的核是 f 沿零映射 0: 0 → B 的拉回;余核是 f 沿 0: A → 0 的推出。∎
Ab(或 Vec)里核名实相副:ker f = {a : f(a) = 0},万有性正是「若 f∘h = 0 则 h 过 ker f 分解」这条例行引理。余核对偶地是 B/im f——「把像焊成零」。两个极端(核=失真的全部来源,余核=失真的全部后果)夹住 f,同调代数的第一块砖就是它们的接力:
HA 接口:相邻领域的短正合列 0 → ker f → A → im f → 0 与 0 → im f → B → coker f → 0,如今每一段都是一次拉回或推出。范畴论没有发明新对象,它把旧对象点名归队——归队之后,第 19 页 Hom 双变量函子预告的 Ext/Tor 才有统一的舞台。顺带:第一同构定理 A/ker f ≅ im f,用余等化子的万有性即可一句话推得(本章习题课(二)第 3 题验证)。
积、等化子、拉回——三员大将其实是同一位将军的三次点名。把他们统一起来的,是本章的定海神针:极限。
统一步骤分两拍。第一拍:形状。把「参与竞争的箭头图样」抽象成一个小的形状范畴 J——散落三点(无形箭头)对应积,平行一对对应等化子,沙发四点对应拉回。第二拍:图。D: J → C 是 C 里按形状摆好的对象与箭头。
锥与极限。一个锥是对象 C 连同一族箭头 λj: C → D(j)(j 取遍 J 的对象),使得沿 J 的每条箭头都交换:D(α) ∘ λi = λj。极限是万有锥:任何别的锥都唯一地经过它分解。余极限对偶(锥倒扣成伞)。∎
极限不是新的应考者,而是把先前所有考题装订成册:形状里有多少约束,极限就满足多少约束,且满足得最省。极限的方向朝内(箭头进锥顶),余极限朝外(箭头出伞底)。离散形状(无箭头)的极限是积,空形状的极限是终对象——一切旧识在统一的语法里各归其位。
极限处处可求吗?Set 给出响亮的「是」——而且只需两块旧砖。
定理(Set 完备)。任何小形状 J 的图 D: J → Set 都有极限。
证(积 × 等化子)。先取大积 ∏j D(j)——把每个 j 处的对象各放一份。再对 J 的每条箭头 α: i → j,造两条到积的映射:一条取第 i 分量后沿 D(α) 送出,一条直接取第 j 分量。令 L 为这全部平行对的公共等化子:
L = {( xj )j ∈ ∏ D(j) : D(α)(xi) = xj 对每条 α}。
——「沿形状走得通」的族之全体。锥的各分量取自族本身,交换性即成员资格;万有性由积与等化子的万有性逐级传递:任何竞争锥先散进大积,再因兼容被等化子接住。∎
证明的骨架值得背下来:「全体候选 × 逐条约束」——先不设防地取积,再用等化子筛掉不合格的。任何「带约束的选择」在 Set 里都这样两步走,极限不过是给它起了名字。对偶地,Set 也余完备(余积+余等化子造一切余极限)。
数字小演算(手工走一遍公式):平行对 f, g: A → B 的极限,按公式是 A × B 的子集 {(a,b) : f(a) = b 且 g(a) = b} ≅ {a : f(a) = g(a)}——果然就是等化子;沙发形状算出的是 {(a,b) : f(a) = g(b)}——果然就是拉回。统一不是口号,是可执行的程序(第 91 页实验让 Python 亲跑一遍)。
更大的世界:Grp、Top、Vec 同样完备(遗忘函子右伴随——第四、五章的伏笔——会把 Set 的极限原样搬运)。极限的存在性,从此是「查表题」而不是「发明题」。
新问题:把「函数」本身当对象。两参数函数 f: A × B → C,能否等价地看成「一参数函数、返回函数」?
指数对象。对象 B、C 的指数 CB 是对象 CB 连同求值映射 ev: CB × B → C,使得对任何 f: A × B → C,存在唯一 λf: A → CB 使 ev ∘ (λf × idB) = f。∎
Set 验票:CB 就是函数集 {B → C},ev(φ,b) = φ(b);λf(a) 是「一元函数 b ↦ f(a,b)」。万有性写成同构即指数定律:
Hom(A × B, C) ≅ Hom(A, CB)
——映射进「函数仓库」恰是「两参数映射」。这个名字致敬逻辑学家 Curry:他三十年代就把两参数函数拆成一串一参数函数;编程语言里的柯里化、Python 的 lambda 与偏函数,都是这条万有性的工程化身。第六章 Curry–Howard 对应里,它将升格为「蕴含即函数」的逻辑骨架(第 76 页立刻预演)。
注意 Set 不是处处能做「函数当对象」:CB 要对一切 A 万有,这在 Set 成立(函数集足够大),在部分范畴(如某些预序框架)会缺席——缺席与否,本身成为范畴的身份证,见下一页。
把积、终对象、指数三件套打包,就得到一张含金量极高的「身份证」。
Cartesian 闭范畴(CCC)。具有有限积、终对象、且任意两对象 B, C 都有指数 CB 的范畴。∎
Set 是 CCC;更妙的是,薄 CCC(任何 Hom 集至多一个箭头)恰好是Heyting 代数——直觉主义逻辑的代数化身。对照表一出,逻辑与算术在同一条生产线上:
| 逻辑(命题) | CCC(对象与箭头) | Set 实现 |
|---|---|---|
| 「P 与 Q」∧ | 积 P × Q | 有序对 |
| 真命题 ⊤ | 终对象 1 | 单点集 |
| 「P 蕴含 Q」→ | 指数 QP | 函数集 |
| 假言推理 P, P→Q ⊢ Q | 求值 ev: QP × P → Q | 代入得值 |
| 证明(构造性) | 箭头 1 → P | 选一个证据 |
读一遍最妙的一行:假言推理(modus ponens)=求值映射。「由 P 与 P→Q 得 Q」这条千年推理规则,在 CCC 里就是把函数配上参数按下扳机——逻辑的最小动作,原来是千万人每天写的 ev。而「证明=箭头」一栏,正是第六章 Curry–Howard 对应(命题即类型、证明即程序)的预告片。
还有一层伏笔:CCC 只保证「有 →」这类构造,不保证排中律 P ∨ ¬P——「或」在薄 CCC 里是并不总存在的并。逻辑里被直觉主义挡下的排中律,在范畴这边成了「未必存在的余积」。这不是缺陷,是更精细的地图:哪些推理要资源、哪些要构造,第六章拓扑斯一节(第 158 页)继续深挖。
检索旧知:命题演算里的「P → Q 有证明 = Q 可从 P 构造」,与指数定律 Hom(1 × P, Q) ≅ Hom(1, QP) 逐字对译——Currying 在逻辑侧的回声。
泛性质签发的证件始终写着两行:存在,与唯一。本页把「唯一」铸成定理——它将贡献第六章「up to iso」世界观的全部底气。
定理(积的唯一性)。若 (P, π1, π2) 与 (Q, ρ1, ρ2) 都是 A, B 的积,则存在唯一同构 φ: P → Q 保持投影:ρ1∘φ = π1,ρ2∘φ = π2。
证(三行)。① 积的万有性把 (π1, π2) 装进 (Q, ρ1, ρ2),得 φ = ⟨ρ1,ρ2⟩: P → Q;反向得 ψ = ⟨π1,π2⟩: Q → P。② 考察 ψ∘φ: P → P:它与 idP 都满足「投影后为 π1, π2」,而 (P, π1, π2) 自身的万有性说这样的箭头唯一——故 ψ∘φ = idP;同理 φ∘ψ = idQ。③ φ 与 ψ 互逆,φ 为所求同构;其唯一性:任何保投影的同构都在万有性的唯一分解之列。∎
这三行证明是全章最值得咀嚼的文本:唯一性不是附加彩蛋,而是用来证同构的引擎——「任何两个都一样」由「分解唯一」一步带出。线性代数里「两组基之间过渡矩阵唯一可逆」、群论里「循环群生成元的像决定同构」,都是这一句的旧相识。
于是「由关系定义对象」获得完整含义:泛性质不给出任何一个具体的 P,却把所有合格的 P 钉死到同构。既然一切后续定理对同构一视同仁,「选哪一份答卷」便无关紧要——对象即同构类,个体让位于结构。这句话的哲学分量,第六章(三)再展开。
一个 terminology 速记:「泛性质的存在与唯一」在文献里常写作「the universal object, unique up to unique isomorphism」——「唯一的,直到唯一的同构」。两处「唯一」各司其职:前者靠存在性,后者靠分解唯一性。
一句话直觉。极限不是新构造,而是给任意图形配顶点:画什么图,就有什么极限——计算极限=先画对图,再解万有方程。
定义(图形范畴)。小范畴 J 称图形形状,函子 F: J → C 称一张 J 形的图。图 F 的锥是对象 L 加上一族态射 λj: L → Fj(j 跑遍 J 的对象),使每条边 u: j → j′ 满足 Fu ∘ λj = λj′。万有锥(到任何锥有唯一分解)的顶 lim F 即极限;箭头翻转同法得余极限 colim。
一句话直觉。极限家族太大,需要分层管理:连通极限(图是连成片的)与有限极限(图只有有限个对象与边)是两个最常用的档位。
定义(连通极限)。图形 J 连通(把对象当点、边当线,图连成一片)时,J 形极限称连通极限。典型:等化子、拉回、核。有限极限:J 的对象与态射皆有限。有穷积、等化子、拉回都在此档。能造一切有限极限的范畴称有限完备;Set、Grp、Top、Vec 全部有限完备。
一句话直觉。数系的每一次扩张——整数、有理数、多项式环、分式环——都可用泛性质一句话定义。定义换了读法,定理换了国籍。
一句话直觉。泛性质最大的坑不在定义本身,而在「用旧直觉偷读新定义」。五面墙钉在一张卡上。
例 1.在 Set 中取 A = {0,1}、B = {a,b},写出积并验证万有性。
解。A × B = {(0,a),(0,b),(1,a),(1,b)},四点方阵,投影取第一、第二坐标。给定 f: Q → A、g: Q → B(如 Q = {∗},f(∗)=0、g(∗)=b),则 ⟨f,g⟩(∗) = (0,b)——万有性说它唯一:点 ∗ 的去向被两条投影方程同时钉死。∎
例 2.群范畴中求 ℤ/2 与 ℤ/3 的积,并连向中国剩余定理。
解。积为直积 ℤ/2 × ℤ/3(逐点加法),六元素。由 2 × 3 = 6 且两因子互素,同态 ℤ/6 → ℤ/2 × ℤ/3(1 ↦ (1,1))是同构——这正是中国剩余定理:一个模 6 的钟,同时看模 2、模 3 两只钟即唯一确定。泛性质视角:积的万有性说「进 ℤ/6 的同态」恰是「一对进 ℤ/2、进 ℤ/3 的同态」——CRT 是积的万有性在有限群上的年报。∎(第 84 页习题 5 把「唯一」补成完整证明。)
例 3.薄范畴 Pos 中,积与余积是什么?
解。预序范畴箭头 = ≤。「到 P 的一对箭头」即 x ≤ a 且 x ≤ b;万有性要求存在最大下界——积=下确界 inf{a,b}。对偶地余积=上确界 sup{a,b}。在 (ℕ, ≤) 上:inf = min,sup = max。有全部二元 inf/sup 的预序叫格——「薄 CCC 还要指数」,格论从此挂上范畴的车厢。∎
例 4.Ab 中 ℤ ⊔ ℤ(余积)是什么?Grp 中呢?
解。Ab 中余积是直和 ℤ ⊕ ℤ:[f,g](m,n) = m f(1) + n g(1) 唯一合法(加法可交换,两块互不干扰)。Grp 中余积是自由积 ℤ ∗ ℤ:两副生成元的交错字,无任何交换律可借——同一张投标书,交换律的有无交出两种答卷。∎
通法提示:积与余积的题先问三句——「箭头向哪边?」「万有性约束谁?」「这个范畴的砖是什么?」三问答完,构造自然落地。
例 1.Set 中 f: {1,2,3} → {0,1} 送 1,2 ↦ 0、3 ↦ 1;g: {x,y} → {0,1} 送 x ↦ 1、y ↦ 0。求拉回。
解。P = {(a,b) : f(a) = g(b)} = {(1,y),(2,y),(3,x)}——「0 对 0、1 对 1」的配对。投影 p1 取左、p2 取右;与 p2 的纤维对账:p2−1(y) = {(1,y),(2,y)} ≅ f−1(g(y)) = f−1(0) = {1,2} ✓。∎
例 2.把「核=沿零的拉回」算一遍:f: ℤ/6 → ℤ/3 为模 3 投像。
解。零映射 0: 0 → ℤ/3;拉回 {a : f(a) = 0} = {0, 3} ≅ ℤ/2。万有性验票:任何 h: T → ℤ/6 使 f∘h = 0,其像落在 {0,3} 内,唯一过 k: ℤ/2 ≅ {0,3} → ℤ/6 分解 ✓。∎
例 3.验证「交=沿包含的拉回」:A = 偶数、B = 3 的倍数,皆含于 ℤ。
解。拉回 {(a,b) : a = b} 恰好对出 A ∩ B = 6 的倍数——两条约束的交点,6 = 2 × 3 又见 CRT。∎
例 4.证明:等化子是拉回的特例——f, g: A → B 的等化子 ≅ ⟨id, f⟩ 与 ⟨id, g⟩: A → A × B 的拉回。
解。拉回的条件 ⟨id,f⟩∘p1 = ⟨id,g⟩∘p2 两投影对比即 p1 = p2 与 f∘p1 = g∘p2,合成恰为「过 A 且两条路重合」——与等化子万有性逐句相同。∎(极限统一性的第一枚铁证:第 74 页公式把它自动算出。)
通法提示:算拉回三步——「列出两条边的像 → 配对相等者 → 与纤维对账」。第三步最常被省略,而它恰是万有性的体检表。
1.Set 中 Q = {0,1},f: Q → {a,b} 送 0↦a, 1↦b,g: Q → {x,y} 送 0↦y, 1↦y。写出 ⟨f,g⟩ 并逐点验证两条投影方程。
提示:⟨f,g⟩(0)=(a,y)、⟨f,g⟩(1)=(b,y)——每点由两条方程同时决定,体会「唯一」从何而来。
2.构造双射 Hom(Q, A ⊔ B) ≅ Hom(Q, A) × Hom(Q, B),并指出逆映射用了万有性的哪半句。
提示:正方向 h ↦ (h∘ι1, h∘ι2);逆方向就是 [f,g]——「存在」造逆,「唯一」证互逆。
3.在 (ℕ, ≤) 中求 {4, 6} 的积与余积;再问:若换成 (ℕ, | )(整除序)呢?
提示:≤ 序下 min/max;整除序下积=最大公约数、余积=最小公倍数——「乘法的两条路」在两种序里的化身,例题课(一)例 3 的姊妹题。
4.求 f(x) = x2 与 g(x) = x( ℝ → ℝ)的等化子,并用万有性语言复述为什么只取这两个点。
提示:x2 = x 的解 {0,1};「任何与两条路兼容的 h,像必落在共识区」——万有性是共识区的最大性证书。
5.用积的万有性证明:同态 ℤ/6 → ℤ/2 × ℤ/3(1 ↦ (1,1))是双射。(例题课(一)例 2 的欠账。)
提示:单=1 的像生成整群(6 阶),满=两分量同时非零的同态恰有 6 个——或直接用 CRT。泛性质视角:「进积」=「一对进」,Hom 集计数即得。
6.验证:Set 的终对象是任意单点集 {∗}、始对象是空集;并说明「终对象=空积、始对象=空余积」两句话各自对在哪。
提示:空积=「没有任何投影方程」,只剩「从任何处恰一箭头」;空余积对偶。第一、二章始终对象在此归队。
1.模仿第 77 页定理,证明 A × B ≅ B × A(保投影的同构唯一)。
提示:两份「积答卷」互相唯一分解——第 77 页三行证明原样套用,唯一性引擎再启动。
2.证明等化子的万有性在 Set 中成立:E = {x : f(x) = g(x)},任何 h: X → A 使 f∘h = g∘h 必经 e 唯一分解。
提示:h 的像落在共识区是逐点的——u = h 取值即得;唯一性来自 e 是内含映射。
3.Ab 中求 f, g: ℤ → ℤ(1 ↦ 2 与 1 ↦ 0)的余等化子,并验证「第一同构定理」的特例。
提示:商掉 im(f−g) = ⟨2⟩,得 ℤ/2;q ∘ f = q ∘ g 即 2 ≡ 0——「把分歧焊死」的代数全身像。
4.Vec 中 f: ℝ2 → ℝ2 为 (x,y) ↦ (x,0)。求 ker 与 coker,并核对「核=失真的来源、余核=失真的后果」。
提示:ker = 纵轴 ℝ(被压没的方向),coker ≅ ℝ(没被照到的方向)——秩-零化度的范畴装裱。
5.证明纤维传递:拉回方框中 p2 在 b 处的纤维同构于 f−1(g(b))(例题课(二)例 1 已对过账,此处要一般证明)。
提示:双向构造映射并用方框交换性说明互逆——「在 C 处对上号」逐字翻译为集合语言。
6.用泛性质证明第一同构定理:设 f: A → B(Ab 中),则 A/ker f ≅ im f。
提示:商映射 q: A → A/ker f 满足 f∘k = 0,由余核万有性 f 过 q 唯一分解得 ḟ: A/ker f → B;再用 im 的万有性收紧到双射。两件万有武器各出一招。
第三章 30 页的地形:一张投标书(泛性质)层层变奏,五组构造全部是它的化名。
三条「主线走法」:求全者走红色大支(p73–74 把前四格装订成册);对偶爱好者走绿色成对线(p67↔p68、p70 内对、p71↔p72,处处「翻箭头」);接口旅人走蓝色出口(p72 通相邻领域的核与余核;p76 通第六章逻辑——CCC 是 Curry–Howard 的前厅)。
学完本章再回看第一章图 1-16:那里的「函子(p41–43)」在中段运货,本章的「极限(p73–74)」在下游收货——下一章,运货与收货将在「伴随」处握手。
九条带走:
① 泛性质=投标句式:对每个竞争者,存在唯一分解——存在与唯一两条腿,缺一不可。
② 积是一对投影的万有性,Hom(Q, A×B) ≅ Hom(Q,A) × Hom(Q,B);Set 的答卷是笛卡尔积。
③ 余积=积的箭头镜像;Set 的答卷是不交并;Ab 直和、Grp 自由积——同一张标书,各范畴各交各卷。
④ 基数语义:余积是加法的化身,积是乘法的化身;薄范畴里积余积化身为 inf/sup(格)。
⑤ 等化子=让平行二路重合的最大来源;余等化子=把分歧焊死的最小目标。
⑥ 拉回=交换方框的万有补全(Set:对上号的配对);交、核都是它的特例;推出对偶(粘合)。
⑦ 极限把积与等化子装订成册:形状决定影子;Set 完备——「大积 × 筛选」两步造一切极限。
⑧ 指数与 Currying:Hom(A×B,C) ≅ Hom(A,CB);CCC 里假言推理=求值,证明=箭头。
⑨ up to iso:万有对象的唯一性由分解唯一性一步带出——定义即定理,个体让位于结构。
正面清单(下半章)。
与上半章的接口。上半章(3.1–3.12)立泛性质句法与四大主角(积、余积、等化子、拉回)并抵达 Cartesian 闭范畴;下半章把句法推广到任意图形、验证存在性、并把句法用回数系构造。至此「万有之眼」配备齐全——但每一次「求万有」都在重复同一种模式:一对互相校准的构造。下一页衔接讲义把模式显影:伴随。
「存在由万有保证。」
古典定义靠构造:给出一张图纸,照着盖出 A × B。泛性质换了姿势:先立法,后验票——「谁能让一切竞争者唯一分解,谁就是积」。存在性保证中标者不缺席;唯一性保证中标者之间无从分辨(第 77 页三行证明)。于是「是什么」被「如何与万物相处」取代:我们没有盖出任何一栋房子,却把整片街区的地籍图一次画完。
这是数学里的法治精神:不指定谁当选,只规定当选者必须满足什么。它带来一种崭新的「存在」观——存在的意义不是「在某个仓库里被找到」,而是「在与全部他者的关系网中占定一个位置」。第六章(三)将把这句判词写进哲学:结构先于个体,而且结构先行担保了个体的存在。
对照第 34 页思想卡(「对象是它的关系之总和」):那一页说「知其关系即知其对象」(Yoneda,认识句);本页说「定其关系即得其对象」(泛性质,存在句)——一知一得,合成本册暗线的两联。
本页挑战把第 49 页的「可表函子」与第 73 页的「极限」焊接起来——这一焊,就是第四、五章「伴随」的前身。
命题。对任意小形状 J、图 D: J → C(设极限存在),有同构
Hom(C, Lim D) ≅ Lim( Hom(C, D(−)) ),对一切 C。
读法。左边:从 C 进万有锥的箭头。右边:把 D 逐点换成 Hom 集后再取一次极限——「锥的族」。Hom(C,−) 好像一台投影机:把 C 里的极限原样投成集合层面的极限。
三个实验台阶。① 写出右边极限的元素是什么样:一族 xj ∈ Hom(C, D(j)),沿每条 α: i → j 满足 D(α)∘xi = xj——这不就是「锥」的定义逐字重抄?② 把族的全体分量拼成一条箭头 C → Lim D(用极限的万有性正向走);反向用投影拆箭头为族(用投影方程);③ 验证两向互逆——「唯一分解」与「投影决定」各出半力。∎
为什么值得挑战。此命题说:极限函子可表——「进极限的箭头」这个集合函子,恰好由对象 Lim D 表示(第 49 页可表函子的 C ↦ Hom(A,C) 换了方向兄弟)。可表性是范畴论的「橡皮图章」:一旦盖上,Yoneda(第 50 页)的全部火力立即可用。第六章(二)「Yoneda 的认识论」将把今天这枚图章解释成一句认识论判词:认识一个极限,只需认识所有打进它的箭头。
checkpoint:若完成了三个台阶,顺手验证特例 J 为散两点——命题退化为 Hom(C, A×B) ≅ Hom(C,A) × Hom(C,B),第 67 页的镜像公式。
让 Python 当一回验票员:给它一个平行对 f, g 与一个候选等化子,程序枚举所有竞争者,验证万有性——「对每个……存在唯一」逐字落地。
from itertools import product
# 图:f, g : A → B(平行对)
A = [0, 1, 2, 3]
B = [0, 1]
f = {0: 0, 1: 0, 2: 1, 3: 0}
g = {0: 1, 1: 0, 2: 1, 3: 1}
# 候选等化子:共识区 E 与内含 e
E = [a for a in A if f[a] == g[a]] # 应得 [1, 2]
e = {a: a for a in E} # 内含 e: E ↪ A
def arrows(src, dst):
"""枚举 src → dst 全体映射。"""
return [dict(zip(src, vals)) for vals in product(dst, repeat=len(src))]
def check():
for h in arrows(A, A): # 每个竞争者 h: A → A
if all(f[h[a]] == g[h[a]] for a in A): # 兼容(f∘h = g∘h)
us = [u for u in arrows(A, E)
if all(e[u[a]] == h[a] for a in A)] # 分解 e∘u = h
if len(us) != 1: # 存在且唯一失守
return False
return True
print("E =", E)
print("万有性(存在且唯一分解):", check())
预期输出:E = [1, 2],万有性 True。程序把「对每个竞争者 h(256 个映射里兼容的那些)……分解 u 唯一」逐条数过——泛性质第一次被枚举出来。
改造任务。① 把 E 换成任何真子集(如 [1]),check 应报 False——万有性会揪出「太小」的冒牌等化子;② 加一个更大的候选 E'(含不兼容点),看兼容性条件先把它筛掉;③ 把平行对换成沙发图(两条边),照第 74 页公式造拉回并验票——形状变了,程序骨架不变。
验票心得:万有性里最费算力的是「对每个竞争者」——范畴论替把这个全称量词炼成了定理(第 90 页),程序只在小世界里跑,定理在大世界里成立。
《九章算术》粟米章开篇立表:「粟率五十,粝米三十。」今有粟一斗,问粝米几何?今有术答:10 × 30/50 = 6 斗。但真正深刻的是刘徽对「率」的注解——率不是两个数的比,而是一组量「自相与定」的关系结构:粟与粝按 50 与 30 相与,数值只是这个关系的采样。
刘徽给出率的三种合法变换:「乘以散之,约以聚之,齐同以通之。」率可以整体放大缩小(散、聚)而关系不变——这正是「up to iso」的中国先声:50:30 与 5:3 是同一个率,正如任何两份积答卷是同一个积。个体数值让位于关系结构。
「齐同以通之」尤妙:两段率要接力,须先「通」出公共单位(30 既是粝的率、又是下一段的率)——这与拉回里「在 C 处对上号」、极限里「沿形状走得通」是同一种思维:关系要相接,必先有公共中介;中介选定后,复合自动唯一。泛性质两千年前的表亲,就睡在算学家的注疏里。
下一站预告(第四、五章札记):珠算口诀「二一添作五」——除法的每一位商都是一次「自由构造」,万有性的算盘版。
| 对象 | 一句话定义 | 页 |
|---|---|---|
| A × B(积) | ⟨f,g⟩ 唯一使 π1∘⟨f,g⟩ = f, π2∘⟨f,g⟩ = g | p67 |
| A ⊔ B(余积) | [f,g] 唯一使 [f,g]∘ι1 = f, [f,g]∘ι2 = g | p68 |
| 积的 Hom 式 | Hom(Q, A×B) ≅ Hom(Q,A) × Hom(Q,B) | p67 |
| 终/始对象 | 空积/空余积(Set:{∗}/∅) | p67, 55 |
| 等化子 | e: E → A,f∘e = g∘e 的万有来源 | p70 |
| 余等化子 | q: B → Q,q∘f = q∘g 的万有目标(Ab:商 im(f−g)) | p70 |
| 拉回 | f∘p1 = g∘p2 的万有方框(Set:{(a,b)}) | p71 |
| 推出 | 沿公共来源的万有焊接(Set:并后商) | p71 |
| 核/余核 | 沿零的拉回/推出(Ab:ker f/B/im f) | p72 |
| 锥与极限 | λj: C → D(j) 全程交换的万有锥 | p73 |
| Set 完备性 | L ⊆ ∏ D(j):兼容族之集(积 × 等化子) | p74 |
| 指数 CB | ev 万有:Hom(A×B,C) ≅ Hom(A,CB) | p75 |
| CCC | 有限积+终对象+一切指数(薄 CCC=Heyting 代数) | p76 |
| up to iso | 两份万有答卷唯一保结构同构 | p77 |
| 极限可表 | Hom(C, Lim D) ≅ Lim Hom(C, D(−)) | p90 |
第三章完成了什么。一个句法(泛性质)统吃全部构造:积、余积、等化子、拉回、核与余核、指数对象,全部是「图形+万有锥」的特例;存在性有积木定理担保;数系构造(分式环、多项式环、商与积)全部换上箭头语言的户籍。
第三章埋下过一张未兑现的支票:相邻领域第一、二章的自由群——「由生成元集合自由生成的群」。自由,自由在哪里?答案朴素得惊人:除了群的公理,没有任何别的约束。生成元 a, b, c 生出的字——如 ab−1cca——彼此不受牵连,唯一的规矩是结合律与逆元。「自由」=「万有」:从生成元出发的任何映射,都唯一扩张成同态(第三章 p77 造同构时用的正是这条)。
把「造」与「忘」并排看:自由群函子 F: Set → Grp(造),遗忘函子 U: Grp → Set(忘)。直觉说它们「方向相反、地位对等」——本章把这个直觉磨成全书最锋利的工具:伴随(F ⊣ U,读「F 左伴随于 U」)。伴随是泛性质的成年形态:它不给单个构造立法,而把「造与忘」这对关系整体立法。
本章航线:立伴随的三种化身(p96–98)→ 自由构造与 Galois 连接(p99–100)→ 右伴随保极限(p101)→ 伴随的演算与判据(p102–111)→ 章末成套:例题、习题、地图、小结与速查(p112–123),最后由衔接讲义(p124)把问题交给第五章。暗线本章翻出新面:自由与遗忘互为镜像,结构由镜像自发长出。
从自由群的万有性里抽出结构。自由群说:任何映射 S → UG(生成元在 G 底集里选像)唯一扩张为同态 F(S) → G。两边都是「映射的集合」,于是有一行等式:
HomGrp(F(S), G) ≅ HomSet(S, U(G))
左边是群世界的同态,右边是集合世界的普通映射——跨过世界界线,个数不多不少。这就是伴随的全部内容:造与忘这对函子,把两个世界的 Hom 集逐点对上。
伴随函子。F: C → D 左伴随于 G: D → C(记 F ⊣ G),若对一切 A ∈ C、B ∈ D 有双射 HomD(FA, B) ≅ HomC(A, GB),且双射对 A、B 自然(p97 精确化)。∎
读法一(构造–遗忘):F 造结构、G 卸结构;「进 GB 的箭头」与「进 B 的保结构箭头」一样多——自由构造不多不少地保住了万有性。
读法二(万有性):固定 B,取恒等的像 εB: F(GB) → B,则任何 FA → B 都唯一地经 εB 分解——第三章的投标句式(p66)重演,而且处处中标:伴随的每个成分都在投标。
术语速记:左伴随管「造」(自由、离散、生成),右伴随管「忘」(遗忘、余离散、求值)。F ⊣ G 中 F 在左、G 在右——左右之名即造忘之序。
「自然」二字落地。伴随的双射不是零散巧合,而是对全部箭头一致的同构。
伴随(正式版)。F ⊣ G 指有自然同构 Φ: HomD(F−, −) ⇒ HomC(−, G−):对每对 A, B 有双射 ΦA,B,且对任意 a: A' → A、b: B → B',两条绕路给出的映射相等(先复合后转写 = 先转写后复合)。∎
自然性的分量要掂清:若只要求每对 (A,B) 各自有双射,定义会松垮成逐点巧合;加上自然性,生成元集变动时自由群才处处兼容。第一、二章的自然方块(p45)在这里领到最重的任务。
伴随三化身的预告(p98 收口):① Hom 同构(本页);② 单位–余单位+三角恒等式(箭头语言);③ 万有箭头(投标语言)。三种语言,一场伴随。
检索旧知:第 49 页可表函子。伴随同构用它的语言重述:Hom(F−, −) 在第一变量里「被 F 表示」——伴随是可表性成对出现的名字。
把伴随同构压缩到最短,得到一对最重要的箭头。伴随的全部信息,浓缩在它们身上。
单位与余单位。伴随 F ⊣ G 的单位是自然变换 η: idC ⇒ G∘F(ηA: A → GFA,是 idFA 的转写像);余单位是 ε: F∘G ⇒ idD(εB: F(GB) → B,是 idGB 的原像)。二者满足三角恒等式:
Gε ∘ ηG = idG, εF ∘ Fη = idF。∎
自由群先验:ηS(s)=生成元 s 作为自由群的单字;εG 把「G 的元素当作生成元写成的字」按 G 乘法求值回去。三角恒等式说:先打包生成元、再拆包求值,货是原货。
三化身等价(细节留 p112 例题课验证):① Hom 同构 ⇒ ② (η, ε) +三角 ⇒ ③ 万有箭头;反向逐段可逆。第三章的投标句式正是 ③ 的母语——「伴随」与「万有」从此互换使用。
检索旧知:Yoneda 的「拆引线」(p50)——「恒等处的取值决定一切」。η 与 ε 正是那条引线:伴随的全部动力,储存在这两族箭头里。
「自由」一族,全部是同一句伴随的不同方言。四例连跑,验票句式完全一致。
例 1(自由群)。F: Set → Grp 送自由群,U 遗忘;HomGrp(F(S), G) ≅ HomSet(S, UG)——指定生成元的像即定同态。∎
例 2(自由模)。Set → Vec(域 k 上):自由向量空间 k(S)=形式线性组合;HomVec(k(S), V) ≅ HomSet(S, UV)——基的像定线性映射。相邻领域「基的唯一表出」即此伴随的影子。∎
例 3(自由么半群)。Set → Mon:S 送字表 S∗(拼接为乘法、空字为单位);HomMon(S∗, M) ≅ HomSet(S, UM)。p152 札记的珠算口诀正是字表上的操作。∎
例 4(离散与余离散拓扑)。Set → Top:左伴随送离散拓扑(一切子集开,约束最松),右伴随送余离散拓扑(仅 ∅ 与全空间开,约束最紧);HomTop(Sdisc, X) ≅ HomSet(S, UX)。相邻领域的乘积拓扑将在 p101「右伴随保极限」下重获解释。∎
| 伴随 | 左(造) | 右(忘) | 「指定去向」的读法 |
|---|---|---|---|
| Set → Grp | 自由群(字) | 底集合 | 生成元的像定同态 |
| Set → Vec | 自由向量空间 | 底集合 | 基的像定线性映射 |
| Set → Mon | 字表 S∗ | 底集合 | 字母的像定同态 |
| Set → Top | 离散拓扑 | 余离散拓扑 | 任一映射自动连续 |
四行一列:构造不同、遗忘相同、读法同构——「自由=万有」在范畴语言里成为可执行的模板。对偶方向也有故事:Set → Grp 的右伴随(「余自由群」)不存在——没有一个群能接住万有性的全部映射;而 Set → Top 双侧都有伴随。伴随的存亡,本身是范畴身份的一部分。
判别口诀:看见「最自由的」「约束最少的」「唯一扩张的」,找左伴随;看见「最紧的」「忘掉结构的」「取底层的」,找右伴随。
伴随不只住在代数里。预序集(薄范畴)之间的伴随有个古老的名字——Galois 连接,它在实数与整数之间就有现身。
Galois 连接。预序 (P, ≤), (Q, ≤) 间单调映射 f: P → Q、g: Q → P 构成伴随 f ⊣ g,当且仅当对一切 x, y:
f(x) ≤ y ⟺ x ≤ g(y)。∎
标准实例:上取整 ⊣ 下取整。⌈x⌉ ≤ y ⟺ x ≤ ⌊y⌋(x 实、y 整)。验三个数:x = 1.2, y = 1——左 ⌈1.2⌉ = 2 ≤ 1 ✗、右 1.2 ≤ ⌊1⌋ = 1 ✗,两侧同步拒绝;y = 2——左 2 ≤ 2 ✓、右 1.2 ≤ 2 ✓,两侧同步放行。门槛一起升降,正是伴随同构在预序世界里的样子(Hom 集=真值 {✓, ✗})。
闭包也来报到:自伴随的复合 T = g∘f 是闭包算子(单调、膨胀 x ≤ Tx、幂等 T∘T = T)。拓扑闭包、子群生成、线性 span——全世界的闭包算子都是 Galois 连接的影子,而它们将在 p129 作为「幂等单子」归队。
HA 接口:伽罗瓦理论的「固定域 ⊣ 固定群」、同调代数的「生成 ⊣ 饱和」——凡「两侧门槛同步」的配对全是 Galois 连接。名字是历史的,结构是范畴的。
伴随不只转写箭头,还搬运极限。这是本章第一枚大定理,也是第三章(极限)与第四、五章(伴随)的合流点。
定理(右伴随保极限)。设 F ⊣ G,图 D: J → D 有极限,则 G(Lim D) 是图 G∘D 的极限。
证(三行,全是已验收的旧武器)。对任意 C:
Hom(C, G(Lim D)) ≅ Hom(FC, Lim D) ≅ Lim Hom(FC, D(−)) ≅ Lim Hom(C, GD(−))
第一跳与第三跳用伴随同构,中间跳用极限可表性(第 90 页挑战命题)。链首尾对照可表性刻画,G(Lim D) 正是 G∘D 的极限。∎
对偶句同样成立:左伴随保余极限——自由群 F(S ⊔ T) = F(S) ∗ F(T),p68 埋下「自由积」的名字在此兑现。这一对定理把存在性问题变成「搬运问题」:
应用三连。① U: Grp → Set 右伴随、Set 完备(p74)⇒ 任何小图在 Grp 的极限由 U 搬回 Set 算出再装回群结构——Grp 完备。② 同理 Vec、Mon、Top 完备(乘积拓扑=右伴随搬极限的实体)。③ 余极限侧:Set 余完备 + 左伴随保余极限 ⇒ 商群、自由积的存在与万有性一次到位。∎
「右伴随保极限」还有一副哲学面孔:遗忘不失极限——群论里的直积、交、等化子,就是想象的那个集合层面的东西;结构在极限处「不添乱」。这不是巧合,是伴随身份的必然:能当右伴随的遗忘,本身就是「温和」的遗忘。
对照 p74:当时用「积 × 等化子」两手在 Set 内部造极限;今天 U 把整座工厂原样搬进 Grp。存在性从「逐范畴攻关」变成「查伴随表」——这就是范畴论的杠杆。
一句话直觉。伴随是一对互相校准的构造,但校准是「过紧」的:给定一边,另一边唯一(到自然同构)。想造自由群?只要遗忘函子定了,自由函子没有第二个答案。
定理(伴随的唯一性)。设 F, F′ ⊣ U(同为 U 的左伴随),则存在自然同构 F ≅ F′;对偶地,右伴随亦然。证:Hom(FX, A) ≅ Hom(X, UA) ≅ Hom(F′X, A) 对一切 X、A 自然成立;固定 X、取 A 跑遍,由 Yoneda 精神(对可表函子的两次读数)得 FX ≅ F′X,自然性逐方块核对。∎
一句话直觉。Hom 同构是伴随的「合同书」,单位与余单位是合同的实际履约——而三角等式是履约的两条纪律:装了再拆,等于没装过。
定义(单位与余单位)。伴随 F ⊣ U 的单位是自然变换 η: idC ⇒ UF——分量 ηX: X → UFX 恰是 Hom 同构里 idFX 的原像(「自由构造的万能引入」)。余单位 ε: FU ⇒ idD 的分量是 idX 的像(「万有读数的万能引出」)。三角等式:Uε ∘ ηU = id 与 εF ∘ Fη = id。
一句话直觉。可表函子是「单件的万有」(对一个对象的一次问询);伴随是「成批的万有」(对全部对象同时问询)。批发价更便宜,也更有用。
定理(伴随与可表)。U: C → D 有左伴随,当且仅当对每个 A ∈ D,函子 D(A, U−): C → Set 可表;表示对象 FA 拼起来(连同读数)即左伴随。证明是逐字翻译:可表性给自然同构 D(A, U−) ≅ C(FA, −)——这正是 Hom 同构的逐 A 版本。∎
一句话直觉。伴随不必「一次造全」:逐对象问「谁最贴近」,再验证这些点读数自然拼装——这份便利叫点式伴随。
定义(点式伴随)。对 f: A → B(Set 中映射),直接像 Σf: 𝒫A → 𝒫B(子集送到子集)有右伴随 f-1(逆像)、逆像又有右伴随 ∀_{f(「对所有 f-原像成立」)。三个函子两两伴随:Σf ⊣ f-1 ⊣ ∀_{f——幂集上的「三明治」。它是一阶逻辑量词的范畴化身:∃ = 直接像、∀ = 右伴随的直接像。
一句话直觉。「自由」不是一种构造,而是一族构造:结构剥到哪一层,自由就补到哪一层——层级之间还能换乘。
忘却的层级。代数结构按「装备多少」排座次:群 > 幺半群 > 集合;环 > 乘法幺半群 > 集合;模 > 阿贝尔群 > 集合。每级遗忘 U 的左伴随叫该级的自由构造:Set → Mon 给自由幺半群(词)、Mon → Grp 给群化(形式逆)、Set → Ab 给自由阿贝尔群(形式和)。
一句话直觉。把「转置」「双对偶」「配对」从线性代数搬进范畴词典,每个词都自动获得伴随读法——旧知识成为新语言的免费词汇。
对偶的伴随读法。域 k 上有限维向量空间范畴 Vec:对偶函子 (−)* = Homk(−, k): Vec° → Vec。配对给出自然同构 Hom(V*, W) ≅ Hom(W*, V)(线性映射与「转置的转置」互认)——即 (−)* ⊣ (−)*°:对偶函子与它自己的反变版本互为伴随。双对偶 (−)** 是这一伴随的单位复合,有限维时是自然同构(自反性)。
一句话直觉。普通的伴随对左右各有一位伴偶;Frobenius 伴随要求左右是同一位——对称到可以「左右通吃」。
定义与样板。伴随对 F ⊣ U 称 Frobenius 型,若同时 U ⊣ F。两个标准样板:① Vec 的对偶(上页);② 有限群 G 的表示:子群 H ≤ G 的限制函子 Res 有左伴随 Ind(诱导表示)与右伴随 coind——有限群时 Ind ≅ coind,即 Frobenius 互反定理:
HomG(Ind V, W) ≅ HomH(V, Res W) ≅ HomH(V, Res W) 双向成立。
一句话直觉。「左伴随存在吗?」不再是灵感问题,而是两道体检:保极限(义务)+解集条件(材料)——全过就发执照。
定理(伴随函子定理,初等版)。设 U: C → D,C 局部小且具全部极限。则 U 有左伴随 ⟺ ① U 保全部极限;② 对每个 X ∈ C,万有箭头候选集 {(A, a: X → UA) 的「初等对象」} 被某个集合控制(解集条件)。此时左伴随在 X 处取「初等对象中的万有者」。
一句话直觉。伴随的名声大,误读也多。五面墙钉在一张卡上——其中最危险的是把「伴随」与「逆」混为一谈。
一句话直觉。把伴随从「定理陈列」变成「随身工具」,只需三招——招式不多,纪律要紧。
例 1.把自由群伴随 F ⊣ U 的 Hom 同构显式造出来,并验证两向互逆。
解。正向:给同态 α: F(S) → G,限制到生成元上得映射 α∘ηS: S → UG(ηS(s) 是单字 s,p98)。反向:给映射 β: S → UG,由自由群的万有性唯一扩张成同态 F(S) → G(生成元的像定为 β)。互逆:正向再反向——扩张后再限制,生成元的像仍是 β,唯一扩张重合;反向再正向——把 α 在字上按 G 乘法求值再当生成元看,字与求值互相决定,仍是 α。∎
例 2.证明第三章的 Currying(p75)是伴随:对固定集 S,(−)×S ⊣ (−)S。
解。伴随句式逐字对上:Hom(A×S, B) ≅ Hom(A, BS)——左边「吃一个带参数的二元映射」,右边「吃一元映射族」。单位与余单位就是老朋友:ηA(a) = (s ↦ (a,s))(第三章的「配对」)、εB = ev(求值映射,p75)。指数 functor 就是右伴随——CCC 里每一句指数定律,都是一场伴随的转写。∎
例 3.数值对拍 ⌈x⌉ ⊣ ⌊y⌋,并求复合闭包 T = ⌊⌈x⌉⌋ 的不动点。
解。门槛律 ⌈x⌉ ≤ y ⟺ x ≤ ⌊y⌋(p100):x = 2.7, y = 3——左 3 ≤ 3 ✓、右 2.7 ≤ 3 ✓,同步放行;y = 2——左 3 ≤ 2 ✗、右 2.7 ≤ 2 ✗,同步拒绝;整数边界 x = 2, y = 2 两侧同 ✓。闭包 T(x) = ⌊⌈x⌉⌋ = ⌈x⌉(上取整已是整数,再取下整不动):膨胀、幂等,不动点恰是整数集——p100「闭包算子」的数值全身像。∎
例 4.用「右伴随保极限」(第 101 页)逐条对账 U: Grp → Set 的三张实例票。
解。①直积:群 ℤ/2 × ℤ/3 的底集 6 元素 = U(ℤ/2) × U(ℤ/3) 的 2 × 3——乘积的底层就是集合积;②交:子群的交的底层 = 底集合的交;③等化子:群同态的共识区 = 集合等化子。三张票全是「遗忘不失极限」:U 搬运时原样交付(第 101 页应用①的具象)。对偶票:左伴随保余极限,F(S ⊔ T) = F(S) ∗ F(T)——p68 的自由积再次兑现。∎
通法提示:验证伴随三步——「写出 Hom 同构的双向映射 → 动一动变量查自然性 → 有需要再查三角恒等式」。第二步最常被偷懒:生成元集换一换、参数集换一换,双射若不兼容,前面全是白搭。
例 4(由伴随读极限:Top 的乘积空间)。问:为什么「积空间的底集合是底集合的积」?伴随读法:忘却 U: Top → Set 有左伴(离散拓扑)与右伴(平凡拓扑)——右伴保极限,故 U(X ×Top Y) ≅ UX ×Set UY。一句话答毕;点集拓扑书的三页论证,是这条范畴论直线的逐点展开。∎
例 5(自由阿贝尔群的伴随验证)。F: Set → Ab,X ↦ ℤ[X](形式整系数和);U: Ab → Set 遗忘。验合同:群同态 ℤ[X] → A 与函数 X → UA 互相对应(同态由基的像唯一决定)——双向、互逆、自然性逐方块核对。∎ 第二招演练:本例也可走可表批量——Ab(A, U−) 可表,表示对象 ℤ[A]。
例 6(LA colim:左伴随保余极限)。验证并集的直和:向量空间族 Vi 的余极限(粘合空间)经左伴随 ℤ[−]: Set → Ab 送到 ℤ[Vi 的余极限]——与「先各自 ℤ[−] 再余极限」给出同一个阿贝尔群。∎ 口诀落地:左伴保余极限(colim 的「出」方向),正与右伴保极限成镜像。
1.写出自由群伴随的 ηS 与 εG 的显式公式,并用「单字生成、按乘法求值」验证三角恒等式 εF ∘ Fη = idF。
提示:F(ηS) 把字「单字 s」送成字「由单字 s 组成的字」?不——它把单字 s 原样嵌进新字表;ε 再按 G 乘法求值,得回原字。装袋一次、拆包一次,货是原货。
2.验证 Currying 伴随 (−)×S ⊣ (−)S 的 η 与 ε 满足另一条三角恒等式 ε(−)S ∘ (−)×S(η) = id(记号按 p98 约定)。
提示:ε 处处是求值 ev;η 是配对。合成读作「先配对再求值」——(a,s) ↦ ((s↦(a,s)),s) ↦ (a,s),逐点恒等。
3.数值对拍:对 x ∈ {0.5, 1, 1.7, 2}、y ∈ {1, 2} 的八组组合,列表判断「⌈x⌉ ≤ y」与「x ≤ ⌊y⌋」是否逐对同真同假。
提示:x=1, y=1 时两侧同 ✓(1 ≤ 1);x=1.7, y=1 时两侧同 ✗;x=0.5, y=1 两侧同 ✓。边界组 x=2, y=2 最值得细看。
4.证明闭包算子 T = ⌊⌈x⌉⌋ 的不动点集恰是整数集,并复述「幂等单子」(μ = id)在此例中的含义。
提示:T(x) = ⌈x⌉;不动点 ⟺ x = ⌈x⌉ ⟺ x 是整数。「幂等」=饱和者再饱和不动——p100 闭包三律的第三条。
5.在薄幺半范畴 (ℕ, ≤, +, 0) 中证明结合子 α 必是恒等箭头,并说明这件事为什么「自动」。
提示:α 的两侧对象间只有一条 ≤ 箭头(薄);两条换括号的路终点相同,故 α 与它的对手都是那条唯一的箭头——薄世界里相干性免费。
6.在 A = {1,2} 上逐点验证幂集单子的单位律:μ∘Pη = id 与 μ∘ηP = id。
提示:Pη(S) = {{s} : s ∈ S},取并得 S;ηP(S) = {S},取并也得 S——「先装箱再并」与「整箱并」殊途同归。
习 5(点式伴随三明治)。对映射 f: A → B,验证 Σf ⊣ f-1 ⊣ ∀_{f(4.10 的幂集三明治)三条合同——并写出每条合同在逻辑量词语言里的读法。
习 6(忘却层级)。从集合 X 出发依次走「自由幺半群 → 群化」两段自由,证明结果满足自由群的泛性质(对一切群 G:Hom(X → G) ≅ Hom(结果 → G))——即「逐级自由」与「一步自由」给出的对象同构(4.11)。
习 7(对偶的对拍)。有限维 Vec 里验证 Hom(V*, W) ≅ Hom(W*, V) 的双向映射与自然性;再举一个无限维反例说明自反性失效(4.12)。
习 8(伴随函子定理实战)。对忘却函子 U: Mon → Set:① 验证 U 保全部极限(底集合逐项);② 写出解集条件里的「初等对象」(词长界碑);③ 按定理拼出自由幺半群并核对泛性质——把第 121 页实验的数字作为证据附件。∎
本章 30 页的地形:一场「造与忘」的辩证。金色=伴随的三套等价立法;绿色=两条标准例与一条硬定理;红色=右伴随保极限(全章第一枚大定理);蓝色=伴随自身的演算与判据。
三条「主线走法」:求全者走红色大支(p101 保极限,随后 p109 的伴随函子定理给出存在的判据);对偶爱好者走绿色线(p99 造、p100 预序里的门槛,p107–108 把「对偶空间」与「Frobenius 伴随」收进同一族);接口旅人走蓝色出口(p104–105 的可表性与点式伴随通向第三章的指数对象,p124 的衔接讲义把问题交给第五章)。
学完本章再回看第三章图 3-12:那里的「投标句式(p66–67)」在本章升格为「伴随」(金块),「极限工厂(p73–74)」被右伴随整座搬走(红块)。下一章,伴随的另一半心跳将被拆下来独立审视——它自己也会长出一套结构,那就是单子。
九条带走。
本章把「造与忘」这一对关系整体立法。下一页换个角度:把伴随的余单位单独拎出来,看它自己能不能生成一套结构——能,而且生成得相当漂亮。那正是通往第五章的桥。
正面清单(例子与判据)。
与上半章的接口。上半章(4.1–4.6)立定义、标准例子与 RAPL;下半章把伴随磨成手艺(唯一性、点式、层级、对偶、Frobenius)并给出存在性判据。全部内容指向一个收束:伴随的心跳(η、ε 与三角等式)可以单独拆下来研究——那就是第五章的主角:单子。
「自由与遗忘互为镜像。」
泛性质给单个对象立法(第 89 页);伴随给「造与忘」这一对关系整体立法。镜像的深意在于:忘记多少,自由就生长多少——自由群的万有性,恰好只覆盖被遗忘掉的那部分结构。自由不是「没有约束」,而是「只余下被遗忘者放行的约束」:造与忘不是两个动作,是一枚硬币的两面,Hom 同构一行把它们写尽。
更惊人的是结构的自生:只要造忘成对,η 与 μ 自动出现、自动合法(三角恒等式免费送来全部单子律)。结构不是从外面加在世界上的,而是在造与忘的循环里自己长出来的——单子是伴随落在地上的影子,影子却有完整的骨架(EM、Kleisli,乃至第六章的两种读法)。Mac Lane 的名言在此有了哲学重量:千姿百态的「代数构造」,原来是同一句公理在不同舞台的重唱。
第六章(三)将把这条线写进认识论:对象在关系中(Yoneda),关系成对处结构自生(本章),故「结构先于个体」不只是口号,而是有两台发动机(泛性质与伴随)的生产纲领。
对照第 89 页思想卡(「存在由万有保证」):那一页是存在句——「定其关系即得其对象」;本页是生长句——「造忘成对则结构自生」。一存在、一生长,合成本册暗线的又一联。
挑战:RAPL 的代数应用。只用「右伴随保极限」,证明下列三题;每题都指认「谁是 U、谁是 F」,再指认涉及的极限形状。
突破口提示。三题共用一个模板:把代数构造写成极限图 → 指认右伴随 → 结论自动落地。文献指引:Mac Lane §V.5(RAPL 与伴随函子定理)、Lang《Algebra》对应章节(代数细节)。
实验目的。把「自由=唯一延拓」的泛性质做成可复算的数字:枚举自由幺半群 {a, b}* 的词、穷举结合律、并程序化「给字母指定像 ⟹ 同态唯一延拓」。
from itertools import product
W = ['']
for L in range(1, 5):
W += [''.join(p) for p in product('ab', repeat=L)]
print('长度<=4 的词共', len(W), '个')
W3 = [w for w in W if len(w) <= 3]
print('长度<=3 的词', len(W3), '个;验证结合律 (uv)w=u(vw):',
all((u+v)+w == u+(v+w) for u in W3 for v in W3 for w in W3),
'(', len(W3)**3, '三元组)')
# 自由延拓(左伴随的读数):a->2, b->3 (mod 6 加法幺半群)
def ext(word):
return sum(2 if c == 'a' else 3 for c in word) % 6
print('延拓同态 φ: {a,b}* -> Z/6 抽查:')
for w in ['', 'a', 'b', 'aa', 'ab', 'ba', 'abb', 'aabbba']:
print(' φ(%r) = %d' % (w, ext(w)))
ok = all(ext(u+v) == (ext(u)+ext(v)) % 6 for u in W3 for v in W3)
print('同态性 φ(uv)=φ(u)+φ(v) 对长度<=3 全对:', ok)
实跑输出。
〖札记〗筹算与「借」:伴随的古老直觉。
古代算家面对「不足」时的标准动作是借:借来的数是「为了完成计算而临时引入的辅助物」,它的唯一义务是让运算走通,且恰好走通、不多占用。《九章算术》盈不足术把这一直觉推向极致:两次假设、两次盈亏,用最少的额外信息夹逼出真值——辅助假设被「用到尽」又「不过度」。
自由构造是同一种美德的范畴论版本:给集合 X「借」一个群结构时,我们只引入必须引入的——元素的一切拼接(词),而不引入任何额外关系(除非关系由群公理强迫)。于是任何「把字母送到群里的方案」都恰好延拓为同态——最省力的构造,换来最广的适用。这不是巧合:伴随的万有性正是「无多余假设 ⟹ 无阻碍延拓」的严格表达。
刘徽注《九章》曰「析理以辞,解体用图」——把道理拆成可运演的词句、把结构画成可观察的图形。范畴论的伴随三角正是这两句话的现代注脚:辞(Hom 同构)与图(三角桥)互为表里。
带走一句话:好构造都「借」得节制——借得最少,还得最快,用得最广。
| 对象 | 一句话定义 | 页 |
|---|---|---|
| 伴随 F ⊣ G | HomD(FA, B) ≅ HomC(A, GB)(自然) | p96–97 |
| 单位 η | ηA: A → GFA(id 的转写像) | p98 |
| 余单位 ε | εB: FGB → B(id 的原像) | p98 |
| 三角恒等式 | Gε∘ηG = id,εF∘Fη = id | p98 |
| 自由群伴随 | HomGrp(F(S), G) ≅ HomSet(S, UG) | p99 |
| Galois 连接 | f(x) ≤ y ⟺ x ≤ g(y)(⌈·⌉ ⊣ ⌊·⌋) | p100 |
| 右伴随保极限 | G(Lim D) ≅ Lim(G∘D)(左保余极限) | p101 |
| 伴随唯一性 | 单位(或余单位)处处同构 ⟹ 另一半被唯一确定 | p102 |
| 点式伴随 | 逐对象核对 Hom(A, GB) ≅ Hom(FA, B) | p105 |
| 忘却的层级 | 忘却函子逐级自由:群 ← 幺半群 ← 集合 | p106 |
| 对偶空间 | V ↦ V* 与 V ↦ V** 的伴随读法 | p107 |
| Frobenius 伴随 | 左右伴随重合(自伴随)的一族 | p108 |
| 伴随函子定理 | 左伴随存在 ⟺ 每个对象都有万有箭头(初对象条件) | p109 |
| Currying 伴随 | (−)×S ⊣ (−)S(ε 即求值 ev) | p111 |
使用建议:伴随是全书最高频的装置,本表建议背到「看见 Hom 同构就能默写 η、ε 与三角」。第五章的速查表把「单子」一族接续在「伴随 ⇒ 单子」一行之后,两表连读即得第四、五章的全部机器。
第四章完成了什么。把「成对的构造」升格为中心定理:伴随——定义三套(Hom 合同、单位余单位、万有性)等价;标准例子一打(自由–遗忘、Galois、量词三明治、指数、对偶、诱导限制);存在性有判据(伴随函子定理);演算有三招与三条纪律。
一句话直觉。第四章的伴随 F ⊣ U 送出一份复合 T = UF——它自带「单位」η 与「乘法」μ,自成一套公理:这就是单子。本章先给张量世界立规矩(幺半范畴),再把单子研究透彻,最后让两者在「幺半群对象」处会师。
下一步登楼:让「乘法」本身范畴化。幺半范畴=一个范畴配上「张量积」与「单位」。
幺半范畴。数据 (C, ⊗, I, α, λ, ρ):双函子 ⊗: C × C → C(张量积)、单位对象 I、结合子 αA,B,C: (A⊗B)⊗C → A⊗(B⊗C) 与左右单位子 λ, ρ——皆为自然同构,满足五边形与三角相干图。∎
例子先行:(Set, ×, 单点)、(Vec, ⊗, k)——线性代数的张量积、(Ab, ⊗, ℤ)、(Cat, ×, 1)。要点是态度的转变:结合不要求等式,只要求相干的同构——两条「换括号的路」给出同一个重排结果。Mac Lane 的相干性定理说:只要五边形与三角成立,更复杂的相干图自动成立。
为什么容忍同构而不苛求等式?因为真实数学里结合律本来就「差一个同构」:向量空间 (U⊗V)⊗W 与 U⊗(V⊗W) 自然同构而非相等。范畴论不假装差异不存在,而是给差异发牌照——相干性就是牌照的编号系统。
CCC 复习连线:取 ⊗ 为积、I 为终对象,则「闭」幺半范畴(再配内 Hom [B,C] 满足 Hom(A⊗B,C) ≅ Hom(A,[B,C]))恰好是第三章的 Cartesian 闭范畴——指数定律就是「闭」的定义(p75–76)。
有了张量积,「幺半群」这个代数名词可以搬进任何幺半范畴——公理一套,舞台常新。
幺半群对象。幺半范畴 (C, ⊗, I) 中的幺半群对象是 (M, μ, η):μ: M⊗M → M(乘法)、η: I → M(单位),满足结合律 μ∘(μ⊗id) = μ∘(id⊗μ) 与单位律 μ∘(η⊗id) = μ∘(id⊗η) = id(经单位子 λ、ρ 微调)。∎
| 舞台(幺半范畴) | 幺半群对象是 | 注 |
|---|---|---|
| (Set, ×, 单点) | 普通幺半群 | μ 二元运算、η 单位元 |
| (Ab, ⊗, ℤ) | 环 | 加法群上再配分配的乘法 |
| (Vec, ⊗, k) | k-代数 | μ: V⊗V→V 双线性自动 |
| (End(C), ∘, id) | 单子! | 自函子范畴——p128 主角 |
| (Top, ×, 单点) | 拓扑幺半群 | μ 连续;加逆元即拓扑群 |
第四行是本章的枢纽:自函子范畴 End(C)——对象是函子 C → C、箭头是自然变换、「乘法」取复合、「单位」取恒等函子——其中的幺半群对象,正是下一页的单子。Mac Lane 的名言在此兑现:「X 上的单子,不过是 X 的自函子范畴上的幺半群对象——乘法换成复合、单位换成恒等函子」。
这行表的震撼在于「一次定义,处处实例」:环=Ab 中的幺半群对象、拓扑群=Top 中的群对象、单子=End(C) 中的幺半群对象——各分支的「代数构造」原本是同一条公理在各自舞台上的演出。范畴论没有统一各分支的内容,它统一的是各分支的句法。
再走半步:幺半群对象+逆元箭头=群对象。(Top, ×) 中的群对象=拓扑群;(Ab, ⊗) 中的群对象=Hopf 代数——代数各支在范畴语言里重新列队,口令只有一套。第六章(三)将问:这套句法对「数学对象是什么」说了什么?
凡有伴随,必有单子——本章最经济的定理:结构不要钱,伴随自带。
单子。范畴 C 上的单子是三元组 (T, η, μ):函子 T: C → C、自然变换 η: id ⇒ T(单位)、μ: T∘T ⇒ T(乘法),满足单位律 μ∘Tη = μ∘ηT = id 与结合律 μ∘Tμ = μ∘μT。∎
定理(伴随 ⇒ 单子)。设 F ⊣ G(F: C → D)。令 T = G∘F(先造后忘)、η 为伴随单位、μ = GεF(伴随余单位穿越两侧)。则 (T, η, μ) 是 C 上的单子。
证(骨架)。单位律两式即伴随的两个三角恒等式(p98)逐字重抄;结合律是 ε 的自然性方块穿过 G−F。∎
自由群先现身例:T(S) = U(F(S))=「S 上的全部字」;ηS(s) = 单字 s;μ 把「字的字」(字表,每项是一串生成元)拍平成字——两层序列压一层。单子律逐条验:μ∘Tη 每个字包一层再拍平=原字(单位);μ∘μT 与 μ∘Tμ 都是「三层压一层」,先压里层或先压外层结果一致(结合)。
三条线在此拧成一股:第三章的泛性质(伴随的万有语言)、第一、二章的自然变换(η、μ 的兼容性)、即将展开的计算线(单子=程序里的包装句式)。单子不是新物种,是伴随之果。
四个单子走马上任,全部来自伴随,全部能在纸上验票。
例 1(列表单子)。L(A) = A∗(有限序列),来自自由么半群伴随。η(a) = [a]、μ=拍平(表的表 → 表)。单子律:拍平不丢信息。∎
例 2(Maybe 单子)。M(A) = A ⊔ {∗}(「有值或空」)。η(a) = a、μ 两层合并(有一层空即全空)。程序语言的 Optional、可空类型是它的方言。∎
例 3(幂集单子)。P(A)。η(a) = {a}、μ(S) = ∪S(集合族的并);结合律=并的结合。∎
例 4(闭包单子)。Galois 连接 f ⊣ g(p100)造 T = g∘f:闭包算子,η 膨胀 x ≤ Tx、μ = id(幂等)。拓扑闭包、子群生成、线性 span 全体归队。∎
| 单子 | η(单位) | μ(乘法) | 伴随出身 |
|---|---|---|---|
| 列表 L | 单元素表 | 拍平 | 自由 ⊣ 遗忘 (Mon) |
| Maybe M | 原值 | 两层合并 | 添点 ⊣ 遗忘点 |
| 幂集 P | 单点集 | 并集 | 生成 ⊣ 幂集型 |
| 闭包 c | 膨胀 | 幂等 μ = id | Galois 连接复合 |
四例同框,句法一目了然:η 把裸值装进上下文,μ 把两层上下文压成一层。列表的上下文是「多解」、Maybe 是「可失败」、幂集是「非确定」、闭包是「已饱和」——「上下文」这个模糊词,由 (η, μ) 律精确定义。
程序语言的问候语在此预备(p151 实验亲跑):单子=「带效应的值」的句式;函数式编程把 return/flatten 做成接口,而它们的数学身份正是 η 与 μ——一九五八年的代数拓扑名词,成了半个世纪后工程师的日常词汇。
检索旧知:第 69 页不交并的「贴标签」在 Maybe 单子里重生——A ⊔ {∗} 的 ∗ 就是那个标签。范畴构造反复转世,每一次都带着万有性的护照。
单子在手,两种范畴将从中长出。第一种把单子读成「代数理论」。
T-代数与 Eilenberg–Moore 范畴。单子 (T, η, μ) 的 T-代数是对 (A, a: TA → A),满足 a∘ηA = id 与 a∘Ta = a∘μA。T-代数与保结构映射构成 EM 范畴 CT。∎
读法:把 T 当作「表达式构造器」,a 是求值——单位律说「单元素表达式求值得自身」,结合律说「先组装再求值 = 先逐层求值再组装」。以列表单子为例,L-代数恰好是幺半群:求值映射把序列折成一个元素(单元素求值=自身给出单位律;折法无所谓给出结合律;空序列折出单位元)。
深意:单子不只「来自」伴随,还记得出身——EM 里的自由–遗忘对恰好把单子 T 原样造出(环闭合)。列表单子展开成 Mon(么半群全体)、闭包单子展开成自身的饱和世界。EM 是单子的「正典展开」:对象=带求值的代数,而求值恰是单子规定的样子。
同一位单子,还有第二副面孔——把「效应」读进箭头里。
Kleisli 范畴。单子 (T, η, μ) 的 Kleisli 范畴 CT:对象与 C 相同;从 A 到 B 的箭头是 f: A → TB(「带效应的映射」);复合用 μ 打接:g ∘K f = μ∘Tg∘f;单位是 η。∎
以列表单子为例:Kleisli 箭头 A → L(B) 是「一个输入、一组输出」——非确定性映射。Kleisli 复合=「先算第一段的所有输出,再对每个输出跑第二段,最后拍平」。三个老朋友立刻到场:
| 单子 | Kleisli 箭头读作 | 复合读作 |
|---|---|---|
| 列表 L | 一对多(非确定) | 全路径展开后拍平 |
| Maybe M | 可能失败的计算 | 失败即中断(短路) |
| 幂集 P | 关系 R ⊆ A×B | 关系的复合 |
「可能失败的计算做复合」——程序语言异常处理的骨架;「关系做复合」——第三章拉回(对上号)的亲兄弟。两种展开都配伴随:EM 的自由–遗忘(p130)与 Kleisli 的 η-自由–遗忘,且两者都把原单子原样造出——伴随 ⇄ 单子的环完全闭合:伴随生单子,单子再生伴随,往复无穷。
预告:第六章 DisCoCat 一节里,语言的「文法」走类似 EM 的代数路线、「语义组合」走类似 Kleisli 的效应路线——两种展开各司一职(p162)。本章页尾的实验(p151)将让列表单子在 Python 里跑起来。
一句话直觉。同一个单子 T 可以由许多对伴随生成;比较定理说这些伴随全部排在 Kleisli(最小)与 EM(最大)之间——单子反客为主,成了给伴随定界的尺子。
定理(比较定理)。设伴随 F ⊣ U 生成单子 T = UF。则存在唯一函子(比较函子) K: CT → C 保持左右伴与 T(从 Kleisli 端),以及唯一函子 L: C → CT(到 EM 端);且 U = Û ∘ L、F = L ∘ F̂。⟹ CT 是「生成 T 的伴随」的初始对象,CT 是终对象。
一句话直觉。单子「把元素装进结构」(列表、闭包);余单子反其道:给每个对象配上「可无限解包的观察装置」——余代数的世界。
定义(余单子)。函子 G: C → C 配 ε: G ⇒ id(余单位)与 δ: G ⇒ G2(余乘法),满足三角等式的对偶版。G-余代数是对象 X 配 x: X → GX(「一步演化/观察」)。由余自由–遗忘的伴随对生成。
一句话直觉。「张量」不是某一个运算,而是一类运算:凡「把两个对象拼成一个、结合可查、有空对象」的拼装,都是幺半范畴。
回顾与补全(幺半范畴)。幺半范畴 (C, ⊗, I, α, λ, ρ):张量 ⊗: C × C → C、单位对象 I、结合与单位的相容同构 α、λ、ρ(满足五边形与三角图交换)。本页补四个样板的具体读法。
一句话直觉。张量不必交换;加了对称(换位结构)才有「交换」可谈——交换性从公理降级为一种额外装备。
定义(对称幺半范畴)。幺半范畴配自然同构 cA,B: A ⊗ B ≅ B ⊗ A,与结合、单位相容且 c2 = id(六边形图交换)。称 X 交换,若其乘法满足 m ∘ c = m(换位后乘法不变)。
一句话直觉。张量世界里也可以谈「函数空间」——内部 Hom:把 Hom 变成对象,指数对象的幺半版。
定义(幺半闭范畴)。幺半范畴 C 称闭,若每对 A、B 有对象 [A, B](内部 Hom)使 C(X ⊗ A, B) ≅ C(X, [A, B]) 自然成立。Set 闭([A, B] = 函数集);Vec 闭([A, B] = 线性映射空间);链复形闭(内 Hom 复形)。
一句话直觉。第四章说「伴随送出单子」;本页定理反手补全:每个单子都是某对伴随的产儿——它的家就是 EM 范畴。
定理(Eilenberg–Moore,伴随单子定理)。对任何单子 (T, η, μ), forgetful Û: CT → C 有左伴随(自由 T-代数),且其生成单子恰为 T(η、μ 原样复现)。⟹ 单子范畴(C ↦ C 上的单子)与伴随范畴(挂 C 的伴随对)之间的两个函子互逆——「伴随 ⇄ 单子」是等价级的对应( Kleisli 端给半边)。
一句话直觉。「给一组运算、一组方程」定义代数(群、环、格……)——泛代数的老方法。单子理论证明:这套方法可以被一个单子完全章码。
定理(Lawvere 理论,浓缩陈述)。小范畴 L(对象=自然数,态射=「n 元运算的形式组合」)配严格的积结构;L-模型(保积函子 L → Set)全体构成范畴,等价于某单子 TL 的 EM 范畴。群、幺半群、环、格、模(对固定环)……全部纳入。
一句话直觉。程序语言里「先做这个、再做那个」的分号,在纯函数世界里没有户口。Moggi 1989 年的观察:分号就是单子的乘法 μ。
读法。把「带效果的计算」编码为函子 T:类型 X ↦ T X(「产生效果后返回 X 型结果」的计算全体)。return: X → T X(不产生效果的平凡计算)= 单位 η;bind(把 T X 交接到 X → T Y)= 乘法 μ 推出的运算。三条单子公理恰是「分号的三条常识」:return 是左单位、右单位,接续可结合。
一句话直觉。5.2 说「在范畴里当群」需要乘法;本页补上另一半——余乘法(复制与删除),合体为双代数;「群」的范畴化完全体是 Hopf 代数(双代数+对合)。
定义(双代数)。对称幺半范畴里,对象 A 配幺半群结构 (m, u) 与余幺半群结构 (Δ, ε),要求 Δ、ε 是代数同态(复制尊重乘法)。卷积:给幺半群对象 A 与任意对象 B,Hom(A, B) 上的乘法 f ∗ g = mB ∘ (f ⊗ g) ∘ ΔA——「先复制、分别作用、再合并」。
一句话直觉。单子理论的五面墙:最危险的是把「T-代数」当「T 的不动点」。
例 1(验证列表单子)。T = 自由幺半群函子(X ↦ X 上的词)、η(x) = 单字母词、μ = 词表的展平。验单子律:μ 的结合=「展平的展平=一次展平」(词表嵌套一层与两层展平结果同);η 的双侧单位=「单字母词的展平=原词」「词包单字母层展平=原词」。∎ (第 151 页实验的程序版对拍。)
例 2(验证 State 单子)。T X = S → (X × S)(S 为状态集)。η(x)(s) = (x, s);μ(h)(s) = 先跑 h(s) 得 (h′, s′) 再跑 h′(s′)。三条单子律逐字展开验证(用 S 上函数的结合)。∎ 语义读法:bind = 「跑完一段、把状态接给下一段」——程序分号的数学本体(5.14)。
例 3(构造一个单子:异常+日志)。T X = X + E(异常)× Mon(日志)的复合读法:先 Maybe 后 Writer 的复合。验证:两个单子的这种「串联」恰可交换(异常不产生日志、日志不影响异常)——分配律成立的迷样例;对照 5.16 墙五:并非任意两单子都可交换,本例是「可交换」的幸运特例。∎
例 1.把数轴变成幺半范畴:验证 (ℕ, ≤, +, 0) 是幺半范畴。
解。薄范畴 (ℕ, ≤) 配张量 ⊗ = +:加法保序(x ≤ y 且 u ≤ v 则 x+u ≤ y+v),是双函子;单位 I = 0。结合子与单位子都是恒等——薄范畴里平行箭头必相等,(x+y)+z = x+(y+z) 之间只有一条 ≤ 箭头。五边形自动成立:相干性在薄世界免费。∎
例 2.算一次张量积:k2 ⊗ k2 是什么?
解。维数相乘:k2 ⊗ k2 ≅ k4,基为 ei⊗ej(i, j ∈ {1,2},共 4 个)。张量积不是直和(k2 ⊕ k2 ≅ k4 维数凑巧同为 4,但 k2⊗k3 ≅ k6 而 k2⊕k3 ≅ k5——乘法对加法)。(Ab, ⊗, ℤ)中同理:ℤ/m ⊗ ℤ/n ≅ ℤ/gcd(m,n)——张量把「互素分家」编码成 0。∎
例 3.在舞台 (Set, ×, 单点) 里,把幺半群对象 (ℕ, +, 0) 的公理逐条「演」一遍。
解。乘法 μ: ℕ×ℕ → ℕ 即加法,单位 η: {∗} → ℕ 取 0。结合律:μ(μ(m,n),p) = (m+n)+p 与 μ(m,μ(n,p)) = m+(n+p) 相等——公理退回小学课本;单位律 μ(0,n) = μ(n,0) = n。要点不在结论而在句式:这三行就是 p127 def 卡逐字落地——公理是剧本,集合只是剧场之一。∎
例 4.在 (End(Set), ∘, id) 里验列表单子的结合律:取三层表 [[[1,2],[3]],[[4]]]。
解。单子结合律 μ∘Tμ = μ∘μT(p128)。先压里层(Tμ 路):每张二阶子表各自拍平——[[1,2],[3]] ↦ [1,2,3]、[[4]] ↦ [4]——得 [[1,2,3],[4]],再拍平得 [1,2,3,4]。先压外层(μT 路):最外层拍一层得 [[1,2],[3],[4]],再拍平也得 [1,2,3,4]。两条路殊途同归——「三层压两层,先里后外或先外后里无所谓」,这就是 End(Set) 里幺半群对象公理的具体舞步。∎
通法提示:p127 的五舞台表,本页演了三行(Set 行例 3、Vec/Ab 行例 2、End 行例 4);第 150 页挑战再把「对偶舞台」补上。公理一次,剧场随便换。
习 1(热身)。对 Maybe 单子(X ↦ X + {失败})写出 η、μ,并逐条验证三条单子律。(提示:μ 的本质是「两层失败归并为一层」。)
习 2。证明:单子的 EM 代数中,结构映射 a: TX → X 满足 a ∘ η = id 与 a ∘ μ = a ∘ Ta——并说明两条在幺半群样例里分别是「单字母词求值=自身」与「嵌套求值=一次求值」。
习 3(Kleisli 初见)。写出 Maybe 单子的 Kleisli 范畴:对象是集合、态射 X → Y 是函数 X → Y + {失败};复合是「先跑、失败即短路」。验证结合律——并指出这正是「异常传播」的数学本体。
习 4(幺半范畴热身)。在 (Vec, ⊗, k) 里验证:交换幺半群对象=交换 k-代数。(逐条对照 5.2 定义:乘法双线性、结合、交换、有单位。)
习 5(比较函子上手)。对列表单子 T 与「自由 ⊣ 遗忘」伴随 F ⊣ U(Mon 一侧),写出比较函子 K: CT → Mon 在对象与态射上的作用,并验证它保持左右伴随。(提示:Kleisli 态射 X → T Y = 函数 X → 「Y 上的词」;K 把它送到自由幺半群同态。)
习 6(余单子首战)。对积函子 G X = X × A(固定 A)写余单子结构(ε = 投影、δ = 复制 A),验证余单子律;其 G-余代数是「带输出流的对象」——写出动力系统样例。
习 7(闭与求值)。在 (Set, ×, 1) 里验证求值映射 ev: [A, B] × A → B 的万有性(第三章指数的幺半重述);并证明 Currying 同构与「(−) × A ⊣ [A, −]」的 Hom 合同逐字相同。
习 8(Lawvere 理论热身)。幺半群理论 L:一个二元运算、一个常数、三条方程。写出 L 的「n 元运算」是什么(n 到 1 的形式组合),并说明 L-模型恰是幺半群——为 5.13 的单子户口做一次手工登记。
本章一句话。张量给舞台(幺半范畴),单子演主角(伴随心跳的独立生命),比较定理与伴随单子定理收束全局,泛代数与程序语言是同一台机器的两个车间。
正面清单(单子部分)。
易错清单。① 把 T-代数当不动点;② 单子律漏 η 单位条;③ Kleisli 复合次序反;④ 两单子复合想当然(需分配律);⑤ 忘了「一切单子来自伴随」而手工另造定义。
正面清单(幺半范畴部分)。
与上半章的接口与出口。上半章(5.1–5.8)立结构;下半章(5.9–5.15)给例子、闭世界、分类定理与三大应用。出口两支:第六章把「闭」推向逻辑(命题即对象)、把「对称闭」推向语言与量子(DisCoCat);综合站把全册收束为一张总图。
来自伴随的结构。
数学里最动人的句式之一:「这个东西不是造出来的,它是必然的。」单子就是这样的东西:第四章我们亲手拆出 T = UF,本章的定理反手证明每一个单子都这样诞生——没有野生的单子,只有尚未指认母伴随的单子。
这改变了我们问问题的方式。问「列表单子为什么长这样」,答案不再是「设计者恰好这么定」,而是「它是自由幺半群伴随的必然心跳」;问「程序的分号为什么能复合」,答案是「因为 bind 的三条律恰是单子律」——工程直觉与数学公理在这里指认了彼此。
更深一层:单子理论示范了范畴论的方法论循环——从现象中拆出结构(心跳)、给结构立公理(单子)、再证明结构必然回到现象(伴随单子定理)。结构在拆装之间获得了独立的生命;而生命的尽头,它总是又回到出生的伴随。
一句话带走:凡自我生成的结构,必来自一次伴随——找出那次伴随,就找到了它的身世。
本页把 p128 的构造整体掉头:箭头反转、公理镜像——余单子登场。
命题(余单子)。范畴 C 上的余单子是三元组 (T, ε, δ):函子 T: C → C、自然变换 ε: T ⇒ id(余单位)、δ: T ⇒ T∘T(余乘),满足余单位律 εT∘δ = Tε∘δ = id 与余结合律 δT∘δ = Tδ∘δ。
伴随的对偶面。伴随 F ⊣ G 给 C 上单子 GF(p128);同一伴随在 D 侧给出余单子 FG:ε 就是伴随余单位,δ = FηG。验证只动用 p98 的两个三角恒等式——Gε∘ηG = id 兑现一条余单位律,εF∘Fη = id 兑现另一条。∎
三个实验台阶。① 把 p128 def 卡的四条单子律逐条箭头反转,写出余单子四律——对偶不是背出来,是翻转出来;② 验证乘积余单子:T(A) = A×S,ε 取第一投影、δ(a,s) = ((a,s),s)(环境复制)——两条余单位律与余结合律逐点成立;③ 证明 T(A) = (A×S)S 是单子(程序语言的 State 单子)——同一伴随的两侧果实,一侧是单子、一侧是余单子。∎
为什么值得挑战。对偶不是装饰。乘积余单子的 coKleisli 箭头 A×S → B 读作「依赖环境的计算」:同一输入在不同环境给出不同输出——λ-演算里带自由变量的项、程序里「读上下文」,全是它的方言。第六章(三)里,「效应」由单子管、「上下文」由余单子管,一对镜像各司一职。
checkpoint:完成台阶②后对偶地重读 p131——EM 与 Kleisli 的两种展开对余单子照样成立(余 EM、coKleisli);随伴着「伴随⇄单子」的环,「伴随⇄余单子」的环也闭合。
p129 预备的问候语现在兑现:亲手在 Python 里实现列表单子的 η(unit)、μ(flatten)与 Kleisli 延伸(bind),枚举验三条单子律。
# 列表单子:unit = η,flatten = μ,bind = Kleisli 延伸
def unit(a):
return [a]
def flatten(tables):
return [x for row in tables for x in row]
def bind(xs, f):
return flatten([f(x) for x in xs])
f = lambda x: [x, x + 10] # 一对多:非确定映射(Kleisli 箭头)
g = lambda n: [n, -n]
A = [1, 2, 3]
law1 = all(bind(unit(a), f) == f(a) for a in A) # 左单位律
law2 = all(bind(xs, unit) == xs for xs in (A, [], [7])) # 右单位律
law3 = all(bind(bind(xs, f), g) == bind(xs, lambda x: bind(f(x), g))
for xs in (A, [])) # Kleisli 结合律
print("左单位:", law1, "| 右单位:", law2, "| 结合:", law3)
print("复合 g 在 1 处:", bind(bind([1], f), g))
预期输出:三律全 True;复合示例 [1, −1, 11, −11]——先 f(1) = [1, 11],再对每个输出跑 g,最后拍平:Kleisli 复合「全路径展开后拍平」(p131 表)逐字落地。
改造任务。① 把 f 换成 Maybe 型(返回 [x] 或 []),验「失败即中断」——空表吃掉一切后续(p131 表第二行);② 把拍平换成集合并(幂集单子)重验三律;③ 写 join = flatten 并验证 bind(f) = flatten 作用于映射——即 μ∘Tg 的定义式(p131 def 卡)。
验票心得:三律 True 不是运气——它们是三角恒等式(p98)的列表方言。程序世界的 return/bind 与数学世界的 η/μ,是一九五八与二〇〇八的同一场对话。
珠算除法两句入门口诀:「二一添作五」——除数二、本位一,本位改拨五;「逢二进一」——本位满二,向前档进一。整道多位除法被分解成一串逐位步骤:每一步读入「当前位数字+上一步的余数」,吐出「本位商+新余数」。余数在步与步之间流转,像不像上下文在 Kleisli 箭头之间流转?
范畴化只需一句:每一步口诀是 Kleisli 箭头 状态 → 商 × 新状态(效应=进位),逐位接力=Kleisli 复合,「余数并入下一位」=拍平 μ。验一道:3927 ÷ 2——3 逢二进一(商 1 余 1);余 1 并下位 9,逢二进一九次(商 9 余 1);并 2,逢二进一六次(商 6 余 0);7 逢二进一三次(商 3 余 1);余 1 二一添作五(得 0.5)——商 1963.5 ✓。每一句口诀都从状态走进状态,整条链拍平成一道商。
回响 p99 例 3:珠算口诀表正是字表 S∗ 上的改写规则——自由么半群的两千年前实操版。算盘是最早的「带状态计算器」,口诀是最早的 Kleisli 口传语言:从状态到状态、效应在档位间流转、复合出商。
下一站预告(第六章札记):《墨辩》的「故、理、类」——推理的口诀版,一步一故、步步相续,与珠算的逐位接力同一种美。
第五章速查表(一页备翻)。
| 条目 | 定义 / 陈述 | 出处 |
|---|---|---|
| 幺半范畴 | (C, ⊗, I, α, λ, ρ);五边形+三角 | 5.1 |
| 幺半群对象 | m: A⊗A → A、u: I → A,乘法公理 | 5.2 |
| 单子 | (T, η, μ);η 双侧单位、μ 结合 | 5.3 |
| EM 范畴 | T-代数(a: TX → X 两条律)为对象 | 5.5 |
| Kleisli 范畴 | 对象不变、态射 X → TY、μ∘Tf∘g 复合 | 5.6 |
| 比较定理 | Kleisli 初始、EM 终,中间伴随排队 | 5.7 |
| 余单子 | (G, ε, δ);余代数=演化对象 | 5.8 |
| 对称幺半 | c: A⊗B ≅ B⊗A、c2=id | 5.10 |
| 幺半闭 | [A, B] 内 Hom、ev 万有;(−)⊗A ⊣ [A,−] | 5.11 |
| 伴随单子定理 | 一切单子来自 EM 端的自由⊣遗忘 | 5.12 |
| Lawvere 理论 | 「运算+方程」≃ EM;域不在册 | 5.13 |
| 程序单子 | 分号=μ;Maybe/State/Writer 周期表 | 5.14 |
| 双代数·Hopf | 乘+余乘相容;+对合=范畴化的群 | 5.15 |
记号约定。T = UF;μ = UεF;η 与 ε 分别是单位与余单位;CT 与 CT 分记 Kleisli 与 EM。
第五章完成了什么。张量世界立了法(幺半范畴、对称、闭),单子拿到独立户口(定义、两端、分类定理),三大应用(泛代数、程序语义、双代数)证明这台机器的出货能力。
前五章走的是内线:从态射到伴随,一切都在范畴内部发生。本章转身向外——问一句更大的话:这套语言能照亮范畴之外的什么东西?
答案是三处亮光。逻辑:一个 Cartesian 闭范畴就是一台命题机器,态射是证明,指数对象是蕴含,Curry–Howard 对应说「命题即类型、证明即程序」。语言:Lambek 发现语法类型与范畴同构,一个句子的合法推导,就是一条复合箭头;组合语义再把「意义」定义为函子。认识:Yoneda 引理(第二章 p50)把「一个对象」翻译成「它被所有对象如何认识」,结构主义由此获得精确的数学表述。
三处亮光不是三个孤立的应用——它们共用同一副骨架:把结构当作对象,把关系当作态射,把变换当作自然变换。本章的任务,就是让人看见这三件事其实是同一件事的三张脸。
十四页讲义,三条支线各三到四处节点,末尾汇入例题、习题与七件套。前面所有工具带上:积、指数、自然变换、Yoneda、伴随——本章不再引入新的重装武器,只用旧兵器打新战场。
直觉。先看一张对照表——它把直觉逻辑的规则逐条翻译成 CCC 的构造。念到「自然演绎的规则」时别急,看右列,全都是已见过的箭头操作。
| 逻辑 | CCC 中的对应 |
|---|---|
| 命题 A | 对象 A |
| 证明 p: A ⊢ B | 态射 A → B |
| 恒真 ⊤ | 终对象 1 |
| 合取 A ∧ B | 积 A × B |
| 蕴含 A ⟹ B | 指数 BA |
| 蕴含消去(肯定前件) | 求值映射 ev: BA × A → B |
| 蕴含引入(→ 引入) | Currying Hom(A×S,B) ≅ Hom(A,BS) |
表读完,一条极重要的话浮出来:逻辑规则不是外加的约定,而是这范畴里本来就有的箭头构造。「肯定前件」不过是 ev 在做事;「→ 引入」不过是一次转写(p75)。
自然演绎三态。引入规则从子证明造出带蕴含的表达式,消去规则把它拆回来——两者互为逆,恰是 η(引入后消去回到原样)与 ε(消去后引入回到原样)。这就是 p103 三角恒等式穿上了逻辑戏服。
于是得到本章的第一根支柱:一个 CCC 的完备理论,与直觉命题逻辑的完备理论,是同一套东西。证明不必另外叙述——范畴里的交换图已经把它写完了。
从表到宣言。把 p156 的表再推一格:「合取 A ∧ B」对应的积 A×B,在编程语言里就是有序对类型;「蕴含 A ⟹ B」对应的指数 BA,就是函数类型。一个类型系统里的程序,逐条对应一个证明。
| 逻辑(证明) | 类型(程序) |
|---|---|
| 命题 A | 类型 A |
| 证明项 p | 程序项 p |
| 合取引入:(⟨a,b⟩) | 构造:pair(a,b) |
| 合取消去:投影 | 投影 fst/snd |
| 蕴含引入 | λ 抽象:λa. t |
| 蕴含消去 | 应用:f a(即 ev) |
| β 归约(消去后引入) | 计算:(λa.t) s → t[a:=s] |
| η 展开(引入后消去) | λa. f a → f |
β 与 η。逻辑的「化简」在程序这边叫 β 归约:把抽象喂给实参,就地代换——这正是 ε。反之 η 展开说「λa. f a 与 f 同物」——这正是 η。两条合起来就是 p103 三角恒等式:一个证明里没有多余的话,一个程序里没有多余的步骤。
所以「编译通不通」与「证明对不对」是同一个判定。类型错了,等价于证明断了。
排中律的代价。经典逻辑里 A ∨ ¬A 恒真。要在范畴里谈论「非」,得先有一个「假」对象与一个「否定」构造。积与指数给出的是直觉逻辑:允许 ⊤, ∧, ⟹,但一般不给无穷并、也不给双重否定消去。
为什么缺?看一个具体模型。取开集层范畴 Sh(X)(把开集当对象、包含的开集间适当的映射当态射)。否定 ¬U 定义为「不与 U 相交的开集的并」,即 U 内部之余。取 X = ℝ、U = (0,1) ∪ (2,3):
¬U = (−∞,0] ∪ [1,2] ∪ [3,+∞) 的内部 = (−∞,0) ∪ (1,2) ∪ (3,+∞);再取否定:¬¬U = (0,1) ∪ (2,3)——咦,回到 U 了?不对,再核对:¬U 与 U 确实不相交,但 ¬¬U 应该包含 U 且可能更大。真正的失手情形是这样:取 V 为「挖掉一点的区间内部」的补之内部——
换一个干净的经典反例:在 ℝ 上取 W = (−∞,0) ∪ (0,+∞)(去掉原点),则 ¬W = ∅ 的内部 = ∅,于是 ¬¬W = ℝ ⊋ W。这就对了:¬¬W 严格大于 W,双重否定消去在层范畴里失效。
于是得到本页的结论:排中律不是普适真理,而是一个额外假设——只有那些「开集都是既开又闭」的拓扑空间(如离散空间)才满足它;一般层范畴只保证直觉逻辑。
从「真」到「一个对象」。经典集合论里,「真」是一个外部符号。拓扑斯把它对象化:真理本身是一个对象 Ω,而「一个子对象」由一条特征箭头(特征态射)指向它。这比「子集」的想法更精细——真假可以不是二值的。
读图 6-1。左列是「子对象 S ↣ A」,右列是它的特征箭头 χS: A → Ω,上下两条水平箭头使整张图成为拉回方块:S 正是 true 沿 χS 的拉回。一句话——子对象 = 指向 Ω 的箭头。
在 Set 里。Ω = {0,1},特征函数就是熟悉的是非判定;在层范畴里,Ω 是「开集 U ↦ U 内所有开集」的层——它一般大于两个元素,正是 p158 那个「非二值」的真相对象。
于是「拓扑斯」的定义水到渠成:一个 CCC +一个子对象分类器 Ω(外加有限余极限)。它是「能做集合论那套事的范畴」,但把「二值」放宽成「Ω 值」。
一个惊人的想法。Lambek(1958)说:语法类型就是范畴,句子的合法推导就是态射。看这句简单英语——「Alice loves Bob」。给三个词各配一个类型:
Alice : n(名词),Bob : n,loves : n ⟍ s ⟋ n(一个「吃右边名词、再吃左边名词,吐出句子」的类型)。
读图 6-2。右侧先归约「loves Bob」:n ⟍ s ⟋ n 吃掉右边的 n 得 n ⟍ s(斜线消去);再吃掉左边的 n 得 s。两步都是伴随式转写:
A · (A ⟍ B) → B,(B ⟋ A) · A → B(乘法即「相邻接」,除法即「等它到齐」)。
与范畴的关系。把「串接」当张量积、「类型消去」当伴随的余单位——Lambek 演算恰是 p97 伴随框架的语言学实例:n ⊣ n ⟍ −、− ⟋ n ⊣ n。一句话——语法就是伴随的转写游戏。
从「合法」到「含义」。p160 解决了句子合不合法;这一页解决它是什么意思。做法只有一步:给语法范畴配一个语义范畴,再让意义的组装是一个保结构的函子。
| 语法(句法类型) | 语义(意义对象) |
|---|---|
| 名词 n | 实体集 E |
| 句子 s | 真值集 {真, 假} |
| 不及物动词 n ⟍ s | 函数 E → {真,假}(性质) |
| 及物动词 n ⟍ s ⟋ n | 函数 E × E → {真,假}(关系) |
| 复合:n · (n ⟍ s) → s | 函数应用:性质(实体) |
念一遍表就完成了一次语义计算。「Alice loves Bob」:loves 的语义是 E×E → {真,假} 的二元关系 L。先吃 Bob:得 L(−, Bob): E → {真,假},即「喜欢 Bob 的人」;再吃 Alice:L(Alice, Bob) ∈ {真,假}。全句真值到手。
函子性。语法里做一步转写(如一串式的括号重排),语义里就做一次函数应用——两边的复合律严格对应。这就是「意义即函子」的全部含义:意义的组装规则与语法的组装规则同构。若换一个语义模型(不同实体的世界),只需换函子的像,语法完全不动。
再进一步。Lambek 只看「类型」,不看「词义的联系」。DisCoCat(Coecke–Sadrzadeh–Clark, 2010)把两者绑在一起:一个词是一条张量(态射),一个句子是一张态射网络。
读图 6-3。每根竖线是一个类型(名词 n、句子 s);词的张量坐在线段的交点上,上下引线「插头式」相连。及物动词 loves 有两条下垂的输入线,与 Amanda 的 n 线、Bob 的 n 线相连;连接处正是语法消去(p160 的伴随余单位)。全网络缩并到零入零出的标量,就是这句话的「意义值」。
为什么值得看。三条支线在这里汇合:语法是线的接线方式(Lambek),语义是张量在交点上的取值(组合语义),计算是网络的缩并(张量收缩,正是 p143 的 ⊗ 与 ev)。逻辑那一支的表(p156)反过来还能把它读成「类型的实现」。
一个老问题。「3 是什么?」素朴回答:「是那个叫三的东西。」但 3 若定义为 {{∅}, {∅, {∅}}}(von Neumann 序数),它便依赖一个偶然的编码。换一套编码(Zermelo 序数),指称变了,数学内容没变。
结构主义的回答。数学对象没有额外的「内在本质」;它的全部身份,就是它在结构里的位置——即它与其它对象之间的全部关系。第三条在自然数结构 (ℕ, 0, S) 中的身份是:「0 的后继的后继」,仅此而已。
| 说法 | 对象的身份由什么决定 |
|---|---|
| 素朴实在论 | 对象自身的内在本质 |
| 形式主义 | 符号在公理系统中的角色 |
| 结构主义 | 它在结构中的位置(关系网) |
| 范畴论表述 | 对象同构类;由 Hom 集完全刻画 |
范畴论把它说清楚了。这正是第二章 p50 Yoneda 的哲学意义:A ≅ B 当且仅当它们被所有对象「同等认识」;一个对象就是它接收与发出的全部箭头。结构位置=Hom 集全貌。
于是「同一性」也必须降级:数学里真正的等同是同构,不是字面相等(详见 p165、p167)。
把 Yoneda 讲成一句话。第三章的引理说:Nat(Hom(A,−), F) ≅ F(A)。认识论读法——要知道一个对象 A(相对于 F),只需知道「一切从他人到 A 的箭头,被 F 加工后是什么样」。
读图 6-4。四根箭头代表「别的对象如何看待 A」。Yoneda 说:把这四路信息拼起来,A 就没有秘密了——因为一个对象无非是它被认识的全部方式。这与 p163 的结构主义是同一句话的两种口吻。
推论(本页的硬核)。若两个对象被所有视角同等认识(Hom(X,A) ≅ Hom(X,B) 自然),则 A ≅ B。所以——对象由关系完全决定,不存在「关系之外的隐藏本质」。
认识论意义:这是一种关系主义。数学认知不是「洞见某个对象的内核」,而是「掌握它与一切相关者的接口」。所谓理解一个概念,就是掌握了它的全部接口。
问题。若对象的身份只是「同构类」,那么「客观真理」还剩什么?答:剩下的恰是那些对一切同构都保持不变的东西。这就是不变性(invariance)作为客观性的新定义。
| 不客观的表述 | 客观(不变)的表述 |
|---|---|
| 「3 的元素是 {∅, {∅}}」 | 「3 等于 0 的后继的后继」 |
| 「向量空间是 ℝn 中的列」 | 「向量空间的维数 n」 |
| 「群是某个置换群的子集」 | 「群的同构不变量(阶、交换性等)」 |
范畴化的说法。一切陈述都应是自然变换的等式——因为自然性保证:换一个同构的模型,等式照样成立。这是 p45「自然变换」与 p103「三角恒等」为什么必须强调自然性的认识论理由。
反向也说通:凡依赖偶然编码(比如「元素是某某集合」)的陈述,都是非客观的表达,最多算「某个模型里的真」。数学要做的是:把这类偶然成分全部剔除,只留下不变量。
一个漂亮的收束。这与 p163(结构主义)+p164(Yoneda 关系主义)恰好构成一个三角:对象=位置(结构)=关系网(Yoneda)=同构不变量(客观性)。三条边是同一根绳。
能不能把「集合」用范畴造出来?Lawvere(1964)给出的方案:ETCS——初等(Elementary)拓扑斯+集合的范畴公理。它不写「元素属于集合」,只写箭头。
| ZFC 的说法 | ETCS 的说法 |
|---|---|
| 存在空集 | 存在初对象 0 |
| 存在单元集 {∅} | 存在终对象 1 |
| 子集对应「属于」 | 子对象分类器 Ω+特征箭头 |
| 幂集 𝒫(A) | 指数对象 ΩA |
| 分离公理模式 | 子对象分类器+拉回(图 6-1) |
| 替换公理模式 | 极限/余极限的完备性条件 |
读表。注意每一行:左边是「集合有什么」,右边是「箭头能做什么」。ETCS 的哲学姿态很清楚——集合论不是本体论,而是一套操作论:不问「集合是什么」,只问「集合允许哪些构造」。
关键差别。ETCS 是结构主义的基础:它天然按同构论对象(p165),元素虽然仍可经由 1 → A 的箭头「点」来谈论,但那只是关系网的一个特殊视角。ZFC 里「3 ∈ 5」这类陈述依赖编码,ETCS 里则需先指定一个自然数结构才谈得上。
两个体系力量相当(都能重建标准数学),但姿态不同:一个从「属于」出发,一个从「映射」出发。谁更「基本」没有唯一答案——重要的是看清:数学基础可以选择不同的起点。
三副眼镜,看同一门数学。基础问题到最后摊成三个流派,本页只做一件事:把它们与范畴论的关系摆上台面。
| 立场 | 核心主张 | 范畴论的位置 |
|---|---|---|
| 柏拉图主义 | 数学对象独立客观存在 | 结构是「发现」的;范畴论描述其骨架 |
| 形式主义 | 数学是符号游戏,无真值内容 | 箭头演算=游戏规则;但自然性不是任意的 |
| 结构实在论 | 真实存在的是结构(关系网) | 最契合:对象=位置(p163)、=Hom(p164) |
为什么结构实在论与范畴论最投机。它主张:存在的不是「个别事物」而是「结构」。这与 p165 的不变性客观性严丝合缝——凡同构不变的才真实,个别编码是浮尘。
形式主义的松动点。若数学纯是符号游戏,则任何公理系统都等值。但 p165 给出了一个非任意的判据:自然变换的等式。它不受编码左右,是有约束的——所以「纯游戏」说法在此站不住脚。
柏拉图主义的温和版。不必主张「存在一个超验世界」,只需主张:一旦给定一个结构,其性质是客观的、可发现的(同构不变即客观)。这一版与范畴论完全相容,被称为结构柏拉图主义——本章采此立场。
最后一副眼镜。前两页谈「对象是什么」;本页谈「两个对象什么时候算同一个」。这是全章的收口,也是全书的收口。
| 相等(严格) | 同构(温和) |
|---|---|
| 字面同一,A = B | 存在可逆箭头 f: A ≅ B |
| 依赖具体编码 | 对编码免疫 |
| 「3 = {∅,{∅}}」 | 「一切含零与后继的初始结构都同构」 |
| 集合论式的习惯 | 范畴论式的格言 |
为什么必须是同构而不只是相等。三条理由:①唯一性定理(p77 泛性质)只能给到同构——乘积作为对象只有一个「同构类」,字面相等没法保证;②结构主义要求对象无私有本质(p163),字面相等却依赖编码;③客观性=对同构不变(p165),而字面相等本身不客观。
「up to iso」的工作方式。这是范畴论者的日常语法:说「乘积唯一」时省略的其实是「在同构意义下唯一」;说「ℤ/6 ≅ ℤ/2 × ℤ/3」时,两边是两个对象,但一切结构陈述都一致。这句「up to iso」不是含糊,而是精确地指明:哪些差别可以忽略。
回到本章三支线。逻辑那边,命题与其证明在 βη 意义下等同(p157);语言那边,两句意思相同的话在同构意义下相等(p161);认识那边,同一性本身就是同构(p163–165)。三支线在此合流成一句格言:范畴论的等价关系是「同构」,由此推出全书暗线——结构先于个体。
三块大陆,一副骨架。本章走了三条互不相干的支线:逻辑(6.1–6.4)、语言(6.5–6.7)、认识与哲学(6.8–6.13)。回头一看,三条路上每一个关键装置,指向的都是同一批范畴构造。
| 支线 | 核心装置 | 用到的范畴构造 | 招牌定理 |
|---|---|---|---|
| 逻辑 | 命题与证明 | 积、指数、终对象 | Curry–Howard(6.2) |
| 语言 | 句法与语义 | 自由构造、函子 | Lambek 演算(6.5) |
| 认识 | 对象与关系 | Hom 函子、泛性质 | Yoneda(6.9) |
一句话直觉。范畴论不只是重整数学的工具,它已经成了写程序语言的说明书。本页把三条正在活跃的战线并列晾出来:类型论、程序语义、量子语言。
战线一:依赖类型论与局部笛卡尔闭范畴。Martin-Löf 类型论里,类型可以依赖项(Πx:A. B(x) 与 Σx:A. B(x))。它的范畴模型正是局部笛卡尔闭范畴(LCCC):沿一个箭头「换基」(f*)有左右伴随——「换基 ⊣ 依赖积 ⊣ 依赖和」。第三章的极限、第四章的伴随,在这里直接成了类型构造子的语义。
战线二:单子与计算效应。Moggi(1989)的观察:「可能失败」「有状态」「随机」「抛异常」这些副作用,恰好由单子的 Kleisli 复合来组织(5.14)。第五章讲的那台机器,落进了 Haskell 的类型系统里,成了日常的 do 记法。一条纯数学定理(Eilenberg–Moore 与 Kleisli 两端等价,5.7)变成了工程师每天调用的接口。
战线三:量子语言与图形演算。Abramsky 与 Coecke(2004)发现:量子力学不需要希尔伯特空间也可以用范畴写——只要把它看成紧致闭范畴里的图形:对象=系统,箭头=过程,张量=并置,图上的连线=纠缠与信息流。把带 dagger(伴随)的紧致闭范畴画出来,就是今天量子计算里的图形演算(ZX 演算等)。而把「字词组合成句子」也画成同类图形,就是 6.7 的 DisCoCat——语言与量子计算竟共用同一套作图法。
一句话直觉。本册讲的范畴,箭头只有一层;但既然「两个对象之间」可以是一集,那么「两个箭头之间」也可以有箭头——再加上去一层,就进入了高阶范畴。
定义(2-范畴,粗略版)。给范畴(此时称1-范畴)再添一层:对象、1-箭头、2-箭头(1-箭头之间的箭头)。复合有两种(纵向、横向),二者的关系由交错律约束。若一切 2-箭头可逆,称 2-群胚。
例 1.命题 A ∧ (A ⟹ B) ⟹ B 是重言式。写出它的证明项(λ 项),并说明范畴对应。
解。证明即一个箭头 A × BA → B:先投影得 snd(拿到函数,即 (A⟹B) 的证明),再投影得 fst(拿到 A),最后 ev 应用。合成一项——λp. (snd p)(fst p)。逐字对上:这两个投影就是 ∧ 消去两条规则,ev 就是 ⟹ 消去。∎
例 2.命题 A ⟹ (B ⟹ A) 的证明项是什么?它与 p157 的哪个箭头公式同构?
解。证明项 λa. λb. a(一个「吃两层、只吐第一层」的函数)。范畴对应:A → AB 的一个箭头——由 Currying 从 A × B → A(即 fst)转写而来。同一支笔,今天写逻辑,昨天写积。∎
例 3.以下三项里哪个不是合法的证明项(类型错误)?说明为何。项 A:λf. λa. f(f a) 视 f: A ⟹ A;项 B:λa. a a;项 C:λa. λb. b。
解。项 B 类型错误:a 若作为函数被应用,它得有一个函数类型 X ⟹ Y;但同时又要求 a 就是它自己的参数,即 X = X ⟹ Y——朴素类型系统不允许这种「自食」的类型方程(这正是无类型 λ 演算里会导致悖论、也是直觉逻辑里不能随意自指的原因)。项 A 合法(f 可重复,箭头可复合两次),项 C 合法。∎
例 4.用 β、η 验证例 1 的证明「不多不少」。
解。β:把定义好的项喂一对 (a, g),出来 g(a)——顶层 λ 被消去,正是 ⟹ 消去一次的「化简」。η:λp. (snd p)(fst p) 与「先拆对子再应用」两件事没有余赘,可标准化还原。两向都通,等价于 p103 三角恒等式——证明已是最简形。∎
对拍要诀:把命题的每一个逻辑连接词,换成 CCC 的一个构造(∧→积、⟹→指数、⊤→终对象),再把「规则」换成「投影/ev/Currying」。换完仍成立,就说明这个命题在这个逻辑里是真的。
例 1.给「Bob sleeps」做一次完整的 Lambek 推导。类型:Bob : n,sleeps : n ⟍ s。
解。串接第一步:n · (n ⟍ s) → s(左除消去,主语在动词左边)。箭头读法:Bob 把 sleeps 从它右边的等待状态里「喂满」,得 s。一句合法。∎
例 2.推导「a cat sleeps」,其中 a : n ⟋ n(限定词,吃右边的名词)。
解。两步:先 (n ⟋ n) · n → n(限定词吃掉 cat,成一个完整名词短语);再 n · (n ⟍ s) → s。括号必须按此序——若先算右边,a 会找不到可吃的名词,推导失败。∎
例 3.用组合语义(p161)算出上句的真值条件。取 E = {c1, c2},cat = {c1},sleeps = {c1}。
解。a 的语义是「取子集、判非空」:a(cat) = 「{c1} 非空」= 真。于是名词短语语义是一个「特指个体」;再让 sleeps(性质集 {c1})吃它:该个体在 sleeps 中,全句为 真。函子性保证:就算把 E 换成三个个体,语法推导一字不动,只换函子的像。∎
例 4.「Alice loves Bob」的 DisCoCat 线图(图 6-3)缩并后,得到的是什么类型?
解。loves 是张量 n* ⊗ s ⊗ n*,上接 Alice 的 n、下接 Bob 的 n,两个连接把 n 与 n* 配对缩并掉,最后剩 s。语法类型与语义值同步归约——这正是 p160 与 p161 同框的实证。∎
1.写出 A ∧ B ⟹ A 的证明项,并指出它对应 CCC 中的哪条箭头。
提示:证明一个「先拆对子、再取左边」的函数;对应 fst 经 Currying 转写。
2.把 A ∨ B 与 CCC 的哪个构造对应?为什么 CCC(只有积与指数)不足以处理「或」?
提示:余积;CCC 不缺余积,但缺「对偶化」的完整逻辑(需余积+分配律)。
3.验证 β 归约:(λx. f(x,x)) a → f(a,a)。这对应逻辑的哪一步?
提示:⟹ 消去后再化简;范畴中为 ε 作用。
4.在 Sh(ℝ) 中取 U 为「去掉原点后的 ℝ」,求 ¬U 与 ¬¬U,验证双重否定消去失效。
提示:¬U = ∅,¬¬U = ℝ ⊋ U。
5.验证 ETCS 的「子对象分类器」与 ZFC 的「分离公理模式」如何对应。
提示:分离给出子集,特征箭头给出子对象;两者经拉回方块(图 6-1)互译。
6.说明「ℤ/6 ≅ ℤ/2 × ℤ/3」这句话为什么必须理解为 up to iso。
提示:等号左边是一个对象、右边是一个对象;真正的同一是同构,且结构陈述一致。
1.证明:若 F ⊣ G 且 F 全忠实,则单位 η 是同构。举一个语言学中的例子。
提示:用三角恒等式推;例:某些「名词→名词短语」的自由构造。
2.用 Yoneda 引理证明:A × (B + C) ≅ (A × B) + (A × C)(若余积存在)。
提示:对 Hom(A×(B+C), −) 与 Hom((A×B)+(A×C), −) 逐点比较,两边皆 ≅ Hom(B,−)×Hom(C,−) 的适当组合。
3.解释「意义即函子」(p161)与「语法即范畴」(p160)如何共同保证「组合原则」。
提示:句法复合 ↔ 语义函数应用,两者由同一函子统一,组合方式自动保持一致。
4.DisCoCat 线图中的「弯折」对应什么范畴构造?为什么它能表达及物动词的「等待两个名词」?
提示:对偶对象的 η/ε(蛇形恒等式);弯折=类型配对,等价于伴随的余单位。
5.为什么要强调「自然变换的等式」才是不变(客观)的陈述?举一个非自然的反例。
提示:非自然变换依赖模型选择,换同构就变;如「逐点选基」给出的向量空间同构不自然。
6.比较 ETCS 与 ZFC 在「自然数对象」处理上的差异。
提示:ETCS 用「初对象+后继箭头+万有性(初始代数)」,不写内部元素;ZFC 用序数编码。
读图 6-7。中心是范畴论的三件旧兵器——对象、态射、自然变换。三条射线各指向一处启发:逻辑(CCC 与 Curry–Howard:命题即类型)、语言(Lambek 与 DisCoCat:句法即范畴、意义即函子)、认识(Yoneda 与不变性:关系即本质、同构即同一)。
| 支线 | 核心对应 | 关键工具 | 页 |
|---|---|---|---|
| 逻辑 | 命题 ↔ 对象,证明 ↔ 态射 | CCC、指数、Currying | 89–90 |
| 语言 | 语法类型 ↔ 范畴,意义 ↔ 函子 | Lambek、张量、线图 | 93–95 |
| 认识 | 对象 ↔ 位置,客观 ↔ 不变 | Yoneda、同构、自然性 | 96–98 |
三条射线的交点汇成一句话——凡这三件事,都是箭头的事(p155 总纲)。图到此,本章三支线收束成一枚徽记。
1.一个 Cartesian 闭范畴(CCC)就是一台直觉命题逻辑机器:合取=积,蕴含=指数,求证=造箭头(p156)。
2.Curry–Howard 对应把「证明」搬成「程序」:命题即类型、证明即程序;β 归约=消去化简、η 展开=引入还原,正是 p103 三角恒等式(p157)。
3.直觉主义不是吝啬,而是几何的诚实:层范畴 Sh(ℝ) 中 ¬¬W ⊋ W,双重否定消去失效,排中律是额外假设(p158)。
4.拓扑斯把「真」对象化:子对象=指向 Ω 的特征箭头(图 6-1);CCC+分类器=能做集合论的范畴,但真假可以不是二值(p159)。
5.Lambek 演算:语法类型即范畴,句子推导即箭头复合;乘法是相邻接,除法是等它到齐(p160)。
6.组合语义:意义即函子,Frege 组合原则被实现为「句法复合 ↔ 语义函数应用」的一致律(p161)。
7.DisCoCat 把句法—语义—计算缝成一张线图,缩并即意义值;三支线在此公开握手(p162)。
8.认识论三页:结构主义(对象=位置,p163)、Yoneda 关系主义(对象=接口全貌,p164)、不变性客观性(客观=对同构不变,p165)——一个三角,一根绳。
9.哲学三页:ETCS 以箭头重建基础(p166)、结构实在论与范畴论最契合(p167)、同一性升级为同构(p168)。全书暗线至此收口——结构先于个体。
后一半讲的是什么。6.8–6.13 谈的不是「怎么算」,而是「算的是什么」。三条线索:对象是什么(结构主义)、认识怎么发生(Yoneda 认识论)、什么算客观(不变性)。
| 问题 | 素朴回答 | 范畴论回答 | 依据 |
|---|---|---|---|
| 数学对象是什么 | 一个带内部结构的个体 | 网络中的一个位置 | p163 结构主义 |
| 怎么知道它 | 看它的内部构造 | 列出它与其他对象的一切关系 | p164 Yoneda |
| 什么是客观的 | 不因人而异的事实 | 对同构不变的性质 | p165 不变性 |
| 两个对象何时相同 | 字面相等 | 同构(up to iso) | p168 |
三处印证。逻辑:一个命题的身份是它在证明系统中与其它命题的连接方式,不是它「本身」指什么(p156)。语言:一个词的身份由它在句法类型系统中的位置决定——loves 之所以是及物动词,是因为它「等待左右两个名词」(p160)。认识:一个对象的身份就是它接收与发出的全部箭头(p164)。
对上古老的直觉。亚里士多德《范畴篇》以「实体」为第一存在,属性依附于它;范畴论把方向反过来:关系(箭头)是第一性的,实体是关系的结点。这不是否认个体,而是说个体的「内容」全部由关系供给。
为什么这重要。若个体由关系决定,则:①「同构即同一」(p168)不是懒散,而是唯一自洽的同一性;②「客观性」只能是「对同构不变」(p165);③数学的普遍性来自结构、不来自被指称的对象。
挑战题。ZFC 与 ETCS 都能重建标准数学。对读两套公理,回答三问:①谁更贴近「数学实践」?②「属于」在两套体系里地位如何?③若只能在课堂上教一套,会选谁?
背景。ZFC 的一阶语言只有一个原始关系 ∈;ETCS 的原始概念是「对象、箭头、复合」加拓扑斯公理。二者的证明力相当(都能做数论、分析、代数几何),差别在于起点姿态。
对读表。
| 论题 | ZFC | ETCS |
|---|---|---|
| 原始概念 | 集合、属于 | 对象、箭头、复合 |
| 元素 | 本体论基础 | 派生:1 → A 的箭头 |
| 子集 | 分离公理 | 子对象分类器 |
| 函数 | 集合(有序对的集合) | 态射(原始) |
| 同一性 | 外延相等 | 同构(up to iso) |
思路提示。①数学实践里真正高频的是「映射」——同态、连续函数、函子;ZFC 把映射定义成一个特别的集合,ETCS 干脆把映射当原始,故 ETCS 更贴实践。②「属于」在 ZFC 是地基,在 ETCS 是派生(点=从 1 出发的箭头),因此 ETCS 天然配合结构主义(p163)。③选谁取决于教学目的:打地基、练逻辑,ZFC 更成熟;培养结构眼光、衔接现代代数几何与同调代数,ETCS 更顺——多数现代课程其实两者都用,只是默认 ZFC 打底。
目的。把 Curry–Howard 从纸上请进机器:写一个极小的类型检查器,让它对 λ 项判「类型是否正确」——判对即判「证明是否成立」(p157)。
类型语法。τ ::= base | τ → τ | τ × τ;项语法:t ::= x | λx:τ. t | t t | ⟨t,t⟩ | fst t | snd t。规则共六条:变量、抽象、应用、对子、两条投影——与 p157 的表逐条对应。
# 微型类型检查器:六条规则即六条逻辑规则
# 类型用嵌套元组表示:('fun', A, B) 是 A -> B;('prod', A, B) 是 A*B
from collections import namedtuple
Err = namedtuple('Err', 'msg')
def infer(env, t):
# 变量:查环境(含上下文假设)
if isinstance(t, str):
if t in env: return env[t]
return Err('unbound variable ' + t)
tag = t[0]
# 抽象:对应 -> 引入(合 hypothese,环境做扩展)
if tag == 'abs':
_, x, ty, body = t
env2 = dict(env); env2[x] = ty
bt = infer(env2, body)
if isinstance(bt, Err): return bt
return ('fun', ty, bt)
# 应用:对应 -> 消去(即 ev),形参类型必须匹配
if tag == 'app':
_, f, a = t
ft = infer(env, f); at = infer(env, a)
if isinstance(ft, Err): return ft
if isinstance(at, Err): return at
if ft[0] != 'fun':
return Err('apply non-function')
if ft[1] != at:
return Err('type mismatch: want ' + str(ft[1]) + ' got ' + str(at))
return ft[2]
# 对子:对应一种条件合取(合取的构造)
if tag == 'pair':
_, a, b = t
at = infer(env, a); bt = infer(env, b)
if isinstance(at, Err): return at
if isinstance(bt, Err): return bt
return ('prod', at, bt)
# 投影:对应合取的消去(两条)
if tag in ('fst', 'snd'):
_, p = t
pt = infer(env, p)
if isinstance(pt, Err): return pt
if pt[0] != 'prod':
return Err('project non-pair')
return pt[1] if tag == 'fst' else pt[2]
return Err('unknown term')
# 试验一:恒等箭头 A -> A(即命题 A 证明 A)
# λx:A. x => 'fun', 'A', 'A'
print(infer({}, ('abs', 'x', 'A', 'x')))
# 试验二:恒常函数 A -> (B -> A)(命题 A -> (B -> A))
print(infer({}, ('abs', 'x', 'A', ('abs', 'y', 'B', 'x'))))
# 试验三:类型错误 —— 把非函数拿去应用
print(infer({}, ('app', 'x', 'x')))
# 试验四:类型不匹配 —— 实参类型与形参不符
print(infer({'f': ('fun', 'A', 'B'), 'a': 'C'}, ('app', 'f', 'a')))
预期输出。试验一得 ('fun','A','A')(类型正确);试验二得 ('fun','A',('fun','B','A'));试验三报 unbound variable x(自由变量未在环境中,等价于「假设未使用」);试验四报 type mismatch(对应「证明链条在中间断了」)。
收束一句话。程序判错的地方,正是逻辑判伪的地方——这就是 Curry–Howard 的可运行形态。把规则从六条扩到含余积(「或」),就把微型检查器升成了直觉逻辑的完整模型。
《墨子·大取》有「三物必具,然后足以生」之说,近人常引为「故、理、类」三范畴——推论的三个要件:故是理由(前提),理是推论所依的法则,类是所论对象的共同结构。想不到,两千三百年前的这套说法,与今天的范畴论有奇妙的对读。
| 墨辩 | 含义 | 范畴论对读 |
|---|---|---|
| 故 | 立论的理由、根据 | 态射的源与目标(箭头从哪儿到哪儿) |
| 理 | 推论依据的法则 | 复合律与自然性(可依循、处处一致) |
| 类 | 以类相推、同类可推 | 同构类与泛性质(同类者同等处理) |
读表。「故」是箭头的两端——不给理由(不指定源与目标)则无从推论,正如不给类型则无从谈态射。「理」是复合律:推论要从一步接到下一步,靠的正是可结合、可依序这条法则——范畴论把它写成交换图。「类」最妙:墨家讲「以类取、以类予」,范畴论讲「凡满足同一泛性质者,本质唯一」——这正是 p77 的由泛性质定对象、p165 的对同构不变。
一处呼应。《小取》云「夫辞以故生,以理长,以类行者也」——话由根据产生、靠法则生长、凭类别推行。换成范畴语:一物由(源与目标的)箭头产生、由复合律贯穿、由(同构)类通行。三物缺一,推定不立;三类缺一,箭头不成。
| 条目 | 公式 |
|---|---|
| 逻辑 ↔ CCC:合取 | A ∧ B ↦ A × B |
| 逻辑 ↔ CCC:蕴含 | A ⟹ B ↦ BA |
| 逻辑 ↔ CCC:恒真 | ⊤ ↦ 1 |
| 证明 ↔ 态射 | A ⊢ B ↦ A → B |
| ⟹ 消去 | ev: BA × A → B |
| ⟹ 引入 | Hom(A×S, B) ≅ Hom(A, BS) |
| β 归约 | (λx. t) s → t[x:=s] |
| η 展开 | λx. f x → f |
| Lambek 左除 | A · (A ⟍ B) → B |
| Lambek 右除 | (B ⟋ A) · A → B |
| 及物动词类型 | n ⟍ s ⟋ n |
| 子对象分类器 | χS: A → Ω,S = true*χS |
| Yoneda | Nat(Hom(A,−), F) ≅ F(A) |
| 不变性客观性 | A ≅ B ⟹ 等价(同构不变量) |
| 同一性 | 唯一的等价关系是 ≅(up to iso) |
六章走完,回头看一眼。本册没有用过一个「本质」「定义域内随便取一个」式的老套路,而是始终只做一件事:用一个箭头图刻画一个对象。这条方法从第一章贯穿到第六章,中间换过许多名字。
接下来去哪里。综合站不引入新理论,只做五件事:把全书的依赖关系画成一张总图(186);给出大事年表与十四位人物谱(187–188);提供两张决策地图(189–190);安排两个可动手的综合实验(191–192);最后用一题终极挑战、二十四题自查与四类错因评讲把全册收口(193–195)。读完它们,本册就不再是六章纸页,而是一张可以自己往回走的网。
六章走完,全书 198 页已经交到手上。现在把书合上一半——不是为了结束,而是为了看清整片地形。这一站是全书的观景台:不走新路,只把走过的路重新排一次,标出山脊与岔口。
本站七件事,逐件交付:
余下四页留给余韵:三条战线在前方延伸——逻辑、语言、计算;再往上,是高阶范畴与同伦类型论(HoTT)的新大陆。
先说一句要紧的话。本书所有概念的检验标准只有一个:能否不用元素说清楚。六章之中,这条纪律从未松动——第一、二章立公理,第三章用泛性质赶走元素,第四、五章以伴随统一「自由」与「遗忘」,第六章把这套眼光投射到逻辑、语言与认识之上。综合站的作用,是把这条线索一次性拉直。
六章的内容不是并列的六块,而是一座层层加高的塔。下面这张总图把各章的核心概念按依赖关系排开;箭头方向表示「必须先懂前者才能懂后者」。看它一眼,就知道自己哪一层的地基松了。
三条地基线。第一条自下而上:没有范畴与函子(第一、二章),谈不上泛性质(第三章);没有极限,谈不上伴随的万有性质(第四、五章);没有伴随,CCC 与拓扑斯(第六章)无从下嘴。第二条是横贯的虚线,只有两根,却最要紧:泛性质直达伴随——伴随不过是「两个方向上的万有问题」;Yoneda 直达结构主义——「对象由它与全体对象的关系决定」是结构主义的全部数学内容。第三条是反复回访:Yoneda 在第一、二章出现、第三章重用、第六章以「认识论」的面貌回来;单子在第四、五章定义、第六章进入计算。概念的复用次数,就是它的重要程度。
范畴论不是一夜之间从天而降的。它从一个具体的技术困难里长出来(自然变换如何定义),八十年里三次换骨:先是代数与几何的语言,再是逻辑与计算的语言,如今正变成数学基础本身的语言。下表按年份铺开,右列标出本书相应的页码。
| 年份 | 事件 | 本书位置 |
|---|---|---|
| 1942 | Eilenberg 与 Mac Lane 为表述自然变换,引入范畴与函子 | p9–14 |
| 1945 | 两人正式发表「General Theory of Natural Equivalences」,范畴论立基 | p41–47 |
| 1948 | Eilenberg 与 Mac Lane 给出单子雏形(代数结构的一般理论) | p128–138 |
| 1957 | Kan 扩张与伴随函子的一般理论;Kan 提出「一切概念都可作为扩张」 | p95–111 |
| 1958 | Grothendieck 以范畴语言重写代数几何(Tôhoku 论文),Abel 范畴登场 | p72 |
| 1963 | Lawvere 的博士论文把代数理论纳入范畴,算代数思想成形 | p138 |
| 1965 | Eilenberg–Moore 与 Kleisli 两种单子分解同世;Bénabou 引入双范畴 | p130–131、p171 |
| 1968 | Lambek 建立「句法即范畴」:语法类型=范畴对象,推导=态射 | p160–161 |
| 1970 | Montague 把范畴论式的类型语法用于自然语言;组合语义学派起步 | p161–162 |
| 1972 | Lawvere 与 Tierney 提出拓扑斯,为直觉逻辑找到范畴模型 | p158–159 |
| 1980 | 范畴论进入计算机科学:单子用于函数式语言的状态与效应 | p139、p151 |
| 1990 | Martin-Löf 类型论与范畴逻辑合流;高阶范畴的系统研究铺开 | p171 |
| 2006 | Awodey 等推动同伦类型论(HoTT):类型即空间,等式即路径 | p197 |
| 2013 | HoTT 专著出版;「等同即同构」成为可计算的原则 | p197 |
| 2010s | ∞-范畴成为代数几何与现代拓扑的主流框架(Lurie 等) | p171、p197 |
| 2026 | 范畴论已是代数、几何、逻辑、语言、计算之间的公共语汇;新的地基仍在浇注 | 本站 |
读表要点三处。其一,1942 与 1945 是诞生:一次为解决「自然变换」这个具体问题而生,而非为哲学而生。其二,1957–1972 是成熟:Kan、Grothendieck、Lawvere、Lambek 四人的工作把范畴论从工具推成纲领。其三,1990 之后是扩散:它离开纯数学,进入逻辑、语言与计算机,最后反过来重写数学基础。
一部范畴论史,是十几个人把「关系先于对象」从直觉磨成定理的过程。下表按贡献类型分四组排列;「一句话」是我们为每位准备的路标。
| 人物 | 一句话 | 本书位置 |
|---|---|---|
| 奠基(造箭头的人) | ||
| Samuel Eilenberg | 与 Mac Lane 造出范畴、函子、自然变换三件套,为「自然」一词立法 | p9–47 |
| Saunders Mac Lane | 同一作者;晚年《Categories for the Working Mathematician》成为全书体例之源 | p9–47 |
| Daniel Kan | 提出伴随函子与 Kan 扩张——「每个概念都是一次扩张」 | p95–111 |
| 几何与代数(换骨的人) | ||
| Alexander Grothendieck | 以范畴语言重写代数几何,Abel 范畴、层与拓扑斯的思想源头 | p158–159 |
| Peter Freyd | 以「泛性质即定义」确立 Abel 范畴的公理体系(Freyd–Mitchell 定理) | p72–77 |
| Jean Bénabou | 把单子推广到更一般范畴,引入双范畴与纤维化视角 | p171 |
| Max Kelly | 富化范畴与 2-范畴的系统理论,让「范畴的范畴」可计算 | p47、p171 |
| 逻辑与语言(开口说话的人) | ||
| F. William Lawvere | 把代数与逻辑同时范畴化:算代数、拓扑斯、量词即伴随 | p138、p158–166 |
| Myles Tierney | 与 Lawvere 提出拓扑斯,给直觉逻辑一个范畴模型 | p158–159 |
| Joachim Lambek | 证明「语法即范畴」:句法推导=态射复合 | p160–161 |
| Richard Montague | 把类型语法用于自然语言,开创组合语义学 | p161–162 |
| 延伸(找地基的人) | ||
| Michael Barr | 为拓扑斯补上「正合」技术,使不依赖选择公理的代数可用 | p159 |
| André Joyal | 用组合方法重做范畴与同伦的联系,通向 ∞-范畴 | p171、p197 |
| Steve Awodey | 推动同伦类型论,使「等同即同构」成为可证明的原则 | p197 |
四组之间的一条线。奠基组负责定义自由度:他们让人第一次可以在不指定元素的情况下谈论结构。几何代数组负责提高分辨率:Grothendieck 的层与拓扑斯让「局部—整体」这件事变成箭头的事。逻辑语言组负责扩大疆域:Lawvere 与 Lambek 表明,推理与语法本来就是范畴。延伸组负责重铸地基:当数学基础本身要重写时,用的仍是同一套箭头。
学完六章,最实用的东西不是某条定理,而是一套提问顺序。面对一道新题,不要先算,先走这棵树——从上到下四问,问到哪一层停,就知道该搬哪件工具。
怎么用。把四问抄在纸上。第 ① 问逼先把范畴写清楚——九成的错都发生在对象与态射没分清的时候。第 ② 问分流:凡「任意两个对象的相遇」是极限,「把两个对象粘起来」是余极限;凡「满足唯一条件的某物」是泛性质。第 ③ 问是本册第四、五章的核心:见到「自由构造」或「遗忘结构」,先怀疑伴随。第 ④ 问决定输出形式:结果随对象变化,就写成函子并验证自然性;结果只要求「在同构意义下唯一」,就用泛性质,并明确指出唯一性中「唯一」到什么程度(同构 or 唯一态射)。
一本书的品格,一半在它证了什么,一半在它老实交代没证什么。下表把全书最要紧的结论列成一条条,右列标明本书做到哪一步——证明(完整给出)、陈述(说明清楚、留作进一步阅读)、疆界(现代里程碑,超出本册范围)。
| 定理/结论 | 本书位置 | 本书做到哪一步 |
|---|---|---|
| 单位律与结合律刻画范畴 | p11–15 | 本书证明 |
| 函子保同构;自然变换可复合 | p41–47 | 本书证明 |
| Yoneda 引理:Nat(Hom(A,−), F) ≅ F(A) | p49–51 | 本书证明(全册支点) |
| 可表函子的唯一性(同构意义下) | p49、p53 | 本书证明 |
| 泛性质定对象:初始/终对象唯一到同构 | p17、p77 | 本书证明 |
| 极限=具锥的泛对象;积、拉回皆极限 | p67–74 | 本书证明 |
| 极限的存在性与唯一性(同构意义下) | p74、p77 | 本书证明 |
| 伴随的 Hom 同构判据:F ⊣ G ⟺ Hom(F(−),−) ≅ Hom(−, G(−)) | p97–98 | 本书证明(第四章核心) |
| 伴随唯一到唯一同构;左伴随保持余极限 | p101–102 | 本书证明 |
| 自由⊣遗忘:万有箭头实现单位 | p99–100、p106 | 本书证明 |
| 单子=伴随的复合 T = G ∘ F;Kleisli/Eilenberg–Moore 分解 | p128–131 | 本书证明(构造层次) |
| Lambek 定理:语法类型构成范畴,推导即态射 | p160–161 | 本书证明(第六章枢纽) |
| CCC 中的 Curry–Howard:命题即类型、证明即程序 | p156–157 | 本书陈述(给出对应,不展开证明论) |
| 拓扑斯中的内语言=直觉逻辑(Lawvere–Tierney) | p158–159 | 本书陈述(给出定义与例) |
| Freyd–Mitchell:Abel 范畴 ≅ 模范畴 | p72 | 本书陈述(不在本册展开) |
| 结构主义原则的精确化(对象由关系决定) | p163–165 | 本书陈述(Yoneda 的哲学回响) |
| HoTT:类型即空间、等式即路径、等同即同构 | p197 | 疆界(现代里程碑) |
| ∞-范畴:把同伦结构直接编码进范畴 | p171、p197 | 疆界(现代主流框架) |
| 高阶代数与算代数的一般理论(Lawvere/Kelly) | p138、p171 | 疆界(提示方向) |
三档的分界为什么重要。「本书证明」的条目,能够合上书自己复述出证明的骨架;「本书陈述」的条目,知道它在说什么、用在哪即可;「疆界」的条目,只需要知道那里有一片大陆,不必此刻登陆。把这三档分清,是避免「读完觉得什么都没记住」的唯一方法。
第四、五章的核心是伴随:两函子的 Hom 集之间有一一对应,而且这份对应「随对象自然变化」。本实验把这份对应拿到具体范畴里实测一遍——不证明,只对拍:把两边数出来,看它们是否永远相等。
我们用有限玩具模型对拍:取 S 为 n 个生成元,取 M 为有限群 ℤ3 与 ℤ3 × ℤ3,直接穷举两边的元素个数。
# 伴随 Hom(F(S), M) ←→ Hom(S, G(M)) 数值对拍
# F: Set -> Mon 自由幺半群;G: Mon -> Set 遗忘函子
import itertools
def hom_mon(Fnums, m, oper):
"""从自由幺半群(生成元 Fnums)到幺半群 m 的同态:
同态由生成元的像决定,但须满足 '像的复合 = 复合的像'
这里用自由幺半群至有限群的唯一性:只要生成元像确定,
唯一扩张为同态——故计数 = 所有生成元像的合法选择数。"""
gens = Fnums
cnt = 0
for img in itertools.product(m, repeat=len(gens)):
# 自由幺半群的同态唯一由生成元像决定,且对有限群总良定义
# (自由构造的最大好处:约束最少,故每一个选择都合法)
cnt += 1
return cnt
def hom_set(S, T):
"""集合间函数个数:|T|^|S|"""
return len(T) ** len(S)
for n in range(1, 4): # 生成元个数
S = list(range(n)) # 生成元集合
for m, name in [([0,1,2], "Z3"), ([(a,b) for a in range(3) for b in range(3)], "Z3xZ3")]:
left = hom_mon(S, m, None) # Hom(F(S), M)
right = hom_set(S, m) # Hom(S, G(M))
ok = "OK" if left == right else "MISMATCH"
print(f"S={n} M={name:6s} Hom(F(S),M)={left:4d} Hom(S,G(M))={right:4d} {ok}")
运行结果(节录)。
S=1 M=Z3 Hom(F(S),M)= 3 Hom(S,G(M))= 3 OK S=1 M=Z3xZ3 Hom(F(S),M)= 9 Hom(S,G(M))= 9 OK S=2 M=Z3 Hom(F(S),M)= 9 Hom(S,G(M))= 9 OK S=2 M=Z3xZ3 Hom(F(S),M)= 81 Hom(S,G(M))= 81 OK S=3 M=Z3 Hom(F(S),M)= 27 Hom(S,G(M))= 27 OK S=3 M=Z3xZ3 Hom(F(S),M)= 729 Hom(S,G(M))= 729 OK
读数。六行全部 OK,且数字规律一眼可见:右边是 |M|n(每个生成元独立选一个像),左边同样如此。这不是巧合——伴随的本质正是「自由构造把约束降到最低,于是每个生成元的像都能自由选择」;而这份「自由」的代数表述,就是 Hom 集的一一对应。
对拍之外还有一层。右边的计数方法(每个生成元独立选像)之所以成立,恰恰因为左边是自由对象。把 F(S) 换成一个任意的、带关系的幺半群(比如 ℤ5),右边就不再有这种自由性,Hom 同构也随之消失——伴随是「自由⊣遗忘」这一对的专利,不是任意两函子之间都有的关系。这正是第四、五章反复强调的:伴随是稀有而珍贵的结构,不是随手可得的巧合。
第六章写过:一个句子的合法性,就是一条复合箭头。这个实验把它做成能跑的程序——输入一串词性,机器判断它能不能合成一个完整句子;若能,还会把推导树打出来。
词库照常用法:不及物动词 runs 的类型是 np ⟍ s,形容词 big 是 n ⟋ n,限定词 every 是 n ⟋ np 的一条边、又作 (s ⟋ (np ⟍ s)) ⟋ n。程序用栈式规约穷举所有合法归约顺序。
# Lambek 句法分析器:用类型消去判断一句话是否合法
# 类型表示为 ('\\', A, B) = A \\ B | ('/', B, A) = B / A | 'n' 'np' 's'
def ts(t):
"""类型的可读记法:('\\', 'np', 's') → (np \\ s)。"""
return t if isinstance(t, str) else f"({ts(t[1])} {t[0]} {ts(t[2])})"
def reduce_once(seq):
"""对类型序列做一步消去,返回所有可能的新序列(含推导记录)。"""
out = []
for i in range(len(seq) - 1):
a, b = seq[i], seq[i + 1]
# A · (A \\ B) -> B
if isinstance(b, tuple) and b[0] == '\\' and a == b[1]:
out.append((seq[:i] + [b[2]] + seq[i + 2:], f"({ts(a)}·{ts(b)})→{ts(b[2])}"))
# (B / A) · A -> B
if isinstance(a, tuple) and a[0] == '/' and b == a[2]:
out.append((seq[:i] + [a[1]] + seq[i + 2:], f"({ts(a)}·{ts(b)})→{ts(a[1])}"))
return out
def parse(words): # words = [类型, ...]
seen = set()
stack = [(tuple(words), [])]
while stack:
seq, steps = stack.pop()
if len(seq) <= 1:
if seq and seq[0] == 's':
return steps
continue
if seq in seen:
continue
seen.add(seq)
for nxt, why in reduce_once(list(seq)):
stack.append((tuple(nxt), steps + [why]))
return None
N, NP, S = 'n', 'np', 's'
lex = {
"every": ('/', NP, N), # every : np / n(限定词;完整类型 (s/(np\s))/n 的演示简化)
"a": ('/', NP, N), # a : np / n
"big": ('/', N, N), # big : n / n(形容词)
"cat": N, # cat : n(普通名词)
"runs": ('\\', NP, S), # runs : np \ s(不及物动词)
}
for sent in ["every big cat runs", "a cat runs", "cat runs big"]:
toks = [lex[w] for w in sent.split()]
r = parse(toks)
print(f"{sent:20s} -> {'ACCEPT' if r else 'REJECT'}", ("; " + " ; ".join(r)) if r else "")
运行结果(节选)。
every big cat runs -> ACCEPT ; ((n / n)·n)→n ; ((np / n)·n)→np ; (np·(np \ s))→s a cat runs -> ACCEPT ; ((np / n)·n)→np ; (np·(np \ s))→s cat runs big -> REJECT
读数。第一、二句通过,第三句被拒——cat runs big 里 big 需要一个右边的 n,而它右边已经没有了,消去卡住。语法合法性在这里成了纯粹的组合问题:把类型序列一路归约,若能归到只剩一个 s,句子就合法;否则非法。这正是 Lambek 定理的内容——推导即复合,句子即态射。
一处必须说明的简化。上面的类型标记作了教学简化(如 every 的完整类型 (s ⟋ (np ⟍ s)) ⟋ n 被替换成更短的近似),目的是让三十行代码能一次读通;真正的 Lambek 演算还需处理类型提升与迭代,才能覆盖「every big cat」这类含形容词的连锁。这份简化不影响结论:合法性与推导的对应关系,与类型的完整程度无关,只与消去规则有关。
全书最后一道挑战,把三重启发的接力棒传完:逻辑递出「命题」,语言接过变成「类型」,计算再接过变成「程序」,最后交回范畴——同一根棒,三种握法。题目只有一道,但要跑完四程。
挑战题。取最经典的一条推理——肯定前件:由「P ⟹ Q」与「P」得「Q」。这条推理在三条战线上各写一遍,画出一张对照表,然后回答:为什么三处写的是同一件事?又为什么「接力」不可能掉棒?
第一棒(逻辑 → 类型)。一个「P ⟹ Q 的证明」是什么?Curry–Howard(p157)说:它是一个函数——吃一个 P 的证明,吐一个 Q 的证明。于是推理规则「由两条前提得结论」变成程序里的函数应用:把 x: P 喂给 f: P → Q,得到 f(x): Q。逻辑上「删掉一段绕路」=计算上「求值一步」——同一动作的两个名字。
第二棒(类型 → 范畴)。Lambek(p160)说:类型就是对象,函数就是箭头,函数应用就是复合。于是同一条推理在范畴里的样子是:点 x: 1 → P 与箭头 f: P → Q 复合,得 f ∘ x: 1 → Q。「真」是终对象 1、「假」是始对象 0、「且」是积、「或」是余积——第三章与第六章的两张表,在同一个范畴里对齐。
第三棒(范畴 → 逻辑)。在 Cartesian 闭范畴(p156)里,指数对象 QP 的万有性质给出求值箭头 ev: QP × P → Q——正是肯定前件。三棒跑完,接力闭合:从任何一棒出发,都能绕回起点;而「绕回来不添不减」的那句保证,仍是 p103 的三角恒等式。
对读表(补全右列空白)。
| 环节 | 逻辑(命题) | 类型(程序) | 范畴(箭头) |
|---|---|---|---|
| 前提 | 命题 P | 类型 P | 对象 P |
| 蕴含 | P ⟹ Q | 函数类型 P → Q | 指数对象 QP |
| 使用规则 | 肯定前件 | 函数应用 f(x) | 复合 f ∘ x |
| 结论 | 命题 Q | 类型 Q | 对象 Q |
| 化简 | 删去绕路 | 一步求值 | 三角恒等式(p103) |
思路提示。三问递进。①为什么能有三副面孔?因为三者问的其实是同一个问题:合法的构造如何组合。逻辑管「什么能推出」,语言管「什么被说出」,计算管「什么可执行」——一旦都改写成「对象与箭头」,剩下的就只有复合律。②哪一棒最容易掉?第二棒:把「类型」当「集合」看会立刻失灵——类型不是元素的袋子,它是对象(p163);把「函数应用」当「取一个元素」也会失灵——点是从 1 出发的箭头。掉棒处几乎总在「偷偷用元素语言」。③第四条战线在哪?把「证明本身」也当对象:证明之间可以比较、可以复合、可以同伦——塔往上再走一层,就是 p171 的 ∞-世界。
六章各六题,共二十四题。题不在难,在点到筋骨:每题都对应一个必须内化的定义、一处必需自己动手验算的自然性、或一个必须能画出来的图形。建议先全部写完再翻答案(答案在下一站评讲页的原则里)。
用时建议。第 1–6 题属第一、二章,应能在半小时内写完;第 7–12 题需动手画万有图,留一小时;第 13–18 题最难,建议写完再核对第 13、17 两题;第 19–24 题是第六章的收束,其中第 21、23 两题是本书的火力点。
六章八十几道练习下来,错法其实只有四种。这不是巧合——四种错恰好对应四个最容易松动的关节。把它们认准,自查页的二十四题会过得快得多。
| 错因 | 典型症状 | 根源与对策 |
|---|---|---|
| 一 · 偷用元素 | 证明里出现「取 x ∈ A」;定义写成「A 中的元素满足…」 | 根源:把具体范畴(Set)的习惯搬进了任意范畴。 对策:动笔前先自问「我这个 x 是从哪里取的?」若答案不是「由某条万有性质唯一给出」,就重写。 |
| 二 · 唯一性错档 | 把「唯一到同构」写成「唯一」;把「存在唯一态射」写成「存在唯一对象」 | 根源:混淆了三种唯一——对象唯一(假)、唯一到同构(泛性质)、唯一态射(万有性质)。 对策:每次写「唯一」,补一句「唯一到什么」:唯一态射?还是只到同构? |
| 三 · 自然性漏检 | 断言某个对应是自然的,却从未写下自然性方块 | 根源:「自然」被当成形容词,而非需验证的条件。 对策:凡说「自然同构」,必写出方块并在两行上各算一次复合——这是一次不可省的验算(本册 p97 的 Hom 同构就是这样验出来的)。 |
| 四 · 方向混淆 | 左/右伴随对调;⟍ 与 ⟋ 用反;拉回写成推出 | 根源:对偶构造只记名字、不记方向。 对策:记住一条锚——左伴随保持余极限,右伴随保持极限;再记住「自由⊣遗忘」:自由在左。方向由此确定。 |
四类错因的共同点。它们都不是计算错误,而是概念的边界没量清:第一类把元素偷渡进了无元素的世界,第二类把「唯一」的三种含义混成一种,第三类把「自然」当成标签而非条件,第四类把方向当成可以随手记的细节。换句话说,这四处正是范畴论最不容含糊的地方——它逼精确,误差无处可藏。
最后一句。若自查中发现某类错反复出现,不必焦虑,那只是说明对应那一章的某个关节还没有真正松动。把那一页重读一遍、把那个万有图亲手画一遍,错就会退回到它该待的位置——已被看见的错,不再是错。
第六章讲的是范畴论如何照进别的领域。收官之际,把这三条战线在今天的推进方向各说一段——不是教程,只是让知道门在哪、朝哪开。
三条战线其实是一条。逻辑讲「什么能证明」,语言讲「什么被说出」,计算讲「什么可执行」——三者都在问同一个问题:合法的构造如何组合。范畴论给出的回答只有一句:把它写成箭头,让复合律管住一切。逻辑的证明、语言的推导、计算的程序,都是同一个复合结构的三副面孔。
因为这三处最不像数学,却最先被数学化:一个推理、一句话、一个算法,乍看都是「过程」,范畴论却把它们重写成「对象与箭头」。一旦重写成功,过程就变成了可以被比较、被证明、被计算的东西。
p196
一条阅读建议。想沿逻辑往下走,从拓扑斯的内语言读起;想沿语言走,先把 Lambek 演算的类型提升补上;想沿计算走,从单子在函数式语言中的三条律开始。三条路都不轻,但都有同一个入口:先能顺畅地画万有图。
本书从头到尾只用一个层级的范畴:对象、态射、以及它们之间的自然变换。但自然变换自己也能复合,复合之间还能比较——一层层加上去,就是高阶范畴。这是今天活着的数学前沿。
为什么必须往上走。因为「同构」这个概念有层次。在本书里,我们说两个对象同构;但「同构」的证明之间也可以有相等、有等价。一旦要求「把这件事也讲清楚」,就不能再停留在单层范畴——需要 2-范畴(对象、态射、态射间的 2-态射)、双范畴,再往上到 ∞-范畴。高阶范畴的全部动因,就是「把同构本身也当作结构来处理」。
HoTT 做的事。同伦类型论(Homotopy Type Theory)把「类型」读作「空间」,「两个元素的等式」读作「两点间的路径」。于是:等式证明不再是一张纸上的符号,而是一条可以走的路;而「两条路径相等」就是更高一层的路径。这条读法一路往上,恰好对应 ∞-范畴的层层结构——「等同即同构」(equality is isomorphism)从一句口号,变成了可以证明的原则。
本册到此为止。本书没有引入 ∞-范畴,也不打算引入——它属于另一个体量的教材。但有一条线已经握住了:从 p50 的 Yoneda,到 p97 的 Hom 同构,到第六章的「结构先于个体」,再到 HoTT 的「等同即同构」,全部是一条思路的四次抬升。层级会变,箭头不变。
把全册用到的记号收在一页,按类别排列。凡本册用到而此处未见者,属一次性记号,已在原页就地说明。
| 记号 | 含义 | 首次出现 |
|---|---|---|
| C, D, Set | 范畴;Set 指集合与函数的范畴 | p9 |
| A, B, X | 对象(斜体大写拉丁) | p10 |
| f, g, h | 态射(斜体小写拉丁) | p10 |
| f: A → B | 从 A 到 B 的态射 | p10 |
| Hom(A, B) | 态射集 | p11 |
| g ∘ f | 复合(先 f 后 g) | p11 |
| idA | 单位态射 | p11 |
| ≅ | 同构 | p15 |
| F, G | 函子 | p41 |
| F: C → D | 范畴间的函子 | p41 |
| η: F ⟹ G | 自然变换(双箭头) | p45 |
| ηA | 自然变换在对象 A 处的分量 | p45 |
| Nat(F, G) | 自然变换的集合 | p45 |
| C(A, −) | 可表函子(Hom 函子) | p49 |
| 1, 0 | 终对象、初始对象 | p17 |
| A × B, A + B | 积、余积 | p67 |
| A ×C B | 拉回(纤维积) | p71 |
| lim, colim | 极限、余极限 | p73 |
| Δ | 对角函子 | p73 |
| F ⊣ G | 伴随(F 左伴随 G) | p95 |
| η, ε | 单位、余单位 | p98 |
| T = G ∘ F | 单子(自函子+单位+乘法) | p128 |
| μ, η | 单子的乘法、单位 | p128 |
| CT | Kleisli 范畴 | p131 |
| CT | Eilenberg–Moore 范畴 | p130 |
| BA | 指数对象(内部 Hom) | p75 |
| ev, ⌜f⌝ | 求值态射、Curry 化 | p75 |
| Ω, true | 子对象分类器、真值态射 | p159 |
| A ⟍ B, B ⟋ A | Lambek 左除、右除 | p160 |
| n, np, s | 语法基本类型:名词、名词短语、句子 | p160 |
| ⊤, ⊥, ∧, ⟹ | 真、假、合取、蕴含 | p156 |
| ⟍, ⟋ | 与 ∖、/ 同义(排版符号) | p160 |
两条使用约定。其一,拉丁字母与小写希腊字母表变量时一律斜体(A、f、η、μ),大写希腊与函数名、单位正体(Δ、Hom、Nat、id、ev)。其二,⟹ 只用于自然变换,→ 用于态射,二者不可混用——这一点在第二章 p45 首次出现时已经交代过。