Definition retainer_part (sh: Share.t) := Share.glb Share.Lsh sh.

(* Specifications: *)
Lemma retainer_part_nonreadable: forall sh, ~readable_share (retainer_part sh).
Lemma readable_share_lub: forall a b: Share.t, readable_share b -> readable_share (Share.lub a b).
Lemma retainer_part_join: forall sh1 sh2 sh3, join sh1 sh2 sh3 -> join (retainer_part sh1) (retainer_part sh2) (retainer_part sh3).
Lemma not_readable_Rsh_part: forall sh, ~ readable_share sh -> Share.glb Share.Rsh sh = Share.bot.
Lemma join_parts1: forall L R (HC: Share.comp L = R) sh1 sh2 sh, join sh1 sh2 (Share.glb L sh) -> Share.glb L sh1 = sh1 /\ Share.glb R sh1 = Share.bot.
Lemma join_parts: forall L R (HC: Share.comp L = R) sh1 sh2 sh, join sh1 sh2 (Share.glb L sh) -> Share.glb L sh1 = sh1 /\ Share.glb R sh1 = Share.bot /\ Share.glb L sh2 = sh2 /\ Share.glb R sh2 = Share.bot.
Lemma comp_Rsh_Lsh: Share.comp Share.Rsh = Share.Lsh.
Lemma glb_twice: forall a b, Share.glb a (Share.glb a b) = Share.glb a b.
Lemma glb_Lsh_Rsh': forall sh, Share.glb Share.Lsh (Share.glb Share.Rsh sh) = Share.bot.
Lemma comp_parts_join: forall L R (HC: Share.comp L = R) a b c, join (Share.glb L a) (Share.glb L b) (Share.glb L c) -> join (Share.glb R a) (Share.glb R b) (Share.glb R c) -> join a b c.
Lemma left_right_join: forall a b c, join (Share.glb Share.Lsh a) (Share.glb Share.Lsh b) (Share.glb Share.Lsh c) -> join (Share.glb Share.Rsh a) (Share.glb Share.Rsh b) (Share.glb Share.Rsh c) -> join a b c.
Lemma lub_bot': forall sh, Share.lub Share.bot sh = sh.
Lemma glb_Rsh_Lsh: Share.glb Share.Rsh Share.Lsh = Share.bot.
Lemma join_writable1: forall sh1 sh2 sh, join sh1 sh2 sh -> writable_share sh1 -> writable_share sh.
Lemma join_writable_readable: forall {sh1 sh2 sh}, join sh1 sh2 sh -> writable_share sh1 -> readable_share sh2 -> False.