From 327acdbd995d31e378c12c71dc8fce756e156b8e Mon Sep 17 00:00:00 2001 From: Ralf Jung <jung@mpi-sws.org> Date: Sun, 24 Apr 2016 11:39:18 +0200 Subject: [PATCH] define Earlier: kind of the 'opposite' of later --- algebra/cofe.v | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/algebra/cofe.v b/algebra/cofe.v index 301e03996..469e34a1e 100644 --- a/algebra/cofe.v +++ b/algebra/cofe.v @@ -464,13 +464,14 @@ Section later. match n with 0 => True | S n => later_car x ≡{n}≡ later_car y end. Program Definition later_chain (c : chain (later A)) : chain A := {| chain_car n := later_car (c (S n)) |}. - Next Obligation. intros c n i ?; apply (chain_cauchy c (S n)); lia. Qed. + Next Obligation. intros c n i ?. apply (chain_cauchy c (S n)); lia. Qed. Instance later_compl : Compl (later A) := λ c, Next (compl (later_chain c)). Definition later_cofe_mixin : CofeMixin (later A). Proof. split. - - intros x y; unfold equiv, later_equiv; rewrite !equiv_dist. - split. intros Hxy [|n]; [done|apply Hxy]. intros Hxy n; apply (Hxy (S n)). + - intros x y; unfold equiv, later_equiv; rewrite !equiv_dist. split. + + intros Hxy [|n]; [done|apply Hxy]. + + intros Hxy n; apply (Hxy (S n)). - intros [|n]; [by split|split]; unfold dist, later_dist. + by intros [x]. + by intros [x] [y]. @@ -529,6 +530,48 @@ Proof. apply laterC_map_contractive => i ?. by apply cFunctor_ne, Hfg. Qed. +(** Earlier *) +Inductive earlier (A : Type) : Type := Prev { earlier_car : A }. +Add Printing Constructor earlier. +Arguments Prev {_} _. +Arguments earlier_car {_} _. +Lemma earlier_eta {A} (x : earlier A) : Prev (earlier_car x) = x. +Proof. by destruct x. Qed. + +Section earlier. + Context {A : cofeT}. + Instance earlier_equiv : Equiv (earlier A) := + λ x y, earlier_car x ≡ earlier_car y. + Instance earlier_dist : Dist (earlier A) := + λ n x y, earlier_car x ≡{S n}≡ earlier_car y. + Program Definition earlier_chain (c : chain (earlier A)) : chain A := + {| chain_car n := earlier_car (c n) |}. + Next Obligation. intros c n i ?. by apply dist_S, (chain_cauchy c). Qed. + Instance earlier_compl : Compl (earlier A) := + λ c, Prev (compl (earlier_chain c)). + Definition earlier_cofe_mixin : CofeMixin (earlier A). + Proof. + split. + - intros x y; unfold equiv, earlier_equiv; rewrite !equiv_dist. split. + + intros Hxy n; apply dist_S, Hxy. + + intros Hxy [|n]; [apply dist_S, Hxy|apply Hxy]. + - intros n; split; unfold dist, earlier_dist. + + by intros [x]. + + by intros [x] [y]. + + by intros [x] [y] [z] ??; trans y. + - intros n [x] [y] ?; unfold dist, earlier_dist; by apply dist_S. + - intros n c. rewrite /compl /earlier_compl /dist /earlier_dist /=. + rewrite (conv_compl (S n) (earlier_chain c)). simpl. + apply (chain_cauchy c n). omega. + Qed. + Canonical Structure earlierC : cofeT := CofeT earlier_cofe_mixin. + Global Instance Earlier_inj n : Inj (dist (S n)) (dist n) (@Prev A). + Proof. by intros x y. Qed. +End earlier. + +Arguments earlierC : clear implicits. + + (** Notation for writing functors *) Notation "∙" := idCF : cFunctor_scope. Notation "F1 -n> F2" := (cofe_morCF F1%CF F2%CF) : cFunctor_scope. -- GitLab