丘奇数(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
- 丘奇数(Church numeral)
- 邱奇编码(Church Encoding)的Javascript实现练习
- Church计数
- church计数
- Roman Numeral Converter
- Roman Numeral Converter
- Roman Numeral Converter
- Roman Numeral Converter
- Alonzo Church的λ演算(摘自彭罗斯《皇帝新脑》)
- 【Church - 钟摆摆得太远(5):现状与结论】
- The Church-Turing Thesis
- SICP习题-Church计数
- HW--Church numerals
- 奇数
- Notes Part II: Numeral Systems
- Convert Number Into Roman Numeral
- 《Enchantment》-- Charlotte Church 专辑收藏
- Church Numerals: Approaches In Scheme
- c++之string类编写
- MySQL 添加列,修改列,删除列总结
- HTML超链接标签
- 求学生三门成绩的平均成绩
- C#生成Code39条形码【非条形码字体】
- 丘奇数(Church numeral)
- android:gravity="right" 没有居右侧
- mongodb命令
- Android Splash 页面
- 题目 F
- C#生成Code39条形码【非条形码字体】
- JQUERY操作JSON
- An Easy Task
- Linux 文件系统:procfs, sysfs, debugfs 用法简介