From: Chris Date: Sat, 21 Feb 2015 20:08:14 +0000 (-0500) Subject: re-solved the mutual recursion problem, just for fun. Close, but not exactly like... X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=commitdiff_plain;h=d5c513588401ea7cd9388cd11512c39533b3d5fa re-solved the mutual recursion problem, just for fun. Close, but not exactly like the solution in the hint --- diff --git a/exercises/_assignment4_answers.mdwn b/exercises/_assignment4_answers.mdwn index ac1ab6eb..fa8bfae4 100644 --- a/exercises/_assignment4_answers.mdwn +++ b/exercises/_assignment4_answers.mdwn @@ -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