计算机程序的构造和解释 练习题2.6

把one和two还有add-1这个过程都进行代换,并写出add-2、add-3,容易让我们找到内在的规律。

#lang racket

(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))

(add-1 zero)
(add-1 (lambda (f) (lambda (x) x)))
(lambda (f) (lambda (x) (f (((lambda (f) (lambda (x) x)) f) x))))
(lambda (f) (lambda (x) (f ((lambda (x) x) x))))
(define one (lambda (f) (lambda (x) (f x))))

(add-1 one)
(add-1 (lambda (f) (lambda (x) (f x))))
(lambda (f) (lambda (x) (f (((lambda (f) (lambda (x) (f x))) f) x))))
(lambda (f) (lambda (x) (f ((lambda (x) (f x)) x))))
(lambda (f) (lambda (x) (f (f x))))
(define two (lambda (f) (lambda (x) (f (f x)))))


(define (add-2 n)
  (lambda (f) (lambda (x) (f (f ((n f) x))))))

(define (add-3 n)
  (lambda (f) (lambda (x) (f (f (f ((n f) x)))))))

(add-3 one)
((lambda (f) (lambda (x) (f (f (f (((lambda (f) (lambda (x) (f x))) f) x)))))))

通过代换我们基本掌握了规律
n 1 = ( l a m b d a ( f ) ( l a m b d a ( x ) ( f x ) ) ) n 2 = ( l a m b d a ( f ) ( l a m b d a ( x ) ( f ( f x ) ) ) ) n 3 = ( l a m b d a ( f ) ( l a m b d a ( x ) ( f ( f ( f x ) ) ) ) ) . . . . . . n i = ( l a m b d a ( f ) ( l a m b d a ( x ) ( f . . . . . . . i 个 f . . . . . . . ( f ( f x ) ) ) ) ) n_1 = (lambda (f) (lambda (x) (f x)))\\ n_2 = (lambda (f) (lambda (x) (f (f x))))\\ n_3 = (lambda (f) (lambda (x) (f (f (f x)))))\\ ......\\ n_i = (lambda (f) (lambda (x) (f.......i个f....... (f (f x))))) n1=(lambda(f)(lambda(x)(fx)))n2=(lambda(f)(lambda(x)(f(fx))))n3=(lambda(f)(lambda(x)(f(f(fx)))))......ni=(lambda(f)(lambda(x)(f.......if.......(f(fx)))))

然后为了方便我们写出加法,我们单独看这一部分((n f) x)这一部分的代换。假设目前的n是two和one

//two的代换
((two f) x)
(((lambda (f) (lambda (x) (f (f x)))) f) x)
((lambda (x) (f (f x))) x)
(f (f x))
//one的代换
((one f) x)
(((lambda (f) (lambda (x) (f x))) f) x)
((lambda (x) (f x)) x)
(f x)

如果我们要做one和two的加法,结果是(f (f (f x))),这个是要把上面((two f) x)的x替换成(f x)就可以,然后通过反向推到,就可推出one和two的加法过程。

((two f) x)等价于(f (f x))
((one f) x)等价于(f x)
那么有以下反推过程
(f (f (f x)))
((two f) (f x))
((two f) ((one f) x))

我们把以上结论推广到a和b两个数相加整理得出加法的过程

(define (add a b)
  (lambda (f) (lambda (x) ((a f) ((b f) x)))))

最后我们写出完整的过程并验证结果

#lang racket

(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))


(define one (lambda (f) (lambda (x) (f x))))

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

(define (add-2 n)
  (lambda (f) (lambda (x) (f (f ((n f) x))))))

(define (add-3 n)
  (lambda (f) (lambda (x) (f (f (f ((n f) x)))))))


(define (add a b)
  (lambda (f) (lambda (x) ((a f) ((b f) x)))))

(define (inc n) (+ 1 n))
((one  inc) 0)
(((add one two) inc) 0)
(((add one (add-3 two)) inc) 0)
(((add (add-1 two) (add-3 two)) inc) 0)

运行结果

1
3
6
8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值