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)))).
Definition split_resource r :=
match r with YES sh rsh k pp =>
(YES (fst (cleave sh)) (cleave_readable1 _ rsh) k pp ,
YES (snd (cleave sh)) (cleave_readable2 _ rsh) k pp)
| PURE k pp => (PURE k pp, PURE k pp)
| NO sh nsh => (NO (fst (cleave sh)) (cleave_nonreadable1 _ nsh),
NO (snd (cleave sh)) (cleave_nonreadable2 _ nsh))
end.

Lemma glb_cleave_lemma1: forall sh0 sh,
Share.glb Share.Rsh sh0 = Share.glb Share.Rsh sh ->
Share.glb Share.Rsh (fst (cleave sh0)) =
Share.glb Share.Rsh (fst (cleave sh)).