aboutsummaryrefslogtreecommitdiff
path: root/proofs
diff options
context:
space:
mode:
authorherbelin2010-05-13 07:24:56 +0000
committerherbelin2010-05-13 07:24:56 +0000
commit6cca4015db457f91b8eb9cf824f21246cbe7c6e6 (patch)
tree18ea61a1332e519db396c527823981e8145fb4c5 /proofs
parent21c1f0f84540b8871e4c43fde114a7aedf165f60 (diff)
Improved the efficiency of evars traverals thanks to a split of
evar_map into a map for defined evars and a map for undefined evars. Even before Spiwack's new proof engine, some Evd.fold were very costly, e.g. in check_evars or progress_evar_map. With the new proof engine, undefined evars traversals are apparently even more common (at least, it improves significantly the complexity of some calls to omega in JordanCurveTheorem - a new factor 5-7 after the factor 5-6 obtained by removal of evar_merge in clenv_fchain in commit 13007, arriving to figures comparable to the 8.3 ones). git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@13011 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'proofs')
-rw-r--r--proofs/proof.ml2
-rw-r--r--proofs/refiner.ml18
2 files changed, 11 insertions, 9 deletions
diff --git a/proofs/proof.ml b/proofs/proof.ml
index 35f7b4f023..faefc77a79 100644
--- a/proofs/proof.ml
+++ b/proofs/proof.ml
@@ -117,7 +117,7 @@ let return p =
if not (is_done p) then
raise UnfinishedProof
else if has_unresolved_evar p then
- (* spiwack: for compatibility with <= 8.2 proof engine *)
+ (* spiwack: for compatibility with <= 8.3 proof engine *)
raise HasUnresolvedEvar
else
Proofview.return p.state.proofview
diff --git a/proofs/refiner.ml b/proofs/refiner.ml
index 1abd762538..d87d73d310 100644
--- a/proofs/refiner.ml
+++ b/proofs/refiner.ml
@@ -416,17 +416,19 @@ let tclINFO (tac : tactic) gls =
(* Check that holes in arguments have been resolved *)
-let check_evars env sigma evm gl =
+let check_evars env sigma extsigma gl =
let origsigma = gl.sigma in
let rest =
- Evd.fold (fun ev evi acc ->
- if not (Evd.mem origsigma ev) && not (Evd.is_defined sigma ev)
- then Evd.add acc ev evi else acc)
- evm Evd.empty
+ Evd.fold_undefined (fun evk evi acc ->
+ if Evd.is_undefined extsigma evk & not (Evd.mem origsigma evk) then
+ evi::acc
+ else
+ acc)
+ sigma []
in
- if rest <> Evd.empty then
- let (evk,evi) = List.hd (Evd.to_list rest) in
- let (loc,k) = evar_source evk rest in
+ if rest <> [] then
+ let evi = List.hd rest in
+ let (loc,k) = evi.evar_source in
let evi = Evarutil.nf_evar_info sigma evi in
Pretype_errors.error_unsolvable_implicit loc env sigma evi k None