本文共 1850 字,大约阅读时间需要 6 分钟。
练习2.4
(define (new-cons x y) (lambda (m) (m x y)))(define (new-car z) (z (lambda (p q) p))) ;; 使用代换模型,(new-car (new-cons x y))的变换过程如下(new-car (new-cons x y))==> (new-car (lambda (m) (m x y)))==> ((lambda (m) (m x y)) (lambda (p q) p))==> 此时即为使用过程(lambda (p q) p)去处理(x y)==> 即等价于定义过程 (define (test p q) p) 然后计算 (test x y)==> 所以(new-car (new-cons x y))将得到x;; 由上面的分析, 可以得到(define (new-car z) (z (lambda (p q) q)))
练习2.5
(define (new-cons a b) (* (expt 2 a) (expt 3 b)))(define (cons-iter x k n) (if (= (remainder x k) 0) (cons-iter (/ x k) k (+ n 1)) n))(define (new-car z) (cons-iter z 2 0))(define (new-cdr z) (cons-iter z 3 0))
练习2.6
(define zero (lambda (f) (lambda (x) x)))(define (add-1 n) (lambda (f) (lambda (x) (f ((n f) x))))) ;; 由以上定义的过程以及 1 = 0 + 1 可得如下过程(define one (add-1 zero));; 进行代入变换(add-1 zero)==> (lambda (f) (lambda (x) (f ((zero f) x))))==> (lambda (f) (lambda (x) (f ((lambda (x) x) x))))==> (lambda (f) (lambda (x) (f x)));; 则可得如下过程(define one (lambda (f) (lambda (x) (f x))));; 进而得到如下过程(define two (lambda (f) (lambda (x) (f (f x)))));; 采用代入的方式进行验证(define two (add-1 one))(add-1 one)==> (lambda (f) (lambda (x) (f ((one f) x))))==> (lambda (f) (lambda (x) (f ((lambda (x) (f x)) x))))==> (lambda (f) (lambda (x) (f (f x))));; 进而得到对于N的定义(define N (lambda (f) (lambda (x) (f (f ... (f x))))));; 则可得到如下过程(define N (lambda (f) (lambda (x) ((N f) x))));; 而对于N+M, 即为对N调用M次add-1;; 对于N+1(add-1 N)==> (lambda (f) (lambda (x) (f ((N f) x))))==> (lambda (f) (lambda (x) ((one f) ((N f) x))))(add-1 (N+1))==> (lambda (f) (lambda (x) ((two f) ((N f) x))))(add-1 (N+M))==> (lambda (f) (lambda (x) ((M f) ((N f) x))));; 所以推得加法的过程如下(define (add N M) (lambda (f) (lambda (x) ((N f) ((M f) x)))));; 确实如书中所说:In case representing pairs as procedures wasn't mind-boggling enough, ;; consider that ......;; Alonzo Church真乃神人也!
转载地址:http://qavbi.baihongyu.com/