diff --git a/theories/algebra/auth.v b/theories/algebra/auth.v index fc6f1806f35683bcd7c33a1522f24a70ca89b1f2..6ad65d62f141885cd57055735a967d34e62f6500 100644 --- a/theories/algebra/auth.v +++ b/theories/algebra/auth.v @@ -100,11 +100,71 @@ Section auth. Global Instance auth_frag_inj : Inj (≡) (≡) (@auth_frag A). Proof. rewrite /auth_frag. apply _. Qed. + Global Instance auth_ofe_discrete : OfeDiscrete A → OfeDiscrete (authO A). + Proof. apply _. Qed. + Global Instance auth_auth_discrete q a : + Discrete a → Discrete (ε : A) → Discrete (â—{q} a). + Proof. rewrite /auth_auth. apply _. Qed. + Global Instance auth_frag_discrete a : Discrete a → Discrete (â—¯ a). + Proof. rewrite /auth_frag. apply _. Qed. + Global Instance auth_cmra_discrete : CmraDiscrete A → CmraDiscrete (authR A). + Proof. apply _. Qed. + + (** Operation *) + Lemma auth_auth_frac_op p q a : â—{p + q} a ≡ â—{p} a â‹… â—{q} a. + Proof. apply view_auth_frac_op. Qed. + Global Instance auth_auth_frac_is_op q q1 q2 a : + IsOp q q1 q2 → IsOp' (â—{q} a) (â—{q1} a) (â—{q2} a). + Proof. rewrite /auth_auth. apply _. Qed. + + Lemma auth_frag_op a b : â—¯ (a â‹… b) = â—¯ a â‹… â—¯ b. + Proof. apply view_frag_op. Qed. + Lemma auth_frag_mono a b : a ≼ b → â—¯ a ≼ â—¯ b. + Proof. apply view_frag_mono. Qed. + Lemma auth_frag_core a : core (â—¯ a) = â—¯ (core a). + Proof. apply view_frag_core. Qed. + Global Instance auth_frag_core_id a : CoreId a → CoreId (â—¯ a). + Proof. rewrite /auth_frag. apply _. Qed. + Global Instance auth_frag_is_op a b1 b2 : + IsOp a b1 b2 → IsOp' (â—¯ a) (â—¯ b1) (â—¯ b2). + Proof. rewrite /auth_frag. apply _. Qed. + Global Instance auth_frag_sep_homomorphism : + MonoidHomomorphism op op (≡) (@auth_frag A). + Proof. rewrite /auth_frag. apply _. Qed. + + Lemma big_opL_auth_frag {B} (g : nat → B → A) (l : list B) : + (â—¯ [^op list] k↦x ∈ l, g k x) ≡ [^op list] k↦x ∈ l, â—¯ (g k x). + Proof. apply (big_opL_commute _). Qed. + Lemma big_opM_auth_frag `{Countable K} {B} (g : K → B → A) (m : gmap K B) : + (â—¯ [^op map] k↦x ∈ m, g k x) ≡ [^op map] k↦x ∈ m, â—¯ (g k x). + Proof. apply (big_opM_commute _). Qed. + Lemma big_opS_auth_frag `{Countable B} (g : B → A) (X : gset B) : + (â—¯ [^op set] x ∈ X, g x) ≡ [^op set] x ∈ X, â—¯ (g x). + Proof. apply (big_opS_commute _). Qed. + Lemma big_opMS_auth_frag `{Countable B} (g : B → A) (X : gmultiset B) : + (â—¯ [^op mset] x ∈ X, g x) ≡ [^op mset] x ∈ X, â—¯ (g x). + Proof. apply (big_opMS_commute _). Qed. + + (** Validity *) + Lemma auth_auth_frac_op_invN n p a q b : ✓{n} (â—{p} a â‹… â—{q} b) → a ≡{n}≡ b. + Proof. apply view_auth_frac_op_invN. Qed. + Lemma auth_auth_frac_op_inv p a q b : ✓ (â—{p} a â‹… â—{q} b) → a ≡ b. + Proof. apply view_auth_frac_op_inv. Qed. + Lemma auth_auth_frac_op_inv_L `{!LeibnizEquiv A} q a p b : + ✓ (â—{p} a â‹… â—{q} b) → a = b. + Proof. by apply view_auth_frac_op_inv_L. Qed. + Lemma auth_auth_frac_validN n q a : ✓{n} (â—{q} a) ↔ ✓{n} q ∧ ✓{n} a. Proof. by rewrite view_auth_frac_validN auth_view_rel_unit. Qed. Lemma auth_auth_validN n a : ✓{n} (â— a) ↔ ✓{n} a. Proof. by rewrite view_auth_validN auth_view_rel_unit. Qed. + Lemma auth_auth_frac_op_validN n q1 q2 a1 a2 : + ✓{n} (â—{q1} a1 â‹… â—{q2} a2) ↔ ✓ (q1 + q2)%Qp ∧ a1 ≡{n}≡ a2 ∧ ✓{n} a1. + Proof. by rewrite view_auth_frac_op_validN auth_view_rel_unit. Qed. + Lemma auth_auth_op_validN n a1 a2 : ✓{n} (â— a1 â‹… â— a2) ↔ False. + Proof. rewrite view_auth_frac_op_validN. naive_solver. Qed. + (** The following lemmas are also stated as implications, which can be used to force [apply] to use the lemma in the right direction. *) Lemma auth_frag_validN n b : ✓{n} (â—¯ b) ↔ ✓{n} b. @@ -137,6 +197,15 @@ Section auth. by setoid_rewrite auth_view_rel_unit. Qed. + Lemma auth_auth_frac_op_valid q1 q2 a1 a2 : + ✓ (â—{q1} a1 â‹… â—{q2} a2) ↔ ✓ (q1 + q2)%Qp ∧ a1 ≡ a2 ∧ ✓ a1. + Proof. + rewrite view_auth_frac_op_valid !cmra_valid_validN. + by setoid_rewrite auth_view_rel_unit. + Qed. + Lemma auth_auth_op_valid a1 a2 : ✓ (â— a1 â‹… â— a2) ↔ False. + Proof. rewrite auth_auth_frac_op_valid. naive_solver. Qed. + (** The following lemmas are also stated as implications, which can be used to force [apply] to use the lemma in the right direction. *) Lemma auth_frag_valid b : ✓ (â—¯ b) ↔ ✓ b. @@ -191,57 +260,6 @@ Section auth. ✓ (â— a â‹… â—¯ b) ↔ b ≼ a ∧ ✓ a. Proof. rewrite auth_both_frac_valid_discrete frac_valid'. naive_solver. Qed. - Global Instance auth_ofe_discrete : OfeDiscrete A → OfeDiscrete (authO A). - Proof. apply _. Qed. - Global Instance auth_auth_discrete q a : - Discrete a → Discrete (ε : A) → Discrete (â—{q} a). - Proof. rewrite /auth_auth. apply _. Qed. - Global Instance auth_frag_discrete a : Discrete a → Discrete (â—¯ a). - Proof. rewrite /auth_frag. apply _. Qed. - Global Instance auth_cmra_discrete : CmraDiscrete A → CmraDiscrete (authR A). - Proof. apply _. Qed. - - Lemma auth_auth_frac_op p q a : â—{p + q} a ≡ â—{p} a â‹… â—{q} a. - Proof. apply view_auth_frac_op. Qed. - Lemma auth_auth_frac_op_invN n p a q b : ✓{n} (â—{p} a â‹… â—{q} b) → a ≡{n}≡ b. - Proof. apply view_auth_frac_op_invN. Qed. - Lemma auth_auth_frac_op_inv p a q b : ✓ (â—{p} a â‹… â—{q} b) → a ≡ b. - Proof. apply view_auth_frac_op_inv. Qed. - Lemma auth_auth_frac_op_inv_L `{!LeibnizEquiv A} q a p b : - ✓ (â—{p} a â‹… â—{q} b) → a = b. - Proof. by apply view_auth_frac_op_inv_L. Qed. - Global Instance auth_auth_frac_is_op q q1 q2 a : - IsOp q q1 q2 → IsOp' (â—{q} a) (â—{q1} a) (â—{q2} a). - Proof. rewrite /auth_auth. apply _. Qed. - - Lemma auth_frag_op a b : â—¯ (a â‹… b) = â—¯ a â‹… â—¯ b. - Proof. apply view_frag_op. Qed. - Lemma auth_frag_mono a b : a ≼ b → â—¯ a ≼ â—¯ b. - Proof. apply view_frag_mono. Qed. - Lemma auth_frag_core a : core (â—¯ a) = â—¯ (core a). - Proof. apply view_frag_core. Qed. - Global Instance auth_frag_core_id a : CoreId a → CoreId (â—¯ a). - Proof. rewrite /auth_frag. apply _. Qed. - Global Instance auth_frag_is_op a b1 b2 : - IsOp a b1 b2 → IsOp' (â—¯ a) (â—¯ b1) (â—¯ b2). - Proof. rewrite /auth_frag. apply _. Qed. - Global Instance auth_frag_sep_homomorphism : - MonoidHomomorphism op op (≡) (@auth_frag A). - Proof. rewrite /auth_frag. apply _. Qed. - - Lemma big_opL_auth_frag {B} (g : nat → B → A) (l : list B) : - (â—¯ [^op list] k↦x ∈ l, g k x) ≡ [^op list] k↦x ∈ l, â—¯ (g k x). - Proof. apply (big_opL_commute _). Qed. - Lemma big_opM_auth_frag `{Countable K} {B} (g : K → B → A) (m : gmap K B) : - (â—¯ [^op map] k↦x ∈ m, g k x) ≡ [^op map] k↦x ∈ m, â—¯ (g k x). - Proof. apply (big_opM_commute _). Qed. - Lemma big_opS_auth_frag `{Countable B} (g : B → A) (X : gset B) : - (â—¯ [^op set] x ∈ X, g x) ≡ [^op set] x ∈ X, â—¯ (g x). - Proof. apply (big_opS_commute _). Qed. - Lemma big_opMS_auth_frag `{Countable B} (g : B → A) (X : gmultiset B) : - (â—¯ [^op mset] x ∈ X, g x) ≡ [^op mset] x ∈ X, â—¯ (g x). - Proof. apply (big_opMS_commute _). Qed. - (** Inclusion *) Lemma auth_auth_frac_includedN n p1 p2 a1 a2 b : â—{p1} a1 ≼{n} â—{p2} a2 â‹… â—¯ b ↔ (p1 ≤ p2)%Qc ∧ a1 ≡{n}≡ a2. diff --git a/theories/algebra/view.v b/theories/algebra/view.v index 89954f77ee2ab964bc7619582c150eb13daacf68..ab718ce3b100123b2831a1e083724f0a3928b013 100644 --- a/theories/algebra/view.v +++ b/theories/algebra/view.v @@ -204,47 +204,6 @@ Section cmra. | None => ∃ a, rel n a (view_frag_proj x) end := eq_refl _. - Lemma view_auth_frac_validN n q a : ✓{n} (â—V{q} a) ↔ ✓{n} q ∧ rel n a ε. - Proof. - rewrite view_validN_eq /=. apply and_iff_compat_l. split; [|by eauto]. - by intros [? [->%(inj to_agree) ?]]. - Qed. - Lemma view_auth_validN n a : ✓{n} (â—V a) ↔ rel n a ε. - Proof. - rewrite view_auth_frac_validN -cmra_discrete_valid_iff frac_valid'. naive_solver. - Qed. - Lemma view_frag_validN n b : ✓{n} (â—¯V b) ↔ ∃ a, rel n a b. - Proof. done. Qed. - Lemma view_both_frac_validN n q a b : - ✓{n} (â—V{q} a â‹… â—¯V b) ↔ ✓{n} q ∧ rel n a b. - Proof. - rewrite view_validN_eq /=. apply and_iff_compat_l. - setoid_rewrite (left_id _ _ b). split; [|by eauto]. - by intros [?[->%(inj to_agree)]]. - Qed. - Lemma view_both_validN n a b : ✓{n} (â—V a â‹… â—¯V b) ↔ rel n a b. - Proof. - rewrite view_both_frac_validN -cmra_discrete_valid_iff frac_valid'. naive_solver. - Qed. - - Lemma view_auth_frac_valid q a : ✓ (â—V{q} a) ↔ ✓ q ∧ ∀ n, rel n a ε. - Proof. - rewrite view_valid_eq /=. apply and_iff_compat_l. split; [|by eauto]. - intros H n. by destruct (H n) as [? [->%(inj to_agree) ?]]. - Qed. - Lemma view_auth_valid a : ✓ (â—V a) ↔ ∀ n, rel n a ε. - Proof. rewrite view_auth_frac_valid frac_valid'. naive_solver. Qed. - Lemma view_frag_valid b : ✓ (â—¯V b) ↔ ∀ n, ∃ a, rel n a b. - Proof. done. Qed. - Lemma view_both_frac_valid q a b : ✓ (â—V{q} a â‹… â—¯V b) ↔ ✓ q ∧ ∀ n, rel n a b. - Proof. - rewrite view_valid_eq /=. apply and_iff_compat_l. - setoid_rewrite (left_id _ _ b). split; [|by eauto]. - intros H n. by destruct (H n) as [?[->%(inj to_agree)]]. - Qed. - Lemma view_both_valid a b : ✓ (â—V a â‹… â—¯V b) ↔ ∀ n, rel n a b. - Proof. rewrite view_both_frac_valid frac_valid'. naive_solver. Qed. - Lemma view_cmra_mixin : CmraMixin (view rel). Proof. apply (iso_cmra_mixin_restrict @@ -304,25 +263,12 @@ Section cmra. Qed. Canonical Structure viewUR := UcmraT (view rel) view_ucmra_mixin. + (** Operation *) Lemma view_auth_frac_op p1 p2 a : â—V{p1 + p2} a ≡ â—V{p1} a â‹… â—V{p2} a. Proof. intros; split; simpl; last by rewrite left_id. by rewrite -Some_op -pair_op agree_idemp. Qed. - Lemma view_auth_frac_op_invN n p1 a1 p2 a2 : - ✓{n} (â—V{p1} a1 â‹… â—V{p2} a2) → a1 ≡{n}≡ a2. - Proof. - rewrite /op /view_op /= left_id -Some_op -pair_op view_validN_eq /=. - intros (?&?& Eq &?). apply (inj to_agree), agree_op_invN. by rewrite Eq. - Qed. - Lemma view_auth_frac_op_inv p1 a1 p2 a2 : ✓ (â—V{p1} a1 â‹… â—V{p2} a2) → a1 ≡ a2. - Proof. - intros ?. apply equiv_dist. intros n. - by eapply view_auth_frac_op_invN, cmra_valid_validN. - Qed. - Lemma view_auth_frac_op_inv_L `{!LeibnizEquiv A} p1 a1 p2 a2 : - ✓ (â—V{p1} a1 â‹… â—V{p2} a2) → a1 = a2. - Proof. by intros ?%view_auth_frac_op_inv%leibniz_equiv. Qed. Global Instance view_auth_frac_is_op q q1 q2 a : IsOp q q1 q2 → IsOp' (â—V{q} a) (â—V{q1} a) (â—V{q2} a). Proof. rewrite /IsOp' /IsOp => ->. by rewrite -view_auth_frac_op. Qed. @@ -355,6 +301,87 @@ Section cmra. (â—¯V [^op mset] x ∈ X, g x) ≡ [^op mset] x ∈ X, â—¯V (g x). Proof. apply (big_opMS_commute _). Qed. + (** Validity *) + Lemma view_auth_frac_op_invN n p1 a1 p2 a2 : + ✓{n} (â—V{p1} a1 â‹… â—V{p2} a2) → a1 ≡{n}≡ a2. + Proof. + rewrite /op /view_op /= left_id -Some_op -pair_op view_validN_eq /=. + intros (?&?& Eq &?). apply (inj to_agree), agree_op_invN. by rewrite Eq. + Qed. + Lemma view_auth_frac_op_inv p1 a1 p2 a2 : ✓ (â—V{p1} a1 â‹… â—V{p2} a2) → a1 ≡ a2. + Proof. + intros ?. apply equiv_dist. intros n. + by eapply view_auth_frac_op_invN, cmra_valid_validN. + Qed. + Lemma view_auth_frac_op_inv_L `{!LeibnizEquiv A} p1 a1 p2 a2 : + ✓ (â—V{p1} a1 â‹… â—V{p2} a2) → a1 = a2. + Proof. by intros ?%view_auth_frac_op_inv%leibniz_equiv. Qed. + + Lemma view_auth_frac_validN n q a : ✓{n} (â—V{q} a) ↔ ✓{n} q ∧ rel n a ε. + Proof. + rewrite view_validN_eq /=. apply and_iff_compat_l. split; [|by eauto]. + by intros [? [->%(inj to_agree) ?]]. + Qed. + Lemma view_auth_validN n a : ✓{n} (â—V a) ↔ rel n a ε. + Proof. + rewrite view_auth_frac_validN -cmra_discrete_valid_iff frac_valid'. naive_solver. + Qed. + + Lemma view_auth_frac_op_validN n q1 q2 a1 a2 : + ✓{n} (â—V{q1} a1 â‹… â—V{q2} a2) ↔ ✓ (q1 + q2)%Qp ∧ a1 ≡{n}≡ a2 ∧ rel n a1 ε. + Proof. + split. + - intros Hval. assert (a1 ≡{n}≡ a2) as Ha by eauto using view_auth_frac_op_invN. + revert Hval. rewrite Ha -view_auth_frac_op view_auth_frac_validN. naive_solver. + - intros (?&->&?). by rewrite -view_auth_frac_op view_auth_frac_validN. + Qed. + Lemma view_auth_op_validN n a1 a2 : ✓{n} (â—V a1 â‹… â—V a2) ↔ False. + Proof. rewrite view_auth_frac_op_validN. naive_solver. Qed. + + Lemma view_frag_validN n b : ✓{n} (â—¯V b) ↔ ∃ a, rel n a b. + Proof. done. Qed. + + Lemma view_both_frac_validN n q a b : + ✓{n} (â—V{q} a â‹… â—¯V b) ↔ ✓{n} q ∧ rel n a b. + Proof. + rewrite view_validN_eq /=. apply and_iff_compat_l. + setoid_rewrite (left_id _ _ b). split; [|by eauto]. + by intros [?[->%(inj to_agree)]]. + Qed. + Lemma view_both_validN n a b : ✓{n} (â—V a â‹… â—¯V b) ↔ rel n a b. + Proof. + rewrite view_both_frac_validN -cmra_discrete_valid_iff frac_valid'. naive_solver. + Qed. + + Lemma view_auth_frac_valid q a : ✓ (â—V{q} a) ↔ ✓ q ∧ ∀ n, rel n a ε. + Proof. + rewrite view_valid_eq /=. apply and_iff_compat_l. split; [|by eauto]. + intros H n. by destruct (H n) as [? [->%(inj to_agree) ?]]. + Qed. + Lemma view_auth_valid a : ✓ (â—V a) ↔ ∀ n, rel n a ε. + Proof. rewrite view_auth_frac_valid frac_valid'. naive_solver. Qed. + + Lemma view_auth_frac_op_valid q1 q2 a1 a2 : + ✓ (â—V{q1} a1 â‹… â—V{q2} a2) ↔ ✓ (q1 + q2)%Qp ∧ a1 ≡ a2 ∧ ∀ n, rel n a1 ε. + Proof. + rewrite !cmra_valid_validN equiv_dist. setoid_rewrite view_auth_frac_op_validN. + setoid_rewrite <-cmra_discrete_valid_iff. naive_solver. + Qed. + Lemma view_auth_op_valid a1 a2 : ✓ (â—V a1 â‹… â—V a2) ↔ False. + Proof. rewrite view_auth_frac_op_valid. naive_solver. Qed. + + Lemma view_frag_valid b : ✓ (â—¯V b) ↔ ∀ n, ∃ a, rel n a b. + Proof. done. Qed. + + Lemma view_both_frac_valid q a b : ✓ (â—V{q} a â‹… â—¯V b) ↔ ✓ q ∧ ∀ n, rel n a b. + Proof. + rewrite view_valid_eq /=. apply and_iff_compat_l. + setoid_rewrite (left_id _ _ b). split; [|by eauto]. + intros H n. by destruct (H n) as [?[->%(inj to_agree)]]. + Qed. + Lemma view_both_valid a b : ✓ (â—V a â‹… â—¯V b) ↔ ∀ n, rel n a b. + Proof. rewrite view_both_frac_valid frac_valid'. naive_solver. Qed. + (** Inclusion *) Lemma view_auth_frac_includedN n p1 p2 a1 a2 b : â—V{p1} a1 ≼{n} â—V{p2} a2 â‹… â—¯V b ↔ (p1 ≤ p2)%Qc ∧ a1 ≡{n}≡ a2.