Commit b2c912d8 by Robbert Krebbers

### Make valid a primitive instead of derived notion.

`This way it behaves better for discrete CMRAs.`
parent 73959011
 ... ... @@ -16,9 +16,12 @@ Context {A : cofeT}. Instance agree_validN : ValidN (agree A) := λ n x, agree_is_valid x n ∧ ∀ n', n' ≤ n → x n' ≡{n'}≡ x n. Instance agree_valid : Valid (agree A) := λ x, ∀ n, ✓{n} x. Lemma agree_valid_le n n' (x : agree A) : agree_is_valid x n → n' ≤ n → agree_is_valid x n'. Proof. induction 2; eauto using agree_valid_S. Qed. Instance agree_equiv : Equiv (agree A) := λ x y, (∀ n, agree_is_valid x n ↔ agree_is_valid y n) ∧ (∀ n, agree_is_valid x n → x n ≡{n}≡ y n). ... ...
 From algebra Require Export excl. From algebra Require Import functor upred. Local Arguments valid _ _ !_ /. Local Arguments validN _ _ _ !_ /. Record auth (A : Type) : Type := Auth { authoritative : excl A ; own : A }. ... ... @@ -66,6 +67,13 @@ Implicit Types a b : A. Implicit Types x y : auth A. Global Instance auth_empty `{Empty A} : Empty (auth A) := Auth ∅ ∅. Instance auth_valid : Valid (auth A) := λ x, match authoritative x with | Excl a => own x ≼ a ∧ ✓ a | ExclUnit => ✓ own x | ExclBot => False end. Global Arguments auth_valid !_ /. Instance auth_validN : ValidN (auth A) := λ n x, match authoritative x with | Excl a => own x ≼{n} a ∧ ✓{n} a ... ... @@ -105,6 +113,8 @@ Proof. destruct Hx; intros ?; cofe_subst; auto. - by intros n x1 x2 [Hx Hx'] y1 y2 [Hy Hy']; split; simpl; rewrite ?Hy ?Hy' ?Hx ?Hx'. - intros [[] ?]; rewrite /= ?cmra_included_includedN ?cmra_valid_validN; naive_solver eauto using O. - intros n [[] ?] ?; naive_solver eauto using cmra_includedN_S, cmra_validN_S. - by split; simpl; rewrite assoc. - by split; simpl; rewrite comm. ... ... @@ -169,7 +179,7 @@ Lemma auth_local_update L `{!LocalUpdate Lv L} a a' : Lv a → ✓ L a' → ● a' ⋅ ◯ a ~~> ● L a' ⋅ ◯ L a. Proof. intros. apply auth_update=>n af ? EQ; split; last done. intros. apply auth_update=>n af ? EQ; split; last by apply cmra_valid_validN. by rewrite EQ (local_updateN L) // -EQ. Qed. ... ... @@ -188,7 +198,7 @@ Lemma auth_local_update_l L `{!LocalUpdate Lv L} a a' : Lv a → ✓ (L a ⋅ a') → ● (a ⋅ a') ⋅ ◯ a ~~> ● (L a ⋅ a') ⋅ ◯ L a. Proof. intros. apply auth_update=>n af ? EQ; split; last done. intros. apply auth_update=>n af ? EQ; split; last by apply cmra_valid_validN. by rewrite -(local_updateN L) // EQ -(local_updateN L) // -EQ. Qed. ... ...
 ... ... @@ -26,7 +26,6 @@ Notation "✓{ n } x" := (validN n x) Class Valid (A : Type) := valid : A → Prop. Instance: Params (@valid) 2. Notation "✓ x" := (valid x) (at level 20) : C_scope. Instance validN_valid `{ValidN A} : Valid A := λ x, ∀ n, ✓{n} x. Definition includedN `{Dist A, Op A} (n : nat) (x y : A) := ∃ z, y ≡{n}≡ x ⋅ z. Notation "x ≼{ n } y" := (includedN n x y) ... ... @@ -34,13 +33,15 @@ Notation "x ≼{ n } y" := (includedN n x y) Instance: Params (@includedN) 4. Hint Extern 0 (_ ≼{_} _) => reflexivity. Record CMRAMixin A `{Dist A, Equiv A, Unit A, Op A, ValidN A, Minus A} := { Record CMRAMixin A `{Dist A, Equiv A, Unit A, Op A, Valid A, ValidN A, Minus A} := { (* setoids *) mixin_cmra_op_ne n (x : A) : Proper (dist n ==> dist n) (op x); mixin_cmra_unit_ne n : Proper (dist n ==> dist n) unit; mixin_cmra_validN_ne n : Proper (dist n ==> impl) (validN n); mixin_cmra_minus_ne n : Proper (dist n ==> dist n ==> dist n) minus; (* valid *) mixin_cmra_valid_validN x : ✓ x ↔ ∀ n, ✓{n} x; mixin_cmra_validN_S n x : ✓{S n} x → ✓{n} x; (* monoid *) mixin_cmra_assoc : Assoc (≡) (⋅); ... ... @@ -63,24 +64,26 @@ Structure cmraT := CMRAT { cmra_compl : Compl cmra_car; cmra_unit : Unit cmra_car; cmra_op : Op cmra_car; cmra_valid : Valid cmra_car; cmra_validN : ValidN cmra_car; cmra_minus : Minus cmra_car; cmra_cofe_mixin : CofeMixin cmra_car; cmra_mixin : CMRAMixin cmra_car }. Arguments CMRAT {_ _ _ _ _ _ _ _} _ _. Arguments CMRAT {_ _ _ _ _ _ _ _ _} _ _. Arguments cmra_car : simpl never. Arguments cmra_equiv : simpl never. Arguments cmra_dist : simpl never. Arguments cmra_compl : simpl never. Arguments cmra_unit : simpl never. Arguments cmra_op : simpl never. Arguments cmra_valid : simpl never. Arguments cmra_validN : simpl never. Arguments cmra_minus : simpl never. Arguments cmra_cofe_mixin : simpl never. Arguments cmra_mixin : simpl never. Add Printing Constructor cmraT. Existing Instances cmra_unit cmra_op cmra_validN cmra_minus. Existing Instances cmra_unit cmra_op cmra_valid cmra_validN cmra_minus. Coercion cmra_cofeC (A : cmraT) : cofeT := CofeT (cmra_cofe_mixin A). Canonical Structure cmra_cofeC. ... ... @@ -97,6 +100,8 @@ Section cmra_mixin. Global Instance cmra_minus_ne n : Proper (dist n ==> dist n ==> dist n) (@minus A _). Proof. apply (mixin_cmra_minus_ne _ (cmra_mixin A)). Qed. Lemma cmra_valid_validN x : ✓ x ↔ ∀ n, ✓{n} x. Proof. apply (mixin_cmra_valid_validN _ (cmra_mixin A)). Qed. Lemma cmra_validN_S n x : ✓{S n} x → ✓{n} x. Proof. apply (mixin_cmra_validN_S _ (cmra_mixin A)). Qed. Global Instance cmra_assoc : Assoc (≡) (@op A _). ... ... @@ -178,7 +183,10 @@ Global Instance cmra_minus_proper : Proper ((≡) ==> (≡) ==> (≡)) (@minus A Proof. apply (ne_proper_2 _). Qed. Global Instance cmra_valid_proper : Proper ((≡) ==> iff) (@valid A _). Proof. by intros x y Hxy; split; intros ? n; [rewrite -Hxy|rewrite Hxy]. Qed. Proof. intros x y Hxy; rewrite !cmra_valid_validN. by split=> ? n; [rewrite -Hxy|rewrite Hxy]. Qed. Global Instance cmra_includedN_ne n : Proper (dist n ==> dist n ==> iff) (@includedN A _ _ n) | 1. Proof. ... ... @@ -210,8 +218,6 @@ Proof. Qed. (** ** Validity *) Lemma cmra_valid_validN x : ✓ x ↔ ∀ n, ✓{n} x. Proof. done. Qed. Lemma cmra_validN_le n n' x : ✓{n} x → n' ≤ n → ✓{n'} x. Proof. induction 2; eauto using cmra_validN_S. Qed. Lemma cmra_valid_op_l x y : ✓ (x ⋅ y) → ✓ x. ... ... @@ -309,13 +315,15 @@ Lemma cmra_op_timeless x1 x2 : Proof. intros ??? z Hz. destruct (cmra_extend 0 z x1 x2) as ([y1 y2]&Hz'&?&?); auto; simpl in *. { by rewrite -?Hz. } { rewrite -?Hz. by apply cmra_valid_validN. } by rewrite Hz' (timeless x1 y1) // (timeless x2 y2). Qed. (** ** RAs with an empty element *) Section identity. Context `{Empty A, !CMRAIdentity A}. Lemma cmra_empty_validN n : ✓{n} ∅. Proof. apply cmra_valid_validN, cmra_empty_valid. Qed. Lemma cmra_empty_leastN n x : ∅ ≼{n} x. Proof. by exists x; rewrite left_id. Qed. Lemma cmra_empty_least x : ∅ ≼ x. ... ... @@ -333,7 +341,9 @@ Proof. intros; apply (ne_proper _). Qed. Lemma local_update L `{!LocalUpdate Lv L} x y : Lv x → ✓ (x ⋅ y) → L (x ⋅ y) ≡ L x ⋅ y. Proof. by rewrite equiv_dist=>?? n; apply (local_updateN L). Qed. Proof. by rewrite cmra_valid_validN equiv_dist=>?? n; apply (local_updateN L). Qed. Global Instance local_update_op x : LocalUpdate (λ _, True) (op x). Proof. split. apply _. by intros n y1 y2 _ _; rewrite assoc. Qed. ... ... @@ -464,14 +474,15 @@ Class RA A `{Equiv A, Unit A, Op A, Valid A, Minus A} := { Section discrete. Context {A : cofeT} `{∀ x : A, Timeless x}. Context {v : Valid A} `{Unit A, Op A, Minus A} (ra : RA A). Context `{Unit A, Op A, Valid A, Minus A} (ra : RA A). Instance discrete_validN : ValidN A := λ n x, ✓ x. Definition discrete_cmra_mixin : CMRAMixin A. Proof. destruct ra; split; unfold Proper, respectful, includedN; try setoid_rewrite <-(timeless_iff _ _); try done. intros n x y1 y2 ??; exists (y1,y2); split_and?; auto. - intros x; split; first done. by move=> /(_ 0). - intros n x y1 y2 ??; exists (y1,y2); split_and?; auto. apply (timeless _), dist_le with n; auto with lia. Qed. Definition discreteRA : cmraT := CMRAT (cofe_mixin A) discrete_cmra_mixin. ... ... @@ -481,8 +492,6 @@ Section discrete. Lemma discrete_update (x y : discreteRA) : (∀ z, ✓ (x ⋅ z) → ✓ (y ⋅ z)) → x ~~> y. Proof. intros Hvalid n z; apply Hvalid. Qed. Lemma discrete_valid (x : discreteRA) : v x → validN_valid x. Proof. move=>Hx n. exact Hx. Qed. End discrete. (** ** CMRA for the unit type *) ... ... @@ -497,7 +506,7 @@ Section unit. Canonical Structure unitRA : cmraT := Eval cbv [unitC discreteRA cofe_car] in discreteRA unit_ra. Global Instance unit_cmra_identity : CMRAIdentity unitRA. Proof. by split; intros []. Qed. Proof. by split. Qed. End unit. (** ** Product *) ... ... @@ -506,6 +515,7 @@ Section prod. Instance prod_op : Op (A * B) := λ x y, (x.1 ⋅ y.1, x.2 ⋅ y.2). Global Instance prod_empty `{Empty A, Empty B} : Empty (A * B) := (∅, ∅). Instance prod_unit : Unit (A * B) := λ x, (unit (x.1), unit (x.2)). Instance prod_valid : Valid (A * B) := λ x, ✓ x.1 ∧ ✓ x.2. Instance prod_validN : ValidN (A * B) := λ n x, ✓{n} x.1 ∧ ✓{n} x.2. Instance prod_minus : Minus (A * B) := λ x y, (x.1 ⩪ y.1, x.2 ⩪ y.2). Lemma prod_included (x y : A * B) : x ≼ y ↔ x.1 ≼ y.1 ∧ x.2 ≼ y.2. ... ... @@ -526,6 +536,9 @@ Section prod. - by intros n y1 y2 [Hy1 Hy2] [??]; split; rewrite /= -?Hy1 -?Hy2. - by intros n x1 x2 [Hx1 Hx2] y1 y2 [Hy1 Hy2]; split; rewrite /= ?Hx1 ?Hx2 ?Hy1 ?Hy2. - intros x; split. + intros [??] n; split; by apply cmra_valid_validN. + intros Hxy; split; apply cmra_valid_validN=> n; apply Hxy. - by intros n x [??]; split; apply cmra_validN_S. - by split; rewrite /= assoc. - by split; rewrite /= comm. ... ...
 ... ... @@ -83,6 +83,8 @@ Global Instance excl_leibniz : LeibnizEquiv A → LeibnizEquiv (excl A). Proof. by destruct 2; f_equal; apply leibniz_equiv. Qed. (* CMRA *) Instance excl_valid : Valid (excl A) := λ x, match x with Excl _ | ExclUnit => True | ExclBot => False end. Instance excl_validN : ValidN (excl A) := λ n x, match x with Excl _ | ExclUnit => True | ExclBot => False end. Global Instance excl_empty : Empty (excl A) := ExclUnit. ... ... @@ -106,6 +108,7 @@ Proof. - constructor. - by destruct 1; intros ?. - by destruct 1; inversion_clear 1; constructor. - intros x; split. done. by move=> /(_ 0). - intros n [?| |]; simpl; auto with lia. - by intros [?| |] [?| |] [?| |]; constructor. - by intros [?| |] [?| |]; constructor. ... ...
 ... ... @@ -96,6 +96,7 @@ Implicit Types m : gmap K A. Instance map_op : Op (gmap K A) := merge op. Instance map_unit : Unit (gmap K A) := fmap unit. Instance map_valid : Valid (gmap K A) := λ m, ∀ i, ✓ (m !! i). Instance map_validN : ValidN (gmap K A) := λ n m, ∀ i, ✓{n} (m !! i). Instance map_minus : Minus (gmap K A) := merge minus. ... ... @@ -106,8 +107,6 @@ Proof. by apply lookup_merge. Qed. Lemma lookup_unit m i : unit m !! i = unit (m !! i). Proof. by apply lookup_fmap. Qed. Lemma map_valid_spec m : ✓ m ↔ ∀ i, ✓ (m !! i). Proof. split; intros Hm ??; apply Hm. Qed. Lemma map_included_spec (m1 m2 : gmap K A) : m1 ≼ m2 ↔ ∀ i, m1 !! i ≼ m2 !! i. Proof. split. ... ... @@ -131,6 +130,9 @@ Proof. - by intros n m1 m2 Hm i; rewrite !lookup_unit (Hm i). - by intros n m1 m2 Hm ? i; rewrite -(Hm i). - by intros n m1 m1' Hm1 m2 m2' Hm2 i; rewrite !lookup_minus (Hm1 i) (Hm2 i). - intros m; split. + by intros ? n i; apply cmra_valid_validN. + intros Hm i; apply cmra_valid_validN=> n; apply Hm. - intros n m Hm i; apply cmra_validN_S, Hm. - by intros m1 m2 m3 i; rewrite !lookup_op assoc. - by intros m1 m2 i; rewrite !lookup_op comm. ... ... @@ -162,7 +164,7 @@ Canonical Structure mapRA : cmraT := CMRAT map_cofe_mixin map_cmra_mixin. Global Instance map_cmra_identity : CMRAIdentity mapRA. Proof. split. - by intros ? n; rewrite lookup_empty. - by intros i; rewrite lookup_empty. - by intros m i; rewrite /= lookup_op lookup_empty (left_id_L None _). - apply map_empty_timeless. Qed. ... ... @@ -187,18 +189,18 @@ Implicit Types a : A. Lemma map_lookup_validN n m i x : ✓{n} m → m !! i ≡{n}≡ Some x → ✓{n} x. Proof. by move=> /(_ i) Hm Hi; move:Hm; rewrite Hi. Qed. Lemma map_lookup_valid m i x : ✓ m → m !! i ≡ Some x → ✓ x. Proof. move=>Hm Hi n. move:(Hm n i). by rewrite Hi. Qed. Proof. move=> Hm Hi. move:(Hm i). by rewrite Hi. Qed. Lemma map_insert_validN n m i x : ✓{n} x → ✓{n} m → ✓{n} <[i:=x]>m. Proof. by intros ?? j; destruct (decide (i = j)); simplify_map_eq. Qed. Lemma map_insert_valid m i x : ✓ x → ✓ m → ✓ <[i:=x]>m. Proof. intros ?? n j; apply map_insert_validN; auto. Qed. Proof. by intros ?? j; destruct (decide (i = j)); simplify_map_eq. Qed. Lemma map_singleton_validN n i x : ✓{n} ({[ i := x ]} : gmap K A) ↔ ✓{n} x. Proof. split; [|by intros; apply map_insert_validN, cmra_empty_valid]. split; [|by intros; apply map_insert_validN, cmra_empty_validN]. by move=>/(_ i); simplify_map_eq. Qed. Lemma map_singleton_valid i x : ✓ ({[ i := x ]} : gmap K A) ↔ ✓ x. Proof. split; intros ? n; eapply map_singleton_validN; eauto. Qed. Proof. rewrite !cmra_valid_validN. by setoid_rewrite map_singleton_validN. Qed. Lemma map_insert_singleton_opN n m i x : m !! i = None ∨ m !! i ≡{n}≡ Some (unit x) → <[i:=x]> m ≡{n}≡ {[ i := x ]} ⋅ m. ... ... @@ -275,7 +277,7 @@ Proof. intros Hx HQ n gf Hg. destruct (Hx n (from_option ∅ (gf !! i))) as (y&?&Hy). { move:(Hg i). rewrite !left_id. case _: (gf !! i); simpl; auto using cmra_empty_valid. } case _: (gf !! i); simpl; auto using cmra_empty_validN. } exists {[ i := y ]}; split; first by auto. intros i'; destruct (decide (i' = i)) as [->|]. - rewrite lookup_op lookup_singleton. ... ...
 ... ... @@ -118,6 +118,7 @@ Section iprod_cmra. Instance iprod_op : Op (iprod B) := λ f g x, f x ⋅ g x. Instance iprod_unit : Unit (iprod B) := λ f x, unit (f x). Instance iprod_valid : Valid (iprod B) := λ f, ∀ x, ✓ f x. Instance iprod_validN : ValidN (iprod B) := λ n f, ∀ x, ✓{n} f x. Instance iprod_minus : Minus (iprod B) := λ f g x, f x ⩪ g x. ... ... @@ -140,6 +141,9 @@ Section iprod_cmra. - by intros n f1 f2 Hf x; rewrite iprod_lookup_unit (Hf x). - by intros n f1 f2 Hf ? x; rewrite -(Hf x). - by intros n f f' Hf g g' Hg i; rewrite iprod_lookup_minus (Hf i) (Hg i). - intros g; split. + intros Hg n i; apply cmra_valid_validN, Hg. + intros Hg i; apply cmra_valid_validN=> n; apply Hg. - intros n f Hf x; apply cmra_validN_S, Hf. - by intros f1 f2 f3 x; rewrite iprod_lookup_op assoc. - by intros f1 f2 x; rewrite iprod_lookup_op comm. ... ... @@ -160,7 +164,7 @@ Section iprod_cmra. (∀ x, CMRAIdentity (B x)) → CMRAIdentity iprodRA. Proof. intros ?; split. - intros n x; apply cmra_empty_valid. - intros x; apply cmra_empty_valid. - by intros f x; rewrite iprod_lookup_op left_id. - by apply _. Qed. ... ... @@ -204,7 +208,7 @@ Section iprod_cmra. split; [by move=>/(_ x); rewrite iprod_lookup_singleton|]. move=>Hx x'; destruct (decide (x = x')) as [->|]; rewrite ?iprod_lookup_singleton ?iprod_lookup_singleton_ne //. by apply cmra_empty_valid. by apply cmra_empty_validN. Qed. Lemma iprod_unit_singleton x (y : B x) : ... ...
 ... ... @@ -61,6 +61,8 @@ Arguments optionC : clear implicits. Section cmra. Context {A : cmraT}. Instance option_valid : Valid (option A) := λ mx, match mx with Some x => ✓ x | None => True end. Instance option_validN : ValidN (option A) := λ n mx, match mx with Some x => ✓{n} x | None => True end. Global Instance option_empty : Empty (option A) := None. ... ... @@ -93,6 +95,7 @@ Proof. - by destruct 1; constructor; cofe_subst. - by destruct 1; rewrite /validN /option_validN //=; cofe_subst. - by destruct 1; inversion_clear 1; constructor; cofe_subst. - intros [x|]; [apply cmra_valid_validN|done]. - intros n [x|]; unfold validN, option_validN; eauto using cmra_validN_S. - intros [x|] [y|] [z|]; constructor; rewrite ?assoc; auto. - intros [x|] [y|]; constructor; rewrite 1?comm; auto. ... ... @@ -158,7 +161,7 @@ Qed. Lemma option_update_None `{Empty A, !CMRAIdentity A} : ∅ ~~> Some ∅. Proof. intros n [x|] ?; rewrite /op /cmra_op /validN /cmra_validN /= ?left_id; auto using cmra_empty_valid. auto using cmra_empty_validN. Qed. End cmra. Arguments optionRA : clear implicits. ... ...
 ... ... @@ -334,15 +334,15 @@ Proof. intros T1 T2 HT. by rewrite /sts_frag_up HT. Qed. (** Validity *) Lemma sts_auth_valid s T : ✓ sts_auth s T ↔ tok s ∩ T ≡ ∅. Proof. split. by move=> /(_ 0). by intros ??. Qed. Proof. done. Qed. Lemma sts_frag_valid S T : ✓ sts_frag S T ↔ closed S T ∧ S ≢ ∅. Proof. split. by move=> /(_ 0). by intros ??. Qed. Proof. done. Qed. Lemma sts_frag_up_valid s T : tok s ∩ T ≡ ∅ → ✓ sts_frag_up s T. Proof. intros. by apply sts_frag_valid; auto using closed_up, up_non_empty. Qed. Lemma sts_auth_frag_valid_inv s S T1 T2 : ✓ (sts_auth s T1 ⋅ sts_frag S T2) → s ∈ S. Proof. by move=> /(_ 0) [? [? Hdisj]]; inversion Hdisj. Qed. Proof. by intros (?&?&Hdisj); inversion Hdisj. Qed. (** Op *) Lemma sts_op_auth_frag s S T : ... ... @@ -350,11 +350,7 @@ Lemma sts_op_auth_frag s S T : Proof. intros; split; [split|constructor; set_solver]; simpl. - intros (?&?&?); by apply closed_disjoint with S. - intros; split_and?. + set_solver+. + done. + set_solver. + constructor; set_solver. - intros; split_and?; last constructor; set_solver. Qed. Lemma sts_op_auth_frag_up s T : sts_auth s ∅ ⋅ sts_frag_up s T ≡ sts_auth s T. ... ...
 ... ... @@ -57,7 +57,7 @@ Section heap. apply map_eq=>l. rewrite lookup_omap lookup_fmap. by case (σ !! l). Qed. Lemma to_heap_valid σ : ✓ to_heap σ. Proof. intros n l. rewrite lookup_fmap. by case (σ !! l). Qed. Proof. intros l. rewrite lookup_fmap. by case (σ !! l). Qed. Lemma of_heap_insert l v h : of_heap (<[l:=Excl v]> h) = <[l:=v]> (of_heap h). Proof. by rewrite /of_heap -(omap_insert _ _ _ (Excl v)). Qed. Lemma to_heap_insert l v σ : to_heap (<[l:=v]> σ) = <[l:=Excl v]> (to_heap σ). ... ... @@ -65,13 +65,13 @@ Section heap. Lemma of_heap_None h l : ✓ h → of_heap h !! l = None → h !! l = None ∨ h !! l ≡ Some ExclUnit. Proof. move=> /(_ O l). rewrite /of_heap lookup_omap. move=> /(_ l). rewrite /of_heap lookup_omap. by case: (h !! l)=> [[]|]; auto. Qed. Lemma heap_singleton_inv_l h l v : ✓ ({[l := Excl v]} ⋅ h) → h !! l = None ∨ h !! l ≡ Some ExclUnit. Proof. move=> /(_ O l). rewrite lookup_op lookup_singleton. move=> /(_ l). rewrite lookup_op lookup_singleton. by case: (h !! l)=> [[]|]; auto. Qed. ... ...
 ... ... @@ -76,10 +76,12 @@ Instance res_op : Op (res Λ Σ A) := λ r1 r2, Global Instance res_empty : Empty (res Λ Σ A) := Res ∅ ∅ ∅. Instance res_unit : Unit (res Λ Σ A) := λ r, Res (unit (wld r)) (unit (pst r)) (unit (gst r)). Instance res_valid : Valid (res Λ Σ A) := λ r, ✓ wld r ∧ ✓ pst r ∧ ✓ gst r. Instance res_validN : ValidN (res Λ Σ A) := λ n r, ✓{n} wld r ∧ ✓{n} pst r ∧ ✓{n} gst r. Instance res_minus : Minus (res Λ Σ A) := λ r1 r2, Res (wld r1 ⩪ wld r2) (pst r1 ⩪ pst r2) (gst r1 ⩪ gst r2). Lemma res_included (r1 r2 : res Λ Σ A) : r1 ≼ r2 ↔ wld r1 ≼ wld r2 ∧ pst r1 ≼ pst r2 ∧ gst r1 ≼ gst r2. Proof. ... ... @@ -97,11 +99,13 @@ Qed. Definition res_cmra_mixin : CMRAMixin (res Λ Σ A). Proof. split. - by intros n x [???] ? [???]; constructor; simpl in *; cofe_subst. - by intros n [???] ? [???]; constructor; simpl in *; cofe_subst. - by intros n [???] ? [???] (?&?&?); split_and!; simpl in *; cofe_subst. - by intros n [???] ? [???] [???] ? [???]; constructor; simpl in *; cofe_subst. - by intros n x [???] ? [???]; constructor; cofe_subst. - by intros n [???] ? [???]; constructor; cofe_subst. - by intros n [???] ? [???] (?&?&?); split_and!; cofe_subst. - by intros n [???] ? [???] [???] ? [???]; constructor; cofe_subst. - intros r; split. + intros (?&?&?) n; split_and!; by apply cmra_valid_validN. + intros Hr; split_and!; apply cmra_valid_validN=> n; apply Hr. - by intros n ? (?&?&?); split_and!; apply cmra_validN_S. - by intros ???; constructor; rewrite /= assoc. - by intros ??; constructor; rewrite /= comm. ... ... @@ -123,7 +127,7 @@ Canonical Structure resRA : cmraT := CMRAT res_cofe_mixin res_cmra_mixin. Global Instance res_cmra_identity : CMRAIdentity resRA. Proof. split. - intros n; split_and!; apply cmra_empty_valid. - split_and!; apply cmra_empty_valid. - by split; rewrite /= left_id. - apply _. Qed. ... ...
 ... ... @@ -125,11 +125,9 @@ Section sts. rewrite [(_ ★ ▷φ _)%I]comm -!assoc -own_op -[(▷φ _ ★ _)%I]comm. rewrite own_valid_l discrete_validI. rewrite -!assoc. apply const_elim_sep_l=> Hvalid. assert (s ∈ S) by (by eapply sts_auth_frag_valid_inv, discrete_valid). assert (s ∈ S) by eauto using sts_auth_frag_valid_inv. rewrite const_equiv // left_id comm sts_op_auth_frag //. assert (✓ sts_frag S T) as Hv by by eapply cmra_valid_op_r, discrete_valid. apply (Hv 0). by assert (✓ sts_frag S T) as [??] by eauto using cmra_valid_op_r. Qed. Lemma sts_closing E γ s T s' T' : ... ... @@ -187,7 +185,7 @@ Section sts. (sts_own γ s' T' -★ Ψ x))) → P ⊑ fsa E Ψ. Proof. rewrite sts_own_eq. intros. eapply sts_fsaS; try done; []. rewrite sts_own_eq. intros. eapply sts_fsaS; try done; []. (* FIXME: slow *) by rewrite sts_ownS_eq sts_own_eq. Qed. End sts.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!