Commit a9e2d8f3 authored by Robbert Krebbers's avatar Robbert Krebbers

Another failed approach to avoid declaring other projections than the carrier as canonical.

parent bf069d12
......@@ -35,92 +35,101 @@ Notation "x ≼{ n } y" := (includedN n x y)
Instance: Params (@includedN) 4.
Hint Extern 0 (_ {_} _) => reflexivity.
Record CMRAMixin A `{Dist A, Equiv A, PCore A, Op A, Valid A, ValidN A} := {
Record cmra_laws A `{Dist A, Equiv A, PCore A, Op A, Valid A, ValidN A} := {
(* setoids *)
mixin_cmra_op_ne (x : A) : NonExpansive (op x);
mixin_cmra_pcore_ne n x y cx :
law_cmra_op_ne (x : A) : NonExpansive (op x);
law_cmra_pcore_ne n x y cx :
x {n} y pcore x = Some cx cy, pcore y = Some cy cx {n} cy;
mixin_cmra_validN_ne n : Proper (dist n ==> impl) (validN n);
law_cmra_validN_ne n : Proper (dist n ==> impl) (validN n);
(* valid *)
mixin_cmra_valid_validN x : x n, {n} x;
mixin_cmra_validN_S n x : {S n} x {n} x;
law_cmra_valid_validN x : x n, {n} x;
law_cmra_validN_S n x : {S n} x {n} x;
(* monoid *)
mixin_cmra_assoc : Assoc () ();
mixin_cmra_comm : Comm () ();
mixin_cmra_pcore_l x cx : pcore x = Some cx cx x x;
mixin_cmra_pcore_idemp x cx : pcore x = Some cx pcore cx Some cx;
mixin_cmra_pcore_mono x y cx :
law_cmra_assoc : Assoc () ();
law_cmra_comm : Comm () ();
law_cmra_pcore_l x cx : pcore x = Some cx cx x x;
law_cmra_pcore_idemp x cx : pcore x = Some cx pcore cx Some cx;
law_cmra_pcore_mono x y cx :
x y pcore x = Some cx cy, pcore y = Some cy cx cy;
mixin_cmra_validN_op_l n x y : {n} (x y) {n} x;
mixin_cmra_extend n x y1 y2 :
law_cmra_validN_op_l n x y : {n} (x y) {n} x;
law_cmra_extend n x y1 y2 :
{n} x x {n} y1 y2
z1 z2, x z1 z2 z1 {n} y1 z2 {n} y2
}.
(** Bundeled version *)
Structure cmraT := CMRAT' {
cmra_car :> Type;
cmra_equiv : Equiv cmra_car;
cmra_dist : Dist cmra_car;
cmra_pcore : PCore cmra_car;
cmra_op : Op cmra_car;
cmra_valid : Valid cmra_car;
cmra_validN : ValidN cmra_car;
cmra_ofe_mixin : OfeMixin cmra_car;
cmra_mixin : CMRAMixin cmra_car;
_ : Type
Record cmra_mixin (A : Type) := CMRAMixin {
cmra_mixin_equiv : Equiv A;
cmra_mixin_dist : Dist A;
cmra_mixin_pcore : PCore A;
cmra_mixin_op : Op A;
cmra_mixin_valid : Valid A;
cmra_mixin_validN : ValidN A;
cmra_mixin_ofe_laws_of : ofe_laws A;
cmra_mixin_laws_of : cmra_laws A;
}.
Arguments CMRAT' _ {_ _ _ _ _ _} _ _ _.
Notation CMRAT A m m' := (CMRAT' A m m' A).
Arguments CMRAMixin {_ _ _ _ _ _ _} _ _.
(** Bundeled version *)
Structure cmraT := CMRAT' { cmra_car :> Type; _ : cmra_mixin cmra_car; _ : Type }.
Notation CMRAT A m := (CMRAT' A m A).
Add Printing Constructor cmraT.
Arguments cmra_car : simpl never.
Arguments cmra_equiv : simpl never.
Arguments cmra_dist : simpl never.
Definition cmra_mixin_of (A : cmraT) : cmra_mixin A := let 'CMRAT' _ m _ := A in m.
Arguments cmra_mixin_of : simpl never.
Definition cmra_pcore {A : cmraT} : PCore A := cmra_mixin_pcore _ (cmra_mixin_of A).
Arguments cmra_pcore : simpl never.
Arguments cmra_op : simpl never.
Arguments cmra_valid : simpl never.
Arguments cmra_validN : simpl never.
Arguments cmra_ofe_mixin : simpl never.
Arguments cmra_mixin : simpl never.
Add Printing Constructor cmraT.
Hint Extern 0 (PCore _) => eapply (@cmra_pcore _) : typeclass_instances.
Definition cmra_op {A : cmraT} : Op A := cmra_mixin_op _ (cmra_mixin_of A).
Arguments cmra_op : simpl never.
Hint Extern 0 (Op _) => eapply (@cmra_op _) : typeclass_instances.
Definition cmra_valid {A : cmraT} : Valid A := cmra_mixin_valid _ (cmra_mixin_of A).
Arguments cmra_valid : simpl never.
Hint Extern 0 (Valid _) => eapply (@cmra_valid _) : typeclass_instances.
Definition cmra_validN {A : cmraT} : ValidN A := cmra_mixin_validN _ (cmra_mixin_of A).
Arguments cmra_validN : simpl never.
Hint Extern 0 (ValidN _) => eapply (@cmra_validN _) : typeclass_instances.
Coercion cmra_ofeC (A : cmraT) : ofeT := OfeT A (cmra_ofe_mixin A).
Definition cmra_ofe_mixin_of {A} (m : cmra_mixin A) : ofe_mixin A :=
OfeMixin (cmra_mixin_ofe_laws_of _ m).
Coercion cmra_ofeC (A : cmraT) : ofeT :=
OfeT A (cmra_ofe_mixin_of (cmra_mixin_of A)).
Canonical Structure cmra_ofeC.
(** Lifting properties from the mixin *)
Section cmra_mixin.
Context {A : cmraT}.
Implicit Types x y : A.
Local Coercion cmra_mixin_of : cmraT >-> cmra_mixin.
Global Instance cmra_op_ne (x : A) : NonExpansive (op x).
Proof. apply (mixin_cmra_op_ne _ (cmra_mixin A)). Qed.
Proof. apply (law_cmra_op_ne _ (cmra_mixin_laws_of _ A)). Qed.
Lemma cmra_pcore_ne n x y cx :
x {n} y pcore x = Some cx cy, pcore y = Some cy cx {n} cy.
Proof. apply (mixin_cmra_pcore_ne _ (cmra_mixin A)). Qed.
Proof. apply (law_cmra_pcore_ne _ (cmra_mixin_laws_of _ A)). Qed.
Global Instance cmra_validN_ne n : Proper (dist n ==> impl) (@validN A _ n).
Proof. apply (mixin_cmra_validN_ne _ (cmra_mixin A)). Qed.
Proof. apply (law_cmra_validN_ne _ (cmra_mixin_laws_of _ A)). Qed.
Lemma cmra_valid_validN x : x n, {n} x.
Proof. apply (mixin_cmra_valid_validN _ (cmra_mixin A)). Qed.
Proof. apply (law_cmra_valid_validN _ (cmra_mixin_laws_of _ A)). Qed.
Lemma cmra_validN_S n x : {S n} x {n} x.
Proof. apply (mixin_cmra_validN_S _ (cmra_mixin A)). Qed.
Proof. apply (law_cmra_validN_S _ (cmra_mixin_laws_of _ A)). Qed.
Global Instance cmra_assoc : Assoc () (@op A _).
Proof. apply (mixin_cmra_assoc _ (cmra_mixin A)). Qed.
Proof. apply (law_cmra_assoc _ (cmra_mixin_laws_of _ A)). Qed.
Global Instance cmra_comm : Comm () (@op A _).
Proof. apply (mixin_cmra_comm _ (cmra_mixin A)). Qed.
Proof. apply (law_cmra_comm _ (cmra_mixin_laws_of _ A)). Qed.
Lemma cmra_pcore_l x cx : pcore x = Some cx cx x x.
Proof. apply (mixin_cmra_pcore_l _ (cmra_mixin A)). Qed.
Proof. apply (law_cmra_pcore_l _ (cmra_mixin_laws_of _ A)). Qed.
Lemma cmra_pcore_idemp x cx : pcore x = Some cx pcore cx Some cx.
Proof. apply (mixin_cmra_pcore_idemp _ (cmra_mixin A)). Qed.
Proof. apply (law_cmra_pcore_idemp _ (cmra_mixin_laws_of _ A)). Qed.
Lemma cmra_pcore_mono x y cx :
x y pcore x = Some cx cy, pcore y = Some cy cx cy.
Proof. apply (mixin_cmra_pcore_mono _ (cmra_mixin A)). Qed.
Proof. apply (law_cmra_pcore_mono _ (cmra_mixin_laws_of _ A)). Qed.
Lemma cmra_validN_op_l n x y : {n} (x y) {n} x.
Proof. apply (mixin_cmra_validN_op_l _ (cmra_mixin A)). Qed.
Proof. apply (law_cmra_validN_op_l _ (cmra_mixin_laws_of _ A)). Qed.
Lemma cmra_extend n x y1 y2 :
{n} x x {n} y1 y2
z1 z2, x z1 z2 z1 {n} y1 z2 {n} y2.
Proof. apply (mixin_cmra_extend _ (cmra_mixin A)). Qed.
Proof. apply (law_cmra_extend _ (cmra_mixin_laws_of _ A)). Qed.
End cmra_mixin.
Definition opM {A : cmraT} (x : A) (my : option A) :=
......@@ -163,56 +172,66 @@ Arguments core' _ _ _ /.
(** * CMRAs with a unit element *)
(** We use the notation ∅ because for most instances (maps, sets, etc) the
`empty' element is the unit. *)
Record UCMRAMixin A `{Dist A, Equiv A, PCore A, Op A, Valid A, Empty A} := {
Record ucmra_laws A `{Dist A, Equiv A, PCore A, Op A, Valid A, Empty A} := {
mixin_ucmra_unit_valid : ;
mixin_ucmra_unit_left_id : LeftId () ();
mixin_ucmra_pcore_unit : pcore Some
}.
Structure ucmraT := UCMRAT' {
ucmra_car :> Type;
ucmra_equiv : Equiv ucmra_car;
ucmra_dist : Dist ucmra_car;
ucmra_pcore : PCore ucmra_car;
ucmra_op : Op ucmra_car;
ucmra_valid : Valid ucmra_car;
ucmra_validN : ValidN ucmra_car;
ucmra_empty : Empty ucmra_car;
ucmra_ofe_mixin : OfeMixin ucmra_car;
ucmra_cmra_mixin : CMRAMixin ucmra_car;
ucmra_mixin : UCMRAMixin ucmra_car;
_ : Type;
Record ucmra_mixin (A : Type) := UCMRAMixin {
ucmra_mixin_equiv : Equiv A;
ucmra_mixin_dist : Dist A;
ucmra_mixin_pcore : PCore A;
ucmra_mixin_op : Op A;
ucmra_mixin_valid : Valid A;
ucmra_mixin_validN : ValidN A;
ucmra_mixin_empty : Empty A;
ucmra_mixin_ofe_laws_of : ofe_laws A;
ucmra_mixin_cmra_laws_of : cmra_laws A;
ucmra_mixin_laws_of : ucmra_laws A;
}.
Arguments UCMRAT' _ {_ _ _ _ _ _ _} _ _ _ _.
Notation UCMRAT A m m' m'' := (UCMRAT' A m m' m'' A).
Arguments ucmra_car : simpl never.
Arguments ucmra_equiv : simpl never.
Arguments ucmra_dist : simpl never.
Arguments ucmra_pcore : simpl never.
Arguments ucmra_op : simpl never.
Arguments ucmra_valid : simpl never.
Arguments ucmra_validN : simpl never.
Arguments ucmra_ofe_mixin : simpl never.
Arguments ucmra_cmra_mixin : simpl never.
Arguments ucmra_mixin : simpl never.
Arguments UCMRAMixin {_ _ _ _ _ _ _ _} _ _ _.
Structure ucmraT :=
UCMRAT' { ucmra_car :> Type; _ : ucmra_mixin ucmra_car; _ : Type }.
Notation UCMRAT A m := (UCMRAT' A m A).
Add Printing Constructor ucmraT.
Arguments ucmra_car : simpl never.
Definition ucmra_mixin_of (A : ucmraT) : ucmra_mixin A :=
let 'UCMRAT' _ m _ := A in m.
Arguments ucmra_mixin_of : simpl never.
Definition ucmra_empty {A : ucmraT} : Empty A :=
ucmra_mixin_empty _ (ucmra_mixin_of A).
Arguments ucmra_empty : simpl never.
Hint Extern 0 (Empty _) => eapply (@ucmra_empty _) : typeclass_instances.
Coercion ucmra_ofeC (A : ucmraT) : ofeT := OfeT A (ucmra_ofe_mixin A).
Definition ucmra_ofe_mixin_of {A} (m : ucmra_mixin A) : ofe_mixin A :=
OfeMixin (ucmra_mixin_ofe_laws_of _ m).
Definition ucmra_cmra_mixin_of {A} (m : ucmra_mixin A) : cmra_mixin A :=
CMRAMixin (ucmra_mixin_ofe_laws_of _ m) (ucmra_mixin_cmra_laws_of _ m).
Arguments ucmra_ofe_mixin_of : simpl never.
Arguments ucmra_cmra_mixin_of : simpl never.
Coercion ucmra_ofeC (A : ucmraT) : ofeT :=
OfeT A (ucmra_ofe_mixin_of (ucmra_mixin_of A)).
Canonical Structure ucmra_ofeC.
Coercion ucmra_cmraR (A : ucmraT) : cmraT :=
CMRAT A (ucmra_ofe_mixin A) (ucmra_cmra_mixin A).
CMRAT A (ucmra_cmra_mixin_of (ucmra_mixin_of A)).
Canonical Structure ucmra_cmraR.
(** Lifting properties from the mixin *)
Section ucmra_mixin.
Context {A : ucmraT}.
Implicit Types x y : A.
Local Coercion ucmra_mixin_of : ucmraT >-> ucmra_mixin.
Lemma ucmra_unit_valid : ( : A).
Proof. apply (mixin_ucmra_unit_valid _ (ucmra_mixin A)). Qed.
Proof. apply (mixin_ucmra_unit_valid _ (ucmra_mixin_laws_of _ A)). Qed.
Global Instance ucmra_unit_left_id : LeftId () (@op A _).
Proof. apply (mixin_ucmra_unit_left_id _ (ucmra_mixin A)). Qed.
Proof. apply (mixin_ucmra_unit_left_id _ (ucmra_mixin_laws_of _ A)). Qed.
Lemma ucmra_pcore_unit : pcore (:A) Some .
Proof. apply (mixin_ucmra_pcore_unit _ (ucmra_mixin A)). Qed.
Proof. apply (mixin_ucmra_pcore_unit _ (ucmra_mixin_laws_of _ A)). Qed.
End ucmra_mixin.
(** * Discrete CMRAs *)
......@@ -698,7 +717,7 @@ Section cmra_total.
Context (extend : n (x y1 y2 : A),
{n} x x {n} y1 y2
z1 z2, x z1 z2 z1 {n} y1 z2 {n} y2).
Lemma cmra_total_mixin : CMRAMixin A.
Lemma cmra_total_laws : cmra_laws A.
Proof using Type*.
split; auto.
- intros n x y ? Hcx%core_ne Hx; move: Hcx. rewrite /core /= Hx /=.
......@@ -850,7 +869,7 @@ End cmra_transport.
(** * Instances *)
(** ** Discrete CMRA *)
Record RAMixin A `{Equiv A, PCore A, Op A, Valid A} := {
Record ra_laws A `{Equiv A, PCore A, Op A, Valid A} := {
(* setoids *)
ra_op_proper (x : A) : Proper (() ==> ()) (op x);
ra_core_proper x y cx :
......@@ -869,18 +888,19 @@ Record RAMixin A `{Equiv A, PCore A, Op A, Valid A} := {
Section discrete.
Local Set Default Proof Using "Type*".
Context `{Equiv A, PCore A, Op A, Valid A, @Equivalence A ()}.
Context (ra_mix : RAMixin A).
Context (laws : ra_laws A).
Existing Instances discrete_dist.
Instance discrete_validN : ValidN A := λ n x, x.
Definition discrete_cmra_mixin : CMRAMixin A.
Definition discrete_cmra_laws : cmra_laws A.
Proof.
destruct ra_mix; split; try done.
destruct laws; split; try done.
- intros x; split; first done. by move=> /(_ 0).
- intros n x y1 y2 ??; by exists y1, y2.
Qed.
End discrete.
(*
Notation discreteR A ra_mix :=
(CMRAT A discrete_ofe_mixin (discrete_cmra_mixin ra_mix)).
Notation discreteUR A ra_mix ucmra_mix :=
......@@ -889,7 +909,7 @@ Notation discreteUR A ra_mix ucmra_mix :=
Global Instance discrete_cmra_discrete `{Equiv A, PCore A, Op A, Valid A,
@Equivalence A (≡)} (ra_mix : RAMixin A) : CMRADiscrete (discreteR A ra_mix).
Proof. split. apply _. done. Qed.
*)
Section ra_total.
Local Set Default Proof Using "Type*".
Context A `{Equiv A, PCore A, Op A, Valid A}.
......@@ -903,7 +923,7 @@ Section ra_total.
Context (core_idemp : x : A, core (core x) core x).
Context (core_mono : x y : A, x y core x core y).
Context (valid_op_l : x y : A, (x y) x).
Lemma ra_total_mixin : RAMixin A.
Lemma ra_total_laws : ra_laws A.
Proof.
split; auto.
- intros x y ? Hcx%core_proper Hx; move: Hcx. rewrite /core /= Hx /=.
......@@ -922,15 +942,17 @@ Section unit.
Instance unit_validN : ValidN () := λ n x, True.
Instance unit_pcore : PCore () := λ x, Some x.
Instance unit_op : Op () := λ x y, ().
Lemma unit_cmra_mixin : CMRAMixin ().
Proof. apply discrete_cmra_mixin, ra_total_mixin; by eauto. Qed.
Canonical Structure unitR : cmraT := CMRAT () unit_ofe_mixin unit_cmra_mixin.
Lemma unit_cmra_laws : cmra_laws ().
Proof. apply discrete_cmra_laws, ra_total_laws; by eauto. Qed.
Definition unit_cmra_mixin := CMRAMixin unit_ofe_laws unit_cmra_laws.
Canonical Structure unitR : cmraT := CMRAT () unit_cmra_mixin.
Instance unit_empty : Empty () := ().
Lemma unit_ucmra_mixin : UCMRAMixin ().
Lemma unit_ucmra_laws : ucmra_laws ().
Proof. done. Qed.
Canonical Structure unitUR : ucmraT :=
UCMRAT () unit_ofe_mixin unit_cmra_mixin unit_ucmra_mixin.
Definition unit_ucmra_mixin :=
UCMRAMixin unit_ofe_laws unit_cmra_laws unit_ucmra_laws.
Canonical Structure unitUR : ucmraT := UCMRAT () unit_ucmra_mixin.
Global Instance unit_cmra_discrete : CMRADiscrete unitR.
Proof. done. Qed.
......@@ -953,31 +975,35 @@ Section nat.
- intros [z ->]; unfold op, nat_op; lia.
- exists (y - x). by apply le_plus_minus.
Qed.
Lemma nat_ra_mixin : RAMixin nat.
Lemma nat_ra_laws : ra_laws nat.
Proof.
apply ra_total_mixin; try by eauto.
apply ra_total_laws; try by eauto.
- solve_proper.
- intros x y z. apply Nat.add_assoc.
- intros x y. apply Nat.add_comm.
- by exists 0.
Qed.
(*
Definition nat_cmra_mixin := CMRAMixin unit_ofe_laws unit_cmra_laws.
Canonical Structure natR : cmraT := discreteR nat nat_ra_mixin.
*)
Instance nat_empty : Empty nat := 0.
Lemma nat_ucmra_mixin : UCMRAMixin nat.
Lemma nat_ucmra_laws : ucmra_laws nat.
Proof. split; apply _ || done. Qed.
(*
Canonical Structure natUR : ucmraT :=
discreteUR nat nat_ra_mixin nat_ucmra_mixin.
Global Instance nat_cmra_discrete : CMRADiscrete natR.
Proof. constructor; apply _ || done. Qed.
Global Instance nat_cancelable (x : nat) : Cancelable x.
Proof. by intros ???? ?%Nat.add_cancel_l. Qed.
*)
End nat.
Definition mnat := nat.
(*
Section mnat.
Instance mnat_valid : Valid mnat := λ x, True.
Instance mnat_validN : ValidN mnat := λ n x, True.
......@@ -1045,6 +1071,7 @@ Section positive.
by apply leibniz_equiv.
Qed.
End positive.
*)
(** ** Product *)
Section prod.
......@@ -1082,7 +1109,7 @@ Section prod.
intros [[z1 Hz1] [z2 Hz2]]; exists (z1,z2); split; auto.
Qed.
Definition prod_cmra_mixin : CMRAMixin (A * B).
Definition prod_cmra_laws : cmra_laws (A * B).
Proof.
split; try apply _.
- by intros n x y1 y2 [Hy1 Hy2]; split; rewrite /= ?Hy1 ?Hy2.
......@@ -1111,8 +1138,8 @@ Section prod.
destruct (cmra_extend n (x.2) (y1.2) (y2.2)) as (z21&z22&?&?&?); auto.
by exists (z11,z21), (z12,z22).
Qed.
Canonical Structure prodR :=
CMRAT (A * B) prod_ofe_mixin prod_cmra_mixin.
Definition prod_cmra_mixin := CMRAMixin prod_ofe_laws prod_cmra_laws.
Canonical Structure prodR := CMRAT (A * B) prod_cmra_mixin.
Lemma pair_op (a a' : A) (b b' : B) : (a, b) (a', b') = (a a', b b').
Proof. done. Qed.
......@@ -1152,15 +1179,16 @@ Section prod_unit.
Context {A B : ucmraT}.
Instance prod_empty `{Empty A, Empty B} : Empty (A * B) := (, ).
Lemma prod_ucmra_mixin : UCMRAMixin (A * B).
Lemma prod_ucmra_laws : ucmra_laws (A * B).
Proof.
split.
- split; apply ucmra_unit_valid.
- by split; rewrite /=left_id.
- rewrite prod_pcore_Some'; split; apply (persistent _).
Qed.
Canonical Structure prodUR :=
UCMRAT (A * B) prod_ofe_mixin prod_cmra_mixin prod_ucmra_mixin.
Definition prod_ucmra_mixin :=
UCMRAMixin prod_ofe_laws prod_cmra_laws prod_ucmra_laws.
Canonical Structure prodUR := UCMRAT (A * B) prod_ucmra_mixin.
Lemma pair_split (x : A) (y : B) : (x, y) (x, ) (, y).
Proof. by rewrite pair_op left_id right_id. Qed.
......@@ -1263,9 +1291,9 @@ Section option.
+ exists (Some z); by constructor.
Qed.
Lemma option_cmra_mixin : CMRAMixin (option A).
Lemma option_cmra_laws : cmra_laws (option A).
Proof.
apply cmra_total_mixin.
apply cmra_total_laws.
- eauto.
- by intros [x|] n; destruct 1; constructor; cofe_subst.
- destruct 1; by cofe_subst.
......@@ -1295,17 +1323,18 @@ Section option.
+ by exists None, (Some x); repeat constructor.
+ exists None, None; repeat constructor.
Qed.
Canonical Structure optionR :=
CMRAT (option A) option_ofe_mixin option_cmra_mixin.
Definition option_cmra_mixin := CMRAMixin option_ofe_laws option_cmra_laws.
Canonical Structure optionR := CMRAT (option A) option_cmra_mixin.
Global Instance option_cmra_discrete : CMRADiscrete A CMRADiscrete optionR.
Proof. split; [apply _|]. by intros [x|]; [apply (cmra_discrete_valid x)|]. Qed.
Instance option_empty : Empty (option A) := None.
Lemma option_ucmra_mixin : UCMRAMixin optionR.
Lemma option_ucmra_laws : ucmra_laws (option A).
Proof. split. done. by intros []. done. Qed.
Canonical Structure optionUR :=
UCMRAT (option A) option_ofe_mixin option_cmra_mixin option_ucmra_mixin.
Definition option_ucmra_mixin :=
UCMRAMixin option_ofe_laws option_cmra_laws option_ucmra_laws.
Canonical Structure optionUR := UCMRAT (option A) option_ucmra_mixin.
(** Misc *)
Global Instance Some_cmra_monotone : CMRAMonotone Some.
......
......@@ -52,7 +52,7 @@ Record tower := {
}.
Instance tower_equiv : Equiv tower := λ X Y, k, X k Y k.
Instance tower_dist : Dist tower := λ n X Y, k, X k {n} Y k.
Definition tower_ofe_mixin : OfeMixin tower.
Lemma tower_ofe_laws : ofe_laws tower.
Proof.
split.
- intros X Y; split; [by intros HXY n k; apply equiv_dist|].
......@@ -64,6 +64,7 @@ Proof.
- intros k X Y HXY n; apply dist_S.
by rewrite -(g_tower X) (HXY (S n)) g_tower.
Qed.
Definition tower_ofe_mixin := OfeMixin tower_ofe_laws.
Definition T : ofeT := OfeT tower tower_ofe_mixin.
Program Definition tower_chain (c : chain T) (k : nat) : chain (A k) :=
......
From iris.algebra Require Export cmra.
From iris.prelude Require Export gmap.
(*
From iris.algebra Require Import updates local_updates.
From iris.base_logic Require Import base_logic.
*)
Set Default Proof Using "Type".
Section cofe.
......@@ -10,12 +12,33 @@ Implicit Types m : gmap K A.
Instance gmap_dist : Dist (gmap K A) := λ n m1 m2,
i, m1 !! i {n} m2 !! i.
Definition gmap_ofe_mixin : OfeMixin (gmap K A).
Definition gmap_ofe_mixin : ofe_laws (gmap K A).
Proof.
split.
- intros m1 m2; split.
+ by intros Hm n k; apply equiv_dist.
+ intros Hm k; apply equiv_dist; intros n; apply Hm.
+ intros Hm k.
Check @equiv_dist.
apply equiv_dist.
(** FOOBAR -- This gives:
Error:
In environment
K : Type
EqDecision0 : EqDecision K
H : Countable K
A : ofeT
m1, m2 : gmap K A
Hm : ∀ n : nat, m1 ≡{n}≡ m2
k : K
Unable to unify
"(?M4301 ≡ ?M4302 → ∀ n : nat, ?M4301 ≡{n}≡ ?M4302)
∧ ((∀ n : nat, ?M4301 ≡{n}≡ ?M4302) → ?M4301 ≡ ?M4302)" with
"option_Forall2 equiv (m1 !! k) (m2 !! k)".
*)
(A:=optionC A).
apply H0.
apply equiv_dist. intros n; apply Hm.
- intros n; split.
+ by intros m k.
+ by intros m1 m2 ? k.
......
......@@ -33,40 +33,45 @@ Tactic Notation "cofe_subst" :=
| H:@dist ?A ?d ?n _ ?x |- _ => symmetry in H;setoid_subst_aux (@dist A d n) x
end.
Record OfeMixin A `{Equiv A, Dist A} := {
mixin_equiv_dist x y : x y n, x {n} y;
mixin_dist_equivalence n : Equivalence (dist n);
mixin_dist_S n x y : x {S n} y x {n} y
Record ofe_laws A `{Equiv A, Dist A} := {
law_equiv_dist x y : x y n, x {n} y;
law_dist_equivalence n : Equivalence (dist n);
law_dist_S n x y : x {S n} y x {n} y
}.
Record ofe_mixin A := OfeMixin {
ofe_mixin_equiv : Equiv A;
ofe_mixin_dist : Dist A;
ofe_mixin_laws_of : ofe_laws A;
}.
Arguments OfeMixin {_ _ _} _.
(** Bundeled version *)
Structure ofeT := OfeT' {
ofe_car :> Type;
ofe_equiv : Equiv ofe_car;
ofe_dist : Dist ofe_car;
ofe_mixin : OfeMixin ofe_car;
_ : Type
}.
Arguments OfeT' _ {_ _} _ _.
Structure ofeT := OfeT' { ofe_car :> Type; _ : ofe_mixin ofe_car; _ : Type }.
Notation OfeT A m := (OfeT' A m A).
Add Printing Constructor ofeT.
Hint Extern 0 (Equiv _) => eapply (@ofe_equiv _) : typeclass_instances.
Hint Extern 0 (Dist _) => eapply (@ofe_dist