Definition prop {A: Type}  (P: Prop) : pred A := (fun _  => P).Definition TT {A}: pred A := prop True.Definition FF  {A}: pred A := prop False.Definition imp {A}  (P Q:pred A) :=
   fun a:A => P a -> Q a.Definition orp {A} (P Q:pred A) :=
   fun a:A => P a \/ Q a.Definition andp {A} (P Q:pred A) :=
   fun a:A => P a /\ Q a.Definition allp {A B: Type} (f: B -> pred A) : pred A
  := fun a => forall b, f b a.Definition exp {A B: Type} (f: B -> pred A) : pred A
  := fun a => exists b, f b a.Notation "'!!' e" := (prop e) (at level 25) : pred.Definition sepcon {A} {JA: Join A}(p q:pred A) := fun z:A =>
  exists x:A, exists y:A, join x y z /\ p x /\ q y.Definition wand {A}  {JA: Join A}  (p q:pred A) := fun y =>
  forall x z, join x y z -> p x -> q z.Definition precise {A}  {JA: Join A}{PA: Perm_alg A}  (P: pred A) : Prop :=
     forall w w1 w2, P w1 -> P w2 -> join_sub w1 w -> join_sub w2 w -> w1=w2.Definition precise2  {A} {JA: Join A}{PA: Perm_alg A}  (P: pred A) : Prop :=
     forall Q R, P * (Q && R) = (P * Q) && (P * R).

Lemma sepcon_assoc {A} {JA: Join A}{PA: Perm_alg A}: forall p q r, (((p * q) * r) = (p * (q * r))).