(** The cross split axiom looks unwieldly,
    but here we show that it arises naturally
    as a kind of distributivity property.
    Cross split can be rendered, with some accuracy,
    as "the separation algebra is distributive."
 *)

  (** This definition mirrors the definition of
      distributivity in a join-semilattice.  This
      definition generalizes the standard notion of
      distributivity in a lattice, but only mentions
      of the lattice operators.  Here we transplant
      the semilattice definition into the setting
      of separation algebras.
    *)
  Definition sa_distributive (A: Type) {JOIN: Join A} :=
    forall a b x z,
      join a b z ->
      constructive_join_sub x z ->
      {a' : A & {b' : A &
           (constructive_join_sub a' a * constructive_join_sub b' b * join a' b' x)%type}}.

(* Specifications: *)
Theorem cross_split_distibutive {A} `{Perm_alg A}{SA: Sep_alg A}{CS: Cross_alg A} : sa_distributive A.
Theorem distributive_cross_split {A} `{Perm_alg A}{SA: Sep_alg A}{CA: Canc_alg A}: sa_distributive A -> Cross_alg A.
Lemma distributive_equiv: forall A, @sa_distributive _ (@Join_equiv A).
Lemma cross_split_equiv : forall A, @Cross_alg _ (@Join_equiv A).
Lemma distributive_fun: forall A (JOIN: Join A) (key: Type), sa_distributive A -> @sa_distributive (key -> A) (Join_fun key A JOIN).