無類型Lambda演算筆記-2(Lambda可定義性,附Haskell實例)
目錄:類型論驛站寫作計劃
前一篇:無類型Lambda演算筆記-1(附Haskell實例)
後一篇:無類型Lambda演算筆記-3(歸約和Church-Rosser定理)
2. Lambda可定義性
Church數
定義:
- 當 , 且 時, 定義如下:
2. Church數 定義如下:
Haskell實例:
"Prelude:" ling = s z -> z -- 定義 0nling :: t1 -> t -> t --如果不能自動顯示類型,可以用:set +t來設定;消除類型顯示用:unset +t來設定 n"Prelude:" yi = s z -> s z -- 定義 1nyi :: (t1 -> t) -> t1 -> tnn"Prelude:" xianshi n = n (1+) 0 --定義「顯示」,方便核對我們定義的正確性nxianshi :: (Num t, Num a) => ((a -> a) -> t -> t1) -> t1n"Prelude:" xianshi ling -- 顯示 0n0nit :: Num t1 => t1n"Prelude:" xianshi yi -- 顯示 1n1nit :: Num t1 => t1n"Prelude:" er = s z -> s (s z) --定義2ner :: (t -> t) -> t -> tn"Prelude:" xianshi er -- 顯示 2n2nit :: Num t1 => t1nn-- 定義後繼n"Prelude:" houji n s = n s . snhouji :: ((a -> b) -> b -> c) -> (a -> b) -> a -> cn"Prelude:" yi = houji ling -- 使用後繼定義 1nyi :: (a -> c) -> a -> cn"Prelude:" xianshi yi -- 顯示 1n1nit :: Num t1 => t1nn"Prelude:" :t (.) -- (.) 是複合函數(funciton composition)的組合子n(.) :: (b -> c) -> (a -> b) -> a -> cn
J. B. Rosser 命題
定義:
那麼對於所有 ,我們有:
引理1
引理1的證明
- 用歸納法。若 為0,則 . 若(1)對於 成立,那麼
2. 用歸納法,以 為基礎,易證。
Rosser命題的證明
- 對於 使用使用歸納法。
- 使用引理1(1).
- 由引理1(2),可知對於
Haskell實例:
"Prelude:" jia = n m s z -> n s (m s z) -- 定義加法算術運算njia :: (t3 -> t2 -> t1) -> (t3 -> t -> t2) -> t3 -> t -> t1n"Prelude:" er = jia yi yi -- 使用 1+1定義2ner :: (a -> a) -> a -> ann"Prelude:" cheng = x y z -> x (y z) --定義乘法ncheng :: (t2 -> t1) -> (t -> t2) -> t -> t1n"敕 Prelude:" si = cheng er er --使用2*2定義4nsi :: (a -> a) -> a -> an"Prelude:" xianshi sin4nit :: Num t1 => t1nn"Prelude:" zhishu = x y -> y x --定義指數nzhishu :: t1 -> (t1 -> t) -> tn"Prelude:" xianshi (zhishu er san) -- 顯示「二的三次方」n8nit :: Num t1 => t1n"Prelude:" xianshi (zhishu shi er)n"Prelude:" shi = jia (zhishu er san) er --定義10nshi :: (t1 -> t1) -> t1 -> t1n"Prelude:" xianshi shin10nit :: Num t1 => t1n"Prelude:" xianshi (zhishu shi er) --顯示「十的二次方」n100nit :: Num t1 => t1n
布爾值,條件式(Booleans and conditional)的定義
- 如果 為一個布爾項,即它或為真,或為假。那麼
可以表示為 。
布爾值和部分布爾運算定義的Haskell演示:
"Prelude:" type CB a = a -> a -> a --定義Church Boolean類型n"Prelude:" :{ -- 定義「真假」nPrelude| zhen, jia :: CB anPrelude| zhen = x y -> xnPrelude| jia = x y -> ynPrelude| :}nn"Prelude:" :{ --顯示「真假」nPrelude| xianshiB :: CB Integer -> IntegernPrelude| xianshiB = f -> f 1 0nPrelude| :}n"Prelude:" xianshiB zhenn1n"Prelude:" xianshiB jian0nn"Prelude:" :{ --定義「不」nPrelude| bu :: CB (CB a) -> CB anPrelude| bu f = f jia zhennPrelude| :}nn"Prelude:" buzhen = bu zhen --「不」的運算演示n"Prelude:" xianshiB buzhenn0n"Prelude:" bubuzhen = bu (bu zhen)n"Prelude:" xianshiB bubuzhenn1nn"Prelude:" :{ --定義「合取」nPrelude| hequ :: CB (CB a) -> CB a -> CB anPrelude| hequ f g = f g jianPrelude| :}n"Prelude:" xianshiB (hequ zhen jia) --「合取」演示n0n"Prelude:" xianshiB (hequ zhen zhen)n1nnn"Prelude:" :{ --定義「析取」nPrelude| xiqu :: CB (CB a) -> CB a -> CB anPrelude| xiqu f g = f zhen gnPrelude| :}n"Prelude:" xianshiB (xiqu zhen jia) --「析取」演示n1n"Prelude:" xianshiB (xiqu jia jia)n0n"Prelude:" xianshiB (xiqu zhen zhen)n1n
配對(Pairing)定義
對於 ,若標記
則有
因而 可以視為一個有序對子。
數值函數(numeric function)和 可定義性( -definability)的定義
- 數值函數是對於一個 的一個映射 .
- 對於一個參數(arguments)數目為 的數值函數 來說,如果對於所有 ,對於某個組合子 ,我們有 ,那麼我們稱 是 可定義( -definable)的。如果上述等式存在,那麼我們稱 由組合子 定義。
初始函數(initial function)和最小值 的定義
- 設 為數值關係,那麼 則表示使得 成立的最小取值。如果 永遠不成立,則不存在
回顧:我們在用Haskell定義Church數的時候已經用到了初始函數。
"Prelude:" ling = s z -> z -- 使用Z和S^+定義 0(但沒有給出Z和S^+的定義)nling :: t1 -> t -> t n"Prelude:" yi = s z -> s z -- 使用Z和S^+定義 1nyi :: (t1 -> t) -> t1 -> tn"Prelude:" xianshi n = n (1+) 0 --定義初始函數Z和S^+n
引理2
初始函數都是 可定義的。
引理2的證明
通過Church數的定義易證。
引理3
可定義的函數在函數複合(composition)下是閉合(closed)的。
引理3的證明
設函數 是由組合子 定義的,那麼
由 定義的。
引理4
可定義函數在原始遞歸(primitive recursion)下是閉合的。
引理4的證明
設 分別由 實現 定義,我們定義函數 如下:
為方便起見,先考慮 ,即 不存在(若 存在,本證明可以進行簡單的推廣)。
如果 不是 的參數,那麼我們就有了迭代(iteration)。由於Church數是迭代子(iterators,或譯作迭代器),我們可以用 演算來便捷地表示迭代。
考慮
則對於所有 ,我們有
通過歸納 ,可得
故有
從而, 可以 通過組合子 實現 定義, 定義為
證畢。
引理5
可定義的函數在最小值化(minimalization)下是封閉的。
引理5的證明
我們將 定義為 ,其中 且 是由 進行 定義的。定義
則有
由不動點定理引論(見上篇)可知存在一個項 ,使得
那麼就可以定義 .
遞歸函數的 可定義性定理
所有遞歸函數都是 可定義的。( 可定義函數都是遞歸函數)
遞歸函數的 可定義性定理
通過引理2-5易證。
自然數的遞歸配對定義
- .
定義
設
- 在 下是閉合的,如果
- 如果 ,則稱 是非平凡的(non
- -trivial)。
- 如果 是遞歸的,那麼 是遞歸的(recursive)。
定理
如果 是非平凡的,且在 下是閉合的,那麼 不是遞歸的。(證明略)
Church引論
集合 不是遞歸的。(該集合在=下是閉合的,且非平凡,故得證。)
目錄:類型論驛站寫作計劃
前一篇:無類型Lambda演算筆記-1(附Haskell實例)
後一篇:無類型Lambda演算筆記-3(歸約和Church-Rosser定理)
推薦閱讀: