(define zero (lambda (f) (lambda (x) x))) (define (add-1 n) (lambda (f) (lambda (x) (f ((n f) x))))) ; n is the function mapping ; f(x) -> f^n(x) ; (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)))) ; (add-1 one) ; (lambda (f) (lambda (x) (f ((one f) x)))) ; (lambda (f) (lambda (x) (f (((lambda (f) (lambda (x) (f x))) f) x)))) ; (lambda (f) (lambda (x) (f (f x)))) (define two (lambda (f) (lambda (x) (f (f x))))) ; (define (add a b) ; ((a add-1) b)) (define (add a b) (lambda (f) (lambda (x) ((b f) ((a f) x))))) ; ; 1 ]=> (define (inc x) (+ 1 x)) ; ; ;Value: inc ; ; 1 ]=> ((zero inc) 0) ; ; ;Value: 0 ; ; 1 ]=> ((one inc) 0) ; ; ;Value: 1 ; ; 1 ]=> ((two inc) 0) ; ; ;Value: 2 ; ; 1 ]=> (((add one two) inc) 0) ; ; ;Value: 3 ; ; 1 ]=> (((add two two) inc) 0) ; ; ;Value: 4 ; ; 1 ]=> (((add-1 zero) inc) 0) ; ; ;Value: 1 ; ; 1 ]=> (((add-1 two) inc) 0) ; ; ;Value: 3