Global Instance compatible_refl : Reflexive compatible.
Global Instance compatible_comm : Symmetric compatible.

(* Specifications: *)
Lemma map_add_comm : forall m1 m2, compatible m1 m2 -> map_add m1 m2 = map_add m2 m1.
Lemma map_add_assoc : forall m1 m2 m3, map_add (map_add m1 m2) m3 = map_add m1 (map_add m2 m3).
Lemma compatible_add_assoc : forall m1 m2 m3, compatible m1 m2 ->
compatible (map_add m1 m2) m3 -> compatible m1 (map_add m2 m3).
Lemma compatible_incl : forall m1 m2 m (Hcompat : compatible m2 m) (Hincl : map_incl m1 m2), compatible m1 m.
Lemma map_incl_add : forall m1 m2, map_incl m1 (map_add m1 m2).
Lemma map_incl_compatible : forall m1 m2 m3 (Hincl1 : map_incl m1 m3) (Hincl2 : map_incl m2 m3),
compatible m1 m2.
Lemma map_add_incl : forall m1 m2 m3, map_incl m1 m3 -> map_incl m2 m3 -> map_incl (map_add m1 m2) m3.
Global Instance map_join : Join (A -> option B) :=
fun a b c => forall k v, c k = Some v <-> a k = Some v \/ b k = Some v.
Lemma map_join_spec : forall m1 m2 m3, join m1 m2 m3 <-> compatible m1 m2 /\ m3 = map_add m1 m2.
Global Program Instance map_PCM : Ghost := { valid a := True; Join_G := map_join }.