Definition cleave (sh: share) :=
  (Share.lub (fst (Share.split (Share.glb Share.Lsh sh))) (fst (Share.split (Share.glb Share.Rsh sh))),
   Share.lub (snd (Share.split (Share.glb Share.Lsh sh))) (snd (Share.split (Share.glb Share.Rsh sh)))).

(* Specifications: *)
Lemma cleave_join: forall sh: share, sepalg.join (fst (cleave sh)) (snd (cleave sh)) sh.
Lemma cleave_readable1: forall sh, readable_share sh -> readable_share (fst (cleave sh)).
Lemma cleave_readable2: forall sh, readable_share sh -> readable_share (snd (cleave sh)).
Lemma rshare_sh_readable: forall r, readable_share (rshare_sh r).
Lemma cleave_nonreadable1: forall sh, ~readable_share sh -> ~ readable_share (fst (cleave sh)).
Lemma cleave_nonreadable2: forall sh, ~readable_share sh -> ~ readable_share (snd (cleave sh)).