false = t _ = t true = t t id = a : a const = a b : a pair = t if = cond then else : t (t else (t t then)) t cond y = ((mut wait fun : wait mut (x : fun (wait mut x))) (x : x x) (a0 a1 a2 : t (t a0) (t t a2) a1)) compose = f g x : f (g x) triage = leaf stem fork : t (t leaf stem) fork test = triage "Leaf" (_ : "Stem") (_ _ : "Fork") matchBool = (ot of : triage of (_ : ot) (_ _ : ot) ) lAnd = (triage (_ : false) (_ x : x) (_ _ x : x)) lOr = (triage (x : x) (_ _ : true) (_ _ _ : true)) matchPair = a : triage _ _ a not? = matchBool false true and? = matchBool id (_ : false) or? = (x z : matchBool (matchBool true true z) (matchBool true false z) x) xor? = (x z : matchBool (matchBool false true z) (matchBool true false z) x) equal? = y (self : triage (triage true (_ : false) (_ _ : false)) (ax : triage false (self ax) (_ _ : false)) (ax ay : triage false (_ : false) (bx by : lAnd (self ax bx) (self ay by)))) succ = y (self : triage 1 t (triage (t (t t)) (_ tail : t t (self tail)) t))