sig
  type typ =
      TId of Typeinf_syntax.id
    | TInt
    | TBool
    | TFun of Typeinf_syntax.Explicit.typ * Typeinf_syntax.Explicit.typ
    | TPair of Typeinf_syntax.Explicit.typ * Typeinf_syntax.Explicit.typ
    | TList of Typeinf_syntax.Explicit.typ
  type exp =
      Int of int
    | Bool of bool
    | Arith of Typeinf_syntax.arithOp * Typeinf_syntax.Explicit.exp *
        Typeinf_syntax.Explicit.exp
    | Cmp of Typeinf_syntax.intCmp * Typeinf_syntax.Explicit.exp *
        Typeinf_syntax.Explicit.exp
    | If of Typeinf_syntax.Explicit.exp * Typeinf_syntax.Explicit.exp *
        Typeinf_syntax.Explicit.exp
    | Id of Typeinf_syntax.id
    | Let of Typeinf_syntax.id * Typeinf_syntax.Explicit.exp *
        Typeinf_syntax.Explicit.exp
    | Fun of Typeinf_syntax.id * Typeinf_syntax.Explicit.typ *
        Typeinf_syntax.Explicit.exp
    | Fix of Typeinf_syntax.id * Typeinf_syntax.Explicit.typ *
        Typeinf_syntax.Explicit.exp
    | App of Typeinf_syntax.Explicit.exp * Typeinf_syntax.Explicit.exp
    | Empty of Typeinf_syntax.Explicit.typ
    | Cons of Typeinf_syntax.Explicit.exp * Typeinf_syntax.Explicit.exp
    | Head of Typeinf_syntax.Explicit.exp
    | Tail of Typeinf_syntax.Explicit.exp
    | IsEmpty of Typeinf_syntax.Explicit.exp
    | Pair of Typeinf_syntax.Explicit.exp * Typeinf_syntax.Explicit.exp
    | ProjL of Typeinf_syntax.Explicit.exp
    | ProjR of Typeinf_syntax.Explicit.exp
end