diff --git a/theories/algebra/auth.v b/theories/algebra/auth.v index 6df092d8c8ce059d7a245014a69d346dc53edc83..eb44b8b219657386ffd423cfeb43374fc61072f6 100644 --- a/theories/algebra/auth.v +++ b/theories/algebra/auth.v @@ -104,14 +104,12 @@ Instance auth_valid : Valid (auth A) := λ x, ✓ q ∧ (∀ n, ∃ a, ag ≡{n}≡ to_agree a ∧ auth_frag_proj x ≼{n} a ∧ ✓{n} a) | None => ✓ auth_frag_proj x end. -Global Arguments auth_valid !_ /. Instance auth_validN : ValidN (auth A) := λ n x, match auth_auth_proj x with | Some (q, ag) => ✓{n} q ∧ ∃ a, ag ≡{n}≡ to_agree a ∧ auth_frag_proj x ≼{n} a ∧ ✓{n} a | None => ✓{n} auth_frag_proj x end. -Global Arguments auth_validN _ !_ /. Instance auth_pcore : PCore (auth A) := λ x, Some (Auth (core (auth_auth_proj x)) (core (auth_frag_proj x))). Instance auth_op : Op (auth A) := λ x y, @@ -229,37 +227,26 @@ Proof. rewrite auth_both_frac_valid frac_valid'. naive_solver. Qed. Lemma auth_cmra_mixin : CmraMixin (auth A). Proof. - apply cmra_total_mixin. - - eauto. - - by intros n x y1 y2 [Hy Hy']; split; simpl; rewrite ?Hy ?Hy'. - - by intros n y1 y2 [Hy Hy']; split; simpl; rewrite ?Hy ?Hy'. - - intros n [x a] [y b] [Hx Ha]; simpl in *. rewrite !auth_validN_eq. - destruct Hx as [x y Hx|]; first destruct Hx as [? Hx]; - [destruct x,y|]; intros VI; ofe_subst; auto. - - intros [[[]|] ]; rewrite /= ?auth_valid_eq ?auth_validN_eq /= - ?cmra_valid_validN; naive_solver. - - intros n [[[]|] ]; rewrite !auth_validN_eq /=; + apply (iso_cmra_mixin_restrict (λ x : option (frac * agree A) * A, Auth x.1 x.2) + (λ x, (auth_auth_proj x, auth_frag_proj x))); try done. + - intros [x b]. by rewrite /= pair_pcore !cmra_pcore_core. + - intros n [[[q aa]|] b]; rewrite /= auth_validN_eq /=; last done. + intros (?&a&->&?&?). split; simpl; by eauto using cmra_validN_includedN. + - rewrite auth_validN_eq. + intros n [x1 b1] [x2 b2] [Hx ?]; simpl in *; + destruct Hx as [[q1 aa1] [q2 aa2] [??]|]; intros ?; by ofe_subst. + - rewrite auth_valid_eq auth_validN_eq. + intros [[[q aa]|] b]; rewrite /= cmra_valid_validN; naive_solver. + - rewrite auth_validN_eq. intros n [[[q aa]|] b]; naive_solver eauto using dist_S, cmra_includedN_S, cmra_validN_S. - - by split; simpl; rewrite assoc. - - by split; simpl; rewrite comm. - - by split; simpl; rewrite ?cmra_core_l. - - by split; simpl; rewrite ?cmra_core_idemp. - - intros ??; rewrite! auth_included; intros [??]. - by split; simpl; apply: cmra_core_mono. (* FIXME: FIXME(Coq #6294): needs new unification *) - assert (∀ n (a b1 b2 : A), b1 â‹… b2 ≼{n} a → b1 ≼{n} a). { intros n a b1 b2 <-; apply cmra_includedN_l. } - intros n [[[q1 a1]|] b1] [[[q2 a2]|] b2]; rewrite auth_validN_eq /=; - try naive_solver eauto using cmra_validN_op_l, cmra_validN_includedN. - intros [? [a [Eq [? Valid]]]]. - assert (Eq': a1 ≡{n}≡ a2). { by apply agree_op_invN; rewrite Eq. } + rewrite auth_validN_eq. intros n [[[q1 a1]|] b1] [[[q2 a2]|] b2]; simpl; + [|naive_solver eauto using cmra_validN_op_l, cmra_validN_includedN..]. + intros [? [a [Ha12a [? Valid]]]]. + assert (a1 ≡{n}≡ a2) as Ha12 by (apply agree_op_invN; by rewrite Ha12a). split; [naive_solver eauto using cmra_validN_op_l|]. - exists a. rewrite -Eq -Eq' agree_idemp. naive_solver. - - intros n x y1 y2 ? [??]; simpl in *. - destruct (cmra_extend n (auth_auth_proj x) (auth_auth_proj y1) - (auth_auth_proj y2)) as (ea1&ea2&?&?&?); auto using auth_auth_proj_validN. - destruct (cmra_extend n (auth_frag_proj x) (auth_frag_proj y1) (auth_frag_proj y2)) - as (b1&b2&?&?&?); auto using auth_frag_proj_validN. - by exists (Auth ea1 b1), (Auth ea2 b2). + exists a. rewrite -Ha12a -Ha12 agree_idemp. naive_solver. Qed. Canonical Structure authR := CmraT (auth A) auth_cmra_mixin. @@ -390,11 +377,11 @@ Lemma auth_update_core_id q a b `{!CoreId b} : b ≼ a → â—{q} a ~~> â—{q} a â‹… â—¯ b. Proof. intros Ha%(core_id_extract _ _). apply cmra_total_update. - move=> n [[[q' ag]|] bf1] [Hq [a0 [Haa0 [Hbf1 Ha0]]]]; do 2 red; simpl in *. - + split; [done|]. exists a0. split_and!; [done| |done]. + move=> n [[[q' ag]|] bf1] [Hq [a0 [Haa0 [Hbf1 Ha0]]]]; simpl in *. + + split; simpl; [done|]. exists a0. split_and!; [done| |done]. assert (a ≡{n}≡ a0) as Haa0' by (apply to_agree_includedN; by exists ag). rewrite -Haa0' Ha Haa0' -assoc (comm _ b) assoc. by apply cmra_monoN_r. - + split; [done|]. exists a0. split_and!; [done| |done]. + + split; simpl; [done|]. exists a0. split_and!; [done| |done]. apply (inj to_agree) in Haa0. rewrite -Haa0 Ha Haa0 -assoc (comm _ b) assoc. by apply cmra_monoN_r. Qed.