re-solved the mutual recursion problem, just for fun. Close, but not exactly like...
authorChris <chris.barker@nyu.edu>
Sat, 21 Feb 2015 20:08:14 +0000 (15:08 -0500)
committerChris <chris.barker@nyu.edu>
Sat, 21 Feb 2015 20:08:14 +0000 (15:08 -0500)
exercises/_assignment4_answers.mdwn

index ac1ab6e..fa8bfae 100644 (file)
@@ -24,4 +24,33 @@ What about `add 2 X`?
 So `add n X <~~> X` for all (finite) natural numbers `n`.
 
 
+Solutions to the factorial problem and the mutual recursion problem:
 
+let true = \y n. y in
+let false = \y n. n in
+let pair = \a b. \v. v a b in
+let fst = \a b. a in   ; aka true
+let snd = \a b. b in   ; aka false
+let zero = \s z. z in
+let succ = \n s z. s (n s z) in
+let zero? = \n. n (\p. false) true in
+let pred = \n. n (\p. p (\a b. pair (succ a) a)) (pair zero zero) snd in
+let add = \l r. r succ l in
+let mult = \l r. r (add l) 0 in
+let Y = \h. (\u. h (u u)) (\u. h (u u)) in
+
+let fact = Y (\f n . zero? n 1 (mult n (f (pred n)))) in
+
+let Y1 = \f g . (\u v . f(u u v)(v v u))
+                (\u v . f(u u v)(v v u))
+                (\v u . g(v v u)(u u v)) in
+
+let Y2 = \f g . Y1 g f in
+
+let proto_even = \e o n. zero? n true (o (pred n)) in
+let proto_odd = \o e n. zero? n false (e (pred n)) in
+
+let even = Y1 proto_even proto_odd in
+let odd = Y2 proto_even proto_odd in
+
+odd 3