sig
  type tag_update_info = SurfaceSyntax.tag_update_info
  type field = SurfaceSyntax.field
  type pattern =
      PVar of Variable.name * TypeCore.location
    | PTuple of Expressions.pattern list
    | PConstruct of TypeCore.resolved_datacon *
        (TypeCore.Field.name * Expressions.pattern) list
    | POpen of TypeCore.var
    | PAs of Expressions.pattern * Expressions.pattern
    | PAny
  type rec_flag = SurfaceSyntax.rec_flag = Nonrecursive | Recursive
  type expression =
      EConstraint of Expressions.expression * TypeCore.typ
    | EVar of TypeCore.db_index
    | EOpen of TypeCore.var
    | EBuiltin of string
    | ELet of Expressions.rec_flag * Expressions.patexpr list *
        Expressions.expression
    | EFun of (TypeCore.type_binding * TypeCore.flavor) list * TypeCore.typ *
        TypeCore.typ * Expressions.expression
    | EAssign of Expressions.expression * Expressions.field *
        Expressions.expression
    | EAssignTag of Expressions.expression * TypeCore.resolved_datacon *
        Expressions.tag_update_info
    | EAccess of Expressions.expression * Expressions.field
    | EApply of Expressions.expression * Expressions.expression
    | ETApply of Expressions.expression * Expressions.tapp * Kind.kind
    | EMatch of bool * Expressions.expression * Expressions.patexpr list
    | ETuple of Expressions.expression list
    | EConstruct of TypeCore.resolved_datacon *
        (TypeCore.Field.name * Expressions.expression) list
    | EIfThenElse of bool * Expressions.expression * Expressions.expression *
        Expressions.expression
    | ELocated of Expressions.expression * TypeCore.location
    | EInt of int
    | EExplained of Expressions.expression
    | EGive of Expressions.expression * Expressions.expression
    | ETake of Expressions.expression * Expressions.expression
    | EOwns of Expressions.expression * Expressions.expression
    | EFail
  and tapp = Ordered of TypeCore.typ | Named of Variable.name * TypeCore.typ
  and patexpr = Expressions.pattern * Expressions.expression
  type declaration =
      DMultiple of Expressions.rec_flag * Expressions.patexpr list
    | DLocated of Expressions.declaration * TypeCore.location
  type declaration_group = Expressions.declaration list
  type sig_item = Variable.name * TypeCore.typ
  type toplevel_item =
      DataTypeGroup of TypeCore.data_type_group
    | ValueDeclarations of Expressions.declaration_group
    | PermDeclaration of Expressions.sig_item
  type implementation = Expressions.toplevel_item list
  type interface = Expressions.toplevel_item list
  val e_unit : Expressions.expression
  val p_unit : Expressions.pattern
  val eunloc : Expressions.expression -> Expressions.expression
  val tsubst_toplevel_items :
    TypeCore.typ ->
    TypeCore.db_index ->
    Expressions.toplevel_item list -> Expressions.toplevel_item list
  val tpsubst_expr :
    TypeCore.env ->
    TypeCore.typ ->
    TypeCore.var -> Expressions.expression -> Expressions.expression
  val esubst_toplevel_items :
    Expressions.expression ->
    TypeCore.db_index ->
    Expressions.toplevel_item list -> Expressions.toplevel_item list
  val epsubst :
    TypeCore.env ->
    Expressions.expression ->
    TypeCore.var -> Expressions.expression -> Expressions.expression
  type substitution_kit = {
    subst_type : TypeCore.typ -> TypeCore.typ;
    subst_expr : Expressions.expression -> Expressions.expression;
    subst_decl : Expressions.declaration list -> Expressions.declaration list;
    subst_pat : Expressions.pattern list -> Expressions.pattern list;
    vars : TypeCore.var list;
  }
  val bind_evars :
    TypeCore.env ->
    TypeCore.type_binding list -> TypeCore.env * Expressions.substitution_kit
  val bind_vars :
    TypeCore.env ->
    SurfaceSyntax.type_binding list ->
    TypeCore.env * Expressions.substitution_kit
  val bind_patexprs :
    TypeCore.env ->
    Expressions.rec_flag ->
    (Expressions.pattern * Expressions.expression) list ->
    TypeCore.env * (Expressions.pattern * Expressions.expression) list *
    Expressions.substitution_kit
  module ExprPrinter :
    sig
      val print_maybe_qualified_datacon :
        Datacon.name SurfaceSyntax.maybe_qualified -> MzPprint.document
      val pmaybe_qualified_datacon :
        Buffer.t -> Datacon.name SurfaceSyntax.maybe_qualified -> unit
      val print_datacon_reference :
        SurfaceSyntax.datacon_reference -> MzPprint.document
      val print_patexpr :
        TypeCore.env ->
        Expressions.pattern * Expressions.expression -> MzPprint.document
      val print_patexprs :
        TypeCore.env ->
        (Expressions.pattern * Expressions.expression) list ->
        MzPprint.document
      val print_pat :
        TypeCore.env -> Expressions.pattern -> MzPprint.document
      val print_tapp : TypeCore.env -> Expressions.tapp -> MzPprint.document
      val print_expr :
        TypeCore.env -> Expressions.expression -> MzPprint.document
      val print_rec_flag : Expressions.rec_flag -> MzPprint.document
      val print_ebinder :
        TypeCore.env ->
        TypeCore.type_binding * TypeCore.flavor -> MzPprint.document
      val print_binder :
        TypeCore.env ->
        (Variable.name * Kind.kind * TypeCore.location) * TypeCore.flavor ->
        MzPprint.document
      val print_declaration :
        TypeCore.env ->
        Expressions.declaration ->
        TypeCore.env * MzPprint.document *
        (Expressions.declaration list -> Expressions.declaration list)
      val print_declarations :
        TypeCore.env -> Expressions.declaration list -> MzPprint.document
      val print_sig_item :
        TypeCore.env -> Variable.name * TypeCore.typ -> MzPprint.document
      val psigitem :
        Buffer.t -> TypeCore.env * (Variable.name * TypeCore.typ) -> unit
      val pdeclarations :
        Buffer.t -> TypeCore.env * Expressions.declaration list -> unit
      val pexpr : Buffer.t -> TypeCore.env * Expressions.expression -> unit
      val ppat : Buffer.t -> TypeCore.env * Expressions.pattern -> unit
    end
end