公理集合论基础(上):空集和罗素悖论
预告
读完本文,你将会了解 ZF 公理集合论的前三个公理——“存在公理”、“外延公理”以及“分离公理模式”,并用它们解决罗素悖论,以及定义空集。
前言
我们常听到“集合论是现代数学的基础”这样的说法。在很多人看来,中学所学的集合论就是一些集合和简单的运算,怎么会是基础呢?要理解这一点,我们必须了解集合论是如何公理化的。
自欧几里得《几何原本》以来,公理化的观念深入人心。公理化的意义无需赘言。微积分的公理化解决了第二次数学危机(贝克莱对牛顿微积分中“无穷小”的责难);集合论的公理化则解决了第三次数学危机。然而,与古希腊的那种传统公理化方式不同,现代数学的公理化脱离了自然语言,而建立于符号语言上。为什么要这样做?
在弗朗西斯·培根的偶像理论中,“市场偶像(Idol of the market place)”描述了自然语言的模糊性和歧义性所导致的假象。这是追求严谨性的数学应该避免的。第三次数学危机使人们意识到,用自然语言描述数学对象是危险的。无论你的自然语言看似多么密不透风,也有可能给谬误以可乘之机。
解决这个问题的唯一办法,就是抛弃自然语言,转而使用符号语言。这些符号语言构成现代逻辑学的公理系统。研究这些符号语言的学科就叫做数理逻辑(Mathematical logic)。
本文旨在梳理人们是如何利用符号语言,将现代数学建立在集合论的基础之上的。因此,在介绍公理集合论之前,我们需要介绍数理逻辑,以及最基本的两种逻辑系统:命题逻辑(Propositional Logic)系统和一阶逻辑(First-Order Logic)系统。
数理逻辑简介
自然语言之所以存在漏洞,一部分是因为,它是由人的心智创造并解读的。而人的心智“不是白板(tabula rasa)”。由于隐含的扭曲,它不是一个完美的能够完全接受世界中形象的平面,而是一个弯曲的镜子。换言之,人的心智天生就容易被欺骗。
符号语言之所以取得成功,就是因为它脱离了人的心智,只留下了形式化的规则。理论上,计算机也可以使用这样的语言进行推理,而不会出错。这是因为,符号语言没有模糊性和多义性,一切都是严格确定的。我们只需以适当的方式确定组织符号的规则,使得从它们出发,就可以重建我们所熟悉的数学。这样一来,数学就建立在了坚实的基础上,绝不可能出错。在这样严密的审视之下,我们不会留给“罗素悖论”这类谬误以任何可乘之机。
那么这些符号规则从哪来?答案是数理逻辑。**正如我们希望用集合论公理决定“如何定义新的集合是合法的”,数理逻辑决定“符号如何构成公式(也就是一串符号)是合法的”。**本质上,数学中的定义,定理,证明,在底层都是一串串符号,正如计算机的底层都是1和0。
像 “p→p” 这样显然的逻辑规则,在数理逻辑中是需要证明的。你可能觉得从语义上可以直接看出这一点,但我们现在希望从语法的角度,而非语义的角度,去研究各种各样的式子以及它们的合法性。
更具体地说,语义学负责研究人类的心智如何阐释(Interpret)一串符号,或者说一串符号如何借助人类的心智来指称现实世界的各种实体。但数理逻辑研究的并不是语义,而是语法。语法的作用,正如前文所说,是判断**“符号如何构成公式(也就是一串符号)是合法的”**。换句话说,语法指的是我们用符号来生成公式(也就是一串符号)的规则。为了建立坚实的符号语言系统,我们应该单独研究语法。这就是数理逻辑的初衷。
**数理逻辑是关于逻辑的学科,而不是“关于数学和物理的逻辑”。**数理逻辑是一门已经发展成熟的学科。集合论就建立在数理逻辑中的一阶逻辑的基础之上。
命题逻辑
\(\neg a\) 表示“并非 \(a\) ”。如果 \(a\) 是真的,那么 \(\neg a\) 是假的,反之亦然。换言之, \(\neg\) 的真值表为
| a | T | F |
| ¬a | F | T |
其中 T 表示真(True),F 表示假(False)。
\(a \vee b\) 表示“ \(a\) 或 \(b\) ”。
\(a \wedge b\) 表示“ \(a\) 且 \(b\) ”,它等价于“ \(\neg(\neg a\vee \neg b)\) ”。它们的真值表是很容易的。
\(a\rightarrow b\) 表示“若 \(a\) 则 \(b\) ”,或“ \(a\) 蕴涵 \(b\) ”。它的真值表如下
| a→b | a | ¬a |
| b | T | T |
| ¬b | F | T |
“a”那一列不难理解:真命题能推出真命题,不能推出假命题。而“¬a**”那一列似乎表明“假命题蕴涵一切命题”。为什么要这么规定?**详情可见:
另外,在后文的各种例子中,读者也可以体会到为什么要规定“假命题蕴涵一切命题”。
【选读 1】“ \(a\rightarrow b\) ”等价于“ \((\neg a)\vee b\) ”,为了看出这一点,你只需要把四种情况代入真值表验证。
具体来说,当 \(a\) 为真的时候, \(\neg a\) 为假,那么“ \((\neg a)\vee b\) ”的真值就取决于 \(b\) 。当 \(a\) 为假的时候,\(\neg a\) 为真,那么不论 \(b\) 的真值如何,“ \((\neg a)\vee b\) ”都是真的。可见,“ \(a\rightarrow b\) ”与“ \((\neg a)\vee b\) ”的真值表相同。
定义 \(a\leftrightarrow b\) 为 \((a\rightarrow b)\wedge(b\rightarrow a)\) 。
【选读 2】可以看出,我们只需要 \(\{\neg,\vee\}\) 就可以得到所有命题联结词 \(\{\neg,\wedge,\vee,\rightarrow, \leftrightarrow \}\) 。前者叫做命题联结词的充足集。\(\{\neg,\rightarrow\}\) 、\(\{\neg,\wedge\}\) 等也是命题联结词的充足集。
命题逻辑的公理系统包括四个部分:符号库、形成规则、公理、推演规则(见选读 3)。我们在这里不必深究命题逻辑系统如何导出那些显然的逻辑规则(在命题逻辑的公理系统中,像 p→p 这样显然的公式是需要证明的)。我们只需要知道:我们的符号和逻辑的基础是坚实的。如果你实在很担心这一点,可以先学习数理逻辑,再学习公理集合论。
【选读 3】命题逻辑的公理系统 L
- 命题逻辑的公理系统包括四个部分:符号库、形成规则、公理、推演规则
命题逻辑公理系统 L 的符号库为 p1, p2, …, ¬, →, (, ) 注意最后两个符号是括号。
之所以没有 ∧ 和 ∨ 等符号,是因为它们可以用 ¬ 和 → 表示出来(见选读 1 和 2)。
一切语句都应当用符号库中的符号组成。但这也不意味着随机组成的一串符号,如((p1→,是合法的。为了组成合法的语句,我们还需要有形成规则。
- 公理系统 L 的形成规则有两个:(¬A) 以及 (A→B)。
它们表示什么样的公式(符号序列)是符合语法的。
注意,A 和 B 不是符号库中的符号,它们表示任意公式。公式是指一串符号组成的序列。
例如,我们可以先用第二个规则生成 (p1→p2),再用第一个规则生成 (¬p3),最后由第二个规则生成 ((¬p3)→(p1→p2)),这在语法上是一个合法的公式。
- 公理系统 L 的三个公理为
L1: (A→(B→A))
L2: ((A→(B→C))→((A→B)→(A→C)))
L3: (((¬B)→(¬A))→(A→B))它们负责将公理系统 L 与古典逻辑联系起来。由这些公理,我们可以导出推演出古典逻辑中的所有公式。当然,我们还没有定义什么是推演。这就引出了下面要介绍的推演规则。
- 公理系统的推演规则: 由 A 和 A→B 可以推演出 B。它又叫分离规则。推演规则告诉我们如何证明新的公式。注意,证明和蕴涵是两个不同的概念。
综上所述,公理系统 L 由符号库、形成规则、公理、推演规则组成。
下面我们来证明 p→p。
根据公理 L1: (p→((p→p)→p))
根据公理 L2: ((p→((p→p)→p))→((p→(p→p))→(p→p)))
根据推演规则: ((p→(p→p))→(p→p))
再根据公理 L1: (p→(p→p))
根据推演规则: (p→p),证毕为什么不把 (p→p) 这样简单且符合直觉的公式当做公理?公理不应该是自明之理吗?这是因为从 L1, L2, L3, 我们可以推出所有古典逻辑公式(这里还未包括一阶逻辑),并且 L1, L2, L3 之间没有任何的交叉与冗余。换句话说,这样做可以使公理的数目最少。
再换言之,我们不是要把“符合直觉”的东西当做公理,而是尽量把少的东西当做公理。公理越简洁越好。
到此为止,我们介绍了命题逻辑的一个公理系统 L。
一阶逻辑
以上介绍的 \(\{\neg,\wedge,\vee,\rightarrow, \leftrightarrow \}\) 叫做命题联结词,它们加上形成规则、公理、推演规则,可以构成一个命题逻辑系统。接下来我们看看量词。命题逻辑系统加上量词及其相关的规则和公理,就成为了一个一阶逻辑系统。
\(\exists x(\varphi(x))\) 表示“存在 \(x\) 满足 \(\varphi(x)\) ”,其中 \(\varphi(x)\) 是 \(x\) 的一个性质。
\(\forall x(\varphi(x))\) 表示“对任意 \(x\) 都有 \(\varphi(x)\) ”。它等价于“ \(\neg \exists x \neg\varphi(x)\) ”,即“不存在不满足 \(\varphi(x)\) 的 \(x\)”。
可见,量词只需要 \(\exists\) 就充足了, \(\forall\) 可以用 \(\exists\) 表示出来。
下面是一些简单的训练,它们将进一步帮助你熟悉一阶逻辑系统——公理集合论的符号语言。
\(\forall x(x\in A\rightarrow \varphi(x))\) 可以简写成 \(\forall x\in A, \varphi(x)\) 。它表示“对于 \(A\) 中的所有 \(x\) ,都有 \(\varphi(x)\) ”。
\(\forall x(x\in A\leftrightarrow \varphi(x))\) 表示“对于 \(A\) 中的所有 \(x\) ,都有 \(\varphi(x)\) ,并且,满足 \(\varphi(x)\) 的 \(x\) 都属于 \(A\) ”。换言之, \(A\) 中有且仅有那些满足性质 \(\varphi\) 的元素。
\(\exists x(x\in A \wedge \varphi(x))\) 可以简写成 \(\exists x\in A, \varphi(x)\) ,它表示“在 \(A\) 中存在某个 \(x\) ,使得 \(\varphi(x)\) ”。
【选读4】**注意将 1) 与 3) 对比!**在 3) 中,不可以把“ \(\wedge\) ”换成“ \(\rightarrow\) ”,写成 \(\exists x(x\in A \rightarrow \varphi(x))\) 。
这是因为,如果存在一个不属于 \(A\) 的 \(x\) (这实际上是必然的,因为我们后面将会证明,不存在包含一切的集合),那么 \(x\in A\) 就是假的。而假命题蕴涵一切(见命题逻辑),那么它也就可以推出 \(\varphi(x)\) 。于是这个式子的意思就是“只要 \(x\) 不属于 \(A\) ,它就满足 \(\varphi\) ”,这不是我们的本意。
那么,为什么 1) 中使用符号“ \(\rightarrow\) ”而不是“ \(\wedge\) ”呢?
先来看为什么使用“ \(\rightarrow\) ”。量词“ \(\forall\) ”意味着要取遍所有的 \(x\),我们分 \(x\in A\) 和 \(x\notin A\) 两种情况讨论。
一方面,如果 \(x\) 属于 \(A\) ,那么 \(x\in A\) 就是真的,为了使 \(x\in A \rightarrow \varphi(x)\) 为真,根据真值表,我们只能要求 \(\varphi(x)\) 为真;
另一方面,如果 \(x\) 不属于 \(A\) ,那么 \(x\in A\) 就是假的,根据真值表,假命题可以推出任何命题,所以 \(x\in A \rightarrow \varphi(x)\) 是真的,即在这个情况下,它没有告诉我们更多信息。
综合以上两种情况,我们得出结论: \(x\in A \rightarrow \varphi(x)\) 为真,当且仅当“对于 \(A\) 中的所有 \(x\) ,都有 \(\varphi(x)\)”。这正是我们想表达的意思!
从以上分析中,你可以体会到规定“假命题蕴涵一切命题”的好处。
为什么在 1) 中不能把“ \(\rightarrow\) ”换成“ \(\wedge\) ”?这是因为,如果 \(x\) 不属于 \(A\),那么 \(x\in A \wedge \varphi(x)\) 一定是假的。量词“ \(\forall\) ”意味着要取遍所有的 \(x\) ,而总有一些 \(x\) 是不属于 \(A\) 的。因此, \(\forall x(x\in A\wedge \varphi(x))\) 是一个恒为假的命题,没有什么用处。
**1) 2) 3) 这三个例子值得琢磨。如果充分理解它们,之后将会事半功倍。**如果你不想分析它们,也可以“take for granted”,记住它们对应的意思。
限于篇幅,本文只介绍了命题逻辑的公理系统(见选读 4),不再介绍一阶逻辑的公理系统。
罗素悖论
我们在中学所学的集合的定义,无非就是“一些元素所构成的整体”,并且还要定义一些性质:
确定性(一个对象要么属于集合 A ,要么不属于 A),
无序性(改变元素次序不改变集合),以及
互异性(集合中的任意两个元素不相同)。
这三个性质看似确定了集合的概念。然而,从现代数学的观点看来,它们只不过是朴素且漏洞百出的自然语言。它们没有说明集合是如何可能的,以及如何合法地定义新的集合等问题。
为了充分说明这一点,我们来看看罗素悖论。定义一个这样的集合
\[B=\{x|x\notin x\}\]即 B 是全体“不属于自己的集合”所构成的集合。这个对象没有为朴素集合论所禁止,但却是灾难性的。
现在问一个简单的问题:B 属于自己吗?如果 B 属于自己,那么按照 B 的定义,B 就不属于自己,如果 B 不属于自己,那么根据定义,B 就属于自己。于是我们得到了“p当且仅当非p”,这违反了排中律。这就是罗素悖论。
(此处的悖论特指逻辑学意义上的悖论,即“p当且仅当非p”)
这样的对象应当被禁止,可是朴素集合论却没有禁止它。换言之,朴素集合论是“不一致的”。不一致的系统是没有用的,因为你可以从“p 当且仅当非 p”证明任意命题,证明如下
p → p ∨ q
(p ∨ q) ∧ (¬p) → q
所以 (p ∧ ¬p) → q当然,在这个证明中,我们省略了很多步骤,因为我们还没有推导公理系统 L (见选读 3)中的更多定理。追求刨根问底的读者可以尝试用公理系统 L 给出完整的证明。这里,我们暂且接受它。
能推出一切命题的理论显然是无用的。所以人们要重新建立集合论。
我们之所以先介绍罗素悖论,是为了让读者感受到自然语言被取代的必要性。在接下来对集合论进行公理化的技术细节中,我们会解决罗素悖论,从而让读者体会到符号语言代替自然语言的重大意义。
本体论承诺(ZF0: 存在公理,Axiom of Existence)
在上一节中,我们看到了 \(B=\{x|x\notin x\}\) 是一个不合法的定义。新的集合论应该要避免这个问题。如何避免?既然问题出在定义上,那我们可以从根源下手,用一套公理来确定定义新集合的规则,这样,当我们定义新集合的时候,只要看它有没有按照这些公理来进行即可。换言之,公理是我们定义新集合的唯一依据。
要从已有的集合定义新的集合,首先我们得有一个集合。因此我们的第一个公理叫做“存在公理”:
存在公理: \(\exists x(x=x)\)
它表明,存在一个集合。
别笑!如果我们只有一些由集合生成集合的规则,却没有一个集合可以用,那么数学宇宙就会是一无所有的。“巧妇难为无米之炊”,存在公理不是个玩笑。
当我们用符号去指称一个实体之前,我们总是假设了有一个实体是存在的。关于对实体的存在性的承诺就叫做本体论承诺。
这是一个不错的开始,因为这是我们第一次完全使用抽象符号,而不是说出“集合是一些元素所构成的整体”之类的自然语言。
实际上,存在公理可以由其他公理导出,但是为了学习的方便,我们暂且将它作为第“零”个公理,之后在适当的时机抛弃它。它其实就是个脚手架,当建筑建造完以后,它就会被拆除。
你可能注意到了“ \(x=x\) ”是一句废话。为什么要这么做?因为根据公理系统的符号规则,“ \(\exists x\) ”后面得跟上一些东西。由于我们只是想表达“存在一个集合”,所以后面只要跟上一个真命题即可。
你可能还注意到了 \(x\) 只不过是一个符号,公式 \(\exists x(x=x)\) 本身并没有表明它是一个“集合”,万一它是个数字呢?别急,到目前为止,数字还没有定义,因为我们把集合论当作基础。从基础出发意味着我们需要忘掉数学中的其他一切事物。
你可以想象这样一幅画面:数学的世界刚刚诞生,几乎空无一物,只有一个叫做“一阶逻辑”的星球漂浮于其中,上面有一些取之不尽的原料(符号库),地基(公理)以及一些符号规则(形成规则和推演规则)。然而,漫无目的地用规则不断生成新的公式(一串符号)是没有用的。我们需要创造出一些公理,从而让这些符号组织成一些有用的东西。这些最初的公理就是集合论的公理。后面我们会看到数字也是用集合定义的。
符号“ \(x\) ”只是个“东西”,只不过我们把这个东西叫做集合。而本质上,建立在集合论上的一切数学对象都是集合:数字“ \(3\) ”是个集合,有序对 \((1,2)\) 也是个集合……只不过当一个集合有了新的结构,我们会给它取上新的名字,比如“整数”、“有序对”、“环”、“概率空间”、“代数”等。如果你现在感到很诧异,没关系,后面我们会理解这一点。
你也可以这么理解,计算机上最复杂的软件,在底层都不过是 1 和 0,只是它们拥有复杂的组织和结构罢了。
现在我们已经有了一个公理。公理是不能被证明的东西,而是数学宇宙的上帝(也就是数学家们)凭空创造的。继续丰富我们的数学宇宙吧。
加入属于号(ZF1: 外延公理,Axiom of Extensionality)
在创造新的集合之前,我们还要定义如何判定两个集合相等:
外延公理: \(\forall A \forall B(\forall x(x \in A\leftrightarrow x \in B)\rightarrow A=B)\)
它表明:如果 A 中的每个元素都属于 B,且 B 中的每个元素都属于 A,那么 A 和 B 相等。
等等,我们还没有定义“ \(\in\) ”是什么!没关系,在数理逻辑中我们有一个符号库,像“ \(\forall\) ”、“ \(\exists\) ”、甚至括号“ \((\) ”这样的符号都在这个符号库中,我们只需要往符号库中加入一个新的符号“ \(\in\) ”表示某种二元关系即可(“ \(\notin\) ”可以用“ \(\in\) ”和“ \(\neg\) ”等符号来定义)。注意,符号库本身没有对符号做出任何规定和解释,给符号赋予结构和意义的是与之相关的公理。
需要强调,“ \(\in\) ”只代表一种二元关系,人们会把“ \(\in\) ”前面的对象想成是“被含有的东西”,后面的对象想成是“含有了一些东西的东西”,但是对于“ \(\in\) ”来说,它前后的东西没有什么不同,都是某种“东西”。而“ \(\in\) ”自己也不过是一个遵循某种规则的谓词而已。我们现在要习惯用忘掉一切的方式去思考,正如笛卡尔所做的那样。
这个公理的意义在于,它确定了符号“ \(\in\) ”的第一个性质:相等。如果每个与 A 发生了“ \(\in\) ”关系的对象都同样与 B 发生了“ \(\in\) ”关系,且反之亦然,则我们说 A 和 B “相等”。
回到正题,注意到这个公理是如何蕴含了所谓的“确定性”、“无序性”和“互异性”。实际上,根据符号规则(这里我们没有列出),集合 \(\{x,x,y\}\) 是一个合法的公式,只不过根据外延公理,它和 \(\{x,y\}\) 相等罢了(\(\{x,x,y\}\) 中的每个元素都属于\(\{x,y\}\),反之亦然)。我们可以把所有和 \(\{x,y\}\) 相等的集合都记作 \(\{x,y\}\) 。这就是所谓的互异性;而无序性就更简单了,符号规则本身就没有对顺序做出任何规定,对集合内部的元素而言,唯一有用的信息就是二元关系“ \(\in\) ”,并没有别的符号规定其他的关系,比如序关系(那是我们以后要定义的);最后,确定性也是被蕴含的,因为这显然被逻辑学的基本规则(排中律)所确定了。可见我们根本就不需要用“互异性”之类的自然语言。
空集(ZF2: 分离公理模式,Axiom Schema of Separation)
到目前为止我们仍然没有一个确切的集合可以用,因为存在公理只是说明存在一个集合,并没有告诉我们关于这个集合的更多信息。当然,我们可以记这个存在的集合为 A,然后以它为原料来创造新的集合。但还有更好的做法,也就是定义一个空集作为原料。这样我们至少确切地知道这个原料是什么。
然而,从目前的公理,我们是定义不出空集的。我们还需要一个公理:
分离公理模式: \(\forall A \exists B \forall x(x\in B\leftrightarrow x\in A \wedge \varphi(x))\)
之所以叫它分离公理模式(Axiom Schema),是因为 \(\varphi(x)\) 代表了任何一串(与 x 有关的)合法符号,也就是说,这一条公理包含了无数多条公理。下面我们就将其简称为分离公理。
分离公理的意义是,给定任意一个集合 A,我们可以依据性质 \(\varphi\) ,将A中所有满足 \(\varphi\) 的对象分离出来,构成一个新的集合。我们记这个新的集合为 \(B=\{x\in A|\varphi(x)\}\) 。
终于,我们有了第一个构造性公理。构造性公理指的是从旧的集合构造出新的集合的规则。
当然,只知道这样的规则没有用,我们得先有一个“旧的集合”。幸好,由存在公理知道,我们至少是有一个“旧的集合”可以用的。
注意!我们通常所写的 \(B=\{x|\varphi(x)\}\) ,在目前看来是不合法的,因为它并不是从已有的集合得到的,而是直接规定了一个性质 \(\varphi\) ,并凭空地抽取了全体满足 \(\varphi\) 的元素,来构成一个集合。**这实际上不是集合,而是一个“类”(Class)。它就是导致罗素悖论的罪魁祸首!**罗素悖论就是凭空抽取了全体满足“不属于自己”这个性质的元素来构成集合。这是错误的。这样做只能构成一个类,而不是一个集合。
存在公理断言存在一个集合,接下来我们就用分离公理构造一个确切的集合——空集。
根据存在公理,存在一个集合 \(X\) (虽然我们不知道它具体是什么),再根据分离公理,\(\{x\in X|x\neq x\}\) 是一个集合。
假命题 \(x\neq x\) 可以推出 \(x\in X\) ,当然也可以推出 \(x\in Y\) , \(x\in Z\) 等,而 \(X\) , \(Y\) , \(Z\) 有可能是不同的集合。也就是说这样的集合可能有很多个,但下面我们要用外延公理证明这些集合是相等的。
记\(A= \{x\in X|x\neq x\} ,B= \{x\in Y |x\neq x\} \) 。其中 \(X\) 和 \(Y\) 是任意集合。我们只需要证明 \(A=B\) 。
根据外延公理:\(\forall A \forall B(\forall x(x \in A\leftrightarrow x \in B)\rightarrow A=B)\) 。可见我们只需要检查对于任意 \(A\) 和 \(B\) ,\(\forall u(u \in A\leftrightarrow u \in B)\) 是否成立。
实际上,由于 \(A= \{x\in X|x\neq x\}\) ,故对于任意 \(x\) , \(x\in A\) 都是假的(否则会导出矛盾式 \(x\neq x\) )。而假命题可以推出一切命题,因此 \(x \in A\rightarrow x \in B\) 。
(注意,\(x \in A\rightarrow x \in B\) 为真并不代表 \(x\in A\) 为真)
我们刚刚证明了 \(\forall x (x \in A\rightarrow x \in B)\) ,而用同样的理由也可以证明 \(\forall x (x \in B\rightarrow x \in A)\) ,所以 \(\forall x (x \in B\leftrightarrow x \in A)\) ,从而 \(A=B\) 。
这样一来,我们就证明了\(\{x\in X|x\neq x\}\) 是唯一的,也就是说,它与 \(X\) 具体是什么无关。我们将这个唯一确定的集合记作 \(\emptyset\) ,称为空集。
从上述分析中可以发现,空集不包含任何东西,因为对于任意 \(x\) , \(x\in \emptyset \) 都是假命题。
**注意到我们没有用“空集不包含任何东西”这样的自然语言来定义空集,而是先用公理来定义空集,再证明“空集不包含任何东西”。**这是形式公理化代替自然语言的一个体现。
我们现在终于有了一块砖头,接下来我们可以用空集这块砖头,去搭建更多的集合。不过在那之前,我们可以先把罗素悖论解决了。
也有其他版本的集合论公理系统会把“空集公理”作为一个公理,它断言:存在空集。而在我们的版本里,空集公理可以从存在公理+分离公理模式推导出来。
罗素悖论的解决
回想一下罗素悖论是怎么产生的。我们先是定义了\(B=\{x|x\notin x\}\) ,并推出了 \(B\in B\rightarrow B\notin B\) 以及 \(B\in B\leftarrow B\notin B\) ,从而引起了矛盾。**为了解决罗素悖论,我们只需要使它们其中一个不成立即可。我们将要使后者不成立。**推导如下:
(1) 根据分离公理,可以定义 \(B=\{x\in A|x\notin x\}\) 。称 \(x\notin x\) 为性质 \(\varphi\) 。
(2) 假设 \(B\in B\) ,则根据 \(B\) 的定义, \(B\) 满足性质 \(\varphi\) ,即 \(B\notin B\) ,矛盾!所以只能有 \(B\notin B\) 。
(3) 接下来我们证明 \(B\notin A\) 。我们用反证法。假设 \(B\in A\) 。
一方面,根据 (2), \(B\notin B\) ,即 \(B\) 满足性质 \(\varphi\) 。
另一方面,根据我们的假设,有 \(B\in A\) 。
所以 B 属于 A 且 B 满足性质 \(\varphi\) 。根据 \(B\) 的定义, \(B\in B\) ,这与(2)矛盾!所以 \(B\notin A\) 。既然 \(B\notin A\) ,那么 \(B\notin B\) 就不能推出 \(B\in B\) 。
这样我们就解决了罗素悖论,即集合 \(B\) 不属于自身,仅此而已,没有矛盾发生。
如果你觉得这一切发生的太快,我下面再用更自然的语言描述一遍**。本来我们是凭空地用性质“不属于自己”来定义一个集合 B,而分离公理模式告诉我们这样做不行。这就是问题的关键!我们必须要从一个已有的集合 A 分离出新的集合B,而 A 被证明是不含有元素 B 的,从而“B不属于自己”不能推出“B属于自己”。注意到从“B不属于B”推出“B属于B”还需要一个条件,就是“B属于A”。**
再换句话说,罗素悖论的关键在于“自我指代”,而分离公理消除了“自我指代”的可能。B 指代的只有 A 中的元素,而不是任何元素都能被 B 的定义指代。
以上的分析还证明了,对于任何一个集合 \(A\) ,总有一个集合 \(B=\{x\in A|x\notin x\}\) 不属于 \(A\) (根据(3))。因此,所有集合构成的集合是不存在的,或者说,包含一切的集合是不存在的。
中场休息
本文介绍了集合论公理系统的前三个公理——“存在公理”、“外延公理”以及“分离公理模式”,并用它们解决了罗素悖论,以及建造了我们的第一个集合——空集。
在下篇文章中,我们会介绍更多的公理,并用它们来创造一些数学对象,比如自然数。
存在公理可以由后面的“无穷公理”导出,但是为了学习的方便,有时候先将其作为第“零”个公理,之后再将其剔除。实际上只有 9 个公理,它们分别是
ZF1 外延公理
ZF2 分离公理模式
ZF3 对集公理
ZF4 并集公理
ZF5 幂集公理
ZF6 无穷公理(可以导出存在公理)
ZF7 正则公理
ZF8 替换公理模式
ZF9 选择公理
前八个公理构成所谓的“ZF”公理系统,再加上选择公理就构成“ZFC公理系统”。“Z”和“F”提出者姓名的首字母,“C”则代表“Axiom of Choice”——选择公理。
本篇文章的续集: