丘奇数(Church numeral)

来源:互联网 发布:淘宝账户已被限制登录 编辑:程序博客网 时间:2024/05/06 11:23

人们可以从2个苹果中获得2的概念,也可以从打2个电话抽象出2的概念。丘奇数(Church numeral),并不是一个数字,而是指应用某个函数的次数(因此为非负的整数)。如丘奇数0指出函数f了应用0次。其定义为

0 = λf.λx.x=λf. (λx.(x) )

但是,我仍然不能够理解SICP练习2.6的意思:“如果觉得将序对表示最为过程还不足以令人如雷灌顶,那么请考虑,在一个可以对过程做各类操作的语言中,我们完全可以没有数”。或者说,我还不理解“数据意味着什么?”这个标题的含义。

我们知道,通过丘奇的lambda演算,我们可以定义一门语言最原始的数据和操作。当完整定义出语言的各要素,一门语言也就诞生了。但是,丘奇数0和数字0仍然不是一个东西。或许可以说:函数编程语言中的一切元素,归根结底都是λ表达式;正如命令思维的人认为的:编程语言中的一切元素,归根结底都是0和1。然后呢?

然后,一门函数编程语言在定义了数字0、1、2的基础上,定义+,*等,然后把函数视为数据

我不知道作者为什么这样写。(或许应该明确说明:本节的中心思想是“归根结底”数据可以没有?通常,我会将这一部分的内容放在最开始的引言中介绍。)

目前以SICP练习2.6为幌子,熟悉一下α变换和β简化


1.高阶函数Church- zero

丘奇数0,是一个高阶函数,它有两个参数:f和x,其中参数f应用于x有 0次。0 = λf.λx.x

使用Scheme语言,

(define Church-zero (lambda (f) (lambda (x) x))) ;;;或者(define (Church-zero f) (lambda (x) x)) ;;;或者(define (Church-zero f x) (x)) 

同理可得丘奇数1和丘奇数2。

(define Church-one  (lambda (f)    (lambda (x)      (f x))))    ;;;应用1次f(define Church-two  (lambda (f)    (lambda (x)      (f (f x))))) ;;;应用2次f

2. 使用丘奇数

(define (square x) (* x x));;; 求平方的函数square,

((Church-two square) 3)

;Value: 81

应用函数Church-two,其参数为square和3,当对参数3应用两次求平方函数square,结果为81。


3.直接定义丘奇数1和丘奇数2

在前面,我们已经“同理可得”,直接地定义了丘奇数1和丘奇数2。现在给出了加一操作或自增函数:

++ =λn.λf.λx.(f ((n f) x)) ;;;操作于某个丘奇数n,得到n+1。

使用Scheme语言,定义为:

(define (++ n)

  (lambda (f)(lambda(x) (f ((n f) x)))))

显然,从Church-zero和++,可以简单地定义Church-one:

(define Church-one (++ Church-zero))

为了熟悉一下α-变换和β简化,我们从(++ Church-zero)推导从Church-one的直接定义。目标:

(define Church-one  (lambda (f)    (lambda (x)      (f x))))  

方便起见,lambda (f)写成λf。

推导:

Church-one = (++ Church-zero);;(A B)

= (λn.λf.λx.(f((n f) x)) Church-zero) ;;;展开++。下一步Church-zero替换n

=λf.λx.(f ((Church-zerof) x)) ;;;β简化

=λf.λx.(f ((λg.λy.yf) x)) ;;; 展开Church-zero,并α-变换,避免混淆

=λf.λx.(f (λy.y x)) ;;; β简化

=λf.λx.(f x) ;;; β简化

即(define Church-one (lambda (f) (lambda (x) (f x))))  。搞定。


4.直接定义+

观察自增函数++:

(define (++ n)

  (lambda(f)(lambda (x) (f ((n f) x)))))

如果将其中的((n f)x)替换为x,就是Church-one。(n f)的含义是应用n次f。

因此,丘奇数n、m的+,

(define (+ n m)

  (lambda (f)

    (lambda(x)

      ((n f) ((mf) x)))))

根据++函数,丘奇数m+n的+函数定义为:

+ =  λm.λn.λf.λx.((((m ++) n) f) x)

验证如下:求丘奇数2+1

((+ Church-two) Church-one) = ((λm.λn.λf.λx.((((m++) n) f) x) Church-two) Church-one)

=> (λn.λf.λx.(((( Church-two ++)n) f) x)Church-one);;; β简化,替换m

=>λf.λx.(((( Church-two ++)  Church-one)  f)  x) ;;; β简化,替换n

=>λf.λx.(( ( ( λg.λy.(g (g y)) ++)  Church-one)  f)  x) ;; 展开与α-变换

=>λf.λx.((( λy.(++ (++ y)) Church-one)  f)  x)

=>λf.λx.((      (++ (++ Church-one) )  f)  x) ;; 已知(++ Church-one)= Church-two

=>λf.λx.((  ( ++ Church-two )  f)  x)  ;; 展开++

=>λf.λx.((  ( λn.λg.λy.(g ((n g) y)) Church-two ) f)  x)

=>λf.λx.(( λg.λy. (g ((Church-two g) y))  f)  x)

=> λf.λx.((  λg.λy.(g ( (λh.λz.(h (h z))  g) y))  f)  x)

=>λf.λx.((   λg.λy.(g  (λz.(g(g z))  y)    )  f)  x)

=>λf.λx.(  (λg.λy.(g (g (g y)))  f)  x)

=>λf.λx.( λy.(f (f (f y)))  x)

=>λf.λx.(f (f (f x)))

 

参考:
Church Numerals
0 0
原创粉丝点击