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.
(* Definition split_rmap (m: rmap) : rmap * rmap := (proj1_sig (make_rmap _ (split_rmap_valid1 m) (level m) (split_rmap_ok1 m)), proj1_sig (make_rmap _ (split_rmap_valid2 m) (level m) (split_rmap_ok2 m))). *)

Lemma is_resource_pred_YES_LK lock_size (l: address) (R: pred rmap) sh:
is_resource_pred
(fun l' => yesat (SomeP rmaps.Mpred (fun _ => R)) (LK lock_size (snd l' - snd l)) sh l')
(fun r (l': address) n => exists p, r = YES sh p (LK lock_size (snd l' - snd l))
(SomeP rmaps.Mpred (fun _ => approx n R))).