diff --git a/theories/proofmode/tactics.v b/theories/proofmode/tactics.v index 890a1e6b02db1fae73d444d7d60b92d17f1ab257..965b59745f19887a509df927df63c8758c439d14 100644 --- a/theories/proofmode/tactics.v +++ b/theories/proofmode/tactics.v @@ -475,7 +475,14 @@ Tactic Notation "iSpecializeCore" open_constr(t) "as" constr(p) := let pat := spec_pat.parse pat in lazymatch type of H with | string => - lazymatch eval compute in (p && negb (existsb spec_pat_modal pat)) with + (* The lemma [tac_specialize_persistent_helper] allows one to use all + spatial hypotheses for both proving the premises of the lemma we + specialize as well as those of the remaining goal. We can only use it when + the result of the specialization is persistent, and no modality is + eliminated. As an optimization, we do not use this when only universal + quantifiers are instantiated. *) + lazymatch eval compute in + (bool_decide (pat ≠[]) && p && negb (existsb spec_pat_modal pat)) with | true => eapply tac_specialize_persistent_helper with _ H _ _ _; [env_reflexivity || fail "iSpecialize:" H "not found"