-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsix.lc
39 lines (30 loc) · 1.14 KB
/
six.lc
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
let true = lambda t f. t in
let false = lambda t f. f in
let and = lambda b1 b2. b1 b2 false in
let or = lambda b1 b2. b1 true b2 in
let not = lambda b. b false true in
let zero = lambda s z. z in
let succ = lambda n. lambda s z. s (n s z) in
let one = succ zero in
let two = succ one in
let three = succ two in
let four = succ three in
let five = succ four in
let plus = lambda m n. m succ n in
let times = lambda m n. m (plus n) zero in
let iszero = lambda n. n (lambda x. false) true in
let pair = lambda a b. lambda c. c a b in
let fst = lambda p. p (lambda a b. a) in
let snd = lambda p. p (lambda a b. b) in
let pred = lambda n. snd (n (lambda p. pair (succ (fst p)) (fst p))
(pair zero zero)) in
let sub = lambda m n. n pred m in
let equal = lambda m n. and (iszero (sub m n)) (iszero (sub n m)) in
let Y = lambda f. (lambda x. f (x x)) (lambda x y. f (x x) y) in
let fact = Y (lambda f n. (iszero n) (lambda x. succ zero) (lambda x.
times n (f (pred n))) (lambda x. x)) in
let ten = times two five in
let twelve = times three four in
let onetwenty = times ten twelve in
(and (equal (fact three) (succ five)) (equal (fact five) onetwenty)) one
zero