inferCases = [ ("id", "forall[a] a -> a")
             , ("one", "int")
             , ("let x = id in x", "forall[a] a -> a")
             , ("let x = fun y -> y in x", "forall[a] a -> a")
             , ("fun x -> x", "forall[a] a -> a")
             {-, ("fun x -> x", "forall[int] int -> int")-}
             , ("pair", "forall[a b] (a, b) -> pair[a, b]")
             {-, ("pair", "forall[z x] (x, z) -> pair[x, z]")-}
             , ("fun x -> let y = fun z -> z in y", "forall[a b] a -> b -> b")
             , ("let f = fun x -> x in let id = fun y -> y in eq(f, id)", "bool")
             , ("let f = fun x -> x in let id = fun y -> y in eq_curry(f)(id)", "bool")
             , ("let f = fun x -> x in eq(f, succ)", "bool")
             , ("let f = fun x -> x in eq_curry(f)(succ)", "bool")
             , ("let f = fun x -> x in pair(f(one), f(true))", "pair[int, bool]")
             , ("let f = fun x y -> let a = eq(x, y) in eq(x, y) in f", "forall[a] (a, a) -> bool")
             , ("let f = fun x y -> let a = eq_curry(x)(y) in eq_curry(x)(y) in f", "forall[a] (a, a) -> bool")
             , ("id(id)", "forall[a] a -> a")
             , ("choose(fun x y -> x, fun x y -> y)", "forall[a] (a, a) -> a")
             , ("choose_curry(fun x y -> x)(fun x y -> y)", "forall[a] (a, a) -> a")
             , ("let x = id in let y = let z = x(id) in z in y", "forall[a] a -> a")
             , ("cons(id, nil)", "forall[a] list[a -> a]")
             , ("cons_curry(id)(nil)", "forall[a] list[a -> a]")
             , ("let lst1 = cons(id, nil) in let lst2 = cons(succ, lst1) in lst2", "list[int -> int]")
             , ("cons_curry(id)(cons_curry(succ)(cons_curry(id)(nil)))", "list[int -> int]")
             , ("fun x -> let y = x in y", "forall[a] a -> a")
             , ("fun x -> let y = let z = x(fun x -> x) in z in y", "forall[a b] ((a -> a) -> b) -> b")
             , ("fun x -> fun y -> let x = x(y) in x(y)", "forall[a b] (a -> a -> b) -> a -> b")
             , ("fun x -> let y = fun z -> x(z) in y", "forall[a b] (a -> b) -> a -> b")
             , ("fun x -> let y = fun z -> x in y", "forall[a b] a -> b -> a")
             , ("fun x -> fun y -> let x = x(y) in fun x -> y(x)", "forall[a b c] ((a -> b) -> c) -> (a -> b) -> a -> b")
             , ("fun x -> let y = fun z -> z in y(y)", "forall[a b] a -> b -> b")
             , ("fun f -> let x = fun g y -> let _ = g(y) in eq(f, g) in x", "forall[a b] (a -> b) -> (a -> b, a) -> bool")
             , ("let const = fun x -> fun y -> x in const", "forall[a b] a -> b -> a")
             , ("let apply = fun f x -> f(x) in apply", "forall[a b] (a -> b, a) -> b")
             , ("let apply_curry = fun f -> fun x -> f(x) in apply_curry", "forall[a b] (a -> b) -> a -> b")]
inferCases = [ ("id", "forall[a] a -> a")
             , ("one", "int")
             , ("let x = id in x", "forall[a] a -> a")
             , ("let x = fun y -> y in x", "forall[a] a -> a")
             , ("fun x -> x", "forall[a] a -> a")
             {-, ("fun x -> x", "forall[int] int -> int")-}
             , ("pair", "forall[a b] (a, b) -> pair[a, b]")
             {-, ("pair", "forall[z x] (x, z) -> pair[x, z]")-}
             , ("fun x -> let y = fun z -> z in y", "forall[a b] a -> b -> b")
             , ("let f = fun x -> x in let id = fun y -> y in eq(f, id)", "bool")
             , ("let f = fun x -> x in let id = fun y -> y in eq_curry(f)(id)", "bool")
             , ("let f = fun x -> x in eq(f, succ)", "bool")
             , ("let f = fun x -> x in eq_curry(f)(succ)", "bool")
             , ("let f = fun x -> x in pair(f(one), f(true))", "pair[int, bool]")
             , ("let f = fun x y -> let a = eq(x, y) in eq(x, y) in f", "forall[a] (a, a) -> bool")
             , ("let f = fun x y -> let a = eq_curry(x)(y) in eq_curry(x)(y) in f", "forall[a] (a, a) -> bool")
             , ("id(id)", "forall[a] a -> a")
             , ("choose(fun x y -> x, fun x y -> y)", "forall[a] (a, a) -> a")
             , ("choose_curry(fun x y -> x)(fun x y -> y)", "forall[a] (a, a) -> a")
             , ("let x = id in let y = let z = x(id) in z in y", "forall[a] a -> a")
             , ("cons(id, nil)", "forall[a] list[a -> a]")
             , ("cons_curry(id)(nil)", "forall[a] list[a -> a]")
             , ("let lst1 = cons(id, nil) in let lst2 = cons(succ, lst1) in lst2", "list[int -> int]")
             , ("cons_curry(id)(cons_curry(succ)(cons_curry(id)(nil)))", "list[int -> int]")
             , ("fun x -> let y = x in y", "forall[a] a -> a")
             , ("fun x -> let y = let z = x(fun x -> x) in z in y", "forall[a b] ((a -> a) -> b) -> b")
             , ("fun x -> fun y -> let x = x(y) in x(y)", "forall[a b] (a -> a -> b) -> a -> b")
             , ("fun x -> let y = fun z -> x(z) in y", "forall[a b] (a -> b) -> a -> b")
             , ("fun x -> let y = fun z -> x in y", "forall[a b] a -> b -> a")
             , ("fun x -> fun y -> let x = x(y) in fun x -> y(x)", "forall[a b c] ((a -> b) -> c) -> (a -> b) -> a -> b")
             , ("fun x -> let y = fun z -> z in y(y)", "forall[a b] a -> b -> b")
             , ("fun f -> let x = fun g y -> let _ = g(y) in eq(f, g) in x", "forall[a b] (a -> b) -> (a -> b, a) -> bool")
             , ("let const = fun x -> fun y -> x in const", "forall[a b] a -> b -> a")
             , ("let apply = fun f x -> f(x) in apply", "forall[a b] (a -> b, a) -> b")
             , ("let apply_curry = fun f -> fun x -> f(x) in apply_curry", "forall[a b] (a -> b) -> a -> b")]
inferCases = [ ("id", "forall[a] a -> a")
             , ("one", "int")
             , ("let x = id in x", "forall[a] a -> a")
             , ("let x = fun y -> y in x", "forall[a] a -> a")
             , ("fun x -> x", "forall[a] a -> a")
             {-, ("fun x -> x", "forall[int] int -> int")-}
             , ("pair", "forall[a b] (a, b) -> pair[a, b]")
             {-, ("pair", "forall[z x] (x, z) -> pair[x, z]")-}
             , ("fun x -> let y = fun z -> z in y", "forall[a b] a -> b -> b")
             , ("let f = fun x -> x in let id = fun y -> y in eq(f, id)", "bool")
             , ("let f = fun x -> x in let id = fun y -> y in eq_curry(f)(id)", "bool")
             , ("let f = fun x -> x in eq(f, succ)", "bool")
             , ("let f = fun x -> x in eq_curry(f)(succ)", "bool")
             , ("let f = fun x -> x in pair(f(one), f(true))", "pair[int, bool]")
             , ("let f = fun x y -> let a = eq(x, y) in eq(x, y) in f", "forall[a] (a, a) -> bool")
             , ("let f = fun x y -> let a = eq_curry(x)(y) in eq_curry(x)(y) in f", "forall[a] (a, a) -> bool")
             , ("id(id)", "forall[a] a -> a")
             , ("choose(fun x y -> x, fun x y -> y)", "forall[a] (a, a) -> a")
             , ("choose_curry(fun x y -> x)(fun x y -> y)", "forall[a] (a, a) -> a")
             , ("let x = id in let y = let z = x(id) in z in y", "forall[a] a -> a")
             , ("cons(id, nil)", "forall[a] list[a -> a]")
             , ("cons_curry(id)(nil)", "forall[a] list[a -> a]")
             , ("let lst1 = cons(id, nil) in let lst2 = cons(succ, lst1) in lst2", "list[int -> int]")
             , ("cons_curry(id)(cons_curry(succ)(cons_curry(id)(nil)))", "list[int -> int]")
             , ("fun x -> let y = x in y", "forall[a] a -> a")
             , ("fun x -> let y = let z = x(fun x -> x) in z in y", "forall[a b] ((a -> a) -> b) -> b")
             , ("fun x -> fun y -> let x = x(y) in x(y)", "forall[a b] (a -> a -> b) -> a -> b")
             , ("fun x -> let y = fun z -> x(z) in y", "forall[a b] (a -> b) -> a -> b")
             , ("fun x -> let y = fun z -> x in y", "forall[a b] a -> b -> a")
             , ("fun x -> fun y -> let x = x(y) in fun x -> y(x)", "forall[a b c] ((a -> b) -> c) -> (a -> b) -> a -> b")
             , ("fun x -> let y = fun z -> z in y(y)", "forall[a b] a -> b -> b")
             , ("fun f -> let x = fun g y -> let _ = g(y) in eq(f, g) in x", "forall[a b] (a -> b) -> (a -> b, a) -> bool")
             , ("let const = fun x -> fun y -> x in const", "forall[a b] a -> b -> a")
             , ("let apply = fun f x -> f(x) in apply", "forall[a b] (a -> b, a) -> b")
             , ("let apply_curry = fun f -> fun x -> f(x) in apply_curry", "forall[a b] (a -> b) -> a -> b")]