diff --git a/iris/base_logic/lib/ghost_map.v b/iris/base_logic/lib/ghost_map.v index 514aad4fcbb1355757970da4be45c3f6e5b0827a..6c0b51e962aee2c3f98e75334aaafd2a2b41cda5 100644 --- a/iris/base_logic/lib/ghost_map.v +++ b/iris/base_logic/lib/ghost_map.v @@ -216,6 +216,20 @@ Section lemmas. Qed. (** Derived big-op versions of above lemmas *) + Lemma ghost_map_lookup_big γ m m0 : + ghost_map_auth γ 1 m -∗ + ([∗ map] k↦v ∈ m0, k ↪[γ] v) -∗ + ⌜m0 ⊆ mâŒ. + Proof. + iInduction m0 as [|k v m0 Hk IH] "IH" using map_ind. + { iIntros "_ _". iPureIntro. (* FIXME embedded proof of [map_empty_subseteq]. *) + apply map_subseteq_spec. intros k v []%lookup_empty_Some. } + rewrite big_sepM_insert //. iIntros "Hauth [Helem Hm0]". + iDestruct (ghost_map_lookup with "Hauth Helem") as %Helem. + iDestruct ("IH" with "Hauth Hm0") as %Hm0. + iPureIntro. apply insert_subseteq_l; done. + Qed. + Lemma ghost_map_insert_big {γ m} m' : m' ##ₘ m → ghost_map_auth γ 1 m ==∗ @@ -230,6 +244,31 @@ Section lemmas. first by apply lookup_union_None. Qed. + Lemma ghost_map_delete_big {γ m m0} : + ghost_map_auth γ 1 m -∗ + ([∗ map] k↦v ∈ m0, k ↪[γ] v) -∗ + |==> ghost_map_auth γ 1 (m ∖ m0). + Proof. + iInduction m0 as [|k v m0 Hk IH] "IH" using map_ind. + { iIntros "Hauth _". + (* FIXME embedded proof of [map_difference_empty]. *) + assert (m ∖ ∅ = m) as ->; last done. + apply map_eq. intros i. apply option_eq. intros x. + rewrite lookup_difference_Some. rewrite lookup_empty. + naive_solver. } + rewrite big_sepM_insert //. iIntros "Hauth [Helem Hm0]". + iMod ("IH" with "Hauth Hm0") as "Hauth". + iMod (ghost_map_delete with "Hauth Helem") as "Hauth". + assert (delete k (m ∖ m0) = m ∖ <[k:=v]> m0) as ->; last done. + { (* FIXME embedded proof of [map_difference_delete_insert]. *) + apply map_eq. intros i. apply option_eq. intros x. + rewrite lookup_delete_Some. rewrite !lookup_difference_Some. split. + - intros (Hne & Hm & Hm0). rewrite lookup_insert_ne //. + - destruct (decide (k = i)) as [->|Hne]. + + rewrite lookup_insert. naive_solver. + + rewrite lookup_insert_ne //. } + Qed. + Theorem ghost_map_update_big {γ m m0} m1 : dom (gset K) m0 = dom (gset K) m1 → ghost_map_auth γ 1 m -∗