aboutsummaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
authorPierre-Marie Pédrot2018-12-07 15:59:38 +0100
committerPierre-Marie Pédrot2018-12-07 15:59:38 +0100
commitfa20a54d9fbe0f3872614a592fcef7ef56b05e49 (patch)
tree20ba50d09fe977a7409aa3bd0507762b24d9ba9b /engine
parente5909ae2043fedf57b64005ba57aedd209e6d42d (diff)
parente7d1d0461c51de9ae955bd0ce2a0d977cf7a437a (diff)
Merge PR #8811: EConstr-aware functions to produce kernel entries
Diffstat (limited to 'engine')
-rw-r--r--engine/evarutil.ml12
-rw-r--r--engine/evarutil.mli13
2 files changed, 25 insertions, 0 deletions
diff --git a/engine/evarutil.ml b/engine/evarutil.ml
index 4e1636e321..69ee5223c4 100644
--- a/engine/evarutil.ml
+++ b/engine/evarutil.ml
@@ -50,6 +50,18 @@ let new_global evd x =
(* Expanding/testing/exposing existential variables *)
(****************************************************)
+let finalize ?abort_on_undefined_evars sigma f =
+ let sigma = minimize_universes sigma in
+ let uvars = ref Univ.LSet.empty in
+ let v = f (fun c ->
+ let varsc = EConstr.universes_of_constr sigma c in
+ let c = EConstr.to_constr ?abort_on_undefined_evars sigma c in
+ uvars := Univ.LSet.union !uvars varsc;
+ c)
+ in
+ let sigma = restrict_universe_context sigma !uvars in
+ sigma, v
+
(* flush_and_check_evars fails if an existential is undefined *)
exception Uninstantiated_evar of Evar.t
diff --git a/engine/evarutil.mli b/engine/evarutil.mli
index 0c8d8c9b8a..0e67475778 100644
--- a/engine/evarutil.mli
+++ b/engine/evarutil.mli
@@ -181,6 +181,19 @@ val nf_evars_universes : evar_map -> Constr.constr -> Constr.constr
exception Uninstantiated_evar of Evar.t
val flush_and_check_evars : evar_map -> constr -> Constr.constr
+(** [finalize env sigma f] combines universe minimisation,
+ evar-and-universe normalisation and universe restriction.
+
+ It minimizes universes in [sigma], calls [f] a normalisation
+ function with respect to the updated [sigma] and restricts the
+ local universes of [sigma] to those encountered while running [f].
+
+ Note that the normalizer passed to [f] holds some imperative state
+ in its closure. *)
+val finalize : ?abort_on_undefined_evars:bool -> evar_map ->
+ ((EConstr.t -> Constr.t) -> 'a) ->
+ evar_map * 'a
+
(** {6 Term manipulation up to instantiation} *)
(** Like {!Constr.kind} except that [kind_of_term sigma t] exposes [t]