(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 (inc x) (+ x 1))
((one inc) 0)
(((add-1 one) inc) 0)
(define (plus n1 n2)
(lambda (f) (lambda (x) ((n2 f) ((n1 f) x)))))
(((plus one two) inc) 0)
(define (mul n1 n2)
(lambda (f) (lambda (x) ((n1 (n2 f)) x))))
(((mul one two) inc) 0)
(define (minus n1 n2)
(lambda (f) (lambda (x) ((((n2 minus-1) n1) f) x))))
(define (minus-1 n)
(lambda (f)
(lambda (x)
(((n (lambda (p)
(if p
(lambda (y) (f (p y)))
(lambda (y) y))))
#f) x))))
(((minus-1 two) inc) 0)
#|
(((two (lambda (s)
(if s
(lambda (y) (inc (s y)))
(lambda (y) y))))
#f) 0)
(((lambda (s)
(if s
(lambda (y) (inc (s y)))
(lambda (y) y)))
(lambda (y) y)) 0)
((lambda (y) (inc ((lambda (y) y) y))) 0)
-> 1
|#
(define three (lambda (f) (lambda (x) (f (f (f x))))))
(define four (lambda (f) (lambda (x) (f (f (f (f x)))))))
(((minus three two) inc) 0)
(((minus four one) inc) 0)