Module R := R0.
Hint Resolve (@subp_sepcon _ Join_rmap Perm_rmap Sep_rmap): contractive.
Ltac do_map_arg :=
match goal with |- ?a = ?b =>
match a with context [map ?x _] =>
match b with context [map ?y _] => replace y with x; auto end end end.
Arguments resource_at_empty [phi] _ _.
Ltac inj_pair_tac :=
match goal with H: (@existT ?U ?P ?p ?x = @existT _ _ _ ?y) |- _ =>
generalize (@inj_pair2 U P p x y H); clear H; intro; try (subst x || subst y)
end.
Definition no_preds (r: resource) :=
match r with NO _ _ => True | YES _ _ _ pp => pp=NoneP | PURE _ pp => pp=NoneP end.
Definition empty_rmap' : rmap' :=
((fun _: AV.address => NO Share.bot bot_unreadable), nil).
Definition empty_rmap (n:nat) : rmap := R.squash (n, empty_rmap').
refine (fun f g lev H Hg => match proj2_sig (make_rmap f g lev H Hg) with
| conj _ (conj RESOURCE_AT _) => RESOURCE_AT
end).
Qed.
refine (fun f g lev H Hg => match proj2_sig (make_rmap f g lev H Hg) with
| conj LEVEL _ => LEVEL
end).
Qed.
Instance Join_trace : Join (AV.address -> option (rshare * AV.kind)) :=
(Join_fun AV.address (option (rshare * AV.kind))
(Join_lower (Join_prod rshare Join_rshare AV.kind (Join_equiv AV.kind)))).

Lemma res_option_join:
forall x y z,
join x y z ->
@join _ (@Join_lower (rshare * AV.kind)
(Join_prod rshare Join_rshare AV.kind (Join_equiv AV.kind))) (res_option x) (res_option y) (res_option  z).