(* The addition of ghost state means that there are rmaps that have only cores for ghost state, but are not cores themselves (since they have ghost state at all). An rmap of this sort is not emp, but is its own unit. *)
Definition cored: pred rmap := ALL P : pred rmap, ALL Q : pred rmap,
P && Q --> P * Q.
Program Definition is_w w: pred rmap := fun w' => necR w w'.
Next Obligation.

(* Specifications: *)
Lemma cored_unit: forall w, cored w = join w w w.
Lemma cored_dup: forall P, P && cored |-- (P && cored) * (P && cored).
Lemma cored_core: forall w, cored (core w).
Lemma cored_duplicable: cored = cored * cored.
Lemma cored_emp: cored |-- bupd emp.
Lemma join_singleton_inv: forall k a b RA c v pp,
join a b (singleton k (existT _ RA (exist _ (core c) v), pp)) ->
a = singleton k (existT _ RA (exist _ (core c) v), pp) \/ b = singleton k (existT _ RA (exist _ (core c) v), pp).
Lemma own_cored: forall {RA: Ghost} g a pp, join a a a -> own g a pp |-- cored.
Lemma own_super_non_expansive: forall {RA: Ghost} n g a pp,
approx n (own g a pp) = approx n (own g a (preds_fmap (approx n) (approx n) pp)).