aboutsummaryrefslogtreecommitdiff
path: root/tactics
diff options
context:
space:
mode:
authorcoqbot-app[bot]2021-03-12 16:22:26 +0000
committerGitHub2021-03-12 16:22:26 +0000
commit50654a3c660b9e39f7e9d2426b0b53afc48138c5 (patch)
treee4501ef5d6ccfa34643fde049e98fd156830bf54 /tactics
parentd33266649d285b7d8ba5a7093319faa6132d6bc9 (diff)
parent285419e99996354ad2056bc38725c7a592124e7c (diff)
Merge PR #13907: Algorithmically faster algorithm for term replacing.
Reviewed-by: SkySkimmer
Diffstat (limited to 'tactics')
-rw-r--r--tactics/tactics.ml19
1 files changed, 18 insertions, 1 deletions
diff --git a/tactics/tactics.ml b/tactics/tactics.ml
index cbf12ac22f..67bf8d0d29 100644
--- a/tactics/tactics.ml
+++ b/tactics/tactics.ml
@@ -2796,7 +2796,24 @@ let generalize_goal_gen env sigma ids i ((occs,c,b),na) t cl =
let open Context.Rel.Declaration in
let decls,cl = decompose_prod_n_assum sigma i cl in
let dummy_prod = it_mkProd_or_LetIn mkProp decls in
- let newdecls,_ = decompose_prod_n_assum sigma i (subst_term_gen sigma EConstr.eq_constr_nounivs c dummy_prod) in
+ let newdecls,_ =
+ let c = Termops.collapse_appl sigma c in
+ let arity = Array.length (snd (Termops.decompose_app_vect sigma c)) in
+ let cache = ref Int.Map.empty in
+ let eq sigma k t =
+ let c =
+ try Int.Map.find k !cache
+ with Not_found ->
+ let c = EConstr.Vars.lift k c in
+ let () = cache := Int.Map.add k c !cache in
+ c
+ in
+ (* We use a nounivs equality because generalize morally takes a pattern as
+ argument, so we have to ignore freshly generated sorts. *)
+ EConstr.eq_constr_nounivs sigma c t
+ in
+ decompose_prod_n_assum sigma i (replace_term_gen sigma eq arity (mkRel 1) dummy_prod)
+ in
let cl',sigma' = subst_closed_term_occ env sigma (AtOccs occs) c (it_mkProd_or_LetIn cl newdecls) in
let na = generalized_name env sigma c t ids cl' na in
let r = Retyping.relevance_of_type env sigma t in