diff options
| author | coqbot-app[bot] | 2021-03-12 16:22:26 +0000 |
|---|---|---|
| committer | GitHub | 2021-03-12 16:22:26 +0000 |
| commit | 50654a3c660b9e39f7e9d2426b0b53afc48138c5 (patch) | |
| tree | e4501ef5d6ccfa34643fde049e98fd156830bf54 /tactics | |
| parent | d33266649d285b7d8ba5a7093319faa6132d6bc9 (diff) | |
| parent | 285419e99996354ad2056bc38725c7a592124e7c (diff) | |
Merge PR #13907: Algorithmically faster algorithm for term replacing.
Reviewed-by: SkySkimmer
Diffstat (limited to 'tactics')
| -rw-r--r-- | tactics/tactics.ml | 19 |
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 |
