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
Classes.Kleisli.Comonad.Import DecoratedMonad.Notations.Import Product.Notations.Import Monoid.Notations.Import Functor.Notations.Import Comonad.Notations.#[local] Notation"( X × )" := (prod X): function_scope.#[local] Generalizable VariablesT A B C.(** * Categorical Decorated monads from Kleisli Decorated Monads *)(**********************************************************************)(** ** Operations *)(**********************************************************************)ModuleDerivedOperations.Sectionoperations.Context
(W: Type)
(T: Type -> Type)
`{Return_T: Return T}
`{Bindd_WTT: Bindd W T T}.(* #[export] Instance Map_Bindd: Map T := fun A B f => bindd (ret ∘ f ∘ extract). *)#[export] InstanceJoin_Bindd: Join T :=
funA => bindd (B := A) (A := T A) (extract (W := (W ×))).#[export] InstanceDecorate_Bindd: Decorate W T :=
funA => bindd (ret (A := W * A)).Endoperations.EndDerivedOperations.(** ** Derived Laws *)(**********************************************************************)ModuleDerivedInstances.Sectionwith_monad.Context
(W: Type)
(T: Type -> Type)
`{Kleisli.DecoratedMonad.DecoratedMonad W T}.Import Kleisli.DecoratedMonad.DerivedOperations.(* Alectryon doesn't like this Import KleisliToCategorical.DecoratedMonad.DerivedOperations. *)Import DerivedOperations.(** *** Functor Laws *)(******************************************************************)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forallA : Type, map id = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forallA : Type, map id = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
map id = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd (ret ∘ id ∘ extract) = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd (ret ∘ extract) = id
nowrewrite (kdmod_bindd1 (T := T)).Qed.
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forall (ABC : Type) (f : A -> B) (g : B -> C),
map g ∘ map f = map (g ∘ f)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forall (ABC : Type) (f : A -> B) (g : B -> C),
map g ∘ map f = map (g ∘ f)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B, C: Type f: A -> B g: B -> C
map g ∘ map f = map (g ∘ f)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B, C: Type f: A -> B g: B -> C
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B, C: Type f: A -> B g: B -> C
bindd (ret ∘ g ∘ extract ⋆5 ret ∘ f ∘ extract) =
bindd (ret ∘ (g ∘ f) ∘ extract)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B, C: Type f: A -> B g: B -> C
bindd (ret ∘ g ∘ f ∘ extract) =
bindd (ret ∘ (g ∘ f) ∘ extract)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Natural (@ret T Return_T)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Natural (@ret T Return_T)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Functor (funA : Type => A)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Functor T
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forall (AB : Type) (f : A -> B),
map f ∘ ret = ret ∘ map f
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Functor (funA : Type => A)
typeclasses eauto.
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Functor T
typeclasses eauto.
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forall (AB : Type) (f : A -> B),
map f ∘ ret = ret ∘ map f
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
map f ∘ ret = ret ∘ map f
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
bindd (ret ∘ f ∘ extract) ∘ ret = ret ∘ map f
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
ret ∘ f ∘ extract ∘ ret = ret ∘ map f
reflexivity.Qed.
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Natural (@join T (Join_Bindd W T))
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Natural (@join T (Join_Bindd W T))
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Functor (T ∘ T)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Functor T
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forall (AB : Type) (f : A -> B),
map f ∘ join = join ∘ map f
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Functor (T ∘ T)
typeclasses eauto.
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Functor T
typeclasses eauto.
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forall (AB : Type) (f : A -> B),
map f ∘ join = join ∘ map f
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
map f ∘ join = join ∘ map f
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
map f ∘ join = join ∘ map (map f)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
bindd (ret ∘ f ∘ extract ⋆5 extract) =
bindd
(extract
⋆5 ret ∘ bindd (ret ∘ f ∘ extract) ∘ extract)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
bindd (map f ∘ extract) =
bindd
(extract
⋆5 ret ∘ bindd (ret ∘ f ∘ extract) ∘ extract)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
bindd (map f ∘ extract) =
bindd (extract ∘ map (bindd (ret ∘ f ∘ extract)))
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
bindd (map f ∘ extract) =
bindd
(extract
∘ cobind (bindd (ret ∘ f ∘ extract) ∘ extract))
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
bindd (map f ∘ extract) =
bindd (bindd (ret ∘ f ∘ extract) ∘ extract)
reflexivity.Qed.
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forallA : Type, join ∘ ret = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forallA : Type, join ∘ ret = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
join ∘ ret = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd extract ∘ ret = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd extract ∘ ret = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
extract ∘ ret = id
reflexivity.Qed.
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forallA : Type, join ∘ map ret = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forallA : Type, join ∘ map ret = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
join ∘ map ret = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
join ∘ bindd (ret ∘ ret ∘ extract) = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd extract ∘ bindd (ret ∘ ret ∘ extract) = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd extract ∘ bindd (ret ∘ ret ∘ extract) = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd (extract ⋆5 ret ∘ ret ∘ extract) = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd (extract ∘ map ret) = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd (extract ∘ cobind (ret ∘ extract)) = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd (ret ∘ extract) = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
id = id
reflexivity.Qed.
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forallA : Type, join ∘ join = join ∘ map join
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forallA : Type, join ∘ join = join ∘ map join
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
join ∘ join = join ∘ map join
(* Merge LHS *)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
(fun '(w, a) => bindd (extract ⦿ w) a) =
bindd extract ∘ extract
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T (T A)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T (T A)
bindd extract t = (bindd extract ∘ extract) (w, t)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
ret ⋆5 ret = ret ∘ cojoin ∘ extract ⋆5 ret
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
ret ⋆5 ret = map cojoin ∘ ret
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
ret ⋆5 ret ∘ id = map cojoin ∘ ret
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
ret ⋆1 id = map cojoin ∘ ret
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
ret ∘ cobind id = map cojoin ∘ ret
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
ret ∘ cobind id = ret ∘ map cojoin
reflexivity.Qed.
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forallA : Type, map extract ∘ dec T = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forallA : Type, map extract ∘ dec T = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
map extract ∘ dec T = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
map extract ∘ bindd ret = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd (ret ∘ extract ∘ extract) ∘ bindd ret = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd (ret ∘ extract ∘ extract ⋆5 ret) = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd (ret ∘ extract ∘ extract ⋆5 ret ∘ id) = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd (map extract ∘ (ret ∘ id)) = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd (map extract ∘ ret) = id
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type
bindd (ret ∘ map extract) = id
apply (kdmod_bindd1 (T := T)).Qed.
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Natural (@dec W T (Decorate_Bindd W T))
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Natural (@dec W T (Decorate_Bindd W T))
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Functor T
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Functor (T ○ (W × ))
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forall (AB : Type) (f : A -> B),
map f ∘ dec T = dec T ∘ map f
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Functor T
typeclasses eauto.
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
Functor (T ○ (W × ))
typeclasses eauto.
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T
forall (AB : Type) (f : A -> B),
map f ∘ dec T = dec T ∘ map f
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
map f ∘ dec T = dec T ∘ map f
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
map (map f) ∘ dec T = dec T ∘ map f
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
bindd (ret ∘ map f ∘ extract) ∘ dec T =
dec T ∘ bindd (ret ∘ f ∘ extract)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
bindd (ret ∘ map f ∘ extract) ∘ bindd ret =
bindd ret ∘ bindd (ret ∘ f ∘ extract)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
bindd (ret ∘ map f ∘ extract ⋆5 ret) =
bindd ret ∘ bindd (ret ∘ f ∘ extract)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
bindd (ret ∘ map f ∘ extract ⋆5 ret) =
bindd (ret ⋆5 ret ∘ f ∘ extract)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
ret ∘ map f ∘ extract ⋆5 ret =
ret ⋆5 ret ∘ f ∘ extract
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
map (map f) ∘ ret = ret ⋆5 ret ∘ f ∘ extract
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
map (map f) ∘ ret = ret ∘ map f
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A, B: Type f: A -> B
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A
bindd (ret ⦿ w) t =
bindd
(funa : (W × ) ((W × ) ((W × ) A)) =>
ret (uncurry incr (extract a)))
(bindd
(funa : (W × ) ((W × ) A) =>
ret (id w, extract a)) (bindd ret t))
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A
bindd (ret ⦿ w) t =
bindd
(funa : (W × ) ((W × ) ((W × ) A)) =>
ret (uncurry incr (extract a)))
((bindd
(funa : (W × ) ((W × ) A) =>
ret (id w, extract a)) ∘ bindd ret) t)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A
bindd (ret ⦿ w) t =
bindd
(funa : (W × ) ((W × ) ((W × ) A)) =>
ret (uncurry incr (extract a)))
(bindd
((funa : (W × ) ((W × ) A) =>
ret (id w, extract a)) ⋆5 ret) t)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A
bindd ((ret ∘ id) ⦿ w) t =
bindd
(funa : (W × ) ((W × ) ((W × ) A)) =>
(ret ∘ id) (uncurry incr (extract a)))
(bindd
((funa : (W × ) ((W × ) A) =>
ret (id w, extract a)) ⋆5 ret ∘ id) t)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A
bindd ((ret ∘ id) ⦿ w) t =
bindd
(funa : (W × ) ((W × ) ((W × ) A)) =>
(ret ∘ id) (uncurry incr (extract a)))
(bindd
((funa : (W × ) ((W × ) A) =>
ret (id w, extract a)) ⋆1 id) t)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A
bindd ((ret ∘ id) ⦿ w) t =
(bindd
(funa : (W × ) ((W × ) ((W × ) A)) =>
(ret ∘ id) (uncurry incr (extract a)))
∘ bindd
((funa : (W × ) ((W × ) A) =>
ret (id w, extract a)) ⋆1 id)) t
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A
bindd ((ret ∘ id) ⦿ w) t =
bindd
((funa : (W × ) ((W × ) ((W × ) A)) =>
(ret ∘ id) (uncurry incr (extract a)))
⋆5 ((funa : (W × ) ((W × ) A) =>
ret (id w, extract a)) ⋆1 id)) t
(* Now compare inner functions again *)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A
(ret ∘ id) ⦿ w =
(funa : (W × ) ((W × ) ((W × ) A)) =>
(ret ∘ id) (uncurry incr (extract a)))
⋆5 ((funa : (W × ) ((W × ) A) =>
ret (id w, extract a)) ⋆1 id)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A w': W a: A
((ret ∘ id) ⦿ w) (w', a) =
((funa : (W × ) ((W × ) ((W × ) A)) =>
(ret ∘ id) (uncurry incr (extract a)))
⋆5 ((funa : (W × ) ((W × ) A) =>
ret (id w, extract a)) ⋆1 id)) (w', a)
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A w': W a: A
ret (w ● w', a) =
bindd
((funa : (W × ) ((W × ) ((W × ) A)) =>
ret (id (uncurry incr (extract a)))) ⦿ w')
(((funa : (W × ) ((W × ) A) =>
ret (id w, extract a)) ⋆1 id) (w', a))
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A w': W a: A
ret (w ● w', a) =
bindd
((funa : (W × ) ((W × ) ((W × ) A)) =>
ret (id (uncurry incr (extract a)))) ⦿ w')
(((funa : (W × ) ((W × ) A) =>
ret (id w, extract a))
∘ (fun '(e, a) => (e, id (e, a)))) (w', a))
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A w': W a: A
ret (w ● w', a) =
bindd
((funa : (W × ) ((W × ) ((W × ) A)) =>
ret (id (uncurry incr (extract a)))) ⦿ w')
(ret (id w, id (w', a)))
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A w': W a: A
ret (w ● w', a) =
bindd
((funa : (W × ) ((W × ) ((W × ) A)) =>
ret (uncurry incr (extract a))) ⦿ w')
(ret (w, (w', a)))
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A w': W a: A
ret (w ● w', a) =
(bindd
((funa : (W × ) ((W × ) ((W × ) A)) =>
ret (uncurry incr (extract a))) ⦿ w') ∘ ret)
(w, (w', a))
W: Type T: Type -> Type Monoid_unit_W: Monoid_unit W Monoid_op_W: Monoid_op W Return_T: Return T Bindd_WTT: Bindd W T T H: DecoratedMonad W T A: Type w: W t: T A w': W a: A
ret (w ● w', a) =
((funa : (W × ) ((W × ) ((W × ) A)) =>
ret (uncurry incr (extract a))) ⦿ w' ∘ ret)
(w, (w', a))
reflexivity.Qed.#[local] Instance:
Categorical.DecoratedMonad.DecoratedMonad W T :=
{| dmon_ret := dmon_ret_;
dmon_join := dmon_join_;
|}.Endwith_monad.EndDerivedInstances.