邱奇数为使用邱奇编码的自然数表示法,而用以表示自然数 的高阶函数是个任意函数 映射到它自身的n重函数复合之函数,简言之,数的“值”即等价于参数被函数包裹的次数。
-
不论邱奇数为何,其都是接受两个参数的函数。
-
就是说,自然数 被表示为邱奇数n,它对于任何lambda-项F
和X
有着性质:
- n
F X
=β Fn X
。
使用邱奇数的计算
在 lambda 演算中,数值函数被表示为在邱奇数上的相应函数。这些函数在大多数函数式语言中可以通过 lambda 项的直接变换来实现(服从于类型约束)。
加法函数 利用了恒等式 。
- plus ≡
λm.λn.λf.λx. m f (n f x)
后继函数 β-等价于(plus 1)。
- succ ≡
λn.λf.λx. f (n f x)
乘法函数 利用了恒等式 。
- mult ≡
λm.λn.λf. n (m f)
指数函数 由邱奇数定义直接给出。
- exp ≡
λm.λn. n m
前驱函数 通过生成每次都应用它们的参数 g
于 f
的 重函数复合来工作;基础情况丢弃它的 f
复本并返回 x
。
- pred ≡
λn.λf.λx. n (λg.λh. h (g f)) (λu. x) (λu. u)
邱奇数函数一表
函数 |
代数 |
等同 |
函数定义
|
Lambda 表达式
|
---|
后继 |
|
|
|
|
...
|
加法 |
|
|
|
|
|
乘法 |
|
|
|
|
|
指数 |
|
[1] |
|
|
|
前驱* |
|
|
|
|
减法* |
|
|
|
... |
|
* 注意在邱奇编码中,
-
-
除法函式
以下列定义可实作自然数的除法
-
计算 除以 的递回相减时,将会计算很多次的beta归约。除非以纸笔手工来做,那么多步骤倒无关紧要,
但我们不想一直重复琐碎的归约;而判别数字是否为零的函式是 IsZero,所以考虑下列条件:
-
这个判别式相当于 小于等于 而非 小于 。如果使用这式子,那么要将上面给出的除法定义,
转化为邱奇编码的自然数函数如下,
-
这样的定义只呼叫了一次 减去 ,正如我们所想的。然而问题是这式子计算成错误的结果,
是 (n-1)/m 除法的商。要更正则需在呼叫 divide 之前把 再加回 1。 因此除法的正确定义是,
-
divide1 是一个内含递回的定义式,要以 Y 组合子来发生递回作用。 所以要再宣告一个名为 div 的新函数;
- 等号左侧为 divide1 → div c
- 等号右侧为 divide1 → c
要获得
-
那么
-
而式中所用的其它函式定义如下列:
-
-
-
使用倒斜线 \ 代替 λ 符号,完整的除法函式则如下列,
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))
换成其它表达法
大部分真实世界的编程语言都提供原生于机器的整数,church 与 unchurch 函式会在整数及与之对应的邱奇数间转换。这里使用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