Ran Wei/数学系列
English
计算机科学与人工智能的数学基础 — Ran Wei

集合、关系与离散结构

精确描述集合及其关系。学习哪些分组规则产生真正的等价类,哪些依赖规则构成序,以及映射何时能够逆转。

8 小时4 个时段3 个实验12 道练习与 2 道拓展10 道自测题

完成后你能够

  • 在明确全集中计算集合运算,并构造幂集与笛卡尔积。
  • 用任意元素的成员关系证明集合恒等式。
  • 通过违反性质的具体配对与三元组分类关系。
  • 构造等价类并解释它们为何形成划分。
  • 区分偏序与等价,依据明确陪域检验单射与满射。

开始之前

模块 01–02:定义域、函数、逻辑联结词、量词与反例。开始前解释全称规则的否定。实验只用 Python 标准库。

目录

学习计划

8 小时

时间包含练习,是估计值;可按需要拆分时段。可选拓展练习额外需要 25 分钟。进度保存在当前浏览器,中英文版本共享。

1

什么样的分组规则合理?

三个文档的关键词为:a 有“python”,b 有“python”和“ai”,c 有“ai”。工具认为共享关键词就等价,于是 a 与 b 等价,b 与 c 等价,a 却不与 c 等价。把新文档与已有代表比较的分组程序,会因输入顺序而改变结果。问题首先是数学问题:该关系没有等价所需的性质。

集合描述成员,关系描述成立的配对,函数则是一类每个输入恰有一个输出的关系。本模块把它们连接到记录标识、分组与依赖序。你将明确规则需要哪种性质,并在失败时给出具体见证。直观图像或“相似”一词本身不能保证结构正确。

回忆检查:翻译“每个配对都满足性质”,否定“每个对象都有匹配”,并区分像与陪域。按需复习量词与函数。有限目录是教学模型,一般定义也适用于更大及无限集合。

2

成员、子集与集合运算

集合(set)由成员确定,顺序和重复不重要:{a,b,a}={b,a}\{a,b,a\}=\{b,a\}。列表可保留重复与顺序,因此用集合替换列表可能改变问题。数据中同一观测出现两次,而不同值的集合不再记录次数。表示必须符合要研究的数量。

x∈Ax\in A 表示属于,x∉Ax\notin A 表示不属于。A⊆BA\subseteq B 意为 ∀x, x∈A⇒x∈B\forall x,\ x\in A\Rightarrow x\in B,允许相等。真子集 A⊊BA\subsetneq B 还要求 A≠BA\ne B。属于比较对象与集合;包含比较两集合的成员。成员本身是集合时,两种问题都可能出现,必须分别判断。

空集 ∅\varnothing 没有成员,是每个集合的子集,因为没有违反包含蕴含的元素。但它不自动属于每个集合。A={a,b}A=\{a,b\} 时,∅⊆A\varnothing\subseteq A 真而 ∅∈A\varnothing\in A 假;B={∅,a}B=\{\varnothing,a\} 时两者都真。这区别在子集的集合中尤其重要。

并集 A∪BA\cup B 包含任一集合的成员,交集 A∩BA\cap B 包含两者共有成员,差集 A∖BA\setminus B 包含 A 中不在 B 的成员。补集必须相对于明确全集(universe) UU:假定 A⊆UA\subseteq U,Ac=U∖AA^c=U\setminus A。没有 U,“其他所有对象”是不完整的。目录补集是目录中其余条目,并非所有可能对象。

例题详解
固定全集中计算运算

令 U={0,1,2,3}U=\{0,1,2,3\}、A={0,1}A=\{0,1\}、B={1,2}B=\{1,2\}。则并集为 {0,1,2}\{0,1,2\},交集为 {1}\{1\},A∖B={0}A\setminus B=\{0\},Ac={2,3}A^c=\{2,3\}。反向差集为 {2}\{2\}。若全集增加四,列出的结果只有补集改变,增加四。

幂集(power set) P(A)\mathcal{P}(A) 是 A 的全部子集构成的集合。A={a,b,c}A=\{a,b,c\} 时,有空集、三个单元素集、三个二元素集及 A 本身,共八个成员。每个原始元素可选入或不选入,所以 n 元有限集合有 2n2^n 个子集;模块 05 系统研究该计数规则。幂集的元素是集合,并不是重复 A 的原始元素。

笛卡尔积(Cartesian product) A×BA\times B 包含 a∈A,b∈Ba\in A,b\in B 的有序对 (a,b)(a,b)。顺序有意义,因为两个坐标各有角色。请求集 D 与审核人集 V 的积包含候选请求—审核人配对;反向积描述审核人—请求。任何一因子为空,就没有配对,积为空。

Python 的空集写 set(),因为 {} 是字典。集合成员必须可哈希;集合的集合可用 frozenset 作成员,可变 set 不能作为成员。这是程序表示限制,不改变数学。打印顺序无保证,实验为可复现输出对元素排序。

检验理解

对 A={a,b}A=\{a,b\},判断 a∈Aa\in A、{a}⊆A\{a\}\subseteq A、{a}∈P(A)\{a\}\in\mathcal{P}(A)。幂集为什么不是 A 换了标点?

查看答案

三者都真。幂集成员是 {a}\{a\}、∅\varnothing 等子集,A 的成员是 a、b。成员类型与大小不同。

3

通过成员关系证明恒等式

两个集合相等当且仅当成员完全相同。证明 A=BA=B,可以对任意对象证明属于 A 当且仅当属于 B,或分别证明两方向包含。只比较成员数量不够,因为不同集合可有相同基数;只检查一个元素也不够,除非它就是整个论域。

集合运算连接模块 02 的逻辑:x∈A∩Bx\in A\cap B 等价于 (x∈A)∧(x∈B)(x\in A)\land(x\in B),并集对应包含式析取。对于 x∈Ux\in U,属于补集等价于不属于 A。因此任意候选成员上的逻辑等价能给出集合恒等式,不需要集合小到可列举。

例题详解
完整的分配律证明

对任意 x,

x∈A∩(B∪C)⇔(x∈A)∧((x∈B)∨(x∈C))⇔((x∈A)∧(x∈B))∨((x∈A)∧(x∈C))⇔x∈(A∩B)∪(A∩C).\begin{aligned}x\in A\cap(B\cup C)&\Leftrightarrow(x\in A)\land\bigl((x\in B)\lor(x\in C)\bigr)\\&\Leftrightarrow\bigl((x\in A)\land(x\in B)\bigr)\lor\bigl((x\in A)\land(x\in C)\bigr)\\&\Leftrightarrow x\in(A\cap B)\cup(A\cap C).\end{aligned}

中间使用布尔分配律,可由完整真值表或按 x 是否属于 A 分类证明。因为 x 任意,两侧成员完全相同,故集合相等,包括某些集合为空的情形。

同一全集下,德摩根律给出 (A∪B)c=Ac∩Bc(A\cup B)^c=A^c\cap B^c 与 (A∩B)c=Ac∪Bc(A\cap B)^c=A^c\cup B^c。共同全集是前提。训练目录补集与全部记录补集的候选成员不同,不能混用;数据库筛选与数据划分尤其需要明确 U。

该全集中 A∖B=A∩BcA\setminus B=A\cap B^c,差集通常不可交换。对称差 (A∖B)∪(B∖A)(A\setminus B)\cup(B\setminus A) 可交换,因为选取恰属于一侧的成员。变化标识报告可能需要对称差,从 A 删除的标识报告只需要单向差。名字相似不代表运算可互换。

阴影图可以沟通恒等式,但仍需说明前提。两集合有四种成员情况:都不属于、仅 A、仅 B、两者都属于。表达式选择某些区域。比较全部区域的选择给出有限逻辑证明;绘几个样本点只是说明。必须说明提供的是哪种证据。

成员真值与集合运算四行成员赋值完全决定并、交与差,不表示区域大小。x ∈ Ax ∈ BA ∪ BA ∩ BA \ BFFFFFFTTFFTFTFTTTTTF
图 3.1

四种成员可能决定并、交、差。区域标签描述成员真值,不代表区域中数据点的数量。

证明包含的写法是:“取任意 x∈Ax\in A,根据定义与假设推出 x∈Bx\in B。”除非在证明反向或使用可逆等价步骤,不应先假设 x∈Bx\in B。如果使用 A⊆BA\subseteq B、B⊆CB\subseteq C 等额外前提来证明 A⊆CA\subseteq C,应清楚列出它们。

实验检查一个三元素全集的所有子集,是对实现与预测的有用检验,却不自行证明所有集合的恒等式。上面的任意成员论证覆盖一般陈述,包括无限集合。计算与证明可互相支持,但回答不同范围的问题。

检验理解

用成员关系证明 A∩∅=∅A\cap\varnothing=\varnothing,不要只说显然。为什么有限大小相等不足以证明集合相等?

查看答案

属于交集必须属于空集,但没有对象属于空集,所以交集无成员。{0}\{0\} 与 {1}\{1\} 大小相同而成员不同。

4

二元关系及其性质

从 A 到 B 的二元关系(binary relation)是子集 R⊆A×BR\subseteq A\times B,选择哪些有序配对成立。xRyxRy 是 (x,y)∈R(x,y)\in R 的简写。D 上的关系满足 R⊆D×DR\subseteq D\times D,可比较同类对象。有限关系可用布尔表表示:行是第一坐标,列是第二坐标,真格表示属于 R。

四种常见性质:自反(reflexive)为 ∀x∈D, xRx\forall x\in D,\ xRx;对称(symmetric)为 ∀x,y∈D, xRy⇒yRx\forall x,y\in D,\ xRy\Rightarrow yRx;反对称(antisymmetric)为 ∀x,y∈D, (xRy∧yRx)⇒x=y\forall x,y\in D,\ (xRy\land yRx)\Rightarrow x=y;传递(transitive)为 ∀x,y,z∈D, (xRy∧yRz)⇒xRz\forall x,y,z\in D,\ (xRy\land yRz)\Rightarrow xRz。每条是量化要求,失败见证形状不同。

缺失对角配对否定自反;正向存在而反向不存在否定对称;不同对象的双向配对否定反对称;xRy,yRzxRy,yRz 成立而 xRzxRz 缺失的链否定传递。看起来奇怪的配对不一定是反例,必须准确违反公式。

反对称不是“从不对称”。它允许同一对象的两个方向,也不要求不同对象之间有任何方向。相等关系同时对称与反对称,因为相关对象必相等,不会出现不同对象的双向配对。关系也可能两性质都没有。应记公式而非按“反”字直觉猜测。

例题详解
接近不等于等价

在 D={0,1,2}D=\{0,1,2\} 上定义 xRyxRy 为 ∣x−y∣≤1|x-y|\le1。它自反、对称;不反对称,因为 0R1,1R00R1,1R0 且零不等于一;不传递,因为 0R1,1R20R1,1R2 真而 0R20R2 假。表中有两种失败的具体见证。

开头关键词规则也不传递:a 与 b 共享,b 与 c 共享,a 与 c 不共享。对称性不能修复。若文档没有关键词,它与自身也不共享,因此在包含这种文档的论域上还不自反。限制为非空关键词文档能消除此自反失败,却不解决传递问题。

关键词关系的反例a 只有 python,b 有 python 和 ai,c 只有 ai。aRb 与 bRc 真而 aRc 假。共享关键词不是传递关系apythonbpython, aicaiTTa 与 c 不匹配
图 3.2

a–b–c 链存在两个相邻关键词匹配,缺少 a–c,给出否定传递所需的三个对象。

非空 D 上,空关系不自反,却对称、反对称、传递,因为相应前件永不成立。全关系 D×DD\times D 自反、对称、传递,只有 D 至多一个成员时反对称。空 D 上四性质都空真成立。这些边界情况直接来自量词逻辑。

性质必须对明确论域检查,包括没有出现在任何存储配对中的对象。只对已出现对象检查自反,可能漏掉另一个对象缺失的对角。实验把论域与配对集分别输入。一般定理要证明任意相关配对或三元组都满足;有限表可通过完整枚举确立该表的性质。

交互演示

在 {0,1,2} 上选择相等、同奇偶、接近或通常序,切换单元格并查看失败性质见证。同奇偶是等价,接近产生上面的反例。没有交互时仍可阅读定义与例子。

检验理解

在 {0,1,2} 上,x<yx<y 没有对角。它是否对称、反对称、传递?缺少反向为什么不违反反对称?

查看答案

不对称,因为 0<10<1 而 1<01<0 假;反对称,因为没有不同对象的双向配对;传递,因为 x<y<zx<y<z 推出 x<zx<z。反对称禁止不同对象双向,不要求反向存在。

5

等价类、划分与商集

等价关系(equivalence relation)自反、对称、传递,形式化“为这个目的视作相同”。字面相等是一例,不同记录也可按某个键等价。等价只关于该键或表示,不自动证明对应人、事件或物理对象相同。

x 的等价类(equivalence class)为 [x]={y∈D:xRy}[x]=\{y\in D:xRy\}。自反使 x∈[x]x\in[x],类非空。如果 y∈[x]y\in[x],对称与传递给出 [y]=[x][y]=[x],因此任何成员可作代表而不改变类。换代表只是换标签,不会生成新类。

例题详解
整数的奇偶类

定义 xRyxRy 为 x−yx-y 偶数。x−x=0x-x=0 给自反,偶数差取负给对称,两个偶数差相加给传递。有偶数与奇数两类。[0]=[2]=[−4][0]=[2]=[-4],[1]=[3][1]=[3]。不同代表可表示同一类,没有整数同时属于两类。

为何两类不能部分重叠?若 z∈[x]∩[y]z\in[x]\cap[y],则 xRz,yRzxRz,yRz。对称给 zRyzRy,传递给 xRyxRy。任意 u∈[x]u\in[x],对称给 yRxyRx,再由传递得 yRuyRu,故 u∈[y]u\in[y];反向包含同理。所以重叠就相等。这正是关键词分组缺失的数学保护。

不同等价类构成 D 的划分(partition):块非空、两两不交、并集为 D。自反让每个对象属于自身类,因而覆盖论域。反过来,划分可定义“属于同一块”的关系;块归属唯一,保证自反、对称、传递。两种描述表达同一结构。

奇偶等价类域 {0,1,2,3,4,5} 被分成偶数与奇数两不交非空块。偶数类 [0]0, 2, 4奇数类 [1]1, 3, 5商集的元素是两个块
图 3.3

有限论域 {0,1,2,3,4,5} 的奇偶划分有两个不交块。商集的成员是这两个块,不只是代表数字零与一。

商集(quotient set) D/RD/R 是不同等价类的集合。其成员是类,程序可存储方便的代表标签。代表上的运算要能定义在商集上,必须保证换用同类代表不会改变预期结果的值或类别。模运算将在后面使用此条件。

固定确定性键的相等产生等价:xRyxRy 当 k(x)=k(y)k(x)=k(y)。相等提供三条公理。例如去除首尾空格并进行大小写折叠,按明确规范化规则分组名字。但这可能合并同名不同人,或丢失应用需要的区别。标签的数学等价与键是否合适是不同问题。

相似规则若不传递,不应称输出为等价类。可选其他聚类目标,或改为链连通,但后者改变规则:a 与 c 可能通过 b 连通,却没有直接共享关键词。修复应明确声明并按用途评估,不能悄悄求传递闭包后仍称直接相似。

检验理解

按固定键完全相等分组为何不会部分重叠?是否保证键唯一标识一个人?

查看答案

键相等是等价;两组共享记录时键相等,因此组相同。它不说明不同人是否共享键,身份适用性需要更多信息或建模。

6

偏序、全序与哈斯图

偏序(partial order)自反、反对称、传递,记作 x⪯yx\preceq y。它描述顺序,而非等价的可互换归属。若 x⪯yx\preceq y 或 y⪯xy\preceq x 则可比。全序(total order)要求偏序中每对都可比。“偏”允许不可比,不表示公理偶尔才成立。

包含是幂集上的偏序:每集包含自身,互相包含推出相等,包含链可传递。在 P({a,b})\mathcal{P}(\{a,b\}) 中,{a}\{a\} 与 {b}\{b\} 不可比。把它们排进一个列表,是额外选择排序,不是发现它们间的包含关系。

例题详解
有不可比对象的包含序

四对象为 ∅,{a},{b},{a,b}\varnothing,\{a\},\{b\},\{a,b\}。空集在全部对象下,全集在全部对象上;单元素集位于中间且不可比。这是偏序而非全序,最小元为空集,最大元为全集。

有限偏序的哈斯图(Hasse diagram)省略自环与传递可推出的边。若 x≺yx\prec y 且没有论域对象严格位于其间,则从 x 向上画覆盖边到 y。向上路径表示其他比较;缺少直接边不意味着比较假,只要有路径。两个方向都无向上路径的对象不可比。

幂集包含的哈斯图空集在底,a 与 b 的单元素集中间且不可比,全集在顶。四条边是覆盖关系。∅{a}{b}{a, b}向上表示包含;{a} 与 {b} 不可比
图 3.4

{a,b} 幂集的包含序是菱形。向上边是覆盖关系,自反与空到全集的比较省略但仍成立。

最小元(least element)在每个对象之下;极小元(minimal element)没有不同的更小对象。最小必极小,但有不可比对象时极小未必最小。可有多个极小,若有最小则唯一:两个最小元互相相关,反对称使它们相等。最大与极大是反向概念。

只取 {a},{b},{a,b}\{a\},\{b\},\{a,b\} 的论域,两单元素集都极小,但都不是最小,因为各自不在另一之下。全集最大。因此“选择最小合格项”的需求可能还需处理并列或不可比;偏序本身未必给唯一选择。

严格序去掉相等:x≺yx\prec y 意为 x⪯yx\preceq y 且 x≠yx\ne y。由偏序得到的严格关系反自反且传递,但不自反,故不能用前述非严格偏序公理直接把 << 分类成偏序。合适的严格序可添加相等得到非严格序;先说明约定再检查。

依赖可通过可达性形成序:同一对象或存在指向路径时,前者先于后者。要保证不同对象反对称,必须排除有向环。模块 07 研究图与拓扑序。当前先区分直接依赖对与传递可达关系;直接边表即使描述合理依赖,也未必自身传递。

应用可同时有等价和序:相同标签分组形成等价类,再按先决关系排序是另一结构。相等本身既等价又偏序,但只有至多一元素论域上是全序。因此应读公理,不要以为结构类别永不重叠。

检验理解

从菱形论域删除空集后,哪些对象极小、哪些最小?把剩余对象排序为何不能改变答案?

查看答案

两个单元素集都极小,没有最小元。排序可选择谁先出现,但附加顺序不会使一个单元素集成为另一个的子集。

7

作为关系的函数与可逆映射

函数 f:A→Bf:A\to B 的图为 Gf={(x,f(x)):x∈A}⊆A×BG_f=\{(x,f(x)):x\in A\}\subseteq A\times B。它是每个 A 输入恰有一个 B 输出的特殊关系。一般关系可无输出或有多个输出,所以并非每个关系是函数。列出图仍必须声明 A、B。

单射(injective)要求任意输入满足 f(x)=f(y)⇒x=yf(x)=f(y)\Rightarrow x=y,不同输入输出不同。满射(surjective)到 B 要求每个 b∈Bb\in B 都有 x∈Ax\in A 使 f(x)=bf(x)=b,它依赖陪域。双射(bijective)同时满足两者,每个陪域成员恰有一个原像。

例题详解
陪域改变满射性

令 A={0,1,2}A=\{0,1,2\},f(x)=2x+1f(x)=2x+1。陪域 B={1,3,5,9}B=\{1,3,5,9\} 时单射但不满射,九无原像。同一规则改为陪域 B′={1,3,5}B'=\{1,3,5\} 时双射。把目标改为像改变了规格,不是为九创造原像。

逆关系反转 GfG_f 的每个配对。它在整个 B 上是函数当且仅当 f 双射:满射为每个逆输入提供输出,单射保证唯一。单射可只在其像上有逆函数;不单射时逆关系有多输出,任选一个需要额外规则,不是唯一逆。

实数平方函数满足 f(−2)=f(2)=4f(-2)=f(2)=4,不单射。限制为非负实数到非负实数后双射,逆为平方根。论域限制是数学选择。丢弃属性的特征映射也可能合并不同记录;没有额外信息或假设,后续算法无法仅由特征唯一重建区别。

唯一标识每条记录的键应在记录论域上单射,却不必覆盖全部可能标识字符串,未用标识很正常。标签映射可故意多对一,因为多记录属于同一类。把标签当唯一标识就是混淆用途;需要哪种性质应由规格决定。

有限集合间单射说明源大小不超过目标,双射说明大小相同。但大小相同不使每个函数双射:实际规则仍可碰撞并遗漏输出。无限集合中,真子集也可能与原集双射,有限“严格更少”的直觉不能自动延伸。

可数性(countability)预览:n↦2nn\mapsto2n 把含零自然数双射到偶自然数,虽然后者是真子集。整数可列为 0,1,−1,2,−2,…0,1,-1,2,-2,\ldots;有理数可按整数分子、正分母组织并跳过重复。这些可数无限。实数不可数,完整对角线论证留作额外证明练习,不是本实验先修。

实用结业技能是检查明确映射,说明保留哪些信息,逆转是否唯一且在目标论域上完整。关系、等价类与序提供另外的结构表示;先选择符合问题的数学对象,再选处理算法。

检验理解

记录标识映射到二元类别,每个类别有多记录。它单射吗?两类别都出现时是否满射到 {0,1}?能由类别唯一恢复记录吗?

查看答案

不单射,因为不同记录共享标签;两类别都出现时满射到该陪域。标签不能唯一恢复记录,满射不消除碰撞。

8

常见误解

症状 原因 修复
重复观测消失 列表被替换为集合 需要次数时保留重复
补集出现意外记录 未声明共同全集 先明确 U
自配对被当作反对称失败 错把反对称理解为没有反向 只检查不同对象的双向配对
相似文档分组不稳定 对称被误作等价 给出失败三元组并声明分组目标
换代表改变类 规则不等价 用真正等价,或明确另一聚类方法
极小被称为最小 忽略不可比 对每个对象检查比较
只凭公式假定逆存在 漏掉论域、陪域或碰撞 检查逆输入的覆盖与唯一性
9

实验设置

使用 Python 3.11 或更新版本,按需阅读 Python 入门。无需包。集合上的 &、|、- 分别为交、并、差,并非标量算术。每个实验解释预测、结果结构与故障或变化。每次十分:预测三分,解释四分,诊断三分。

10

实验 1 枚举集合恒等式

四十分钟:列出 {0,1,2} 的八个子集,预测子集有序三元组数量,再运行。脚本在这一个全集的全部三元组上比较分配律与补集恒等式。解释为何有 512 组、为何排序输出,以及一般证明为何仍需任意成员论证。把德摩根右侧的交改成并,保存失败 A、B 并修复。

下载 lab1_set_identities.py

"""Exhaustive checks over one small universe, not a general set-theoretic proof."""
from itertools import combinations, product


def subsets(items):
    return [set(part) for k in range(len(items) + 1) for part in combinations(items, k)]


def main():
    universe = {0, 1, 2}
    choices = subsets(sorted(universe))
    print("Power set:", [sorted(s) for s in choices])
    checks = 0
    for a, b, c in product(choices, repeat=3):
        assert a & (b | c) == (a & b) | (a & c)
        assert universe - (a | b) == (universe - a) & (universe - b)
        checks += 1
    print("Distributivity and De Morgan agree for", checks, "triples in this universe.")
    a, b = {0, 1}, {1, 2}
    print("A union B:", sorted(a | b), "intersection:", sorted(a & b))
    print("A minus B:", sorted(a - b), "B minus A:", sorted(b - a))
    print("{} is a dict; set() is an empty set.")
    print("General identities still require a proof for arbitrary membership.")


if __name__ == "__main__":
    main()
输出
Power set: [[], [0], [1], [2], [0, 1], [0, 2], [1, 2], [0, 1, 2]]
Distributivity and De Morgan agree for 512 triples in this universe.
A union B: [0, 1, 2] intersection: [1]
A minus B: [0] B minus A: [2]
{} is a dict; set() is an empty set.
General identities still require a proof for arbitrary membership.
11

实验 2 分类有限关系

四十分钟:预测同奇偶、距离至多一、≤\le、<< 的四性质。运行并逐条把见证对照定义。将论域改成 (0,1,2,3),运行前预测新见证。最后相等关系显示对称与反对称可以并存。探索器可直接创造缺失对角、反向与传递失败。

下载 lab2_relations.py

"""Return one explicit witness for each failed property on a finite domain."""
from itertools import product


def failures(domain, relation):
    pairs = list(product(domain, repeat=2))
    triples = product(domain, repeat=3)
    return {
        "reflexive": next(((x, x) for x in domain if (x, x) not in relation), None),
        "symmetric": next(((x, y) for x, y in pairs if (x, y) in relation and (y, x) not in relation), None),
        "antisymmetric": next(((x, y) for x, y in pairs if x != y and (x, y) in relation and (y, x) in relation), None),
        "transitive": next(((x, y, z) for x, y, z in triples if (x, y) in relation and (y, z) in relation and (x, z) not in relation), None),
    }


def main():
    domain = (0, 1, 2)
    rules = {
        "same parity": lambda x, y: x % 2 == y % 2,
        "distance at most one": lambda x, y: abs(x - y) <= 1,
        "less than or equal": lambda x, y: x <= y,
        "strictly less": lambda x, y: x < y,
    }
    for name, rule in rules.items():
        relation = {(x, y) for x, y in product(domain, repeat=2) if rule(x, y)}
        result = failures(domain, relation)
        print(name)
        for property_name, witness in result.items():
            print(" ", property_name + ":", "holds" if witness is None else f"fails at {witness}")
    identity = {(x, x) for x in domain}
    assert all(witness is None for witness in failures(domain, identity).values())
    print("Identity is both symmetric and antisymmetric.")


if __name__ == "__main__":
    main()
输出
same parity
  reflexive: holds
  symmetric: holds
  antisymmetric: fails at (0, 2)
  transitive: holds
distance at most one
  reflexive: holds
  symmetric: holds
  antisymmetric: fails at (0, 1)
  transitive: fails at (0, 1, 2)
less than or equal
  reflexive: holds
  symmetric: fails at (0, 1)
  antisymmetric: holds
  transitive: holds
strictly less
  reflexive: fails at (0, 0)
  symmetric: fails at (0, 1)
  antisymmetric: holds
  transitive: holds
Identity is both symmetric and antisymmetric.
12

实验 3 诊断分组规则

四十分钟:预测规范化姓名组与两种贪心关键词分组。运行后解释差异。固定键相等形成等价类,直接关键词相似不会。不要把规范化姓名称为已验证个人身份。添加第五条名为 Ada 但属于另一个人的记录,解释代码对键仍数学正确,却不适合识别人。

下载 lab3_grouping.py

"""Equality of a declared key is an equivalence; shared keywords need not be."""


def main():
    records = (("r1", "Ada"), ("r2", " ADA "), ("r3", "Lin"), ("r4", "LIN"))
    groups = {}
    for identifier, name in records:
        key = name.strip().casefold()
        groups.setdefault(key, []).append(identifier)
    print("Groups by stripped, case-folded name:", groups)
    print("This key defines equality of labels, not proof of personal identity.")
    keywords = {"a": {"python"}, "b": {"python", "ai"}, "c": {"ai"}}

    def related(x, y):
        return bool(keywords[x] & keywords[y])

    print("a~b:", related("a", "b"), "b~c:", related("b", "c"), "a~c:", related("a", "c"))
    assert related("a", "b") and related("b", "c") and not related("a", "c")

    def greedy(order):
        result = []
        for item in order:
            for group in result:
                if related(item, group[0]):
                    group.append(item)
                    break
            else:
                result.append([item])
        return result

    print("Representative grouping, order a,b,c:", greedy(("a", "b", "c")))
    print("Representative grouping, order b,a,c:", greedy(("b", "a", "c")))
    print("Repair: use an explicit equivalence key or declare a different clustering objective.")


if __name__ == "__main__":
    main()
输出
Groups by stripped, case-folded name: {'ada': ['r1', 'r2'], 'lin': ['r3', 'r4']}
This key defines equality of labels, not proof of personal identity.
a~b: True b~c: True a~c: False
Representative grouping, order a,b,c: [['a', 'b'], ['c']]
Representative grouping, order b,a,c: [['b', 'a', 'c']]
Repair: use an explicit equivalence key or declare a different clustering objective.
13

练习与完整解答

练习 1–12 预算 110 分钟,每题五分;可选两题额外 25 分钟。失败性质给出满足前提、违反结论的输入;证明要说明论域并使用任意成员或完整逻辑论证。

练习 1★★★计算5 分钟

给定 U={0,1,2,3}U=\{0,1,2,3\}、A={0,2}A=\{0,2\}、B={1,2}B=\{1,2\},计算并、交、两方向差与 AcA^c。

查看解答

依次为 {0,1,2}\{0,1,2\}、{2}\{2\}、{0}\{0\}、{1}\{1\}、{1,3}\{1,3\}。差的方向改变选择,补使用明确 U。

练习 2★★★概念5 分钟

对 A={a,b}A=\{a,b\} 判断 a∈Aa\in A、{a}⊆A\{a\}\subseteq A、∅⊆A\varnothing\subseteq A、∅∈A\varnothing\in A,并列幂集。

查看解答

前三真,第四假。幂集为 {∅,{a},{b},{a,b}}\{\varnothing,\{a\},\{b\},\{a,b\}\}。属于与包含不同。

练习 3★★★计算5 分钟

列出 {0,1}×{a,b}\{0,1\}\times\{a,b\},与反向积比较。第二因子空时如何?

查看解答

配对为 (0,a),(0,b),(1,a),(1,b)(0,a),(0,b),(1,a),(1,b);反向积字母在前。空因子不给任何配对,所以积为空。

练习 4★★★概念5 分钟

写四条关系性质的量化规则,并指出各反例形状。

查看解答

自反要求每个 (x,x)(x,x),缺失一个即失败;对称要求每个已有配对的反向;反对称禁止不同对象双向;传递要求已有 (x,y),(y,z)(x,y),(y,z) 时有 (x,z)(x,z),缺失闭合配对否定它。

练习 5★★★proof10 分钟

在共同全集 U 中,用任意成员证明 (A∪B)c=Ac∩Bc(A\cup B)^c=A^c\cap B^c。

查看解答

任意 x∈Ux\in U 属于左侧当且仅当不属于并集,当且仅当不属于 A 且不属于 B,当且仅当属于右侧。U 外两边都无成员,所以处处相同。

练习 6★★★proof10 分钟

用差而非有限表证明整数同奇偶是等价。

查看解答

x−x=0x-x=0 偶;若 x−y=2kx-y=2k,则 y−x=2(−k)y-x=2(-k) 偶;若 x−y=2k,y−z=2lx-y=2k,y-z=2l,则 x−z=2(k+l)x-z=2(k+l) 偶。对任意整数证明三性质。

练习 7★★★proof10 分钟

证明重叠等价类相等,指出对称与传递的使用。

查看解答

共享 z 给 xRz,yRzxRz,yRz,对称与传递推出 xRyxRy。对 u∈[x]u\in[x],对称给 yRxyRx,传递给 yRuyRu,故包含于 [y][y];交换 x、y 给反向包含,故相等。

练习 8★★★application10 分钟

画 P({a,b})\mathcal{P}(\{a,b\}) 包含序哈斯图,指出不可比、最小与最大。

查看解答

空在底,两单元素集中间,全在顶,四条向上覆盖边。单元素集不可比;空最小,全最大;空到全由路径推出无需直边。

练习 9★★★application10 分钟

设 f:{0,1,2}→{0,1}f:\{0,1,2\}\to\{0,1\},f(0)=0,f(1)=1,f(2)=0f(0)=0,f(1)=1,f(2)=0。分类单射、满射与逆关系。

查看解答

零与二碰撞所以不单射;两输出出现所以满射。逆关系有 (0,0),(0,2),(1,1)(0,0),(0,2),(1,1),输入零有两输出,不是函数。

练习 10★★★application10 分钟

按同奇偶分组 {0,1,2,3,4,5},写商集并与代表标签集区别。

查看解答

商集为 {{0,2,4},{1,3,5}}\{\{0,2,4\},\{1,3,5\}\}。{0,1} 可作为两类的程序标签,但数学商集成员是块本身。

练习 11★★★diagnosis15 分钟

报告因关系含 (0,0)(0,0) 就说不反对称。反驳并给真正失败见证。

查看解答

相等对象双向允许,所以 (0,0)(0,0) 无害。包含 (0,1),(1,0)(0,1),(1,0) 则违反,因为对象不同。相等同时对称与反对称。

练习 12★★★diagnosis15 分钟

解释关键词例子中依赖顺序的代表分组。把所有链连通文档合并是否忠实实现直接共享?

查看解答

先 a 会组 a、b,再拒绝与代表 a 不匹配的 c;先 b 可组全部。不传递导致差异。链连通会一致合并全部,却让无直接共享的 a、c 同组,是另一个关系,不是保持原规则。

练习 13★★★proof10 分钟

可选:证明 n↦2nn\mapsto2n 从自然数到偶自然数双射,为何到全部自然数不满射?

查看解答

2m=2n2m=2n 可约得 m=nm=n,故单射。每个偶自然数 2k2k 有原像 k,故满射到偶数。奇数一无原像,扩大陪域会破坏满射。

练习 14★★★proof15 分钟

可选:证明偏序最小元若存在则唯一,给两个极小却无最小的序。

查看解答

a、b 都最小则互相在对方之下,反对称推出相等。{{a},{b},{a,b}}\{\{a\},\{b\},\{a,b\}\} 包含序有两个不可比极小单元素集,无最小。存在与唯一不同。

14

自测题

完成九道自动选择题与一道书面解释。反馈指出混淆时回看定义;熟悉名称不能代替量化规则。

1
对每个集合 A 哪条成立?
2
A 相对于 U 的补集是什么?
3
{a,b,c} 有多少子集?
4
什么否定传递?
5
关系能同时对称与反对称吗?
6
两等价类重叠时如何?
7
什么额外性质使偏序为全序?
8
f:A 到 B 的满射依赖什么?
9
何时反转函数配对后在整个陪域上仍是函数?
查看答案

a={python}、b={python,ai}、c={ai},有 aRb 与 bRc,无 aRc,违反传递。等价要求自反、对称、传递,只有对称不够。给具体三对象及正确公理才得书面一分,仅说看起来不一致不够。

15

引导阅读

必读十五分钟:在 MIT Mathematics for Computer Science 链接教材中阅读基本集合与二元关系定义。把一个成员恒等式改写成逻辑式并比较子集记法。

必读二十分钟:阅读等价关系与偏序讨论,并排写公理,解释变化的公理如何改变用途。自己画四对象包含图。高级可数性在此可选。

选读:官方 Python 集合文档 帮助比较可变集合与 frozenset,并区别空集与空字典。本课图与教学例子为原创。

16

复习与证明模块准备

成员定义集合运算,任意成员论证证明恒等式。关系选择配对,量化公理决定结构。等价产生可互换块的划分;偏序提供可能不可比的比较。函数增加唯一输出,双射允许整个陪域上的唯一逆转。

结业任务:证明一个补集恒等式,带失败见证分类三对象关系,画有不可比对的哈斯图,并判断列出的函数有无完全逆。练习六十分、实验解释三十分、测验十分包括书面自评。修正后解释每个失败先修技能。

模块 04 研究直接证明、反证、归纳与程序不变式。起始技能是取任意对象、应用定义、写出范围与论证一致的结论。保留成员与奇偶证明作为范例。

17

记法与双语术语

术语或记法 含义 English
∈,⊆\in,\subseteq 属于、允许相等的包含 Membership, inclusion
∪,∩,∖\cup,\cap,\setminus 并、交、差 Union, intersection, difference
Ac=U∖AA^c=U\setminus A 固定全集中补集 Complement
P(A),A×B\mathcal{P}(A),A\times B 幂集、笛卡尔积 Power set, Cartesian product
自反 / 对称 全部自配对 / 全部反向配对 Reflexive / symmetric
反对称 / 传递 无不同对象双向 / 链闭合 Antisymmetric / transitive
[x],D/R[x],D/R 等价类、商集 Equivalence class, quotient set
划分 不交非空块覆盖论域 Partition
偏序 / 全序 序公理 / 还要求每对可比 Partial / total order
最小 / 极小 在全部对象下 / 无不同前驱 Least / minimal
单射 / 满射 / 双射 无碰撞 / 覆盖陪域 / 两者 Injective / surjective / bijective