sig
  type id = ID.t
  type loc = Location.t
  type 'a var = 'Var.t
  type 'a printer = Format.formatter -> '-> unit
  type 'ty defined = { defined_head : Statement.id; defined_ty : 'ty; }
  type ('t, 'ty) equations =
      Eqn_nested of ('ty Statement.var list * 't list * 't * 't list) list
    | Eqn_single of 'ty Statement.var list * 't
    | Eqn_app of ID.t list * 'ty Statement.var list * 't * 't
  type ('t, 'ty) rec_def = {
    rec_defined : 'ty Statement.defined;
    rec_ty_vars : 'ty Statement.var list;
    rec_eqns : ('t, 'ty) Statement.equations;
  }
  type ('t, 'ty) rec_defs = ('t, 'ty) Statement.rec_def list
  type ('t, 'ty) spec_defs = {
    spec_ty_vars : 'ty Statement.var list;
    spec_defined : 'ty Statement.defined list;
    spec_axioms : 't list;
  }
  type 'ty ty_constructor = {
    cstor_name : Statement.id;
    cstor_args : 'ty list;
    cstor_type : 'ty;
  }
  type 'ty tydef = {
    ty_id : Statement.id;
    ty_vars : 'ty Var.t list;
    ty_type : 'ty;
    ty_cstors : 'ty Statement.ty_constructor ID.Map.t;
  }
  type 'ty mutual_types = 'ty Statement.tydef list
  type ('t, 'ty) axiom =
      Axiom_std of 't list
    | Axiom_spec of ('t, 'ty) Statement.spec_defs
    | Axiom_rec of ('t, 'ty) Statement.rec_defs
  type ('t, 'ty) pred_clause = {
    clause_vars : 'ty Statement.var list;
    clause_guard : 't option;
    clause_concl : 't;
  }
  type ('t, 'ty) pred_def = {
    pred_defined : 'ty Statement.defined;
    pred_tyvars : 'ty Statement.var list;
    pred_clauses : ('t, 'ty) Statement.pred_clause list;
  }
  type 't copy_wrt =
      Wrt_nothing
    | Wrt_subset of 't
    | Wrt_quotient of [ `Partial | `Total ] * 't
  type ('t, 'ty) copy = {
    copy_id : ID.t;
    copy_vars : 'ty Var.t list;
    copy_ty : 'ty;
    copy_of : 'ty;
    copy_to : 'ty;
    copy_wrt : 'Statement.copy_wrt;
    copy_abstract : ID.t;
    copy_abstract_ty : 'ty;
    copy_concrete : ID.t;
    copy_concrete_ty : 'ty;
  }
  type decl_attr =
      Attr_card_max of int
    | Attr_card_min of int
    | Attr_card_hint of Cardinality.t
    | Attr_incomplete
    | Attr_abstract
    | Attr_infinite
    | Attr_finite_approx of ID.t
    | Attr_infinite_upcast
    | Attr_pseudo_prop
    | Attr_pseudo_true
    | Attr_exn of exn
  type ('term, 'ty) view =
      Decl of Statement.id * 'ty * Statement.decl_attr list
    | Axiom of ('term, 'ty) Statement.axiom
    | TyDef of [ `Codata | `Data ] * 'ty Statement.mutual_types
    | Pred of [ `Not_wf | `Wf ] * [ `Copred | `Pred ] *
        ('term, 'ty) Statement.pred_def list
    | Copy of ('term, 'ty) Statement.copy
    | Goal of 'term
  type info = { loc : Statement.loc option; name : string option; }
  type (+'term, +'ty) t = private {
    view : ('term, 'ty) Statement.view;
    info : Statement.info;
  }
  type ('t, 'ty) statement = ('t, 'ty) Statement.t
  val mk_defined : ID.t -> 'ty -> 'ty Statement.defined
  val tydef_vars : 'ty Statement.tydef -> 'ty Var.t list
  val tydef_id : 'Statement.tydef -> Statement.id
  val tydef_type : 'ty Statement.tydef -> 'ty
  val tydef_cstors :
    'ty Statement.tydef -> 'ty Statement.ty_constructor ID.Map.t
  val info_default : Statement.info
  val info_of_loc : Location.t option -> Statement.info
  val view : ('term, 'ty) Statement.t -> ('term, 'ty) Statement.view
  val loc : ('a, 'b) Statement.t -> Statement.loc option
  val name : ('a, 'b) Statement.t -> string option
  val info : ('a, 'b) Statement.t -> Statement.info
  val mk_axiom :
    info:Statement.info -> ('a, 'ty) Statement.axiom -> ('a, 'ty) Statement.t
  val mk_ty_def :
    info:Statement.info ->
    [ `Codata | `Data ] ->
    'ty Statement.mutual_types -> ('a, 'ty) Statement.t
  val decl :
    info:Statement.info ->
    attrs:Statement.decl_attr list ->
    Statement.id -> '-> ('b, 'a) Statement.t
  val axiom : info:Statement.info -> 'a list -> ('a, 'b) Statement.t
  val axiom1 : info:Statement.info -> '-> ('a, 'b) Statement.t
  val axiom_spec :
    info:Statement.info ->
    ('a, 'ty) Statement.spec_defs -> ('a, 'ty) Statement.t
  val axiom_rec :
    info:Statement.info ->
    ('a, 'ty) Statement.rec_defs -> ('a, 'ty) Statement.t
  val data :
    info:Statement.info ->
    'ty Statement.mutual_types -> ('a, 'ty) Statement.t
  val codata :
    info:Statement.info ->
    'ty Statement.mutual_types -> ('a, 'ty) Statement.t
  val pred :
    info:Statement.info ->
    wf:[ `Not_wf | `Wf ] ->
    ('t, 'ty) Statement.pred_def list -> ('t, 'ty) Statement.t
  val copred :
    info:Statement.info ->
    wf:[ `Not_wf | `Wf ] ->
    ('t, 'ty) Statement.pred_def list -> ('t, 'ty) Statement.t
  val mk_pred :
    info:Statement.info ->
    wf:[ `Not_wf | `Wf ] ->
    [ `Copred | `Pred ] ->
    ('t, 'ty) Statement.pred_def list -> ('t, 'ty) Statement.t
  val copy :
    info:Statement.info -> ('t, 'ty) Statement.copy -> ('t, 'ty) Statement.t
  val goal : info:Statement.info -> '-> ('a, 'b) Statement.t
  val mk_mutual_ty :
    ID.t ->
    ty_vars:'ty Var.t list ->
    cstors:(ID.t * 'ty list * 'ty) list -> ty:'ty -> 'ty Statement.tydef
  val mk_copy :
    wrt:'Statement.copy_wrt ->
    of_:'ty ->
    to_:'ty ->
    ty:'ty ->
    abstract:ID.t * 'ty ->
    concrete:ID.t * 'ty ->
    vars:'ty Var.t list -> ID.t -> ('t, 'ty) Statement.copy
  val find_rec_def :
    defs:('a, 'b) Statement.rec_def list ->
    ID.t -> ('a, 'b) Statement.rec_def option
  val find_tydef :
    defs:'Statement.tydef list -> ID.t -> 'Statement.tydef option
  val find_pred :
    defs:('a, 'b) Statement.pred_def list ->
    ID.t -> ('a, 'b) Statement.pred_def option
  val map_defined :
    f:('ty -> 'ty2) -> 'ty Statement.defined -> 'ty2 Statement.defined
  val map_eqns :
    term:('-> 't2) ->
    ty:('ty -> 'ty2) ->
    ('t, 'ty) Statement.equations -> ('t2, 'ty2) Statement.equations
  val map_eqns_bind :
    bind:('acc -> 'ty Var.t -> 'acc * 'ty1 Var.t) ->
    term:('acc -> 'term -> 'term1) ->
    'acc ->
    ('term, 'ty) Statement.equations -> ('term1, 'ty1) Statement.equations
  val map_clause :
    term:('-> 't2) ->
    ty:('ty -> 'ty2) ->
    ('t, 'ty) Statement.pred_clause -> ('t2, 'ty2) Statement.pred_clause
  val map_clause_bind :
    bind:('acc -> 'ty Var.t -> 'acc * 'ty1 Var.t) ->
    term:('acc -> 'term -> 'term1) ->
    'acc ->
    ('term, 'ty) Statement.pred_clause ->
    ('term1, 'ty1) Statement.pred_clause
  val map_rec_def :
    term:('-> 't2) ->
    ty:('ty -> 'ty2) ->
    ('t, 'ty) Statement.rec_def -> ('t2, 'ty2) Statement.rec_def
  val map_rec_def_bind :
    bind:('-> 'Var.t -> 'a * 'Var.t) ->
    term:('-> '-> 'e) ->
    ty:('-> '-> 'c) ->
    '-> ('d, 'b) Statement.rec_def -> ('e, 'c) Statement.rec_def
  val map_rec_defs :
    term:('-> 't2) ->
    ty:('ty -> 'ty2) ->
    ('t, 'ty) Statement.rec_defs -> ('t2, 'ty2) Statement.rec_defs
  val map_ty_def :
    ty:('ty -> 'ty2) -> 'ty Statement.tydef -> 'ty2 Statement.tydef
  val map_ty_defs :
    ty:('ty -> 'ty2) ->
    'ty Statement.mutual_types -> 'ty2 Statement.mutual_types
  val map_spec_defs :
    term:('-> 't2) ->
    ty:('ty -> 'ty2) ->
    ('t, 'ty) Statement.spec_defs -> ('t2, 'ty2) Statement.spec_defs
  val map_spec_defs_bind :
    bind:('b_acc -> 'ty Var.t -> 'b_acc * 'ty2 Var.t) ->
    term:('b_acc -> '-> 't2) ->
    ty:('b_acc -> 'ty -> 'ty2) ->
    'b_acc ->
    ('t, 'ty) Statement.spec_defs -> ('t2, 'ty2) Statement.spec_defs
  val map_pred :
    term:('-> 'a1) ->
    ty:('-> 'b1) ->
    ('a, 'b) Statement.pred_def -> ('a1, 'b1) Statement.pred_def
  val map_pred_bind :
    bind:('acc -> 'ty Var.t -> 'acc * 'ty2 Var.t) ->
    term:('acc -> 'term -> 'term2) ->
    ty:('acc -> 'ty -> 'ty2) ->
    'acc ->
    ('term, 'ty) Statement.pred_def -> ('term2, 'ty2) Statement.pred_def
  val map_preds :
    term:('-> 'a1) ->
    ty:('-> 'b1) ->
    ('a, 'b) Statement.pred_def list -> ('a1, 'b1) Statement.pred_def list
  val map_copy_wrt :
    ('-> 'b) -> 'Statement.copy_wrt -> 'Statement.copy_wrt
  val map_copy_bind :
    bind:('-> 'Statement.var -> 'a * 'Statement.var) ->
    term:('-> '-> 'e) ->
    ty:('-> '-> 'c) ->
    '-> ('d, 'b) Statement.copy -> ('e, 'c) Statement.copy
  val map_copy :
    term:('t1 -> 't2) ->
    ty:('ty1 -> 'ty2) ->
    ('t1, 'ty1) Statement.copy -> ('t2, 'ty2) Statement.copy
  val map :
    term:('-> 't2) ->
    ty:('ty -> 'ty2) -> ('t, 'ty) Statement.t -> ('t2, 'ty2) Statement.t
  val map_bind :
    bind:('b_acc -> 'ty Var.t -> 'b_acc * 'ty2 Var.t) ->
    term:('b_acc -> '-> 't2) ->
    ty:('b_acc -> 'ty -> 'ty2) ->
    'b_acc -> ('t, 'ty) Statement.t -> ('t2, 'ty2) Statement.t
  val fold_bind :
    bind:('b_acc -> 'ty Var.t -> 'b_acc) ->
    term:('b_acc -> '-> '-> 'a) ->
    ty:('b_acc -> '-> 'ty -> 'a) ->
    'b_acc -> '-> ('t, 'ty) Statement.t -> 'a
  val fold :
    term:('-> '-> 'a) ->
    ty:('-> 'ty -> 'a) -> '-> ('t, 'ty) Statement.t -> 'a
  val iter :
    term:('-> unit) -> ty:('ty -> unit) -> ('t, 'ty) Statement.t -> unit
  val id_of_defined : 'Statement.defined -> ID.t
  val ty_of_defined : 'ty Statement.defined -> 'ty
  val defined_of_rec : ('a, 'ty) Statement.rec_def -> 'ty Statement.defined
  val defined_of_recs :
    ('a, 'ty) Statement.rec_defs -> 'ty Statement.defined Sequence.t
  val defined_of_spec :
    ('a, 'ty) Statement.spec_defs -> 'ty Statement.defined Sequence.t
  val defined_of_pred : ('a, 'ty) Statement.pred_def -> 'ty Statement.defined
  val defined_of_preds :
    ('a, 'ty) Statement.pred_def list -> 'ty Statement.defined Sequence.t
  val defined_of_cstor :
    'ty Statement.ty_constructor -> 'ty Statement.defined
  val defined_of_data :
    'ty Statement.tydef -> 'ty Statement.defined Sequence.t
  val defined_of_datas :
    'ty Statement.mutual_types -> 'ty Statement.defined Sequence.t
  val defined_of_copy :
    ('a, 'ty) Statement.copy -> 'ty Statement.defined Sequence.t
  val ids_of_copy : ('a, 'b) Statement.copy -> ID.t Sequence.t
  val print_attr : Statement.decl_attr Statement.printer
  val print_attrs : Statement.decl_attr list Statement.printer
  module Print :
    functor (Pt : TermInner.PRINT) (Pty : TermInner.PRINT->
      sig
        val print_spec_defs :
          (Pt.t, Pty.t) Statement.spec_defs Statement.printer
        val print_clause :
          (Pt.t, Pty.t) Statement.pred_clause Statement.printer
        val print_clauses :
          (Pt.t, Pty.t) Statement.pred_clause list Statement.printer
        val print_pred_def :
          (Pt.t, Pty.t) Statement.pred_def Statement.printer
        val print_pred_defs :
          (Pt.t, Pty.t) Statement.pred_def list Statement.printer
        val print_eqns :
          ID.t -> (Pt.t, Pty.t) Statement.equations Statement.printer
        val print_rec_def : (Pt.t, Pty.t) Statement.rec_def Statement.printer
        val print_rec_defs :
          (Pt.t, Pty.t) Statement.rec_def list Statement.printer
        val print_tydef : Pty.t Statement.tydef Statement.printer
        val print_tydefs :
          ([ `Codata | `Data ] * Pty.t Statement.tydef list)
          Statement.printer
        val print_copy : (Pt.t, Pty.t) Statement.copy Statement.printer
        val print : (Pt.t, Pty.t) Statement.t Statement.printer
      end
end