(* Disj_alg: adds the property that no nonempty element can join with itself. *)
Class Disj_alg  (t: Type) {J: Join t} :=
   join_self: forall {a b}, join a a b -> identity a.(* Disj_alg: adds the property that no nonempty element can join with itself. *)
Class Disj_alg  (t: Type) {J: Join t} :=
   join_self: forall {a b}, join a a b -> identity a.

(* Specifications: *)
Lemma join_self' {A}{J: Join A}{DA: Disj_alg A} : forall {a b}, join a a b -> a = b.
Lemma unit_identity {A}{J: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{CA: Disj_alg A} : forall {e} b, unit_for e b -> identity e.
Lemma core_identity {A}{J: Join A}{PA: Perm_alg A}{SA: Sep_alg A}: forall a, identity (core a).
Lemma join_ex_identity {A}{J: Join A}{PA: Perm_alg A}{SA: Sep_alg A}: forall a, {e : A & prod (identity e) (unit_for e a) }.
Lemma identity_core {A}{J: Join A}{PA: Perm_alg A}{SA: Sep_alg A}: forall a, identity a -> a = core a.