Built with Alectryon, running Coq+SerAPI v8.16.0+0.16.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.

This files defines typeclasses for comonoids in the category of Coq types and functions

Just like in the category of sets, where

Every set can be made into a comonoid in Set (with the cartesian product) in a unique way.

comonoids in Coq's category are not particularly varied: there is one comonoid on each type.

From Tealeaves Require Import
  Prelude
  Misc.Product.

#[local] Generalizable Variables a.

(** * Comonoids *)
(**********************************************************************)

(** ** Operational Typeclasses *)
(**********************************************************************)

Class Comonoid_Counit A := comonoid_counit: A -> unit.

Class Comonoid_Comult A := comonoid_comult: A -> A * A.

Arguments comonoid_comult {A}%type_scope {Comonoid_Comult}.

Arguments comonoid_counit A%type_scope {Comonoid_Counit}.

(** ** Typeclass *)
(**********************************************************************)
Class Comonoid (A: Type)
  `{Comonoid_Comult A}
  `{Comonoid_Counit A} :=
  { comonoid_assoc:
    `(associator (map_fst comonoid_comult (comonoid_comult a)) =
        map_snd comonoid_comult (comonoid_comult a));
    comonoid_id_l:
    `(fst (comonoid_comult a) = a);
    comonoid_id_r:
    `(snd (comonoid_comult a) = a);
  }.

(** * The "Duplicate" Comonoid *)
(**********************************************************************)

(** Everything is a [Comonoid]. In fact, the copy comonoid is the only
    one, and the comonoid laws are proved by reflexivity. *)
Definition dup {A: Type} := fun a: A => (a, a).

#[export] Instance Comonoid_Counit_dup A:
  Comonoid_Counit A := fun _ => tt.

#[export] Instance Comonoid_Comult_dup A:
  Comonoid_Comult A := @dup A.

#[export, program] Instance Comonoid_dup {A}:
  @Comonoid A (Comonoid_Comult_dup A)
    (Comonoid_Counit_dup A).