sig
  type id = string
  type op2 = Typeinf_syntax.op2 = LT | GT | Eq | Add | Sub | Mul
  type const = Typeinf_syntax.const = Int of int | Bool of bool
  module Implicit :
    sig
      type exp =
        Typeinf_syntax.Implicit.exp =
          Const of Typeinf.const
        | Op2 of Typeinf.op2 * Typeinf.Implicit.exp * Typeinf.Implicit.exp
        | If of Typeinf.Implicit.exp * Typeinf.Implicit.exp *
            Typeinf.Implicit.exp
        | Id of Typeinf.id
        | Let of Typeinf.id * Typeinf.Implicit.exp * Typeinf.Implicit.exp
        | Fun of Typeinf.id * Typeinf.Implicit.exp
        | Fix of Typeinf.id * Typeinf.Implicit.exp
        | App of Typeinf.Implicit.exp * Typeinf.Implicit.exp
        | Empty
        | Cons of Typeinf.Implicit.exp * Typeinf.Implicit.exp
        | Head of Typeinf.Implicit.exp
        | Tail of Typeinf.Implicit.exp
        | IsEmpty of Typeinf.Implicit.exp
        | Pair of Typeinf.Implicit.exp * Typeinf.Implicit.exp
        | ProjL of Typeinf.Implicit.exp
        | ProjR of Typeinf.Implicit.exp
      val from_file : string -> Typeinf.Implicit.exp
      val from_string : string -> Typeinf.Implicit.exp
    end
  module Explicit :
    sig
      type metavar = int * string
      type typ =
        Typeinf_syntax.Explicit.typ =
          TMetavar of Typeinf.Explicit.metavar
        | TInt
        | TBool
        | TFun of Typeinf.Explicit.typ * Typeinf.Explicit.typ
        | TPair of Typeinf.Explicit.typ * Typeinf.Explicit.typ
        | TList of Typeinf.Explicit.typ
      type exp =
        Typeinf_syntax.Explicit.exp =
          Const of Typeinf.const
        | Op2 of Typeinf.op2 * Typeinf.Explicit.exp * Typeinf.Explicit.exp
        | If of Typeinf.Explicit.exp * Typeinf.Explicit.exp *
            Typeinf.Explicit.exp
        | Id of Typeinf.id
        | Let of Typeinf.id * Typeinf.Explicit.exp * Typeinf.Explicit.exp
        | Fun of Typeinf.id * Typeinf.Explicit.typ * Typeinf.Explicit.exp
        | Fix of Typeinf.id * Typeinf.Explicit.typ * Typeinf.Explicit.exp
        | App of Typeinf.Explicit.exp * Typeinf.Explicit.exp
        | Empty of Typeinf.Explicit.typ
        | Cons of Typeinf.Explicit.exp * Typeinf.Explicit.exp
        | Head of Typeinf.Explicit.exp
        | Tail of Typeinf.Explicit.exp
        | IsEmpty of Typeinf.Explicit.exp
        | Pair of Typeinf.Explicit.exp * Typeinf.Explicit.exp
        | ProjL of Typeinf.Explicit.exp
        | ProjR of Typeinf.Explicit.exp
      val string_of_exp : Typeinf.Explicit.exp -> string
      val print_exp : Typeinf.Explicit.exp -> unit
      val string_of_typ : Typeinf.Explicit.typ -> string
      val print_typ : Typeinf.Explicit.typ -> unit
    end
end