集合论基础

陶哲轩《实分析》第三章和第八章部分的理解

2025-03-08 六 23:23 2025-03-14 Fri 23:25

去年写 如何捕捉实数 时读过这部分,也有记录,但没有整理,最近又读了一遍,重新整理了内容,额外加上了可数和不可数集合部分。

重新造袋子

集合论的基本思想是比较朴素的,它来自于平时我们所谈论的 "一袋东西" 的概念,因此有限的集合的性质是很符合直觉的, 数学为了能精确地说清这类袋子的性质,借助了更严格和抽象的语言(抽象是为了能表达更通用的性质,比如存在性), 也就是数理逻辑,以此排除掉朴素直觉里的潜在逻辑错误,尤其是数学的世界里涉及太多无限的对象,这些对象在日常中里比很少触及, 比如所有自然数组成的集合,平面上的所有点等,所以用数理逻辑语言要编写的并非普通袋子,而是如意乾坤袋,能收纳天地。 这些无限场景更容易出现 bug ,比如罗素悖论:如果你声称乾坤袋能收纳一切,那乾坤袋把自己收纳了后还存在吗,如何继续使用?

Linus 按照 Unix 的设计思想和实现方式重新用 C 写了 linux, 由于这是开源的,因此之后有大量的开发者加入,共同完善 linux 系统。而学习操作系统的人又会重新去尝试写其中的部分功能以此理解操作系统中的概念。

最初把集合论思想(康托尔提出)公理化的数学家(Zermole, 罗素等人),以及读这本书的人,也在用逻辑语言做类似的事情:

  • 先写出几个核心功能函数声明(或者预定义宏,或者抽象类,看用什么语言)– 构造出十多条公理
  • 基于这些始点,逐渐实现出集合所需的各种使用接口,以供其他上层库使用 – 用推理规则从公理证明出集合的众多重要命题和定理,其中有些纯粹是为了内部逻辑流所需要的 private 的命题,用于推进证明,但另外一些则是直接被上层使用的公开 api,比如定理 3.6.12 表明自然数集是无限的,实分析需要这个性质来构建无限的柯西序列以描述实数(尽管看上去显而易见,但这是从公理绕了一圈严格得到的结果,就像重新造了一台计算机并实现了加法)。

这门语言包括以下基本符号:

  • &: 逻辑与
  • |: 逻辑或
  • ~ 或 not: 否定
  • ->: 逻辑蕴含
  • <->: 逻辑等价
  • E(x): 存在 x
  • A(x): 对所有 x

语法规则和语义规则不详述,参阅数理逻辑文档。

不同于具体用编程语言重复造轮子,数理逻辑(尤其是书本用的一阶逻辑)没有一个具体的机器解释器(除非用定理证明相关工具,但那又是另外一套语言了),只有人脑在解析这些逻辑符号和描述,这至少有两方面后果:

  • 自己阅读的话缺乏第三方工具来给你检查思考的 bug ,现在可以用 AI 检测了
  • 没有必要对语法进行严格要求,所以书本里实际大部分还是一种结合了自然语言的伪逻辑代码。

等于公理

任何新定义的等于关系都应满足:

  • (自反性)A=A
  • (对称性)如果 A=B 那么 B=A
  • (传递性)如果 A=B, B=C 那么 A=C
  • ([莱布尼茨]替换性)对任何命题 P 中,如果其中涉及对象 A, 那么将其替换成 B 后仍然成立。

.

要着重说明的是,“等于”是一个非常重要的关系,因此数理逻辑事先实现了这个关系的抽象接口,以及提供了 "=" 语法符号,其他具体的等于关系(比如自然数之间的相等,集合之间的相等,函数之间的相等,集合基数之间的相等)必须继承这个接口并满足以上公理,它们是根据人们对事物相等的直觉而定义出来的,比如逻辑等价 <-> 也符合该公理,不依赖于其他更基础命题,这主要是远古哲学家的开源贡献,比如亚里士多德,莱布尼茨。

"等于“ 为什么重要的一些扩展理解

等于关系它决定了对象之间的差异,而“分析”实际就是从原本混沌或者模糊的大概念里通过差异去分类,得到更精细的小概念,再研究概念之间的关系,比如建立这些新的小概念和当前已经熟悉的概念之间的关系,新概念之间的关系等等,然后可以对概念进行组合,这是一种还原论的思想。“分类”是理性的核心,比如柏拉图对理念的分类;亚里士多德、康德、黑格尔对范畴的分类,马克思把商品的价值分为使用价值和价值;混沌初开,”一生二,二生三,三生万物“;生物学界门纲目科属种的划分;”物以类聚,人以群分”;训练神经网络进行分类;人从手脚不协调、五音不全慢慢学会舞蹈、唱歌、吹笛子、吉他、体操、用小拇指精准按 ctrl 和 ESC 键 等等,实际是学会了对不同肌肉的分类控制,这要求解耦对不同肌肉的控制神经通道,当然这也要求对不同对象的感知或认知上的分类能力,比如对音高的分类,对和弦音色的分类,对动作不同含意的理解。

这条要求实际对开发者提出了两个方面的约束:

  • 如果新定义了一种等于关系,那么先要保证前面三条性质,因为这只和等于关系以及你事先定义好的对象有关,比如 python 里定义了一个新的类后,需要实现 __eq__ 类才能使用上它预提供的 == 符号来进行等于判断,在 __eq__ 中实现的等于关系要满足前三条性质:

    class Bag:
        def __init__(self, *args):
            self.content = list(args)
    
        def __eq__(self, other):
            a = all([x in other.content for x in self.content])
            b = all([x in self.content for x in other.content])
            return a and b
    
    b1 = Bag(1,2,3)
    b2 = Bag(3,2,1)
    b3 = Bag(3,1,2)
    print(b1 == b1)
    print(b1 == b2)
    print(b1 == b2, b2==b3, b1==b3)
    
    True
    True
    True True True
    

    如果把 __eq__ 里写成:

    return self.content == other.content
    

    那么也符合前三条性质,因为它直接基于了内置的 list 之间的 == 操作,而该操作本身设计上就符合前三条性质(所以如果基于已经满足等于性质的函数去实现自定义函数,那么自定义函数也自动满足等于性质),但该等于关系要求集合元素有一定的顺序性,不符合集合的性质。

  • 之后定义的所有的可以作用在新对象上的函数(或命题)F,都需要保证:如果调用 F(A,*args) 返回对象 x, 且 A=B, 那么 F(B,*args) 也必须返回 x, 如果你实现了如下函数:

    def get_first(b: Bag):
        return b.content[0]
    
    get_first(b1) == get_first(b2)
    
    False
    

    它作用在相等的对象 b1 和 b2 上返回了不同的结果,意味着 get_first 函数和 Bag 类型是不兼容的,这属于 bug 而非特性。

    在数学上,集合”的第一个元素“概念就不是定义明确或良好的,该操作不能作用于集合, 这需要你重新检查等于关系以及 get_first 的定义是否符合需求且兼容。

3 集合论

欧几里得几何是五条公理规则,而这里介绍的集合论有 12 条公理。

基础知识

公理 3.1: 集合是对象

如果 A 是一个集合,那么 A 也是一个对象。特别地,给定两个集合 A 和 B,问 A 是不是 B 中的元素是有意义的。

这条公理看上去好像没说什么,但实际却说了很多:

  • 引入了集合论中最重要的关系 "属于": 当可以问某个对象是否是 B 中的元素时,这就意味着一个逻辑谓词在语法上被定义出来了,而且这个逻辑谓词是有两个参数的,后文用 In 来表示,In(a,X) 意思是 a 在集合 X 中。这条公理这就像是在 C++ 里声明了以下函数:

    bool In(a, X);
    

    尽管还没有具体实现它,但至少这个函数的名称,参数数量,返回类型都已经确定了。

  • 同时它对还说明 In(a,X) 中 a 和 X 都可以是集合类型的

    这是理所当然的吗?并不是,比如 python 里集合就不能包括集合

    set([set([1])])
    
    
    TypeErrorTraceback (most recent call last)
    <ipython-input-1-0761b1a34cb1> in <module>
    ----> 1 set([set([1])])
    
    TypeError: unhashable type: 'set'
    

定义 3.1.4: 集合相等的定义

定义集合 A = B,当且仅当 A 中的任一元素 x 属于 B,同时 B 中的任一元素 y 也属于 A。

从语法上看: A=B 的定义是 In(x,A)<->In(x,B), 我们不用去理解 In(x,A) 是什么意思,只从符号形式上看,A=B 完全规约成了 _A<->_B ,这里下划线只是一种形式装饰,它可以是任何同时对 A,B 两个符号的修饰,比如 A|Z,B|Z 或者 some(x,y,z,A), some(x,y,z,B), 只要它是符合数理逻辑中构造命题的语法规则。 任何对 A=B 关系的谈论,在形式上就是先对 A,B 添加一个点缀,变成 In(x,A) 和 In(x,B) 形式,然后规约成这两个修饰后的 A,B 符号所指代的命题的逻辑等价,而逻辑等价符合自反、对称和传递性:

练习 3.1.1: 集合相等关系的自反、对称和传递性

  • 自反性: In(x, A) <-> In(x,A),这是重言式,始终为真
  • 对称性:即如果集合 A=B 则 B=A, A=B 的描述是: In(x,A)<->I(x,B) 根据逻辑等价关系的性质,交换顺序也是真命题: In(x,B)<->I(x,A), 因此 B=A
  • 传递性,即如果集合 A=B,B=C 则 A=C,同样,将其逻辑描述写出来后,逻辑等价是传递性决定了集合等价的传递性。

    这些证明看上去是乏味的,原因在于目前只是把集合的等于关系 "翻译" 到逻辑语言中的,"属于"关系的等价性上。

类似地,"属于"关系也会符合"等于"的替换公理的,也就是如果 A=B, 且 In(x,A) 为真, 那么 In(x,B) 为真, 因为 A=B 意味着可以得到字符串 In(x,A)<->In(x,B), 更具 <-> 关系的语义,如果其中一个为真,另一个也为真。

这里完全是通过符号变换的合法性把逻辑中的语义注入到了新的集合对象相等中。

到目前为止,集合可能还是一个类似黑洞的对象,所有东西都可以属于任何集合,那么所有集合都相等。因此需要描述更多性质,使得它慢慢更接近直觉上的篮子或袋子,但又更加通用和精确,并且可以包含无限多对象。

公理 3.2: 空集的定义

存在一个集合 E, 任何对象都不属于该集合

逻辑上写成:

Empty(E)<->A(x)[not In(x,E)]

这里 Empty 是一个谓词,A(x) 是 \( \forall x \) ,这表明,In(x,E) 恒为 False 。

空集是唯一的,因为如果存在另一个空集 F 也不包括任何对象,那么以下式子是恒真的:

In(x, E)<->In(x,F)
=> False <-> False
=> True

以上 => 表示箭头后的逻辑命题则可以由上一行推导出来。

引理 3.1.6: 单个选取

设 A 是一个非空集合,那么存在一个对象 x 使得 In(x, A) 为真。

因为:

Empty(E)<->A(x)[not In(x,E)]
=> not Empty(E)<->E(x)[In(x,E)] # 对 <-> 两边加上 not 还是等价

这表明如果某个集合不是空集,等价于其中至少有一个元素可选。但可以说地更具体一些,比如有些集合只能选出唯一个元素,有些可以选择两个:

公理 3.3: 单元素集与双元素集

如果 a 是一个对象,那么存在单元素集 {a} ,它满足对于任意一个对象 y,In(y,{a})<->y=a;

更进一步,如果 a,b 都是对象,那么存在双元素集 {a,b}, 它满足对任意一个对象 y,In(y,{a,b})<->(y=a)|(y=b); 这里 | 表示逻辑连接词 “或”

.

根据集合相等定义 3.1.4, 对任意对象 a, 单元素集合 {a} 是唯一的。

因为如果存在另一个集合 F 也是 a 的单元素集合,那么

In(y,F)<->(y=a)<->In(y,{a})
=> In(y,F)<->In(y,{a})
=> F={a} #根据集合相等定义

用类似的方式可以知道,对任意对象 a,b, 双元素集合 {a,b} 是唯一的。

因为如果存在另一个集合 F 也是 a,b 的单元素集合,那么

In(y,F)<->(y=a)|(y=b)<->In(y,{a,b})
=> In(y,F)<->In(y,{a,b})
=> F={a,b} #根据集合相等定义

注意双元素集合并不是一定是两个不同元素的集合,例如 {a,a} 可以看作是双元素集合,尽管它等价于 {a}, 因为

In(y,{a,a})<->(y=a)|(y=a)<->(y=a)
=>In(y,{a})<->In(y,{a,a}) # 因为 In(y,{a})<->y=a;
=>{a}={a,a} #根据集合相等定义

因此单元素集可以从双元素集推导出,比如定义 {a,a} 是单元素集,但没必要这么引入这种麻烦的记号。

练习 3.1.2: 空集 E 和 {E},{{E}},{E,{E}} 两两互不相同

  • E 和 {E} 不同:因为 In(E,{E}) 为真, 但由于空集不包括任何元素,因此 In(E,E) 是恒为假的,于是二者相等的逻辑表征命题为假:

    In(E,E)<->In(E,{E}) # False
    
  • 同理可以说明 E 和 {{E}} 不同,E 和 {E,{E}} 不同
  • {E} 和 {{E}} 不同,因为:

    In(y,{E})<->y=E
    In(y,{{E}})<->y={E}
    

    由于刚证明 E 和 {E} 不同,所以 In(y,{E}) 无法等价到 In(y,{{E}})

  • {{E}} 和 {E,{E}} 不同,因为:

    In(y,{{E}})<->y={E}
    In(y,{E,{E}})<->y={E}|y=E
    

    由于前面证明 {E} 不等于 E, 所以 y={E}|y=E 和 y={E} 不等价,因此属于关系 In(y,{{E}}) 不能等价到 In(y,{E,{E}})

公理 3.4: 两集合并集

给定任意两个集合 A, B, 可以构造出一个集合 A|B, 称为它们的并集,它满足: In(x,A|B)<->In(x,A)|In(x,B)

这里 A|B 中的 | 重载了逻辑命题里的 p|q, 前者是集合的或,后者是逻辑命题的或。

.

  • 该供公理类似于 Peano 公理中定义的 ++ 运算,可以创造更多的集合
  • 集合的并操作完全建立在逻辑或运算上,因此符合的等于关系的替换公理,即如果 A=C,则 A|B=C|B, 因为:

    A=C<->(In(x,A)<->In(x,C))
    In(x,A|B)<->In(x,A)|In(x,B)
    In(x,C|B)<->In(x,C)|In(x,B)<->In(x,A)|In(x,B)<->In(x,A|B)
    =>(C|B)=(A|B)
    

    所以集合并和逻辑或在各自对象上的性质很相似,用 | 重载了逻辑 | 运算,python 中默认也是用 | 表示并运算:

    print(set({1,2,3})|set({2,3,4}))
    
    {1, 2, 3, 4}
    

引理 3.1.13: 并集的性质

  1. {a,b}={a}|{b}
  2. A,B,C 都是集合,那么 A|B=B|A
  3. A,B,C 都是集合,那么 (A|B)|C=A|(B|C)
  4. 记空集为 E, 用 | 表示集合的并, 那么 A | A = A | E = E | A = A。

.

对于第一条,它表明只定义单元素集合以及公理 3.4 也可以推出双元素集合,比如 {a} 和 {b} 的并是 {a}|{b}, 根据定义有:

In(x,{a}|{b}) <-> In(x,{a})|In(x,{b})
=> In(x,{a})|In(x,{b})<->(x=a)|(x=b) #单元素集合定义
=> In(x,{a})|In(x,{b})<->In(x, {a,b}) #双元素集合定义
=> In(x,{a}|{b})<->In(x, {a,b}) #双元素集合定义

第二和第三条完全是把集合的或的交换律和结合律规约到命题的或的结合律和交换律上,不具体展开。

第四条证明见以下练习

练习 3.1.3: 空集和自身的并集证明

记空集为 E, 用 | 表示集合的并, 那么 A | A = A | E = E | A = A。

.

  • 证明 A|A=A : 对象 x 属于 A|A 等价于 In(x,A)|In(x,A), 而 p|p 等价于 p, 因此这等价于 In(x,A), 根据集合相等定义,可知 A|A=A
  • 证明 A|E = A: 对象 x 属于 A|E 等价于 In(x,A)|In(x,E) 为真,但 x 属于空集一定是假,p|False 要为真 , p 必须为真,因此 In(x,A) 为真,因此 A|E = A
  • 根据 | 的交换律,可以证明 E|A=A|E, 因此 E|A=A

定义 3.1.15: 子集

定义子集关系,A 是 B 的子集等价于 A 中所有元素都是 B 的元素,如果 A 是 B 子集,且 A 不等于 B, 那么 A 是 B 的真子集。

.

后文用以下方式表示:

Subeq(A, B)<->A(x)(In(x,A)->In(x,B))

A 是 B 的真子集,则用 Sub(A,B) 表示。

Sub(A, B)<->(A!=B) & A(x)(In(x,A)->In(x,B))

由于 A(x)(In(x,A)->In(x,B)) 中只依赖于 In 这个谓词,而 In 满足替换性质,因此 Subeq 也满足。

真子集关系只比子集关系多一个 A!=B 关系并用 & 连词连接,A!=B 实际是 not A=B 或者 ~(A=B), 由于 ~, & 是逻辑连接词,它们本身就是满足逻辑等价公理,因此 Sub 满足替换性质。

因此子集和真子集关系均满足等于公理

对于空集 E, In(x,E) 恒为 False, 而命题 Fasle->p 无论 p 为还是假,都是真的,因此 Sebeq(E, B) 对所有集合 B 都成立。并且由于 In(x,A) 蕴含自身,因此 Subeq(A,A) 对所有集合 A 都成立。

python 中判断子集方式:

print(set({1,2}).issubset(set({1,2,3})))
print(set({1,2,3}).issubset(set({1,2,3})))
True
True

命题 3.1.18: 包含关系使集合是偏序的

偏序关系指的是该关系满足传递性、反对称性。

一个关系是偏序的,说明并不是所有元素之间都有这重关系,但自然数上的 "小于等于关系" 是全序(total order)关系,因为任何两个自然数 x,y,要么 LessEq(x,y) 为真要么 LessEq(y,x) 为真, 但对于 Subeq 关系,有可能 Subeq(x,y) 和 Subeq(y,x) 都为假,比如 {a,b} 和 {a,c} 。

练习 3.1.4: 包含关系的相关证明

用 Subeq(A,B) 表示集合 A 是 B 的子集, Sub(A, B) 则表示 A 是 B 的真子集。

  • Subeq 的传递性:

    Subeq(A,B) 表明 In(x,A)->In(x,B), Sebeq(B,C) 表明 In(x,B)->In(x,C) 根据蕴含逻辑规则的属性, A->B, B->C 那么 A->C, 所以 In(x,A)->In(x,C), 因此 Subeq(A,C)

  • Subeq 的反对称性:

    Subeq(A,B) 表明 In(x,A)->In(x,B), Sebeq(B,A) 表明 In(x,B)->In(x,A) 而这就是 A=B 的定义。

  • Sub 的传递性:

    Sub(A,B) 表明 In(x,A)->In(x,B) 且 A!=B, Seb(B,C) 表明 In(x,B)->In(x,C) 且 B!=C, 因此这里有 Subeq(A,C), 我们要证明 A!=C, 由于不相等是没有传递性的,因此不能直接得到。可以用反证法,如果 A=C, 那么根据替换公理 Sub(C,A) 就成立了,而这意味着 C!=A, 导致矛盾,因此 A!=C.

以下 s1 不是 s2 子集,s2 也不是 s1 子集

s1,s2 = set({1,2,3}), set({2,3,4})

print(s1.issubset(s2), s2.issubset(s1))
False False

公理 3.5: 分离公理

允许构造这样一个集合: {In(x, A): P(x)}, 它表示从 A 中分离出另一个集合,其元素来源于集合 A 且符合 P 性质。也就是满足 In(x,A)&P(x) 的那些元素组成的集合。

{In(x, A): P(x)} 一定是 A 的子集,因为 In(x,A)&P(x) 蕴含了 In(x,A), 这就是把高层的翻译成更底层逻辑描述后的一个自然结果:

“x  {In(x, A): P(x)} 中”  意味着      “x  A 中”

--------------    逻辑描述接口      ----------------

In(x,A)&P(x)               蕴含        In(x,A)

同样,由于 In 和其他对集合合法的命题 P 都应满足等于公理,那么基于这些符号实现的“分离”操作也满足等于公理

并集是通过小集合构建大集合的方式,分离公理通过大的集合构建子集的方法。

有时候会用 {In(x,A)|P(x)} 表示经过 P 分离后的 A 的子集,注意这里继续重载了 | 符号,在最底层的逻辑语言里,它表示命题之间的或,在用户定义了集合并之后,它可以表示集合之间的并集,而用户定义了分离公理后,在 {} 的 context 下,它又表示一种 and 关系,用来从 A 中过滤 P(x) ,由于各种用法和作用对象的类型是不同的,因此并不会产生歧义。

根据该公理,可以继续定义交集和差集:

  • 定义交集 A&B 为 {In(x, A): In(x,B)}; 如果其结果是空集,那么称 A 和 B 不相交。

    根据这个定义,空集 E 和自身是不相交的,因为空集的底层表征 In(x, E) 恒为假,因此 In(x,E)&In(x,A) 对任何 A 为假,因此空集和任何集合都是不想交的,包括子集。这表明相等的集合不一定相交。

  • 定义差集 A-B 为 {In(x, A): not In(x,B)}

由于它们都是基于满足等于公理的底层符号实现的,因此同样满足等于公理

python 中的 comprehsion 操作与这种数学定义保持了一定程度上的一致:

print({x for x in range(10) if x<5})
{0, 1, 2, 3, 4}

练习 3.1.5: 包含与交并集的关系

设 A 和 B 是集合,证明命题 Subeq(A, B)、A|B = B 和 A&B = A 三者在逻辑上是等价的

要说明逻辑等价,那么先翻译成逻辑语言:

A(x)[In(x, A)->In(x, B)] # Subeq(A, B)
A(x)[In(x, A|B)<->In(x, B)] # (A|B)=B
A(x)[In(x, A&B)<->In(x, A)] # (A&B)=A

可以把 A(x) 量词拿掉,相当于常说的:给定任意 x, 证明以下三者等价

In(x, A)->In(x, B) # Subeq(A, B)
In(x, A|B)<->In(x, B) # (A|B)=B
In(x, A&B)<->In(x, A) # (A&B)=A
  • A|B=B 继续拆成:

    In(x, A|B)->In(x, B) & In(x, A|B)<-In(x, B)
    => (In(x, A)|In(x, B))->In(x, B) & (In(x, A)|In(x, B))<-In(x, B)
    

    后者逻辑上恒为真,因此它等价于 (In(x, A)|In(x, B))->In(x, B)

  • 同理, A&B=A 拆成:

    In(x, A&B)->In(x, A) 以及 In(x, A&B)<-In(x, A)
    => (In(x, A)&In(x, B))->In(x, B) & (In(x, A)&In(x, B))<-In(x, B)
    

    前者其逻辑上恒为真,因此它等价于 (In(x, A)&In(x, B))<-In(x, B)

  • 定义 p 为 In(x,A), q 为 In(x,B), 那么我们说明的是 p->q, p->(p&q) 以及 (p|q)->q 是等价的。一种做法是列出真值表,另一种是把 p->q 写成等价的 ~p|q. 那么:
    • p->(p&q) 等价于 ~p|(p&q), 根据分配律等价于 (~p|p)&(~p|q) 等价于 ~p|q
    • (p|q)->q 等价于 ~(p|q)|q, 根据德摩根以及分配律这等价于 (~p|q)&(~q|q) 等价于 ~p|q
  • 因此三个关系在逻辑展开层面都是等价的。

命题 3.1.28: 集合构成布尔代数

以上这些公理的目标实际就是提供 布尔代数接口,这和 python 的实现是非常相似的,我们使用其中 set() 对象,主要就是为了能够保存对象,查找对象(In),进行交并补运算:

a = set([1,2])
b = set([2,3,4])
print(1 in a)
print(a|b)
print(a&b)
print(b-a)
True
{1, 2, 3, 4}
{2}
{3, 4}

集合 符号 & 和 | 在逻辑上是与和或,在集合上都被"重载"了,表示集合的与和并,但它们内涵实际很像,这也是为什么本节叫作集合的布尔代数而非集合代数,因此证明这些性质基本就是把集合上的 &, | 翻译成逻辑上的 &,| 然后再用逻辑语言描述一遍。

练习 3.1.6: 集合构成布尔代数证明

设 A、B、C 都是集合,令 X 表示包含 A、B、C 作为其子集的集合。那么有:

  • (a) A|E=A 以及 A&E=E
    • In(x, A|E) 表示 In(x, A)|In(x,E), 而 In(x,E) 恒为 False, 因此 In(x, A)|In(x,E) 逻辑上等价于 In(x,A), 后者就是表示 x 在集合 A 中,反过来类似。因此 A|E=A
    • In(x, A&E) 表示 In(x, A)&In(x,E), 而 In(x,E) 恒为 False, 因此 In(x, A)&In(x,E) 逻辑上等价于 In(x,E), 后者对应了空集,反过来 In(x,E)->In(x,A&E) 是空推断。因此 A&E=E.
  • (b) A|X=X, A&X=A
    • A|X 定义为其元素 x 满足 In(x, A|X) 为真, 它等价于 In(x, A)|In(x, X), 而由于 A 是 X 的子集,因此 In(x,A)->In(x,X), 因此不论 x 属于 A 还是属于 X 都能推出它属于 X 的。

      反过来如果 In(x,X) 为真 那么根据逻辑 or 运算性质,In(x, A)|In(x, X) 为真。 因此 A|X=X 。

    • A&X 定义为其元素 x 满足 In(x, A&X) 为真, 它等价于 In(x, A)&In(x, X), 其逻辑上能推导出 In(x,A) 为真。

      反过来,如果 In(x,A) 为真,由于 A 是 X 的子集表明 In(x,A)->In(x,X) 为真, In(x,A)&In(x,X) 为真,根据交集的定义 In(x,A&X) 也为真。因此 A&X=A 。

  • (c) A|A=A, A&A=A
    • A|A 定义为其元素 x 满足 In(x, A|A) 为真, 继而等价于 In(x, A)|In(x, A), 由于逻辑中 ((p|p)<->p), 因此这等价于 In(x,A), 因此 A|A=A
    • A&A 定义为其元素 x 满足 In(x, A&A) 为真, 继而等价于 In(x, A)&In(x, A), 由于逻辑中 ((p&p)<->p), 因此这等价于 In(x,A), . 因此 A&A=A
  • (d) 交换律: A|B=B|A, A&B=B&A
    • A|B 定义为其元素 x 满足 In(x, A|B) 为真, 继而等价于 In(x, A)|In(x, B), 由于逻辑中 ((p|q)<->(q|p)), 因此这等价于 In(x,B)|In(x,A). 因此 A|B=B|A
    • A&B 定义为其元素 x 满足 In(x, A&B) 为真, 继而等价于 In(x, A)&In(x, B), 由于逻辑中 ((p&q)<->(q&p)), 因此这等价于 In(x,B)&In(x,A). 因此 A&B=B&A
  • (e) 结合律: (A|B)|C=A|(B|C), (A&B)&C=A&(B&C)
    • (A|B)|C 定义为其元素 x 满足 (In(x, A)|In(x, B))|In(x,C), 逻辑上等价于 In(x, A)|(In(x, B)|In(x,C)). 因此 (A|B)|C=A|(B|C)
    • (A&B)&C 定义为其元素 x 满足 (In(x, A)&In(x, B))&In(x,C), 逻辑上等价于 In(x, A)&(In(x, B)&In(x,C)). 因此 (A&B)&C=A&(B|C)
  • (f) 分配律: A&(B|C) = (A&B)|(A&C), A|(B&C)=(A|B)&(A|C)
    • A&(B|C) 定义为其元素 x 满足 In(x, A)&(In(x, B)|In(x,C)), 逻辑上, p&(q|r) 真值等价于 (p&q)|(p|r), 因此这等价于 (In(x, A)&(In(x, B))|(In(x, A)&In(x,C)), 也就是 (A&B)|(A&C) 的定义。
    • A|(B&C) 定义为其元素 x 满足 In(x, A)|(In(x, B)&In(x,C)), 逻辑上, p|(q&r) 真值等价于 (p|q)&(p&r), 因此这等价于 (In(x, A)|(In(x, B))&(In(x, A)|In(x,C)), 也就是 (A|B)&(A|C) 的定义。
  • (g) A|(X-A)=X, A&(X-A)=E
    • A|(X-A) 定义为其元素 x 满足 In(x, A)|(In(x, X)&~In(x,A)), 也就是 p|(q&~p) 的形式,根据逻辑上的分配关系,这等价于 (p|q)&(p|~p), 而后者恒为真,因此等价于 p|q, 所以相当于元素 x 满足 In(x, A)|In(x, X), 这是 A|X 的定义,根据 (b) 可知它等于 X
    • A&(X-A) 定义为其元素 x 满足 In(x, A)&(In(x, X)&~In(x,A)), 也就是 p&(q&~p) 的形式,这是一个恒为假的命题,只有(唯一的)空集的定义是 In(x,E) 恒为假
  • (h) De Morgan 定律: X-(A|B)=(X-A)&(X-B), X-(A&B)=(X-A)|(X-B)
    • X-(A|B) 定义为其元素 x 满足 In(x, X)&~(In(x, A)|In(x,B)), 也就是 p&~(q|r) 的形式,根据逻辑上的德摩根定律,~(q|r) 等价于 ~q&~r, p&~(q&r) 等价于 p&~q&~r. 等价于 (p&~q)&(p&~r), 它对应的是 (X-A)&(X-B) 的定义
    • X-(A&B) 定义为其元素 x 满足 In(x, X)&~(In(x, A)&In(x,B)), 也就是 p&~(q&r) 的形式,根据逻辑上的德摩根定律,~(q&r) 等价于 ~q|~r, p&~(q&r) 等价于 p&(~q|~r). 根据逻辑上 or 和 and 的分配率,它等价于 (p&~q)|(p&~r), 它对应的是 (X-A)|(X-B) 的定义

这里充分反应出集合论和基本的命题逻辑运算的同构性,所以集合的这些关系基本就是把集合以及集合所在元素套到 In(x,A) 关系里,然后用命题逻辑里的 | & -> 重新复述一遍。

练习 3.1.7: 子集和交并集的关系

这是 3.1.5 的延续,继续证明交并集合的包含关系,实际有六条,也都是对偶性质的, 证明时把集合语言翻译成底层的命题语言

  • Subeq(A&B, A):根据定义 A&B 意味着 In(x,A)&In(x,B) 为真,逻辑上能够蕴含 In(x,A), 也就是 In(x,A)&In(x,B)->In(x,A) 为真,这就是 Subeq(A&B, A)的定义。
  • Subeq(A&B, B):根据定义 A&B 意味着 In(x,A)&In(x,B) 为真,逻辑上能够蕴含 In(x,B), 也就是 In(x,A)&In(x,B)->In(x,B) 为真,这就是 Subeq(A&B, B)的定义。
  • Subeq(C, A&B) :Subeq(C, A)&Subeq(C, B) 定义为元素 x 满足 (In(x,C)->In(x,A))&(In(x,C)->In(x,B)), 也就是 (p->q)&(p->r) 形式,由于 p->q 等价于 ~p|q, 因此 (p->q)&(p->r) 可以写成 (~p|q)&(~p|r), 这其实是对 ~p|(q&r) 的分配展开结果,而 ~p|(q&r) 又等价于 p->(q&r), 也就是 In(x,C)->In(x,A)&In(x,B), 根据交集的定义,In(x,A)&In(x,B) 等价于 In(x,A&B), 因此最终 x 满足 In(x,C)->In(x,A&B), 而这是 Subeq(C, A&B) 的定义。

    因此 Subeq(C, A)&Subeq(C, B) 当且仅当 Subeq(C, A&B)

  • Subeq(A, A|B):根据定义 A|B 意味着 In(x,A)|In(x,B) 为真,In(x,A) 逻辑上能够蕴含该命题, 也就是 In(x,A)->In(x,A)|In(x,B) 为真,这就是 Subeq(A, A|B)的定义。
  • Subeq(B, A|B):根据定义 A|B 意味着 In(x,A)|In(x,B) 为真,In(x,B) 逻辑上能够蕴含该命题, 也就是 In(x,B)->In(x,A)|In(x,B) 为真,这就是 Subeq(B, A|B)的定义。
  • Subeq(A, C)&Subeq(B, C) 定义为元素 x 满足 (In(x,A)->In(x,C))&(In(x,B)->In(x,C)), 也就是 (p->r)&(q->r) 形式,由于 p->q 等价于 ~p|q, 因此 (p->r)&(q->r) 可以写成 (~p|r)&(~q|r), 这其实是对 (~p&~q)|r 的分配展开结果,而它又等价于 ~(p|q)|r, 继而等基于 (p|q)->r, 也就是 (In(x,A)|I(x,B))->In(x,C), 根据并集的定义,In(x,A)|In(x,B) 等价于 In(x,A|B), 因此最终 x 满足 In(x,A|B)->In(x,C), 而这是 Subeq(A|B, C) 的定义。

    因此 Subeq(A, C)&Subeq(B, C) 当且仅当 Subeq(A|B, C)

练习 3.1.8: 吸收律

assert A & (A | B) == A
assert A | (A & B) == (A & B) | A == A
  • 由于 3.1.7 中证明 A 是 A|B 的子集,根据命题 3.1.28 (b) 中 A&X=A 可知 A&(A|B)=A
  • 由于 3.1.7 中证明 A&B 是 A 的子集,根据命题 3.1.28(e)的交换律以及 (f) 中 A|X=X 可知: A|(A&B)=(A&B)|A=A

练习 3.1.9: 互补集合的关系

假如 A|B=X, A&B=E, 那么 A=X-B, B=X-A, 这里体现了两个互补集合的关系。

注意在命题 3.1.28 (g) 中有 A|(X-A)=X, A&(X-A)=E, 如果把 X-A 替换成 B 就很接近。 但这只能说明给定 B=X-A 能够得到 A|B=X, A&B=E, 而本题是证明其反方向。

根据命题 3.1.28 (h) 中,我们有:

X-(A|B)=(X-A)&(X-B), X-(A&B)=(X-A)|(X-B)

但把本题的前提代入,只能得到 (X-A)&(X-B)=E, (X-A)|(X-B)=X, 这看上去和前提是对偶的, 但同样无法直接说明 A=X-B.

因此还是要编译到逻辑语言层面来论述:

  • 定义 p,q,r 分别为 In(x,A), In(x,B), In(x,X)
  • A&B=E 意味着 In(x,A)&In(x,B) 恒为假,后者写成 p&q ,那么 ~(p&q) 为真,也就是 ~p|~q 为真,等价于 p->~q, 即 In(x,A)->~In(x,B).
  • 另一方面,根据练习 3.1.7, A 是 A|B 的子集,而 A|B=X, 这说明 A 是 X 的子集, 所以有 In(x,A)->In(x,X), 结合 In(x,A)->~In(x,B), 就得到如果 x 在集合 A 中, 那么 x 在 X 且 x 不在 B 中,后者是 X-B 的定义,因此 In(x,A)->In(x,X-B)
  • 前文提到,根据命题 3.1.28 可以有 (X-A)&(X-B)=E, (X-A)|(X-B)=X, 那么套用以上两个步骤相同的思路,可以得到 In(x,X-B)->In(x,X-(X-A))

    而 X-(X-A) 根据定义可以写成 r&~(r&~p) 的形式,等价于 r&(~r|p) 等价于 r&p, 由于 A 是 X 的子集,那么 p->r, 等价于 ~p|r, 结合 r&p,真值表上等价于 p, 因此 X-(X-A)=A

    所以有 In(x,X-B)->In(x,A), 于是我们有等价关系 In(x,A)<->In(x,X-B) 这是 A=X-B 的定义。

  • 同理,把 A B 互换可以证明 B=X-A

练习 3.1.10: A-B, A&B, B-A 的关系

A-B, A&B, B-A 是互不相交,且它们的并集是 A|B

这里仍然是规约到命题逻辑:

  • 定义 p,q 为 In(x,A) 和 In(x, B)
  • 那么 A-B ,A&B, B-A 对应的命题是 p&(~q), p&q, q&(~p)
  • 它们两辆之间的并联关系: p&(~q)&p&q, p&(~q)&q&(~p) 和 p&q&q&(~p) 都是 False. 因此它们的并集都是空集,所以它们互不相交
  • 三个命题进行或运算,(p&(~q))|(p&q)|(q&(~p))
    • 一种做法是求真值表,可以看到它和 p|q 等价
    • 另一种是形式上化简,稍微复杂,但也能得到 p|q

公理 3.6: 集合替代公理

In(z, {y: P(x,y) & In(x, A)})<->E(x)[In(x, A)&P(x,z)]

{y: P(x,y) & In(x, A)} 是引入的一个新的构建集合的语法,其中 & 又重载了逻辑 & 和集合交 & 。

要求最多有一个 y 使得 P(x,y) 成立实际包含了函数的概念,函数本身可以用更基础的二元属性(谓词) P(x,y) 有了该公理,可以通过二元关系来构建更丰富的集合

替代公理本身可以当作分离公理使用,如果引入函数 f 的概念,替代公理的表达更简单,形式上直接可以和分离公理统一:

In(z, {f(x): In(x, A)&P(x)})<->E(x)[In(x, A)&z=f(x)]

这对应了 python 中的 comprehension:

# x*2 是 f(x) x in range(10) 是 In(x,A), x<5 是 P(x)
print({x*2 for x in range(10) if x<5})
{0, 2, 4, 6, 8}

练习 3.1.11: 替代公理推导出分离公理

将替代公理:

In(z, {y: P(x,y) & In(x, A)})<->E(x)[In(x, A)&P(x,z)]

的 P(x,y) 改成 (y=x)&P(x),P(x) 为分离公理中的过滤性命题,因此分离公理的逻辑描述就是:

E(x)[In(x, A)&(z=x)&P(x)]

该命题要成立的话,要满足 P(x) 并且 z 就是 x, 这就是分离公理的语义。

公理 3.7: 第一个无穷大集合 – 自然数集

存在一个包含所有自然数(用 Peano 公理所定义的)的集合,记为 N

它说明:

  • 存在一个包含无穷多个元素的集合。

    之前的并集公理还没有明确定义如何构造无穷集合,这里实际直接借用了 Peano 公理来构造无穷多个不同对象,并且说明某个集合是可以装下所有这些对象的。

  • 自然数是集合里的对象

    到现在为止,虽然不知道对象有哪些,但至少根据公理 3.1 和本条公理,我们知道,能放在集合里的对象有自然数和集合。

罗素悖论

公理 3.8: 危险的概括公理

A(x)[E(y)[In(x,y)<->P(x)]]

引出矛盾的方式:

如果 P(x) 替换为 ~In(x,x) 就有:

A(x)[E(y)[In(x,y)<->~In(x,x)]]

由于对 x 是全称,其中包括 y ,因此当把具体的这个集合 y 代入:

E(y)[In(y,y)<->~In(y,y)]

这是一个恒为假的矛盾命题。

练习 3.2.1: 概括公理可蕴含多个公理

  • 公理 3.8 蕴含公理 3.2, 只要设置 P(x) 恒为假,因此没有任何对象能在集合中,即构建了空集
  • 公理 3.8 蕴含公理 3.3,只要设置 P(x) 表示的是 x=a,可以构建一个只有对象 a 的集合 {a}

    对于双元素集合,设置 P(x) 为 x=a 或 x=b, 可以构建 {a,b}

  • 公理 3.8 蕴含公理 3.4,对于两个集合 A,B,P(x) 表示 In(x,A)|In(x,B) ,因此可以将两个集合并起来。
  • 公理 3.8 蕴含公理 3.5,此时对于集合 A, P(x)表示 In(x,A)&Q(x),这里 Q(x) 表示公理 3.5 中的性质 P(x)。
  • 公理 3.8 蕴含公理 3.6,此时对于集合 A, P(x) 表示 In(x,A)&Q(x,y) ,这里 Q(x,y) 对应公理 3.6 中的 P(x,y)
  • 公理 3.8 蕴含公理 3.7,这里 P(x) 表示 x 是满足 Peano 公理的对象。

公理 3.9: 正则公理

如果 A 是非空集合,那么 A 中至少存在一个元素 x,x 要么不是一个集合,要么 x 与 A 并不相交。

为避开罗素悖论,需要对公理进行约束,因此引出 Regularity,也可以称为正则公理

这条公理对于数学分析是没有必要的,因为数学里不会涉及到包含自己的集合,但对于逻辑的一致性是有必要的。

练习 3.2.2: 正则公理的反递归性质

正则公理说明集合不能包含自身(去除自引用)且两个集合不能互相引用

  • 正则公理说明集合不能包含自身(去除自引用)
    • 对于空集, ~In(E,E) 是恒为真的,因此空集不能包含自身
    • 对于非空集合,如果存在自引用,即 In(A,A), 那么根据公理 3.3, 存在一个集合 {A}, 但是 该集合不满足正则公理,因为其唯一元素 A 是集合且与其自身相交,因为它们都包括集合 A. 导致了矛盾
    • 所以 A 包含 A 是不可能的
  • 正则公理说明两个集合不能互相引用(去除互递归)
    • 如果 A B 都是集合,并且 A 和 B 互相引用
    • 那么根据公理 3.3 可以构造一个包含两个元素的集合 {A,B}, 对于其内部对象 A 它包含了 B, 因此 A 和 {A,B} 是相交的,同理 B 和 {A,B} 也相交,A,B 又都是集合,因此违法了正则公理,导致矛盾
    • 所以 A 包含 B, 同时 B 包含 A 是不可能的

练习 3.2.3: 概括公理的万有性质

概括公理等价于存在一个包含一切的集合

  • 如果概括公理成立,则只需要令 P(x)=True 就构造出一个包含一切对象的集合。
  • 如果存在包含所有对象的集合,那么根据分离公理就可以得到概括公理。

所以概括公理和"存在包含一切对象集合" 这个命题(或公理)是等价的

函数

定义 3.3.1: 函数

函数是论述集合 X, Y 以及二元谓词关系 P(x,y) 的性质进行定义的,X,Y,P 要满足以下要求

A(x)[In(x, X)->E(y)[In(y,Y)&P(x,y)]]
A(x)[In(x, X)-> ~(E(y1)E(y2)[In(y1,Y)&P(x,y1)&In(y2,Y)&P(x,y1)&~(y1=y2)])]

第二条是 y 的唯一性约束,有了唯一性约束,就可以定义函数 f(x)

y=f(x) <-> P(x,y)

.

X 和 Y 集合称为定义域 domain 和值域 range.

关于函数这里有几个为什么要回答:

  • 为什么要规定所有 X 中的元素都能通过函数映射出去?

    定义域中有些元素无法映射的函数称为偏函数,如果以这种看似更通用的性质来定义函数,在数学上会引入额外的麻烦, 比如经常要去对函数 f 和 x 进行合法性检查,偏函数在计算机里是常见的,因为可以用 None 作为返回值,用 assert 或 if 做类型检查, 而上层再用 try cache 之类的异常处理机制。而数学里更关心相同类型对象之间的关系,因此在这里函数就专门指全函数。

  • 为什么不规定所有 Y 中的元素都能够被函数映射到?

    这种函数被称为是满射函数,给定定义域 X 和函数 f, 要确定所有 X 中集合恰好能映射到的所有元素的集合并不简单, 因为有些函数可能非常复杂,这部分值得单独分析,因此为了简单性,不放在函数的一般定义中。

  • 为什么要规定每个 x 只能映射到唯一的元素?

    这类函数也存在,比如多值函数或者随机函数,它可以被 A(x)[In(x, X)->E(y)[In(y,Y)&P(x,y)]] 命题所刻画, 但它值实际分析中不够简单。

因此用一个解释来概括性回答以上三个问题:这是 “经验上经过打磨后的选择”,类似公理的选择。

尽管函数是一个抽象的定义,但它是满足等于公理的,即如果 x=x', 那么 f(x)=f(x'), 这是因为命题 P 是作用在对象 x 上的,它满足 x=x' 中 = 符号的等于公理,而唯一性约束使得 f(x)=f(x') 中 = 是满足等于公理的(如果 f 是多值函数,f(x)=f(x') 就不一定成立了,除非重载这个 = 符号为 x 可能映射的所有值的集合之间的比较,而非特定的元素 y 的比较), 除此之外 In(x,X) 和其他逻辑联结词都满足一般的逻辑等价关系。

定义 3.3.7: 函数的相等

两个函数 f,g 的相等,首先 domain 和 range 要一样,同时对于所有 domain 上元素,都有 f(x)=g(x)。

空函数是从 E->Y 的函数,对于任何集合 Y 只有唯一的空函数。

.

有了函数定义,开始考虑其性质,最基础的是相等

空函数 (empty function) 是 domain 为空集,range 为 Y 的函数,空函数 f 没有任何表达式,因为没有输入,不需要关心它是什么。

空函数的特别是,对于任何集合都有单独的一个空函数,不同的 range 有不同的空函数,然而相同的 range 下只有一个空函数。因为如果 range 为 Y 下有两个空函数 f 和 f',那么根据函数相等的定义,对于所有在 In(x,E)->f(x)=f'(x) 前提为假,是恒为真的空推断,因此所有从空集到某个特定集合 Y 的函数都相等。

练习 3.3.1(a): 函数相等符合等于公理

函数相等复合自反性、对称性、传递性和替换性质

  • 函数相等符合自反性: f=f
    • 根据函数定义,f 的 domain 和 range 与自身都相等,这来自于集合相等的自反性
    • 给定任意 x: f(x)=f(x), 这来自于对象相等的自反性
  • 函数相等符合对称性: f=g 则 g=f
    • 根据函数定义,g 和 f 的 domain 和 range 都相等,这来自于集合相等的对称性
    • 给定任意 x: f(x)=g(x) 等价于 g(x)=f(x), 这来自于对象相等的对称性
  • 函数相等符合传递性: f=g, g=h 则 f=h
    • 根据函数定义,f 和 g 的 domain 和 range 都相等,g 和 h 的 domain 和 range 都相等,根据集合相等关系的传递性, f 和 h 的 domain 和 range 都相等。
    • 给定任意 x: f(x)=g(x)=h(x), 因此 f(x)=h(x), 这来自于对象相等的传递性。

定义 3.3.10: 函数的复合

定义 g|f 为 g 和 f 函数的复合函数,即 (g|f)(x)=g(f(x))

g|f 要能够成功复合,需要满足: f 的值域与 g 的定义域是同一个集合。

.

本文用 g|f 来表示复合,因为更容易直接从标准键盘上输入,这个形式类似 linux 中对程序进行 pipe 操作,比如表示读取 a.txt 文件并且将结果输入到 wc 程序中统计字数和行数

cat a.txt | wc

但 linux pipe 是从左到右边,而 g|f 则是从右到左,即对于给定 x 先计算 f 再计算 g

练习 3.3.1(b): 函数复合符合等于公理中的替换性质

如果 f, f':X -> Y and g, g': Y -> Z 函数满足 f = f' and g = g', 那么 g|f = g'|f':

  • 根据前提 g|f 和 g'|f' 都是 X->Z 上的函数,因此 domain 和 range 都相等
  • 给定任意 x, 由于 f=f', 根据函数相等定义,f'(x)=f(x), 而根据函数的定义中映射的唯一性有:

    • g(f'(x)) = g(f(x))
    • g'(f'(x)) = g'(f(x))

    由于 g=g', 根据函数相等定义 g(f(x))=g'(f(x)), 从而以上两个式子中等式左右的对象都相等,因此有:

    • g|f = g'|f' = g|f' = g'f
  • 所以 g|f = g'|f'
  • 引理 3.3.12: 复合是可结合的

    复合操作是可以结合的: f|(g|h) 等价于 (f|g)|h ,但复合不符合交换律,也就是 f|g 不一定等于 g|f 。

    证明方式是检查两个复合函数的定义域和值域并按复合定义展开。

    但复合不可交换,比如先加 1 再翻倍得到 (x+1)*2, 而先翻倍再加 1 则是 2x+1

定义 3.3.14/17/20: 单射、满射和双射

根据谓词 P 的性质分出几类重要的函数:

  • one-to-one(injective): P(x,y)&P(x',y)->x=x', 或者说,如果 x!=x', 那么 f(x)!=f(x')
  • on-to(surjective): A(y)E(x)P(x,y), 或者说:对任意 y 都存在一个 x 使得 f(x)=y
  • bijective(invertible): 以上两者同时成立,那么从 X 到 Y 集合元素之间建立的一一映射,f 就存在逆,记为 ~f

.

定义函数的时候只是要求 P(x,y) 满足 y 的唯一性,但这里则根据 P 的性质继续细分,从信息角度来看:

  • 单射意味着映射前后的信息是不会丢失的,因为定义域中不同的元素 x1 和 x2 在映射中不会发生碰撞,每个都有自己的唯一的编码后的对象。而如果有碰撞,假设 x1,x2 都映射到 y,x1 和 x2 之间差异信息在映射后就被抹平了。
  • 满射意味着值域的恰好覆盖性,由于函数本身的性质,所有定义域的值都能映射在值域中, 这意味着我们定义值域的时候要足够宽泛才能覆盖,但由于函数的复杂性,要精确划定所有映射的范围不是简单的, 而如果函数满射,意味着我们对该映射的信息范围有精确的认知。(先射击后画靶成为可能)

后文把这这类性质叫作:映射性质

练习 3.3.2: 复合函数的映射性质

函数 f : X -> Y 和 g : Y -> Z ,它们的复合是 g|f: X->Z

  • 如果 f 和 g 都是单射,那么 g|f 是单射:

    假设 x 和 x' 是 X 集合里的元素,根据 f 的单射定义: 如果 x!=x', 那么 f(x)!=f(x'), 且它们都属于集合 Y, 再根据 g 的单射定义有 g(f(x))!=g(f(x')), 因此 g|f 是单射

  • 如果 f 和 g 都是满射,那么 g|f 是满射:

    对于任意 Z 集合中的元素 z ,根据 g 的满射定义:Y 集合存在一个元素 y,满足 g(y)=z, 根据 f 的满射定义,X 集合中存在一个元素 x, 满足 f(x)=y, 合起来就是 z=g(f(x))=(g|f)(x), 因此 g|f 是满射。

以上两个性质蕴含了如果 f 和 g 都是双射,那么 g|f 是双射

练习 3.3.3: 空函数的映射性质

空函数始终是单射的,如果空函数的值域也是空集,那么它是满射,同时是双射

对于空函数 f: E->Y,

  • 单射对应的是逻辑命题 x!=x'->f(x)!=f(x') 为真,由于空函数定义域为空,找不到 x 和 x' 元素,因此这是一个恒为真的空推断。所以空函数为单射
  • 满射的定义是 In(y,Y)->E(x)P(x,y)

    由于空集里的存在性命题恒为假,因此 E(x)P(x,y) 恒为假,要保证 p->False 为真, p 就必须为假,而 In(y,Y) 恒为假意味着 Y 是空集,因此只有值域是空集的空函数是满射。

  • 当 Y 是空集的时候,空函数也是双射了。

练习 3.3.4: 函数复合的消去律

f:X->Y, f':X ->Y, g:Y ->Z, and g':Y -> Z 都是函数

  • 如果 g|f=g|f' 并且 g 是单射,那么 f=f'

    用反证法:如果 f!=f', 那么存在一个 x 使得 f(x)!=f'(x), 这两个都是 Y 中的元素, 由于 g 是单射,那么 g(f(x))!=g(f'(x)), 所以 (g|f)!=(g|f') 与前提矛盾了。所以 f=f' 。

    直觉解释是,如果第二阶段的映射不是单射,比如输入 y1,y2 都输出 z, 那么对同一个 x, f 可以映射到 y1, f' 映射到 y2 从而保证 g|f 和 g|f' 还是相等。更极端的例子是 g 是一个常数函数: g(y)=1, 那么 f 和 f' 可以是任意不相同的函数。

  • 如果 g|f=g'|f 并且 f 是满射,那么 g=g'

    用反证法: 如果 g!=g',那么说明存在一个 Y 集合里的元素 y, g(y)!=g'(y),f 是 满射意味着,元素 y 有一个 X 集中的对应元素 x 满足 y = f(x). 这说明存在一个元素 x, 使得 g(f(x))!=g'(f(x)), 与前提矛盾。因此 g=g'

    如果 f 不是满射呢?这意味着复合映射中间阶段的 Y 集合有些元素可以没有对应的 x, 那么 g 和 g' 可以只是部分相同的函数,比如 g(y)=y 和 g'(y)=|y|, 对于 g(y), 输入小于 0 的部分没有对应的 x

练习 3.3.5: 复合函数映射性质到子函数映射性质

  • 如果 g|f 是单射,那么 f 也是单射
  • 如果 g|f 是满射,那么 g 也是满射

.

f : X -> Y and g : Y -> Z 都是函数.

  • 如果 g|f 是单射,那么 f 也是单射吗?

    是的,用反证法,如果 f 不是单射,意味着存在两个不同的元素 x!=x' 经过 f 映射后结果相同 f(x)=f(x'), 那么再经过 g 映射, g(f(x))=g(f(x')), 这与 g|f 是单射矛盾。

  • 如果 g|f 是单射,是否 g 也要是单射?

    g 不需要是单射,因为经过 f 的映射,输入 g 的元素可以不用完全覆盖集合 Y.

    比如假设 g(1)=1 且 g(2)=1, 那么 g 就不是单射,但 f(x)=1 且 X={1}, 这样 y=2 永远不会取到,因此 g|f 变成了从 {1} 到 {1} 的单射。

  • 如果 g|f 是满射,那么 g 也是满射吗?

    是的,用反证法,如果 g 不是满射,那么存在一个集合 Z 里的元素 z 它没有对应的 y 使得 g(y)=z, 从而也不会有对应的 X 中的元素 x 使得 z=g(f(x)), 这与 g|f 是满射矛盾。

  • 如果 g|f 是满射,那么 f 也是满射吗?

    f 不需要是满射,比如 f(x)=1, 集合 Y={1,2} 而 g(y)=1, 集合 Z={1}.

练习 3.3.6: 双射函数的逆

f : X -> Y 是双射函数, 其逆记为 ~f: Y -> X

  • 证明消去律 1:对于任意 X 中的元素 x, ~f(f(x))=x

    首先逆 ~f 的定义是,对于所有 Y 集合中元素 y 存在唯一的 X 中元素 x 使得 f(x)=y, 这个 x 记为 ~f(y)

    • "对于所有 y 存在" 来自于 f 的满射性质
    • "存在唯一的 x" 来自于 f 的单射性质

    f 双射的定义是,对于所有 X 集合中元素 x 存在唯一的 Y 中元素 y 使得 y=f(x).

    因此给定 x, y=f(x), 因为 ~f 是良好的函数,根据替换公理有 ~f(f(x))=~f(y), 根据 ~f 定义这里 ~f(y) 就是 x, 所以 ~f(f(x))=x

  • 证明消去律 2:对于任意 Y 中的元素 Y, f(~f(y))=y

    给定任意 Y 中元素 y, 存在唯一的 x 满足 f(x)=y, 这个 x 记为 ~f(y), 也就是 x=~f(y),根据替代公理有 f(x)=f(~f(y))=y

  • 证明 ~f 也是可逆的,并且它的逆 ~~f=f

    根据定义,~f 是一个有效的 Y->X 上的函数。

    因此它的逆的描述就是: 对于所有 X 中的元素 x, 存在唯一的 Y 中元素 y 满足 ~f(y)=x. 此时 y 的值被记为 ~~f(x), 将 ~~f 是 X 到 Y 的函数,记作 ~f 的逆。

    但这个描述和 f 的定义完全一样,对于所有 x ,f(x) 都和 ~~f(x) 一样,所以 ~~f=f

练习 3.3.7: 双射函数复合的性质

f: X-> Y 和 g: Y-> Z 都是双射, g|f 也是双射, g|f 的逆是 ~f|~g

  • g|f 也是双射: 证明见练习 3.3.2
  • g|f 的逆是 ~f|~g

    首先, g|f 的逆记为 ~(g|f), 它满足对于任意 Z 中元素 z, 都有 ~(g|f)(z)=x

    同时满足,(g|f)(x)=g(f(x))=z, 我们记 f(x) 为 y. 那么由于 f 的双射性质, x=~f(y), 由于 g 的双射性质, y=~g(z)

    因此 (~f|~g)(z)=~f(~g(z))=~f(y)=x

    也就是说对于任意 z, (~f|~g)(z)=x=~(g|f)(z)

    这意味着 ~f|~g 和 g|f 是相等的。

练习 3.3.8: 包含映射或恒等映射

X 是 Y 的子集,Y 又是 Z 的子集,定义 I1(原文里用 \( \iota_{X\to Y} \) 表示) 是从 X 集合到 Y 集合的恒等映射或包含映射,其定义为 I(x)=x, I2 表示 Y 到 Z 的恒等映射。

  1. 证明 I2|I1 是从 X 到 Z 的恒等映射 给定任意 X 中元素 x, (I2|I1)(x) = I2(I1(x)) = I2(x) = x

    而 I2|I1 的 domain 和 range 分别是 X 和 Z, 且由于子集关系, I1(x) 在 Y 中,I2(x) 在 Z 中,因此 I2|I1 是定义良好的函数,并且符合恒等映射定义

  2. f 是 A->B 上的任意函数,证明 f=f|I, f=I|f
    • 先证明 f=f|I, 这里 I 是从 A 到 A 的恒等映射

      对任意 A 中元素 a, (f|I)(a)=f(I(a))=f(a), 因此 f|I=f

      其中 I(a) 是集合 A 中元素,在 f 的 domian 中,因此以上过程是有效的。

    • 再证明 f=I|f, 这里 I 是从 B 到 B 的恒等映射

      对任意 A 中元素 a, (I|f)(a)=I(f(a))=f(a), 因此 I|f=f

      其中 f(a) 是集合 B 中元素,在 I 的 domian 中,因此以上过程是有效的。

  3. f 是 A-> B 上双射函数,那么:
    • f|~f = I, I 是 B 到 B 上的映射

      根据练习 3.3.6,给定任意 B 中元素 b, f(~f(b))=b, 也就是 (f|~f)(b)=b ,这满足恒等映射定义,所以 f|~f=I

    • ~f|f = I, I 是 A 到 A 上的映射

      根据练习 3.3.6,给定任意 A 中元素 A, ~f(f(a))=a, 也就是 (~f|f)(a)=a ,这满足恒等映射定义,所以 ~f|f=I

  4. 如果 X 和 Y 不相交,且 f :X->Z 和 g:Y -> Z 都是函数,证明存在一个唯一的函数 h:(X|Y)->Z, 使得 h 同时满足以下两个性质:
    • h|I=f, I 是从 X 到 X|Y 的恒等映射

      构造 h 为:对于在 X|Y 集合中的任意元素 w, 如果 In(w,X) 那么其结果 h(w)=f(w), 如果 In(w,Y), 那么其结果 h(w)=g(w), 由于 X 和 Y 不相交,因此 In(w,X) 和 In(w,Y) 不会同时成立,因此以上定义是良好的。

      此时对于任意 X 中元素 x, (h|I)(x)=h(I(x))=f(x), 因此 h|I=f, 根据练习 3.1.7 可知,X 是 X|Y 的子集,因此 I 的定义是良好的

    • h|I=g, I 是从 Y 到 X|Y 的恒等映射

      对于任意 Y 中元素 y, (h|I)(y)=h(I(y))=g(y), 因此 h|I=g, 根据练习 3.1.7 可知,Y 是 X|Y 的子集,因此 I 的定义是良好的

    • 唯一性说明:

      如果如果存在另一个 h'(x)同样满足以上性质,那么根据 h'|I=f 和 h'|I=g 的性质可以知道,当输入是 X 中元素时,h'(x)=f(x)=h(x), 当输入是 Y 中元素时,h'(y)=g(y)=h(y), 所以 h'=h.

象和逆象

定义 3.4.1: 集合的象

象是根据函数性质构造出的集合,如果 f 是 X->Y 上函数,S 是 X 的子集,那么定义 f(S) 是 S 的象,它是通过替换公理构造的集合: {f(x): In(x,S)},而称 S 是 f(S) 的逆象。

对于属于 f(S) 中的元素,y 它应该满足: E(x)[f(x)=y&In(x,S)]

此时对函数符号进行了重载,使得 f 可以接受一个集合作为输入。

如果用分离公理来定义象的话,需要从集合 Y 中分离出子集 f(S),那定义 P(y) 为,y=f(x)&In(x,S)

定义 3.4.4: 逆象

假设 U 是 Y 的子集,那么根据分离公理定义 ~f(U) 为 {In(x,X): In(f(x),U)} ,注意对于任意一个在~f(U) 集合中的元素,它要满足的只是一个不包含量词的命题:

In(x,X)&In(f(x), U)

这使得证明逆象有关的命题一般可以规约到命题逻辑之间的关系上,比如练习 3.4.4. 但象的定义则涉及到函数关系的一般定义,这需要用到存在量词等一阶逻辑的变换规则,因此描述起来实际更为麻烦一点,比如练习 3.4.3.

同样,这里重载了 ~f 符号使得它可以接受集合作为输入。

练习 3.4.1: 双射函数象与逆象

f:X->Y 是双射函数,并且 ~f 是它的逆, V 是 Y 的一个子集

证明 V 在 ~f 下的象等于 V 在 f 下的逆象,可以统一用 ~f(V) 表示

  • 这里要证明的是两个集合相等,先写出这两个集合的定义:

    根据定义 V 在 ~f 下的象 A={~f(y):In(y, V)}, V 在 f 下的逆象 B={In(x,X):In(f(x), V)}

  • 那么对任意在 A 集合中的元素 a, 它都有一个在 V 中的元素 y 使得 a=~f(y), 那么根据逆的定义我们知道 a 是在 X 集合中。 根据替代公理有: f(a)=f(~f(y)), 根据练习 3.3.6, 可知等式右侧就是 y, 因此 f(a)=y 也就是说 f(a) 是在集合 V 中,因此命题 In(a,X)&I(f(a),V) 为真,而这就是集合 B 中元素的定义,这证明了在 A 中的元素也在 B 中。
  • 那么对任意在 B 集合中的元素 b, 它满足 In(f(b),V), 而由于 f 是双射,因此 V 中只有唯一的元素 y 符合 y=f(b), 根据替代公理有: ~f(y)=~f(f(b)), 根据练习 3.3.6 可知等式右侧是 b, 因此 ~f(y)=b, 这符合集合 A 元素的定义,因此任意在 B 中的元素都在 A 中。
  • 所以 A=B, 可以用 ~f(V) 统一表示

练习 3.4.2: 象和逆象的复合 1

f:X->Y 是函数, S 是 X 的子集,U 是 Y 的子集,那么,一般情况下, 即 f 不是单射也不是满射时:

  • S 是 ~f(f(S)) 的子集
  • f(~f(U)) 是 U 的子集

练习 3.3.7 中讨论了函数和逆函数复合后的关系,即 ~f(f(x))=x, f(~f(y))=y 。 类似的,本练习则是象与逆象的复合关系。

证明之前,我们先将目标集合"编译"成逻辑语言,以便之后在逻辑上进行论证:

  1. f(S) 的编译:

    对任意 f(S) 中的元素 y, 满足 E(x)[f(x)=y&In(x,S)]

  2. ~f(U) 的编译:

    对任意 ~f(U) 中的元素 x, 满足 In(x,X)&In(f(x), U)

  3. ~f(f(S)) 的编译:

    对任意 ~f(f(S)) 中的元素 x, 满足 In(x,X)&In(f(x), f(S))

    而根据编译 1, 命题 In(f(x), f(S)) 可以重写为 E(z)[f(z)=f(x)&In(z,S)], 这里我们用 z 替代了存在量词里变量 x, 以避免冲突。

    因此,对任意 ~f(f(S)) 中的元素 x, 满足:

    In(x,X)&E(z)[f(z)=f(x)&In(z,S)]

  4. f(~f(U)) 的编译:

    对任意 f(~f(U)) 中的元素 y, 满足 E(x)[f(x)=y&In(x,~f(U))], 注意这里量词变量 又用 x 替换了,因为不会有冲突。

    而根据编译 2, In(x,~f(U)) 等价于 In(x,X)&In(f(x), U)

    因此对任意 f(~f(U)) 中的元素 y, 满足:

    E(x)[f(x)=y&In(x,X)&In(f(x), U)],

    根据等号替换规则,这继续等价于

    E(x)[f(x)=y&In(x,X)&In(y, U)]

    注意最后一个表达式没有量词限制的变量 x, 所以它可以直接取出来,因此等价于

    E(x)[f(x)=y&In(x,X)]&In(y, U)

现在可以讨论关系了:

  • ~f(f(S)) 和 S 的一般关系:

    x 满足 In(x,X)&E(z)[f(z)=f(x)&In(z,S)] 是否能蕴含 In(x, S), 看上去不行, 因为如果 x 在 X-S 中,但 S 中存在一个 z 使得 f(z)=f(x) 是完全可能的,因为 函数允许多对一。

    反过来,如果 In(x, S) ,由于 S 是 X 子集,那么 In(x, X) 成立,同时只要 z 就选择 x 本身,就能满足 f(z)=f(x).

    因此 S 是 ~f(f(S)) 的子集。

  • f(~f(U)) 和 U 的一般关系

    如果 y 满足 E(x)[f(x)=y&In(x,X)]&In(y, U), 那么自然的满足 In(y,U), 因为 p&q 蕴含 q, 但反过来 q 无法推出 p&q

    所以 f(~f(U)) 是 U 的子集

练习 3.4.3: 定义域和值域拆分

A, B 是 X 的子集,f:X->Y 是一个函数

  1. 证明 Subeq(f(A&B), f(A)&f(B))

    在 f(A&B) 中的元素 y 满足 E(x)[f(x)=y&In(x,A)&In(x,B)]

    在 f(A)&f(B) 的元素 y' 满足 E(x)[f(x)=y'&In(x,A)]&E(x)[f(x)=y'&In(x,B)]

    前一个命题是蕴含后一个命题的,因为逻辑上:

    E(x)[P(x)&Q(x)&R(x)] 蕴含 E(x)[P(x)&Q(x)]&E(x)[P(x)&R(x)]

    注意其反过来是不一定成立的,所以 f(A&B) 是 f(A)&f(B) 的子集,但不等于 f(A)&f(B)

  2. 证明 Subeq(f(A)-f(B), f(A-B))

    在 f(A)-f(B) 中的元素 y 满足 E(x)[f(x)=y&In(x,A)&In(x,B)]

    在 f(A-B) 的元素 y' 满足 E(x)[f(x)=y'&In(x,A)]&E(x)[f(x)=y'&In(x,B)]

    f(A)\f(B)的定义是\({x \in {f(a): a\in A }: x\not \in {f(b): b\in B }}\),对于其中的任意元素 z,都存在一个元素 y,满足 f(y) = z,且\(y\in A\),且此时 y 不在 B 中,因为如果 y 在 B 中,那么 f(y)就会在集合{f(b): b$∈$B}中,而 z 也会在这个集合中,与前提矛盾。因此换个写法,\(z\in \{f(y) = z : y \in A , y\not \in B\}\).而这个集合就是 f(A\B) 反过来不一定成立,例如 A = (-1,0},B = {0,-1},\(f(x) = x^2\),此时 f(A)\f(B)=\(\emptyset\),但是 f(A\B) = {1}

  3. 证明\(f(A \cup B) = f(A) \cup f(B)\)。先证明\(f(A \cup B) \subseteq f(A) \cup f(B)\),对于任意 z\(\in\){\(f(x): x\in A\) or \(x \in B\)},存在一个元素 x,f(x) = z,且 x 至少在 A 和 B 之中,分两种情况,如果 x 在 A 中,那么\(z\in \{f(x): x\in A\}\),根据集合公理 3.4(\(x\in A\cup B \Leftrightarrow X \in A\) or \(x \in B\))可以得到\(z\in f(A) \cup f(B)\),同理,如果 x 在 B 中也得到同样结论,因此\(f(A \cup B) \subseteq f(A) \cup f(B)\).再证明\(f(A) \cup f(B) \subseteq f(A \cup B)\),分两种情况,如果 z\(\in f(A)\),那么 z$∈ ${\(f(x): x\in A\)},这可以得到 z$∈ ${\(f(x): x\in A\) or \(x\in B\)},因此可以得到 z 在集合 f(A$∪$B)中。同理另一种情况也得到一样的结论,所以\(f(A) \cup f(B) \subseteq f(A \cup B)\)

练习 3.4.4: 集合关系和逆象

f:X->Y 是函数, U,V 是 Y 的子集。

  • ~f(U|V)=~f(U)|~(V)

    在 ~f(U|V) 中的元素 x 满足命题 In(x, X)&(In(f(x),U)|In(f(x),V))

    根据分配律,有 (In(x, X)&In(f(x),U)|(In(x, X)&In(f(x),V))

    这就是 ~f(U)|~(V) 的定义,因此二者逻辑上等价。

  • ~f(U&V)=~f(U)&~(V)

    在 ~f(U&V) 中的元素 x 满足命题 In(x, X)&(In(f(x),U)&In(f(x),V))

    它等价于 (In(x, X)&In(f(x),U)&(In(x, X)&In(f(x),V))

    这就是 ~f(U)&~(V) 的定义,因此二者逻辑上等价。

  • ~f(U-V)=~f(U)-~(V)

    在 ~f(U-V) 中的元素 x 满足命题 In(x, X)&(In(f(x),U)&~In(f(x),V))

    它等价于 (In(x, X)&In(f(x),U)&(In(x, X)&~In(f(x),V))

    这就是 ~f(U)-~(V) 的定义,因此二者逻辑上等价。

练习 3.4.5: 象和逆象的复合 2

f:X->Y 是函数,S 是 X 的子集, U 是 Y 的子集

  • 练习 3.4.2 已经证明,一般情况下, S 是 ~f(f(S)) 的子集

    而对任意在 ~f(f(S)) 集合的元素 x ,要满足命题 In(x,X)&E(z)[f(z)=f(x)&In(z,S)]

    该命题在一般情况下无法蕴含 In(x, S), 因为如果 x 在 X-S 中,但 S 中存在令一个 z 使得 f(z)=f(x), 那么该命题仍然为真,而此时 x 并不在 S 中。

    然而,如果对于任意 x , E(z)[f(z)=f(x)&In(z,S)] 都能蕴含 In(x, S), 那么这意味着不可能存在一个不同于 x 的 z 使得 f(z)=f(x), 因为一旦出现这种情况, 就能够用 S 把 x 和 z 划分开, z 在 S 中而 x 在 S 之外,导致 In(x, S) 不成立。

    所以 f 必须是 X->Y 的单射函数。(因为我们在讨论任意 S 都满足 ~f(f(S))=S)

    反过来如果 f 是单射,根据定义如果 f(z)=f(x), 则 z=x, 所以 E(z)[f(z)=f(x)&In(z,S)] 为真的话 In(x, S) 就为真,因此 ~f(f(S)) 是 S 的子集。

    所以 ~f(f(S))=S 的充要条件是 f 为单射

  • 练习 3.4.2 已经证明,一般情况下, f(~f(U)) 是 U 的子集

    对任意在 f(~f(U)) 中的元素 y, 要满足 E(x)[f(x)=y&In(x,X)]&In(y, U)

    它可以推导出 In(y, U), 但它要能被 In(y,U) 推导, E(x)[f(x)=y&In(x,X)] 必然恒为 True, 而这要求 f 在 X->U 上是满射,由于我们讨论的是任意集合 U, 因此它可能覆盖 Y 的所有元素,所以 f 在 X->Y 上也是满射。

    而如果 f 是满射,那么对任意 y 都有 E(x)[f(x)=y&In(x,X)], 因此 E(x)[f(x)=y&In(x,X)]&In(y, U) 等价于 In(y, U).

    所以 f(~f(U))=U 的充要条件是 f 为满射。

公理 3.10: 幂集公理

可以通过两个集合来构建出一个集合 \( Y^{X} \), 其中包含了 X->Y 上所有函数。

如果 Y 是空集,则 Y^X 也是空集,没有从 X 到空集 E 的函数,因为函数定义是对所有 X 中元素 x, 都存在一个 E 中的元素 y 与之对应,但 E 中没有元素,因此更没有符合要求的元素。因此无法构建出函数。

引理 3.4.9: 集合的所有子集

X 是一个集合,那么 P={Y : Y 是 X 的一个子集} 是一个集合。

练习 3.4.6: 集合的所有子集是集合的证明

  • 根据幂集公理,对于任意集合 X 都可以构建一个集合 F = {0,1}^X, 它包含了从集合 X 到 {0,1} 上的所有函数。
  • 根据替换公理,对 F 中所有元素,都可以进行一个操作,即取 {1} 在该函数上的逆象,记为 S = {~f({1}): In(f,F)}, 这是一个高阶函数的操作。
  • 证明 S 是 P 的子集:对于任意在 S 中的元素 s, 它是 {1} 的一个逆象,根据逆象定义,它是 X 上的子集,因此它是 P 中的元素。
  • 证明 P 是 S 的子集, 对于任意在 P 中的元素 p, 它是 X 的一个子集,那么我们可以构造一个函数 g, 对于任意在 p 中的元素 x 满足 g(x)=1 不在 p 中的元素 x 满足 g(x)=0, 根据练习 3.3.8 对恒等映射的说明,我们知道这个函数 g 是定义良好且唯一的,而该函数是从 X->{0,1} 的函数,即 g 属于 F,因此 S 中存在集合 {1} 在 g 上的逆象。因此 p 属于 S, 即 P 是 S 的子集。
  • 由于 S 和 P 互为子集,所有 S=P, 因此 P 是一个幂集。

这是通过二进制构造幂集的方法。

公理 3.11: 并集公理

若 A 是一个包含其他集合的集合,那么存在一个集合 u(A),所有在 u(A) 中的元素 x 都能在 A 中的某个集合 S 中找到,即:

In(x, u(A)) <-> E(S)[In(S, A)&In(x,S)]

.

以上 u(A) 中的 union 的首字母

from typing import Iterable, Set

A = [{1, 2}, {2, 3}, {4}]

def union(A: Iterable[Set]) -> Set:
    # 初始一个空集合, 对 A 中所有集合进行 union
     return set().union(*A)

print("u(A):", union(A))
u(A): {1, 2, 3, 4}
  • 有了以上公理,再结合替换公理,可以用这样一种方式来构造集合:

    如果有一个集合 I, 其中可以是任意对象(一般是自然数),I 中的每个元素 i 都对应了一个集合 A[i], 那么通过替换公理,我们就可以获得一个由于 I 中索引所找到的 集合所组成的集合 A[I], 然后对 c(A, I) 做 union 操作得到 u(A[I])

    在 u(A[I]) 中元素满足:

    E(S)[In(S, A[I])&In(x,S)]
    

    这里 S 实际就是某个 A[i], 因此命题等价于

    E(i)[In(i,I)&In(x,A[i])]
    

    注意如果 I 是空集,那么由于不存在满足 In(i,I) 的对象 i, 所以恒为 False

    In(x, u(E)) <-> E(i)[In(i,I)&In(x,A[i])]
    

    因此以上命题左侧也是 False ,u(E) 只能是空集。

  • 另外这条公理是可以描述无限多个集合的并的,比如 I 是自然数集合,那么它就对应了无数个集合。

至此,除去会导致矛盾的公理 3.8, 所有的集合公理称为 ZF 集合论公理系统。

练习 3.4.7: 偏函数构成集合

如果 X' 和 Y' 分别是 X 和 Y 的子集,那么函数 f:X'->Y' 是 X->Y 上的偏函数,而所有这些偏函数能够构成一个集合。

证明某个对象是集合,是要说明它可以通过集合公理构造出来。但是证明某个对象不是集合,可以用反证法来说明,例如规范公理证明不存在万有集合。

首先理清幂集公理声称可以构建出一个包含 X->Y 上的所有函数的集合, "所有函数" 意味着什么?

  • 首先函数要求所有在 X 上的元素都有对应的 Y 中的元素,但 Y 中的元素可以没有对应的 x 。
  • 因此计算它们之间有多少个函数的算法之一是:
    • 找出 Y 的所有非空子集 Y'
    • 将该子集作为值域,构造出 X->Y' 上所有满射的函数
    • 合并所有 X->Y' 上的满射函数集合

对于偏函数,核心区别就在于并不是所有 X 中的元素 x 都有对应的 f(x), 因此我们需要在 X 的 子集里构建函数集合,另外 X'->Y 上的所有函数看上去好像包括 X'->Y' 上的所有函数的,但数学上 它们是不相等的,因为其值域不同,比如从 {1}->{1,2} 上有一个函数,它只满足 f(1)=1, 在 {1}->{1} 上也有一个满足 f(1)=1 的函数,但二者并不相等。

因此要构造出所有偏函数集合:

  • 只需要先用引理 3.4.9 分别构造出 X,Y 的所有子集组成的集合,记为 Sx 和 Sy
  • 用集合替换公理以及幂集公理对 Sx 中每个集合 X' 构造从 X'->Y' 的幂集

    {Pow(X',Y'): In(X', Sx)&In(Y', Sy)}
    
  • 根据并集公理,将以上集合里所有集合求并, 这就是 X 到 Y 上所有的偏函数组成的集合 PF。

练习 3.4.8: 两集合并集公理是冗余的

公理 3.1公理 3.3公理 3.11 可以推导出 公理 3.4

给定任意两个集合 X, Y, 根据公理 3.1 ,由于它们是对象,于是根据公理 3.3 可以构造出集合 {X,Y}, 然后根据公理 3.11 构造出两个集合的并集 X|Y

练习 3.4.9: 多个集合的交集

如果 b 和 b' 是集合 I 中的两个元素,并且 I 中每个元素 i 都指向一个特定的集合 A[i]

那么以下两集合相同:

  • {In(x,A[b]): A(i)[In(i,I)->In(x, A[i])] }
  • {In(x,A[b']): A(i)[In(i,I)->In(x, A[i])] }

这里 A(i) 是量词和变量 i, A[i] 是从 A 中选出标签为 i 的集合

本题仍然是证明两个集合相等。因此用集合相等的定义证明即可.

注意,为什么要先选一个 I 中的元素 b 或 b', 然后再用该元素指示的集合与其他集合的关系来构造多个集合的交集?

为什么不能把并集公理里的论述改一下,比如定义 r(A) 是对 A 中所有集合的交集,那么 r(A) 中任何元素 x 都满足:

In(x, r(A)) <-> A(S)[In(S, A)->In(x,S)]

同样,如果加上替换公理可以用一个索引集合 I 来构造多个集合的交集:

In(x, r(A[I])) <-> A(i)[In(i,I)->In(x,A[i])]

我的理解是,以上需要引入一个新的公理,因为没有现成的公理能够表达出这种操作,而以上描述的是一个和并集公理平行的"交集公理", 并集公理核心提供的实际是对选择迭代操作提供了合法性(无穷集合也适用),给定一个包含集合的的集合,该公理使得我们可以从中选择出所有集合然后对它们取并,没有该公理的情况下,我们只能对给定的某个两个集合取并。

然而先从 I 中选一个确定的集合 b, 然后用分离公理就可以直接描述出所有集合的交集了。(但并集公理无法用这种方式构建,因为分离公理实际描述的是两个 and 命题,而并集构造需要用 or 命题)

由于 b 和 b' 都是 I 中的一部分,即有命题 In(b, I) 的情况下 A(i)[In(i,I)->In(x, A[i])] 是可以推导出 In(x,A[b]) 的,所以对于以下两个命题

In(x,A[b])&A(i)[In(i,I)->In(x, A[i])]
In(x,A[b'])&A(i)[In(i,I)->In(x, A[i])]

都等价于 A(i)[In(i,I)->In(x, A[i])], 因此两个集合也是等价的。

练习 3.4.10: 先选后并和先并后选等价

I,J 都是指示集合,对任意属于 I|J 中元素 i, 都有一个对应的集合 A[i], 那么:

  • u(A[I])|u(A[J]) 等于 u(A[I|J])
  • r(A[I])&r(A[J]) 等于 r(A[I&J])

这里 r(A) 是 练习 3.4.9 中定义的 A 中所有集合的交集 #+end_example

还是在证明集合相等,因此转换为逻辑语言的等价:

  • 根据定义,所有在 u(A[I|J]) 中的元素 x, 都满足命题:

    E(i)[In(i,I|J)&In(x,A[i])]
    

    In(i,I|J) 根据定义是可以展开成 I(i, I)|I(i,J) 的:

    E(i)[(In(i,I)|In(i,J))&In(x,A[i])]
    <-> ;; 将 & 分配到 | 中
    E(i)[(In(i,I)&In(x,A[i]))|(In(i,J))&In(x,A[i])]
    

    而存在量词对 | 是有分配率的,因此以上等价于

    E(i)[(In(i,I)&In(x,A[i]))]|E(i)[(In(i,J))&In(x,A[i])]
    

    而这就是 u(A[I])|u(A[J]) 的定义

  • 同理,根据定义,所有在 r(A[I&J]) 中的元素 x, 都满足命题:

    A(i)[In(i,I&J)->In(x,A[i])]
    <-> ;; 根据 I&J 定义
    A(i)[In(i,I)&In(i,J)->In(x,A[i])]
    <-> ;; 全称量词对 & 的分配变换规则
    A(i)[In(i,I)&In(x,A[i])]&A(i)[In(i,J)&In(x,A[i])]
    

    而最后一个命题就是元素在 r(A[I])|r(A[J]) 中的定义。

练习 3.4.11: 多个集合交并的德摩根定律

X 是集合,I 是非空集合,I 中任意元素 i 都索引一个集合 A[i], 它是 X 的子集。 因此对于每个 A[i] 都有对应补集 X-A[i], 这些补集组成的集合称为 B, 可以通过 i 去 B 中索引得到 B[i]=X-A[i].

那么:

  • X-u(A[I]) = r(B[I])
  • X-r(A[I]) = u(B[I])

证明方式仍然是展开定义:

  • 在 u(A[I]) 中元素 x 满足:

    E(i)[In(i,I)&In(x,A[i])]
    
  • 在 X-u(A[I]) 中元素 x 满足:

    In(x,X)&~E(i)[In(i,I)&In(x,A[i])]
    <-> ;; 存在量词上做德摩根: ~E(x)(p&q) 等价于 A(x)(p->~q)
    In(x,X)&A(i)[In(i,I)->~In(x,A[i])]
    
  • 在 r(B[I]) 中元素 x 满足

    A(i)[In(i,I)->In(x,B[i])]
    <-> ;; B 的定义
    A(i)[In(i,I)->(In(x,X)&~In(x,A[i]))]
    <-> ;; p->q&r 等价于 (p->q)&(p->r)
    A(i)[(In(i,I)->In(x,X))&(In(i,I)->~In(x,A[i]))]
    <-> ;; 全称量词分配
    A(i)[(In(i,I)->In(x,X))&A(i)[(In(i,I)->~In(x,A[i]))]
    

    我们想要证明 A(i)[(In(i,I)->In(x,X)) 等价于 I(x,X)

  • 在 u(B[I]) 中元素 x 满足:

    E(i)[In(i,I)&In(x,B[i])]
    <-> ;; 差集定义
    E(i)[In(i,I)&In(x,X)&~In(x,A[i])]
    <-> ;; In(x,X) 不包含变量 i
    In(x,X)&E(i)[In(i,I)&~In(x,A[i])]
    
  • 在 X-r(A[I]) 中元素 x 满足:

    In(x,X)&~A(i)[In(i,I)->In(x,A[i])]
    <->;; 德摩根
    In(x,X)&E(i)[In(i,I)&~In(x,A[i])]
    

    因此 X-r(A[I])=u(B[I])

TODO 为什么没用到 A[i] 是 X 子集?

笛卡尔集

定义 3.5.1: 有序对

定义 (x,y) 是有有序对,两个有序对 (x, y), (x', y') 相等,要满足:

(x, y)=(x', y') <-> (x=x')&(y=y')

.

这个定义同时也是有公理性质,因为它声称了 (x,y) 对象的存在性。

不过 练习 3.5.1 中会说明可以用现有集合论方法来定义,而不用引入公理

定义 3.5.4: 笛卡儿积

定义 X*Y := {(x, y) : In(x,X), In(y,Y) }

逻辑形式为,对任意元素 z:

In(z, X*Y)<->E(x)E(y)[z=(x,y)]

.

练习 3.5.1: 有序对的纯集合论定义

公理 3.3 可以定义 (x, y) 为 {{x}, {x, y}} 或者 (x, y) := {x, {x, y}} ,两种定义都符合:

(x, y) = (x', y') <-> (x=x')&(y=y')

.

两个定义的性质证明都涉及到不断向下一层去要结果的过程,但证明上我们需要反过来:

  • 先证明 {x} {x'}, 以及 {x,y} {x',y'} 的关系

    如果 x=x'且 y=y', 根据公理 3.3, 任意在 {x} 中的元素 y 都满足 y=x, 由于 x='x, 因此 y=x' 这意味着 y 在 {x'} 中,同理可证明 {x'} 中元素都在 {x} 中,因此 {x}={x'}.

    反过来,如果 {x}={x'}, 在 {x} 中的元素只有 x, 它在 {x'} 中,而后者只有 x', 因此 x=x' 。

    这就证明 x=x' 等价于 {x}={x'}

    同样的,根据双元素集合公理,任意在 {x,y} 中元素 z, 要么 z=x, 要么 z=y, 分情况讨论可以发现 z 都在 {x', y'} 中。反过来也类似,因此 {x,y}={x',y'}

    反过来,如果 {x,y}={x',y'}, 有两种情况:

    • x=x',y=y'
    • x=y', y=x'
  • 再证明 (x,y) 定义为 {{x}, {x, y}} 时的等价性质
    • 先证明从右到左:

      {{x}, {x, y}} = {{x'}, {x', y'}} <- (x=x')&(y=y')
      

      由于右边的关系以及前文的说明,我们知道 {x}={x'}, {x,y}={x',y'}, 因此根据双元素集合公理,类似证明 {x,y}={x',y'}, 可以证明 (x,y)=(x',y')

    • 证明从左到右:

      {{x}, {x, y}} = {{x'}, {x', y'}} -> (x=x')&(y=y')
      

      类似前文的证明, {{x}, {x, y}}={{x'}, {x', y'}} 意味着两种情况:

      • {x} = {x',y'}, {x,y}={x'}

        这意味着 x=x'=y'=y, 因此 x=x', y=y' 成立

      • {x} = {x'}, {x,y}={x', y'}

        前文已经知道,{x,y}={x', y'} 意味着以下两种情况

        • x=x', y=y': 这直接是我们想要的结果
        • x=y', y=x': 但 {x}={x'} 意味着 x=x', 因此必须有 x=x'=y'=y

          这也说明了 x=x' 以及 y=y'

    • 如果 A=B, 根据集合等于的定义,任意在 A 中元素要满足

      In(z,A)->In(z,B)
      
  • 接着证明 (x,y) 定义为 {x, {x, y}} 时的等价性质
    • 先证明从右到左:

      {x, {x, y}} = {x', {x', y'}} <- (x=x')&(y=y')
      

      由于右边的关系以及前文的说明,我们知道 x=x', {x,y}={x',y'}, 因此根据双元素集合公理,类似证明 {x,y}={x',y'}, 可以证明 (x,y)=(x',y')

    • 证明从左到右:

      {x, {x, y}} = {x', {x', y'}} -> (x=x')&(y=y')
      

      {x, {x, y}}={x', {x', y'}} 意味着两种情况:

      • x={x',y'}, {x,y}=x'

        但这意味着, {x,y} 集合中包含了 {x',y'} 集合,后者又包含了 {x,y}, 导致了互 包含,根据正则公理以及练习 3.2.2, 这种情况是无法出现的。

      • x = x', {x,y}={x', y'} 前文已经知道,{x,y}={x', y'} 意味着以下两种情况
        • x=x', y=y': 这直接是我们想要的结果
        • x=y', y=x': 但我们还有约束 x=x', 因此必须有 x=x'=y'=y

          这也说明了 x=x' 以及 y=y'

采用这些定义可以表明笛卡尔积 X*Y 也是一个良好定义的集合。

定义 3.5.7: 有序 n 元组和 n 重笛卡儿积

称 x[:n] := (x[1],…,x[n]) 是由 n 个元素(n 是自然数)构成的 n 元组,两个 n 元组相等

x[:n]=y[:n]<-> 所有 x[i]=y[i]

如果 X[:n] 是由 n 个集合组成的 n 元组,那么它的笛卡尔积记为:

prod(X[:n])=X[1]*..*X[n]={x[:n]: A(i)[In(x[i], X[i])]}

.

体现在 python 中:

from itertools import product
print(set(product({1,2},{3,4},{4,5})))
{(1, 4, 4), (2, 4, 5), (1, 3, 5), (1, 3, 4), (2, 3, 5), (2, 4, 4), (2, 3, 4), (1, 4, 5)}
  • 可以对同一个集合做 n 重笛卡尔积,记为 X**n 比如 X**3=X*X*X
  • 1 元组 如果 x 是一个元素则 (x) 是 1 元组,数学上我们把它等同于 x.

    因此对一个单独的集合 X1 做笛卡尔积的话,实际就是从 X1 集合里选择出每个元素 x 构造成 (x), 而 (x) 等价于 x, 因此其结果就是 X1 本身:

    python 中实际不太一样,尽管以下是相同的

    (1)==1
    
    True
    

    但 python 里的一元组是 (x, ) 形式的,与 x 本身是不同的:

    (1,)==1
    
    False
    

    python 中如下,这里并不等于原集合

    print(set(product({1,2})))
    
    {(1,), (2,)}
    
  • 0 元组(空元组)

    1 元组是从集合 X 中选择 1 个元素放到元组中

    0 元组就是从集合 X 中选择 0 个元素放到元组中,因此它是 (), 这也是一个对象。

    python 中有空元组:

    a = ()
    print(type(a))
    
    <class 'tuple'>
    

    空笛卡尔积是对 0 个集合做笛卡尔积的结果,记为 X**0,它是一个包含空元组的单元素集合 {()}, 而不是空集。

    如果 X 是空集 E**0 仍然是 {()}, 但 E**n 在 n 大于 0 情况下是空集。

    这里核心在于,从一个集合中选择 0 个元素是一个合法操作(即便是从空集里取),但从空集里取一个元素则是不合法的(因此其对应的命题一定是 False)

    这种定义和后文的指数定义是类似的。

    练习 3.5.2: 用满射函数定义 n 元组

    可以定义有序 n 元组为从 1 到 n 的自然数构成的集合 N 到 X 上的一个满射函数。 证明两个这样的 n 元组 f 和 g 相等需要满足 A(i)[In(i,N)->f(i)=g(i)]

    首先,函数 f 和 g 相等的定义是定义域值域相等并且对每个定义域上元素 i, f(i)=g(i).

    由于在定义上,所有 n 元组的定义域和值域是一样的,因此满足 A(i)[In(i,N)->f(i)=g(i)] 就意味着 f 函数和 g 函数相等。

    在此定义下,n 重笛卡尔积的定义是 X[1]*..*X[n]={x[:n]: A(i)[In(x(i), X[i])]} 其中 X[:n] 是以上定义的满射函数,可以通过以下方式构造出这种由于函数作为底层实现的 n 元组构成集合:

    • 公理 3.11 将所有 X[i] 求并得到一个集合 u(X[:n])
    • 练习 3.4.7 构造所有从 N 到 u(X[:n]) 的偏函数组成的集合,记录为 PF
    • 用分离公理从 F 构造出集合 {In(f:PF):surjective(f)&domain(f)=N}, 也就是从中选出 定义域为 N 的满射函数。

    注意为什么一定要从偏函数集合里选择?因为只有偏函数集合才能从中选择 surjective, 当然我们也可以更精细地构造,即只构造从 N 到 u(X[:n]) 的所有子集上的函数的并,然后从选择其中的满射函数。不过"构造复杂度"不是目前要考虑的。

    练习 3.5.3: 有序对相等遵循相等公理

    有序对和有序 n 元组的相等定义遵守自反性、对称性和传递性公理。

    这里的证明完全规约到对元组中一般对象相等的证明中:

    • 有序对:
      • 自反性:

        (x,y)=(x,y)<->x=x&y=y 
        

        因此只要其中对象 x 和 y 的等于关系满足自反性即可。

      • 对称性:

        (x,y)=(x',y')<->(x=x')&(y=y')
        <-> ;; 一般对象相等的对称性
        (x'=x)&(y'=y)<->(x',y')=(x,y)
        
      • 传递性(同样规约到具体元素相等性质传递性,不再展开)
    • 有序 n 元组对(同样规约到具体元素相等性质,不再展开):
      • 自反性: x[:n]=x[:n]
      • 对称性: x[:n]=y[:n] 则 y[:n]=x[:n]
      • 传递性: x[:n]=y[:n], y[:n]=z[:n]-> x[:n]=z[:n]

    练习 3.5.4: 笛卡尔集的分配律

    A*(B|C)=(A*B)|(A*C), A*(B&C)=(A*B)&(A*C), A*(B-C)=(A*B)-(A*C) (B|C)*A=(B*A)|(C*A), (B&C)*A=(B*A)&(C*A), (B-C)*A=(B*A)-(C*A)

    仍然是证明集合相等,仍然是证明两个 In 关系命题的等价

    对任意属于 A*(B|C) 中的元素 (a,x) ,根据定义,它满足:

    In(a, A)&In(x, B|C) <-> ;; B|C 的定义
    In(a, A)&(In(x, B)|In(x, C)) <-> ;; 分配律
    (In(a, A)&In(x, B))|(In(a,A)&In(x, C))
    

    最后一项是元素 (a,x) 在 (A*B)|(A*C) 集合中的定义,因两集合相等

    其他证明都是类似的,这里列出最后一个等式 (B-C)*A=(B*A)-(C*A) 的证明

    对任意属于 (B-C)*A 中的元素 (x,a) ,根据定义,它满足:

    In(x, B-C)&In(x, A) <-> ;; B-C 的定义
    (In(x, B)&~In(x, C))&In(a, A) <-> ;; & 的结合律交换律
    In(x, B)&In(a, A)&~In(x, C) <-> ;; 重言等价
    (In(x, B)&In(a, A)&~(In(x, C)&In(a,A))
    

    也可以对 In(x, B)&In(a, A)&~In(x, C) 直接进行解释:

    • 这表明 x 在 B 中,a 在 A 中,因此 (x,a) 在 (B*A) 中,但由于 x 不在 C 中,因此 x 不可能在 C*A 中,因此 (x,a) 就在 (B*A)-(C*A) 中
    • 反过来,如果元素 (x,a) 在 (B*A)-(C*A) 中,那么 x 在 B 中 a 在 A 中,且 x 不可能在 c 中(否则 a 就不能在 A 中了),因此这与以上命题等价,因此 (x,a) 在 (B-C)*A 中

    练习 3.5.5: 笛卡尔积之间的交集

    (A*B)&(C*D)=(A&C)*(B&D)

    对任意属于 (A*B)&(C*D) 中的元素 (x,y) ,根据定义,它满足:

    In(x, A)&In(y, B)&In(x, C)&In(y, D) <-> ;; 交换律
    In(x, A)&In(x, C)&In(y, B)&In(y, D)
    

    最后一项是元素 (x,y) 在 (A&C)*(B&D) 集合中的定义的等价描述,因此两集合相等

    (A*B)|(C*D) 和 (A|C)*(B|D) 并不相等,因为后者包括在 C*B 中的元素,该元素在前者集合。

    比如 A,B,C,D 分别是 {1},{2},{3},{4}, 那么 (3,2) 不在 A*B 也不再 C*D 中。

    (A*B)-(C*D) 和 (A-C)*(B-D) 也不相等,因为前者可以包括 C*B

    In(x, A)&In(y, B)&In(x, C)&In(y, D) <-> ;; 交换律
    In(x, A)&In(x, C)&In(y, B)&In(y, D)
    

    练习 3.5.6: 笛卡尔积之间的交集

    设 A、B、C、D 都是非空集合:

    则 A*B 是 C*D 子集当且仅当 A 是 C 子集且 B 是 D 子集。

    A*B=C*D,当且仅当 A = C 且 B = D。

    .

    • 从右到左: 如果 A 是 C 子集且 B 是 D 子集,那么对于 A*B 中任意元素 (x,y), x 在 C 中,y 在 D 中,因此 (x,y) 也在 C*D 中,即 A*B 是 C*D 的子集。
    • 从左到右: A*B 是 C*D 的子集,说明对于在 A*B 中的元素 (x,y) 都在 C*D 中, 那么 x 一定在 C 中 y 一定在 D 中。

    如果没有非空集合的限制,那么如果只有 B C 是空集,那么 A*B 和 C*D 都是空集,自然互为子集,但 A 不是 C 的子集,A 和 C 也不相等。

    练习 3.5.7: 坐标函数与直和

    对于任意的函数 f:Z->X 和 g:Z->Y,存在唯一的函数 h:Z->X*Y , 使得 i1|h=f, i2|h=g 。

    i1 和 i2 是选择函数,给定一个二元组,分别返回第一个和第二个元素 因此它们的定义域值域分别为 X*Y->X 和 X*Y->Y

    .

    这里 i1 ️i2 像是一个后端过滤器,从 h 函数得到的二元组里选出不同对象。

    构造 h 为如下函数,对任意输入 z ,返回 (f(z),g(z)), 该函数是定义良好的,因为 f 和 g 是给定的定义良好的函数,根据练习 3.5.3, 所有的 z 都会有一个唯一的 h(z) 。

    同时,对任意 z ,(i1|h)(z)=f(z), (i2|h)(z)=g(z), 因此 i1|h=f, i2|h=g 。

    如果存在其他函数,对任意输入 z, 结果

    在练习 3.3.8 中,证明过以下结论

    如果 X 和 Y 不相交,且 f :X->Z 和 g:Y -> Z 都是函数,证明存在一个唯一的函数 h:(X|Y)->Z, 使得 h 同时满足以下两个性质:
    
    h|I=f, I 是从 X 到 X|Y 的恒等映射
    h|I=g, I 是从 Y 到 X|Y 的恒等映射
    

    这里 I 的作用像一个前端的过滤器,使得原本定义域在 X|Y 上的函数 h 可以变成在 X 或者在 Y 上

引理 3.5.12: 有限选取

如果对于 1<=i<=n, X[i] 都是非空集合,那么 prod(X[:n]) 也是非空 n 元组集合

这意味着,如果有某个 X[i] 是空集,那么 prod(X[:n]) 也是空集。

.

对该引理的证明涉及到多个从集合中"选择" 的概念,在此梳理:

  • n=0 时:空笛卡尔积的定义知道,0 重选择的结果并不是空集,而是 {()}
  • n=1 时:根据引理 3.1.6 知道,非空集合中一定能选择出一个对象,因此 prod(X[:1]) 选出的是 X[1] 集合,而 X[1] 非空是前提
  • 通过归纳法,可以从第 n+1 集合里选择出一个元素与已经假设存在的 n 元组拼接,因此存在 n+1 元组。
  • 无限多个集合时,无法自然推广,需要引入选择公理

练习 3.5.8: 空集对 n 重笛卡尔积的影响

如果 prod(X[:n]) 为空,那么至少有一个集合 X[i] 为空

引理 3.5.12 的逆否命题就是以上的结论。

练习 3.5.9: 同时选择和分阶段选择

I,J 是两个指示集合,其各个元素都指示了 A 集合中的集合, 定义集合 B={A[i]&A[j]: In((i,j),I*J)}, 那么

u(A[I])&u(A[J])=u(B)

仍然展开以上两个集合的逻辑表达:

  • 在 u(A[I])&u(A[J]) 中的元素 x 满足
E(i)[In(i,I)&In(x, A[i])]&E(j)[In(j,J)&In(x, A[j])]

语义上看,这意味着,存在 i,j 两个分别在 I,J 中的独立索引,使得 x 同时在 A[i] 和 B[i] 中

  • 在 u(B) 中元素 x 满足:
E((i,j))[In(x,A[i])&In(x,A[j])&In((i,j), IxJ)]
<-> ;;IxJ 定义
E(i)(j)[In(x,A[i])&In(x,A[j])&In(i,I)&In(j, J)]

语义上看,意味着存在 i,j, 两个分别在 I,J 中的独立索引,使得 x 同时在 A[i] 和 B[i] 中。 因此二者完全等价。

形式规则上看,以下式子是恒为真的:

E(x)E(y)[P(x)&Q(y)]<->E(x)[P(x)]&E(y)[Q(Y)]

练习 3.5.10: 函数的图

f: X->Y 是一个函数,定义 f 的图 G(f) 为 X*Y 的一个子集 {(x, f(x)) : In(x,X)}。 那么两个函数相等等基于它们的图相等。

  • 正向:给任意 x, (x,f(x)) 在 G(f) 中,同样 (x,g(x)) 在 G(g) 中。

    而如果两个函数 f, g 相等,那么在 G(f) 中元素 (x,f(x)) 也会在 G(g) 中, 即对应 (x,g(x))=(x,f(x)), 反过来同样成立。

  • 反向:如果两个函数的图相等,那么给任意 G(f) 中元素 (x, f(x)) 都能在 G(g) 中找到相同元素, (x,g(x)), 根据有序对等于性质,意味着 g(x)=f(x). 因此 f=g.

反过来,如果 X*Y 的某个一个子集 G 具有下述性质:对每一个 X 中元素 x,集合 {In(y,Y): In((x, y), G)} 中恰好有一个元素(或者换言之,G 满足垂线测试),那么恰好存在一个函数 f:X->Y ,它的图与 G 相等。

这和前一个问题的差别在于,给定一个纯粹的 X*Y 集合的子集 G,该集合的样子与函数的图的样子很像,那么证明存在一个函数,它的图就是 G.

因此可以直接构造出一个函数 f:X->Y, 对每一个 x 中的元素 f(x) 就等于那个唯一的在集合 {In(y,Y): In((x, y), G)} 中的 y. 首先由于 y 是唯一的,因此该函数是定义良好的。

接着,根据这种的定义方式,对任意在 f 的图中的元素 (x,f(x)) 都会在图 G 中。 反过来,在 G 中的任意元素 (x,y), 由于 y 都对应了一个 f(x) 所以它在 f 的图中。

(这里核心是, X*Y 的子图 G 中覆盖了所有 X 集合里的情况)

练习 3.5.11: 幂集公理冗余性

可以通过引理 3.4.9 推导出公理 3.10

前文中,引理 3.4.9 (子集引理)说的是可以通过幂集公理构造出某个集合的所有子集构成的集合,本题则反过来,说明可以通过子集引理推导出幂集公理。

具体说来,假设对于任意 X, 可以获得它们所有子集构成的集合 Pow(X), 或者记为 2**X, 那么如何获得给定集合 X 到 Y 上的所有函数组成的集合?

额外地,练习 3.5.2 中可以用满射函数定义 n 元组,而练习 3.5.10 中可以建立笛卡尔积与函数的同构,因此考虑用笛卡尔积。

获得 Y 的所有子集 2**Y, 然后对其中每个子集 y ,构建 X 到 y 的笛卡尔积 X*y,产生的每个集合都与一个 X 到 Y 的子集上的满射函数同构,将所有 X*y 合并就得到了所有的图

练习 3.5.12: 严格递归定义

递归定义的严格定义: 设 f:N*N -> N 是一个函数,c 是一个自然数。则存在一个函数 a:N->N 使得 a(0) = c 且对任意的 n ∈ N 均有 a(n ++)= f(n,a (n)), 而且这个函数是唯一的。

命题 2.1.16 里定义了递归定义,但那个时候没有严格定义函数。首先我们证明的是 a 的存在,而 f 是给定的,因此先非正式地看 a 为什么存在并且是唯一的,用加法例子代入,

f(m,n)=m+n

对于任意自然数 n ,存在一个函数

  • n=0 时:空笛卡尔积的定义知道,0 重选择的结果并不是空集,而是 {()}
  • n=1 时:根据引理 3.1.6 知道,非空集合中一定能选择出一个对象,因此 prod(X[:1]) 选出的是 X[1] 集合,而 X[1] 非空是前提
  • 通过归纳法,可以从第 n+1 集合里选择出一个元素与已经假设存在的 n 元组拼接,因此存在 n+1 元组。
  • 无限多个集合时,无法自然推广,需要引入选择公理

练习 3.5.13: 自然数系的唯一性

所有自然数集合都是同构的,同构意味着存在从一个集合到另一个集合之间的双射函数

假设有另一个集合叫作另类自然数 N',其中有一个对象 a, 以及一个增长函数 s(a), 它们都符合 peano 公理。那么证明自然数集合 N 到 N' 之间存在一个双射,满足 f(0)=a ,且对任意自然数 n, 以及任意另类自然数 m, 有 f(n)=m, 当且仅当 f(n++)=f(s(m)).

集合的基数

基数的概念完全建立在函数,而且是双射函数的概念之上。

定义 3.6.1: 相等的基数

我们称两个集合 X 和 Y 有相等的基数,当且仅当存在 从 X 到 Y 的一个双射: f: X->Y 。

命题 3.6.4: 基数相等遵守等于公理

设 X、Y 、Z 是集合,那么:

  • 自反: X 和 X 有相等的基数。
  • 对称: 如果 X 和 Y 有相等的基数,那么 Y 和 X 有相等的基数。
  • 传递: 如果 X 和 Y 有相等的基数且 Y 和 Z 有相等的基数,那么 X 和 Z 有相等的基数。

练习 3.6.1: 基数相等性质证明

  • 自反: 存在双射函数 f:X->X ,f(x)=x, 可以说明这是双射,因为 x!=y 时 f(x)=x!=y=f(y), 同时所有 x 都有逆。
  • 对称: 根据双射函数定义(双射本身称为可逆函数),其逆函数 ~f 也是 Y->X 的双射函数
  • 传递: f:X->Y, g:Y->Z 是双射,根据 练习 3.3.7 f|g 是 X->Z 的双射函数

定义 3.6.5: 基数为 n 的集合

通过与包含 1 到 n 的自然数集构建双射来定义某个集合的基数

也可用 {In(i, N): i<n } 来代替集合包含 1 到 n 的集合,因为 f(n)=n+1 就是它们之间的双射函数

练习 3.6.2: 空集基数为 0

一个集合 X 的基数为 0,当且仅当 X 是空集。

如果 X 基数为 0, 那么它与集合 {In(x, N): 1<=i<=0} 存在双射。 但不存在从非空集合到空集的函数,因此 X 为空集。

反过来,如果 X 是空集根据练习 3.3.3, 空集到任意集合 Y 的函数只有 Y 是空集的时候才是双射,因此 X 只能和空集有双射,故 X 基数为 0.

命题 3.6.8: 基数的唯一性

设 X 是一个基数为 n 的集合,那么 X 不可能还有任何其他的基数 。 也就是说 ,对任意的 m!=n,m 不可能是 X 的基数。

这是一个唯一性证明,看上去似乎是简单的?如果出现一个不同的基数,那么存在一个包含 1 到 m 的自然数构成的集合,然后说明它和 {1…n} 集合无法构造出双射,但如何说明无法构造双射,继续用反证法,如果存在一个双射

引理 3.6.9: 从集合中删除一个元素后基数减 1

假设 n >= 1,且 X 的基数为 n, 那么 X 是非空的,如果 x 是 X 中任意一个元素,那么集合 X −{ x} 的基数为 n-1

该引理是为了证明基数唯一性命题的

定义 3.6.10: 有限集

一个集合是有限的,当且仅当它的基数是某个自然数 n; 否则,我们称该集合为无限的。如果 X 是一个有限集,那么我们用 #(X) 来表示 X 的基数。

定理 3.6.12: 自然数集 N 是无限的

自然数集 N 是无限的

练习 3.6.3: 自然数集 N 无限的证明

反证法,假设自然数集是有限的,它的基数是某个自然数 n, 那么根据定义存在 N 到有限集合 X={In(i,N): 1<=i<=n} 的一个双射。把 X 到 N 方向的映射记为 f, 接着证明所有 f(i) 都是有界的,也就是 f(i) 小于等于某个自然数 M:

  • n=1 时,f 是一个从 {1} 到自然数集 N 的函数,假设其唯一的映射是 f(1)=a, 那么令 M=a 就找到了使得所有 f(i)<=M 的值。
  • 假设 f:{1…n}->N 下存在自然数 M 使得对所有 i, f(i)<=M
  • 那么 f:{1…n,n++}->N 时,如果 f(n++)<=M, 根据假设,所有 f(i) 仍然小于等于 M, 如果 f(n++)>=M ,则重新将 M 选为 f(n++), 此时仍然存在某个自然数使得所有 f(i)<=M

但这意味着 M++ 不在集合 N 中,与自然数集性质矛盾。

命题 3.6.14: 基数算术

通过基数概念来构建算术运算

练习 3.6.4: 基数算术证明

a) X 是有限集,设 x 是一个对象并且 x 不是 X 中的元素。那么 X|{x} 是有限的,且 #(X|{x})=#(X)+1。

假设 X 基数是 n, 那么 f:X->{1…n} 是双射函数,对于 X|{x} 可以构造出一个到 {1…n++} 的双射函数 g,对于所有在 X|{x} 集合中元素 y, 如果 y!=x, 则 g(y)=f(y), 否则 g(y)=n++ 那么由于 f 是双射,且 n++ 不等于其他自然数,那么这就是一个双射函数,且该集合的基为 n+1.

b) X,Y 都是有限集,那么 X|Y 是有限的,且 #(X|Y)<=#(X)+#(Y)。 另外,如果 X 和 Y 是不相交的(即 X&Y=E),那么 #(X|Y)=#(X)+#(Y)。

假设 Y 的基数是 n ,用归纳法:

  • n=0 时, Y 是空集,根据前文知道 X|E=X 是有限的, 而 #(X|Y)<=#(X)+#(Y) 也成立。
  • 假设基数为 n 时, #(X|Y)<=#(X)+#(Y), 且在 X Y 不相交时取等号。
  • 可以把基数为 n++ 的集合看作是 Y'=Y|{y}, 这里 y 不是 Y 中的元素,其中 Y 是基数为 n 的某个集合。根据 1) 有 #(Y')=#(Y)+1=n+1
  • X|(Y')=(X|Y)|{y}, 现在分两种情况:
    • 如果 y 在 X 中,那么 X|Y'=X|Y

      因此: #(X|Y')=#(X|Y)<=#(X)+#(Y)<=#(X)+#(Y)+1=#(X)+#(Y').

    • 如果 y 不在 X 中,那么根据 1) 有

      #(X|Y')=#(X|Y)+1<=#(X)+#(Y)+1=#(X)+#(Y)

      在 X 和 Y 不相交的假设下

      #(X|Y')=#(X|Y)+1=#(X)+#(Y)+1=#(X)+#(Y')

c) X 是有限集,Y 是 X 的一个子集。那么 Y 是有限的,且 #(Y)<=#(X)。另外,如果 Y 是 X 的一个真子集,那么我们有 #(Y)<#(X)。

当 Y 是 X 的子集时,根据集合定义可以证明 X=(X-Y)|Y, 且 (X-Y)&Y=E, 根据 2) 的结论就有 #(X)=#(X-Y)+#(Y)

由于基数都是自然数,因此 #(Y)<=#(X), 并且如果 Y 是 X 的真子集,那么 Y!=X, 有 #(Y)!=#(X), 最终 #(Y)<#(X)

d) 如果 X 是有限集,f:X->Y 是一个函数,那么 f(X) 是一个有限集并且满足 #(f(X))<= #(X)。另外,如果 f 是单射,那么 #(f(X)) = #(X)。

设 X 的基数为 n, 对其归纳:

  • n=0 时,这是一个空函数,空集的象 f(S) 也是空,因此 #(f(X))=0<=0=#(X),根据练习 3.3.3, 空函数是单射,所以单射下的等于关系也成立。
  • 基数为 n 时满足归纳假设,那么基数为 n++ 时,X' 可以写成 X|{x}, x 不在 X 中。
    • 对于任意函数 f', 可以定义为当 z 属于 X 的时候 f'(z)=f(z), 这里 f 是 X->Y 上的任意一个函数, 当 z=x 的时候, f'(z)=y:
      • 当 y 在 f(X) 中时, f'(X')=f(X), #(f'(X))=#(f(X))<=#(X)<=#(X')
      • 当 y 不在 f(X) 中时, f'(X')=f(X)|{y}, 根据 1) 可知 #(f'(X))=#(f(X))+1<=#(X)+1=#(X')
    • 如果 f' 是单射,那么 f 必须是单射,否则可以找出两个在 X 里的不同元素导致它们的映射结果相同,从而违反单射定义。 并且 f'(x) 不会在 f(X) 中,因此 #(f'(X'))=#(f(X))+1=#(X)+1=#(X')

e) 设 X 和 Y 都是有限集,那么笛卡儿积 X*Y 是有限的并且 #(X*Y)=#(X)*#(Y)。

设 Y 基数为 m , X 的基数是 n, 对 n 进行归纳:

  • n=0 时,得到的是空集,因此符合要求。
  • n=1 时,X={x} , 那么 {x}*Y 只能从 {x} 中选择一个元素,得到的是 {(x,y1),(x,y2)..} 这样的结果,它可以和 Y 构建一一对应关系 f(y1)=(x,y1), 因此命题仍然成立。
  • 假设基数为 n 情况下成立,并将 X' 看作 X|{x}, x 不在 X 中 根据练习 3.5.4, (X|{x})*Y =(X*Y|{x}*Y), 由于 x 不在 X 中,因此在 {x}*Y 中的任意元素 (x,y) 都不在 X*Y 中,因此 X*Y 和 {x}*Y 是不相交的,根据 2) 可以知道

    #(X'*Y)=#(X*Y)+#({x}*Y)=n*m+m=(n+1)*m=#(X')*#(Y)
    

    因此归纳步骤也成立。

f) 设 X 和 Y 都是有限集,那么集合 Y**X(在公理 3.10 中被定义)是有限的,并且 #(Y**X)=#(Y)**#(X)。

假设 Y 基数是 m, X 的基数是 n, 对 n 进行归纳:

  • n=0 时,根据定义 3.3.7, 在任意 Y 下空函数只有一个,因此 #(Y**X)=1, 而根据定义 2.3.11, m**0=1, 因此命题成立。
  • n=1 时,X={x} , 那么从 {x} 到 Y 的函数,只能是给定相同 x ,得到对应不同的 Y 上的元素,比如 f1(x)=y1, f2(x)=y2…, 因此 Y**{x} 的基数等于 Y 的基数。 命题同样成立。
  • 假设基数为 n 情况下 #(Y**X)=m**n,并将 X' 看作 X|{x}, x 不在 X 中,我们想证明以下结论:

    #(Y**X')=#(Y**X)*#(Y**{x})=m*m**n=m**(n+1)
    

    这里指数关系规约到乘法关系,而 5) 提供了一种乘法关系,因此我们要说明从 X|{x} 到 Y 的所有函数可以一一映射到 X**Y 和 {x}**Y 的笛卡尔积上。

    这是合理的,因为对任意 X|{x} 到 Y 的函数 f,对于在 X 集合中元素的映射关系,都可以在 X**Y 中找到,而对于 {x} 的映射关系,都可以在 {x}**Y 中找到,反过来也是如此。

    因此归纳步骤也成立。

练习 3.6.5: 乘法交换律的基数算术证明

设 A 和 B 是集合,可构造出一个明确的双射表明: A*B 和 B*A 有相等的基数。然后利用命题 3.6.14, 给出引理 2.3.2 的另一种证明方法。

假设 a 是 A 中元素,b 是 B 中元素,那么 A*B 到 B*A 的双射为: f((a,b))=(b,a)

  • 单射说明:对于所有在 A*B 中的 (a,b) 都有对应的 (b,a), 且如果它们不相等,根据有序对相等属性,其映射结果也会不相等
  • 满射说明:对于每一个在 B*A 中的 (b,a) 都有对应的 (a,a)

对乘法假换律的证明:

  • 根据 3.6.14 里基数算术的性质,A*B 的基数是 #(A)#(B), B*A 的基数是 #(B)#(A)
  • 而 A*B 到 B*A 有双射关系,因此基数相等 #(A)#(B)=#(B)#(A)

练习 3.6.6: 指数运算的基数证明

设 A、B、C 是集合,可以构造一个明确的双射来表明:集合 (A**B)**C 和 A**(B*C) 有相等的基数 。因此推导出 (a**b)**c = a**(b*c) 对任意的自然数 a、b、c 均成立。利用类似的论证方法可推导出 (a**b)(a**c)=a**(b+c)

练习 3.6.7: 单射和基数小于等于关系

设 A 和 B 是集合,如果存在一个从 A 到 B 的单射 f : A -> B,那么我们称 A 的基数小于或等于 B 的基数。结论:如果 A 和 B 都是有限集,那么 A 的基数小于或等于 B 的基数,当且仅当 #(A)<=#(B)。

定义 3.6.10 里是定义了有限集合的基数,那么根据这个定义我们就能得到以上的结论。 但本题相当于重新定义了基数的小于等于关系,并且适用于无穷。然后在这个定义下去证明结论。

  • 正向:如果 A 的基数小于等于 B, 那么根据前提可知存在一个 A->B 的单射函数 f,根据命题 3.6.14 第 4 条 #(f(A))=#(A), 而根据象的定义, f(A) 它一定是 B 的子集,根据命题 3.6.14 第 3) 条,#(f(A))<=f(B), 因此 #(A)<=#(B)
  • 反向:如果 #(A)<=#(B), 假设分别为 m, n, 那么有 m<=n ,根据定义,存在一个双射函数 h:A->{1..m} ,同样存在一个双射函数 g:{1..n}->B 。

    现在构造一个函数 f:A->B, 对所有 A 中元素 f(a)=g(h(a)):

    • 该函数是定义良好的,因为 h(a) 的值都在 1 到 n 之间,因此 g(h(a)) 均存在。
    • 该函数是单射的,因为对于任意两个 A 中的不同元素 a1,a2, h(a1)!=h(a2), 因此 g(h(a1))!=g(h(a2))

    因此 A 到 B 存在一个单射函数 f

练习 3.6.8: 从单射到满射

设 A 和 B 是集合,并且存在一个从 A 到 B 的单射 f: A → B(即 A 的基数小于或等 于 B 的基数)。证明:存在一个从 B 到 A 的满射 g : B → A

这里的核心在于 A B 可以都是无穷集合,因此不能把将其规约到 #(A)<=#(B) 的场景。

如果 A 是空集,那么空函数是单射,

f 是单射的话,每个元素 a 都有对应的 B 中元素 f(a), 且 f(a) 只有唯一的逆 a, 因此构造一个函数 g, 对每个在 B 中元素 b,如果 In(b, f(A)), 那么 g(b)=a, 否则 g(b)=

练习 3.6.9: A|B A&B 基的关系

设 A 和 B 是有限集,证明: A|B 和 A&B 也是有限集,并且 #(A)+#(B)=#(A|B)+#(A&B)。

根据命题 3.6.14, A|B 是有限集,同时 A&B 是 A|B 的子集,因此也是有限集。

  • A|B 可以拆分成三个不相交的子集: A-B, A&B, B-A
  • A 可以拆分成两个不相交的子集: A-B, A&B
  • B 可以拆分成两个不相交的子集: B-A, A&B

根据命题 3.6.14:

#(A)+#(B)=#(A-B)+#(B-A)+#(A&B)+#(A&B)=#(A|B)+#(A&B)

练习 3.6.10: 抽屉原理

I={1…n}, A[1]…A[n] 都是有限集,满足 #(u(A[I]))>n, 则 I 中存在 i 使得 #(A[i])>=2

反证法,如果所有 A[i] 基数都小于或等于 1, 那么根据命题 3.6.14 第二条,应用 n 次之后 #(u(A[I]))<=1+…+1<=n, 与前提矛盾。

8 可数和不可数集合

定义 8.1.1 可数集

集合 X 是可数无限的(或简称为可数的),当且仅当 X 与自然数集 N 有相等的基数。集合 X 是至多可数的,当且仅当 X 是可数的或 X 是有限的。如果一个集合是无限的并且不是可数的,那么我们称该集合是不可数的。

练习 8.1.1:

设 X 是一个集合,证明:X 是无限集,当且仅当存在 X 的一个真子集 Y 与 X 具有相同的基数。(本题要用到选择公理和公理 8.1。)

命题 8.1.4 良序原理

任意一个元素为自然数的非空集合 X 都有一个最小元素,记为 min(X)

这句话需要翻译成数理逻辑的描述:

设 X 是自然数集 N 的一个非空子集,那么恰好存在一个属于 X 的元素 n,使得对所有的属于 X 的 m 都有 n<=m.

最终可以翻译成伪代码(唯一性很长,在此省略):

Subeq(X, N)->E(n)A(m)[In(n,X)&In(m,X)&n<=m]

练习 8.1.2 良序原理的证明

对于有限自然数集合,用归纳法证明其有最小值:

  • X 基数为 1 的时候,由于只有一个元素,因此它就是最小元素
  • 假设 X 基数为 n 的时候,存在最小元素
  • X 基数为 n+1 的时候,可以把 X 写成 X'|{x}, 根据 命题 3.6.14(a), X' 的基数是 n, 因此它有最小元素,假设是 y, 如果 x<y, X 就最小元素 y, 否则有 x, 因此总有最小元素。

对于无限自然数集合,用反证法,从集合中选择一个数 a[0], 由于集合没有最小值,因此给定 a[0] (以及任意自然数)存在一个比 a[0] 小的数,记为 a[1], 如此归纳,X 中存在一个无穷递降的序列,但如果存在某个无穷递降的自然数序列,那么可以用归纳法证明,对任意自然数 k, 序列中所有元素都大于或等于 k

  • k=0 时, a[n]>=0 对任意 n 恒成立,因为所有自然数都是大于等于 0
  • 现假设,序列中所有元素都大于等于 k,那么选择任意 n ,有 a[n]>a[n++]>=k, 这意味着 a[n]>=k++
  • 因此对所有自然数 k 和 n, a[n]>=k, 但 a[0] 是一个自然数,所以 a[1]>=a[0] 也成立,与递降序列定义矛盾,因此不可能有这样的序列,所以无限自然数集合必然也有最小值

如果是整数和有理数都不成立,比如整数集合 {x<0} 或者有理数集合 {x>0}

命题 8.1.5 自然数无限子集是可数的

设 X 是自然数集 N 的一个无限子集,那么存在唯一一个递增的双射 f : N →X,这里递增指的是对所有的 n ∈N 都有f(n + 1) > f(n)。特别地,X 与N 具有相等的基数,所以 X 是可数的。

实际就是对任何自然数集的无限子集,可以对它排序,然后用自然数 0,1,2… 作为下标,构成了一个一一映射,因此任何自然数的无限子集都是可数无穷,那么任何自然数的子集(包括有限和无限)都是最多可数的。

8.1.3: 证明自然数无限子集和自然数集基数相同

由于有最小值,因此每次选择最小值并删除,如此递归,可以把集合”有序化“,得到一个序列 a[0],a[1]..

这里形式化的写法是递归性的: a[n] := min{In(x,X) : 对所有的 m < n 均有 x!=a[m]}

根据良序原理,min 操作只作用在非空集合,因此要说明集合 X[n]={In(x,X) : 对所有的 m < n 均有 x!=a[m]} 是非空。可以直接证明 X[n] 是无限的(因此是非空的),这是因为 “对所有的 m < n 均有 x!=a[m]" 排除的是一个有限数量的元素(即 n 个元素),而对于无限集合,删除掉有限个元素仍然是无限的,如果是有限的,那么根据 命题 3.6.14(b), 两个有限集合的并仍然是有限的, 这会导致矛盾。

由于集合 X[n] 是通过分离公理从 X 构造的,因此对每个自然数 n, X[n] 都是 X 的子集,而 a[n] 是 X[n] 中元素,因此也是 X 中的元素。 序列 a[0],a[1]… 是递增的,因为 a[0] 是 X (也是记为 X[0]) 中最小值,所以对所有 n!=0, a[0]<a[n], 这也包括 a[1], 同理 a[1] 是 X[1] 中最小的,那么 a[1] 小于 X[1] 中所有元素,这包括 a[2], 归纳可以证明所有 a[i]<a[i+1]

因此 f(n)=a[n] 就是一个从自然数 N 到集合 X 的递增映射,强调递增是因为这可以说明该映射是双射的:

  • 单射证明: 给定任何 m!=n, 不失一般性假设 m<n,根据序的传递性 a[m]<a[n], 因此二者不相等。该映射同样是
  • 满射证明: 用反证法,假设 X 中有某个元素没有被 f 映射,那么对于所有 n, a[n]!=x, 否则 a[n] 中的 n 直接就是定义域中的原象。可以用归纳法证明一个导致矛盾的奇怪现象: 对所有 n, x 都在 X[n] 中
    • 当 n=0 的时候 x[0]=X, 而 x 根据定义就是 X 的元素,因此成立
    • 现假设 x 在 X[n] 中,由于 a[n] 是集合 X[n] 的最小值,而 a[n]!=x, 因此 x 被筛选到了 X[n+1] 中
    • 这就说明了,对所有 n, x 都在 X[n] 中,那么对所有 n, x>=a[n], 但由于 a[0:] 是一个无限递增序列,因此继续用归纳法可以证明对任意 n, a[n]>=n:
      • n=0 时,a[0]>=0 根据自然数定义成立
      • 假设 a[n]>=n, 那么有 a[n]++>=n++, 由于 a[n++]>a[n], 因此 a[n++]>=a[n]++>=n++
    • 这意味着,对所有 n, x>=n, 这会推导出 x>=x+1, 导致矛盾

因此 f(n)=a[n] 是双射,那么 X 和自然数集的基数相同,这实际已经得到了想要的结论。

可以继续证明这个递增双射是唯一的递增双射(显然还有乱序的双射),但这部分不再此记录

这可以得到推论 8.1.6: 自然数集的所有子集都是至多可数的。

继而得到更多关于至多可数集的性质:

推论 8.1.7: 可数集子集是最多可数的

如果 X 是一个至多可数的集合,并且 Y 是 X 的一个子集,那么 Y 也是至多可数的。

命题 8.1.8: 自然数集的像至多可数

练习 8.1.4: 设 Y 是一个集合,并且设 f : N -> Y 是一个函数,那么 f(N) 是至多可数的。

如果 f 是单射,那么取 N 到 f(N) 就是一一映射,f(N) 就是可数的。

如果 f 不是单射,意味着对于 f(N) 中任意一个点 y,它可能有一个或者多个逆象,这是一个非空集合 ~f({y}),根据良序原理,从每个 ~f(y) 集合里选择出最小值构成集合 A, A 和 f(N) 就是一一映射,由于 A 是 N 的子集,根据推论 8.1.6: 自然数集的所有子集都是至多可数的,因此 A 是至多可数的,f(N) 从而也是至多可数。

以上是高层思路,现在要将其写成能被数理逻辑语言表达的形态,核心是如何能以集合的方式定义出 A, 根据书本的提示,A 实际可以写成 {In(n, N): 对所有 0<=m<n 都有 f(m)!=f(n)}, 可以证明把 f 限制在 A 到 f(N) 上的映射是一一映射

  • 单射:m, n 是 A 中不同元素,要证明 f(m)!=f(n),不失一般性假设 m<n,根据 A 的定义就可知 f(n) 不可能等于 f(m)
  • 满射:首先 f 如果限制在 A 到 f(A) 上,根据象的定义,它肯定是满射,现在我们证明 f(A)=f(N), 由于 A 是 N 的一个子集,因此根据象的定义有 f(A) 是 f(N) 的子集,于是要证明的是,任意在 f(N) 中的元素 y 也在 f(A) 中, 假设是某个自然数 n0 对应的 f(n0) 不在 f(A) 中,那么 n0 不在 A 中,即“对所有 0<=m<n0 都有 f(m)!=f(n0)” 并不成立(n0 一定不等于 0, 因为 0<=m<n 是假,导致这是空推断,因此 0 一定在 A 中),这意味着存在某个 0<=m0<n0 使得 f(m0)==f(n0) ,因此 m0 必须也不在 A 中,而以此可以归纳会得到一个无穷递降的自然数序列,这是不可能的。 因此 f(A)=f(N)

推论 8.1.9: 可数集映射的像是至多可数

练习 8.1.5: 设 X 是一个可数集,并且设 f : X -> Y 是一个函数,那么 f(X) 是至多可数的。

X 是可数集,那么 X 和 N 之间存在一个双射,记为 g, 它的逆 ~g 也是双射。可以构造一个 N 到 Y 的函数 h, 对任意自然数 i, h(i)=f(~g(i)), f(X) 就等于 h(N), 因为任何属于 h(N) 的元素 y, 假设它的某个逆象是 i, 那么 f(N) 集合中都可以到该元素 y=f(~g(i)) 反过来也类似, 根据命题 8.1.8, h(N) 是至多可数的,因此 f(N) 也是至多可数的。

练习 8.1.7: 单射和可数性

设 A 是集合,证明:A 是至多可数的,当且仅当存在从 A 到 N 的单射 f: A -> N。

  • 先证明如果 A 是至多可数,那么存在从 A 到 N 的单射

    如果 A 是有限的且基为 n,那么根据有限的定义,它本身就能和 {1,2,…n} 构成双射,把后者扩充到整个 N 不影响其单射性质。如果 A 是可数的,那么根据定义它可以建立到 N 的双射,也是单射。

  • 证明如果那么存在从 A 到 N 的单射, 那么 A 是至多可数

    如果 A 到 N 有单射 f, 那么 A 到 f(A) 的映射就是双射,而 f(A) 是 N 的子集,根据推论 8.1.7, 至多可数集合的子集也是至多可数,因此 A 是至多可数

练习 8.1.7: 命题 8.1.10

设 X 是一个可数集,并且设 Y 也是一个可数集,那么 X|Y 是可数集。

根据可数集性质,假设 f:N->X, g:N->Y 都是双射,那么构造 h:N->X|Y,对任意自然数 n, h(2n)=f(n), h(2n+1)=g(n)

根据推论 8.1.9, h(N) 是至多可数的,如果证明了 h 是满射,这样 h(N) 就等于 X|Y, 但 X,Y 都是可数,X|Y 不可能是有限的,因此 X|Y 。

h 是满射的证明:对任意 X|Y 中的元素 z,根据并集定义,它要么属于 X, 要么属于 Y, 如果属于 X, 那么由于 f 的双射性质,存在 n 使得 f(n)=z, 那么它在 h 中对应的逆象是 2n, 同理如果属于 Y 也能找到对应的逆象,因此 h 是满射。

推论 8.1.15 有理数集 Q 是可数的

证明思路是:

  • 整数是自然数和自然数取反后的并集构成,根据命题 8.1.10 (X, Y 都是可数集,那么 X|Y 是可数集),整数集合 Z 就是可数的。(推论 8.1.11)

    也可以直接写一个具体的 N 到 Z 的双射,比如对任意 n,f(2n)=n, f(2n+1)=-(n+1)

  • 根据定义,有理数集合 Q 可以写成形式差 x//y 其中 x 是任意整数, y 是非 0 整数,因此它和笛卡尔积 Zx(Z-{0}) 形成了一个双射。
  • 因此如果可以证明可数集 X,Y 的笛卡尔积 XxY 也是可数的(推论 8.1.14),由于 Z 是可数的,Z-{0} 也是可数的(如果是有限的,根据基数算术,Z 就是有限的了),那么 Q 就是可数的。

    注意这种方式让我们可以直接避免去具体找一个从有理数集 Q 到自然数的双射,这很困难(要跳过大量等价类里的元素)。 因此尽管向上进入更抽象的层面,但得到了更简单的证明。

  • 要证明可数集 X,Y 的笛卡尔积也是可数,需要先证明自然数的笛卡尔积是可数的(推论 8.1.13)
  • 类似寻找 Q 到 N 的双射是困难的,找 N 到 N 的笛卡尔积的双射也较为复杂(几何上,需要给平面第一象限里所有自然数点对标上下标,但 x,y 两个维度都是无限的,直接双重 for 循环会失效,需要技巧设计折线去遍历,但这在代数上很不好写), 于是先证明集合 A := {In((n, m), N × N): 0<=m<=n} 是可数的 (引理8.1.12),这是第一象限里 y=x 和 x=0 之间的所有自然数点对,由于对于每个 x 坐标 n, y 坐标 m 都上限(m<=n),因此双重 for 循环很好写:

    countable = []
    for x in itertools.count():
        for y in range(x):
            countable.append((x,y))
    

    8.1.14: 两个可数集的笛卡尔积也是可数

    X, Y 是可数集,证明 XxY 也是可数

    根据推理 8.1.13, NxN 是可数的,由于 X,Y 是可数的,因此假设 f:X->N, g:Y->N 都是双射,可以构造一个函数 h:XxY->NxN, h(x,y)=(f(x),f(y)), h 是单射的,因为对于 (x,y)!=(x',y'), 要么 x!=x', 要么 y!=y', 这会对应 f(x)!=f(x') 或 f(y)!=f(y') 。h 是满射的,对任意自然数对 (m,n), 由于 f,g 的单射性质,可以找到对应的 (x,y). 因此 XxY 是可数的。

不可数集

用对角线法则可以证明实数的某个子集是不可数的, 这里选择的子集是 0.011010… 形式的,也就是在 0 到 1 之间,且每个数字位只包括 0 和 1, 将这个集合记为 B 。

假设用一个变量名来表示 a=0.011010…, 那么引入索引 i, a[i] 表示小数点后第 i 个数(从 0 开始),因此 a[0]=0, a[1]=1, a[2]=1…

为什么要选这种子集呢?因为它有一个很好的性质,即如果两个序列中某位不同,那么这两个数是不同的,这个性质对于没有约束的十进制表示数就不成立,比如

0.10000....
0.09999....

是相等的。

此外, 0.011010… 不是二进制表示,如果是二进制,那么以下两个数是也是相同的

0.10000....
0.01111....

但十进制下二者不同,核心在于,对于某个这种形式的数 a, a[i] 一旦翻转,它的变化量是 \( 10^{-i-1} \) ,而对所有 j>i, 它们最大的翻转变化量不会超过 \( 0.2*10^{-i-1} \), 无法弥补最高位的翻转。

假设 B 是可数的,那么存在一个双射函数 f:N->B, 假设自然数 i 对应的数是 f(i), 其第 i 位记成 f(i)[i]

那么对每个 f(i)[i] 翻转(0 变成 1, 1 变成 0),会得到一个新的数,而这个不等于这个集合中的任何数,但这个数有满足集合 B 中元素的形式,因此导致了矛盾。

因此 B 不是可数的(记为不可数),由于 B 是实数集的子集,如果实数是可数的,那么根据 推论 8.1.7, B 也是至多可数的,但这导致了矛盾,因此实数也是不可数的。

对角线法则在计算机科学里的应用可以参考 图灵机上的编程语言、解释器和应用

radioLinkPopups

如对本文有任何疑问,欢迎通过 github issue 邮件 metaescape at foxmail dot com 进行反馈