fix System F booleans
[lambda.git] / exercises / _assignment4_answers.mdwn
index ac1ab6e..135e06c 100644 (file)
@@ -24,4 +24,33 @@ What about `add 2 X`?
 So `add n X <~~> X` for all (finite) natural numbers `n`.
 
 
 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