Definition joincell_split {a b ab c abc} :
  joincell a b = Some ab -> joincell ab c = Some abc ->
  { bc | joincell b c = Some bc /\ joincell a bc = Some abc }.

(* Specifications: *)
Lemma join_split a b ab c abc : join a b ab -> join ab c abc -> exists bc, join b c bc /\ join a bc abc.
Lemma join_emptymap_l a : join emptymap a a.
Lemma join_emptymap_r a : join a emptymap a.
Lemma joins_emptymap_l a : joins emptymap a.
Lemma joins_emptymap_r a : joins a emptymap.
Lemma join_comm a b c : join a b c -> join b a c.
Lemma joins_sym a b : joins a b -> joins b a.
Lemma joins_pointwise m n : joins m n <-> (forall x, joincell (m x) (n x) <> None).
Lemma join_joins_distrib a b ab : join a b ab -> forall c, joins ab c -> joins a c /\ joins b c.
Lemma join_joins_distrib' a b ab : join a b ab -> forall c, joins a c -> joins b c -> joins ab c.
Lemma join_split a b ab c abc : join a b ab -> join ab c abc -> exists bc, join b c bc /\ join a bc abc.
Lemma join_emptymap_l a : join emptymap a a.
Lemma join_emptymap_r a : join a emptymap a.
Lemma joins_emptymap_l a : joins emptymap a.
Lemma joins_emptymap_r a : joins a emptymap.
Lemma join_comm a b c : join a b c -> join b a c.
Lemma joins_sym a b : joins a b -> joins b a.
Lemma joins_pointwise m n : joins m n <-> (forall x, joincell (m x) (n x) <> None).
Lemma join_joins_distrib a b ab : join a b ab -> forall c, joins ab c -> joins a c /\ joins b c.
Lemma join_joins_distrib' a b ab : join a b ab -> forall c, joins a c -> joins b c -> joins ab c.
Lemma join_split a b ab c abc : join a b ab -> join ab c abc -> exists bc, join b c bc /\ join a bc abc.
Lemma join_emptymap_l a : join emptymap a a.
Lemma join_emptymap_r a : join a emptymap a.
Lemma joins_emptymap_l a : joins emptymap a.
Lemma joins_emptymap_r a : joins a emptymap.
Lemma join_comm a b c : join a b c -> join b a c.
Lemma joins_sym a b : joins a b -> joins b a.
Lemma joins_pointwise m n : joins m n <-> (forall x, joincell (m x) (n x) <> None).
Lemma join_joins_distrib a b ab : join a b ab -> forall c, joins ab c -> joins a c /\ joins b c.
Lemma join_joins_distrib' a b ab : join a b ab -> forall c, joins a c -> joins b c -> joins ab c.