DeclarationsThis module defines the internal representation of global declarations. This includes global constants/axioms, mutual inductive definitions, modules and module types
Non-universe polymorphic mode polymorphism (Coq 8.2+): inductives and constants hiding inductives are implicitly polymorphic when applied to parameters, on the universes appearing in the whnf of their parameters and their conclusion, in a template style.
In truly universe polymorphic mode, we always use RegularArity.
type template_universes = {| template_param_levels : Univ.Level.t option list; | 
| template_context : Univ.ContextSet.t; | 
}Inlining level of parameters at functor applications. None means no inlining
A constant can have no body (axiom/parameter), or a transparent body, or an opaque one
type ('a, 'opaque) constant_def = | | Undef of inline | (* a global assumption*) | 
| | Def of 'a | (* or a transparent global definition*) | 
| | OpaqueDef of 'opaque | (* or an opaque global definition*) | 
| | Primitive of CPrimitives.t | (* or a primitive operation*) | 
type typing_flags = {| check_guarded : bool; | (* If  | 
| check_positive : bool; | (* If  | 
| check_universes : bool; | (* If  | 
| conv_oracle : Conv_oracle.oracle; | (* Unfolding strategies for conversion*) | 
| share_reduction : bool; | (* Use by-need reduction algorithm*) | 
| enable_VM : bool; | (* If  | 
| enable_native_compiler : bool; | (* If  | 
| indices_matter : bool; | (* The universe of an inductive type must be above that of its indices.*) | 
| impredicative_set : bool; | (* Predicativity of the  | 
| sprop_allowed : bool; | (* If  | 
| allow_uip : bool; | (* Allow definitional UIP (breaks termination)*) | 
}The typing_flags are instructions to the type-checker which modify its behaviour. The typing flags used in the type-checking of a constant are tracked in their constant_body so that they can be displayed to the user.
type 'opaque pconstant_body = {| const_hyps : Constr.named_context; | (* younger hyp at top*) | 
| const_univ_hyps : Univ.Instance.t; | |
| const_body : ( Constr.t, 'opaque ) constant_def; | |
| const_type : Constr.types; | |
| const_relevance : Sorts.relevance; | |
| const_body_code : Vmemitcodes.body_code option; | |
| const_universes : universes; | |
| const_inline_code : bool; | |
| const_typing_flags : typing_flags; | (* The typing options which were used for type-checking.*) | 
}type constant_body = Opaqueproof.opaque pconstant_bodyRepresentation of mutual inductive types in the kernel
Inductive I1 (params) : U1 := c11 : T11 | ... | c1p1 : T1p1 ... with In (params) : Un := cn1 : Tn1 | ... | cnpn : Tnpn
Record information: If the type is not a record, then NotRecord If the type is a non-primitive record, then FakeRecord If it is a primitive record, for every type in the block, we get:
The kernel does not exploit the difference between NotRecord and FakeRecord. It is mostly used by extraction, and should be extruded from the kernel at some point.
type record_info = | | NotRecord | 
| | FakeRecord | 
| | PrimRecord of (Names.Id.t
               * Names.Label.t array
               * Sorts.relevance array
               * Constr.types array)
                array | 
type inductive_arity =
  ( regular_inductive_arity, template_arity ) declaration_aritytype one_inductive_body = {| mind_typename : Names.Id.t; | (* Name of the type:  | 
| mind_arity_ctxt : Constr.rel_context; | (* Arity context of  | 
| mind_arity : inductive_arity; | (* Arity sort and original user arity*) | 
| mind_consnames : Names.Id.t array; | (* Names of the constructors:  | 
| mind_user_lc : Constr.types array; | (* Types of the constructors with parameters:  | 
| mind_nrealargs : int; | (* Number of expected real arguments of the type (no let, no params)*) | 
| mind_nrealdecls : int; | (* Length of realargs context (with let, no params)*) | 
| mind_kelim : Sorts.family; | (* Highest allowed elimination sort*) | 
| mind_nf_lc : (Constr.rel_context * Constr.types) array; | (* Head normalized constructor types so that their conclusion exposes the inductive type. It includes the parameters, i.e. each component of the array has the form  | 
| mind_consnrealargs : int array; | (* Number of expected proper arguments of the constructors (w/o params)*) | 
| mind_consnrealdecls : int array; | (* Length of the signature of the constructors (with let, w/o params)*) | 
| mind_recargs : wf_paths; | (* Signature of recursive arguments in the constructors*) | 
| mind_relevance : Sorts.relevance; | |
| mind_nb_constant : int; | (* number of constant constructor*) | 
| mind_nb_args : int; | (* number of no constant constructor*) | 
| mind_reloc_tbl : Vmvalues.reloc_table; | 
}Datas specific to a single type of a block of mutually inductive type
type mutual_inductive_body = {| mind_packets : one_inductive_body array; | (* The component of the mutual inductive block*) | 
| mind_record : record_info; | (* The record information*) | 
| mind_finite : recursivity_kind; | (* Whether the type is inductive or coinductive*) | 
| mind_ntypes : int; | (* Number of types in the block*) | 
| mind_hyps : Constr.named_context; | (* Section hypotheses on which the block depends*) | 
| mind_univ_hyps : Univ.Instance.t; | (* Section polymorphic universes.*) | 
| mind_nparams : int; | (* Number of expected parameters including non-uniform ones (i.e. length of mind_params_ctxt w/o let-in)*) | 
| mind_nparams_rec : int; | (* Number of recursively uniform (i.e. ordinary) parameters*) | 
| mind_params_ctxt : Constr.rel_context; | (* The context of parameters (includes let-in declaration)*) | 
| mind_universes : universes; | (* Information about monomorphic/polymorphic/cumulative inductives and their universes*) | 
| mind_template : template_universes option; | |
| mind_variance : Univ.Variance.t array option; | (* Variance info,  | 
| mind_sec_variance : Univ.Variance.t array option; | (* Variance info for section polymorphic universes.  | 
| mind_private : bool option; | (* allow pattern-matching: Some true ok, Some false blocked*) | 
| mind_typing_flags : typing_flags; | (* typing flags at the time of the inductive creation*) | 
}type mind_specif = mutual_inductive_body * one_inductive_bodyFunctor expressions are forced to be on top of other expressions
type ('ty, 'a) functorize = | | NoFunctor of 'a | 
| | MoreFunctor of Names.MBId.t * 'ty * ( 'ty, 'a ) functorize | 
The fully-algebraic module expressions : names, applications, 'with ...'. They correspond to the user entries of non-interactive modules. They will be later expanded into module structures in Mod_typing, and won't play any role into the kernel after that : they are kept only for short module printing and for extraction.
type 'uconstr with_declaration = | | WithMod of Names.Id.t list * Names.ModPath.t | 
| | WithDef of Names.Id.t list * 'uconstr | 
type 'uconstr module_alg_expr = | | MEident of Names.ModPath.t | 
| | MEapply of 'uconstr module_alg_expr * Names.ModPath.t | 
| | MEwith of 'uconstr module_alg_expr * 'uconstr with_declaration | 
type 'uconstr functor_alg_expr = | | MENoFunctor of 'uconstr module_alg_expr | 
| | MEMoreFunctor of 'uconstr functor_alg_expr | 
A module expression is an algebraic expression, possibly functorized.
type module_expression =
  (Constr.constr * Univ.AbstractContext.t option) functor_alg_exprA component of a module structure
type structure_field_body = | | SFBconst of constant_body | 
| | SFBmind of mutual_inductive_body | 
| | SFBmodule of module_body | 
| | SFBmodtype of module_type_body | 
A module structure is a list of labeled components.
Note : we may encounter now (at most) twice the same label in a structure_body, once for a module (SFBmodule or SFBmodtype) and once for an object (SFBconst or SFBmind)
and structure_body = (Names.Label.t * structure_field_body) listA module signature is a structure, with possibly functors on top of it
and module_signature = ( module_type_body, structure_body ) functorizeand module_implementation = | | Abstract | (* no accessible implementation*) | 
| | Algebraic of module_expression | (* non-interactive algebraic expression*) | 
| | Struct of structure_body | (* interactive body living in the parameter context of  | 
| | FullStruct | (* special case of  | 
and 'a generic_module_body = {| mod_mp : Names.ModPath.t; | (* absolute path of the module*) | 
| mod_expr : 'a; | (* implementation*) | 
| mod_type : module_signature; | (* expanded type*) | 
| mod_type_alg : module_expression option; | (* algebraic type*) | 
| mod_delta : Mod_subst.delta_resolver; | (* quotiented set of equivalent constants and inductive names*) | 
| mod_retroknowledge : 'a module_retroknowledge; | 
}For a module, there are five possible situations:
Declare Module M : T then mod_expr = Abstract; mod_type_alg = Some TModule M := E then mod_expr = Algebraic E; mod_type_alg = NoneModule M : T := E then mod_expr = Algebraic E; mod_type_alg = Some TModule M. ... End M then mod_expr = FullStruct; mod_type_alg = NoneModule M : T. ... End M then mod_expr = Struct; mod_type_alg = Some T And of course, all these situations may be functors or not.and module_body = module_implementation generic_module_bodyA module_type_body is just a module_body with no implementation and also an empty mod_retroknowledge. Its mod_type_alg contains the algebraic definition of this module type, or None if it has been built interactively.
and module_type_body = unit generic_module_bodyand _ module_retroknowledge = | | ModBodyRK : Retroknowledge.action list -> module_implementation
                                            module_retroknowledge | 
| | ModTypeRK : unit module_retroknowledge | 
Extra invariants :
MEwith inside a mod_expr implementation : the 'with' syntax is only supported for module typesMEapply can only be another MEapply or a MEident * the argument of MEapply is now directly forced to be a ModPath.t.