Definition wk_split {A} {JA: Join A} :=
forall a b c d e : A, join a b c -> join d e c -> joins a d -> join_sub d b.

(* Specifications: *)
Lemma crosssplit_wkSplit {A}  {JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{DA: Disj_alg A}{CrA: Cross_alg A}{AG: ageable A}{XA: Age_alg A}:
wk_split.
Lemma wk_pry_apart {A}  {JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{CA: Canc_alg A}{DA: Disj_alg A}{CrA: Cross_alg A}{AG: ageable A}{XA: Age_alg A}:
forall G P Q, wk_split -> superprecise G -> P = ewand G (G * P) ->
(P * Q) && (G * TT) |-- (P * G * (ewand G Q)).
Lemma ewand_overlap {A} {JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{CA: Canc_alg A}{DA: Disj_alg A}{CrA: Cross_alg A}{AG: ageable A}{XA: Age_alg A}:
forall (P Q: pred A),
superprecise Q ->
ewand TT (P * Q) * Q |-- ewand TT (P * Q).
Lemma ewand_derives {A} {JA: Join A}{PA: Perm_alg A}{AG: ageable A}{XA: Age_alg A}:
forall P P' Q Q',  P |-- P' -> Q |-- Q' -> ewand P Q |-- ewand P' Q'.
Lemma ewand_sepcon {A} {JA: Join A}{PA: Perm_alg A}{AG: ageable A}{XA: Age_alg A}: forall P Q R,
(ewand (P * Q) R = ewand P (ewand Q R))%pred.
Lemma ewand_sepcon_assoc {A} {JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{CrA: Cross_alg A}{AG: ageable A}{XA: Age_alg A}:
Trip_alg A ->
forall P Q R: pred A,
(forall w1 w2 w3, join w1 w2 w3 -> P w3 -> P w1) ->
(forall w w', comparable w w' -> P w -> R w' -> joins w w') ->
(ewand TT P) && (ewand TT R) |-- emp ->
(ewand P (Q * R) = (ewand P Q * R))%pred.
Lemma ewand_sepcon2 {A} {JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{CA: Canc_alg A}{DA: Disj_alg A}{CrA: Cross_alg A}{AG: ageable A}{XA: Age_alg A}:
forall
R (SP: superprecise R)
P (H: P = ewand R (R * P))
Q,
ewand P (Q * R) |-- ewand P Q * R.
Lemma sepcon_andp_prop2 {A} {JA: Join A}{PA: Perm_alg A}{AG: ageable A}{XA: Age_alg A}:
forall P Q R,  (P * (!!Q && R) = !!Q && (P * R))%pred.
Lemma sepcon_andp_prop1 {A}{JA: Join A}{PA: Perm_alg A}{agA: ageable A}{AgeA: Age_alg A}:
forall (P: Prop) (Q R: pred A) , ((!! P && Q) * R = !! P && (Q * R))%pred.
Lemma distrib_orp_sepcon {A : Type}{JA : Join A}{PA : Perm_alg A}{agA : ageable A}
{AgeA : Age_alg A}:
forall (P Q R : pred A), ((P || Q) * R = P * R || Q * R)%pred.
Lemma distrib_orp_sepcon2{A : Type}{JA : Join A}{PA : Perm_alg A}{agA : ageable A}
{AgeA : Age_alg A}:
forall (P Q R : pred A),
(R * (P || Q) = R * P || R * Q)%pred.
Lemma ewand_conflict {T}{agT:ageable T}{JT: Join T}{PT: Perm_alg T}{ST: Sep_alg T}{AT: Age_alg T}:
forall P Q R, sepcon P Q |-- FF -> andp P (ewand Q R) |-- FF.
Lemma ewand_TT_sepcon {T}{agT:ageable T}{JT: Join T}{PT: Perm_alg T}{ST: Sep_alg T}{AT: Age_alg T}:
forall P Q R,
(P * Q && ewand R (!!True))%pred |-- (P && ewand R (!!True) * (Q && ewand R (!!True)))%pred.