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.
From Tealeaves Require Import
Misc.Product
Misc.Strength
Classes.Comonoid
Classes.Kleisli.Comonad
Classes.Categorical.Comonad.Export Misc.Product.Export Misc.Strength.Export Classes.Comonoid.Import Product.Notations.(** * Environment/Reader Comonad *)(**********************************************************************)(** ** Functor Instances *)(**********************************************************************)#[export] InstanceMap_reader (E: Type):
Map (E ×) := (funAB => map_snd).#[program, export] InstanceFunctor_reader (E: Type):
Functor (E ×).Solve All Obligations with (introv; now ext [? ?]).(** ** Categorical Comonad Instance *)(**********************************************************************)Sectionwith_E.Context
(E: Type).#[export] InstanceCojoin_reader: Cojoin (E ×) :=
@dup_left E.#[export] InstanceExtract_reader: Extract (E ×) :=
@snd E.
E: Type
Natural (@extract (prod E) Extract_reader)
E: Type
Natural (@extract (prod E) Extract_reader)
E: Type
forall (AB : Type) (f : A -> B),
map f ∘ extract = extract ∘ map f
E, A, B: Type f: A -> B
map f ∘ extract = extract ∘ map f
now ext [? ?].Qed.
E: Type
Natural (@cojoin (prod E) Cojoin_reader)
E: Type
Natural (@cojoin (prod E) Cojoin_reader)
E: Type
forall (AB : Type) (f : A -> B),
map f ∘ cojoin = cojoin ∘ map f
E, A, B: Type f: A -> B
map f ∘ cojoin = cojoin ∘ map f
now ext [? ?].Qed.#[export, program] InstanceComonad_reader: Comonad (E ×).Solve All Obligations with (introv; now ext [? ?]).Endwith_E.(** ** Kleisli Comonad Instance *)(**********************************************************************)Sectionwith_E.Context
(E: Type).(* #[export] Instance Extract_reader: Extract (E ×) := fun A '(e, a) => a. *)#[export] InstanceCobind_reader: Cobind (E ×) :=
funAB (f: E * A -> B) '(e, a) => (e, f (e, a)).#[export, program] InstanceKleisliComonad_reader:
Kleisli.Comonad.Comonad (E ×).Solve All Obligations with (introv; now ext [? ?]).(* #[export] Instance Map_reader: Map (E ×) := Comonad.Map_Cobind (E ×). #[export] Instance Functor_reader: Functor (E ×) := Comonad.Functor_Comonad (E ×). *)
E: Type
Compat_Map_Cobind (prod E)
E: Type
Compat_Map_Cobind (prod E)
reflexivity.Qed.Endwith_E.(** * Properties of <<strength>> *)(**********************************************************************)From Tealeaves Require Import
Classes.Categorical.Monad
Classes.Categorical.RightModule.(** ** Interaction with Categorical Monad Operations *)(**********************************************************************)SectionMonad_strength_laws.Context
(T : Type -> Type)
`{Categorical.Monad.Monad T}
(A B : Type).Import Strength.Notations.Import Monad.Notations.
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type
σ ∘ map (η) = η
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type
σ ∘ map (η) = η
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type
σ ∘ map (η) = η
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type a: A b: B
(σ ∘ map (η)) (a, b) = η (a, b)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type a: A b: B
map (pair (id a)) (η b) = η (a, b)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type a: A b: B
map (pair (id a)) (η b) = η (a, b)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type a: A b: B
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type a: A t: (T ∘ T) B
(μ ∘ map (pair a)) t =
μ (map ((fun '(a, t) => map (pair a) t) ∘ pair a) t)
reflexivity.Qed.Context
(F : Type -> Type)
`{Categorical.RightModule.RightModule F T}.
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: (F ∘ T) B
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: (F ∘ T) B
σ (a, right_action F t) =
(right_action F ∘ map (σ) ∘ σ) (a, t)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B)
map (pair a) (right_action F t) =
right_action F
(map (fun '(a, t) => map (pair a) t)
(map (pair a) t))
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B)
map (pair a) (right_action F t) =
right_action F
(map (fun '(a, t) => (a, t)) (map (pair a) t))
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
map (pair a) (right_action F t) =
right_action F
(map (fun '(a, t) => (a, t)) (map (pair a) t))
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
map (pair a) (right_action F t) =
right_action F
((map (fun '(a, t) => (a, t)) ∘ map (pair a)) t)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
map (pair a) (right_action F t) =
right_action F
((map (map (fun '(a, t) => (a, t)))
∘ map (map (pair a))) t)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
map (pair a) (right_action F t) =
right_action F
(map (map (fun '(a, t) => (a, t)) ∘ map (pair a)) t)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
map (pair a) (right_action F t) =
right_action F
(map (map (fun '(a, t) => (a, t)) ○ map (pair a)) t)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
map (pair a) (right_action F t) =
right_action F
(map (map (fun '(a, t) => (a, t)) ○ map (pair a)) t)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
(map (pair a) ∘ right_action F) t =
right_action F
(map (map (fun '(a, t) => (a, t)) ○ map (pair a)) t)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
(map (pair a) ∘ right_action F) t =
(right_action F
∘ map (map (fun '(a, t) => (a, t)) ○ map (pair a))) t
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
(map (pair a) ∘ right_action F) t =
(right_action F ∘ map (map id ○ map (pair a))) t
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
id = (fun '(a1, t0) => (a1, t0))
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
(map (pair a) ∘ right_action F) t =
(right_action F ∘ map (id ○ map (pair a))) t
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
id = (fun '(a1, t0) => (a1, t0))
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
(right_action F ∘ map (pair a)) t =
(right_action F ∘ map (id ○ map (pair a))) t
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
id = (fun '(a1, t0) => (a1, t0))
T: Type -> Type H: Map T H0: Return T H1: Join T H2: Monad T A, B: Type F: Type -> Type H3: Map T H4: Return T H5: Join T H6: Map F H7: RightAction F T H8: RightModule F T a: A t: F (T B) mod_object: Functor F mon_monoid: Monad T mod_natural: Natural (@right_action F T H7) mod_action_map_ret: forallA : Type,
right_action F ∘ map (η) = id mod_action_action: forallA : Type,
right_action F ∘ right_action F =
right_action F ∘ map (μ)
id = (fun '(a1, t0) => (a1, t0))
now ext [a' b'].Qed.EndMonad_strength_laws.(** ** Interaction with Reader Comonad Operations *)(**********************************************************************)SectionComonad_strength_laws.Context
(E: Type)
(F: Type -> Type).
E: Type F: Type -> Type Map_F: Map F H: Functor F A: Type
map extract ∘ strength = extract
E: Type F: Type -> Type Map_F: Map F H: Functor F A: Type
map extract ∘ strength = extract
E: Type F: Type -> Type Map_F: Map F H: Functor F A: Type
map extract ∘ strength = extract
E: Type F: Type -> Type Map_F: Map F H: Functor F A: Type
(funa : E * F A =>
map extract (let '(a0, t) := a in map (pair a0) t)) =
extract
E: Type F: Type -> Type Map_F: Map F H: Functor F A: Type w: E a: F A
map extract (map (pair w) a) = extract (w, a)
reflexivity.Qed.
E: Type F: Type -> Type Map_F: Map F H: Functor F A: Type
E: Type F: Type -> Type Map_F: Map F H: Functor F A: Type
(funa : E * F A =>
map cojoin (let '(a0, t) := a in map (pair a0) t)) =
(funa : E * F A =>
let
'(a0, t) :=
map (fun '(a0, t) => map (pair a0) t) (cojoin a) in
map (pair a0) t)
E: Type F: Type -> Type Map_F: Map F H: Functor F A: Type w: E a: F A
map cojoin (map (pair w) a) =
(let
'(a, t) :=
map (fun '(a, t) => map (pair a) t) (cojoin (w, a))
in map (pair a) t)
E: Type F: Type -> Type Map_F: Map F H: Functor F A: Type w: E a: F A
map cojoin (map (pair w) a) =
map (pair (id w)) (map (pair w) a)
E: Type F: Type -> Type Map_F: Map F H: Functor F A: Type w: E a: F A
(map cojoin ∘ map (pair w)) a =
(map (pair (id w)) ∘ map (pair w)) a
nowrewrite2(fun_map_map).Qed.
E: Type F, G: Type -> Type Map_F: Map G H: Functor G
forall (ABC : Type) (f : E * A -> G B)
(g : E * B -> C),
map g ∘ strength ∘ cobind f =
(fun '(e, a) => map (g ∘ pair e) (f (e, a)))
E: Type F, G: Type -> Type Map_F: Map G H: Functor G
forall (ABC : Type) (f : E * A -> G B)
(g : E * B -> C),
map g ∘ strength ∘ cobind f =
(fun '(e, a) => map (g ∘ pair e) (f (e, a)))
E: Type F, G: Type -> Type Map_F: Map G H: Functor G A, B, C: Type f: E * A -> G B g: E * B -> C
map g ∘ strength ∘ cobind f =
(fun '(e, a) => map (g ∘ pair e) (f (e, a)))
E: Type F, G: Type -> Type Map_F: Map G H: Functor G A, B, C: Type f: E * A -> G B g: E * B -> C w: E a: A
(map g ∘ strength ∘ cobind f) (w, a) =
map (g ∘ pair w) (f (w, a))
E: Type F, G: Type -> Type Map_F: Map G H: Functor G A, B, C: Type f: E * A -> G B g: E * B -> C w: E a: A