diff --git a/algebra/cofe.v b/algebra/cofe.v index da126ca99a9fa35ba1b94cb84d083f44072c4a42..f3ab299c94438473d271cdbdb996679983e43950 100644 --- a/algebra/cofe.v +++ b/algebra/cofe.v @@ -450,6 +450,36 @@ Proof. by apply prodC_map_ne; apply cFunctor_contractive. Qed. +Instance compose_ne {A} {B B' : cofeT} (f : B -n> B') n : + Proper (dist n ==> dist n) (compose f : (A -c> B) → A -c> B'). +Proof. intros g g' Hf x; simpl. by rewrite (Hf x). Qed. + +Definition cofe_funC_map {A B B'} (f : B -n> B') : (A -c> B) -n> (A -c> B') := + @CofeMor (_ -c> _) (_ -c> _) (compose f) _. +Instance cofe_funC_map_ne {A B B'} n : + Proper (dist n ==> dist n) (@cofe_funC_map A B B'). +Proof. intros f f' Hf g x. apply Hf. Qed. + +Program Definition cofe_funCF (T : Type) (F : cFunctor) : cFunctor := {| + cFunctor_car A B := cofe_funC T (cFunctor_car F A B); + cFunctor_map A1 A2 B1 B2 fg := cofe_funC_map (cFunctor_map F fg) +|}. +Next Obligation. + intros ?? A1 A2 B1 B2 n ???; by apply cofe_funC_map_ne; apply cFunctor_ne. +Qed. +Next Obligation. intros F1 F2 A B ??. by rewrite /= /compose /= !cFunctor_id. Qed. +Next Obligation. + intros T F A1 A2 A3 B1 B2 B3 f g f' g' ??; simpl. + by rewrite !cFunctor_compose. +Qed. + +Instance cofe_funCF_contractive (T : Type) (F : cFunctor) : + cFunctorContractive F → cFunctorContractive (cofe_funCF T F). +Proof. + intros ?? A1 A2 B1 B2 n ???; + by apply cofe_funC_map_ne; apply cFunctor_contractive. +Qed. + Program Definition cofe_morCF (F1 F2 : cFunctor) : cFunctor := {| cFunctor_car A B := cFunctor_car F1 B A -n> cFunctor_car F2 A B; cFunctor_map A1 A2 B1 B2 fg := @@ -759,6 +789,7 @@ Qed. (** Notation for writing functors *) Notation "∙" := idCF : cFunctor_scope. +Notation "T -c> F" := (cofe_funCF T%type F%CF) : cFunctor_scope. Notation "F1 -n> F2" := (cofe_morCF F1%CF F2%CF) : cFunctor_scope. Notation "F1 * F2" := (prodCF F1%CF F2%CF) : cFunctor_scope. Notation "F1 + F2" := (sumCF F1%CF F2%CF) : cFunctor_scope.