; ======================================================================
;
; Structure and Interpretation of Computer Programs
; (trial answer to excercises)
;
; 计算机程序的构造和解释(习题试解)
;
; created: code17 04/23/05
; modified:
; (保持内容完整不变前提下,可以任意转载)
; ======================================================================
;; SICP No.2.6
;; 定义1
;; one = add-1 zero
;; = (lambda (f) (lambda (x) (f ((zero f) x))))
;; = (lambda (f) (lambda (x) (f x)))
(define one (lambda (f) (lambda (x) (f x))))
;; 定义2
;; 同理 two = add-1 one 可得
(define two (lambda (f) (lambda (x) (f (f x)))))
;; 由替代过程推理可得公式
;; (define n-th (lambda (f) (lambda (x) (f^n x))))
;; add 可直接定义为
(define (add a b)
(lambda (f) (lambda (x) ((b f) ((a f) x)))))
;; 另外,为了便于检查定义的正确性,我们定义了一对转换函数,
;; 进行普通数和Church数之间的转换输出
(define (cn-to-n cn) ((cn (lambda (i) (+ i 1))) 0))
(define (n-to-cn n)
(if (= n 0)
(lambda (f) (lambda (x) x))
(add-1 (n-to-cn (- n 1)))))
;; Test-it:
;; Welcome to MzScheme version 209, Copyright (c) 2004 PLT Scheme, Inc.
;; > one
;; #<procedure:one>
;; > two
;; #<procedure:two>
;; > (cn-to-n one)
;; 1
;; > (cn-to-n two)
;; 2
;; > (define five (add-1 (add-1 (add-1 two))))
;; > (cn-to-n five)
;; 5
;; > (define seven (n-to-cn 7))
;; > (cn-to-n seven)
;; 7
;; > (define twelve (add five seven))
;; > (cn-to-n twelve)
;; 12