@@ -17,9 +17,12 @@ open Namegen
17
17
open Pre_env
18
18
open Environ
19
19
open Evd
20
- open Pretype_errors
21
20
open Sigma.Notations
22
21
22
+ let safe_evar_value sigma ev =
23
+ try Some (Evd. existential_value sigma ev)
24
+ with NotInstantiatedEvar | Not_found -> None
25
+
23
26
(* * Combinators *)
24
27
25
28
let evd_comb0 f evdref =
@@ -61,22 +64,41 @@ let rec flush_and_check_evars sigma c =
61
64
62
65
(* let nf_evar_key = Profile.declare_profile "nf_evar" *)
63
66
(* 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
+
65
92
let j_nf_evar sigma j =
66
93
{ uj_val = nf_evar sigma j.uj_val;
67
94
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 }
71
95
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
74
96
let jv_nf_evar sigma = Array. map (j_nf_evar sigma)
75
97
let tj_nf_evar sigma {utj_val =v ;utj_type =t } =
76
98
{utj_val= nf_evar sigma v;utj_type= t}
77
99
78
100
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)
80
102
(Evd. universe_subst evm)
81
103
82
104
let nf_evars_and_universes evm =
@@ -469,7 +491,7 @@ let rec check_and_clear_in_constr env evdref err ids c =
469
491
| Evar (evk ,l as ev ) ->
470
492
if Evd. is_defined ! evdref evk then
471
493
(* 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
473
495
(check_and_clear_in_constr env evdref err ids nc)
474
496
else
475
497
(* 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 =
524
546
let evi' = { evi with evar_extra = extra' } in
525
547
evdref := Evd. add ! evdref evk evi' ;
526
548
(* spiwack: /hacking session *)
527
- Reductionops. whd_evar ! evdref c
549
+ whd_evar ! evdref c
528
550
529
551
| _ -> map_constr (check_and_clear_in_constr env evdref err ids) c
530
552
@@ -647,23 +669,6 @@ let undefined_evars_of_evar_info evd evi =
647
669
(undefined_evars_of_named_context evd
648
670
(named_context_of_val evi.evar_hyps)))
649
671
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
-
667
672
(* spiwack: this is a more complete version of
668
673
{!Termops.occur_evar}. The latter does not look recursively into an
669
674
[evar_map]. If unification only need to check superficially, tactics
@@ -692,7 +697,7 @@ let subterm_source evk (loc,k) =
692
697
693
698
(* * Term exploration up to instantiation. *)
694
699
let kind_of_term_upto sigma t =
695
- Constr. kind (Reductionops. whd_evar sigma t)
700
+ Constr. kind (whd_evar sigma t)
696
701
697
702
(* * [eq_constr_univs_test sigma1 sigma2 t u] tests equality of [t] and
698
703
[u] up to existential variable instantiation and equalisable
0 commit comments