Local Open Scope pred.
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)).