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
  Classes.Categorical.DecoratedMonad
  Classes.Kleisli.DecoratedMonad
  CategoricalToKleisli.DecoratedFunctor (cobind_dec).

#[local] Generalizable Variables W T.

Import Monoid.Notations.
Import Product.Notations.
Import Kleisli.DecoratedMonad.Notations.

(** * Categorical Decorated Monad to Kleisli Decorated Monad *)
(**********************************************************************)

(** ** Derived <<bindd>> Operation *)
(**********************************************************************)
Module DerivedOperations.

  #[export] Instance Bindd_Categorical
    (W: Type)
    (T: Type -> Type)
    `{Map_T: Map T}
    `{Join_T: Join T}
    `{Decorate_WT: Decorate W T}: Bindd W T T :=
  fun A B f => join (T := T) ∘ map (F := T) f ∘ dec T.

End DerivedOperations.

(** ** Derived Laws *)
(**********************************************************************)
Module DerivedInstances.

  (* Alectryon doesn't like this
     Import CategoricalToKleisli.DecoratedMonad.DerivedOperations.
   *)
  Import DerivedOperations.

  #[local] Generalizable Variables A B C.

  Section with_monad.

    Context
      (T: Type -> Type)
      `{Categorical.DecoratedMonad.DecoratedMonad W T}.

    (** *** Identity law *)
    (******************************************************************)
    
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T

forall A : Type, bindd (ret ∘ extract) = id
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T

forall A : Type, bindd (ret ∘ extract) = id
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A: Type

bindd (ret ∘ extract) = id
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A: Type

join ∘ map (ret ∘ extract) ∘ dec T = id
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A: Type

join ∘ (map ret ∘ map extract) ∘ dec T = id
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A: Type

join ∘ map ret ∘ map extract ∘ dec T = id
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A: Type

id ∘ map extract ∘ dec T = id
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A: Type

id ∘ (map extract ∘ dec T) = id
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A: Type

id ∘ id = id
reflexivity. Qed. (** *** Composition law *) (******************************************************************)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T

forall (A B C : Type) (g : W * B -> T C) (f : W * A -> T B), bindd g ∘ bindd f = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T

forall (A B C : Type) (g : W * B -> T C) (f : W * A -> T B), bindd g ∘ bindd f = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

bindd g ∘ bindd f = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map g ∘ dec T ∘ (join ∘ map f ∘ dec T) = bindd (g ⋆5 f)
(* change (join T ∘ map T ?f) with (bind T f).*)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map g ∘ dec T ∘ join ∘ map f ∘ dec T = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map g ∘ (dec T ∘ join) ∘ map f ∘ dec T = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map g ∘ (join ∘ map (shift T) ∘ dec T ∘ map (dec T)) ∘ map f ∘ dec T = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map g ∘ join ∘ map (shift T) ∘ dec T ∘ map (dec T) ∘ map f ∘ dec T = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map g ∘ join ∘ map (shift T) ∘ dec T ∘ (map (dec T) ∘ map f) ∘ dec T = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map g ∘ join ∘ map (shift T) ∘ dec T ∘ map (dec T ∘ f) ∘ dec T = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map g ∘ join ∘ map (shift T) ∘ (dec T ∘ map (dec T ∘ f) ∘ dec T) = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map g ∘ join ∘ map (shift T) ∘ (map (cobind (dec T ∘ f)) ∘ dec T) = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map g ∘ join ∘ map (shift T) ∘ map (cobind (dec T ∘ f)) ∘ dec T = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map g ∘ join ∘ (map (shift T) ∘ map (cobind (dec T ∘ f))) ∘ dec T = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map g ∘ join ∘ map (shift T ∘ cobind (dec T ∘ f)) ∘ dec T = bindd (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map g ∘ join ∘ map (shift T ∘ cobind (dec T ∘ f)) ∘ dec T = join ∘ map (g ⋆5 f) ∘ dec T
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ (map g ∘ join ∘ map (shift T ∘ cobind (dec T ∘ f))) ∘ dec T = join ∘ map (g ⋆5 f) ∘ dec T
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ (map g ∘ join ∘ map (shift T ∘ cobind (dec T ∘ f))) = join ∘ map (g ⋆5 f)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ (map g ∘ join ∘ map (shift T ∘ cobind (dec T ∘ f))) = join ∘ map (fun '(w, a) => (join ∘ map (g ∘ incr w) ∘ dec T) (f (w, a)))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ (join ∘ map g ∘ map (shift T ∘ cobind (dec T ∘ f))) = join ∘ map (fun '(w, a) => (join ∘ map (g ∘ incr w) ∘ dec T) (f (w, a)))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ (join ∘ (map g ∘ map (shift T ∘ cobind (dec T ∘ f)))) = join ∘ map (fun '(w, a) => (join ∘ map (g ∘ incr w) ∘ dec T) (f (w, a)))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ (join ∘ (map (map g) ∘ map (shift T ∘ cobind (dec T ∘ f)))) = join ∘ map (fun '(w, a) => (join ∘ map (g ∘ incr w) ∘ dec T) (f (w, a)))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ (join ∘ (map (map g) ∘ map (shift T ∘ cobind (dec T ∘ f)))) = join ∘ map (fun '(w, a) => (join ∘ map (g ∘ incr w) ∘ dec T) (f (w, a)))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ (join ∘ map (map g ∘ (shift T ∘ cobind (dec T ∘ f)))) = join ∘ map (fun '(w, a) => (join ∘ map (g ∘ incr w) ∘ dec T) (f (w, a)))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ (join ∘ map (map g ∘ (shift T ∘ cobind (dec T ∘ f)))) = join ∘ map (join ∘ (fun '(w, a) => (map (g ∘ incr w) ∘ dec T) (f (w, a))))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ join ∘ map (map g ∘ (shift T ∘ cobind (dec T ∘ f))) = join ∘ map (join ∘ (fun '(w, a) => (map (g ∘ incr w) ∘ dec T) (f (w, a))))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ join ∘ map (map g ∘ (shift T ∘ cobind (dec T ∘ f))) = join ∘ map (join ∘ (fun '(w, a) => (map (g ∘ incr w) ∘ dec T) (f (w, a))))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map join ∘ map (map g ∘ (shift T ∘ cobind (dec T ∘ f))) = join ∘ map (join ∘ (fun '(w, a) => (map (g ∘ incr w) ∘ dec T) (f (w, a))))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ map join ∘ map (map g ∘ (shift T ∘ cobind (dec T ∘ f))) = join ∘ map (join ∘ (fun '(w, a) => (map (g ∘ incr w) ∘ dec T) (f (w, a))))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ (map join ∘ map (map g ∘ (shift T ∘ cobind (dec T ∘ f)))) = join ∘ map (join ∘ (fun '(w, a) => (map (g ∘ incr w) ∘ dec T) (f (w, a))))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

map join ∘ map (map g ∘ (shift T ∘ cobind (dec T ∘ f))) = map (join ∘ (fun '(w, a) => (map (g ∘ incr w) ∘ dec T) (f (w, a))))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

map join ∘ map (map g ∘ (shift T ∘ cobind (dec T ∘ f))) = map (join ∘ (fun '(w, a) => (map (g ∘ incr w) ∘ dec T) (f (w, a))))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

map (join ∘ (map g ∘ (shift T ∘ cobind (dec T ∘ f)))) = map (join ∘ (fun '(w, a) => (map (g ∘ incr w) ∘ dec T) (f (w, a))))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

join ∘ (map g ∘ (shift T ∘ cobind (dec T ∘ f))) = join ∘ (fun '(w, a) => (map (g ∘ incr w) ∘ dec T) (f (w, a)))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B

map g ∘ (shift T ∘ cobind (dec T ∘ f)) = (fun '(w, a) => (map (g ∘ incr w) ∘ dec T) (f (w, a)))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B
w: W
a: A

(map g ∘ (shift T ∘ cobind (dec T ∘ f))) (w, a) = (map (g ∘ incr w) ∘ dec T) (f (w, a))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B
w: W
a: A

map g (map (uncurry incr) (map (pair w) (dec T (f (w, a))))) = map (g ○ incr w) (dec T (f (w, a)))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B
w: W
a: A

map g ((map (uncurry incr) ∘ map (pair w)) (dec T (f (w, a)))) = map (g ○ incr w) (dec T (f (w, a)))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B
w: W
a: A

map g (map (uncurry incr ∘ pair w) (dec T (f (w, a)))) = map (g ○ incr w) (dec T (f (w, a)))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B
w: W
a: A

(map g ∘ map (uncurry incr ∘ pair w)) (dec T (f (w, a))) = map (g ○ incr w) (dec T (f (w, a)))
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B, C: Type
g: W * B -> T C
f: W * A -> T B
w: W
a: A

map (g ∘ (uncurry incr ∘ pair w)) (dec T (f (w, a))) = map (g ○ incr w) (dec T (f (w, a)))
reflexivity. Qed. (** *** Unit law *) (******************************************************************)
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B: Type
f: W * A -> T B

bindd f ∘ ret = f ∘ pair Ƶ
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B: Type
f: W * A -> T B

bindd f ∘ ret = f ∘ pair Ƶ
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B: Type
f: W * A -> T B

bindd f ∘ ret = f ∘ pair Ƶ
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B: Type
f: W * A -> T B

join ∘ map f ∘ dec T ∘ ret = f ∘ pair Ƶ
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B: Type
f: W * A -> T B

join ∘ map f ∘ (dec T ∘ ret) = f ∘ pair Ƶ
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B: Type
f: W * A -> T B

join ∘ map f ∘ (ret ∘ pair Ƶ) = f ∘ pair Ƶ
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B: Type
f: W * A -> T B

join ∘ map f ∘ ret ∘ pair Ƶ = f ∘ pair Ƶ
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B: Type
f: W * A -> T B

join ∘ (map f ∘ ret) ∘ pair Ƶ = f ∘ pair Ƶ
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B: Type
f: W * A -> T B

join ∘ (ret ∘ map f) ∘ pair Ƶ = f ∘ pair Ƶ
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B: Type
f: W * A -> T B

join ∘ ret ∘ map f ∘ pair Ƶ = f ∘ pair Ƶ
T: Type -> Type
W: Type
H: Map T
H0: Return T
H1: Join T
H2: Decorate W T
H3: Monoid_op W
H4: Monoid_unit W
H5: Categorical.DecoratedMonad.DecoratedMonad W T
A, B: Type
f: W * A -> T B

id ∘ map f ∘ pair Ƶ = f ∘ pair Ƶ
reflexivity. Qed. (** ** Typeclass Instances *) (**************************************************************** **) #[export] Instance: Kleisli.DecoratedMonad.DecoratedRightPreModule W T T := {| kdmod_bindd1 := @bindd_id; kdmod_bindd2 := @bindd_bindd; |}. #[export] Instance: Kleisli.DecoratedMonad.DecoratedMonad W T := {| kdm_bindd0 := @bindd_comp_ret; kdm_monoid := dmon_monoid; |}. End with_monad. End DerivedInstances.