-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathex2-06-church-numerals.scm
110 lines (73 loc) · 2.58 KB
/
ex2-06-church-numerals.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
; Ex. 2.06 Church Numerals
(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 three
(lambda (f) (lambda (x) (f (f (f x))))))
(define (add m n)
(lambda (f) (lambda (x) ((m f)
((n f) x)))))
; (((add two two) square) 2)
; ;Value: 65536
; (square (square (square (square 2))))
; ;Value: 65536
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Defining `one' (by trying to add-1 to zero by hand)
; (add-1 zero)
; (lambda (f)
; (lambda (x) (f ((zero f) x))))
; (lambda (f)
; (lambda (x) (f (((lambda (f) (lambda (x) x))
; f)
; x))))
; (lambda (f)
; (lambda (x) (f ((lambda (x) x)
; x))))
; (lambda (f)
; (lambda (x) (f x)))
; ; ; HENCE we can directly define `one' as
; (lambda (f) (lambda (x) (f x)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Defining `two' (by trying to add-1 to one by hand)
; (add-1 one)
; (lambda (f)
; (lambda (x) (f ((one f) x))))
; (lambda (f)
; (lambda (x) (f (((lambda (f) (lambda (x) (f x)))
; f) ; this f is passed as value to lambda (f)
; x))))
; (lambda (f)
; (lambda (x) (f ((lambda (x) (f x))
; x)))) ; this x is passed as value to lambda (x)
; (lambda (f)
; (lambda (x) (f (f x))))
; ; ; HENCE we can directly define `two' as
; (lambda (f) (lambda (x) (f (f x))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Arriving at a general way to add two values:
; Suppose add-1 n is rewritten as:
; (define (add one n)
; (lambda (f) (lambda (x) ((one f) ((n f) x)))))
; (define (add one n)
; (lambda (f) (lambda (x) (((lambda (f)
; (lambda (x) (f x)))
; f)
; ((n f) x)))))
; (define (add one n)
; (lambda (f) (lambda (x) ((lambda (x) (f x)) ((n f) x)))))
; (define (add one n)
; (lambda (f) (lambda (x) (f ((n f) x)))))
; Which is the same as the definition for add-1 n
; Likewise (add-2 n) and (add two n) are exactly similar:
; (define (add two n)
; (lambda (f) (lambda (x) ((two f) ((n f) x)))))
; (define (add-2 n)
; (lambda (f) (lambda (x) ((f (f ((n f) x)))))))
; This can be generalised to arrive at (add m n).
; (define (add m n)
; (lambda (f) (lambda (x) ((m f)
; ((n f) x)))))