diff options
| author | herbelin | 2010-05-13 07:24:56 +0000 |
|---|---|---|
| committer | herbelin | 2010-05-13 07:24:56 +0000 |
| commit | 6cca4015db457f91b8eb9cf824f21246cbe7c6e6 (patch) | |
| tree | 18ea61a1332e519db396c527823981e8145fb4c5 /proofs | |
| parent | 21c1f0f84540b8871e4c43fde114a7aedf165f60 (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.ml | 2 | ||||
| -rw-r--r-- | proofs/refiner.ml | 18 |
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 |
