Skip to content

Commit c3de822

Browse files
committed
Making Evarutil independent from Reductionops.
1 parent e98d727 commit c3de822

12 files changed

+82
-73
lines changed

dev/printers.mllib

+3-2
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,15 @@ Evd
123123
Sigma
124124
Glob_ops
125125
Redops
126+
Pretype_errors
127+
Evarutil
126128
Reductionops
127129
Inductiveops
128130
Arguments_renaming
129131
Nativenorm
130132
Retyping
131133
Cbv
132-
Pretype_errors
133-
Evarutil
134+
134135
Evardefine
135136
Evarsolve
136137
Recordops

pretyping/evarutil.ml

+33-28
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@ open Namegen
1717
open Pre_env
1818
open Environ
1919
open Evd
20-
open Pretype_errors
2120
open Sigma.Notations
2221

22+
let safe_evar_value sigma ev =
23+
try Some (Evd.existential_value sigma ev)
24+
with NotInstantiatedEvar | Not_found -> None
25+
2326
(** Combinators *)
2427

2528
let evd_comb0 f evdref =
@@ -61,22 +64,41 @@ let rec flush_and_check_evars sigma c =
6164

6265
(* let nf_evar_key = Profile.declare_profile "nf_evar" *)
6366
(* let nf_evar = Profile.profile2 nf_evar_key Reductionops.nf_evar *)
64-
let nf_evar = Reductionops.nf_evar
67+
68+
let rec whd_evar sigma c =
69+
match kind_of_term c with
70+
| Evar ev ->
71+
let (evk, args) = ev in
72+
let args = Array.map (fun c -> whd_evar sigma c) args in
73+
(match safe_evar_value sigma (evk, args) with
74+
Some c -> whd_evar sigma c
75+
| None -> c)
76+
| Sort (Type u) ->
77+
let u' = Evd.normalize_universe sigma u in
78+
if u' == u then c else mkSort (Sorts.sort_of_univ u')
79+
| Const (c', u) when not (Univ.Instance.is_empty u) ->
80+
let u' = Evd.normalize_universe_instance sigma u in
81+
if u' == u then c else mkConstU (c', u')
82+
| Ind (i, u) when not (Univ.Instance.is_empty u) ->
83+
let u' = Evd.normalize_universe_instance sigma u in
84+
if u' == u then c else mkIndU (i, u')
85+
| Construct (co, u) when not (Univ.Instance.is_empty u) ->
86+
let u' = Evd.normalize_universe_instance sigma u in
87+
if u' == u then c else mkConstructU (co, u')
88+
| _ -> c
89+
90+
let rec nf_evar sigma t = Constr.map (fun t -> nf_evar sigma t) (whd_evar sigma t)
91+
6592
let j_nf_evar sigma j =
6693
{ uj_val = nf_evar sigma j.uj_val;
6794
uj_type = nf_evar sigma j.uj_type }
68-
let j_nf_betaiotaevar sigma j =
69-
{ uj_val = nf_evar sigma j.uj_val;
70-
uj_type = Reductionops.nf_betaiota sigma j.uj_type }
7195
let jl_nf_evar sigma jl = List.map (j_nf_evar sigma) jl
72-
let jv_nf_betaiotaevar sigma jl =
73-
Array.map (j_nf_betaiotaevar sigma) jl
7496
let jv_nf_evar sigma = Array.map (j_nf_evar sigma)
7597
let tj_nf_evar sigma {utj_val=v;utj_type=t} =
7698
{utj_val=nf_evar sigma v;utj_type=t}
7799

78100
let nf_evars_universes evm =
79-
Universes.nf_evars_and_universes_opt_subst (Reductionops.safe_evar_value evm)
101+
Universes.nf_evars_and_universes_opt_subst (safe_evar_value evm)
80102
(Evd.universe_subst evm)
81103

82104
let nf_evars_and_universes evm =
@@ -469,7 +491,7 @@ let rec check_and_clear_in_constr env evdref err ids c =
469491
| Evar (evk,l as ev) ->
470492
if Evd.is_defined !evdref evk then
471493
(* If evk is already defined we replace it by its definition *)
472-
let nc = Reductionops.whd_evar !evdref c in
494+
let nc = whd_evar !evdref c in
473495
(check_and_clear_in_constr env evdref err ids nc)
474496
else
475497
(* We check for dependencies to elements of ids in the
@@ -524,7 +546,7 @@ let rec check_and_clear_in_constr env evdref err ids c =
524546
let evi' = { evi with evar_extra = extra' } in
525547
evdref := Evd.add !evdref evk evi' ;
526548
(* spiwack: /hacking session *)
527-
Reductionops.whd_evar !evdref c
549+
whd_evar !evdref c
528550

529551
| _ -> map_constr (check_and_clear_in_constr env evdref err ids) c
530552

@@ -647,23 +669,6 @@ let undefined_evars_of_evar_info evd evi =
647669
(undefined_evars_of_named_context evd
648670
(named_context_of_val evi.evar_hyps)))
649671

650-
(* [check_evars] fails if some unresolved evar remains *)
651-
652-
let check_evars env initial_sigma sigma c =
653-
let rec proc_rec c =
654-
match kind_of_term c with
655-
| Evar (evk,_ as ev) ->
656-
(match existential_opt_value sigma ev with
657-
| Some c -> proc_rec c
658-
| None ->
659-
if not (Evd.mem initial_sigma evk) then
660-
let (loc,k) = evar_source evk sigma in
661-
match k with
662-
| Evar_kinds.ImplicitArg (gr, (i, id), false) -> ()
663-
| _ -> error_unsolvable_implicit loc env sigma evk None)
664-
| _ -> iter_constr proc_rec c
665-
in proc_rec c
666-
667672
(* spiwack: this is a more complete version of
668673
{!Termops.occur_evar}. The latter does not look recursively into an
669674
[evar_map]. If unification only need to check superficially, tactics
@@ -692,7 +697,7 @@ let subterm_source evk (loc,k) =
692697

693698
(** Term exploration up to instantiation. *)
694699
let kind_of_term_upto sigma t =
695-
Constr.kind (Reductionops.whd_evar sigma t)
700+
Constr.kind (whd_evar sigma t)
696701

697702
(** [eq_constr_univs_test sigma1 sigma2 t u] tests equality of [t] and
698703
[u] up to existential variable instantiation and equalisable

pretyping/evarutil.mli

+3-6
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ val new_evar_instance :
7878

7979
val make_pure_subst : evar_info -> constr array -> (Id.t * constr) list
8080

81+
val safe_evar_value : evar_map -> existential -> constr option
82+
8183
(** {6 Evars/Metas switching...} *)
8284

8385
val non_instantiated : evar_map -> evar_info Evar.Map.t
@@ -96,9 +98,6 @@ val has_undefined_evars : evar_map -> constr -> bool
9698

9799
val is_ground_term : evar_map -> constr -> bool
98100
val is_ground_env : evar_map -> env -> bool
99-
(** [check_evars env initial_sigma extended_sigma c] fails if some
100-
new unresolved evar remains in [c] *)
101-
val check_evars : env -> evar_map -> evar_map -> constr -> unit
102101

103102
(** [gather_dependent_evars evm seeds] classifies the evars in [evm]
104103
as dependent_evars and goals (these may overlap). A goal is an
@@ -134,6 +133,7 @@ val judge_of_new_Type : 'r Sigma.t -> (unsafe_judgment, 'r) Sigma.sigma
134133
(** [flush_and_check_evars] raise [Uninstantiated_evar] if an evar remains
135134
uninstantiated; [nf_evar] leaves uninstantiated evars as is *)
136135

136+
val whd_evar : evar_map -> constr -> constr
137137
val nf_evar : evar_map -> constr -> constr
138138
val j_nf_evar : evar_map -> unsafe_judgment -> unsafe_judgment
139139
val jl_nf_evar :
@@ -151,9 +151,6 @@ val nf_evar_info : evar_map -> evar_info -> evar_info
151151
val nf_evar_map : evar_map -> evar_map
152152
val nf_evar_map_undefined : evar_map -> evar_map
153153

154-
val j_nf_betaiotaevar : evar_map -> unsafe_judgment -> unsafe_judgment
155-
val jv_nf_betaiotaevar :
156-
evar_map -> unsafe_judgment array -> unsafe_judgment array
157154
(** Presenting terms without solved evars *)
158155

159156
val nf_evars_universes : evar_map -> constr -> constr

pretyping/pretyping.ml

+17
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,23 @@ let check_extra_evars_are_solved env current_sigma pending =
235235
| _ ->
236236
error_unsolvable_implicit loc env current_sigma evk None) pending
237237

238+
(* [check_evars] fails if some unresolved evar remains *)
239+
240+
let check_evars env initial_sigma sigma c =
241+
let rec proc_rec c =
242+
match kind_of_term c with
243+
| Evar (evk,_ as ev) ->
244+
(match existential_opt_value sigma ev with
245+
| Some c -> proc_rec c
246+
| None ->
247+
if not (Evd.mem initial_sigma evk) then
248+
let (loc,k) = evar_source evk sigma in
249+
match k with
250+
| Evar_kinds.ImplicitArg (gr, (i, id), false) -> ()
251+
| _ -> Pretype_errors.error_unsolvable_implicit loc env sigma evk None)
252+
| _ -> Constr.iter proc_rec c
253+
in proc_rec c
254+
238255
let check_evars_are_solved env current_sigma frozen pending =
239256
check_typeclasses_instances_are_solved env current_sigma frozen;
240257
check_problems_are_solved env current_sigma;

pretyping/pretyping.mli

+4
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ val solve_remaining_evars : inference_flags ->
130130
val check_evars_are_solved :
131131
env -> (* current map: *) evar_map -> (* map to check: *) pending -> unit
132132

133+
(** [check_evars env initial_sigma extended_sigma c] fails if some
134+
new unresolved evar remains in [c] *)
135+
val check_evars : env -> evar_map -> evar_map -> constr -> unit
136+
133137
(**/**)
134138
(** Internal of Pretyping... *)
135139
val pretype :

pretyping/pretyping.mllib

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
Locusops
2+
Pretype_errors
3+
Evarutil
24
Reductionops
35
Inductiveops
46
Vnorm
57
Arguments_renaming
68
Nativenorm
79
Retyping
810
Cbv
9-
Pretype_errors
1011
Find_subterm
11-
Evarutil
1212
Evardefine
1313
Evarsolve
1414
Recordops

pretyping/reductionops.ml

+3-27
Original file line numberDiff line numberDiff line change
@@ -594,9 +594,7 @@ let pr_state (tm,sk) =
594594
(*** Reduction Functions Operators ***)
595595
(*************************************)
596596

597-
let safe_evar_value sigma ev =
598-
try Some (Evd.existential_value sigma ev)
599-
with NotInstantiatedEvar | Not_found -> None
597+
let safe_evar_value = Evarutil.safe_evar_value
600598

601599
let safe_meta_value sigma ev =
602600
try Some (Evd.meta_value sigma ev)
@@ -1183,30 +1181,8 @@ let whd_zeta c = Stack.zip (local_whd_state_gen zeta Evd.empty (c,Stack.empty))
11831181
(****************************************************************************)
11841182

11851183
(* Replacing defined evars for error messages *)
1186-
let rec whd_evar sigma c =
1187-
match kind_of_term c with
1188-
| Evar ev ->
1189-
let (evk, args) = ev in
1190-
let args = Array.map (fun c -> whd_evar sigma c) args in
1191-
(match safe_evar_value sigma (evk, args) with
1192-
Some c -> whd_evar sigma c
1193-
| None -> c)
1194-
| Sort (Type u) ->
1195-
let u' = Evd.normalize_universe sigma u in
1196-
if u' == u then c else mkSort (Sorts.sort_of_univ u')
1197-
| Const (c', u) when not (Univ.Instance.is_empty u) ->
1198-
let u' = Evd.normalize_universe_instance sigma u in
1199-
if u' == u then c else mkConstU (c', u')
1200-
| Ind (i, u) when not (Univ.Instance.is_empty u) ->
1201-
let u' = Evd.normalize_universe_instance sigma u in
1202-
if u' == u then c else mkIndU (i, u')
1203-
| Construct (co, u) when not (Univ.Instance.is_empty u) ->
1204-
let u' = Evd.normalize_universe_instance sigma u in
1205-
if u' == u then c else mkConstructU (co, u')
1206-
| _ -> c
1207-
1208-
let nf_evar =
1209-
local_strong whd_evar
1184+
let whd_evar = Evarutil.whd_evar
1185+
let nf_evar = Evarutil.nf_evar
12101186

12111187
(* lazy reduction functions. The infos must be created for each term *)
12121188
(* Note by HH [oct 08] : why would it be the job of clos_norm_flags to add

tactics/hints.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1072,7 +1072,7 @@ let prepare_hint check (poly,local) env init (sigma,c) =
10721072
subst := (evar,mkVar id)::!subst;
10731073
mkNamedLambda id t (iter (replace_term evar (mkVar id) c)) in
10741074
let c' = iter c in
1075-
if check then Evarutil.check_evars (Global.env()) Evd.empty sigma c';
1075+
if check then Pretyping.check_evars (Global.env()) Evd.empty sigma c';
10761076
let diff = Univ.ContextSet.diff (Evd.universe_context_set sigma) (Evd.universe_context_set init) in
10771077
if poly then IsConstr (c', diff)
10781078
else if local then IsConstr (c', diff)

tactics/rewrite.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1880,7 +1880,7 @@ let build_morphism_signature m =
18801880
let morph = e_app_poly env evd PropGlobal.proper_type [| t; sig_; m |] in
18811881
let evd = solve_constraints env !evd in
18821882
let m = Evarutil.nf_evar evd morph in
1883-
Evarutil.check_evars env Evd.empty evd m; m
1883+
Pretyping.check_evars env Evd.empty evd m; m
18841884

18851885
let default_morphism sign m =
18861886
let env = Global.env () in

toplevel/classes.ml

+3-3
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ let new_instance ?(abstract=false) ?(global=false) poly ctx (instid, bk, cl) pro
191191
let t = it_mkProd_or_LetIn ty_constr (ctx' @ ctx) in
192192
nf t
193193
in
194-
Evarutil.check_evars env Evd.empty !evars termtype;
194+
Pretyping.check_evars env Evd.empty !evars termtype;
195195
let pl, ctx = Evd.universe_context ?names:pl !evars in
196196
let cst = Declare.declare_constant ~internal:Declare.InternalTacticRequest id
197197
(ParameterEntry
@@ -287,7 +287,7 @@ let new_instance ?(abstract=false) ?(global=false) poly ctx (instid, bk, cl) pro
287287
let evm, nf = Evarutil.nf_evar_map_universes !evars in
288288
let termtype = nf termtype in
289289
let _ = (* Check that the type is free of evars now. *)
290-
Evarutil.check_evars env Evd.empty evm termtype
290+
Pretyping.check_evars env Evd.empty evm termtype
291291
in
292292
let term = Option.map nf term in
293293
if not (Evd.has_undefined evm) && not (Option.is_empty term) then
@@ -361,7 +361,7 @@ let context poly l =
361361
let _, ((env', fullctx), impls) = interp_context_evars env evars l in
362362
let subst = Evarutil.evd_comb0 Evarutil.nf_evars_and_universes evars in
363363
let fullctx = Context.Rel.map subst fullctx in
364-
let ce t = Evarutil.check_evars env Evd.empty !evars t in
364+
let ce t = Pretyping.check_evars env Evd.empty !evars t in
365365
let () = List.iter (fun decl -> Context.Rel.Declaration.iter_constr ce decl) fullctx in
366366
let ctx =
367367
try named_of_rel_context fullctx

toplevel/himsg.ml

+11-2
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,15 @@ let rec contract3' env a b c = function
7676
let y,x = contract3' env a b c x in
7777
y,CannotSolveConstraint ((pb,env,t,u),x)
7878

79+
(** Ad-hoc reductions *)
80+
81+
let j_nf_betaiotaevar sigma j =
82+
{ uj_val = Evarutil.nf_evar sigma j.uj_val;
83+
uj_type = Reductionops.nf_betaiota sigma j.uj_type }
84+
85+
let jv_nf_betaiotaevar sigma jl =
86+
Array.map (j_nf_betaiotaevar sigma) jl
87+
7988
(** Printers *)
8089

8190
let pr_lconstr c = quote (pr_lconstr c)
@@ -322,7 +331,7 @@ let explain_unification_error env sigma p1 p2 = function
322331

323332
let explain_actual_type env sigma j t reason =
324333
let env = make_all_name_different env in
325-
let j = Evarutil.j_nf_betaiotaevar sigma j in
334+
let j = j_nf_betaiotaevar sigma j in
326335
let t = Reductionops.nf_betaiota sigma t in
327336
(** Actually print *)
328337
let pe = pr_ne_context_of (str "In environment") env sigma in
@@ -337,7 +346,7 @@ let explain_actual_type env sigma j t reason =
337346
ppreason ++ str ".")
338347

339348
let explain_cant_apply_bad_type env sigma (n,exptyp,actualtyp) rator randl =
340-
let randl = Evarutil.jv_nf_betaiotaevar sigma randl in
349+
let randl = jv_nf_betaiotaevar sigma randl in
341350
let exptyp = Evarutil.nf_evar sigma exptyp in
342351
let actualtyp = Reductionops.nf_betaiota sigma actualtyp in
343352
let rator = Evarutil.j_nf_evar sigma rator in

toplevel/record.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ let typecheck_params_and_fields def id pl t ps nots fs =
156156
let evars, nf = Evarutil.nf_evars_and_universes evars in
157157
let newps = Context.Rel.map nf newps in
158158
let newfs = Context.Rel.map nf newfs in
159-
let ce t = Evarutil.check_evars env0 Evd.empty evars t in
159+
let ce t = Pretyping.check_evars env0 Evd.empty evars t in
160160
List.iter (iter_constr ce) (List.rev newps);
161161
List.iter (iter_constr ce) (List.rev newfs);
162162
Evd.universe_context ?names:pl evars, nf arity, template, imps, newps, impls, newfs

0 commit comments

Comments
 (0)