Commit 5226baf6 by Robbert Krebbers

### FAIL : Less canonical projections.

parent c305d664
 ... @@ -464,6 +464,7 @@ Class RA A `{Equiv A, Unit A, Op A, Valid A, Minus A} := { ... @@ -464,6 +464,7 @@ Class RA A `{Equiv A, Unit A, Op A, Valid A, Minus A} := { ra_op_minus x y : x ≼ y → x ⋅ y ⩪ x ≡ y ra_op_minus x y : x ≼ y → x ⋅ y ⩪ x ≡ y }. }. (* Section discrete. Section discrete. Context {A : cofeT} `{∀ x : A, Timeless x}. Context {A : cofeT} `{∀ x : A, Timeless x}. Context {v : Valid A} `{Unit A, Op A, Minus A} (ra : RA A). Context {v : Valid A} `{Unit A, Op A, Minus A} (ra : RA A). ... @@ -480,7 +481,7 @@ Section discrete. ... @@ -480,7 +481,7 @@ Section discrete. apply (timeless _), dist_le with n; auto with lia. apply (timeless _), dist_le with n; auto with lia. Qed. Qed. Definition discreteRA : cmraT := Definition discreteRA : cmraT := CMRAT (cofe_mixin A) discrete_cmra_mixin discrete_extend_mixin. CMRAT (let 'CofeT _ _ _ _ m := A in m) discrete_cmra_mixin discrete_extend_mixin. Lemma discrete_updateP (x : discreteRA) (P : A → Prop) : Lemma discrete_updateP (x : discreteRA) (P : A → Prop) : (∀ z, ✓ (x ⋅ z) → ∃ y, P y ∧ ✓ (y ⋅ z)) → x ~~>: P. (∀ z, ✓ (x ⋅ z) → ∃ y, P y ∧ ✓ (y ⋅ z)) → x ~~>: P. Proof. intros Hvalid n z; apply Hvalid. Qed. Proof. intros Hvalid n z; apply Hvalid. Qed. ... @@ -505,6 +506,7 @@ Section unit. ... @@ -505,6 +506,7 @@ Section unit. Global Instance unit_cmra_identity : CMRAIdentity unitRA. Global Instance unit_cmra_identity : CMRAIdentity unitRA. Proof. by split; intros []. Qed. Proof. by split; intros []. Qed. End unit. End unit. *) (** ** Product *) (** ** Product *) Section prod. Section prod. ... ...
 ... @@ -62,32 +62,33 @@ Class Contractive `{Dist A, Dist B} (f : A -> B) := ... @@ -62,32 +62,33 @@ Class Contractive `{Dist A, Dist B} (f : A -> B) := (** Bundeled version *) (** Bundeled version *) Structure cofeT := CofeT { Structure cofeT := CofeT { cofe_car :> Type; cofe_car :> Type; cofe_equiv : Equiv cofe_car; _ : Equiv cofe_car; cofe_dist : Dist cofe_car; _ : Dist cofe_car; cofe_compl : Compl cofe_car; _ : Compl cofe_car; cofe_mixin : CofeMixin cofe_car _ : CofeMixin cofe_car }. }. Arguments CofeT {_ _ _ _} _. Arguments CofeT {_ _ _ _} _. Add Printing Constructor cofeT. Add Printing Constructor cofeT. Existing Instances cofe_equiv cofe_dist cofe_compl. Instance cofe_equiv (A : cofeT) : Equiv A := let 'CofeT _ e _ _ _ := A in e. Instance cofe_dist (A : cofeT) : Dist A := let 'CofeT _ _ d _ _ := A in d. Instance cofe_compl (A : cofeT) : Compl A := let 'CofeT _ _ _ c _ := A in c. Arguments cofe_car : simpl never. Arguments cofe_car : simpl never. Arguments cofe_equiv : simpl never. Arguments cofe_equiv : simpl never. Arguments cofe_dist : simpl never. Arguments cofe_dist : simpl never. Arguments cofe_compl : simpl never. Arguments cofe_compl : simpl never. Arguments cofe_mixin : simpl never. (** Lifting properties from the mixin *) (** Lifting properties from the mixin *) Section cofe_mixin. Section cofe_mixin. Context {A : cofeT}. Context {A : cofeT}. Implicit Types x y : A. Implicit Types x y : A. Lemma equiv_dist x y : x ≡ y ↔ ∀ n, x ≡{n}≡ y. Lemma equiv_dist x y : x ≡ y ↔ ∀ n, x ≡{n}≡ y. Proof. apply (mixin_equiv_dist _ (cofe_mixin A)). Qed. Proof. by destruct A as [???? []]. Qed. Global Instance dist_equivalence n : Equivalence (@dist A _ n). Global Instance dist_equivalence n : Equivalence (@dist A _ n). Proof. apply (mixin_dist_equivalence _ (cofe_mixin A)). Qed. Proof. by destruct A as [???? []]. Qed. Lemma dist_S n x y : x ≡{S n}≡ y → x ≡{n}≡ y. Lemma dist_S n x y : x ≡{S n}≡ y → x ≡{n}≡ y. Proof. apply (mixin_dist_S _ (cofe_mixin A)). Qed. Proof. destruct A as [???? []]; auto. Qed. Lemma conv_compl n (c : chain A) : compl c ≡{n}≡ c (S n). Lemma conv_compl n (c : chain A) : compl c ≡{n}≡ c (S n). Proof. apply (mixin_conv_compl _ (cofe_mixin A)). Qed. Proof. destruct A as [???? []]; auto. Qed. End cofe_mixin. End cofe_mixin. (** General properties *) (** General properties *) ... ...
 ... @@ -18,7 +18,49 @@ Proof. ... @@ -18,7 +18,49 @@ Proof. split. split. - intros m1 m2; split. - intros m1 m2; split. + by intros Hm n k; apply equiv_dist. + by intros Hm n k; apply equiv_dist. + intros Hm k; apply equiv_dist; intros n; apply Hm. + intros Hm k. (** Goal is @equiv (option (cofe_car A)) (@option_equiv (cofe_car A) (cofe_equiv A)) (@lookup K (cofe_car A) (@gmap K H H0 (cofe_car A)) (@gmap_lookup K H H0 (cofe_car A)) k m1) (@lookup K (cofe_car A) (@gmap K H H0 (cofe_car A)) (@gmap_lookup K H H0 (cofe_car A)) k m2) *) (** LHS of equiv_dist is: @equiv (cofe_car B) (cofe_equiv B) x y for some [B : cofeT]. *) Fail apply equiv_dist. (* Works: apply @equiv_dist. *) (* Note that equiv_dist is an iff, so [apply:] needs some help. But it works. apply: (fun {A} x y => proj2 (@equiv_dist A x y)). *) (* I do not think it is just about the type of the projection of the [equiv] operational typeclass being in the way. The following also fails. *) change (option (cofe_car A)) with (cofe_car (optionC A)). Fail apply equiv_dist. change (@option_equiv (cofe_car A) (cofe_equiv A)) with (@cofe_equiv (optionC A)). (* Only now it works *) apply equiv_dist. intros n; apply Hm. - intros n; split. - intros n; split. + by intros m k. + by intros m k. + by intros m1 m2 ? k. + by intros m1 m2 ? k. ... ...
 ... @@ -876,12 +876,14 @@ Lemma later_equivI {A : cofeT} (x y : later A) : ... @@ -876,12 +876,14 @@ Lemma later_equivI {A : cofeT} (x y : later A) : (x ≡ y)%I ≡ (▷ (later_car x ≡ later_car y) : uPred M)%I. (x ≡ y)%I ≡ (▷ (later_car x ≡ later_car y) : uPred M)%I. Proof. done. Qed. Proof. done. Qed. (* (* Discrete *) (* Discrete *) (* For equality, there already is timeless_eq *) (* For equality, there already is timeless_eq *) Lemma discrete_validI {A : cofeT} `{∀ x : A, Timeless x} Lemma discrete_validI {A : cofeT} `{∀ x : A, Timeless x} `{Op A, Valid A, Unit A, Minus A} (ra : RA A) (x : discreteRA ra) : `{Op A, Valid A, Unit A, Minus A} (ra : RA A) (x : discreteRA ra) : (✓ x)%I ≡ (■ ✓ x : uPred M)%I. (✓ x)%I ≡ (■ ✓ x : uPred M)%I. Proof. done. Qed. Proof. done. Qed. *) (* Timeless *) (* Timeless *) Lemma timelessP_spec P : TimelessP P ↔ ∀ n x, ✓{n} x → P 0 x → P n x. Lemma timelessP_spec P : TimelessP P ↔ ∀ n x, ✓{n} x → P 0 x → P n x. ... ...
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!