Girard悖論是什麼?
「帶有所有類型的一個類型(Type : Type)的依賴類型 lambda 演算由於Girard悖論而不是強規範化的」
我來給莎莎喵補充一些理論相關.
0: 什麼是Russell"s paradox?
在公理化集合論中, 對於任意集合 它不能包含自身冪集, 若 , 構造 , 那麼有 . 矛盾.
Cantor"s theorem從一個更弱的條件下構造出悖論.
令 為 至 的映射, 則 不為滿射, 即對於任意集合 均有.
若 為滿射, 構造, 選取使得, 那麼有. 矛盾.
上面的結論簡單來理解即是"所有集合的集合不是集合".
1: 什麼是Lambda cube和Pure type system(PTS)?
要理解Girard"s paradox首先需要理解PTS. 作為PTS的一個非常典型的例子是Lambda cube.
PTS是一個三元組:
- 為類(sorts)集合.
- 為公理(axioms)集合.
- 為規則(rules)集合.
一般將記作.
對於每個, 其對應的標識符名稱(variables)集合為並且滿足不同sorts的名稱不相交即當 有 . 記 .
定義λ-表達式為:
在λ-表達式上的α-等價商集為λ-term定義為:
若其中則記作為, 這裡乘積類型可以看作是蘊涵的一種抽象.
β-規約定義為:
同理可以定義β-多步規約與β-等價.
上下文環境(contexts) 定義為序列的集合:
一般記假設(assumption)為, 其域(domain)定義為.
推導規則如下:
很明顯地, PTS為帶類型λ-calculus的高階抽象. 一個非常典型的例子即是Lambda cube.
理解為所有的合法類型, 其為一個kind(類型的類型), 理解為所有的合法kind.
根據rules的不同組合衍生出的八個λ-calculus系統分別為:
規則的可以理解如下:
- 項依賴於項.
- 類型依賴於項.
- 項依賴於類型.
- 類型依賴於類型.
即是: 為SLTC, 為依值類型(dependent types), 為類型多態, 為高階類型多態.
以上的系統構成了一個包含關係的偏序集, 使用有向圖表示出來即是Lambda cube了.
可以證明的是, 以上所有的系統具有Church-Rosser property且均是強規範化的(strongly normalizing). 即其對應的邏輯系統是一致的(consistent). 如對應的直覺邏輯(Implicational intuitionistic fragment, ), 對應的一階邏輯(First-order minimal logic), 對應的二階邏輯(Second-order intuitionistic logic fragment).
2:那PTS中存不存在非一致的邏輯系統呢?
Girard"s paradox揭示了在PTS中存在這樣的系統, 即.
定義為:
為 添加上這條rule.
為添加上和axiom.
顯然與為與的拓展.
Girard"s paradox: 與非一致.
證明Girard"s paradox的思路類似於Cantor"s theorem, 在類型系統中構造一個與冪集與滿射等價的概念.
使用一個kind代表"集合", 使用代表"冪集". 顯然地有 .
接下來需要一個引理:
其中記作.
則在中有 .
注: 為表達簡略使用的邏輯符號表示乘積類型, 表示與的並(), , 並省略了具體的證明構造, 即表示存在 .
簡略的證明步驟如下:
定義
使用以下記號:
依次證明:
若有, 取即有, 即可得 .
Girard"s paradox: 與中有 .
簡略的證明步驟如下:
構造使得是可居留的, 即存在.
令:
注意與inductive type具有相同的形式.
於是有
那麼顯然是可居留的.
由上面的引理可得 .
注: 留意引理中的構造與Cantor"s theorem的相似性.
由Girard"s paradox可以立即得到推論: 具有axiom與rule的系統不一致, 即 . 構造很簡單, 將以上中的構造里的所有和替換為即可得 .
另外, 不一致的系統不具有強規範性, 理由是所有正規化項具有形式 , 那麼顯然 , 即若由Subject reduction theorem得其不具有正規化項.
3:Type theory perspective
由Girard"s paradox和器推論揭示了在類型系統中類似於集合論有"所有類型的類型不是類型", 否則該系統是不一致即非強規範化的, 由爆炸原理(Ex falso quodlibet)亦使得任意類型均是可居留的. 因此Girard"s paradox可以理解為類型論里的Russell"s paradox.
題目中的所有類型的一個類型(Type : Type)即PTS里的axiom , 依賴類型即PTS里的rule. 上文給出了回答如果具有這兩個屬性, 那麼這個系統()是非強規範化的.
值得留意的是在即使沒有顯式給出"所有類型的類型是類型"這一假設, 看起來是一致的, 但kind多態的引入使得這樣的類型構造成為了可能.
0:什麼是強規範化(Strong Normalization Property?)
對於一個rewrite system來說,Strong Normalization Property是說任何term用任意方法rewrite(用編程語言的話來說就是無論用那種reduction strategy,如Call By Value(CBV)/Call By Name(CBV))等,都會終止計算。如果任何term都有一種rewrite方法,可以使之停機,就叫Weak Normalization Property。如果一個rewrite system符合Strong Normalization,很明顯也符合Weak Normalization,但是反之不一定。對於(排除特例)編程語言來說,都只有一個定好的reduction strategy,於是Strong/Weak Normalization重合。
1:如果一個語言有不停機的程序,會怎麼樣?
這會給equational reasoning搞麻煩事-然而因為IO大部分語言equational reasoning基本上不存在,所以影響就沒那末大。
在CBV語言中,這代表let x := func() in 0 end跟0不一定相等,編譯器/人類不能前者優化到後者(func可能不停機)。
在CBN語言中,這代表一個datatype中會多出莫名其妙的值,於是State就不是Monad。Haskell has no state monad
在帶eval的語言中,這代表伺服器不能接受用戶的程序-否則死循環侍候。(當然,可以timeout,但是這從某種意義上是搞出一個停機的語言,正好證明了我這點)
在Dependent Type(DT)PL中這導致了我們可以寫出bad (x: Unit): Bottom := bad x,而從Bottom我們可以得出任意Type的值,包括0=1這個類型。這導致了在該Dependent Type PL中可以證明出一切事物。這會造成死循環,於是強規範化不復存在。
2:什麼是Girard Paradox?
Girard Paradox是Russell Paradox的變種,在這用Type可以模擬Set,最後搞出個Set of Type(Set),Paradox Set,Paradox。
在Coq中我們可以通過-type-in-type flag開啟Type:Type,於是就可以搞出這個問題,代碼如下:
Inductive SET := set T (F : T -&> SET).
SET的值由一個類型,跟該類型到SET的函數組成。
這個類型,是個索引類型,這個函數可能返回的SET,則是這個SET包含的SET。
Definition T S := match S with set t _ =&> t end.
T S取得一個S:SET的類型。
Definition F S : T S -&> SET := match S with set _ f =&> f end.
F S取得一個S:SET的函數。
Definition Contain L R : Prop := exists t : T L, F L t = R.
如果SET L包含SET R,存在一個索引t,使得該函數在t之上返回R。
Definition NCSS : SET := set { s | ~~~Contain s s } (@proj1_sig _ _).
NCSS是所有不包含自己的集合。更具體的講,set是SET的constructor,{ s | ~~~Contain s s }是一個類型-這個類型是一個『帶有證明』的SET。至於是什麼的證明?s不不不包含s。這裡之所以要用三重否定,是因為Coq核心沒排中律,所以要用在~Contain s s上加入Double Negation模擬-如果我們引入排中律,就變成我們證明了-type-in-type下(排中律是錯的)成立,而不是一切都成立了。如果沒有開-type-in-type,這一行就會出錯-至於為什麼,先不表。至於proj1_sig是啥?我們從『帶證明的SET』中取出raw SET。
註:在這,~X就是X -&> False:給我一個X,我就能給你一個False。既然False不存在,我就不能給你一個False,換句話說你就不能給我一個X,換句話說X也不存在了。
Definition NCSNCSS : ~~~Contain NCSS NCSS :=
fun H =&> H ltac:(destruct 1 as [[]]; simpl in *; subst; intuition).
我們證明NCSS不包含自己。首先,我們引入~~Contain NCSS NCSS,然後試圖證明False(這就是~X的定義:引入X,能證明False)。然後,我們試圖證明~Contain NCSS NCSS:證出來後作為~~Contain NCSS NCSS的參數就能得出False。然後,我們引入Contain NCSS NCSS:存在t:{ s | ~~~Contain s s },並等於NCSS,試圖證明False。既然這等於NCSS,我們就得出NCSS不不不包含自己,並且以前引入過NCSS不不包含自己,於是我們得出了False,大功告成。
Definition CSNCSS : Contain NCSS NCSS :=
ex_intro _ (exist _ NCSS NCSNCSS) eq_refl.
因為「NCSS包含一切不包含自己的SET」跟「NCSS不包含自己」,所以NCSS包含自己。
Definition FALSE : False := NCSNCSS (fun x =&> x CSNCSS).
因為NCSS不包含自己又包含自己,邏輯系統是inconsistent的:我們可以證明任意事物。
註:這並不是真正的Girard Paradox,而是一個Coq中的近似物。歡迎看過Girard原論文的人補充。見System U - Wikipedia
3:那都是怎麼處理的?
核心問題是:只要一個東西能引用自己,就很容易造成paradox。解決方法就是防止這樣的自指出現。
當年羅素(Ruseell)發現羅素悖論後,發現給予object/proposition/n-arity predicate of different type不同的類型,就可以防止羅素悖論(自指不了了,類型不一樣)。在這,把predicate限制成一維,並且改成function(於是,要代表一參predicate就是function to proposition,多參predicate就用currying),就會有Simply Typed Lambda Calculus - 而事實上STLC就是因為Untyped Lambda Calculus不停機,引起悖論,於是魔改一下,這樣誕生的。Godel則從Set, Set of Set, Set of Set of Set出發,並用Set theory的標準方法定義function/relation,於是類型就是自然數。在這之後,羅素髮現自己的predicate可以用forall引入自己等級的predicate,於是擔心自引用的坑還會回來,加入了order - 一個order (S n)的predicate只能引用order n的forall,order 0的predicate不能引用任何predicate的forall。然後,由於因為在這樣的系統做數學研究很坑,order的破事一大推,羅素引入了reducibility axiom:對於任何高階predicate,都有等價的一階predicate。然而加入這個公理後,羅素的系統就變成了STLC/Godel的。這就是各種邏輯系統的,極為簡陋的,處理方法。如你所見,這是個天坑,可以自己看Type Theory (Stanford Encyclopedia of Philosophy)。(3)開始的這段話到這就是這東西的一個簡介。
Coq之中做法正是如此:Type的類型是Type 1,Type 1的類型是Type 2,低階的Type是高階的Type的subtype,低階的Type的term不能用高階的Type。。。詳情見Universes
4:還有沒有其他不停機的坑?
Unbounded Recursion,Negative Data Type,CoInductive Data Type,都有微妙的坑。見(Total Functional Programming)http://sblp2004.ic.uff.br/papers/turner.pdf
5:如何證明Simply Typed Lambda Calculus是停機的?
logical relationinduction on type structure,可以看Normalization of STLC
如果用SKI/BCKW的話因為沒Variable證明簡單很多,可以自己玩玩
推薦閱讀:
TAG:類型系統 | 數理邏輯SymbolicLogic | 範疇論 | 理論計算機科學 | Lambda演算 |