1. 为什么“集合练习题”值得单独拎出来做一篇复盘很多人看到“Algebra: Chapter 0”这个书名第一反应是“范畴论入门”然后翻两页就被各种交换图劝退。但真正卡住新手的往往不是后面的泛函、自然变换而是第0章里那些看起来人畜无害的集合练习题。我见过太多人在这几页上栽跟头明明高中就学过集合交并补差闭着眼都能画韦恩图怎么到了这一章反而做不下去了问题出在“语言切换”上。Chapter 0 的集合练习题不是让你算“A∪B有几个元素”而是让你用映射的语言重新理解集合论——单射、满射、双射、像、原像、纤维、商集、笛卡尔积的泛性质。这些概念在后续的群、环、模、拓扑里会反复出现如果第0章只是“看懂”而没有“做熟”后面每遇到一个交换图你都要回头补课。所以这篇复盘的目标很明确把 Chapter 0 集合练习里最容易含糊的几类题型拆开讲清楚每一步背后的动机给出可以直接对照的解题模板顺便分享几个我当年踩过的坑。适合谁看如果你正在自学范畴论方向的基础教材或者准备读代数几何、代数拓扑的前置内容又或者只是想把“映射思维”真正内化成直觉这篇内容都能用上。不需要你会画交换图但需要你愿意拿纸笔跟着算一遍——集合论这东西看是看不会的。2. 映射的基本性质从“定义复述”到“条件反射”2.1 单射、满射、双射的判定为什么总在细节上翻车Chapter 0 里关于单射和满射的练习题表面上是“证明 f 是单射当且仅当……”实际上考的是你对量词顺序的敏感度。单射的定义是对任意 x₁, x₂ ∈ A若 f(x₁) f(x₂)则 x₁ x₂。满射的定义是对任意 y ∈ B存在 x ∈ A 使得 f(x) y。这两个定义里的量词顺序一旦记混证明就会写得似是而非。我当年最常犯的错误是在证明单射时默认了“f(x₁) f(x₂)”之后直接写“所以 x₁ x₂”中间跳过了“因为 f 是单射”这个引用。听起来很蠢但在写正式证明时这种跳跃会让阅卷人或者未来的你自己无法判断你到底是真懂还是碰巧。正确的写法应该是显式地写出“由 f 的单射性从 f(x₁) f(x₂) 可得 x₁ x₂。”这不是形式主义而是在训练你把“定义”当作工具来用而不是当作背景知识。另一个高频翻车点是满射的证明。很多人会构造一个 x 然后验证 f(x) y但忘了说明这个 x 确实在定义域里。比如 f: ℝ → ℝ, f(x) x²你想证明它不是满射只需要举一个反例-1 没有原像。但如果你想证明某个映射是满射就必须对任意 y 都构造出 x并且验证 x 属于定义域。这个“验证归属”的步骤在后续的群同态、环同态里会变成“验证封闭性”是同一个思维习惯。提示做单射/满射练习时养成一个习惯——每写一步都问自己“这一步用的是哪个定义”。如果答不上来说明你只是在凭感觉写。2.2 像与原像方向感比计算能力更重要像image和原像preimage是 Chapter 0 里最容易混淆的一对概念因为它们的符号方向刚好相反。f(A) 表示 A 的像是 B 的子集f⁻¹(B) 表示 B 的原像是 A 的子集。注意 f⁻¹ 在这里不是反函数只是一个集合映射的记号。这个区分在后续讲层sheaf和茎stalk的时候会变得极其重要因为那时候你会频繁地在“开集的像”和“开集的原像”之间切换。我自己的记忆方法是原像永远比像“好算”。为什么因为原像是按定义直接展开的f⁻¹(B) {x ∈ A | f(x) ∈ B}。你只需要把 B 里的元素逐个拿过来问“谁映射到它”然后收集所有满足条件的 x。而像的计算往往需要你先知道 A 里有哪些元素再逐个映射过去最后去重。所以在证明题里如果结论涉及原像优先考虑直接展开定义如果涉及像往往需要借助单射或满射的条件。一个典型的练习题是证明 f(f⁻¹(B)) ⊆ B并举例说明等号不一定成立。这个包含关系的证明只需要展开定义取 y ∈ f(f⁻¹(B))则存在 x ∈ f⁻¹(B) 使得 f(x) y而 x ∈ f⁻¹(B) 意味着 f(x) ∈ B所以 y ∈ B。等号不成立的情况出现在 f 不是满射时如果 B 里有元素没有原像那它就不在 f(f⁻¹(B)) 里。这个例子在后续讲“满射等价于 f(f⁻¹(B)) B 对所有 B 成立”时会反复用到。2.3 纤维把映射看成“一族集合”的视角转换纤维fiber的概念在 Chapter 0 里往往一笔带过但它是后面理解商集、等价关系、乃至群作用的基石。给定 f: A → B 和 y ∈ By 上的纤维定义为 f⁻¹({y})也就是所有映射到 y 的元素的集合。注意纤维是 A 的子集不同 y 的纤维互不相交且所有纤维的并集就是 A前提是 f 的定义域是 A。这个“把 A 划分成纤维”的视角本质上就是等价关系的几何化。我建议在做 Chapter 0 练习时专门花时间画几个纤维的示意图。比如 f: ℝ² → ℝ, f(x, y) x² y²那么每个正数 r 上的纤维是一个圆0 上的纤维是一个点负数上的纤维是空集。这个例子直观地展示了纤维可以是空集如果 y 不在像里可以是单点如果 f 在该点局部单射也可以是多个点甚至连续统。后续学商拓扑时“商映射的纤维”就是粘合操作的数学表达——你把每个纤维捏成一个点就得到了商空间。注意纤维的记号 f⁻¹(y) 和原像的记号 f⁻¹({y}) 是同一个东西但前者更常用于“点上的纤维”这个语境。不要因为符号相同就以为它们是一回事——原像是集合到集合的映射纤维是点上的原像只是习惯上省略了花括号。3. 集合运算与映射的交互那些“显然”但写不出来的等式3.1 像与原像对交并补的保持性一张表看清所有情况Chapter 0 的练习题里有一大类是问f(A₁ ∪ A₂) 等于 f(A₁) ∪ f(A₂) 吗f(A₁ ∩ A₂) 等于 f(A₁) ∩ f(A₂) 吗原像版本又怎样这些问题看似琐碎但它们是训练“映射与集合运算交换性”的最佳材料。我整理了一张表把常见的情况都列出来方便对照记忆。运算像是否保持原像是否保持等号成立的条件并集是是像的并保持无需条件原像的并保持无需条件交集否只有 ⊆是像的交需要 f 是单射才取等补集否是在适当条件下像的补需要 f 是双射原像的补对任意 f 都成立差集否是像的差需要 f 是单射这张表里最反直觉的是“像不保持交集”。举个例子A {1, 2}B {1, 2}f(1) af(2) a。取 A₁ {1}A₂ {2}则 A₁ ∩ A₂ ∅f(∅) ∅但 f(A₁) ∩ f(A₂) {a} ∩ {a} {a}。所以 f(A₁ ∩ A₂) ≠ f(A₁) ∩ f(A₂)。这个反例在后续讲“单射的等价刻画”时会再次出现f 是单射当且仅当对任意 A₁, A₂ 都有 f(A₁ ∩ A₂) f(A₁) ∩ f(A₂)。原像的情况则好得多f⁻¹(B₁ ∩ B₂) f⁻¹(B₁) ∩ f⁻¹(B₂) 对任意 f 都成立。证明只需要展开定义两边都是“映射到 B₁ ∩ B₂ 的元素集合”没有任何额外条件。这个不对称性值得反复体会原像是“逆向”的它把 B 的子集拉回 A而拉回操作天然保持所有布尔运算像是“正向”的它把 A 的子集推到 B而推过去的过程中会丢失信息多个元素可能映射到同一个点所以只保持并集不保持交集。3.2 商集与等价关系从“划分”到“映射的纤维”商集是 Chapter 0 里另一个容易被轻视的概念。给定集合 A 和等价关系 ~商集 A/~ 是所有等价类的集合。这个定义本身不难难的是理解“商集上的映射”是怎么定义的。如果你有一个函数 f: A → B并且 f 在等价关系 ~ 下是“不变的”即 x ~ y 蕴含 f(x) f(y)那么 f 可以诱导出一个映射 f̄: A/~ → B定义为 f̄([x]) f(x)。这个诱导映射是良定义的well-defined因为等价类里的任何代表元都给出相同的值。这个“良定义”的验证是 Chapter 0 练习里的高频考点。很多人会漏掉这一步直接写 f̄([x]) f(x) 就完事。但在正式证明里你必须说明如果 [x] [y]那么 x ~ y由 f 的不变性得 f(x) f(y)所以 f̄ 的值不依赖于代表元的选取。这个步骤在后续讲群同态的商群、环同态的商环、拓扑空间的商空间时都会以不同形式出现是必须形成肌肉记忆的操作。我自己的经验是把商集想象成“把纤维捏成点”。给定 f: A → B定义等价关系 x ~ y 当且仅当 f(x) f(y)。那么商集 A/~ 就同构于 f 的像作为集合。这个同构就是“第一同构定理”的集合版本后续在群、环、模里会反复推广。所以 Chapter 0 的商集练习不是孤立的它是整个代数结构的“原型”。3.3 笛卡尔积的泛性质为什么“配对”比“元素”更重要Chapter 0 里关于笛卡尔积的练习题往往会引入“泛性质”的语言。给定集合 A 和 B笛卡尔积 A × B 配上两个投影映射 π₁: A × B → A 和 π₂: A × B → B满足以下泛性质对任意集合 C 和任意映射 f: C → A, g: C → B存在唯一的映射 h: C → A × B 使得 π₁ ∘ h f 且 π₂ ∘ h g。这个 h 就是 c ↦ (f(c), g(c))。这个泛性质看起来像是“把简单的事情说复杂了”但它是后续所有“泛性质定义”的模板。群、环、模的直积、拓扑空间的积空间、甚至范畴论里的积都是这个模式的推广。所以 Chapter 0 的练习里如果出现了“证明笛卡尔积的泛性质”不要跳过——它是你第一次接触“用映射来刻画对象”的思维方式。我当年做这个练习时最大的困惑是“唯一性”为什么要单独强调。后来才明白唯一性保证了 h 是由 f 和 g 完全决定的没有“额外选择”的空间。这在后续讲“泛性质定义的对象在同构意义下唯一”时是关键。如果只有存在性没有唯一性那 A × B 就可能有很多“版本”无法在范畴论的意义下称为“积”。所以唯一性不是装饰它是定义的一部分。4. 常见练习题型与解题模板从“会做”到“做对”4.1 证明两个集合相等双向包含法的标准流程Chapter 0 里最常见的题型就是“证明 A B”其中 A 和 B 可能是像、原像、商集、笛卡尔积的某种组合。标准做法是双向包含先证 A ⊆ B再证 B ⊆ A。这个流程听起来简单但实际操作时容易在“取元素”的步骤上卡住。我的模板是这样的证 A ⊆ B 时写“取 x ∈ A”然后根据 A 的定义展开逐步推导出 x ∈ B。证 B ⊆ A 时反过来。关键是每一步都要有依据——要么是定义要么是已知条件要么是之前证明过的引理。不要写“显然”或“容易看出”除非你真的能在三秒内说出理由。举个例子证明 f⁻¹(B₁ ∪ B₂) f⁻¹(B₁) ∪ f⁻¹(B₂)。先证左边 ⊆ 右边取 x ∈ f⁻¹(B₁ ∪ B₂)则 f(x) ∈ B₁ ∪ B₂所以 f(x) ∈ B₁ 或 f(x) ∈ B₂。若 f(x) ∈ B₁则 x ∈ f⁻¹(B₁)若 f(x) ∈ B₂则 x ∈ f⁻¹(B₂)。无论哪种情况x ∈ f⁻¹(B₁) ∪ f⁻¹(B₂)。再证右边 ⊆ 左边取 x ∈ f⁻¹(B₁) ∪ f⁻¹(B₂)则 x ∈ f⁻¹(B₁) 或 x ∈ f⁻¹(B₂)。若 x ∈ f⁻¹(B₁)则 f(x) ∈ B₁ ⊆ B₁ ∪ B₂所以 x ∈ f⁻¹(B₁ ∪ B₂)另一种情况同理。这个证明没有任何技巧就是老老实实展开定义但它是训练严谨性的好材料。提示双向包含法虽然笨但它是所有集合等式证明的“万能钥匙”。如果你卡住了先试试双向包含往往能打开局面。4.2 构造反例什么时候“举例子”比“讲道理”更有效Chapter 0 里有一类题是“判断命题是否成立若不成立举反例”。这类题比证明题更容易失分因为很多人会试图“证明”一个假命题浪费大量时间。我的策略是先花30秒尝试构造反例如果构造不出来再尝试证明。因为反例往往比证明更直观而且一旦找到反例你就知道命题是假的不需要再纠结。构造反例的关键是找到“边界情况”。比如命题“f(A₁ ∩ A₂) f(A₁) ∩ f(A₂) 对所有 f 成立”反例就出现在 f 不是单射的时候。你可以取 A {1, 2}B {a}f(1) f(2) aA₁ {1}A₂ {2}。这个反例小到可以心算但它精确地展示了“非单射导致交集信息丢失”的本质。另一个常见反例是“f(f⁻¹(B)) B 对所有 B 成立”。反例出现在 f 不是满射时取 A {1}B {a, b}f(1) aB {b}。则 f⁻¹(B) ∅f(∅) ∅ ≠ {b}。这个反例说明原像再取像会“缩小”到像与 B 的交集而不是还原 B。4.3 泛性质练习如何从“交换图”读出映射Chapter 0 的泛性质练习往往配有交换图。很多人看到交换图就紧张其实交换图只是“映射等式”的图形化表达。一个三角形交换图意味着两条路径给出的映射相等一个正方形交换图意味着上下复合等于左右复合。读图的方法是从任意一个对象出发沿着箭头走到另一个对象所有路径给出的复合映射都相等。以笛卡尔积的泛性质为例交换图是一个“锥形”C 在顶端两条箭头分别指向 A 和 B然后 A 和 B 又通过投影映射指向 A × B。这个图告诉我们h 是 C 到 A × B 的映射且 π₁ ∘ h fπ₂ ∘ h g。所以 h 必须把 c 映射到 (f(c), g(c))没有其他选择。唯一性就体现在这里一旦 f 和 g 给定h 就被迫确定。我建议在做泛性质练习时先把交换图翻译成映射等式然后根据等式构造 h最后验证 h 确实满足所有等式。这个流程在后续讲极限、余极限、伴随函子时会反复使用是范畴论的基本功。5. 从集合练习到后续章节那些当时不懂、后来才明白的点5.1 为什么 Chapter 0 要强调“映射的复合”而不是“元素的运算”集合论的传统讲法是“元素 运算”但 Chapter 0 的讲法是“对象 映射”。这个视角转换是范畴论的核心。在集合的范畴 Set 里对象是集合态射是映射复合是映射的复合。这个范畴的很多性质比如笛卡尔积是积不交并是余积在后续的群、环、模、拓扑里都有对应。我当年做 Chapter 0 练习时觉得“映射的复合”只是记号上的方便后来学到函子才明白函子就是“保持复合的映射”。如果 Chapter 0 没有把复合的结合律、单位元这些性质练熟后面定义函子时就会觉得抽象。所以那些看似琐碎的“证明 (h ∘ g) ∘ f h ∘ (g ∘ f)”的练习其实是在为函子的定义做铺垫。5.2 单射、满射、双射在后续章节的“变形”单射和满射在 Chapter 0 里是集合映射的性质到了群论里变成“单同态”和“满同态”到了拓扑里变成“单连续映射”和“满连续映射”到了层论里变成“单预层映射”和“满预层映射”。名字变了但核心定义没变单射是“像唯一”满射是“像覆盖”。所以 Chapter 0 里把这两个概念练到条件反射后面每遇到一个新结构你只需要验证“这个结构里的映射是否保持运算”而不需要重新理解单射和满射本身。双射在后续章节里往往对应“同构”。集合的双射就是集合的同构群的双射同态就是群同构拓扑的双射连续开映射就是同胚。Chapter 0 里如果能把“双射的逆也是双射”这类练习做熟后面证明“同构的逆也是同构”时就会觉得理所当然。5.3 商集思想在群、环、模里的推广商集是 Chapter 0 里最“代数”的概念。给定集合 A 和等价关系 ~商集 A/~ 把等价类捏成点。到了群论里商群 G/N 把陪集捏成点到了环论里商环 R/I 把陪集捏成点到了模论里商模 M/N 把陪集捏成点。这些构造的底层逻辑完全一样先定义等价关系x ~ y 当且仅当 x - y ∈ N然后验证运算在等价类上良定义。Chapter 0 里如果能把“商集上的映射良定义”这个验证流程练熟后面学商群、商环、商模时就会觉得顺畅。我自己的经验是商结构的所有证明都可以归结为“取代表元验证不依赖于代表元”。这个套路在 Chapter 0 里练十遍后面就不用再练了。6. 我踩过的三个坑与对应的修复方案6.1 把“原像”当成“反函数”来用这是我最早犯的错误。看到 f⁻¹(B) 就以为 f 必须有反函数然后纠结“如果 f 不是双射f⁻¹ 是什么”。实际上 f⁻¹(B) 只是一个记号表示“所有映射到 B 里的元素的集合”它不要求 f 可逆。这个误解导致我在做原像相关练习时总是绕弯路试图先证明 f 是双射再计算。修复方案把 f⁻¹(B) 读作“B 的原像”而不是“f 的逆作用在 B 上”。每次看到这个记号先默念“原像原像原像”然后直接展开定义。如果题目要求证明 f 可逆那再单独处理。6.2 在证明单射时默认“f(x₁) f(x₂) 蕴含 x₁ x₂”是显然的这个错误更隐蔽。单射的定义本身就是“f(x₁) f(x₂) 蕴含 x₁ x₂”所以在证明某个映射是单射时你需要验证这个蕴含关系而不是假设它成立。我当年经常在证明里写“因为 f 是单射所以 x₁ x₂”但题目要求的就是证明 f 是单射这就成了循环论证。修复方案证明单射时从“假设 f(x₁) f(x₂)”出发利用 f 的具体定义推导出 x₁ x₂。不要引用“f 是单射”这个结论因为那正是你要证的。6.3 忽略“良定义”验证直接定义商集上的映射这个坑在商集练习里最常见。给定等价关系 ~ 和函数 f你想定义 f̄: A/~ → B 为 f̄([x]) f(x)。但你必须先验证如果 [x] [y]则 f(x) f(y)。这个验证不是“形式主义”而是商集定义的核心要求。我当年因为漏掉这一步被批改时指出“f̄ 可能不是函数”才意识到问题的严重性。修复方案每次定义商集上的映射先写“首先验证良定义”然后取 [x] [y]展开等价关系的定义利用 f 的不变性推出 f(x) f(y)。这个流程在后续商群、商环、商模里会反复使用值得形成条件反射。7. 给正在做 Chapter 0 练习的人几条实用建议如果你现在正卡在 Chapter 0 的集合练习上我的建议是不要跳过任何一道题哪怕它看起来“太简单”。Chapter 0 的题目设计是有梯度的前面的简单题是在帮你建立符号系统后面的难题是在训练你把符号系统用到新情境里。如果你跳过了前面的题后面的题就会因为“符号不熟”而做不下去。另外做练习时尽量手写证明不要只在脑子里想。集合论的证明有很多“取元素、展开定义、推导、收集”的步骤这些步骤在脑子里过一遍和写在纸上是两回事。手写能暴露你思维里的跳跃和漏洞也能帮你形成肌肉记忆。最后如果你在某道题上卡了超过20分钟先放下去做后面的题。Chapter 0 的很多概念是相互关联的后面的题可能会给你前面的题提供灵感。我当年有一道关于纤维的题卡了一下午后来在做商集练习时突然明白了纤维的划分意义回头再看那道题就迎刃而解了。提示Chapter 0 的练习答案往往不止一种写法。如果你写出的证明和标准答案不同先别急着改检查一下你的逻辑是否自洽。如果自洽那你的写法也是对的甚至可能比标准答案更直观。