Local Open Scope pred.
Hint Rewrite @sepcon_emp @emp_sepcon @TT_and @andp_TT
@exp_sepcon1 @exp_sepcon2
@exp_andp1 @exp_andp2
@sepcon_andp_prop @sepcon_andp_prop'
: normalize.
Definition pure {A}{JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{agA: ageable A}{AgeA: Age_alg A}
(P: pred A) : Prop :=
P |-- emp.
Hint Resolve @pure_e : core.
Hint Resolve @pure_emp : core.
Hint Resolve @pure_existential : core.
Hint Rewrite @FF_sepcon @sepcon_FF : normalize.
Hint Rewrite @prop_true_andp using (solve [auto]) : normalize.
Hint Rewrite @true_eq using (solve [auto]) : normalize.
Hint Resolve @pure_con' : core.
Hint Resolve @pure_intersection1 @pure_intersection2 : core.
Hint Rewrite @FF_andp @andp_FF : normalize.
Hint Rewrite @andp_dup : normalize.
Hint Resolve @sepcon_TT : core.
Hint Rewrite @pure_sepcon_TT_andp @pure_sepcon_TT_andp' using (solve [auto]): normalize.
Ltac pull_left A := repeat (rewrite <- (pull_right A) || rewrite <- (pull_right0 A)).
Ltac pull_right A := repeat (rewrite (pull_right A) || rewrite (pull_right0 A)).

Lemma imp_exp_right {B A : Type} `{saA: ageable A}:
forall (x: B) (p: pred A) (q: B -> pred A),
p |-- q x ->
p |-- exp q.