From ec631db1b18963e2f06a3f66baccac9293b17095 Mon Sep 17 00:00:00 2001 From: Ralf Jung <jung@mpi-sws.org> Date: Sun, 14 Mar 2021 13:43:15 +0100 Subject: [PATCH] add big insert and update lemmas for ghost_map --- iris/base_logic/lib/ghost_map.v | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/iris/base_logic/lib/ghost_map.v b/iris/base_logic/lib/ghost_map.v index bb3d07cdb..514aad4fc 100644 --- a/iris/base_logic/lib/ghost_map.v +++ b/iris/base_logic/lib/ghost_map.v @@ -215,4 +215,47 @@ Section lemmas. rewrite insert_delete. eauto. Qed. + (** Derived big-op versions of above lemmas *) + Lemma ghost_map_insert_big {γ m} m' : + m' ##ₘ m → + ghost_map_auth γ 1 m ==∗ + ghost_map_auth γ 1 (m' ∪ m) ∗ ([∗ map] k ↦ v ∈ m', k ↪[γ] v). + Proof. + revert m; induction m' as [|k v m' Hk IH] using map_ind; iIntros (m Hdisj) "Hm". + { rewrite left_id_L. auto. } + iMod (IH with "Hm") as "[Hm'm Hm']"; first by eapply map_disjoint_insert_l. + decompose_map_disjoint. + rewrite !big_opM_insert // -insert_union_l //. + by iMod (ghost_map_insert with "Hm'm") as "($ & $)"; + first by apply lookup_union_None. + Qed. + + Theorem ghost_map_update_big {γ m m0} m1 : + dom (gset K) m0 = dom (gset K) m1 → + ghost_map_auth γ 1 m -∗ + ([∗ map] k↦v ∈ m0, k ↪[γ] v) -∗ + |==> ghost_map_auth γ 1 (m1 ∪ m) ∗ + [∗ map] k↦v ∈ m1, k ↪[γ] v. + Proof. + iIntros (Hdom) "Hauth Hm0". apply (comm (R:=(↔)) (=)) in Hdom. + iInduction m0 as [|k v m0 Hk] "IH" using map_ind forall (m m1 Hdom). + - rewrite dom_empty_L in Hdom. + apply dom_empty_inv_L in Hdom as ->. + rewrite left_id_L big_sepM_empty. + by iFrame. + - rewrite big_sepM_insert //. + iDestruct "Hm0" as "[Hl Hm0]". + rewrite dom_insert_L in Hdom. + assert (k ∈ dom (gset K) m1) as Hindom by set_solver. + apply elem_of_dom in Hindom as [v' Hlookup]. + iMod (ghost_map_update v' with "Hauth Hl") as "[Hauth Hl]". + iMod ("IH" $! (<[k:=v']> m) (delete k m1) with "[%] Hauth Hm0") as "[Hauth Hm0]". + { apply (not_elem_of_dom (D:=gset K)) in Hk. set_solver. } + (* FIXME this is an embedded proof of [delete_insert_union] *) + rewrite -insert_union_r; last by rewrite lookup_delete. + rewrite insert_union_l insert_delete [<[k:=v']> m1]insert_id; last done. + iFrame. iClear "#". + iApply big_sepM_delete; first done. by iFrame. + Qed. + End lemmas. -- GitLab