From 6911395ba77e0fc24c9f01e68a2460bac8ab63f5 Mon Sep 17 00:00:00 2001
From: "Paolo G. Giarrusso" <p.giarrusso@gmail.com>
Date: Sun, 2 Jul 2023 16:35:54 +0200
Subject: [PATCH] Theory revisions

---
 iris_unstable/algebra/monotone.v   | 114 +++++++++++++++--------------
 iris_unstable/base_logic/algebra.v |   4 +-
 tests/monotone.v                   |  17 ++++-
 3 files changed, 75 insertions(+), 60 deletions(-)

diff --git a/iris_unstable/algebra/monotone.v b/iris_unstable/algebra/monotone.v
index 005d4c612..d22381216 100644
--- a/iris_unstable/algebra/monotone.v
+++ b/iris_unstable/algebra/monotone.v
@@ -107,53 +107,47 @@ Section cmra.
     intros [z ->]; rewrite assoc mra_idemp; done.
   Qed.
 
-  Lemma principal_R_opN_base `{!Transitive R} n x y :
-    (∀ b, b ∈ y → ∃ c, c ∈ x ∧ R b c) → y ⋅ x ≡{n}≡ x.
+  Lemma principal_R_op_base `{!Transitive R} x y :
+    (∀ b, b ∈ y → ∃ c, c ∈ x ∧ R b c) → y ⋅ x ≡ x.
   Proof.
-    intros HR; split; rewrite /op /mra_op below_app; [|by firstorder].
+    intros HR. split; rewrite /op /mra_op below_app; [|by intuition].
     intros [(c & (d & Hd1 & Hd2)%HR & Hc2)|]; [|done].
     exists d; split; [|transitivity c]; done.
   Qed.
 
-  Lemma principal_R_opN `{!Transitive R} n a b :
-    R a b → principal R a ⋅ principal R b ≡{n}≡ principal R b.
-  Proof.
-    intros; apply principal_R_opN_base; intros c; rewrite /principal.
-    setoid_rewrite elem_of_list_singleton => ->; eauto.
-  Qed.
-
   Lemma principal_R_op `{!Transitive R} a b :
     R a b → principal R a ⋅ principal R b ≡ principal R b.
-  Proof. by intros ? ?; apply (principal_R_opN 0). Qed.
-
-  Lemma principal_op_RN n a b x :
-    R a a → principal R a ⋅ x ≡{n}≡ principal R b → R a b.
   Proof.
-    intros Ha HR.
-    destruct (HR a) as [[z [HR1%elem_of_list_singleton HR2]] _];
-      last by subst; eauto.
-    rewrite /op /mra_op /principal below_app below_principal; auto.
+    intros; apply principal_R_op_base; intros c; rewrite /principal.
+    set_solver.
   Qed.
 
   Lemma principal_op_R' a b x :
     R a a → principal R a ⋅ x ≡ principal R b → R a b.
-  Proof. intros ? ?; eapply (principal_op_RN 0); eauto. Qed.
+  Proof.
+    move=> Ha /(_ a) HR.
+    Succeed set_solver.
+    destruct HR as [[z [HR1%elem_of_list_singleton HR2]] _];
+      last by subst.
+    by rewrite /op /mra_op /principal below_app below_principal; left.
+  Qed.
 
   Lemma principal_op_R `{!Reflexive R} a b x :
     principal R a ⋅ x ≡ principal R b → R a b.
-  Proof. intros; eapply principal_op_R'; eauto. Qed.
+  Proof. by apply principal_op_R'. Qed.
 
-  Lemma principal_includedN `{!PreOrder R} n a b :
-    principal R a ≼{n} principal R b ↔ R a b.
+  Lemma principal_included `{!PreOrder R} a b :
+    principal R a ≼ principal R b ↔ R a b.
   Proof.
     split.
-    - intros [z Hz]; eapply principal_op_RN; first done. by rewrite Hz.
-    - intros ?; exists (principal R b); rewrite principal_R_opN; eauto.
+    - move=> [z Hz]. by eapply principal_op_R.
+    - intros ?; exists (principal R b). by rewrite principal_R_op.
   Qed.
 
-  Lemma principal_included `{!PreOrder R} a b :
-    principal R a ≼ principal R b ↔ R a b.
-  Proof. apply (principal_includedN 0). Qed.
+  (* Useful? *)
+  Lemma principal_includedN `{!PreOrder R} n a b :
+    principal R a ≼{n} principal R b ↔ R a b.
+  Proof. by rewrite -principal_included -cmra_discrete_included_iff. Qed.
 
   Lemma mra_local_update_grow `{!Transitive R} a x b:
     R a b →
@@ -163,15 +157,17 @@ Section cmra.
     apply local_update_unital_discrete.
     intros z _ Habz.
     split; first done.
-    intros w; split.
+    intros w. specialize (Habz w).
+    Succeed set_solver.
+    split.
     - intros (y & ->%elem_of_list_singleton & Hy2).
       exists b; split; first constructor; done.
     - intros (y & [->|Hy1]%elem_of_cons & Hy2).
-      + exists b; split; first constructor; done.
+      + set_solver.
       + exists b; split; first constructor.
-        specialize (Habz w) as [_ [c [->%elem_of_list_singleton Hc2]]].
+        destruct Habz as [_ [c [->%elem_of_list_singleton Hc2]]].
         { exists y; split; first (by apply elem_of_app; right); eauto. }
-        etrans; eauto.
+        by trans a.
   Qed.
 
   Lemma mra_local_update_get_frag `{!PreOrder R} a b:
@@ -190,45 +186,51 @@ End cmra.
 Global Arguments mraR {_} _.
 Global Arguments mraUR {_} _.
 
-
-(* Might be useful if the type of elements is an OFE. *)
-Section mra_over_ofe.
-  Context {A : ofe} {R : relation A}.
+Section mra_over_rel.
+  Context {A : Type} {R : relation A}.
   Implicit Types a b : A.
   Implicit Types x y : mra R.
+  Implicit Type (S : relation A).
 
-  Global Instance principal_ne
-         `{!∀ n, Proper ((dist n) ==> (dist n) ==> iff) R} :
-    NonExpansive (principal R).
-  Proof. intros n a1 a2 Ha; split; rewrite !below_principal !Ha; done. Qed.
-
-  Global Instance principal_proper
-         `{!∀ n, Proper ((dist n) ==> (dist n) ==> iff) R} :
-    Proper ((≡) ==> (≡)) (principal R) := ne_proper _.
+  Global Instance principal_rel_proper S
+         `{!Proper (S ==> S ==> iff) R} `{!Reflexive S} :
+    Proper (S ==> (≡)) (principal R).
+  Proof. intros a1 a2 Ha; split; rewrite ->!below_principal, !Ha; done. Qed.
 
   Lemma principal_inj_related a b :
     principal R a ≡ principal R b → R a a → R a b.
   Proof.
+    move=> /(_ a).
+    Succeed set_solver.
+
     intros Hab ?.
-    destruct (Hab a) as [[? [?%elem_of_list_singleton ?]] _];
+    destruct Hab as [[? [?%elem_of_list_singleton ?]] _];
       last by subst; auto.
-    exists a; rewrite /principal elem_of_list_singleton; done.
+    exists a; rewrite /principal elem_of_list_singleton. done.
   Qed.
 
-  Lemma principal_inj_general a b :
+  Lemma principal_inj_general S a b :
     principal R a ≡ principal R b →
-    R a a → R b b → (R a b → R b a → a ≡ b) → a ≡ b.
+    R a a → R b b → (R a b → R b a → S a b) → S a b.
   Proof. intros ??? Has; apply Has; apply principal_inj_related; auto. Qed.
 
-  Global Instance principal_inj_instance `{!Reflexive R} `{!AntiSymm (≡) R} :
-    Inj (≡) (≡) (principal R).
-  Proof. intros ???; apply principal_inj_general; auto. Qed.
+  Global Instance principal_inj {S} `{!Reflexive R} `{!AntiSymm S R} :
+    Inj S (≡) (principal R).
+  Proof. intros ???. apply principal_inj_general => //. apply: anti_symm. Qed.
+End mra_over_rel.
 
-  Global Instance principal_injN `{!Reflexive R} {Has : AntiSymm (≡) R} n :
-    Inj (dist n) (dist n) (principal R).
-  Proof.
-    intros x y Hxy%discrete_iff; last apply _.
-    eapply equiv_dist; revert Hxy; apply inj; apply _.
-  Qed.
+(* Might be useful if the type of elements is an OFE. *)
+Section mra_over_ofe.
+  Context {A : ofe} {R : relation A}.
+  Implicit Types a b : A.
+  Implicit Types x y : mra R.
+
+  Global Instance principal_proper
+         `{!∀ n, Proper ((dist n) ==> (dist n) ==> iff) R} :
+    Proper ((≡) ==> (≡)) (principal R) := ne_proper _.
 
+  (* TODO: Useful? Clients should rather call equiv_dist. *)
+  Lemma principal_injN `{!Reflexive R} {Has : AntiSymm (≡) R} n :
+    Inj (dist n) (≡) (principal R).
+  Proof. intros x y Hxy%(inj _). by apply equiv_dist. Qed.
 End mra_over_ofe.
diff --git a/iris_unstable/base_logic/algebra.v b/iris_unstable/base_logic/algebra.v
index adb10e2f8..c962e56e4 100644
--- a/iris_unstable/base_logic/algebra.v
+++ b/iris_unstable/base_logic/algebra.v
@@ -26,9 +26,9 @@ Section monotone.
         `{!Reflexive R} `{!AntiSymm (≡) R} a b :
     principal R a ≡ principal R b ⊣⊢ (a ≡ b).
   Proof.
-    uPred.unseal. do 2 split; intros ?.
+    uPred.unseal. do 2 split; intros Hp.
     - exact: principal_injN.
-    - exact: principal_ne.
+    - apply: principal_rel_proper Hp.
   Qed.
 End monotone.
 End upred.
diff --git a/tests/monotone.v b/tests/monotone.v
index b5e65ef77..a3004521b 100644
--- a/tests/monotone.v
+++ b/tests/monotone.v
@@ -8,7 +8,20 @@ Section test_mra_over_ofe.
   Context `{!Reflexive R} {Has : AntiSymm (≡) R}.
   Lemma test a b : principal R a ≡ principal R b → a ≡ b.
   Proof.
-    Fail by intros ?%(inj _).
-    by intros ?%(inj (R := equiv) _).
+    by intros ?%(inj _).
   Qed.
+
+  Lemma principal_ne
+         `{!∀ n, Proper ((dist n) ==> (dist n) ==> iff) R} :
+    NonExpansive (principal R).
+  Proof. apply _. Abort.
+
+  Lemma principal_inj_instance :
+    Inj (≡) (≡) (principal R).
+  Proof. apply _. Abort.
+
+  (* Also questionable. *)
+  Instance principal_injN' n :
+    Inj (dist n) (dist n) (principal R).
+  Proof. apply principal_injN. Abort.
 End test_mra_over_ofe.
-- 
GitLab