CClosureLazy reduction.
fconstr is the type of frozen constr
type usubs = fconstr Esubst.subs UVars.puniversestype table_key = Names.Constant.t UVars.puniverses Names.tableKeytype fterm = | FRel of int| FAtom of Constr.constrMetas and Sorts
*)| FFlex of table_key| FInd of Constr.pinductive| FConstruct of Constr.pconstructor * fconstr array| FApp of fconstr * fconstr array| FProj of Names.Projection.t * Sorts.relevance * fconstr| FFix of Constr.fixpoint * usubs| FCoFix of Constr.cofixpoint * usubs| FCaseT of Constr.case_info
* UVars.Instance.t
* Constr.constr array
* Constr.case_return
* fconstr
* Constr.case_branch array
* usubs| FCaseInvert of Constr.case_info
* UVars.Instance.t
* Constr.constr array
* Constr.case_return
* finvert
* fconstr
* Constr.case_branch array
* usubs| FLambda of int
* (Names.Name.t Constr.binder_annot * Constr.constr) list
* Constr.constr
* usubs| FProd of Names.Name.t Constr.binder_annot * fconstr * Constr.constr * usubs| FLetIn of Names.Name.t Constr.binder_annot
* fconstr
* fconstr
* Constr.constr
* usubs| FEvar of Evar.t * Constr.constr list * usubs * evar_repack| FInt of Uint63.t| FFloat of Float64.t| FString of Pstring.t| FArray of UVars.Instance.t * fconstr Parray.t * fconstr| FLIFT of int * fconstr| FCLOS of Constr.constr * usubs| FIrrelevant| FLOCKEDRelevances (eg in binder_annot or case_info) have NOT been substituted when there is a usubs field
type 'a next_native_args = (CPrimitives.arg_kind * 'a) listtype stack_member = | Zapp of fconstr array| ZcaseT of Constr.case_info
* UVars.Instance.t
* Constr.constr array
* Constr.case_return
* Constr.case_branch array
* usubs| Zproj of Names.Projection.Repr.t * Sorts.relevance| Zfix of fconstr * stack| Zprimitive of CPrimitives.t
* Constr.pconstant
* fconstr list
* fconstr next_native_args| Zshift of int| Zupdate of fconstrand stack = stack_member listval empty_stack : stackval check_native_args : CPrimitives.t -> stack -> boolval get_native_args1 :
CPrimitives.t ->
Constr.pconstant ->
stack ->
fconstr list * fconstr * fconstr next_native_args * stackval stack_args_size : stack -> intval inductive_subst :
Declarations.mutual_inductive_body ->
UVars.Instance.t ->
fconstr array ->
usubsval usubst_instance :
'a UVars.puniverses ->
UVars.Instance.t ->
UVars.Instance.tidentity if the first instance is empty
val usubst_binder :
_ UVars.puniverses ->
'a Constr.binder_annot ->
'a Constr.binder_annotTo lazy reduce a constr, create a clos_infos with create_clos_infos, inject the term to reduce with inject; then use a reduction function
val inject : Constr.constr -> fconstrval mk_clos : usubs -> Constr.constr -> fconstrval mk_clos_vect : usubs -> Constr.constr array -> fconstr arrayval term_of_fconstr : fconstr -> Constr.constrval term_of_process : fconstr -> stack -> Constr.constrval destFLambda :
(usubs -> Constr.constr -> fconstr) ->
fconstr ->
Names.Name.t Constr.binder_annot * fconstr * fconstrtype evar_handler = {evar_expand : Constr.constr Constr.pexistential ->
Constr.constr evar_expansion;evar_repack : (Evar.t * Constr.constr list) -> Constr.constr;evar_irrelevant : Constr.constr Constr.pexistential -> bool;qvar_irrelevant : Sorts.QVar.t -> bool;qual_equal : Sorts.Quality.t -> Sorts.Quality.t -> bool;abstr_const : Names.Constant.t ->
(unit, (unit -> Vmemitcodes.to_patch) Vmemitcodes.pbody_code)
Declarations.pconstant_body;}val default_evar_handler : Environ.env -> evar_handlerval lookup_constant_handler :
Environ.env ->
evar_handler ->
Names.Constant.t ->
(unit, (unit -> Vmemitcodes.to_patch) Vmemitcodes.pbody_code)
Declarations.pconstant_bodyval create_conv_infos :
?univs:UGraph.t ->
?evars:evar_handler ->
RedFlags.reds ->
Environ.env ->
clos_infosval create_clos_infos :
?univs:UGraph.t ->
?evars:evar_handler ->
RedFlags.reds ->
Environ.env ->
clos_infosval oracle_of_infos : clos_infos -> Conv_oracle.oracleval create_tab : unit -> clos_tabval info_env : clos_infos -> Environ.envval info_flags : clos_infos -> RedFlags.redsval info_univs : clos_infos -> UGraph.tval unfold_projection :
clos_infos ->
Names.Projection.t ->
Sorts.relevance ->
stack_member optionval push_relevance : clos_infos -> 'b Constr.binder_annot -> clos_infosval push_relevances : clos_infos -> 'b Constr.binder_annot array -> clos_infosval set_info_relevances : clos_infos -> Sorts.relevance Range.t -> clos_infosval info_relevances : clos_infos -> Sorts.relevance Range.tval is_irrelevant : clos_infos -> Sorts.relevance -> boolval eq_quality : clos_infos -> Sorts.Quality.t -> Sorts.Quality.t -> boolval infos_with_reds : clos_infos -> RedFlags.reds -> clos_infosReduction function
val norm_val : clos_infos -> clos_tab -> fconstr -> Constr.constrnorm_val is for strong normalization
val norm_term :
clos_infos ->
clos_tab ->
usubs ->
Constr.constr ->
Constr.constrSame as norm_val but for terms
val whd_val : clos_infos -> clos_tab -> fconstr -> Constr.constrwhd_val is for weak head normalization
whd_stack performs weak head normalization in a given stack. It stops whenever a reduction is blocked.
val skip_irrelevant_stack : clos_infos -> stack -> stackval eta_expand_stack :
clos_infos ->
Names.Name.t Constr.binder_annot ->
stack ->
stackval eta_expand_ind_stack :
Environ.env ->
Constr.pinductive ->
fconstr array ->
(fconstr * stack) ->
stack * stacketa_expand_ind_stack env ind args t computes stacks corresponding to the conversion of the eta expansion of t, considered as an inhabitant of ind, and the constructor of this inductive type applied to arguments args. @assumes t is a rigid term, and not a constructor; that args are valid arguments for the constructor of inductive ind.
Conversion auxiliary functions to do step by step normalisation
Like unfold_reference, but handles primitives: if there are not enough arguments, return None. Otherwise return Some with ZPrimitive added to the stack. Produces a FIrrelevant when the reference is irrelevant and the infos was created with create_conv_infos.
val get_ref_mask : clos_infos -> clos_tab -> table_key -> bool arrayval set_conv : (clos_infos -> clos_tab -> fconstr -> fconstr -> bool) -> unitHook for Reduction