sig
  type id = ID.t
  type loc = Location.t
  type 'a printer = Format.formatter -> '-> unit
  type ('t, 'ty) def =
      Fun_def of ('t, 'ty) Statement.rec_defs * ('t, 'ty) Statement.rec_def *
        Env.loc option
    | Fun_spec of ('t, 'ty) Statement.spec_defs * Env.loc option
    | Data of [ `Codata | `Data ] * 'ty Statement.mutual_types *
        'ty Statement.tydef
    | Cstor of [ `Codata | `Data ] * 'ty Statement.mutual_types *
        'ty Statement.tydef * 'ty Statement.ty_constructor
    | Pred of [ `Not_wf | `Wf ] * [ `Copred | `Pred ] *
        ('t, 'ty) Statement.pred_def * ('t, 'ty) Statement.pred_def list *
        Env.loc option
    | Copy_ty of ('t, 'ty) Statement.copy
    | Copy_abstract of ('t, 'ty) Statement.copy
    | Copy_concrete of ('t, 'ty) Statement.copy
    | NoDef
  type ('t, 'ty) info = {
    ty : 'ty;
    decl_attrs : Statement.decl_attr list;
    loc : Env.loc option;
    def : ('t, 'ty) Env.def;
  }
  type ('t, 'ty) t = private { infos : ('t, 'ty) Env.info ID.PerTbl.t; }
  exception InvalidDef of Env.id * string
  val pp_invalid_def_ : exn Env.printer
  val create : ?size:int -> unit -> ('a, 'b) Env.t
  val loc : ('a, 'b) Env.info -> Env.loc option
  val def : ('t, 'ty) Env.info -> ('t, 'ty) Env.def
  val ty : ('a, 'ty) Env.info -> 'ty
  val is_fun : ('a, 'b) Env.info -> bool
  val is_rec : ('a, 'b) Env.info -> bool
  val is_data : ('a, 'b) Env.info -> bool
  val is_cstor : ('a, 'b) Env.info -> bool
  val is_not_def : ('a, 'b) Env.info -> bool
  val is_incomplete : ('a, 'b) Env.info -> bool
  val is_abstract : ('a, 'b) Env.info -> bool
  val declare :
    ?loc:Env.loc ->
    attrs:Statement.decl_attr list ->
    env:('t, 'ty) Env.t -> Env.id -> 'ty -> ('t, 'ty) Env.t
  val rec_funs :
    ?loc:Env.loc ->
    env:('t, 'ty) Env.t -> ('t, 'ty) Statement.rec_defs -> ('t, 'ty) Env.t
  val declare_rec_funs :
    ?loc:Env.loc ->
    env:('t, 'ty) Env.t -> ('t, 'ty) Statement.rec_defs -> ('t, 'ty) Env.t
  val spec_funs :
    ?loc:Env.loc ->
    env:('t, 'ty) Env.t -> ('t, 'ty) Statement.spec_defs -> ('t, 'ty) Env.t
  val def_data :
    ?loc:Env.loc ->
    env:('t, 'ty) Env.t ->
    kind:[ `Codata | `Data ] -> 'ty Statement.mutual_types -> ('t, 'ty) Env.t
  val def_preds :
    ?loc:Env.loc ->
    env:('t, 'ty) Env.t ->
    wf:[ `Not_wf | `Wf ] ->
    kind:[ `Copred | `Pred ] ->
    ('t, 'ty) Statement.pred_def list -> ('t, 'ty) Env.t
  val add_copy :
    ?loc:Env.loc ->
    env:('t, 'ty) Env.t -> ('t, 'ty) Statement.copy -> ('t, 'ty) Env.t
  val add_statement :
    env:('t, 'ty) Env.t -> ('t, 'ty) Statement.t -> ('t, 'ty) Env.t
  val add_statement_l :
    env:('t, 'ty) Env.t -> ('t, 'ty) Statement.t list -> ('t, 'ty) Env.t
  val find : env:('t, 'ty) Env.t -> Env.id -> ('t, 'ty) Env.info option
  exception UndefinedID of ID.t
  val find_exn : env:('t, 'ty) Env.t -> Env.id -> ('t, 'ty) Env.info
  val find_ty_exn : env:('t, 'ty) Env.t -> Env.id -> 'ty
  val find_ty : env:('t, 'ty) Env.t -> Env.id -> 'ty option
  module Util :
    functor (T : TermInner.S->
      sig
        type term = T.t
        type ty = T.t
        val ty :
          env:(Env.Util.term, Env.Util.ty) Env.t ->
          Env.Util.term -> Env.Util.ty TermInner.or_error
        val ty_exn :
          env:(Env.Util.term, Env.Util.ty) Env.t ->
          Env.Util.term -> Env.Util.ty
        val info_of_ty :
          env:(Env.Util.term, Env.Util.ty) Env.t ->
          Env.Util.ty ->
          (Env.Util.term, Env.Util.ty) Env.info TermInner.or_error
        exception No_head of Env.Util.ty
        val info_of_ty_exn :
          env:(Env.Util.term, Env.Util.ty) Env.t ->
          Env.Util.ty -> (Env.Util.term, Env.Util.ty) Env.info
      end
  val mem : env:('a, 'b) Env.t -> id:Env.id -> bool
  module Print :
    functor (Pt : TermInner.PRINT) (Pty : TermInner.PRINT->
      sig val print : (Pt.t, Pty.t) Env.t Env.printer end
end