list a ::= Nil | Cons a (list a); pair a b ::= Pair a b; ;; id x = x; reverseInto a l = case l of Nil -> a; Cons x xs -> reverseInto (Cons x a) xs end; reverse = reverseInto Nil; swap p = case p of Pair a b -> Pair b a end; dupFirstOfPair p = case p of Pair a b -> Pair a a end; makePair x = Pair x x; makeBPair1 = letrec loop=loop in Pair loop loop; makeBPair2 = Pair (letrec loop1=loop1 in loop1) (letrec loop2=loop2 in loop2); append l1 l2 = case l1 of Nil -> l2; Cons x xs -> Cons x (append xs l2) end; if c t f = case c of True -> t; False -> f end; glb = if True; head l = letrec loop = loop in case l of Nil -> loop; Cons x xs -> x end; tail l = letrec loop = loop in case l of Nil -> loop; Cons x xs -> xs end; concat ll = case ll of Nil -> Nil; Cons xs xss -> append xs (concat xss) end; zip2 l1 l2 = case l1 of Nil -> Nil; Cons l1x l1xs -> case l2 of Nil -> Nil; Cons l2x l2xs -> Cons (Pair l1x l2x) (zip2 l1xs l2xs) end end; likeAppend l1 l2 = case l1 of Nil -> letrec loop = loop in loop; Cons x xs -> Cons x l2 end; split l = case l of Nil -> Pair Nil Nil; Cons a as -> case as of Nil -> Pair (Cons a Nil) Nil; Cons b bs -> case split bs of Pair xx yy -> Pair (Cons a xx) (Cons b yy) end end end; merge pl = case pl of Pair as bs -> case as of Nil -> bs; Cons x xs -> Cons x (merge (Pair bs xs)) end end; splitThenMerge l = merge (split l); take n l = if (n<=0) (Pair n l) (case l of Nil -> (Pair n Nil); Cons x xs -> take (n-1) xs end); reverseAndBottom l = letrec loop=loop in Pair (reverse l) loop; rabAbsCons = reverseAndBottom (Cons (Cons 1 Nil) (Cons (Cons 2 Nil) Nil));