型別系統和邏輯
電腦科學領域中一個重要成就是:型別理論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的值,要麼是一個摧毀世界的機制?至少我不能,許多經典邏輯規則在你只思考“真理”這個抽象概念時是很明顯正確的,但是當我們從“可證明”角度考慮時很顯然沒有意義了。
....
那麼這種對應到底是怎樣的?其基本思想來自於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的值,要麼是一個摧毀世界的機制?至少我不能,許多經典邏輯規則在你只思考“真理”這個抽象概念時是很明顯正確的,但是當我們從“可證明”角度考慮時很顯然沒有意義了。
....
相關文章
- C語言基礎-1、邏輯型別和運算C語言型別
- linux系統掛載邏輯卷和擴充套件邏輯卷組Linux套件
- TypeScript型別系統和基礎型別TypeScript型別
- 檔案系統和邏輯卷的關係
- AIX檔案系統和邏輯卷關係AI
- HP UNIX--檔案系統和邏輯卷管理
- 淺析Win10系統主分割槽和邏輯分割槽的區別Win10
- 系統慢慢變壞的邏輯
- 武器系統邏輯程式碼分析
- 物理standby和邏輯standby的區別
- !和~的區別(邏輯取反和按位取反)
- 分散式系統:Lamport邏輯時鐘分散式LAMP
- 二、python的邏輯運算與資料型別Python資料型別
- Mysql是不是沒有專門的邏輯型別列MySql型別
- 操作型系統和決策支援系統的區別
- 大小公排系統開發邏輯分析
- 什麼是硬碟邏輯損壞和檔案系統錯誤硬碟
- 深度探究MMO社交對話系統(二):聊天系統結構設計和功能邏輯
- TypeScript 型別系統TypeScript型別
- java短路運算子和邏輯運算子的區別Java
- javascript型別系統——布林Boolean型別JavaScript型別Boolean
- javascript型別系統——字串String型別JavaScript型別字串
- 電商後臺系統產品邏輯全解析
- 泰山眾籌阿凡達系統開發模式邏輯模式
- SAP UI5 Currency 資料型別的校驗邏輯分析UI資料型別
- javascript邏輯運算子“||”和“&&”JavaScript
- 業務邏輯漏洞和cs
- AIX 系統建立邏輯卷、新增檔案系統並掛載使用AI
- Free自由協議系統開發原始碼邏輯協議原始碼
- metaforce佛薩奇模式系統開發邏輯分析模式
- 關於量化合約系統開發邏輯demo
- DAPP系統模式開發邏輯(成熟技術)APP模式
- IC卡檔案系統的邏輯結構【轉】
- 程式設計題: 命題邏輯應用系統程式設計
- 使用 AI 進行 - 視覺化 - 業務&系統邏輯AI視覺化
- linux系統下分割槽邏輯卷擴容Linux
- 物聯網學習教程——邏輯運算子和邏輯表示式
- go 如何擴充系統型別或者別人的型別Go型別