首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >教会数字

教会数字
EN

Code Review用户
提问于 2016-09-11 16:57:55
回答 1查看 464关注 0票数 3

以下是SICP的练习2.6:

练习2.6:在将成对表示为过程不够令人难以置信的情况下,考虑到在一种可以操作过程的语言中,我们可以通过实现0和加法1作为(定义为零(lambda (f) (lambda (x) x))(定义(add-1 n) (lambda (f) ) (lambda ( f ) (lambda (x) )(lambda(X)(f ((n )x)来实现0和加法1的运算,这样的表示称为教会数字,以其发明者Alonzo Church,发明λ微积分的逻辑学家。直接定义一和二(不是零和加-1)。(提示:使用替换来计算(加-1))。给出加法程序+的直接定义(而不是重复应用add-1)。

请检查我的代码:

代码语言:javascript
代码运行次数:0
运行
复制
  (define one (lambda (f) (lambda (x) (f x))))

  (define two (lambda (f) (lambda (x) (f (f x)))))

  ;; I used an identity function to check the + procedure
  (define (+ a b)
    (lambda (f)
      (lambda (x)
        ((((a f) b) f) x))))

如何改进这段代码?

EN

回答 1

Code Review用户

回答已采纳

发布于 2016-09-12 05:36:24

您的函数+不正确。

两个教会数字之和的定义如下:

代码语言:javascript
代码运行次数:0
运行
复制
(define (plus a b)
  (lambda (f)
    (lambda (x)
      ((a f) ((b f) x)))))

(例如,参见维基百科)。

实际上,教会数字n可以定义为将给定函数fn倍应用于给定值x的函数。因此,在上述定义中,和(plus a b)首先将bf应用于x,而对于该结果,f被应用a倍。相反,在您的定义中,函数体内的应用程序类型是错误的。

如何检验教会数字及其功能的正确性?

您只需将教会数字应用于函数整数后继(即(lambda(x)(+ x 1)))和数字0,以确定它是否生成相应的“规则”数字。因此,例如:

代码语言:javascript
代码运行次数:0
运行
复制
(define (succ x) (+ x 1))   ;; here `+` is the integer addition, not your function!

((zero succ) 0)  ; produces 0
((one succ) 0)   ; produces 1  etc.

因此,您可以测试和是否正确:

代码语言:javascript
代码运行次数:0
运行
复制
(((plus one two) succ) 0)  ; produces 3

如果您尝试您的函数,您会发现:

代码语言:javascript
代码运行次数:0
运行
复制
(((+ one two) succ) 0) ; raises an error
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/141084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档