From 66e40d47231f3dfeaffa3e14d0bc251db2d1dc4a Mon Sep 17 00:00:00 2001
From: Jonas Kastberg Hinrichsen <jihgfee@gmail.com>
Date: Mon, 3 Mar 2025 16:13:12 +0100
Subject: [PATCH] WIP: More admits resolved

---
 multris/channel/proto_model.v | 122 +++++++++++++++++++++-------------
 1 file changed, 77 insertions(+), 45 deletions(-)

diff --git a/multris/channel/proto_model.v b/multris/channel/proto_model.v
index 90bfd5e..ddff08d 100644
--- a/multris/channel/proto_model.v
+++ b/multris/channel/proto_model.v
@@ -34,7 +34,6 @@ The defined functions on the type [proto] are:
   a given protocol.
 - [proto_app], which appends two protocols [p1] and [p2], by substituting
   all terminations [END] in [p1] with [p2]. *)
-From stdpp Require Import gmap.
 From iris.algebra Require Import gmap.
 From iris.base_logic Require Import base_logic.
 From iris.proofmode Require Import proofmode.
@@ -63,8 +62,12 @@ Module Export action.
   Proof. by intros [[]]. Qed.
 End action.
 
-Definition proto_auxO (V : Type) (PROP : ofe) (A : ofe) : ofe :=
-  (gmapO actionO (V -d> laterO A -n> PROP)).
+Notation proto_auxO V PROP A :=
+  (gmapO actionO (V -d> later A -n> PROP)).
+(* Notation proto_auxOF V PROP := *)
+(*   (gmapOF actionO ((V -d> ▶ ∙ -n> PROP))). *)
+(* Definition proto_auxO (V : Type) (PROP : ofe) (A : ofe) : ofe := *)
+(*   (gmapO actionO (V -d> laterO A -n> PROP)). *)
 Definition proto_auxOF (V : Type) (PROP : ofe) : oFunctor :=
   (gmapOF actionO ((V -d> ▶ ∙ -n> PROP))).
 
@@ -89,13 +92,52 @@ Lemma proto_unfold_fold {V} `{!Cofe PROPn, !Cofe PROP}
   proto_unfold (proto_fold p) ≡ p.
 Proof. apply (ofe_iso_21 proto_iso). Qed.
 
+(* Derived laws *)
+Section internal_eq_derived.
+  Context {PROP : bi} `{!BiInternalEq PROP}.
+  Context `{Countable K} {A : ofe}.
+  Implicit Types P : PROP.
+
+  (* Force implicit argument PROP *)
+  Notation "P ⊢ Q" := (P ⊢@{PROP} Q).
+  Notation "P ⊣⊢ Q" := (P ⊣⊢@{PROP} Q).
+
+  Lemma gmap_equivI (m1 m2 : gmap K A) :
+    m1 ≡ m2 ⊣⊢ ∀ i, m1 !! i ≡ m2 !! i.
+  Proof. Admitted.
+
+  Lemma gmap_union_equiv_eqI (m m1 m2 : gmap K A) :
+    m ≡ m1 ∪ m2 ⊣⊢ ∃ m1' m2', ⌜ m = m1' ∪ m2' ⌝ ∧ m1' ≡ m1 ∧ m2' ≡ m2.
+  Proof. Admitted.
+
+  Lemma gmap_singleton_equivI (k1 k2 : K) (a1 a2 : A) :
+    {[ k1 := a1 ]} ≡ {[ k2 := a2 ]} ⊣⊢ ⌜ k1 = k2 ⌝ ∧ a1 ≡ a2.
+  Proof. Admitted.
+
+  Global Instance gmap_union : Union (gmap K A) := _.
+
+  Global Instance gmap_union_proper :
+    Proper ((≡) ==> (≡) ==> (≡)) (gmap_union).
+  Proof. intros m11 m12 Heq1 m21 m22 Heq2.
+  Admitted.
+
+  Global Instance gmap_sub : SubsetEq (gmap K A) := _.
+  Global Instance gmap_different : Difference (gmap K A) := _.
+  Global Instance gmap_union_partial_order : PartialOrder (gmap_sub) := _.
+  Global Instance gmap_subset_proper :
+    Proper ((≡) ==> (≡) ==> (≡)) (⊂@{gmap K A}).
+  Proof. intros m11 m12 Heq1 m21 m22 Heq2. Admitted.
+
+End internal_eq_derived.
+
 Definition proto_end {V} `{!Cofe PROPn, !Cofe PROP} : proto V PROPn PROP :=
   proto_fold ∅ .
 Definition proto_message {V} `{!Cofe PROPn, !Cofe PROP} (a : action)
     (m : V → laterO (proto V PROP PROPn) -n> PROP) : proto V PROPn PROP :=
   proto_fold {[a := m]}.
 Definition proto_union {V} `{!Cofe PROPn, !Cofe PROP} (p1 p2 : proto V PROPn PROP) : proto V PROPn PROP :=
-  proto_fold (map_union (proto_unfold p1) (proto_unfold p2)).
+  (* proto_fold (map_union (proto_unfold p1) (proto_unfold p2)). *)
+  proto_fold ((proto_unfold p1) ∪ (proto_unfold p2)).
 
 Global Instance proto_message_ne {V} `{!Cofe PROPn, !Cofe PROP} a n :
   Proper (pointwise_relation V (dist n) ==> dist n)
@@ -117,21 +159,17 @@ Proof.
   intros p11 p12 Hp1 p21 p22 Hp2. rewrite /proto_union. by do 3 f_equiv.
 Qed.
 
-(* TODO: Why does unification algorithm fail here? *)
 Global Instance proto_union_proper {V} `{!Cofe PROPn, !Cofe PROP} :
   Proper ((≡) ==> (≡) ==> (≡))
          (proto_union (V:=V) (PROPn:=PROPn) (PROP:=PROP)).
-Proof.
-  intros p11 p12 Hp1 p21 p22 Hp2. rewrite /proto_union. f_equiv.
-  (* TODO: Proper stuff *)
-Admitted.
+Proof. intros p11 p12 Hp1 p21 p22 Hp2. rewrite /proto_union. solve_proper. Qed.
 
-(* Should hold in the same way map_ind holds *)
+(* TODO: Missing Proper stuff *)
 Lemma proto_ind {V} `{!Cofe PROPn, !Cofe PROP} (P : proto V PROPn PROP → Prop) :
   Proper ((≡) ==> impl) P →
   P proto_end → (∀ i x p, proto_unfold p !! i ≡ None → P p → P (proto_union (proto_message i x) p)) → ∀ m, P m.
 Proof.
-  intros HP ? Hins m'.  
+  intros HP ? Hins m'.
   assert (∃ m, m = proto_unfold m') as [m Hm].
   { eexists _. done. }
   revert Hm. revert m'.
@@ -139,46 +177,35 @@ Proof.
   intros m' Hm.
   destruct (map_choose_or_empty m) as [(i&x&?)| H'].
   {
-    assert (m' = proto_union (proto_message i x) (proto_fold (delete i (proto_unfold m')))).
-    { admit. }
+    assert (m' ≡ proto_union (proto_message i x) (proto_fold (delete i (proto_unfold m')))).
+    {
+      rewrite -Hm.
+      rewrite /proto_union /proto_message.
+      rewrite !proto_unfold_fold.
+      rewrite -(proto_fold_unfold m'). f_equiv.
+      rewrite -Hm.
+      rewrite -insert_union_singleton_l.
+      by rewrite insert_delete.
+    }
     rewrite H1.
     apply Hins.
-    { admit. }                  (* TODO Map lookup proper stuff *)
+    { rewrite -Hm.
+      rewrite lookup_proper; [|apply proto_unfold_fold].
+      by rewrite lookup_delete. }
     eapply IH; [|done].
-    admit.                      (* TODO: Proper subset stuff *)
+    rewrite -Hm.
+    rewrite proto_unfold_fold.
+    by apply: delete_subset.
   }
   rewrite /proto_end in H.
   subst.
   rewrite -H' in H.
   rewrite -(proto_fold_unfold m'). done.
-Admitted.
+Qed.
 
 Global Instance proto_inhabited {V} `{!Cofe PROPn, !Cofe PROP} :
   Inhabited (proto V PROPn PROP) := populate proto_end.
 
-(* Derived laws *)
-Section internal_eq_derived.
-  Context {PROP : bi} `{!BiInternalEq PROP}.
-  Implicit Types P : PROP.
-
-  (* Force implicit argument PROP *)
-  Notation "P ⊢ Q" := (P ⊢@{PROP} Q).
-  Notation "P ⊣⊢ Q" := (P ⊣⊢@{PROP} Q).
-
-  Lemma gmap_equivI `{Countable K} {A : ofe} (m1 m2 : gmap K A) :
-    m1 ≡ m2 ⊣⊢ ∀ i, m1 !! i ≡ m2 !! i.
-  Proof. Admitted.
-
-  Lemma gmap_union_equiv_eqI  `{Countable K} {A : ofe} (m m1 m2 : gmap K A) :
-    m ≡ m1 ∪ m2 ⊣⊢ ∃ m1' m2', ⌜ m = m1' ∪ m2' ⌝ ∧ m1' ≡ m1 ∧ m2' ≡ m2.
-  Proof. Admitted.
-    
-  Lemma gmap_singleton_equivI  `{Countable K} {A : ofe} (k1 k2 : K) (a1 a2 : A) :
-    {[ k1 := a1 ]} ≡ {[ k2 := a2 ]} ⊣⊢ ⌜ k1 = k2 ⌝ ∧ a1 ≡ a2.
-  Proof. Admitted.
-
-End internal_eq_derived.
-
 Lemma proto_message_equivI `{!BiInternalEq SPROP} {V} `{!Cofe PROPn, !Cofe PROP} a1 a2 m1 m2 :
   proto_message (V:=V) (PROPn:=PROPn) (PROP:=PROP) a1 m1 ≡ proto_message a2 m2
   ⊣⊢@{SPROP} ⌜ a1 = a2 ⌝ ∧ (∀ v p', m1 v p' ≡ m2 v p').
@@ -190,7 +217,7 @@ Proof.
       iRewrite "Heq". by rewrite proto_fold_unfold. }
   rewrite /proto_message !proto_unfold_fold.
   rewrite gmap_singleton_equivI /=.
-  rewrite discrete_fun_equivI.  
+  rewrite discrete_fun_equivI.
   by setoid_rewrite ofe_morO_equivI.
 Qed.
 
@@ -198,9 +225,8 @@ Lemma proto_message_end_equivI `{!BiInternalEq SPROP} {V} `{!Cofe PROPn, !Cofe P
   proto_message (V:=V) (PROPn:=PROPn) (PROP:=PROP) a m ≡ proto_end ⊢@{SPROP} False.
 Proof.
   trans (proto_unfold (proto_message a m) ≡ proto_unfold proto_end : SPROP)%I.
-  { iIntros "Heq". by iRewrite "Heq". }  
+  { iIntros "Heq". by iRewrite "Heq". }
   rewrite /proto_message !proto_unfold_fold.
-  rewrite gmap_equivI.
 Admitted.
 Lemma proto_end_message_equivI `{!BiInternalEq SPROP} {V} `{!Cofe PROPn, !Cofe PROP} a m :
   proto_end ≡ proto_message (V:=V) (PROPn:=PROPn) (PROP:=PROP) a m ⊢@{SPROP} False.
@@ -271,7 +297,12 @@ Lemma proto_map_end {V} `{!Cofe PROPn, !Cofe PROPn', !Cofe PROP, !Cofe PROP'}
   proto_map (V:=V) gn g proto_end ≡ proto_end.
 Proof.
   rewrite proto_map_unfold /proto_map_aux /=.
-  pose proof (proto_unfold_fold (V:=V) (PROPn:=PROPn) (PROP:=PROP) ∅) as Hfold.
+  (* pose proof (proto_unfold_fold (V:=V) (PROPn:=PROPn) (PROP:=PROP) ∅) as Hfold. *)
+  rewrite /proto_end. f_equiv.
+  rewrite -(fmap_empty (λ (m : V → laterO (proto V PROP PROPn) -n> PROP) (v : V),
+                g â—Ž m v â—Ž laterO_map (proto_map g gn))).
+  f_equiv.
+  (* proto_unfold_fold not working ??? *)
 Admitted.
 Lemma proto_map_message {V} `{!Cofe PROPn, !Cofe PROPn', !Cofe PROP, !Cofe PROP'}
     (gn : PROPn' -n> PROPn) (g : PROP -n> PROP') a m :
@@ -279,6 +310,7 @@ Lemma proto_map_message {V} `{!Cofe PROPn, !Cofe PROPn', !Cofe PROP, !Cofe PROP'
   ≡ proto_message a (λ v, g ◎ m v ◎ laterO_map (proto_map g gn)).
 Proof.
   rewrite proto_map_unfold /proto_map_aux /=.
+  rewrite /proto_message. f_equiv.
 Admitted.
 Lemma proto_map_union {V} `{!Cofe PROPn, !Cofe PROPn', !Cofe PROP, !Cofe PROP'}
     (gn : PROPn' -n> PROPn) (g : PROP -n> PROP') p1 p2 :
@@ -335,7 +367,7 @@ Lemma proto_map_compose {V}
     (gn1 : PROPn'' -n> PROPn') (gn2 : PROPn' -n> PROPn)
     (g1 : PROP -n> PROP') (g2 : PROP' -n> PROP'') (p : proto V PROPn PROP) :
   proto_map (gn2 ◎ gn1) (g2 ◎ g1) p ≡ proto_map gn1 g2 (proto_map gn2 g1 p).
-Proof.  
+Proof.
   apply equiv_dist=> n. revert PROPn Hcn PROPn' Hcn' PROPn'' Hcn''
     PROP Hc PROP' Hc' PROP'' Hc'' gn1 gn2 g1 g2 p.
   induction (lt_wf n) as [n _ IH]=> PROPn ? PROPn' ? PROPn'' ?
@@ -374,7 +406,7 @@ Qed.
 Global Instance protoOF_contractive (V : Type) (Fn F : oFunctor)
     `{!∀ A B `{!Cofe A, !Cofe B}, Cofe (oFunctor_car Fn A B)}
     `{!∀ A B `{!Cofe A, !Cofe B}, Cofe (oFunctor_car F A B)} :
-  oFunctorContractive Fn → oFunctorContractive F → 
+  oFunctorContractive Fn → oFunctorContractive F →
   oFunctorContractive (protoOF V Fn F).
 Proof.
   intros HFn HF A1 ? A2 ? B1 ? B2 ? n f g Hfg p; simpl in *.
-- 
GitLab