###### # # Solution to Assignment 1 (by Hongwei Xi) # ###### # please note that only tail-recursion is used in the solution. plus = fix f. lam x. lam y. case x of Z => y | S x => f (x) (S y) mult = let val aux = fix f. lam x. lam y. lam res. case x of Z => res | S x => f (x) (y) (plus y res) in lam x. lam y. aux x y Z exp = let val aux = fix f. lam x. lam y. lam res. case x of Z => res | S x => f (x) (y) (mult y res) in lam x. lam y. aux x y (S Z) # 'subgeq x y' returns the pair '(x - y, x >= y)' subgeq = fix f. lam x. lam y. case y of Z => (x, S Z) | S y => (case x of Z => (Z, Z) | S x => f x y) quorem = let val aux fix f. lam x. lam y. lam res let val p = subgeq x y in case (snd p) of Z => (res, x) | S u => f (fst p) y (S res) in lam x. lam y. aux x y Z