一口氣看了圖靈出版社的《羅素的故事》,對於里面的提到的一些問題還是比較有興趣的,聊聊自己所想到的吧
比如邏輯的本質和定義是什么 邏輯的定義:一切新的,決定性的推理,這個有點像演算系統。本質是什么,里面貌似沒有說,我個人理解邏輯的本質就是根據現有規則,進行演算的過程。
羅素悖論
羅素最重要的發現,就是我們聽到的的:羅素悖論
什么羅素悖論:我記得少年包青天里面有一個故事,大概是一個王爺想懲罰包拯,給包拯出了一個題目,說如果包拯猜對了他在想什么,就可以放了他,如果猜錯了,就要懲罰他。包拯就說:王爺想懲罰我。最后王爺沒有懲罰包拯,因為如果包拯猜對了,王爺必須放了他,如果猜錯了,說明王爺沒有想懲罰包拯。
導致羅素悖論的最大問題就是自指性,個人感覺定義一個概念的時候,用到了這個概念本身。比如我們如何定義無窮大數字,可以這么定義:比無窮大還大的數字,但是這個是不合理的,什么是無窮大還是沒有正確的說明。
關於羅素悖論,是從集合論推導出來的,集合的定義是這樣的:所有具有共通屬性的事物的集合
那么集合有兩種性質:所有的集合的集合本身也是一個集合,所有數字的集合不是一個數,在第一種情況下,就包含了自指,就會產生悖論
那我們提出一個問題:所有不包括自身集合所組成的集合是否包含自身?
可以看出,這個是沒有答案的,也就是不可證的。如果這個集合包含自身,那么他就不屬於這樣的集合,如果這個集合不包含自身,那么他應該在這個集合里面
可以用一個形象的例子來說明:假設有這樣一種性質的網頁,這種網頁里面的每一個鏈接所在的域名,都不包含自身所在的域名,比如有一個網頁 http://www.test.com/index.html 這個index.html里面定義的所有超鏈接都不包含test.com 域名。 那我想做一個這種性質的網頁,這個網頁要包含所有這種不包含自身超鏈接的所有網頁,悖論來了,我做的這個網頁到底應不應該包含自己的域名?
如果不包含自身,那么就不滿足我自己的定義,因為我要找出所有這種性質的網頁,我自己本身就具有這種性質,如果包含自身,也不滿足我的定義,因為我定義了我要做一個不包含自身的網頁。
為什么悖論重要
這個悖論為什么這么重要,其實說明了一個重要的問題,基於命題規則的演算系統,本身是不完備的。也就是在這個系統里面,存在一個命題,我們無法證明。
我們初中基礎的歐式幾何就存在這樣的問題,我們來看看歐式幾何的幾個公里
歐式幾何的五條公設是:
1、任意兩個點可以通過一條直線連接。
2、任意線段能無限延伸成一條直線。
3、給定任意線段,可以以其一個端點作為圓心,該線段作為半徑作一個圓。
4、所有直角都全等。
5、若兩條直線都與第三條直線相交,並且在同一邊的內角之和小於兩個直角和,則這兩條直線在這一邊必定相交。
很多數學家都對第五條公里產生質疑,因為這個太復雜了,和前面四條基本公里沒有任何聯系,無法通過前面四個規則推導出來,也就是說,在歐式幾何這一套體系里面,肯定存在一個命題,我們是沒有辦法證明的,也就是他是不完備的。很多數學家根據基本規則,推導出所有確定性的結論,這個是不可能的。
而其他數學家,如黎曼,則通過定義了球面集合的幾個基本公理,也推導出來自包含的非歐式幾何。我們小時候並不了解這個演算和推理過程背后的實質以及存在的問題,直到19世紀與20世紀一批牛逼的邏輯數學家解決了這個問題。
我們可以把這個公理當做基本規則,根據這個規則推導出來的所有命題的過程叫做演算,這樣就形成了一個完整的體系。如果這個基本規則是相同的,那么無論通過何種演算過程推導出來的體系,肯定也是一致性的相容的,也就是說過在A體系里面推導出S命題是正確的,那么在B體系里面,根據相同規則推導出來的S'命題也是正確的。
和編程的關系
說了這么多,貌似和編程一點關系都沒有,但是最近看到 函數式編程,我突然有點受到啟發,怎么說了,函數式編程和這個演算過程很類似,
函數時編程 所定義的 lamda表達式就是一個演算系統,和歐式幾何一樣,先定義一套基本的規則,也就是lamda表達式,這個基本規則,對任何函數式編程都是一樣的。后續的所有計算結果都是基於我們所定義的基本規則進行演算的過程。這一套規則不僅僅可以用來做我們熟悉的編程,還是做任何其他的事情,比如人工智能領域,因為規則和演算過程對於函數式編程語言來說,都是可以自我定義的。但是上面我們介紹了,這一套體系里面肯定會存在有一些命題是無法判定的,那么在函數式編程里面,就存在停機判定問題。
停機問題(halting problem)判斷任意一個程序是否會在有限的時間之內結束運行的問題。如果這個問題可以在有限的時間之內解決,那么就可以有一個程序判斷其本身是否會停機。但是,在程序停止之前,沒有辦法判斷它會不會停止。所以這是一個不可解的問題。
下面來看看問題的證明
假設存在這種算法,我們用下列偽代碼描述:
function halting(func, input) {
return if_func_will_halt_on_input;
}
我們構造另一函數:
function is_halt(func) {
if (halting(func, func)) {
for(;;) //死循環 }
}
接下來,調用:
is_halt(is_halt)
函數is_halt以is_halt為輸入時,到底停機還是不停機? 其實就是羅素悖論,由於自指性,所以存在悖論。
在根據一致性結論,所有編程語言C,java,匯編,.net,lisp,由於都是在同一套規則上推導出來的,所以在邏輯上是等價,也就是說 能夠用C語言實現的功能,都是可以用其他的語言來實現。
扯了這么多,這個也是自己的理解,有一些地方不一定正確,大家就當看看了解而已,之所以想寫這個,只是發現編程的本質真的是數學,程序員應該多了解一些數學知識,數學能夠幫你看到一些本質的問題
