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 Export
  Categories.TypeFamily
  Classes.Monoid
  Classes.Functor
  Classes.Categorical.Applicative
  Classes.Multisorted.Multifunctor
  Functors.Writer.

Import Categorical.Monad (Return, ret).

Import TypeFamily.Notations.
Import Product.Notations.
Import Monoid.Notations.

#[local] Generalizable Variables A B C F G ϕ W T U.

(** * Multisorted DTMs *)
(**********************************************************************)
Section MultisortedDTM_typeclasses.

  Context
    `{ix: Index}.

  (** ** Operations *)
  (********************************************************************)
  Section operations.

    Context
      (W: Type)
      (T: K -> Type -> Type)
      (U: Type -> Type).

    Class MReturn :=
      mret: forall (A: Type) (k: K), A -> T k A.

    Class MBind :=
      mbinddt: forall (F: Type -> Type) `{Map F} `{Pure F} `{Mult F} {A B: Type},
          (forall (k: K), W * A -> F (T k B)) -> U A -> F (U B).

  End operations.

  (** ** Kleisli Composition *)
  (********************************************************************)
  Definition compose_dtm
    {W: Type}
    {T: K -> Type -> Type}
    `{mn_op: Monoid_op W}
    `{mn_unit: Monoid_unit W}
    `{Map F} `{Mult F} `{Pure F}
    `{Map G} `{Mult G} `{Pure G}
    `{forall k, MBind W T (T k)}
    {A B C: Type}
    (g: forall k, W * B -> G (T k C))
    (f: forall k, W * A -> F (T k B)): forall k, W * A -> F (G (T k C)) :=
    fun (k: K) '(w, a) =>
      map (F := F)
        (mbinddt W T (T k) G (g ◻ allK (incr w))) (f k (w, a)).

  Infix "⋆dtm" := compose_dtm (at level 40): tealeaves_scope.

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

  (** *** PreModules *)
  (********************************************************************)
  Section PreModule.

    Context
      (W: Type)
      (T: K -> Type -> Type)
      (U: Type -> Type)
      `{! MReturn T}
      `{! MBind W T U}
      `{! forall k, MBind W T (T k)}
      {mn_op: Monoid_op W}
      {mn_unit: Monoid_unit W}.

    Class MultiDecoratedTraversablePreModule :=
      { dtp_monoid :> Monoid W;
        dtp_mbinddt_mret: forall A,
          mbinddt W T U (fun a => a) (mret T A ◻ allK extract) = @id (U A);
        dtp_mbinddt_mbinddt: forall
          (F: Type -> Type)
          (G: Type -> Type)
          `{Applicative F}
          `{Applicative G}
          `(g: forall k, W * B -> G (T k C))
          `(f: forall k, W * A -> F (T k B)),
          map (F := F) (mbinddt W T U G g) ∘ mbinddt W T U F f =
            mbinddt W T U (F ∘ G) (g ⋆dtm f);
        dtp_mbinddt_morphism: forall
          (F: Type -> Type)
          (G: Type -> Type)
          `{ApplicativeMorphism F G ϕ}
          `(f: forall k, W * A -> F (T k B)),
          ϕ (U B) ∘ mbinddt W T U F f =
            mbinddt W T U G ((fun k => ϕ (T k B)) ◻ f);
      }.

  End PreModule.

  (** *** DTMs *)
  (********************************************************************)
  Section DTM.

    Context
      (W: Type)
      (T: K -> Type -> Type)
      `{! MReturn T}
      `{! forall k, MBind W T (T k)}
      {mn_op: Monoid_op W}
      {mn_unit: Monoid_unit W}.

    Class MultiDecoratedTraversableMonad :=
      { dtm_pre :> forall k, MultiDecoratedTraversablePreModule W T (T k);
        dtm_mbinddt_comp_mret:
        forall k F `{Applicative F}
          `(f: forall k, W * A -> F (T k B)),
          mbinddt W T (T k) F f ∘ mret T A k = f k ∘ pair Ƶ;
      }.

  End DTM.

End MultisortedDTM_typeclasses.

Arguments mret {ix} _%function_scope {MReturn} {A}%type_scope _ _.
Arguments mbinddt {ix} {W}%type_scope {T} (U)%function_scope {MBind} F%function_scope {H H0 H1} {A B}.

#[local] Infix "⋆dtm" := compose_dtm (at level 40): tealeaves_scope.

(** ** Operation <<mapMret>> *)
(********************************************************************)
Section mapMret.

  Context
  `{ix: Index}
  `{! MReturn T}.

  Definition mapMret
    `{Map F} {A:Type}:
    forall (k: K), F A -> F (T k A) :=
    vec_apply (fun k => map (A := A) (B := T k A)) (mret T).

  
ix: Index
T: K -> Type -> Type
MReturn0: MReturn T
W, A, B: Type

forall (f : K -> W * A -> B) (k : K), (mret T ◻ f) k = mret T k ∘ f k
ix: Index
T: K -> Type -> Type
MReturn0: MReturn T
W, A, B: Type

forall (f : K -> W * A -> B) (k : K), (mret T ◻ f) k = mret T k ∘ f k
reflexivity. Qed.
ix: Index
T: K -> Type -> Type
MReturn0: MReturn T
W, A, B: Type
F: Type -> Type
Map_F: Map F
H: Functor F

forall (f : K -> W * A -> F B) (k : K), (mapMret ◻ f) k = map (mret T k) ∘ f k
ix: Index
T: K -> Type -> Type
MReturn0: MReturn T
W, A, B: Type
F: Type -> Type
Map_F: Map F
H: Functor F

forall (f : K -> W * A -> F B) (k : K), (mapMret ◻ f) k = map (mret T k) ∘ f k
reflexivity. Qed. End mapMret. (** ** Lemmas for Kleisli Composition *) (********************************************************************) Section multisorted_dtm_kleisli_composition. Context `{ix: Index} {W: Type} {T: K -> Type -> Type} {U: Type -> Type} `{! MReturn T} `{! MBind W T U} `{! forall k, MBind W T (T k)} {mn_op: Monoid_op W} {mn_unit: Monoid_unit W}. Context `{Applicative G} `{Applicative F} `{! Monoid W} {A B C: Type} {g: forall k, W * B -> G (T k C)}.
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)

forall w : W, (fun k : K => (g ⋆dtm f) k ∘ incr w) = (fun k : K => g k ∘ incr w) ⋆dtm (fun k : K => f k ∘ incr w)
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)

forall w : W, (fun k : K => (g ⋆dtm f) k ∘ incr w) = (fun k : K => g k ∘ incr w) ⋆dtm (fun k : K => f k ∘ incr w)
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W

(fun k : K => (g ⋆dtm f) k ∘ incr w) = (fun k : K => g k ∘ incr w) ⋆dtm (fun k : K => f k ∘ incr w)
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A

((g ⋆dtm f) k ∘ incr w) (w', a) = ((fun k : K => g k ∘ incr w) ⋆dtm (fun k : K => f k ∘ incr w)) k (w', a)
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A

map (mbinddt (T k) G (g ◻ allK (incr (w ● w')))) (f k (w ● w', a)) = map (mbinddt (T k) G ((fun k : K => g k ∘ incr w) ◻ allK (incr w'))) ((f k ∘ incr w) (w', a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A

g ◻ allK (incr (w ● w')) = (fun k : K => g k ∘ incr w) ◻ allK (incr w')
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A
j: K
w'': W
b: B

(g ◻ allK (incr (w ● w'))) j (w'', b) = ((fun k : K => g k ∘ incr w) ◻ allK (incr w')) j (w'', b)
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A
j: K
w'': W
b: B

g j (allK (incr (w ● w')) j (w'', b)) = g j (incr w (allK (incr w') j (w'', b)))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A
j: K
w'': W
b: B

g j ((w ● w') ● w'', b) = g j (w ● (w' ● w''), b)
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A
j: K
w'': W
b: B

((w ● w') ● w'', b) = (w ● (w' ● w''), b)
now rewrite monoid_assoc. Qed.
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)

forall w : W, g ⋆dtm f ◻ allK (incr w) = (g ◻ allK (incr w)) ⋆dtm (f ◻ allK (incr w))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)

forall w : W, g ⋆dtm f ◻ allK (incr w) = (g ◻ allK (incr w)) ⋆dtm (f ◻ allK (incr w))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W

g ⋆dtm f ◻ allK (incr w) = (g ◻ allK (incr w)) ⋆dtm (f ◻ allK (incr w))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A

(g ⋆dtm f ◻ allK (incr w)) k (w', a) = ((g ◻ allK (incr w)) ⋆dtm (f ◻ allK (incr w))) k (w', a)
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A

map (mbinddt (T k) G (g ◻ allK (incr (w ● w')))) (f k (w ● w', a)) = map (mbinddt (T k) G ((g ◻ allK (incr w)) ◻ allK (incr w'))) ((f ◻ allK (incr w)) k (w', a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A

g ◻ allK (incr (w ● w')) = (g ◻ allK (incr w)) ◻ allK (incr w')
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A
j: K
w'': W
b: B

(g ◻ allK (incr (w ● w'))) j (w'', b) = ((g ◻ allK (incr w)) ◻ allK (incr w')) j (w'', b)
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A
j: K
w'': W
b: B

g j (allK (incr (w ● w')) j (w'', b)) = g j (allK (incr w) j (allK (incr w') j (w'', b)))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A
j: K
w'': W
b: B

g j ((w ● w') ● w'', b) = g j (w ● (w' ● w''), b)
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
w: W
k: K
w': W
a: A
j: K
w'': W
b: B

((w ● w') ● w'', b) = (w ● (w' ● w''), b)
now rewrite monoid_assoc. Qed. Context `{! MultiDecoratedTraversableMonad W T}.
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B

g ⋆dtm (mret T ◻ f) = (fun (k : K) '(w, a) => g k (w, f k (w, a)))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B

g ⋆dtm (mret T ◻ f) = (fun (k : K) '(w, a) => g k (w, f k (w, a)))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B

g ⋆dtm (mret T ◻ f) = (fun (k : K) '(w, a) => g k (w, f k (w, a)))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B

(fun (k : K) '(w, a) => map (mbinddt (T k) G (g ◻ allK (incr w))) ((mret T ◻ f) k (w, a))) = (fun (k : K) '(w, a) => g k (w, f k (w, a)))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B
k: K
w: W
a: A

map (mbinddt (T k) G (g ◻ allK (incr w))) ((mret T ◻ f) k (w, a)) = g k (w, f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B
k: K
w: W
a: A

mbinddt (T k) G (g ◻ allK (incr w)) ((mret T ◻ f) k (w, a)) = g k (w, f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B
k: K
w: W
a: A

mbinddt (T k) G (g ◻ allK (incr w)) ((mret T k ∘ f k) (w, a)) = g k (w, f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B
k: K
w: W
a: A

mbinddt (T k) G (g ◻ allK (incr w)) (mret T k (f k (w, a))) = g k (w, f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B
k: K
w: W
a: A

(mbinddt (T k) G (g ◻ allK (incr w)) ∘ mret T k) (f k (w, a)) = g k (w, f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B
k: K
w: W
a: A

((g ◻ allK (incr w)) k ∘ pair Ƶ) (f k (w, a)) = g k (w, f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B
k: K
w: W
a: A

(g k ∘ allK (incr w) k ∘ pair Ƶ) (f k (w, a)) = g k (w, f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B
k: K
w: W
a: A

(g k ∘ (allK (incr w) k ∘ pair Ƶ)) (f k (w, a)) = g k (w, f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B
k: K
w: W
a: A

(g k ∘ (incr w ∘ pair Ƶ)) (f k (w, a)) = g k (w, f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> B
k: K
w: W
a: A

(g k ∘ pair w) (f k (w, a)) = g k (w, f k (w, a))
reflexivity. Qed.
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B

g ⋆dtm (mapMret ◻ f) = (fun (k : K) '(w, a) => map (g k ∘ pair w) (f k (w, a)))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B

g ⋆dtm (mapMret ◻ f) = (fun (k : K) '(w, a) => map (g k ∘ pair w) (f k (w, a)))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B

g ⋆dtm (mapMret ◻ f) = (fun (k : K) '(w, a) => map (g k ∘ pair w) (f k (w, a)))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B

(fun (k : K) '(w, a) => map (mbinddt (T k) G (g ◻ allK (incr w))) ((mapMret ◻ f) k (w, a))) = (fun (k : K) '(w, a) => map (g k ∘ pair w) (f k (w, a)))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B
k: K
w: W
a: A

map (mbinddt (T k) G (g ◻ allK (incr w))) ((mapMret ◻ f) k (w, a)) = map (g k ∘ pair w) (f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B
k: K
w: W
a: A

map (mbinddt (T k) G (g ◻ allK (incr w))) ((map (mret T k) ∘ f k) (w, a)) = map (g k ∘ pair w) (f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B
k: K
w: W
a: A

map (mbinddt (T k) G (g ◻ allK (incr w))) (map (mret T k) (f k (w, a))) = map (g k ○ pair w) (f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B
k: K
w: W
a: A

(map (mbinddt (T k) G (g ◻ allK (incr w))) ∘ map (mret T k)) (f k (w, a)) = map (g k ○ pair w) (f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B
k: K
w: W
a: A

map (mbinddt (T k) G (g ◻ allK (incr w)) ∘ mret T k) (f k (w, a)) = map (g k ○ pair w) (f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B
k: K
w: W
a: A

map ((g ◻ allK (incr w)) k ∘ pair Ƶ) (f k (w, a)) = map (g k ○ pair w) (f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B
k: K
w: W
a: A

map (g k ∘ allK (incr w) k ∘ pair Ƶ) (f k (w, a)) = map (g k ○ pair w) (f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B
k: K
w: W
a: A

map (g k ∘ (allK (incr w) k ∘ pair Ƶ)) (f k (w, a)) = map (g k ○ pair w) (f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B
k: K
w: W
a: A

map (g k ∘ (incr w ∘ pair Ƶ)) (f k (w, a)) = map (g k ○ pair w) (f k (w, a))
ix: Index
W: Type
T: K -> Type -> Type
U: Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H0: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H1: Applicative F
Monoid0: Monoid W
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
f: K -> W * A -> F B
k: K
w: W
a: A

map (g k ∘ pair w) (f k (w, a)) = map (g k ○ pair w) (f k (w, a))
reflexivity. Qed. End multisorted_dtm_kleisli_composition. (** ** Purity Law *) (**********************************************************************) Section DTM_laws. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T}.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T

forall (A : Type) (F : Type -> Type) (Map_G : Map F) (Pure_G : Pure F) (Mult_G : Mult F), Applicative F -> (let p := fun k : K => pure in let r := mret T in let e := allK extract in mbinddt U F ((p ◻ r) ◻ e)) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T

forall (A : Type) (F : Type -> Type) (Map_G : Map F) (Pure_G : Pure F) (Mult_G : Mult F), Applicative F -> (let p := fun k : K => pure in let r := mret T in let e := allK extract in mbinddt U F ((p ◻ r) ◻ e)) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F

(let p := fun k : K => pure in let r := mret T in let e := allK extract in mbinddt U F ((p ◻ r) ◻ e)) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F

mbinddt U F (((fun k : K => pure) ◻ mret T) ◻ allK extract) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F

mbinddt U F ((fun k : K => pure) ◻ (mret T ◻ allK extract)) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F

pure ∘ mbinddt U (fun x : Type => x) (mret T ◻ allK extract) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F

pure ∘ id = pure
reflexivity. Qed. End DTM_laws. (** * Derived Instances *) (**********************************************************************) Section derived_operations. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U}. (** ** Derived Multisorted Operations *) (********************************************************************) Section definitions. Context {A B: Type} (F: Type -> Type) `{Map F} `{Mult F} `{Pure F}. Definition mbindd (f: forall k, W * A -> T k B): U A -> U B := mbinddt U (fun x => x) f. Definition mmapdt (f: forall (k: K), W * A -> F B): U A -> F (U B) := mbinddt U F (mapMret (T := T) ◻ f). Definition mbindt (f: forall k, A -> F (T k B)): U A -> F (U B) := mbinddt U F (f ◻ allK extract). Definition mbind (f: forall k, A -> T k B): U A -> U B := mbindd (f ◻ allK extract). Definition mmapd (f: forall k, W * A -> B): U A -> U B := mbindd (mret T ◻ f). Definition mmapt (f: forall k, A -> F B): U A -> F (U B) := mmapdt (f ◻ allK extract). Definition mmap (f: forall k, A -> B): U A -> U B := mmapd (f ◻ allK extract). End definitions. (** ** Rewriting Rules *) (********************************************************************) Section special_cases. Context {A B: Type} (F: Type -> Type) `{Map F} `{Mult F} `{Pure F}. (** *** Special cases of <<mbinddt>> *) (******************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: forall k : K, A -> F (T k B)

mbindt F f = mbinddt U F (f ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: forall k : K, A -> F (T k B)

mbindt F f = mbinddt U F (f ◻ allK extract)
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: W * A ~k~> T B

mbindd f = mbinddt U (fun A : Type => A) f
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: W * A ~k~> T B

mbindd f = mbinddt U (fun A : Type => A) f
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> W * A -> F B

mmapdt F f = mbinddt U F (mapMret ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> W * A -> F B

mmapdt F f = mbinddt U F (mapMret ◻ f)
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: A ~k~> T B

mbind f = mbinddt U (fun A : Type => A) (f ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: A ~k~> T B

mbind f = mbinddt U (fun A : Type => A) (f ◻ allK extract)
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> W * A -> B

mmapd f = mbinddt U (fun A : Type => A) (mret T ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> W * A -> B

mmapd f = mbinddt U (fun A : Type => A) (mret T ◻ f)
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> F B

mmapt F f = mbinddt U F ((mapMret ◻ f) ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> F B

mmapt F f = mbinddt U F ((mapMret ◻ f) ◻ allK extract)
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> B

mmap f = mbinddt U (fun A : Type => A) ((mret T ◻ f) ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> B

mmap f = mbinddt U (fun A : Type => A) ((mret T ◻ f) ◻ allK extract)
reflexivity. Qed. (** *** Special Cases of <<mbindt>> *) (******************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: A ~k~> T B

mbind f = mbindt (fun A : Type => A) f
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: A ~k~> T B

mbind f = mbindt (fun A : Type => A) f
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> F B

mmapt F f = mbindt F (mapMret ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> F B

mmapt F f = mbindt F (mapMret ◻ f)
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> B

mmap f = mbindt (fun A : Type => A) (mret T ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> B

mmap f = mbindt (fun A : Type => A) (mret T ◻ f)
reflexivity. Qed. (** *** Special Cases of <<mbindd>> *) (******************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: A ~k~> T B

mbind f = mbindd (f ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: A ~k~> T B

mbind f = mbindd (f ◻ allK extract)
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: W * A -k-> B

mmapd f = mbindd (mret T ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: W * A -k-> B

mmapd f = mbindd (mret T ◻ f)
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: A -k-> B

mmap f = mbindd ((mret T ◻ f) ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: A -k-> B

mmap f = mbindd ((mret T ◻ f) ◻ allK extract)
reflexivity. Qed. (** *** Special Cases of <<mbindd>> *) (******************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> W * A -> B

mmapd f = mmapdt (fun A : Type => A) f
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> W * A -> B

mmapd f = mmapdt (fun A : Type => A) f
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> B

mmap f = mmapdt (fun A : Type => A) (f ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> B

mmap f = mmapdt (fun A : Type => A) (f ◻ allK extract)
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> F B

mmapt F f = mmapdt F (f ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> F B

mmapt F f = mmapdt F (f ◻ allK extract)
reflexivity. Qed. (** *** Special Cases of <<mmapt>> *) (******************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> B

mmap f = mmapt (fun A : Type => A) f
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> B

mmap f = mmapt (fun A : Type => A) f
reflexivity. Qed. (** *** Special Cases of <<mmapd>> *) (******************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> B

mmap f = mmapd (f ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> B

mmap f = mmapd (f ◻ allK extract)
reflexivity. Qed. (** *** Special Cases of <<mbind>> *) (******************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> B

mmap f = mbind (mret T ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
A, B: Type
F: Type -> Type
H1: Map F
H2: Mult F
H3: Pure F
f: K -> A -> B

mmap f = mbind (mret T ◻ f)
reflexivity. Qed. End special_cases. End derived_operations. (** ** Composition Between <<mbinddt>> and Other Operations *) (** Compositions laws for compositions of the form <<mbinddt ∘ xxx>> or <<xxx ∘ mbinddt>> *) (**********************************************************************) Section derived_operations_composition. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T} `{Applicative F} `{Applicative G} {A B C: Type}. (** *** <<mbinddt>> on the right *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : W * B ~k~> T C) (f : forall k : K, W * A -> F (T k B)), map (mbindd U g) ∘ mbinddt U F f = mbinddt U F (fun (k : K) '(w, a) => map (mbindd (T k) (g ◻ allK (incr w))) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : W * B ~k~> T C) (f : forall k : K, W * A -> F (T k B)), map (mbindd U g) ∘ mbinddt U F f = mbinddt U F (fun (k : K) '(w, a) => map (mbindd (T k) (g ◻ allK (incr w))) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: W * B ~k~> T C
f: forall k : K, W * A -> F (T k B)

map (mbindd U g) ∘ mbinddt U F f = mbinddt U F (fun (k : K) '(w, a) => map (mbindd (T k) (g ◻ allK (incr w))) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: W * B ~k~> T C
f: forall k : K, W * A -> F (T k B)

map (mbinddt U (fun A : Type => A) g) ∘ mbinddt U F f = mbinddt U F (fun (k : K) '(w, a) => map (mbindd (T k) (g ◻ allK (incr w))) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: W * B ~k~> T C
f: forall k : K, W * A -> F (T k B)

mbinddt U (F ∘ (fun A : Type => A)) (g ⋆dtm f) = mbinddt U F (fun (k : K) '(w, a) => map (mbindd (T k) (g ◻ allK (incr w))) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: W * B ~k~> T C
f: forall k : K, W * A -> F (T k B)

Mult_compose F (fun A : Type => A) = Mult_G
now erewrite Mult_compose_identity1. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : K -> W * B -> G C) (f : forall k : K, W * A -> F (T k B)), map (mmapdt U G g) ∘ mbinddt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (mmapdt (T k) G (g ◻ allK (incr w))) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : K -> W * B -> G C) (f : forall k : K, W * A -> F (T k B)), map (mmapdt U G g) ∘ mbinddt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (mmapdt (T k) G (g ◻ allK (incr w))) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> W * B -> G C
f: forall k : K, W * A -> F (T k B)

map (mmapdt U G g) ∘ mbinddt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (mmapdt (T k) G (g ◻ allK (incr w))) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> W * B -> G C
f: forall k : K, W * A -> F (T k B)

map (mbinddt U G (mapMret ◻ g)) ∘ mbinddt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (mmapdt (T k) G (g ◻ allK (incr w))) (f k (w, a)))
now rewrite (dtp_mbinddt_mbinddt W T U F G). Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, B -> G (T k C)) (f : forall k : K, W * A -> F (T k B)), map (mbindt U G g) ∘ mbinddt U F f = mbinddt U (F ∘ G) (fun k : K => map (mbindt (T k) G g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, B -> G (T k C)) (f : forall k : K, W * A -> F (T k B)), map (mbindt U G g) ∘ mbinddt U F f = mbinddt U (F ∘ G) (fun k : K => map (mbindt (T k) G g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, B -> G (T k C)
f: forall k : K, W * A -> F (T k B)

map (mbindt U G g) ∘ mbinddt U F f = mbinddt U (F ∘ G) (fun k : K => map (mbindt (T k) G g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, B -> G (T k C)
f: forall k : K, W * A -> F (T k B)

map (mbinddt U G (g ◻ allK extract)) ∘ mbinddt U F f = mbinddt U (F ∘ G) (fun k : K => map (mbindt (T k) G g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, B -> G (T k C)
f: forall k : K, W * A -> F (T k B)

mbinddt U (F ∘ G) ((g ◻ allK extract) ⋆dtm f) = mbinddt U (F ∘ G) (fun k : K => map (mbindt (T k) G g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, B -> G (T k C)
f: forall k : K, W * A -> F (T k B)

(g ◻ allK extract) ⋆dtm f = (fun k : K => map (mbindt (T k) G g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

((g ◻ allK extract) ⋆dtm f) k (w, a) = (map (mbindt (T k) G g) ∘ f k) (w, a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

map (mbinddt (T k) G ((g ◻ allK extract) ◻ allK (incr w))) (f k (w, a)) = map (mbindt (T k) G g) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

mbinddt (T k) G ((g ◻ allK extract) ◻ allK (incr w)) = mbindt (T k) G g
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

mbinddt (T k) G ((g ◻ allK extract) ◻ allK (incr w)) = mbinddt (T k) G (g ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, B -> G (T k C)
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

(g ◻ allK extract) ◻ allK (incr w) = g ◻ allK extract
now ext j [w2 b]. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : B ~k~> T C) (f : forall k : K, W * A -> F (T k B)), map (mbind U g) ∘ mbinddt U F f = mbinddt U F ((fun k : K => map (mbind (T k) g)) ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : B ~k~> T C) (f : forall k : K, W * A -> F (T k B)), map (mbind U g) ∘ mbinddt U F f = mbinddt U F ((fun k : K => map (mbind (T k) g)) ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: B ~k~> T C
f: forall k : K, W * A -> F (T k B)

map (mbind U g) ∘ mbinddt U F f = mbinddt U F ((fun k : K => map (mbind (T k) g)) ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: B ~k~> T C
f: forall k : K, W * A -> F (T k B)

map (mbinddt U (fun A : Type => A) (g ◻ allK extract)) ∘ mbinddt U F f = mbinddt U F ((fun k : K => map (mbind (T k) g)) ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: B ~k~> T C
f: forall k : K, W * A -> F (T k B)

mbinddt U (F ∘ (fun A : Type => A)) ((g ◻ allK extract) ⋆dtm f) = mbinddt U F ((fun k : K => map (mbind (T k) g)) ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: B ~k~> T C
f: forall k : K, W * A -> F (T k B)

Mult_compose F (fun A : Type => A) = Mult_G
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: B ~k~> T C
f: forall k : K, W * A -> F (T k B)
(g ◻ allK extract) ⋆dtm f = (fun k : K => map (mbind (T k) g)) ◻ f
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: B ~k~> T C
f: forall k : K, W * A -> F (T k B)

Mult_compose F (fun A : Type => A) = Mult_G
now erewrite Mult_compose_identity1.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: B ~k~> T C
f: forall k : K, W * A -> F (T k B)

(g ◻ allK extract) ⋆dtm f = (fun k : K => map (mbind (T k) g)) ◻ f
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: B ~k~> T C
f: forall k : K, W * A -> F (T k B)

(fun (k : K) '(w, a) => map (mbinddt (T k) (fun A : Type => A) ((fun k0 : K => g k0 ○ allK extract k0) ◻ allK (incr w))) (f k (w, a))) = (fun k : K => map (mbind (T k) g) ○ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: B ~k~> T C
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

map (mbinddt (T k) (fun A : Type => A) ((fun k : K => g k ○ allK extract k) ◻ allK (incr w))) (f k (w, a)) = map (mbind (T k) g) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: B ~k~> T C
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

mbinddt (T k) (fun A : Type => A) ((fun k : K => g k ○ allK extract k) ◻ allK (incr w)) = mbind (T k) g
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: B ~k~> T C
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

mbinddt (T k) (fun A : Type => A) ((fun k : K => g k ○ allK extract k) ◻ allK (incr w)) = mbinddt (T k) (fun A : Type => A) (g ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: B ~k~> T C
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

(fun k : K => g k ○ allK extract k) ◻ allK (incr w) = g ◻ allK extract
now ext j [w2 b]. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : K -> W * B -> C) (f : forall k : K, W * A -> F (T k B)), map (mmapd U g) ∘ mbinddt U F f = mbinddt U F (fun (k : K) '(w, a) => map (mmapd (T k) (g ◻ allK (incr w))) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : K -> W * B -> C) (f : forall k : K, W * A -> F (T k B)), map (mmapd U g) ∘ mbinddt U F f = mbinddt U F (fun (k : K) '(w, a) => map (mmapd (T k) (g ◻ allK (incr w))) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> W * B -> C
f: forall k : K, W * A -> F (T k B)

map (mmapd U g) ∘ mbinddt U F f = mbinddt U F (fun (k : K) '(w, a) => map (mmapd (T k) (g ◻ allK (incr w))) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> W * B -> C
f: forall k : K, W * A -> F (T k B)

map (mbinddt U (fun A : Type => A) (mret T ◻ g)) ∘ mbinddt U F f = mbinddt U F (fun (k : K) '(w, a) => map (mmapd (T k) (g ◻ allK (incr w))) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> W * B -> C
f: forall k : K, W * A -> F (T k B)

mbinddt U (F ∘ (fun A : Type => A)) ((mret T ◻ g) ⋆dtm f) = mbinddt U F (fun (k : K) '(w, a) => map (mmapd (T k) (g ◻ allK (incr w))) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> W * B -> C
f: forall k : K, W * A -> F (T k B)

Mult_compose F (fun A : Type => A) = Mult_G
now erewrite Mult_compose_identity1. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : K -> B -> G C) (f : forall k : K, W * A -> F (T k B)), map (mmapt U G g) ∘ mbinddt U F f = mbinddt U (F ∘ G) (fun k : K => map (mmapt (T k) G g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : K -> B -> G C) (f : forall k : K, W * A -> F (T k B)), map (mmapt U G g) ∘ mbinddt U F f = mbinddt U (F ∘ G) (fun k : K => map (mmapt (T k) G g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> G C
f: forall k : K, W * A -> F (T k B)

map (mmapt U G g) ∘ mbinddt U F f = mbinddt U (F ∘ G) (fun k : K => map (mmapt (T k) G g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> G C
f: forall k : K, W * A -> F (T k B)

map (mbinddt U G ((mapMret ◻ g) ◻ allK extract)) ∘ mbinddt U F f = mbinddt U (F ∘ G) (fun k : K => map (mmapt (T k) G g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> G C
f: forall k : K, W * A -> F (T k B)

mbinddt U (F ∘ G) (((mapMret ◻ g) ◻ allK extract) ⋆dtm f) = mbinddt U (F ∘ G) (fun k : K => map (mmapt (T k) G g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> G C
f: forall k : K, W * A -> F (T k B)

((mapMret ◻ g) ◻ allK extract) ⋆dtm f = (fun k : K => map (mmapt (T k) G g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> G C
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

(((mapMret ◻ g) ◻ allK extract) ⋆dtm f) k (w, a) = (map (mmapt (T k) G g) ∘ f k) (w, a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> G C
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

map (mbinddt (T k) G (((mapMret ◻ g) ◻ allK extract) ◻ allK (incr w))) (f k (w, a)) = map (mmapt (T k) G g) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> G C
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

mbinddt (T k) G (((mapMret ◻ g) ◻ allK extract) ◻ allK (incr w)) = mmapt (T k) G g
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> G C
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

mbinddt (T k) G (((mapMret ◻ g) ◻ allK extract) ◻ allK (incr w)) = mbinddt (T k) G ((mapMret ◻ g) ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> G C
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

((mapMret ◻ g) ◻ allK extract) ◻ allK (incr w) = (mapMret ◻ g) ◻ allK extract
now ext j [w2 b]. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : K -> B -> C) (f : forall k : K, W * A -> F (T k B)), map (mmap U g) ∘ mbinddt U F f = mbinddt U F (fun k : K => map (mmap (T k) g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : K -> B -> C) (f : forall k : K, W * A -> F (T k B)), map (mmap U g) ∘ mbinddt U F f = mbinddt U F (fun k : K => map (mmap (T k) g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> C
f: forall k : K, W * A -> F (T k B)

map (mmap U g) ∘ mbinddt U F f = mbinddt U F (fun k : K => map (mmap (T k) g) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> C
f: forall k : K, W * A -> F (T k B)

map (mmapd U (g ◻ allK extract)) ∘ mbinddt U F f = mbinddt U F (fun k : K => map (mmapd (T k) (g ◻ allK extract)) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> C
f: forall k : K, W * A -> F (T k B)

mbinddt U F (fun (k : K) '(w, a) => map (mmapd (T k) ((g ◻ allK extract) ◻ allK (incr w))) (f k (w, a))) = mbinddt U F (fun k : K => map (mmapd (T k) (g ◻ allK extract)) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> C
f: forall k : K, W * A -> F (T k B)

(fun (k : K) '(w, a) => map (mmapd (T k) ((g ◻ allK extract) ◻ allK (incr w))) (f k (w, a))) = (fun k : K => map (mmapd (T k) (g ◻ allK extract)) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> C
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

map (mmapd (T k) ((g ◻ allK extract) ◻ allK (incr w))) (f k (w, a)) = (map (mmapd (T k) (g ◻ allK extract)) ∘ f k) (w, a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> C
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

map (mmapd (T k) ((g ◻ allK extract) ◻ allK (incr w))) (f k (w, a)) = map (mmapd (T k) (g ◻ allK extract)) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> C
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

mmapd (T k) ((g ◻ allK extract) ◻ allK (incr w)) = mmapd (T k) (g ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: K -> B -> C
f: forall k : K, W * A -> F (T k B)
k: K
w: W
a: A

(g ◻ allK extract) ◻ allK (incr w) = g ◻ allK extract
now ext j [w2 b]. Qed. (** *** <<mbinddt>> on the left *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : W * A ~k~> T B), mbinddt U G g ∘ mbindd U f = mbinddt U G (fun (k : K) '(w, a) => mbinddt (T k) G (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : W * A ~k~> T B), mbinddt U G g ∘ mbindd U f = mbinddt U G (fun (k : K) '(w, a) => mbinddt (T k) G (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: W * A ~k~> T B

mbinddt U G g ∘ mbindd U f = mbinddt U G (fun (k : K) '(w, a) => mbinddt (T k) G (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: W * A ~k~> T B

mbinddt U G g ∘ mbinddt U (fun A : Type => A) f = mbinddt U G (fun (k : K) '(w, a) => mbinddt (T k) G (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: W * A ~k~> T B

map (mbinddt U G g) ∘ mbinddt U (fun A : Type => A) f = mbinddt U G (fun (k : K) '(w, a) => mbinddt (T k) G (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: W * A ~k~> T B

mbinddt U ((fun A : Type => A) ∘ G) (g ⋆dtm f) = mbinddt U G (fun (k : K) '(w, a) => mbinddt (T k) G (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: W * A ~k~> T B

Mult_compose (fun A : Type => A) G = Mult_G0
now rewrite (Mult_compose_identity2 G). Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : K -> W * A -> F B), map (mbinddt U G g) ∘ mmapdt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : K -> W * A -> F B), map (mbinddt U G g) ∘ mmapdt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B

map (mbinddt U G g) ∘ mmapdt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B

map (mbinddt U G g) ∘ mbinddt U F (mapMret ◻ f) = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B

mbinddt U (F ∘ G) (g ⋆dtm (mapMret ◻ f)) = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B

g ⋆dtm (mapMret ◻ f) = (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B
k: K
w: W
a: A

(g ⋆dtm (mapMret ◻ f)) k (w, a) = map (g k ○ pair w) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B
k: K
w: W
a: A

map (mbinddt (T k) G (g ◻ allK (incr w))) ((mapMret ◻ f) k (w, a)) = map (g k ○ pair w) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B
k: K
w: W
a: A

map (mbinddt (T k) G (g ◻ allK (incr w))) ((map (mret T k) ∘ f k) (w, a)) = map (g k ○ pair w) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B
k: K
w: W
a: A

map (mbinddt (T k) G (g ◻ allK (incr w))) (map (mret T k) (f k (w, a))) = map (g k ○ pair w) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B
k: K
w: W
a: A

(map (mbinddt (T k) G (g ◻ allK (incr w))) ∘ map (mret T k)) (f k (w, a)) = map (g k ○ pair w) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B
k: K
w: W
a: A

map (mbinddt (T k) G (g ◻ allK (incr w)) ∘ mret T k) (f k (w, a)) = map (g k ○ pair w) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B
k: K
w: W
a: A

map ((g ◻ allK (incr w)) k ∘ pair Ƶ) (f k (w, a)) = map (g k ○ pair w) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B
k: K
w: W
a: A

map (g k ∘ incr w ∘ pair Ƶ) (f k (w, a)) = map (g k ○ pair w) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B
k: K
w: W
a: A

map (g k ∘ (incr w ∘ pair Ƶ)) (f k (w, a)) = map (g k ○ pair w) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> F B
k: K
w: W
a: A

map (g k ∘ pair w) (f k (w, a)) = map (g k ○ pair w) (f k (w, a))
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : forall k : K, A -> F (T k B)), map (mbinddt U G g) ∘ mbindt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (mbinddt (T k) G (g ◻ allK (incr w))) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : forall k : K, A -> F (T k B)), map (mbinddt U G g) ∘ mbindt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (mbinddt (T k) G (g ◻ allK (incr w))) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, A -> F (T k B)

map (mbinddt U G g) ∘ mbindt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (mbinddt (T k) G (g ◻ allK (incr w))) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, A -> F (T k B)

map (mbinddt U G g) ∘ mbinddt U F (f ◻ allK extract) = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (mbinddt (T k) G (g ◻ allK (incr w))) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: forall k : K, A -> F (T k B)

mbinddt U (F ∘ G) (g ⋆dtm (f ◻ allK extract)) = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (mbinddt (T k) G (g ◻ allK (incr w))) (f k a))
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : A ~k~> T B), mbinddt U G g ∘ mbind U f = mbinddt U G (fun (k : K) '(w, a) => mbinddt (T k) G (g ◻ allK (incr w)) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : A ~k~> T B), mbinddt U G g ∘ mbind U f = mbinddt U G (fun (k : K) '(w, a) => mbinddt (T k) G (g ◻ allK (incr w)) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: A ~k~> T B

mbinddt U G g ∘ mbind U f = mbinddt U G (fun (k : K) '(w, a) => mbinddt (T k) G (g ◻ allK (incr w)) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: A ~k~> T B

mbinddt U G g ∘ mbinddt U (fun A : Type => A) (f ◻ allK extract) = mbinddt U G (fun (k : K) '(w, a) => mbinddt (T k) G (g ◻ allK (incr w)) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: A ~k~> T B

map (mbinddt U G g) ∘ mbinddt U (fun A : Type => A) (f ◻ allK extract) = mbinddt U G (fun (k : K) '(w, a) => mbinddt (T k) G (g ◻ allK (incr w)) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: A ~k~> T B

mbinddt U ((fun A : Type => A) ∘ G) (g ⋆dtm (f ◻ allK extract)) = mbinddt U G (fun (k : K) '(w, a) => mbinddt (T k) G (g ◻ allK (incr w)) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: A ~k~> T B

Mult_compose (fun A : Type => A) G = Mult_G0
now rewrite (Mult_compose_identity2 G). Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : K -> W * A -> B), mbinddt U G g ∘ mmapd U f = mbinddt U G (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : K -> W * A -> B), mbinddt U G g ∘ mmapd U f = mbinddt U G (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> B

mbinddt U G g ∘ mmapd U f = mbinddt U G (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> B

mbinddt U G g ∘ mbinddt U (fun A : Type => A) (mret T ◻ f) = mbinddt U G (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> B

map (mbinddt U G g) ∘ mbinddt U (fun A : Type => A) (mret T ◻ f) = mbinddt U G (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> B

mbinddt U ((fun A : Type => A) ∘ G) (g ⋆dtm (mret T ◻ f)) = mbinddt U G (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> B

Mult_compose (fun A : Type => A) G = Mult_G0
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> B
g ⋆dtm (mret T ◻ f) = (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> B

g ⋆dtm (mret T ◻ f) = (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> W * A -> B

(fun (k : K) '(w, a) => g k (w, f k (w, a))) = (fun (k : K) '(w, a) => g k (w, f k (w, a)))
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : K -> A -> F B), map (mbinddt U G g) ∘ mmapt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : K -> A -> F B), map (mbinddt U G g) ∘ mmapt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> A -> F B

map (mbinddt U G g) ∘ mmapt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> A -> F B

map (mbinddt U G g) ∘ mmapdt U F (f ◻ allK extract) = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> A -> F B

mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) ((f ◻ allK extract) k (w, a))) = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : K -> A -> B), mbinddt U G g ∘ mmap U f = mbinddt U G (fun (k : K) '(w, a) => g k (w, f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type

forall (g : forall k : K, W * B -> G (T k C)) (f : K -> A -> B), mbinddt U G g ∘ mmap U f = mbinddt U G (fun (k : K) '(w, a) => g k (w, f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> A -> B

mbinddt U G g ∘ mmap U f = mbinddt U G (fun (k : K) '(w, a) => g k (w, f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> A -> B

mbinddt U G g ∘ mmapd U (f ◻ allK extract) = mbinddt U G (fun (k : K) '(w, a) => g k (w, f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
A, B, C: Type
g: forall k : K, W * B -> G (T k C)
f: K -> A -> B

mbinddt U G (fun (k : K) '(w, a) => g k (w, (f ◻ allK extract) k (w, a))) = mbinddt U G (fun (k : K) '(w, a) => g k (w, f k a))
reflexivity. Qed. End derived_operations_composition. (** ** Composition between Derived Operations *) (** Composition laws involving one of <<mbindd>>/<<mmapdt>>/<<mbindt>> and another operation that is not a special cases. *) (**********************************************************************) Section mixed_composition_laws. Context (U: Type -> Type) (F G: Type -> Type) `{Applicative F} `{Applicative G} `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T} {A B C: Type}. (** *** <<mbindd>> *) (** Operations with traversals are not special cases of <<mbindd>>. *) (********************************************************************)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : K -> W * A -> F B), map (mbindd U g) ∘ mmapdt U F f = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : K -> W * A -> F B), map (mbindd U g) ∘ mmapdt U F f = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> F B

map (mbindd U g) ∘ mmapdt U F f = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> F B

map (mbindd U g) ∘ mbinddt U F (mapMret ◻ f) = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> F B

map (mbinddt U (fun A : Type => A) g) ∘ mbinddt U F (mapMret ◻ f) = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> F B

mbinddt U (F ∘ (fun x : Type => x)) (g ⋆dtm (mapMret ◻ f)) = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> F B

mbinddt U (F ∘ (fun x : Type => x)) (fun (k : K) '(w, a) => map (g k ∘ pair w) (f k (w, a))) = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> F B

mbinddt U (F ∘ (fun x : Type => x)) (fun (k : K) '(w, a) => map (g k ∘ pair w) (f k (w, a))) = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
reflexivity. Qed.
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : forall k : K, A -> F (T k B)), map (mbindd U g) ∘ mbindt U F f = mbinddt U F (fun (k : K) '(w, a) => map (mbindd (T k) (g ◻ allK (incr w))) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : forall k : K, A -> F (T k B)), map (mbindd U g) ∘ mbindt U F f = mbinddt U F (fun (k : K) '(w, a) => map (mbindd (T k) (g ◻ allK (incr w))) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: forall k : K, A -> F (T k B)

map (mbindd U g) ∘ mbindt U F f = mbinddt U F (fun (k : K) '(w, a) => map (mbindd (T k) (g ◻ allK (incr w))) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: forall k : K, A -> F (T k B)

map (mbinddt U (fun A : Type => A) g) ∘ mbindt U F f = mbinddt U F (fun (k : K) '(w, a) => map (mbindd (T k) (g ◻ allK (incr w))) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: forall k : K, A -> F (T k B)

map (mbinddt U (fun A : Type => A) g) ∘ mbinddt U F (f ◻ allK extract) = mbinddt U F (fun (k : K) '(w, a) => map (mbindd (T k) (g ◻ allK (incr w))) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: forall k : K, A -> F (T k B)

mbinddt U (F ∘ (fun x : Type => x)) (g ⋆dtm (f ◻ allK extract)) = mbinddt U F (fun (k : K) '(w, a) => map (mbindd (T k) (g ◻ allK (incr w))) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: forall k : K, A -> F (T k B)

mbinddt U (F ∘ (fun x : Type => x)) (g ⋆dtm (f ◻ allK extract)) = mbinddt U F (fun (k : K) '(w, a) => map (mbindd (T k) (g ◻ allK (incr w))) (f k a))
reflexivity. Qed.
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : K -> A -> F B), map (mbindd U g) ∘ mmapt U F f = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : K -> A -> F B), map (mbindd U g) ∘ mmapt U F f = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> A -> F B

map (mbindd U g) ∘ mmapt U F f = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> A -> F B

map (mbinddt U (fun A : Type => A) g) ∘ mmapt U F f = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> A -> F B

map (mbinddt U (fun A : Type => A) g) ∘ mbinddt U F ((mapMret ◻ f) ◻ allK extract) = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> A -> F B

mbinddt U (F ∘ (fun x : Type => x)) (g ⋆dtm ((mapMret ◻ f) ◻ allK extract)) = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> A -> F B

mbinddt U (F ∘ (fun x : Type => x)) (g ⋆dtm (mapMret ◻ (f ◻ allK extract))) = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> A -> F B

mbinddt U (F ∘ (fun x : Type => x)) (fun (k : K) '(w, a) => map (g k ∘ pair w) ((f ◻ allK extract) k (w, a))) = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> A -> F B

mbinddt U (F ∘ (fun x : Type => x)) (fun (k : K) '(w, a) => map (g k ∘ pair w) ((f ◻ allK extract) k (w, a))) = mbinddt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
reflexivity. Qed. (* TODO Also need to put <<mmapt_mbindd>> somewhere. *) (** *** <<mmapdt>> *) (** Operations with joins are not special cases of <<mmapdt>>. *) (********************************************************************)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> G C) (f : W * A ~k~> T B), mmapdt U G g ∘ mbindd U f = mbinddt U G (fun (k : K) '(w, a) => mmapdt (T k) G (g ◻ allK (incr w)) (f k (w, a)))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> G C) (f : W * A ~k~> T B), mmapdt U G g ∘ mbindd U f = mbinddt U G (fun (k : K) '(w, a) => mmapdt (T k) G (g ◻ allK (incr w)) (f k (w, a)))
(* TODO *) Abort.
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> G C) (f : forall k : K, A -> F (T k B)), map (mmapdt U G g) ∘ mbindt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (mmapdt (T k) G (g ◻ allK (incr w))) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> G C) (f : forall k : K, A -> F (T k B)), map (mmapdt U G g) ∘ mbindt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (mmapdt (T k) G (g ◻ allK (incr w))) (f k a))
(* TODO *) Abort.
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> G C) (f : A ~k~> T B), mmapdt U G g ∘ mbind U f = mbinddt U G (fun (k : K) '(w, a) => mmapdt (T k) G (g ◻ allK (incr w)) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> G C) (f : A ~k~> T B), mmapdt U G g ∘ mbind U f = mbinddt U G (fun (k : K) '(w, a) => mmapdt (T k) G (g ◻ allK (incr w)) (f k a))
(* TODO *) Abort. (* TODO Also need to put <<mbind_mmapdt>> somewhere. *) (** *** <<mbindt>> *) (** Operations with decorations are not special cases of <<mbindt>>. *) (********************************************************************)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : forall k : K, B -> G (T k C)) (f : W * A ~k~> T B), mbindt U G g ∘ mbindd U f = mbinddt U G (fun (k : K) '(w, a) => mbindt (T k) G g (f k (w, a)))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : forall k : K, B -> G (T k C)) (f : W * A ~k~> T B), mbindt U G g ∘ mbindd U f = mbinddt U G (fun (k : K) '(w, a) => mbindt (T k) G g (f k (w, a)))
(* TODO *) Abort.
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : forall k : K, B -> G (T k C)) (f : K -> W * A -> F B), map (mbindt U G g) ∘ mmapdt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (g k) (f k (w, a)))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : forall k : K, B -> G (T k C)) (f : K -> W * A -> F B), map (mbindt U G g) ∘ mmapdt U F f = mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (g k) (f k (w, a)))
(* TODO *) Abort. (* TODO <<mbindt_mmapd>> *) (* TODO Also need to put <<mmapd_mbindt>> somewhere. *) End mixed_composition_laws. (** ** Decorated Monad (<<mbindd>>) *) (**********************************************************************) Definition compose_dm `{ix: Index} {W: Type} {T: K -> Type -> Type} `{mn_op: Monoid_op W} `{mn_unit: Monoid_unit W} `{forall k, MBind W T (T k)} {A B C: Type} (g: forall k, W * B -> T k C) (f: forall k, W * A -> T k B): forall k, W * A -> T k C := fun k '(w, a) => mbindd (T k) (g ◻ allK (incr w)) (f k (w, a)). Infix "⋆dm" := compose_dm (at level 40). Section DecoratedMonad. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T} {A B C: Type}. (** *** Composition and identity law *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

mbindd U (mret T ◻ allK extract) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

mbindd U (mret T ◻ allK extract) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

mbindd U (mret T ◻ allK extract) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

mbinddt U (fun A : Type => A) (mret T ◻ allK extract) = id
now rewrite <- (dtp_mbinddt_mret W T U). Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : W * A ~k~> T B), mbindd U g ∘ mbindd U f = mbindd U (fun (k : K) '(w, a) => mbindd (T k) (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : W * A ~k~> T B), mbindd U g ∘ mbindd U f = mbindd U (fun (k : K) '(w, a) => mbindd (T k) (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: W * A ~k~> T B

mbindd U g ∘ mbindd U f = mbindd U (fun (k : K) '(w, a) => mbindd (T k) (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: W * A ~k~> T B

mbinddt U (fun A : Type => A) g ∘ mbinddt U (fun A : Type => A) f = mbinddt U (fun A : Type => A) (fun (k : K) '(w, a) => mbindd (T k) (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: W * A ~k~> T B

map (mbinddt U (fun x : Type => x) g) ∘ mbinddt U (fun x : Type => x) f = mbinddt U (fun A : Type => A) (fun (k : K) '(w, a) => mbindd (T k) (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: W * A ~k~> T B

mbinddt U ((fun x : Type => x) ∘ (fun x : Type => x)) (g ⋆dtm f) = mbinddt U (fun A : Type => A) (fun (k : K) '(w, a) => mbindd (T k) (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: W * A ~k~> T B

mbinddt U ((fun x : Type => x) ∘ (fun x : Type => x)) (g ⋆dtm f) = mbinddt U (fun A : Type => A) (fun (k : K) '(w, a) => mbindd (T k) (g ◻ allK (incr w)) (f k (w, a)))
reflexivity. Qed. (** *** Right unit law for monads *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (k : K) (f : W * A ~k~> T B), mbindd (T k) f ∘ mret T k = f k ∘ ret
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (k : K) (f : W * A ~k~> T B), mbindd (T k) f ∘ mret T k = f k ∘ ret
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
k: K
f: W * A ~k~> T B

mbindd (T k) f ∘ mret T k = f k ∘ ret
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
k: K
f: W * A ~k~> T B

mbinddt (T k) (fun A : Type => A) f ∘ mret T k = f k ∘ ret
now rewrite (dtm_mbinddt_comp_mret W T k (fun A => A)). Qed. (** *** Composition with special cases on the right *) (** Composition with operations <<mbind>>/<<mmapd>>/<<mmap>> *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : A ~k~> T B), mbindd U g ∘ mbind U f = mbindd U (fun (k : K) '(w, a) => mbindd (T k) (g ◻ allK (incr w)) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : A ~k~> T B), mbindd U g ∘ mbind U f = mbindd U (fun (k : K) '(w, a) => mbindd (T k) (g ◻ allK (incr w)) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: A ~k~> T B

mbindd U g ∘ mbind U f = mbindd U (fun (k : K) '(w, a) => mbindd (T k) (g ◻ allK (incr w)) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: A ~k~> T B

mbindd U g ∘ mbindd U (f ◻ allK extract) = mbindd U (fun (k : K) '(w, a) => mbindd (T k) (g ◻ allK (incr w)) (f k a))
now rewrite mbindd_mbindd. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : K -> W * A -> B), mbindd U g ∘ mmapd U f = mbindd U (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : K -> W * A -> B), mbindd U g ∘ mmapd U f = mbindd U (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> B

mbindd U g ∘ mmapd U f = mbindd U (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> B

mbindd U g ∘ mbindd U (mret T ◻ f) = mbindd U (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> B

mbindd U (fun (k : K) '(w, a) => mbindd (T k) (g ◻ allK (incr w)) ((mret T ◻ f) k (w, a))) = mbindd U (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> B

(fun (k : K) '(w, a) => mbindd (T k) (g ◻ allK (incr w)) ((mret T ◻ f) k (w, a))) = (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> B
k: K
w: W
a: A

mbindd (T k) (g ◻ allK (incr w)) ((mret T ◻ f) k (w, a)) = g k (w, f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> B
k: K
w: W
a: A

mbindd (T k) (fun k : K => g k ○ allK (incr w) k) (mret T k (f k (w, a))) = g k (w, f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> B
k: K
w: W
a: A

(mbindd (T k) (fun k : K => g k ○ allK (incr w) k) ∘ mret T k) (f k (w, a)) = (g k ∘ pair w) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> B
k: K
w: W
a: A

(mbinddt (T k) (fun A : Type => A) (fun k : K => g k ○ allK (incr w) k) ∘ mret T k) (f k (w, a)) = (g k ∘ pair w) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> B
k: K
w: W
a: A

(g k ○ allK (incr w) k ∘ pair Ƶ) (f k (w, a)) = (g k ∘ pair w) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> W * A -> B
k: K
w: W
a: A

g k (w ● Ƶ, f k (w, a)) = g k (w, f k (w, a))
now simpl_monoid. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : K -> A -> B), mbindd U g ∘ mmap U f = mbindd U (fun (k : K) '(w, a) => g k (w, f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : W * B ~k~> T C) (f : K -> A -> B), mbindd U g ∘ mmap U f = mbindd U (fun (k : K) '(w, a) => g k (w, f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> A -> B

mbindd U g ∘ mmap U f = mbindd U (fun (k : K) '(w, a) => g k (w, f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: W * B ~k~> T C
f: K -> A -> B

mbindd U g ∘ mmapd U (f ◻ allK extract) = mbindd U (fun (k : K) '(w, a) => g k (w, f k a))
now rewrite (mbindd_mmapd). Qed. (** *** Composition with special cases on the left *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : B ~k~> T C) (f : W * A ~k~> T B), mbind U g ∘ mbindd U f = mbindd U (fun k : K => mbind (T k) g ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : B ~k~> T C) (f : W * A ~k~> T B), mbind U g ∘ mbindd U f = mbindd U (fun k : K => mbind (T k) g ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B

mbind U g ∘ mbindd U f = mbindd U (fun k : K => mbind (T k) g ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B

mbindd U (g ◻ allK extract) ∘ mbindd U f = mbindd U (fun k : K => mbind (T k) g ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B

mbindd U (fun (k : K) '(w, a) => mbindd (T k) ((g ◻ allK extract) ◻ allK (incr w)) (f k (w, a))) = mbindd U (fun k : K => mbind (T k) g ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B

(fun (k : K) '(w, a) => mbindd (T k) ((g ◻ allK extract) ◻ allK (incr w)) (f k (w, a))) = (fun k : K => mbind (T k) g ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B
k: K
w: W
a: A

mbindd (T k) ((g ◻ allK extract) ◻ allK (incr w)) (f k (w, a)) = (mbind (T k) g ∘ f k) (w, a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B
k: K
w: W
a: A

mbindd (T k) ((g ◻ allK extract) ◻ allK (incr w)) (f k (w, a)) = mbindd (T k) (g ◻ allK extract) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B
k: K
w: W
a: A

(g ◻ allK extract) ◻ allK (incr w) = g ◻ allK extract
now ext j [w2 b]. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> C) (f : W * A ~k~> T B), mmapd U g ∘ mbindd U f = mbindd U (fun (k : K) '(w, a) => mmapd (T k) (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> C) (f : W * A ~k~> T B), mmapd U g ∘ mbindd U f = mbindd U (fun (k : K) '(w, a) => mmapd (T k) (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: W * A ~k~> T B

mmapd U g ∘ mbindd U f = mbindd U (fun (k : K) '(w, a) => mmapd (T k) (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: W * A ~k~> T B

mbindd U (mret T ◻ g) ∘ mbindd U f = mbindd U (fun (k : K) '(w, a) => mmapd (T k) (g ◻ allK (incr w)) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: W * A ~k~> T B

mbindd U (fun (k : K) '(w, a) => mbindd (T k) ((mret T ◻ g) ◻ allK (incr w)) (f k (w, a))) = mbindd U (fun (k : K) '(w, a) => mmapd (T k) (g ◻ allK (incr w)) (f k (w, a)))
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : B ~k~> T C) (f : W * A ~k~> T B), mbind U g ∘ mbindd U f = mbindd U (fun k : K => mbind (T k) g ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : B ~k~> T C) (f : W * A ~k~> T B), mbind U g ∘ mbindd U f = mbindd U (fun k : K => mbind (T k) g ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B

mbind U g ∘ mbindd U f = mbindd U (fun k : K => mbind (T k) g ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B

mbindd U (g ◻ allK extract) ∘ mbindd U f = mbindd U (fun k : K => mbind (T k) g ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B

mbindd U (fun (k : K) '(w, a) => mbindd (T k) ((g ◻ allK extract) ◻ allK (incr w)) (f k (w, a))) = mbindd U (fun k : K => mbind (T k) g ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B

(fun (k : K) '(w, a) => mbindd (T k) ((g ◻ allK extract) ◻ allK (incr w)) (f k (w, a))) = (fun k : K => mbind (T k) g ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B
k: K
w: W
a: A

mbindd (T k) ((g ◻ allK extract) ◻ allK (incr w)) (f k (w, a)) = (mbind (T k) g ∘ f k) (w, a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B
k: K
w: W
a: A

mbindd (T k) ((g ◻ allK extract) ◻ allK (incr w)) (f k (w, a)) = mbind (T k) g (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B
k: K
w: W
a: A

mbindd (T k) ((g ◻ allK extract) ◻ allK (incr w)) (f k (w, a)) = mbindd (T k) (g ◻ allK extract) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: W * A ~k~> T B
k: K
w: W
a: A

(g ◻ allK extract) ◻ allK (incr w) = g ◻ allK extract
now ext j [w2 b]. Qed. End DecoratedMonad. (** ** Decorated Traversable Functor (<<mmapdt>>) *) (**********************************************************************) Section DecoratedTraversable. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T} {A B C: Type} `{Applicative F} `{Applicative G}. (** *** Composition and identity law *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mmapdt U (fun x : Type => x) (allK extract) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mmapdt U (fun x : Type => x) (allK extract) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mmapdt U (fun x : Type => x) (allK extract) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mbinddt U (fun x : Type => x) (mapMret ◻ allK extract) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mbinddt U (fun x : Type => x) (mapMret ◻ allK extract) = mbinddt U (fun a : Type => a) (mret T ◻ allK extract)
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (g : K -> W * B -> G C) (f : K -> W * A -> F B), map (mmapdt U G g) ∘ mmapdt U F f = mmapdt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (g : K -> W * B -> G C) (f : K -> W * A -> F B), map (mmapdt U G g) ∘ mmapdt U F f = mmapdt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B

map (mmapdt U G g) ∘ mmapdt U F f = mmapdt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B

map (mbinddt U G (mapMret ◻ g)) ∘ mbinddt U F (mapMret ◻ f) = mbinddt U (F ∘ G) (mapMret ◻ (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a))))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B

mbinddt U (F ∘ G) ((mapMret ◻ g) ⋆dtm (mapMret ◻ f)) = mbinddt U (F ∘ G) (mapMret ◻ (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a))))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B

mbinddt U (F ∘ G) (fun (k : K) '(w, a) => map (mbinddt (T k) G ((mapMret ◻ g) ◻ allK (incr w))) ((mapMret ◻ f) k (w, a))) = mbinddt U (F ∘ G) (mapMret ◻ (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a))))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B

(fun (k : K) '(w, a) => map (mbinddt (T k) G ((mapMret ◻ g) ◻ allK (incr w))) ((mapMret ◻ f) k (w, a))) = mapMret ◻ (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B
k: K
w: W
a: A

map (mbinddt (T k) G ((mapMret ◻ g) ◻ allK (incr w))) ((mapMret ◻ f) k (w, a)) = (mapMret ◻ (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))) k (w, a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B
k: K
w: W
a: A

map (mbinddt (T k) G (fun (k : K) (a : W * B) => map (mret T k) (g k (incr w a)))) (map (mret T k) (f k (w, a))) = map (mret T k) (map (g k ○ pair w) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B
k: K
w: W
a: A

(map (mbinddt (T k) G (fun (k : K) (a : W * B) => map (mret T k) (g k (incr w a)))) ∘ map (mret T k)) (f k (w, a)) = (map (mret T k) ∘ map (g k ○ pair w)) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B
k: K
w: W
a: A

map (mbinddt (T k) G (fun (k : K) (a : W * B) => map (mret T k) (g k (incr w a))) ∘ mret T k) (f k (w, a)) = (map (mret T k) ∘ map (g k ○ pair w)) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B
k: K
w: W
a: A

map (mbinddt (T k) G (fun (k : K) (a : W * B) => map (mret T k) (g k (incr w a))) ∘ mret T k) (f k (w, a)) = (map (map (mret T k)) ∘ map (g k ○ pair w)) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B
k: K
w: W
a: A

map (mbinddt (T k) G (fun (k : K) (a : W * B) => map (mret T k) (g k (incr w a))) ∘ mret T k) (f k (w, a)) = map (map (mret T k) ∘ (g k ○ pair w)) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B
k: K
w: W
a: A

map ((fun a : W * B => map (mret T k) (g k (incr w a))) ∘ pair Ƶ) (f k (w, a)) = map (map (mret T k) ∘ (g k ○ pair w)) (f k (w, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B
k: K
w: W
a: A

(fun a : W * B => map (mret T k) (g k (incr w a))) ∘ pair Ƶ = map (mret T k) ∘ (g k ○ pair w)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B
k: K
w: W
a: A
b: B

((fun a : W * B => map (mret T k) (g k (incr w a))) ∘ pair Ƶ) b = (map (mret T k) ∘ (g k ○ pair w)) b
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B
k: K
w: W
a: A
b: B

map (mret T k) (g k (incr w (Ƶ, b))) = map (mret T k) (g k (w, b))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B
k: K
w: W
a: A
b: B

map (mret T k) (g k ((incr w ∘ pair Ƶ) b)) = map (mret T k) ((g k ∘ pair w) b)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: K -> W * B -> G C
f: K -> W * A -> F B
k: K
w: W
a: A
b: B

map (mret T k) (g k (w, b)) = map (mret T k) ((g k ∘ pair w) b)
now simpl_monoid. Qed. (** *** Composition with <<mret>> *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (k : K) (f : K -> W * A -> F B), mmapdt (T k) F f ∘ mret T k = map (mret T k) ∘ f k ∘ pair Ƶ
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (k : K) (f : K -> W * A -> F B), mmapdt (T k) F f ∘ mret T k = map (mret T k) ∘ f k ∘ pair Ƶ
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
k: K
f: K -> W * A -> F B

mmapdt (T k) F f ∘ mret T k = map (mret T k) ∘ f k ∘ pair Ƶ
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
k: K
f: K -> W * A -> F B

mbinddt (T k) F (mapMret ◻ f) ∘ mret T k = map (mret T k) ∘ f k ∘ pair Ƶ
now rewrite (dtm_mbinddt_comp_mret W T k F). Qed. (** *** Purity *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mmapdt U F (allK pure ◻ allK extract) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mmapdt U F (allK pure ◻ allK extract) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mmapdt U F (allK pure ◻ allK extract) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mbinddt U F (mapMret ◻ (allK pure ◻ allK extract)) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mbinddt U F ((mapMret ◻ allK pure) ◻ allK extract) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mbinddt U F (((fun k : K => pure) ◻ mret T) ◻ allK extract) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
(fun k : K => pure) ◻ mret T = mapMret ◻ allK pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mbinddt U F (((fun k : K => pure) ◻ mret T) ◻ allK extract) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mbinddt U F ((fun k : K => pure) ◻ (mret T ◻ allK extract)) = pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

pure ∘ mbinddt U (fun x : Type => x) (mret T ◻ allK extract) = pure
now rewrite (dtp_mbinddt_mret W T U).
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

(fun k : K => pure) ◻ mret T = mapMret ◻ allK pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

(fun k : K => pure) ◻ mret T = mapMret ◻ allK pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

(fun k : K => pure ∘ mret T k) = (fun k : K => mapMret k ∘ allK pure k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
k: K

pure ∘ mret T k = mapMret k ∘ allK pure k
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
k: K

pure ∘ mret T k = vec_apply (fun k : K => map) (mret T) k ∘ pure
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
k: K
a: A

(pure ∘ mret T k) a = (vec_apply (fun k : K => map) (mret T) k ∘ pure) a
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
k: K
a: A

pure (mret T k a) = vec_apply (fun k : K => map) (mret T) k (pure a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
k: K
a: A

map (mret T k) (pure a) = vec_apply (fun k : K => map) (mret T) k (pure a)
reflexivity. } Qed. (** *** Composition with special cases on the right *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (g : K -> W * B -> G C) (f : K -> A -> F B), map (mmapdt U G g) ∘ mmapt U F f = mmapdt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (g : K -> W * B -> G C) (f : K -> A -> F B), map (mmapdt U G g) ∘ mmapt U F f = mmapdt U (F ∘ G) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
(* TODO *) Abort.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (g : K -> W * B -> G C) (f : K -> W * A -> B), mmapdt U G g ∘ mmapd U f = mmapdt U G (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (g : K -> W * B -> G C) (f : K -> W * A -> B), mmapdt U G g ∘ mmapd U f = mmapdt U G (fun (k : K) '(w, a) => g k (w, f k (w, a)))
(* TODO *) Abort. (* TODO <<mmapdt_mmap>> *) (** *** Composition with other operations on the left *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (g : K -> W * B -> C) (f : K -> W * A -> F B), map (mmapd U g) ∘ mmapdt U F f = mmapdt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (g : K -> W * B -> C) (f : K -> W * A -> F B), map (mmapd U g) ∘ mmapdt U F f = mmapdt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a)))
(* TODO *) Abort.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (g : K -> B -> C) (f : K -> W * A -> F B), map (mmap U g) ∘ mmapdt U F f = mmapdt U F (fun k : K => map (g k) ∘ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
G: Type -> Type
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (g : K -> B -> C) (f : K -> W * A -> F B), map (mmap U g) ∘ mmapdt U F f = mmapdt U F (fun k : K => map (g k) ∘ f k)
(* TODO *) Abort. (* TODO <<mmap_mmapdt>> *) End DecoratedTraversable. (** ** Traversable Monad (<<mbindt>>) *) (**********************************************************************) Section TraversableMonad. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T} {A B C: Type} (F G: Type -> Type) `{Applicative F} `{Applicative G}. (** *** Composition and identity law *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mbindt U (fun x : Type => x) (mret T) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mbindt U (fun x : Type => x) (mret T) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mbindt U (fun x : Type => x) (mret T) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

mbinddt U (fun x : Type => x) (mret T ◻ allK extract) = id
now rewrite (dtp_mbinddt_mret W T U). Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (g : forall k : K, B -> G (T k C)) (f : forall k : K, A -> F (T k B)), map (mbindt U G g) ∘ mbindt U F f = mbindt U (F ∘ G) (fun k : K => map (mbindt (T k) G g) ○ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (g : forall k : K, B -> G (T k C)) (f : forall k : K, A -> F (T k B)), map (mbindt U G g) ∘ mbindt U F f = mbindt U (F ∘ G) (fun k : K => map (mbindt (T k) G g) ○ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: forall k : K, B -> G (T k C)
f: forall k : K, A -> F (T k B)

map (mbindt U G g) ∘ mbindt U F f = mbindt U (F ∘ G) (fun k : K => map (mbindt (T k) G g) ○ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: forall k : K, B -> G (T k C)
f: forall k : K, A -> F (T k B)

map (mbinddt U G (g ◻ allK extract)) ∘ mbinddt U F (f ◻ allK extract) = mbinddt U (F ∘ G) ((fun k : K => map (mbinddt (T k) G (g ◻ allK extract)) ○ f k) ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: forall k : K, B -> G (T k C)
f: forall k : K, A -> F (T k B)

mbinddt U (F ∘ G) ((g ◻ allK extract) ⋆dtm (f ◻ allK extract)) = mbinddt U (F ∘ G) ((fun k : K => map (mbinddt (T k) G (g ◻ allK extract)) ○ f k) ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: forall k : K, B -> G (T k C)
f: forall k : K, A -> F (T k B)

(g ◻ allK extract) ⋆dtm (f ◻ allK extract) = (fun k : K => map (mbinddt (T k) G (g ◻ allK extract)) ○ f k) ◻ allK extract
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: forall k : K, B -> G (T k C)
f: forall k : K, A -> F (T k B)
k: K
w: W
a: A

((g ◻ allK extract) ⋆dtm (f ◻ allK extract)) k (w, a) = ((fun k : K => map (mbinddt (T k) G (g ◻ allK extract)) ○ f k) ◻ allK extract) k (w, a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: forall k : K, B -> G (T k C)
f: forall k : K, A -> F (T k B)
k: K
w: W
a: A

map (mbinddt (T k) G ((fun k : K => g k ○ allK extract k) ◻ allK (incr w))) (f k a) = map (mbinddt (T k) G (fun k : K => g k ○ allK extract k)) (f k a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: forall k : K, B -> G (T k C)
f: forall k : K, A -> F (T k B)
k: K
w: W
a: A

(fun k : K => g k ○ allK extract k) ◻ allK (incr w) = (fun k : K => g k ○ allK extract k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
g: forall k : K, B -> G (T k C)
f: forall k : K, A -> F (T k B)
k: K
w: W
a: A
k2: K
w2: W
b: B

((fun k : K => g k ○ allK extract k) ◻ allK (incr w)) k2 (w2, b) = g k2 (allK extract k2 (w2, b))
easy. Qed. (** *** Composition with <<mret>> *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (k : K) (f : forall k0 : K, A -> F (T k0 B)), mbindt (T k) F f ∘ mret T k = f k
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G

forall (k : K) (f : forall k0 : K, A -> F (T k0 B)), mbindt (T k) F f ∘ mret T k = f k
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
k: K
f: forall k : K, A -> F (T k B)

mbindt (T k) F f ∘ mret T k = f k
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H2: Applicative G
k: K
f: forall k : K, A -> F (T k B)

mbinddt (T k) F (f ◻ allK extract) ∘ mret T k = f k
now rewrite (dtm_mbinddt_comp_mret W T k F). Qed. (** *** Purity *) (********************************************************************) (* TODO *) (** *** Composition with special cases on the right *) (********************************************************************) (* TODO *) (** *** Composition with special cases on the left *) (********************************************************************) (* TODO *) End TraversableMonad. (** ** Heterogeneous Composition Laws *) (** Composition laws between one of <<mbind>>/<<mmapd>>/<<mmapt>> and another operation, neither of which is a special case of the other. *) (**********************************************************************) Section mixed_composition_laws2. Context (U: Type -> Type) (F G: Type -> Type) `{Applicative F} `{Applicative G} `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T} {A B C: Type}. (** *** <<mbind>> on the left *) (********************************************************************)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : B ~k~> T C) (f : K -> W * A -> B), mbind U g ∘ mmapd U f = mbindd U (g ◻ f)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : B ~k~> T C) (f : K -> W * A -> B), mbind U g ∘ mmapd U f = mbindd U (g ◻ f)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> W * A -> B

mbind U g ∘ mmapd U f = mbindd U (g ◻ f)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> W * A -> B

mbind U g ∘ mbindd U (mret T ◻ f) = mbindd U (g ◻ f)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> W * A -> B

mbindd U (g ◻ allK extract) ∘ mbindd U (mret T ◻ f) = mbindd U (g ◻ f)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> W * A -> B

mbindd U (fun (k : K) '(w, a) => mbindd (T k) ((g ◻ allK extract) ◻ allK (incr w)) ((mret T ◻ f) k (w, a))) = mbindd U (g ◻ f)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> W * A -> B

(fun (k : K) '(w, a) => mbindd (T k) ((g ◻ allK extract) ◻ allK (incr w)) ((mret T ◻ f) k (w, a))) = g ◻ f
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> W * A -> B
k: K
w: W
a: A

mbindd (T k) ((g ◻ allK extract) ◻ allK (incr w)) ((mret T ◻ f) k (w, a)) = (g ◻ f) k (w, a)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> W * A -> B
k: K
w: W
a: A

mbindd (T k) (fun (k : K) (a : W * B) => g k (allK extract k (allK (incr w) k a))) (mret T k (f k (w, a))) = g k (f k (w, a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> W * A -> B
k: K
w: W
a: A

(mbindd (T k) (fun (k : K) (a : W * B) => g k (allK extract k (allK (incr w) k a))) ∘ mret T k) (f k (w, a)) = g k (f k (w, a))
now rewrite (mbindd_comp_mret (T := T)). Qed.
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : B ~k~> T C) (f : K -> A -> F B), map (mbind U g) ∘ mmapt U F f = mbindt U F (fun k : K => map (g k) ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : B ~k~> T C) (f : K -> A -> F B), map (mbind U g) ∘ mmapt U F f = mbindt U F (fun k : K => map (g k) ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B

map (mbind U g) ∘ mmapt U F f = mbindt U F (fun k : K => map (g k) ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B

map (mbind U g) ∘ mbindt U F (mapMret ◻ f) = mbindt U F (fun k : K => map (g k) ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B

map (mbindt U (fun A : Type => A) g) ∘ mbindt U F (mapMret ◻ f) = mbindt U F (fun k : K => map (g k) ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B

mbindt U (F ∘ (fun A : Type => A)) (fun k : K => map (mbindt (T k) (fun A : Type => A) g) ○ (mapMret ◻ f) k) = mbindt U F (fun k : K => map (g k) ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B

Mult_compose F (fun A : Type => A) = Mult_G
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B
(fun k : K => map (mbindt (T k) (fun A : Type => A) g) ○ (mapMret ◻ f) k) = (fun k : K => map (g k) ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B

Mult_compose F (fun A : Type => A) = Mult_G
now rewrite (Mult_compose_identity1 F).
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B

(fun k : K => map (mbindt (T k) (fun A : Type => A) g) ○ (mapMret ◻ f) k) = (fun k : K => map (g k) ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B
k: K
a: A

map (mbindt (T k) (fun A : Type => A) g) ((mapMret ◻ f) k a) = (map (g k) ∘ f k) a
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B
k: K
a: A

map (mbindt (T k) (fun A : Type => A) g) (map (mret T k) (f k a)) = map (g k) (f k a)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B
k: K
a: A

(map (mbindt (T k) (fun A : Type => A) g) ∘ map (mret T k)) (f k a) = map (g k) (f k a)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B
k: K
a: A

map (mbindt (T k) (fun A : Type => A) g ∘ mret T k) (f k a) = map (g k) (f k a)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B
k: K
a: A

mbindt (T k) (fun A : Type => A) g ∘ mret T k = g k
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B
k: K
a: A

mbind (T k) g ∘ mret T k = g k
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B
k: K
a: A

mbindd (T k) (g ◻ allK extract) ∘ mret T k = g k
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: K -> A -> F B
k: K
a: A

(g ◻ allK extract) k ∘ ret = g k
reflexivity. Qed. (** *** <<mmapd>> on the left *) (********************************************************************)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> C) (f : A ~k~> T B), mmapd U g ∘ mbind U f = mbindd U (fun (k : K) '(w, a) => mmapd (T k) (g ◻ allK (incr w)) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> C) (f : A ~k~> T B), mmapd U g ∘ mbind U f = mbindd U (fun (k : K) '(w, a) => mmapd (T k) (g ◻ allK (incr w)) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: A ~k~> T B

mmapd U g ∘ mbind U f = mbindd U (fun (k : K) '(w, a) => mmapd (T k) (g ◻ allK (incr w)) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: A ~k~> T B

mbindd U (mret T ◻ g) ∘ mbind U f = mbindd U (fun (k : K) '(w, a) => mmapd (T k) (g ◻ allK (incr w)) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: A ~k~> T B

mbindd U (mret T ◻ g) ∘ mbindd U (f ◻ allK extract) = mbindd U (fun (k : K) '(w, a) => mmapd (T k) (g ◻ allK (incr w)) (f k a))
now rewrite (mbindd_mbindd U). Qed.
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> C) (f : K -> A -> F B), map (mmapd U g) ∘ mmapt U F f = mmapdt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> C) (f : K -> A -> F B), map (mmapd U g) ∘ mmapt U F f = mmapdt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: K -> A -> F B

map (mmapd U g) ∘ mmapt U F f = mmapdt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: K -> A -> F B

map (mmapdt U (fun A : Type => A) g) ∘ mmapt U F f = mmapdt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: K -> A -> F B

map (mmapdt U (fun A : Type => A) g) ∘ mmapdt U F (f ◻ allK extract) = mmapdt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: K -> A -> F B

mmapdt U (F ∘ (fun A : Type => A)) (fun (k : K) '(w, a) => map (g k ○ pair w) ((f ◻ allK extract) k (w, a))) = mmapdt U F (fun (k : K) '(w, a) => map (g k ○ pair w) (f k a))
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: K -> A -> F B

Mult_compose F (fun A : Type => A) = Mult_G
now rewrite (Mult_compose_identity1 F). Qed. (** *** <<mmapt>> on the left *) (********************************************************************)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> B -> G C) (f : A ~k~> T B), mmapt U G g ∘ mbind U f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> B -> G C) (f : A ~k~> T B), mmapt U G g ∘ mbind U f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

mmapt U G g ∘ mbind U f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

mbindt U G (mapMret ◻ g) ∘ mbind U f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

mbindt U G (mapMret ◻ g) ∘ mbindt U (fun A : Type => A) f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

mbindt U G (fun k : K => map (mret T k) ∘ g k) ∘ mbindt U (fun A : Type => A) f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

map (mbindt U G (fun k : K => map (mret T k) ∘ g k)) ∘ mbindt U (fun A : Type => A) f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

mbindt U ((fun A : Type => A) ∘ G) (fun k : K => map (mbindt (T k) G (fun k0 : K => map (mret T k0) ∘ g k0)) ○ f k) = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

Mult_compose (fun A : Type => A) G = Mult_G0
now rewrite (Mult_compose_identity2 G). Qed.
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> B -> G C) (f : A ~k~> T B), mmapt U G g ∘ mbind U f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> B -> G C) (f : A ~k~> T B), mmapt U G g ∘ mbind U f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

mmapt U G g ∘ mbind U f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

mbindt U G (mapMret ◻ g) ∘ mbind U f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

mbindt U G (mapMret ◻ g) ∘ mbindt U (fun A : Type => A) f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

mbindt U G (fun k : K => map (mret T k) ∘ g k) ∘ mbindt U (fun A : Type => A) f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

map (mbindt U G (fun k : K => map (mret T k) ∘ g k)) ∘ mbindt U (fun A : Type => A) f = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

mbindt U ((fun A : Type => A) ∘ G) (fun k : K => map (mbindt (T k) G (fun k0 : K => map (mret T k0) ∘ g k0)) ○ f k) = mbindt U G (fun k : K => mmapt (T k) G g ∘ f k)
U, F, G: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H: Applicative F
Map_G0: Map G
Pure_G0: Pure G
Mult_G0: Mult G
H0: Applicative G
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H1: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H2: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> G C
f: A ~k~> T B

Mult_compose (fun A : Type => A) G = Mult_G0
now rewrite (Mult_compose_identity2 G). Qed. End mixed_composition_laws2. (** ** Monad (<<mbind>>) *) (**********************************************************************) Section Monad. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T}. (** *** Composition and identity law *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T

forall A : Type, mbind U (fun k : K => mret T k) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T

forall A : Type, mbind U (fun k : K => mret T k) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A: Type

mbind U (fun k : K => mret T k) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A: Type

mbindd U ((fun k : K => mret T k) ◻ allK extract) = id
now rewrite <- (mbindd_id U). Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : B ~k~> T C) (f : A ~k~> T B), mbind U g ∘ mbind U f = mbind U (fun k : K => mbind (T k) g ○ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : B ~k~> T C) (f : A ~k~> T B), mbind U g ∘ mbind U f = mbind U (fun k : K => mbind (T k) g ○ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: A ~k~> T B

mbind U g ∘ mbind U f = mbind U (fun k : K => mbind (T k) g ○ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: A ~k~> T B

mbindd U (g ◻ allK extract) ∘ mbindd U (f ◻ allK extract) = mbindd U ((fun k : K => mbind (T k) g ○ f k) ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: A ~k~> T B

mbindd U (fun (k : K) '(w, a) => mbindd (T k) ((g ◻ allK extract) ◻ allK (incr w)) ((f ◻ allK extract) k (w, a))) = mbindd U ((fun k : K => mbind (T k) g ○ f k) ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: A ~k~> T B

mbindd U (fun (k : K) '(w, a) => mbindd (T k) (fun (k0 : K) (a0 : W * B) => g k0 (allK extract k0 (allK (incr w) k0 a0))) (f k a)) = mbindd U (fun (k : K) (a : W * A) => mbind (T k) g (f k (allK extract k a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: A ~k~> T B

(fun (k : K) '(w, a) => mbindd (T k) (fun (k0 : K) (a0 : W * B) => g k0 (allK extract k0 (allK (incr w) k0 a0))) (f k a)) = (fun (k : K) (a : W * A) => mbind (T k) g (f k (allK extract k a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: A ~k~> T B
k: K
w: W
a: A

mbindd (T k) (fun (k : K) (a : W * B) => g k (allK extract k (allK (incr w) k a))) (f k a) = mbind (T k) g (f k (allK extract k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: A ~k~> T B
k: K
w: W
a: A

mbindd (T k) (fun (k : K) (a : W * B) => g k (allK extract k (allK (incr w) k a))) (f k a) = mbindd (T k) (g ◻ allK extract) (f k (allK extract k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: A ~k~> T B
k: K
w: W
a: A

mbindd (T k) (fun (k : K) (a : W * B) => g k (allK extract k (allK (incr w) k a))) (f k a) = mbindd (T k) (g ◻ allK extract) (f k a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: B ~k~> T C
f: A ~k~> T B
k: K
w: W
a: A

(fun (k : K) (a : W * B) => g k (allK extract k (allK (incr w) k a))) = g ◻ allK extract
now ext j [w2 b]. Qed. (** *** Composition with <<mret>> *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type

forall (k : K) (f : A ~k~> T B) (a : A), mbind (T k) f (mret T k a) = f k a
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type

forall (k : K) (f : A ~k~> T B) (a : A), mbind (T k) f (mret T k a) = f k a
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type
k: K
f: A ~k~> T B
a: A

mbind (T k) f (mret T k a) = f k a
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type
k: K
f: A ~k~> T B
a: A

mbindd (T k) (f ◻ allK extract) (mret T k a) = f k a
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type
k: K
f: A ~k~> T B
a: A

(mbindd (T k) (f ◻ allK extract) ∘ mret T k) a = f k a
now rewrite mbindd_comp_mret. Qed. (* TODO <<mbind_mmap>> *) (* TODO <<mmap_mbind>> *) End Monad. (** ** Decorated Functor (<<mmapd>>) *) (**********************************************************************) Section DecoratedFunctor. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T}. (** *** Composition and identity law *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T

forall A : Type, mmapd U (allK extract) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T

forall A : Type, mmapd U (allK extract) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A: Type

mmapd U (allK extract) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A: Type

mmapdt U (fun A : Type => A) (allK extract) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A: Type

id = id
reflexivity. Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> C) (f : K -> W * A -> B), mmapd U g ∘ mmapd U f = mmapd U (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> W * B -> C) (f : K -> W * A -> B), mmapd U g ∘ mmapd U f = mmapd U (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: K -> W * A -> B

mmapd U g ∘ mmapd U f = mmapd U (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: K -> W * A -> B

mmapdt U (fun A : Type => A) g ∘ mmapdt U (fun A : Type => A) f = mmapdt U (fun A : Type => A) (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: K -> W * A -> B

map (mmapdt U (fun A : Type => A) g) ∘ mmapdt U (fun A : Type => A) f = mmapdt U (fun A : Type => A) (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: K -> W * A -> B

mmapdt U ((fun A : Type => A) ∘ (fun A : Type => A)) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a))) = mmapdt U (fun A : Type => A) (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: K -> W * A -> B

mmapdt U (fun a : Type => a) (fun (k : K) '(w, a) => map (g k ○ pair w) (f k (w, a))) = mmapdt U (fun A : Type => A) (fun (k : K) '(w, a) => g k (w, f k (w, a)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> W * B -> C
f: K -> W * A -> B

Mult_compose (fun A : Type => A) (fun A : Type => A) = Mult_I
now rewrite (Mult_compose_identity1 (fun A => A)). Qed. (** *** Composition with <<mret>> *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type

forall (k : K) (f : K -> W * A -> B) (a : A), mmapd (T k) f (mret T k a) = mret T k (f k (Ƶ, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type

forall (k : K) (f : K -> W * A -> B) (a : A), mmapd (T k) f (mret T k a) = mret T k (f k (Ƶ, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type
k: K
f: K -> W * A -> B
a: A

mmapd (T k) f (mret T k a) = mret T k (f k (Ƶ, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type
k: K
f: K -> W * A -> B
a: A

mmapdt (T k) (fun A : Type => A) f (mret T k a) = mret T k (f k (Ƶ, a))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type
k: K
f: K -> W * A -> B
a: A

(mmapdt (T k) (fun A : Type => A) f ∘ mret T k) a = mret T k (f k (Ƶ, a))
now rewrite (mmapdt_comp_mret (F := fun A => A)). Qed. (* TODO <<mmapd_mmap>> *) (* TODO <<mmap_mmapd>> *) End DecoratedFunctor. (** ** Traversable Functor (<<mmapt>>) *) (**********************************************************************) Section TraversableFunctor. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T}. (** *** Composition and identity law *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T

forall A : Type, mmapt U (fun A0 : Type => A0) (allK id) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T

forall A : Type, mmapt U (fun A0 : Type => A0) (allK id) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A: Type

mmapt U (fun A : Type => A) (allK id) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A: Type

mmapdt U (fun A : Type => A) (allK id ◻ allK extract) = id
now rewrite <- (mbindt_id U). Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (G : Type -> Type) (Map_G : Map G) (Pure_G : Pure G) (Mult_G : Mult G), Applicative G -> forall (F : Type -> Type) (Map_G0 : Map F) (Pure_G0 : Pure F) (Mult_G0 : Mult F), Applicative F -> forall (g : K -> B -> G C) (f : K -> A -> F B), map (mmapt U G g) ∘ mmapt U F f = mmapt U (F ∘ G) (fun k : K => map (g k) ○ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (G : Type -> Type) (Map_G : Map G) (Pure_G : Pure G) (Mult_G : Mult G), Applicative G -> forall (F : Type -> Type) (Map_G0 : Map F) (Pure_G0 : Pure F) (Mult_G0 : Mult F), Applicative F -> forall (g : K -> B -> G C) (f : K -> A -> F B), map (mmapt U G g) ∘ mmapt U F f = mmapt U (F ∘ G) (fun k : K => map (g k) ○ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H1: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H2: Applicative F
g: K -> B -> G C
f: K -> A -> F B

map (mmapt U G g) ∘ mmapt U F f = mmapt U (F ∘ G) (fun k : K => map (g k) ○ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H1: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H2: Applicative F
g: K -> B -> G C
f: K -> A -> F B

map (mmapdt U G (g ◻ allK extract)) ∘ mmapt U F f = mmapt U (F ∘ G) (fun k : K => map (g k) ○ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H1: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H2: Applicative F
g: K -> B -> G C
f: K -> A -> F B

map (mmapdt U G (g ◻ allK extract)) ∘ mmapdt U F (f ◻ allK extract) = mmapt U (F ∘ G) (fun k : K => map (g k) ○ f k)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H1: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H2: Applicative F
g: K -> B -> G C
f: K -> A -> F B

map (mmapdt U G (g ◻ allK extract)) ∘ mmapdt U F (f ◻ allK extract) = mmapdt U (F ∘ G) ((fun k : K => map (g k) ○ f k) ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H1: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H2: Applicative F
g: K -> B -> G C
f: K -> A -> F B

mmapdt U (F ∘ G) (fun (k : K) '(w, a) => map ((g ◻ allK extract) k ○ pair w) ((f ◻ allK extract) k (w, a))) = mmapdt U (F ∘ G) ((fun k : K => map (g k) ○ f k) ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H1: Applicative G
F: Type -> Type
Map_G0: Map F
Pure_G0: Pure F
Mult_G0: Mult F
H2: Applicative F
g: K -> B -> G C
f: K -> A -> F B

(fun (k : K) '(w, a) => map ((g ◻ allK extract) k ○ pair w) ((f ◻ allK extract) k (w, a))) = (fun k : K => map (g k) ○ f k) ◻ allK extract
now ext k [w a]. Qed. (** *** Composition with <<mret>> *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type

forall (F : Type -> Type) (Map_G : Map F) (Pure_G : Pure F) (Mult_G : Mult F), Applicative F -> forall (k : K) (f : K -> A -> F B) (a : A), mmapt (T k) F f (mret T k a) = map (mret T k) (f k a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type

forall (F : Type -> Type) (Map_G : Map F) (Pure_G : Pure F) (Mult_G : Mult F), Applicative F -> forall (k : K) (f : K -> A -> F B) (a : A), mmapt (T k) F f (mret T k a) = map (mret T k) (f k a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
k: K
f: K -> A -> F B
a: A

mmapt (T k) F f (mret T k a) = map (mret T k) (f k a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
k: K
f: K -> A -> F B
a: A

mmapdt (T k) F (f ◻ allK extract) (mret T k a) = map (mret T k) (f k a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type
F: Type -> Type
Map_G: Map F
Pure_G: Pure F
Mult_G: Mult F
H1: Applicative F
k: K
f: K -> A -> F B
a: A

(mmapdt (T k) F (f ◻ allK extract) ∘ mret T k) a = map (mret T k) (f k a)
now rewrite mmapdt_comp_mret. Qed. (* TODO <<mmapt_mmap>> *) (* TODO <<mmap_mmapt>> *) End TraversableFunctor. (** ** Functor (<<mmap>>) *) (**********************************************************************) Section Functor. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T}. (** *** Composition and identity law *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T

forall A : Type, mmap U (allK id) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T

forall A : Type, mmap U (allK id) = id
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A: Type

mmap U (allK id) = id
apply (dtp_mbinddt_mret W T U). Qed.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> B -> C) (f : K -> A -> B), mmap U g ∘ mmap U f = mmap U (g ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type

forall (g : K -> B -> C) (f : K -> A -> B), mmap U g ∘ mmap U f = mmap U (g ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> C
f: K -> A -> B

mmap U g ∘ mmap U f = mmap U (g ◻ f)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> C
f: K -> A -> B

mmapd U (g ◻ allK extract) ∘ mmapd U (f ◻ allK extract) = mmapd U ((g ◻ f) ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> C
f: K -> A -> B

mmapd U (fun (k : K) '(w, a) => (g ◻ allK extract) k (w, (f ◻ allK extract) k (w, a))) = mmapd U ((g ◻ f) ◻ allK extract)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B, C: Type
g: K -> B -> C
f: K -> A -> B

(fun (k : K) '(w, a) => (g ◻ allK extract) k (w, (f ◻ allK extract) k (w, a))) = (g ◻ f) ◻ allK extract
now ext k [w a]. Qed. (** *** Composition with <<mret>> *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type

forall (f : K -> A -> B) (a : A) (k : K), mmap (T k) f (mret T k a) = mret T k (f k a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type

forall (f : K -> A -> B) (a : A) (k : K), mmap (T k) f (mret T k a) = mret T k (f k a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type
f: K -> A -> B
a: A
k: K

mmap (T k) f (mret T k a) = mret T k (f k a)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
A, B: Type
f: K -> A -> B
a: A
k: K

mmapd (T k) (f ◻ allK extract) (mret T k a) = mret T k (f k a)
now rewrite mmapd_comp_mret. Qed. End Functor.