「離散數學」是一門什麼樣的學科

寫這篇文章的動機是想探討從離散數學開始入門數理邏輯的路徑以及離散數學與數理邏輯之間的關係。以學習數理邏輯爲目的學習離散數學,而一般的以學習計算機爲目的的學習還是有相當的不同,最大的不同就是:以數理邏輯爲目的的學習,應當以「證明」 — — 形式證明爲目的,這其中包括了關於形式證明的理論 — — 一階理論的句法和語義,以及關於形式證明的實踐 — — 證明框架和策略。學習的中心內容有兩個:「語言」 — — 「 一階語言」;「結構」 — — 數學中關於「結構」的思想、概念、種類、實例以及「結構」和「語言」的關係。

一、離散數學是一門什麼樣的學科?

與數學的主流分支不同,離散數學看上去似乎沒有一個確定的中心話題,內容很龐雜。我曾做過一個粗略的統計,離散數學的內容涉及大約43個左右大大小小不同的話題,從集合、函數、關係、命題邏輯、謂詞邏輯,到算法、計數、數據結構、遞歸、圖論、概率、數論、形式語言與自動機,布爾代數、向量與矩陣,線性規劃、抽象代數,編碼理論、信息論,博弈論、運籌學、理論計算機科學等,真是那句俗話,XXXX是個筐,什麼都可以往裏裝。由於離散數學的內容包括面很廣,一本通常意義上的教科書不可能全部涵蓋,因此我們看到的教科書基本是上述內容集合的不同子集。

那麼到底應當如何定義「離散數學」這門學科呢?如果我們使用集合的語言表達就是:

(1)離散數學 = {x∈數學 | 離散結構(x)}

其中,「離散數學」是「數學」的一個子集,「離散結構」是一個謂詞,x代表任意數學學科。

現在來詳細考察一下這個「離散數學」的定義式。我們的考察,從爲什麼會出現這樣一個學科開始。

首先,離散數學和其它數學分支不同,它並沒有開闢數學的新領域,而是在既有的數學領域劃出一個範圍,以「離散結構」這個性質爲標準,若某個數學內容具有「離散結構」的屬性就劃入。

那爲什麼會出現「離散數學」這門學科呢?回答是 — — 是因爲計算機的出現!!!因爲計算機只能處理「離散」對象。生活中「離散」對象和「連續」對象的例子是大米和水,前者是離散的,後者是連續的,因爲米粒是可列舉的、可數的,英語屬於可數名詞,中文可以用單位量詞「粒」等表示,水是無法列舉的、也是不可數的,因而在英語中屬於不可數名詞,中文則不可直接用單位量詞表示。形象地說,計算機可以處理像米粒這樣的離散對象而無法直接處理像水這樣的連續對象。

例如,我們在計算機屏幕上看到一條光滑的曲線。按照微積分定義,一條光滑曲線在某個區間一定是連續的,因而一定可以找到區間內任意一點的極限。換句話說,在這個區間內你是無法確定一個離散點的確切位置的,因爲在這個區間內,所有的點都是無窮小,而這些無窮小的點的數量是無窮多。但是在計算機的屏幕上就不是那麼回事了,一條曲線無論看上去多麼精細、平滑,一定是由一組固定的、確定的、有限數量的「點」(像素)構成的,否則要是按照極限定義,那條曲線是永遠畫不出來的。也就是說,如果我們要在計算機上處理、表達連續性數據,必須先要把它「離散化」 — — 把無窮小量變成有固定、確定的數值,把連續變成可列舉的、把無窮數量的元素轉換成有限數量的元素。仍然拿「水」作例子,我們需要把「水」這個連續對象變成像「水滴」這樣的離散對象。

如果你是個程序員,那我們把上述的思想變成一個編程任務:在一個實數直角座標系的閉區間[a, b]上定義一條處處連續的曲線,你的任務是寫一段代碼,列舉該區間內所有點的座標值,亦即,列舉下列集合的所有元素

(2){(x, y)∈ R²| 2 ≤ x ≤ 3 ∧ yR }

你將如何做呢?當然是先確定一個循環,從實數2.0到實數3.0。然後找到遞增的臺階。這時你遇到了麻煩,下一個點是什麼?爲什麼?當你腦子裏冒出「下一個」的念頭時,你已經輸了,因爲根據極限定義連續曲線根本就沒有「下一個」這個概念,因爲我永遠可以在你設定的「下一個」之前找到離當前數更近的「下一個」使得你定義的那個「下一個」不再是「下一個」。爲什麼你會有「下一個」這樣的概念,是因爲計算機給你「洗腦」了。

你編寫這段代碼的下一個困難是不知道這個循環什麼時候結束,因爲在[2,3]區間內,有無窮多個實數,換句話說,你的這個循環體永遠不會結束。你的幸運在於你所給定的實數區間是閉區間,如果是開區間,你連從哪裏開始到哪裏結束都無法確定,理由一樣,我永遠可以找到一個比你設定的開始的那個實數更靠近2.0、比你設定的結束的那個實數更靠近3.0的實數。這個任務是無法完成的,因爲這不是一個「可計算的」任務。問題的根源,就在於「離散」與「連續」的矛盾 — — 你試圖用離散的手段解決連續的問題,用有窮的方法解決無窮的問題;其中「無窮」(無窮小量與無窮大的個數)這個概念是阻礙你解決這個問題的「元兇」。

我們知道,歷史上許多數學悖論都是因「無窮」這樣的概念而引發的,因此,希爾伯特曾試圖在自己公理系統中排除「無窮」的概念,而代之以所謂 “finitary”【注】的概念,亦即用一個有窮輸入的概念代替「無窮」這個概念,以便在公理系統中徹底排除悖論的干擾,並將基於這個理念建立的數學公理體系稱作 “finitary mathematics”。這是將數學中連續對象離散化的首次理論嘗試,也是「離散數學」這個概念產生的最基本動機。

上世紀1930年代,布爾巴基學派將整個數學理論進行了重構和形式化,並試圖以「結構」這個概念統一所有的數學分支。自此,「什麼是數學」的定義發生了變化,數學的本質就是對「結構」的研究,而「數」與「形」不過是「結構」概念下的兩個實例而已。

到了現代由於計算機的出現,「離散」的概念從學術走向現實,從科學走向技術,數學對象的離散化成爲刻不容緩的任務。數學家對這一新挑戰的回答是:第一、將現有數學對象根據「結構」的概念以「離散結構」爲標準一分爲二,將具有「離散結構」的對象合稱爲「離散數學」;第二、將劃分的另一半,不屬於「離散結構」的數學對象離散化,由此而產生了一個新的數學分支 — — 計算數學(國內又稱「數值計算方法」)。這就是爲什麼計算機專業的重要課程之二就是離散數學與計算數學。

那麼,什麼樣的數學對象是「離散結構」呢?,按照我們直觀的理解,自然數、整數當然是,除此之外,函數、多項式、向量與矩陣等衆多數學對象也是離散結構,箇中緣由當你掌握了離散數學中的相關內容自然理解。

通過上面的討論,我們就可以大致瞭解(1)的真正含義:在「結構」這個概念下,我們對所有數學對象進行分類,屬於離散結構的數學對象就劃爲「離散數學」。因此,「離散數學」並不是一個獨立的數學分支,而是對數學對象「橫切」、提取公因式所得的一個數學對象集合。這些數學對象本來分屬於它們各自的數學分支,只是由於都具有「離散結構」這個屬性才走到了一起。由此可知,「離散數學」是個開放集,任何具有「離散結構」屬性的數學對象都可以歸爲「離散數學」。

有了上面討論的鋪墊,我們現在心裏對「離散數學到底是什麼」這個問題應當有了明確的答案 — — 研究「離散結構」數學對象的學科。

那到底什麼是「結構」?爲什麼所有數學學科都可以統一在「結構」這個概念下?這就是代數特別是抽象代數要討論的問題。如果你瀏覽過一些數學著作、特別是國外出版的數學著作就會發現,許多嚴肅的作者都會把羣、環、域放在其正文內容的前面,根本原因,是使讀者建立「結構」的概念。因爲只有理解了「結構」的概念,才能理解所有數學對象的共性。

因此從理論上說,學習離散數學應當從什麼是數學結構開始,因爲這個概念不僅是統御離散數學而且是理解所有數學內容的總綱。但是要理解什麼是數學結構,就要先理解描述數學結構的語言 — — 邏輯、集合、函數、關係。從數理邏輯的角度看,整個數學是由兩個部分組成:數學知識的形式化表示 — — 數學結構,與表達數學命題、數學證明的標準語言 — — 一階語言;而表達數學結構、一階語言的基本構件就是集合、函數、關係、命題邏輯與謂詞邏輯語言。用這些構件描述「結構」的基本框架是這樣的:

1. 給出一個數學對象的【集合】,通常是【有限集合】,並描述這個【集合】的基本性質;

2. 定義在這個集合之上元素之間的【關係】,對這些【關係】的表達既可以使用集合意義上的有序「元組」(tuple) 也可以使用邏輯的「謂詞」(predicate);

3. 定義在這個集合上的【運算】以及參加【運算】的元素的個數(又稱作「元」:ary),這就是函數;

4. 定義陳述這個結構公理、定義、定理的【語言】,這就是【一階語言】;

因此我們從「離散數學」入門數理邏輯的中心概念就是:【結構】、【語言】,而學習的最基礎內容是【邏輯】、【集合】、【關係】、【函數】。

數學的標準語言是一階語言,而一階語言本身,也可以當做具有離散結構的數學對象,這就是我們在任何一本離散數學教科書中看到的「命題邏輯」和「謂詞邏輯」的真實面貌。換句話說,離散數學中的邏輯,不是研究推理論證,而是這個邏輯形式化後(弗雷格、羅素)的數學形式。這樣的邏輯,我們關注的不是什麼「思維能力的提高」,而是作爲一種離散的數學結構、它與其它具有離散結構的數學對象的異同,我們都可以用羣環域的概念對這種結構進行研究。作爲初學者,我們所學到的,不是什麼推理論證,而是邏輯式的代數屬性、性質和特徵。因此,我們獲得的知識,是純形式化的知識,沒有語義、只有句法、只有代數。學到這樣的邏輯當然不完整,充其量就是和我們在中學所學的關於自然數、整數和有理數運算規律基本相同的另一種代數,只不過運算對象不再是數而是命題真值而已。

因此歸納而言,離散數學的內容,大致可以分爲三類:

語言類、理論類、實例類。集合、函數、關係、邏輯屬於語言類,因爲這些內容相當數學元語言的基本構件 — — 它們提供了描述數學對象的基本詞彙和語法。羣環域相當於理論歸納,我們通過這部分內容認識、熟悉、掌握關於「結構」 — — 「數學結構」 — — 「代數結構」的概念。由此理解爲什麼所有的數學對象,自己已知的、未知的,都可以用「結構」的概念歸納,形式化。在這個過程中,所有數學對象都可以用邏輯、集合、函數、關係這四個工具在「結構」的概念下得到統一,所有的數學對象、數學分支都不過是「結構」的概念下的具體實例。因此離散數學教科書中的其它內容,都是在講「結構」這個概念下各種不同的實例。對這部分你完全有取捨的自由,可根據你對需要進行選擇。把上面這些歸納一下,離散數學的主要內容包括:

* 語言類:邏輯、集合、關係、函數

* 理論類:代數結構,羣、環、域,同構、同態

* 實例類:剩餘的其它內容。

不過需要注意的是,語言類的內容同樣也是代數結構的實例,亦即,描述數學的語言,亦可以用被描述的數學描述,大部分數學悖論往往產生於這種【元語言】與【對象語言】的混亂中。

二、如何從離散數學入門數理邏輯?

從離散數學開始入門數理邏輯,學習的的重點就是本文一開始提到的:一箇中心,兩個重點。

(3)一箇中心:學習如何規範化地做數學證明,在這個過程中培養提高自己的邏輯思維能力;

(4)兩個重點:

i. 語言:一階語言、集合、函數、關係,這是描述所有數學對象的語言,是數學的「元語言」

ii. 結構:代數結構 — — 數學結構 — — 結構;羣、環、域和同構、同態。

在此基礎上,熟悉和理解教科書中所列舉的其它數學結構的實例。

在上面列舉的學習重點中,語言的學習主要就是集合語言(包括集合、關係、函數)、一階語言(命題邏輯、謂詞邏輯)的的學習,這個學習過程當然包括了理解定義、做習題等內容,但更重要的是運用 — — 通過學習數學證明進一步理解一階語言在數學中的作用,使自己成爲這種語言的熟練使用者。

從數理邏輯的角度,數理邏輯的本質就是從理論的高度研究證明,它的句法、語義、演算規則。而在離散數學的階段,主要是在初步掌握了一階語言後大量的實踐。

學會做證明題的一大標誌是,可以自如地將證明題分別用自然語言(中英語)和一階語言寫出,並可以自如地在二者之間相互翻譯。只有當你充分理解、完全掌握、自如運用一階語言寫出數學證明,你才真正達到了數學的成熟。

「證明」、「語言」、「結構」是學習離散數學的中心內容。

明確了學習的大方向,現在談談學習方法。不過我這裏所說的學習方法並不是常規意義上的如何學習,而是一個原則,那就是:你的學習需要兩種指南:

第一種指南:用非「元語言」式的語言告訴你,你現在學的到底是什麼東西。意思是,不是用數學的語言解釋你所要學的數學對象是什麼。假定你現在要學的是線性代數,那麼什麼是線性代數?這個解釋不應當只是告訴你線性代數就是解線性方程組的學科、是研究線性轉換的學科、是研究向量空間的學科,而是從更高的認知維度、套用一個現在流行術語就是「降維」解釋這個數學對象是什麼。只有通過這樣的指南,你才能獲得你所要學習內容的真正理解。因爲只有在這個維度理解了學習對象,你才能知道所學內容對你認識這個世界有什麼幫助。這種理解是哲學式的、認知式的理解。真正好的指南,是讓我對這個世界、而不僅僅是對數學知識有更深刻的認識和理解,尤其是學習數學,更應當如此。

第二種指南我稱作工作手冊(workbook)或技術手冊 — — 我們的大多數教科書都屬於這個類型 — — 提供技術細節的講解以及相應的練習,學習者通過這樣的指南獲得實際技能的掌握和理解,認識新的技術領域。

不過在現實中,很難找到第一種那樣的指南,尤其是中文資源。這就需要讀者去在各種著作中主動發現,或者在閱讀中自己感悟 — — 要在閱讀中多思考,從過去自己的經驗、從自己知道的別人的經驗中思考。這種思考,不應當僅僅是本學科的,應當是跨學科的,要善於從別的不相關的學科知識、生活經驗感悟目前學習對象的真實「認知」意義。當學完一個學習對象要問自己的就是,通過對這部分知識的學習,我對這個「世界」的哪個部分又有了新的瞭解,而不應當僅僅是我學會了矩陣運算,我弄懂了哥德爾定理。在「豆瓣」本人的閱讀書單上,列舉了一些類似第一指南的英語書籍,也是我近年來關注數學著作的主要基準。

在前面的筆記我曾經說過,數理邏輯實際上是數學哲學的形式化表達 — — 用一階語言的符號表達數學對這個世界的理解。有人說,數學就是一種工具,用來解決現實世界的其它問題。其實,用數學解決其它問題包括了兩個方面:將要解決的問題從自然語言描述翻譯成數學語言,這個過程我們稱之「建模」,利用數學提供的工具、方法解決問題 — — 我們稱之「算法」。

而數理邏輯是用來解決數學本身的問題,爲此而建立的模型就是【代數結構】,利用這個模型提供的工具方法解決問題,我們稱之爲「證明論」。而離散數學則向我們提供瞭解決離散結構數學問題的工具和方法。我們學習離散數學作爲數理邏輯的入門,應當要有這樣的覺悟,而不僅僅停留在知識表面技術細節的理解和掌握。

那麼,應當如何學習?

應當說,我們現在所處的時代是信息過剩、過剩,而不是信息缺乏。我們的問題不是無書可選,而是可選的資源太多而無法決定。因此,我們的學習策略就要適應這樣的時代。我個人的學習方式是:不再以教科書爲單位進行學習,而是以內容、話題爲單位學習。假定我目前正在學習集合論,我就從所有我可以得到的資源中學習,既可以是教科書,也可以是視頻教程、還可以是博客、筆記、社交媒體等等。在這個過程中,我得到的不是一家之言,而是所有人 — — 所有我所及之作者的衆家之言,每個人可能都說了一部分,但是衆家的合集就可以使我得到一個比一家之言更全面的知識和認識,其中我更有可能得到上面所說的第一種指南。

另外需要注意的是,離散數學不是單獨的數學分科,而是各個數學學科的合集,我們選擇學習材料時,切忌只選擇帶「離散數學」標題的,只要你理解了離散數學的本質,你就會發現所有的數學教科書中都有可能包含離散數學的內容,例如大部分數學分析,代數的教科書的前面都包含一些集合,函數,關係和邏輯的內容。因此以主題、話題爲中心,你就可以打破界限利用更多的資源進行學習。

學習的重點是有兩個:理解概念,多做證明。概念的理解,重點應當是上面提到的第一指南意義上的理解,但是如果無法找到這樣的指南,自己也無法體悟,那就要作爲未解決的問題,在繼續進行下一步學習的同時時時關注前一問題的概念性理解。只有在這個層面上理解學習纔算真正完成。

三、目標

學到什麼程度纔算是入門?第一,可以用一階語言讀寫的定義、定理、證明並可以在自然語言與一階語言之間互譯;第二,對結構的概念、羣環域等結構類有深入的理解,熟悉一些典型的離散結構,如、自然數、整數,向量等,對於未知的數學對象能夠用結構的觀點迅速得到其要旨。

達到這個程度,現在市面上的所有的任何程度的數學教科書、數理邏輯教科書對你來說已不再是「天書」,因爲這些書本質上都是用直譯成自然語言的一階語言寫成的關於某個數學結構實例的技術手冊。

學習數理邏輯的終極目的,是使你成爲一個「數學思想者」,數學對你不再是一堆拉丁希臘字母和特殊符號,也不再是一個公式連着另一個公式的推導證明,它是就你的世界觀,數學是你表達哲學理念的最恰當方式。

【注】“finitary”是希爾伯特公理化理論的專用術語,是指一個運算/操作/函數,其輸入值/運算子/參數的數量是可以用一個自然數表達的。

從構詞法上分析,finit- 表示有限,而 -ary,則是像 binary、unary、ternary等,表示謂詞/函數所需的「項」、「參數」,數學、計算機術語是「元」,元組(tuple)的「元」,因此 finitary 直譯應當是「有限元」,但是又和中文的「有限元分析」相沖突,故索性不譯,直接放在這裏。

這種細微而重要的差別,你在讀中文文獻時很難得到,或者是譯者不具備這樣的素養,或者沒有用準確的中文表達出來。本人亦因才疏學淺無法用準確的中文表達finitary的原意,故有此註解。


轉自:

https://medium.com/@learningsuccesssolutions/%E7%A6%BB%E6%95%A3%E6%95%B0%E5%AD%A6-%E6%98%AF%E4%B8%80%E9%97%A8%E4%BB%80%E4%B9%88%E6%A0%B7%E7%9A%84%E5%AD%A6%E7%A7%91-b494a453b036

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章