(************************************************************************) (* * The Rocq Prover / The Rocq Development Team *) (* v * Copyright INRIA, CNRS and contributors *) (* Type@{ s|...}] is squashed at a given instantiation if any quality in the list is not smaller than [s]. NB: if [s] is a variable SometimesSquashed contains SProp ie non ground instantiations are squashed. *) (** {7 Datas specific to a single type of a block of mutually inductive type } *) type one_inductive_body = { (** {8 Primitive datas } *) mind_typename : Id.t; (** Name of the type: [Ii] *) mind_arity_ctxt : Constr.rel_context; (** Arity context of [Ii]. It includes the context of parameters, that is, it has the form [paramdecls, realdecls_i] such that [Ui] (see above) is [forall realdecls_i, si] for some sort [si] and such that [Ii] has thus type [forall paramdecls, forall realdecls_i, si]. The context itself is represented internally as a list in reverse order [[realdecl_i{r_i};...;realdecl_i1;paramdecl_m;...;paramdecl_1]]. *) mind_sort : Sorts.t; (** Arity sort *) mind_user_arity : types; (** Original user arity, convertible to [mkArity (mind_arity_ctxt, mind_sort)]. As such it contains the parameters. (not necessarily a syntactic arity, eg [relation A] instead of [A -> A -> Prop]) *) mind_record : record_info; (** The record information *) mind_consnames : Id.t array; (** Names of the constructors: [cij] *) mind_user_lc : types array; (** Types of the constructors with parameters: [forall params, Tij], where the recursive occurrences of the inductive types in [Tij] (i.e. in the type of the j-th constructor of the i-th types of the block a shown above) have the form [Ind ((mind,0),u)], ..., [Ind ((mind,n-1),u)] for [u] the canonical abstract instance associated to [mind_universes] and [mind] the name to which the inductive block is bound in the environment. *) (** {8 Derived datas } *) 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_squashed : squash_info option; (** Is elimination restricted to the inductive's sort? *) mind_nf_lc : (rel_context * 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 [(decls_ij, Ii params realargs_ij)] where [decls_ij] is the concatenation of the context of parameters (possibly with let-ins) and of the arguments of the constructor (possibly with let-ins). This context is internally represented as a list [[cstrdecl_ij{q_ij};...;cstrdecl_ij1;paramdecl_m;...;paramdecl_1]] such that the constructor in fine has type [forall paramdecls, forall cstrdecls_ij, Ii params realargs_ij] with [params] referring to the assumptions of [paramdecls] and [realargs_ij] being the "indices" specific to the constructor. *) 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_automaton : recarg Rtree.Automaton.t; (** Minimal automaton generated from the inductive tree *) mind_relevance : Sorts.relevance; (* XXX this is redundant with mind_sort, is it actually worth keeping? *) mind_relies_on_indices_not_mattering : bool; (** true if this inductive relies on indices not mattering, i.e. its behavior would change under -indices-matter. *) (** {8 Datas for bytecode compilation } *) mind_nb_constant : int; (** number of constant constructor *) mind_nb_args : int; (** number of no constant constructor *) mind_reloc_tbl : Vmvalues.reloc_table; } type recursivity_kind = | Finite (** = inductive *) | CoFinite (** = coinductive *) | BiFinite (** = non-recursive, like in "Record" definitions *) (** {7 Datas associated to a full block of mutually inductive types } *) type mutual_inductive_body = { mind_packets : one_inductive_body array; (** The component of the mutual inductive block *) mind_finite : recursivity_kind; (** Whether the type is inductive, coinductive or non-recursive *) mind_hyps : Constr.named_context; (** Section hypotheses on which the block depends *) mind_univ_hyps : UVars.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 : UVars.Variance.t array option; (** Variance info, [None] when non-cumulative. *) mind_sec_variance : UVars.Variance.t array option; (** Variance info for section polymorphic universes. [None] outside sections. The final variance once all sections are discharged is [mind_sec_variance ++ mind_variance]. *) 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_body (** {6 Rewrite rules } *) type 'q quality_pattern = 'q Sorts.Quality.pattern = | PQVar of 'q | PQConstant of Sorts.Quality.constant | PQGlobal of Sorts.QGlobal.t type ('q, 'u) instance_mask = ('q, 'u) UVars.Instance.mask type ('q, 'u) sort_pattern = ('q, 'u) Sorts.pattern = | PSProp | PSSProp | PSSet | PSType of 'u | PSGlobal of Sorts.QGlobal.t * 'u | PSQSort of 'q * 'u (** Patterns are internally represented as pairs of a head-pattern and a list of eliminations Eliminations correspond to elements of the stack in a reduction machine, they represent a pattern with a hole, to be filled with the head-pattern *) type head_pattern = | PHRel of int | PHSort of (int option, int option) sort_pattern | PHSymbol of Constant.t * (int option, int option) instance_mask | PHInd of inductive * (int option, int option) instance_mask | PHConstr of constructor * (int option, int option) instance_mask | PHInt of Uint63.t | PHFloat of Float64.t | PHString of Pstring.t | PHLambda of pattern_argument array * head_elimination | PHProd of pattern_argument array * pattern_argument and pattern_elimination = | PEApp of pattern_argument array | PECase of inductive * pattern_argument * pattern_argument array | PEProj of Projection.Repr.t and head_elimination = head_pattern * pattern_elimination list and pattern_argument = | EHole of int | EHoleIgnored | ERigid of head_elimination type machine_rewrite_rule = { nvars : int * int * int; lhs_pat : (int option, int option) instance_mask * pattern_elimination list; rhs : constr; } (** {6 Representation of rewrite rules in the kernel } *) (** [(c, { lhs_pat = (u, elims); rhs })] in this list stands for [(PHSymbol (c,u), elims) ==> rhs] *) type rewrite_rules_body = { rewrules_rules : (Constant.t * machine_rewrite_rule) list; } (** {6 Module declarations } *) type mod_body = [ `ModBody ] type mod_type = [ `ModType ] (** Functor expressions are forced to be on top of other expressions *) type ('ty,'a) functorize = | NoFunctor of 'a | MoreFunctor of 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 Id.t list * ModPath.t | WithDef of Id.t list * 'uconstr type 'uconstr module_alg_expr = | MEident of ModPath.t | MEapply of 'uconstr module_alg_expr * 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 * UVars.AbstractContext.t option) functor_alg_expr (** A component of a module structure *) type ('mod_body, 'mod_type) structure_field_body = | SFBconst of constant_body | SFBmind of mutual_inductive_body | SFBrules of rewrite_rules_body | SFBmodule of 'mod_body | SFBmodtype of 'mod_type (** 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 ('mod_body, 'mod_type) structure_body = (Id.t * ('mod_body, 'mod_type) structure_field_body) list