邱奇数

来自testwiki
imported>InternetArchiveBot2020年9月20日 (日) 00:31的版本 (补救1个来源,并将0个来源标记为失效。) #IABot (v2.0.7)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到导航 跳转到搜索

邱奇编码是把数据和运算符嵌入到lambda演算内的一种方式,最常见的形式即邱奇数,它使用lambda符号表示自然数。方法得名于阿隆佐·邱奇,他首先以这种方法把数据编码到lambda演算中。

透過邱奇編碼,在其他符号系统中通常被认定为基本的项(比如整数、布尔值、有序对、列表和tagged unions)都會被映射到高阶函数。在無型別lambda演算,函數是唯一的原始型別

邱奇編碼本身並非用來實踐原始型別,而是透過它來展現我們不須額外原始型別即可表達計算。

很多学数学的学生熟悉可计算函数集合的哥德尔编号;邱奇编码是定义在lambda抽象而不是自然数上的等价运算。

邱奇数

邱奇数為使用邱奇编码的自然数表示法,而用以表示自然数n高阶函数是個任意函数f映射到它自身的n函数复合之函数,簡言之,數的「值」即等價於參數被函數包裹的次數。

fn=fffn 次.

不論邱奇數為何,其都是接受兩個參數的函數。

 自 然 數函 數 定 義lambda 表 達 式00 f x=x0=λf.λx.x11 f x=f x1=λf.λx.f x22 f x=f (f x)2=λf.λx.f (f x)33 f x=f (f (f x))3=λf.λx.f (f (f x))nn f x=fn xn=λf.λx.fn x

就是说,自然数n被表示为邱奇数n,它对于任何lambda-项FX有着性质:

n F X =β Fn X

使用邱奇数的计算

在 lambda 演算中,数值函数被表示为在邱奇数上的相应函数。这些函数在大多数函数式语言中可以通过 lambda 项的直接变换来实现(服从于类型约束)。

加法函数 plus(m,n)=m+n 利用了恒等式 f(m+n)(x)=fm(fn(x))

plusλm.λn.λf.λx. m f (n f x)

后继函数 succ(n)=n+1 β-等价于(plus 1)。

succλn.λf.λx. f (n f x)

乘法函数 times(m,n)=m×n 利用了恒等式 f(m×n)=(fm)n

multλm.λn.λf. n (m f)

指数函数 exp(m,n)=mn 由邱奇数定义直接给出。

expλm.λn. n m

前驱函数 pred(n)={0if n=0,n1otherwise 通过生成每次都应用它们的参数 gfn 重函数复合来工作;基础情况丢弃它的 f 复本并返回 x

predλn.λf.λx. n (λg.λh. h (g f)) (λu. x) (λu. u)

邱奇數函數一表

函數 代數 等同 函數定義 Lambda 表達式
後繼 n+1 fn+1 x=f(fnx) succ n f x=f (n f x) λn.λf.λx.f (n f x) ...
加法 m+n fm+n x=fm(fnx) plus m n f x=m f (n f x) λm.λn.λf.λx.m f (n f x) λm.λn.nsuccm
乘法 m×n fm×n x=(fm)n x multiply m n f x=m (n f) x λm.λn.λf.λx.m (n f) x λm.λn.λf.m (n f)
指數 mn n m f=mn f[1] exp m n f x=(n m) f x λm.λn.λf.λx.(n m) f x λm.λn.n m
前驅* n1 incncon=val(fn1x) if(n==0) 0 else (n1)

λn.λf.λx.n (λg.λh.h (g f)) (λu.x) (λu.u)

減法* mn fmn x=(f1)n(fmx) minus m n=(npred) m ... λm.λn.npredm

* 注意在邱奇編碼中,

  • pred(0)=0
  • m<nmn=0


除法函式

以下列定義可實作自然數的除法

n/m=if nm then 1+(nm)/m else 0


計算 n 除以 m 的遞迴相減時,將會計算很多次的beta歸約。除非以紙筆手工來做,那麼多步驟倒無關緊要,
但我們不想一直重複瑣碎的歸約;而判別數字是否為零的函式是 IsZero,所以考慮下列條件:

IsZero (minus n m)


這個判別式相當於 n 小於等於 m 而非 n 小於 m。如果使用這式子,那麼要將上面給出的除法定義,
轉化為邱奇編碼的自然數函數如下,

divide1 n m f x=(λd.IsZero d (0 f x) (f (divide1 d m f x))) (minus n m)


這樣的定義只呼叫了一次 n 減去 m,正如我們所想的。然而問題是這式子計算成錯誤的結果,
是 (n-1)/m 除法的商。要更正則需在呼叫 divide 之前把 n 再加回 1。 因此除法的正確定義是,

divide n=divide1 (succ n)


divide1 是一個內含遞迴的定義式,要以 Y 組合子來發生遞迴作用。 所以要再宣告一個名為 div 的新函數;

  • 等號左側為 divide1 → div c
  • 等號右側為 divide1 → c


要獲得

div=λc.λn.λm.λf.λx.(λd.IsZero d (0 f x) (f (c d m f x))) (minus n m)


那麼

divide=λn.divide1 (succ n)


而式中所用的其它函式定義如下列:

divide1=Y divsucc=λn.λf.λx.f (n f x)Y=λf.(λx.f (x x)) (λx.f (x x))0=λf.λx.xIsZero=λn.n (λx.false) true
trueλa.λb.afalseλa.λb.b
minus=λm.λn.npredmpred=λn.λf.λx.n (λg.λh.h (g f)) (λu.x) (λu.u)


使用倒斜線 \ 代替 λ 符號,完整的除法函式則如下列,

divide = (\n.((\f.(\x.x x) (\x.f (x x))) (\c.\n.\m.\f.\x.(\d.(\n.n (\x.(\a.\b.b)) (\a.\b.a)) d ((\f.\x.x) f x) (f (c d m f x))) ((\m.\n.n (\n.\f.\x.n (\g.\h.h (g f)) (\u.x) (\u.u)) m) n m))) ((\n.\f.\x. f (n f x)) n))


換成其它表達法

大部分真實世界的程式語言都提供原生於機器的整數,churchunchurch 函式會在整數及與之對應的邱奇數間轉換。這裡使用Haskell撰寫函式, \ 等同於lambda演算的 λ。 用其它語言表達也會很類似。

type Church a = (a -> a) -> a -> a

church :: Integer -> Church Integer
church 0 = \f -> \x -> x
church n = \f -> \x -> f (church (n-1) f x)

unchurch :: Church Integer -> Integer
unchurch cn = cn (+ 1) 0

邱奇布尔值

邱奇布尔值是布尔值的邱奇编码形式。某些程式語言使用這個方式來實踐布爾算術的模型,Smalltalk 即為一例。

布爾邏輯可以想成二選一,而布尔值則表示为有两个参数的函数,它得到两个参数中的一个:

  • 則選擇第一個參數
  • 則選擇第二個參數

邱奇布爾值在lambda演算中的形式定义如下:

trueλa.λb.afalseλa.λb.b

由於 可以選擇第一個或第二個參數,所以其能夠由組合來產生邏輯運算子。注意到 not 版本因不同求值策略而有兩個。下列為从邱奇布尔值推导来的布尔算术的函数:

and=λp.λq.p q por=λp.λq.p p qnot1=λp.λa.λb.p b a *1not2=λp.p (λa.λb.b) (λa.λb.a)=λp.pfalsetrue *2xor=λa.λb.a (not b) bif=λp.λa.λb.p a b

註:

  • 1 求值策略使用應用次序時,這個方法才正確。
  • 2 求值策略使用正常次序時,這個方法才正確。


下頭為一些範例:

andtruefalse=(λp.λq.p q p) true false=truefalsetrue=(λa.λb.a)falsetrue=falseortruefalse=(λp.λq.p p q) (λa.λb.a) (λa.λb.b)=(λa.λb.a) (λa.λb.a) (λa.λb.b)=(λa.λb.a)=truenot1 true=(λp.λa.λb.p b a)(λa.λb.a)=λa.λb.(λa.λb.a) b a=λa.λb.(λc.b) a=λa.λb.b=falsenot2 true=(λp.p (λa.λb.b)(λa.λb.a))(λa.λb.a)=(λa.λb.a)(λa.λb.b)(λa.λb.a)=(λb.(λa.λb.b)) (λa.λb.a)=λa.λb.b=false

参见

外部链接

  1. This formula is the definition of a Church numeral n with f -> m, x -> f.