From cd566545bd8559d588bb7ebcdf16dc1644a3f312 Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <gitlab-sws@robbertkrebbers.nl>
Date: Thu, 29 Jul 2021 07:23:46 +0000
Subject: [PATCH] Apply 4 suggestion(s) to 1 file(s)

---
 iris/bi/big_op.v | 95 ++++++++++++++++++++----------------------------
 1 file changed, 39 insertions(+), 56 deletions(-)

diff --git a/iris/bi/big_op.v b/iris/bi/big_op.v
index dac620eec..104d0be3c 100644
--- a/iris/bi/big_op.v
+++ b/iris/bi/big_op.v
@@ -1501,79 +1501,62 @@ Lemma big_sepM_sep_zip `{Countable K} {A B}
   ([∗ map] k↦x ∈ m1, Φ1 k x) ∗ ([∗ map] k↦y ∈ m2, Φ2 k y).
 Proof. apply big_opM_sep_zip. Qed.
 
-Lemma big_sepM_impl_strong `{Countable K} {A B} Φ (Ψ : K → B → PROP) (m1 : gmap K A) (m2 : gmap K B) :
+Lemma big_sepM_impl_strong `{Countable K} {A B}
+    (Φ : K → A → PROP) (Ψ : K → B → PROP) (m1 : gmap K A) (m2 : gmap K B) :
   ([∗ map] k↦x ∈ m1, Φ k x) -∗
   □ (∀ (k : K) (y : B),
     (if m1 !! k is Some x then Φ k x else emp) -∗
     ⌜m2 !! k = Some y⌝ →
     Ψ k y) -∗
   ([∗ map] k↦y ∈ m2, Ψ k y) ∗
-  ([∗ map] k↦x ∈ (filter (λ '(k, hi), m2 !! k = None) m1), Φ k x).
+  ([∗ map] k↦x ∈ filter (λ '(k, _), m2 !! k = None) m1, Φ k x).
 Proof.
+  apply wand_intro_r.
   revert m1. induction m2 as [|i y m ? IH] using map_ind=> m1.
-  - apply wand_intro_r.
-    rewrite big_sepM_empty left_id.
-    rewrite intuitionistically_elim_emp right_id.
-    rewrite map_filter_id; done.
-  - apply wand_intro_r.
-    rewrite big_sepM_insert; last done.
-    rewrite intuitionistically_sep_dup.
-    rewrite assoc. rewrite (comm _ _ (â–¡ _))%I.
-    rewrite {1}intuitionistically_elim {1}(forall_elim i) {1}(forall_elim y).
-    rewrite lookup_insert pure_True // left_id.
-    destruct (m1 !! i) as [x|] eqn:Hl.
-    + rewrite big_sepM_delete; last apply Hl.
-      rewrite assoc assoc wand_elim_l -assoc -assoc.
-      apply sep_mono_r.
-      specialize (IH (delete i m1)). apply wand_elim_l' in IH.
-      erewrite map_filter_strong_ext_1.
-      * erewrite <- IH.
-        apply sep_mono_r.
-        apply intuitionistically_intro'. rewrite intuitionistically_elim.
-        apply forall_intro=> k. apply forall_intro=> b.
-        rewrite (forall_elim k) (forall_elim b).
-        apply wand_intro_r.
-        apply impl_intro_l, pure_elim_l=> Hi.
-        assert (i ≠ k) by congruence.
-        rewrite lookup_insert_ne // pure_True // left_id.
-        rewrite lookup_delete_ne // wand_elim_l //.
-      * intros j x'. destruct (decide (i = j)).
-        { simplify_eq. rewrite lookup_delete lookup_insert. naive_solver. }
-        rewrite lookup_delete_ne // lookup_insert_ne //.
-    + rewrite left_id -assoc.
-      apply sep_mono_r.
-      specialize (IH m1). apply wand_elim_l' in IH.
-      erewrite map_filter_strong_ext_1.
-      * erewrite <- IH.
-        apply sep_mono_r.
-        apply intuitionistically_intro'. rewrite intuitionistically_elim.
-        apply forall_intro=> k. apply forall_intro=> b.
-        rewrite (forall_elim k) (forall_elim b).
-        apply wand_intro_r.
-        apply impl_intro_l, pure_elim_l=> ?.
-        rewrite lookup_insert_ne; last congruence.
-        rewrite pure_True // left_id // wand_elim_l //.
-      * intros i' x'. simpl.
-        destruct (decide (i = i')) as [?|neq]; first naive_solver.
-        by rewrite lookup_insert_ne.
+  { rewrite big_sepM_empty left_id sep_elim_l.
+    rewrite map_filter_id //. }
+  rewrite big_sepM_insert; last done.
+  rewrite intuitionistically_sep_dup.
+  rewrite assoc. rewrite (comm _ _ (â–¡ _))%I.
+  rewrite {1}intuitionistically_elim {1}(forall_elim i) {1}(forall_elim y).
+  rewrite lookup_insert pure_True // left_id.
+  destruct (m1 !! i) as [x|] eqn:Hx.
+  - rewrite big_sepM_delete; last done.
+    rewrite assoc assoc wand_elim_l -2!assoc. apply sep_mono_r.
+    assert (filter (λ '(k, _), <[i:=y]> m !! k = None) m1
+          = filter (λ '(k, _), m !! k = None) (delete i m1)) as ->.
+    { apply map_filter_strong_ext_1=> k z.
+      rewrite lookup_insert_None lookup_delete_Some. naive_solver. }
+    rewrite -IH. do 2 f_equiv. f_equiv=> k. f_equiv=> z.
+    apply wand_intro_r. apply impl_intro_l, pure_elim_l=> ?.
+    assert (i ≠ k) by congruence.
+    rewrite lookup_insert_ne // pure_True // left_id.
+    rewrite lookup_delete_ne // wand_elim_l //.
+  - rewrite left_id -assoc. apply sep_mono_r.
+    assert (filter (λ '(k, _), <[i:=y]> m !! k = None) m1
+          = filter (λ '(k, _), m !! k = None) m1) as ->.
+    { apply map_filter_strong_ext_1=> k z.
+      rewrite lookup_insert_None. naive_solver. }
+    rewrite -IH. do 2 f_equiv. f_equiv=> k. f_equiv=> z.
+    apply wand_intro_r. apply impl_intro_l, pure_elim_l=> ?.
+    rewrite lookup_insert_ne; last congruence.
+    rewrite pure_True // left_id // wand_elim_l //.
 Qed.
 
-Lemma big_sepM_impl_dom_subseteq `{Countable K} {A B}
-    Φ (Ψ : K → B → PROP) (m1 : gmap K A) (m2 : gmap K B) :
+    (Φ : K → A → PROP) (Ψ : K → B → PROP) (m1 : gmap K A) (m2 : gmap K B) :
   dom (gset _) m2 ⊆ dom _ m1 →
   ([∗ map] k↦x ∈ m1, Φ k x) -∗
   □ (∀ (k : K) (x : A) (y : B),
-      ⌜m1 !! k = Some x⌝ → ⌜m2 !! k = Some y⌝ → Φ k x -∗ Ψ k y) -∗
+      ⌜m1 !! k = Some x⌝ → ⌜m2 !! k = Some y⌝ →
+      Φ k x -∗ Ψ k y) -∗
   ([∗ map] k↦y ∈ m2, Ψ k y) ∗
-  ([∗ map] k↦x ∈ (filter (λ '(k, _), m2 !! k = None) m1), Φ k x).
+  ([∗ map] k↦x ∈ filter (λ '(k, _), m2 !! k = None) m1, Φ k x).
 Proof.
-  intros Hsub. rewrite big_sepM_impl_strong.
-  apply wand_mono; last done.
-  apply intuitionistically_intro'. rewrite intuitionistically_elim.
-  apply forall_intro=> k. apply forall_intro=> y.
+  intros. rewrite big_sepM_impl_strong.
+  apply wand_mono; last done. f_equiv. f_equiv=> k. apply forall_intro=> y.
   apply wand_intro_r, impl_intro_l, pure_elim_l=> Hlm2.
   destruct (m1 !! k) as [x|] eqn:Hlm1.
-  - rewrite (forall_elim k) (forall_elim x) (forall_elim y).
+  - rewrite (forall_elim x) (forall_elim y).
     do 2 rewrite pure_True // left_id //. apply wand_elim_l.
   - apply elem_of_dom_2 in Hlm2. apply not_elem_of_dom in Hlm1.
     set_solver.
-- 
GitLab