Tactic Notation "assert_PROP" constr(A) :=
first [apply (assert_later_PROP A) | apply (assert_PROP A) | apply (assert_PROP' A)]; [ | intro ].
Tactic Notation "assert_PROP" constr(A) "by" tactic1(t) :=
first [apply (assert_later_PROP A) | apply (assert_PROP A) | apply (assert_PROP' A) ]; [ now t | intro ].
Tactic Notation "assert_PROP" constr(A) "as" simple_intropattern(H)  :=
first [apply (assert_later_PROP A) | apply (assert_PROP A) | apply (assert_PROP' A)]; [ | intro H ].
Tactic Notation "assert_PROP" constr(A) "as" simple_intropattern(H) "by" tactic1(t) :=
first [apply (assert_later_PROP A) | apply (assert_PROP A) | apply (assert_PROP' A)]; [ now t | intro H ].

Lemma assert_LOCAL:
forall Q1 Espec {cs: compspecs} Delta P Q R c Post,
ENTAIL Delta, PROPx P (LOCALx Q (SEPx R)) |-- local (locald_denote Q1) ->
@semax cs Espec Delta (PROPx P (LOCALx (Q1::Q) (SEPx R))) c Post ->
@semax cs Espec Delta (PROPx P (LOCALx Q (SEPx R))) c Post.