型別系統和邏輯

banq發表於2015-01-04
電腦科學領域中一個重要成就是:型別理論type theory對應於一個特別的邏輯系統。Type systems and logic一文以Haskell語言為例詳細介紹了其中細節:

那麼這種對應到底是怎樣的?其基本思想來自於Curry-Howard Correspondence. 一個型別被解釋為一個命題proposition, 而一個值被解釋為一個命題的證明proof, 大部分標準邏輯連線詞都來自於這個思想。

舉例來說:(A, B)的一對型別的值是型別A和B值的一對, 這意思是:它們是A和B的證明的一對,那就意味著(A, B)代表了邏輯連線詞“A && B”.

同樣類似,邏輯分離詞disjunction (“A | | B”)代表一個所謂“標籤聯合tagged union”型別: A B兩者中任何一個的值(證明) 是A的值(證明)或者是B的值(證明)。

類似 Int 和 String型別都是命題 – 你能認為像這些簡單型別只是代表某種陳述:也就是“一個 Int存在” 或 “一個String存在”. 1是Int的證明, 而 "hands"是 String的證明. (Int, String) 是一個簡單型別組, 陳述的是 “有存在一個Int和有存在一個String”,(1, "hands")是 (Int, String)的證明。

如果你不熟悉Haskell,Either型別會更加神秘一些, 型別Either a b 代表包含一個型別值出現在Either的左邊,而型別b的值出現在Either的右邊. 所以,Either Int String 意味著“可能存在一個Int或存在一個String”, 它被可能左邊的1 或右邊的"hands"證明了. 這種左右標籤確保你在出現兩個同樣型別時,不會丟失任何資訊。

如果兩個型別相同,如:Either Int Int能被左邊的1 或者右邊的1證明, 這可以從它們彼此標籤位置來進行區分。

當你思考蘊涵邏輯implication時會更加有趣. 函式的型別是轉換型別A的值 (證明) 到型別B的值 (證明) ,也就是A -> B. 這意味著一個函式是也一個證明,這個證明代表:無論什麼時候有一個A的證明,你都能得到B的證明,“如果A是真,那麼B是真”(“if A is true, then B is true.”) ,這樣函式是一種代表關係的蘊涵邏輯的證明。

有一件事比較奇怪,代表“not A”的命題是使用型別 A -> ⊥, 這裡字元“ ⊥ ”被稱為一個空型別,所謂空型別也就是沒有值的型別,(型別的符號來自於數學,它通常代表明確的 “bottom.”含義), A -> Void可以被讀作:“如果我們有一個A, 我們能用它做些不存在的事情” –相對“我們並沒有一個A”,這有一個很大的延伸,這好像是一種否定句,但是有一個問題: 在經典邏輯中,否定是可逆的reversible. 你能說“not (not A),” 經典邏輯認為那等同於說“A.”

看來經典邏輯是正確的 – 如果A不是假, 它一定是真, 對嗎? 但是如果我們使用 A -> Void 作為否定的定義, 我們通常的直覺和經典邏輯規則就Hold不住了,一個型別(A -> Void) -> Void的值並不會讓你得到一個 型別A的值,雙否定不等同於正肯定了,這意味著什麼?

這裡其實代表了正規化切換,.型別系統並不對應經典邏輯, 而是對應一種稱為“constructive logic(構造邏輯)”. 這個正規化切換是這樣:我們從思考一個事物是否是真, 切換到我們是否能夠證明它們,更重要的是,我們不再考慮是否存在等量化詞(existential quantifications ),除非它被一個案例證明。

我們不能透過矛盾contradiction來證明, (比如:“至少肯定存在一個藍色的事物,因為如果沒有,那麼我們就有矛盾了”). 相反,如果我們展示某個事物一些屬性的存在,我們就能夠發現這個事物,(“至少肯定存在一個事物,這個細節已經表明”). 只要我們記住我們的邏輯模型是可證明的,而不是單純的真理(banq注:單純的真理代表灌輸:我就是比你強,我說的話就是真理,沒有我就沒有你們,這些都是單純的真理,你只要記住就可以,無需知道如何證明它們,它們是怎麼得出的)。

讓我們重新考慮“not (not A)”這個案例,在構造邏輯constructive logic中 , 一個 A -> Void的證明, 或者 “not A,”的證明,是一個機制,其將獲取一個 A,不能做任何事,返回了命題"false"的證明,如果你有一個實際的假false的證明 (比如如果你既有一個 A 和一個 A -> Void 同時滿足), 那就很壞: 在大多數邏輯中,你能用這個不可能逐個證明其他任何事,所有陳述都是等同,它們都是true且false。如果你將邏輯自身作為一個小宇宙,那麼在那裡邏輯規則就是物理規律,那麼你可以說一個假false的證明會摧毀這個小宇宙,將黑洞會吸入整個宇宙到一個單點。

那麼,回到not A. 大部分我們感興趣的邏輯是“一致性consistent”, 其基本意思是那是不可能摧毀整個宇宙的。那麼, A -> Void 意味著 “如果你給我一個 A, 我會摧毀整個世界” – 也就是說,如果我們用一致性邏輯,我們證明了 A -> Void, 我們知道就不可能證明A. 這樣 A -> Void 似乎只能是我們預期的not A 的意思.

最後,回到雙否定,如果 not A 是 a -> Void, 那麼not (not A)就是 (A -> Void) -> Void, 或者 “如果你給我一個機器,獲得輸入A,並摧毀整個世界,那麼我也將摧毀整個世界.” 但是這其實不會給你一個A,如果你關心一些不可觸及的真理概念,你會肯定將這個概念應用到A,但是以我們構成主義的邏輯來說,我們現在不感興趣真相,我們只感興趣為什麼(As)。

雙否定的離奇怪異來自於排中律(the Law of the Excluded Middle) – 對於任何命題“A”, 或者 “A”是真或者“not A”是真 – 但這並不符合構造邏輯(constructive logic).

當你談論抽象的真理時,很顯然,任何命題要麼是真要麼是假,但是涉及證明時 – 你能建立嗎?你能建立一個沒有任何資訊的盒子,當你輸入一個型別A的值時,它要麼是型別A的值,要麼是一個摧毀世界的機制?至少我不能,許多經典邏輯規則在你只思考“真理”這個抽象概念時是很明顯正確的,但是當我們從“可證明”角度考慮時很顯然沒有意義了。

....

相關文章