預告

讀完本文,你將會瞭解 ZF 公理集合論的前三個公理——“存在公理”、“外延公理”以及“分離公理模式”,並用它們解決羅素悖論,以及定義空集。

前言

我們常聽到“集合論是現代數學的基礎”這樣的說法。在很多人看來,中學所學的集合論就是一些集合和簡單的運算,怎麼會是基礎呢?要理解這一點,我們必須瞭解集合論是如何公理化的。

自歐幾裡得《幾何原本》以來,公理化的觀念深入人心。公理化的意義無需贅言。微積分的公理化解決瞭第二次數學危機(貝克萊對牛頓微積分中“無窮小”的責難);集合論的公理化則解決瞭第三次數學危機。然而,與古希臘的那種傳統公理化方式不同,現代數學的公理化脫離瞭自然語言,而建立於符號語言上。為什麼要這樣做?

在弗朗西斯·培根的偶像理論中,“市場偶像(Idol of the market place)”描述瞭自然語言的模糊性和歧義性所導致的假象。這是追求嚴謹性的數學應該避免的。第三次數學危機使人們意識到,用自然語言描述數學對象是危險的。無論你的自然語言看似多麼密不透風,也有可能給謬誤以可乘之機。

解決這個問題的唯一辦法,就是拋棄自然語言,轉而使用符號語言。這些符號語言構成現代邏輯學的公理系統。研究這些符號語言的學科就叫做數理邏輯。

本文旨在梳理人們是如何利用符號語言,將現代數學建立在集合論的基礎之上的。因此,在介紹公理集合論之前,我們需要介紹數理邏輯,以及最基本的兩種邏輯系統:命題邏輯系統和一階邏輯系統。

數理邏輯簡介

自然語言之所以存在漏洞,一部分是因為,它是由人的心智創造並解讀的。而人的心智“不是白板(tabula rasa)”。由於隱含的扭曲,它不是一個完美的能夠完全接受世界中形象的平面,而是一個彎曲的鏡子。換言之,人的心智天生就容易被欺騙。

符號語言之所以取得成功,就是因為它脫離瞭人的心智,隻留下瞭形式化的規則。理論上,計算機也可以使用這樣的語言進行推理,而不會出錯。這是因為,符號語言沒有模糊性和多義性,一切都是嚴格確定的。我們隻需以適當的方式確定組織符號的規則,使得從它們出發,就可以重建我們所熟悉的數學。這樣一來,數學就建立在瞭堅實的基礎上,絕不可能出錯。在這樣嚴密的審視之下,我們不會留給“羅素悖論”這類謬誤以任何可乘之機。

那麼這些符號規則從哪來?答案是數理邏輯。正如我們希望用集合論公理決定“如何定義新的集合是合法的”,數理邏輯決定“符號如何構成公式(也就是一串符號)是合法的”。本質上,數學中的定義,定理,證明,在底層都是一串串符號,正如計算機的底層都是1和0。

像 “p→p” 這樣顯然的邏輯規則,在數理邏輯中是需要證明的。你可能覺得從語義上可以直接看出這一點,但我們現在希望從語法的角度,而非語義的角度,去研究各種各樣的式子以及它們的合法性。

更具體地說,語義學負責研究人類的心智如何闡釋(Interpret)一串符號,或者說一串符號如何借助人類的心智來指稱現實世界的各種實體。但數理邏輯研究的並不是語義,而是語法。語法的作用,正如前文所說,是判斷“符號如何構成公式(也就是一串符號)是合法的”。換句話說,語法指的是我們用符號來生成公式(也就是一串符號)的規則。為瞭建立堅實的符號語言系統,我們應該單獨研究語法。這就是數理邏輯的初衷。

數理邏輯是關於邏輯的學科,而不是“關於數學和物理的邏輯”。數理邏輯是一門已經發展成熟的學科。集合論建立在數理邏輯中的一階邏輯的基礎之上。

命題邏輯

neg a 表示“並非 a ”。如果 a 是真的,那麼 neg a 是假的,反之亦然。換言之, neg 的真值表為

a T F
¬a F T

a vee b 表示“ ab ”。

a wedge b 表示“ ab ”,它等價於“ neg(neg avee neg b) ”。它們的真值表是容易寫出的(請讀者寫出)。

arightarrow b 表示“若 ab ”,或“ a 蘊涵 b ”。它的真值表如下

a→b a ¬a
b T T
¬b F T

定義 aleftrightarrow b(arightarrow b)wedge(brightarrow a)

命題邏輯的公理系統包括四個部分:符號庫、形成規則、公理、推演規則(見選讀 3)。我們在這裡不必深究命題邏輯系統如何導出那些顯然的邏輯規則(在命題邏輯的公理系統中,像 p→p 這樣顯然的公式是需要證明的)。我們隻需要知道:我們的符號和邏輯的基礎是堅實的。如果你實在很擔心這一點,可以先學習數理邏輯,再學習公理集合論。

一階邏輯

以上介紹的 {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 negvarphi(x) ”,即“不存在不滿足 varphi(x)x”。

可見,量詞隻需要 exists 就充足瞭, forall 可以用 exists 表示出來。

下面是一些簡單的訓練,它們將進一步幫助你熟悉一階邏輯系統——公理集合論的符號語言。

1) forall x(xin Arightarrow varphi(x)) 可以簡寫成 forall xin A, varphi(x) 。它表示“對於 A 中的所有 x ,都有 varphi(x) ”。

2) forall x(xin Aleftrightarrow varphi(x)) 表示“對於 A 中的所有 x ,都有 varphi(x) ,並且,滿足 varphi(x)x 都屬於 A ”。換言之, A 中有且僅有那些滿足性質 varphi 的元素。

3) exists x(xin A wedge varphi(x)) 可以簡寫成 exists xin A, varphi(x) ,它表示“在 A 中存在某個 x ,使得 varphi(x) ”。

限於篇幅,本文隻介紹瞭命題邏輯的公理系統(見選讀 4),不再介紹一階邏輯的公理系統。

羅素悖論

我們在中學所學的集合的定義,無非就是“一些元素所構成的整體”,並且還要定義一些性質:

確定性(一個對象要麼屬於集合 A ,要麼不屬於 A),

無序性(改變元素次序不改變集合),以及

互異性(集合中的任意兩個元素不相同)。

這三個性質看似確定瞭集合的概念。然而,從現代數學的觀點看來,它們隻不過是樸素且漏洞百出的自然語言。它們沒有說明集合是如何可能的,以及如何合法地定義新的集合等問題。

為瞭充分說明這一點,我們來看看羅素悖論。定義一個這樣的集合

B={x|xnotin x}

即 B 是全體“不屬於自己的集合”所構成的集合。這個對象沒有為樸素集合論所禁止,但卻是災難性的。

現在問一個簡單的問題:B 屬於自己嗎?如果 B 屬於自己,那麼按照 B 的定義,B 就不屬於自己,如果 B 不屬於自己,那麼根據定義,B 就屬於自己。於是我們得到瞭“p當且僅當非p”,這違反瞭排中律。這就是羅素悖論。

(此處的悖論特指邏輯學意義上的悖論,即“p當且僅當非p”)

這樣的對象應當被禁止,可是樸素集合論卻沒有禁止它。換言之,樸素集合論是“不一致的”。不一致的系統是沒有用的,因為你可以從“p 當且僅當非 p”證明任意命題,證明如下

能推出一切命題的理論顯然是無用的。所以人們要重新建立集合論。

我們之所以先介紹羅素悖論,是為瞭讓讀者感受到自然語言被取代的必要性。在接下來對集合論進行公理化的技術細節中,我們會解決羅素悖論,從而讓讀者體會到符號語言代替自然語言的重大意義。

本體論承諾(ZF0: 存在公理)

在上一節中,我們看到瞭 B={x|xnotin x} 是一個不合法的定義。新的集合論應該要避免這個問題。如何避免?既然問題出在定義上,那我們可以從根源下手,用一套公理來確定定義新集合的規則,這樣,當我們定義新集合的時候,隻要看它有沒有按照這些公理來進行即可。換言之,公理是我們定義新集合的唯一依據。

要從已有的集合定義新的集合,首先我們得有一個集合。因此我們的第一個公理叫做“存在公理”:

它表明,存在一個集合。

別笑!如果我們隻有一些由集合生成集合的規則,卻沒有一個集合可以用,那麼數學宇宙就會是一無所有的。“巧婦難為無米之炊”,存在公理不是個玩笑。

當我們用符號去指稱一個實體之前,我們總是假設瞭有一個實體是存在的。關於對實體的存在性的承諾就叫做本體論承諾。

這是一個不錯的開始,因為這是我們第一次完全使用抽象符號,而不是說出“集合是一些元素所構成的整體”之類的自然語言。

實際上,存在公理可以由其他公理導出,但是為瞭學習的方便,我們暫且將它作為第“零”個公理,之後在適當的時機拋棄它。它其實就是個腳手架,當建築建造完以後,它就會被拆除。

你可能註意到瞭“ x=x ”是一句廢話。為什麼要這麼做?因為根據公理系統的符號規則,“ exists x ”後面得跟上一些東西。由於我們隻是想表達“存在一個集合”,所以後面隻要跟上一個真命題即可。

你可能還註意到瞭 x 隻不過是一個符號,公式 exists x(x=x) 本身並沒有表明它是一個“集合”,萬一它是個數字呢?別急,到目前為止,數字還沒有定義,因為我們把集合論當作基礎。從基礎出發意味著我們需要忘掉數學中的其他一切事物。

你可以想象這樣一幅畫面:數學的世界剛剛誕生,幾乎空無一物,隻有一個叫做“一階邏輯”的星球漂浮於其中,上面有一些取之不盡的原料(符號庫),地基(公理)以及一些符號規則(形成規則和推演規則)。然而,漫無目的地用規則不斷生成新的公式(一串符號)是沒有用的。我們需要創造出一些公理,從而讓這些符號組織成一些有用的東西。這些最初的公理就是集合論的公理。後面我們會看到數字也是用集合定義的。

符號“ x ”隻是個“東西”,隻不過我們把這個東西叫做集合。而本質上,建立在集合論上的一切數學對象都是集合:數字“ 3 ”是個集合,有序對 (1,2) 也是個集合……隻不過當一個集合有瞭新的結構,我們會給它取上新的名字,比如“整數”、“有序對”、“環”、“概率空間”、“代數”等。如果你現在感到很詫異,沒關系,後面我們會理解這一點。

你也可以這麼理解,計算機上最復雜的軟件,在底層都不過是 1 和 0,隻是它們擁有復雜的組織和結構罷瞭。

現在我們已經有瞭一個公理。公理是不能被證明的東西,而是數學宇宙的上帝(也就是數學傢們)憑空創造的。繼續豐富我們的數學宇宙吧。

加入屬於號(ZF1: 外延公理)

在創造新的集合之前,我們還要定義如何判定兩個集合相等:

它表明:如果 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: 分離公理模式)

到目前為止我們仍然沒有一個確切的集合可以用,因為存在公理隻是說明存在一個集合,並沒有告訴我們關於這個集合的更多信息。當然,我們可以記這個存在的集合為 A,然後以它為原料來創造新的集合。但還有更好的做法,也就是定義一個空集作為原料。這樣我們至少確切地知道這個原料是什麼。

然而,從目前的公理,我們是定義不出空集的。我們還需要一個公理:

之所以叫它分離公理模式(Axiom Schema),是因為 varphi(x) 代表瞭任何一串(與 x 有關的)合法符號,也就是說,這一條公理包含瞭無數多條公理。下面我們就將其簡稱為分離公理。

分離公理的意義是,給定任意一個集合 A,我們可以依據性質 varphi ,將A中所有滿足 varphi 的對象分離出來,構成一個新的集合。我們記這個新的集合為 B={xin A|varphi(x)}

終於,我們有瞭第一個構造性公理。構造性公理指的是從舊的集合構造出新的集合的規則。

當然,隻知道這樣的規則沒有用,我們得先有一個“舊的集合”。幸好,由存在公理知道,我們至少是有一個“舊的集合”可以用的。

註意!我們通常所寫的 B={x|varphi(x)} ,在目前看來是不合法的,因為它並不是從已有的集合得到的,而是直接規定瞭一個性質 varphi ,並憑空地抽取瞭全體滿足 varphi 的元素,來構成一個集合。這實際上不是集合,而是一個“類”(Class)。它就是導致羅素悖論的罪魁禍首!羅素悖論就是憑空抽取瞭全體滿足“不屬於自己”這個性質的元素來構成集合。這是錯誤的。這樣做隻能構成一個類,而不是一個集合。

存在公理斷言存在一個集合,接下來我們就用分離公理構造一個確切的集合——空集。

根據存在公理,存在一個集合 X (雖然我們不知道它具體是什麼),再根據分離公理,{xin X|xneq x} 是一個集合。

假命題 xneq x 可以推出 xin X ,當然也可以推出 xin Yxin Z 等,而 XYZ 有可能是不同的集合。也就是說這樣的集合可能有很多個,但下面我們要用外延公理證明這些集合是相等的。

A= {xin X|xneq x} ,B= {xin Y |xneq x} 。其中 XY 是任意集合。我們隻需要證明 A=B

根據外延公理:forall A forall B(forall x(x in Aleftrightarrow x in B)rightarrow A=B) 。可見我們隻需要檢查對於任意 ABforall u(u in Aleftrightarrow u in B) 是否成立。

實際上,由於 A= {xin X|xneq x} ,故對於任意 xxin A 都是假的(否則會導出矛盾式 xneq x )。而假命題可以推出一切命題,因此 x in Arightarrow x in B

(註意,x in Arightarrow x in B 為真並不代表 xin A 為真)

我們剛剛證明瞭 forall x (x in Arightarrow x in B) ,而用同樣的理由也可以證明 forall x (x in Brightarrow x in A) ,所以 forall x (x in Bleftrightarrow x in A) ,從而 A=B

這樣一來,我們就證明瞭{xin X|xneq x} 是唯一的,也就是說,它與 X 具體是什麼無關。我們將這個唯一確定的集合記作 emptyset ,稱為空集。

從上述分析中可以發現,空集不包含任何東西,因為對於任意 xxin emptyset 都是假命題。

註意到我們沒有用“空集不包含任何東西”這樣的自然語言來定義空集,而是先用公理來定義空集,再證明“空集不包含任何東西”。這是形式公理化代替自然語言的一個體現。

我們現在終於有瞭一塊磚頭,接下來我們可以用空集這塊磚頭,去搭建更多的集合。不過在那之前,我們可以先把羅素悖論解決瞭。

羅素悖論的解決

回想一下羅素悖論是怎麼產生的。我們先是定義瞭B={x|xnotin x} ,並推出瞭 Bin Brightarrow Bnotin B 以及 Bin Bleftarrow Bnotin B ,從而引起瞭矛盾。為瞭解決羅素悖論,我們隻需要使它們其中一個不成立即可。我們將要使後者不成立。推導如下:

這樣我們就解決瞭羅素悖論,即集合 B 不屬於自身,僅此而已,沒有矛盾發生。

如果你覺得這一切發生的太快,我下面再用更自然的語言描述一遍。本來我們是憑空地用性質“不屬於自己”來定義一個集合 B,而分離公理模式告訴我們這樣做不行。這就是問題的關鍵!我們必須要從一個已有的集合 A 分離出新的集合B,而 A 被證明是不含有元素 B 的,從而“B不屬於自己”不能推出“B屬於自己”。註意到從“B不屬於B”推出“B屬於B”還需要一個條件,就是“B屬於A”。

再換句話說,羅素悖論的關鍵在於“自我指代”,而分離公理消除瞭“自我指代”的可能。B 指代的隻有 A 中的元素,而不是任何元素都能被 B 的定義指代。

以上的分析還證明瞭,對於任何一個集合 A ,總有一個集合B={xin A|xnotin x} 不屬於 A (根據(3))。因此,所有集合構成的集合是不存在的,或者說,包含一切的集合是不存在的。

中場休息

本文介紹瞭集合論公理系統的前三個公理——“存在公理”、“外延公理”以及“分離公理模式”,並用它們解決瞭羅素悖論,以及建造瞭我們的第一個集合——空集。

在下篇文章中,我們會介紹更多的公理,並用它們來創造一些數學對象,比如自然數。

存在公理可以由後面的“無窮公理”導出,但是為瞭學習的方便,有時候先將其作為第“零”個公理,之後再將其剔除。實際上隻有 9 個公理,它們分別是

ZF1 外延公理

ZF2 分離公理模式

ZF3 對集公理

ZF4 並集公理

ZF5 冪集公理

ZF6 無窮公理(可以導出存在公理)

ZF7 正則公理

ZF8 替換公理模式

ZF9 選擇公理

前八個公理構成所謂的“ZF”公理系統,再加上選擇公理就構成“ZFC公理系統”。“Z”和“F”提出者姓名的首字母,“C”則代表“Axiom of Choice”——選擇公理。

本篇文章的續集: