Built with Alectryon, running Coq+SerAPI v8.16.0+0.16.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
From Tealeaves Require Import
  Classes.Multisorted.DecoratedTraversableMonad
  Classes.Multisorted.Theory.Container
  Categories.TypeFamily
  Functors.List
  Functors.Constant.

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

#[local] Generalizable Variables A B C F G W S T K.

(** * Targeted substitution-building combinators: [btg] and [btgd] *)
(**********************************************************************)
(* TODO: Define a version that works for applicative effects. *)
(*
  #[program] Definition btga `{ix: Index} `{Map F} `{Pure F} `{Mult F}
  {A W: Type} (T: K -> Type -> Type) `{! MReturn T}
  (j: K) (f: W * A -> F (T j A)): forall (k: K), W * A -> F (T k A) :=
  fun k '(w, a) => if k == j then f (w, a) else pure ∘ mret T k a.
 *)

Require Import Coq.Program.Equality.

#[program] Definition btgd `{ix: Index} {A W: Type}
  {T: K -> Type -> Type} `{! MReturn T}
  (j: K) (f: W * A -> T j A): forall (k: K), W * A -> T k A :=
  fun k '(w, a) => if k == j then f (w, a) else mret T k a.

#[program] Definition btg `{ix: Index} {A: Type}
  {T: K -> Type -> Type} `{! MReturn T}
  (j: K) (f: A -> T j A): forall (k: K), A -> T k A :=
  fun k => if k == j then f else mret T k.

Require Import Coq.Program.Equality.

Section btg_lemmas.

  Context
    `{ix: Index}.

  Context
    `{MReturn T}
    {W A: Type}.

  
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type

forall (k : K) (f : W * A -> T k A), btgd k f k = f
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type

forall (k : K) (f : W * A -> T k A), btgd k f k = f
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k: K
f: W * A -> T k A

btgd k f k = f
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k: K
f: W * A -> T k A

(fun pat : W * A => (let '(w, a) as anonymous' := pat return (anonymous' = pat -> T k A) in fun Heq_anonymous : (w, a) = pat => match k == k with | left x => rew [fun H : K => T H A] btgd_obligation_1 ix0 A W k k pat w a Heq_anonymous x in f (w, a) | right _ => mret T k a end) eq_refl) = f
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k: K
f: W * A -> T k A
w: W
a: A

match k == k with | left x => rew [fun H : K => T H A] btgd_obligation_1 ix0 A W k k (w, a) w a eq_refl x in f (w, a) | right _ => mret T k a end = f (w, a)
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k: K
f: W * A -> T k A
w: W
a: A
DESTR_EQ, DESTR_EQs: k = k

rew [fun H : K => T H A] btgd_obligation_1 ix0 A W k k (w, a) w a eq_refl DESTR_EQ in f (w, a) = f (w, a)
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k: K
f: W * A -> T k A
w: W
a: A
DESTR_EQs: k = k

rew [fun H : K => T H A] btgd_obligation_1 ix0 A W k k (w, a) w a eq_refl eq_refl in f (w, a) = f (w, a)
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k: K
f: W * A -> T k A
w: W
a: A
DESTR_EQs: k = k

f (w, a) = f (w, a)
reflexivity. Qed.
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type

forall (k j : K) (f : W * A -> T j A), k <> j -> btgd j f k = mret T k ∘ extract
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type

forall (k j : K) (f : W * A -> T j A), k <> j -> btgd j f k = mret T k ∘ extract
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k, j: K
f: W * A -> T j A

k <> j -> btgd j f k = mret T k ∘ extract
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k, j: K
f: W * A -> T j A

k <> j -> (fun pat : W * A => (let '(w, a) as anonymous' := pat return (anonymous' = pat -> T k A) in fun Heq_anonymous : (w, a) = pat => match k == j with | left x => rew [fun H : K => T H A] btgd_obligation_1 ix0 A W j k pat w a Heq_anonymous x in f (w, a) | right _ => mret T k a end) eq_refl) = mret T k ∘ extract
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k, j: K
f: W * A -> T j A
hyp: k <> j

(fun pat : W * A => (let '(w, a) as anonymous' := pat return (anonymous' = pat -> T k A) in fun Heq_anonymous : (w, a) = pat => match k == j with | left x => rew [fun H : K => T H A] btgd_obligation_1 ix0 A W j k pat w a Heq_anonymous x in f (w, a) | right _ => mret T k a end) eq_refl) = mret T k ∘ extract
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k, j: K
f: W * A -> T j A
hyp: k <> j
w: W
a: A

match k == j with | left x => rew [fun H : K => T H A] btgd_obligation_1 ix0 A W j k (w, a) w a eq_refl x in f (w, a) | right _ => mret T k a end = (mret T k ∘ extract) (w, a)
compare values k and j. Qed.
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
j: K

btgd j (mret T j ∘ extract) = mret T ◻ allK extract
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
j: K

btgd j (mret T j ∘ extract) = mret T ◻ allK extract
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
j: K

(fun (k : K) (pat : W * A) => (let '(w, a) as anonymous' := pat return (anonymous' = pat -> T k A) in fun Heq_anonymous : (w, a) = pat => match k == j with | left x => rew [fun H : K => T H A] btgd_obligation_1 ix0 A W j k pat w a Heq_anonymous x in (mret T j ∘ extract) (w, a) | right _ => mret T k a end) eq_refl) = mret T ◻ allK extract
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
j, k: K
w: W
a: A

match k == j with | left x => rew [fun H : K => T H A] btgd_obligation_1 ix0 A W j k (w, a) w a eq_refl x in (mret T j ∘ extract) (w, a) | right _ => mret T k a end = (mret T ◻ allK extract) k (w, a)
compare values k and j. Qed.
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type

forall (k : K) (f : A -> T k A), btg k f k = f
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type

forall (k : K) (f : A -> T k A), btg k f k = f
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k: K
f: A -> T k A

btg k f k = f
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k: K
f: A -> T k A

match k == k with | left x => fun x0 : A => rew [fun H : K => T H A] btg_obligation_1 ix0 k k x in f x0 | right _ => mret T k end = f
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k: K
f: A -> T k A
DESTR_EQ, DESTR_EQs: k = k

(fun x : A => rew [fun H : K => T H A] btg_obligation_1 ix0 k k DESTR_EQ in f x) = f
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k: K
f: A -> T k A
DESTR_EQs: k = k

(fun x : A => rew [fun H : K => T H A] btg_obligation_1 ix0 k k eq_refl in f x) = f
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k: K
f: A -> T k A
DESTR_EQs: k = k

(fun x : A => f x) = f
reflexivity. Qed.
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type

forall (k j : K) (f : A -> T j A), k <> j -> btg j f k = mret T k
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type

forall (k j : K) (f : A -> T j A), k <> j -> btg j f k = mret T k
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k, j: K
f: A -> T j A

k <> j -> btg j f k = mret T k
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k, j: K
f: A -> T j A

k <> j -> match k == j with | left x => fun x0 : A => rew [fun H : K => T H A] btg_obligation_1 ix0 j k x in f x0 | right _ => mret T k end = mret T k
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
k, j: K
f: A -> T j A
hyp: k <> j

match k == j with | left x => fun x0 : A => rew [fun H : K => T H A] btg_obligation_1 ix0 j k x in f x0 | right _ => mret T k end = mret T k
compare values k and j. Qed.
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
j: K

btg j (mret T j) = mret T
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
j: K

btg j (mret T j) = mret T
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
j: K

(fun k : K => match k == j with | left x => fun x0 : A => rew [fun H : K => T H A] btg_obligation_1 ix0 j k x in mret T j x0 | right _ => mret T k end) = mret T
ix, ix0: Index
T: K -> Type -> Type
H: MReturn T
W, A: Type
j, k: K

match k == j with | left x => fun x0 : A => rew [fun H : K => T H A] btg_obligation_1 ix0 j k x in mret T j x0 | right _ => mret T k end = mret T k
compare values k and j. Qed. End btg_lemmas. (** ** Rewrite Hint registration *) (**********************************************************************) #[export] Hint Rewrite @btg_eq @btg_id @btgd_eq @btgd_id: tea_tgt. #[export] Hint Rewrite @tgtd_eq @tgtd_eq @tgtd_id: tea_tgt. #[export] Hint Rewrite @btgd_neq @btg_neq using auto: tea_tgt. #[export] Hint Rewrite @btgd_eq @btg_eq @btg_id @btgd_id: tea_tgt_eq. #[export] Hint Rewrite @tgtd_eq @tgt_eq @tgt_id: tea_tgt_eq. #[export] Hint Rewrite @btgd_neq @btg_neq using auto: tea_tgt_neq. #[export] Hint Rewrite @tgtd_neq: tea_tgt_neq. (** ** Derived targeted DTM operations *) (**********************************************************************) Section DTM_targeted. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} (j: K). (** *** Definitions *) (* For now we ignore traversals because we don't need them for System F. *) (********************************************************************) Definition kbindd {A} `(f: W * A -> T j A): U A -> U A := mbindd U (btgd j f). Definition kbind `(f: A -> T j A): U A -> U A := mbind U (btg j f). Definition kmapd `(f: W * A -> A): U A -> U A := mmapd U (tgtd j f). Definition kmap `(f: A -> A): U A -> U A := mmap U (tgt j f). Section traversals. Context `{Applicative G}. Definition tgtdt {A} (k: K) (f: W * A -> G A): W * A -k-> G A := fun j '(w, a) => if k == j then f (w, a) else pure a. Definition tgtdt_def {A B} (k: K) (f def: W * A -> G B): W * A -k-> G B := fun j => if k == j then f else def. Definition tgtt {A} (k: K) (f: A -> G A): A -k-> G A := fun j => if k == j then f else pure. Definition tgtt_def {A B} (k: K) (f def: A -> G B): A -k-> G B := fun j => if k == j then f else def. Definition kmapdt `(f: W * A -> G A): U A -> G (U A) := mmapdt U G (tgtdt j f). Definition ktraverse `(f: A -> G A): U A -> G (U A) := mmapt U G (tgtt j 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
j: K
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H1: Applicative G
A: Type
f: W * A -> G A

kmapdt f = mmapdt U G (tgtdt j 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
j: K
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H1: Applicative G
A: Type
f: W * A -> G A

kmapdt f = mmapdt U G (tgtdt j 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
j: K
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H1: Applicative G
A: Type
f: A -> G A

ktraverse f = mmapt U G (tgtt j 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
j: K
G: Type -> Type
Map_G: Map G
Pure_G: Pure G
Mult_G: Mult G
H1: Applicative G
A: Type
f: A -> G A

ktraverse f = mmapt U G (tgtt j f)
reflexivity. Qed. End traversals. Section special_cases. Context {A: Type}. (** *** Rewriting rules for special cases of <<kbindd>> *) (******************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
j: K
A: Type
f: A -> T j A

kbind f = kbindd (f ∘ 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
j: K
A: Type
f: A -> T j A

kbind f = kbindd (f ∘ 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
j: K
A: Type
f: A -> T j A

mbind U (btg j f) = mbindd U (btgd j (f ∘ 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
j: K
A: Type
f: A -> T j A

mbindd U (btg j f ◻ allK extract) = mbindd U (btgd j (f ∘ 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
j: K
A: Type
f: A -> T j A

btg j f ◻ allK extract = btgd j (f ∘ 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
j: K
A: Type
f: A -> T j A
k: K
w: W
a: A

(btg j f ◻ allK extract) k (w, a) = btgd j (f ∘ 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
j: K
A: Type
f: A -> T j A
k: K
w: W
a: A

btg j f k a = match k == j with | left x => rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl x in f a | right _ => mret T k a end
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
j: K
A: Type
f: A -> T j A
w: W
a: A
DESTR_EQs: j = j

btg j f j a = rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl eq_refl in f 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
j: K
A: Type
f: A -> T j A
k: K
w: W
a: A
DESTR_NEQ: k <> j
DESTR_NEQs: j <> k
btg j f k a = mret T 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
j: K
A: Type
f: A -> T j A
w: W
a: A
DESTR_EQs: j = j

btg j f j a = rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl eq_refl in f 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
j: K
A: Type
f: A -> T j A
w: W
a: A
DESTR_EQs: j = j

f a = rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl eq_refl in f a
easy.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
j: K
A: Type
f: A -> T j A
k: K
w: W
a: A
DESTR_NEQ: k <> j
DESTR_NEQs: j <> k

btg j f k a = mret T 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
j: K
A: Type
f: A -> T j A
k: K
w: W
a: A
DESTR_NEQ: k <> j
DESTR_NEQs: j <> k

mret T k a = mret T k a
easy. 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
j: K
A: Type
f: W * A -> A

kmapd f = kbindd (mret T j ∘ 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
j: K
A: Type
f: W * A -> A

kmapd f = kbindd (mret T j ∘ 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
j: K
A: Type
f: W * A -> A

mmapd U (tgtd j f) = mbindd U (btgd j (mret T j ∘ 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
j: K
A: Type
f: W * A -> A

mbindd U (mret T ◻ tgtd j f) = mbindd U (btgd j (mret T j ∘ 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
j: K
A: Type
f: W * A -> A

mret T ◻ tgtd j f = btgd j (mret T j ∘ 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
j: K
A: Type
f: W * A -> A
k: K
w: W
a: A

(mret T ◻ tgtd j f) k (w, a) = btgd j (mret T j ∘ 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
j: K
A: Type
f: W * A -> A
k: K
w: W
a: A

mret T k (tgtd j f k (w, a)) = btgd j (mret T j ○ 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
j: K
A: Type
f: W * A -> A
k: K
w: W
a: A

mret T k (if k == j then f (w, a) else a) = match k == j with | left x => rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl x in mret T j (f (w, a)) | right _ => mret T k a end
compare values k and j. 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
j: K
A: Type
f: A -> A

kmap f = kbindd (mret T j ∘ f ∘ 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
j: K
A: Type
f: A -> A

kmap f = kbindd (mret T j ∘ f ∘ 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
j: K
A: Type
f: A -> A

mmap U (tgt j f) = mbindd U (btgd j (mret T j ∘ f ∘ 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
j: K
A: Type
f: A -> A

mbindd U ((mret T ◻ tgt j f) ◻ allK extract) = mbindd U (btgd j (mret T j ∘ f ∘ 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
j: K
A: Type
f: A -> A

(mret T ◻ tgt j f) ◻ allK extract = btgd j (mret T j ∘ f ∘ 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
j: K
A: Type
f: A -> A
k: K
w: W
a: A

((mret T ◻ tgt j f) ◻ allK extract) k (w, a) = btgd j (mret T j ∘ f ∘ 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
j: K
A: Type
f: A -> A
k: K
w: W
a: A

mret T k (tgt j f k (allK extract k (w, a))) = btgd j (fun a : W * A => mret T j (f (extract 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
j: K
A: Type
f: A -> A
k: K
w: W
a: A

mret T k (tgt j f k a) = match k == j with | left x => rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl x in mret T j (f a) | right _ => mret T k a end
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
j: K
A: Type
f: A -> A
w: W
a: A
DESTR_EQs: j = j

mret T j (tgt j f j a) = rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl eq_refl in mret T j (f 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
j: K
A: Type
f: A -> A
k: K
w: W
a: A
DESTR_NEQ: k <> j
DESTR_NEQs: j <> k
mret T k (tgt j f k a) = mret T 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
j: K
A: Type
f: A -> A
w: W
a: A
DESTR_EQs: j = j

mret T j (tgt j f j a) = mret T j (f 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
j: K
A: Type
f: A -> A
k: K
w: W
a: A
DESTR_NEQ: k <> j
DESTR_NEQs: j <> k
mret T k (tgt j f k a) = mret T 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
j: K
A: Type
f: A -> A
k: K
w: W
a: A
DESTR_NEQ: k <> j
DESTR_NEQs: j <> k

mret T k (tgt j f k a) = mret T k a
now autorewrite with tea_tgt_neq. Qed. (** *** Rewriting rules for special cases of <<kmapd>> *) (******************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
j: K
A: Type
f: A -> A

kmap f = kmapd (f ∘ 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
j: K
A: Type
f: A -> A

kmap f = kmapd (f ∘ 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
j: K
A: Type
f: A -> A

mmap U (tgt j f) = kmapd (f ∘ 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
j: K
A: Type
f: A -> A

mmap U (tgt j f) = mmapd U (tgtd j (f ∘ 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
j: K
A: Type
f: A -> A

mmapd U (tgt j f ◻ allK extract) = mmapd U (tgtd j (f ∘ 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
j: K
A: Type
f: A -> A

tgt j f ◻ allK extract = tgtd j (f ∘ 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
j: K
A: Type
f: A -> A
k: K

(tgt j f ◻ allK extract) k = tgtd j (f ∘ 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
j: K
A: Type
f: A -> A
k: K

tgt j f k ∘ allK extract k = tgtd j (f ∘ 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
A: Type
f: A -> A
k: K
DESTR_EQs: k = k

tgt k f k ∘ allK extract k = tgtd k (f ∘ 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
j: K
A: Type
f: A -> A
k: K
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j
tgt j f k ∘ allK extract k = tgtd j (f ∘ 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
j: K
A: Type
f: A -> A
k: K
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

tgt j f k ∘ allK extract k = tgtd j (f ∘ extract) k
now autorewrite with tea_tgt_neq. Qed. (** *** Rewriting rules for special cases of <<kbind>> *) (******************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
j: K
A: Type
f: A -> A

kmap f = kbind (mret T j ∘ 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
j: K
A: Type
f: A -> A

kmap f = kbind (mret T j ∘ 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
j: K
A: Type
f: A -> A

mmap U (tgt j f) = mbind U (btg j (mret T j ∘ 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
j: K
A: Type
f: A -> A

mbind U (mret T ◻ tgt j f) = mbind U (btg j (mret T j ∘ 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
j: K
A: Type
f: A -> A

mret T ◻ tgt j f = btg j (mret T j ∘ 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
j: K
A: Type
f: A -> A
k: K

(mret T ◻ tgt j f) k = btg j (mret T j ∘ 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
j: K
A: Type
f: A -> A
k: K

mret T k ∘ tgt j f k = btg j (mret T j ∘ 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
A: Type
f: A -> A
k: K
DESTR_EQs: k = k

mret T k ∘ tgt k f k = btg k (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
j: K
A: Type
f: A -> A
k: K
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j
mret T k ∘ tgt j f k = btg j (mret T j ∘ 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
j: K
A: Type
f: A -> A
k: K
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

mret T k ∘ tgt j f k = btg j (mret T j ∘ f) k
now autorewrite with tea_tgt_neq. Qed. End special_cases. End DTM_targeted. (** ** Decorated monad (<<kbindd>>) *) (**********************************************************************) Definition compose_kdm `{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)} `{! MReturn T} {j: K} {A: Type} (g: W * A -> T j A) (f: W * A -> T j A): W * A -> T j A := fun '(w, a) => kbindd (T j) j (g ∘ incr w) (f (w, a)). Infix "⋆kdm" := compose_kdm (at level 40). Section DecoratedMonad. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T} {j: K} {A: 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
j: K
A: Type

kbindd U j (mret T j ∘ 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
j: K
A: Type

kbindd U j (mret T j ∘ 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
j: K
A: Type

kbindd U j (mret T j ∘ 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
j: K
A: Type

mbindd U (btgd j (mret T j ∘ 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
j: K
A: Type

mbindd U (btgd j (mret T j ∘ extract)) = mbindd U (mret T ◻ 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
j: K
A: Type

btgd j (mret T j ∘ extract) = mret T ◻ 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
j: K
A: Type
k: K
w: W
a: A

btgd j (mret T j ∘ extract) k (w, a) = (mret T ◻ 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
j: K
A: Type
k: K
w: W
a: A

match k == j with | left x => rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl x in (mret T j ∘ extract) (w, a) | right _ => mret T k a end = (mret T ◻ allK extract) k (w, a)
compare values k and j. 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
j: K
A: Type

forall g f : W * A -> T j A, kbindd U j g ∘ kbindd U j f = kbindd U j (g ⋆kdm 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
j: K
A: Type

forall g f : W * A -> T j A, kbindd U j g ∘ kbindd U j f = kbindd U j (g ⋆kdm 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
j: K
A: Type
g, f: W * A -> T j A

kbindd U j g ∘ kbindd U j f = kbindd U j (g ⋆kdm 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
j: K
A: Type
g, f: W * A -> T j A

mbindd U (btgd j g) ∘ mbindd U (btgd j f) = mbindd U (btgd j (g ⋆kdm 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
j: K
A: Type
g, f: W * A -> T j A

mbindd U (fun (k : K) '(w, a) => mbindd (T k) (btgd j g ◻ allK (incr w)) (btgd j f k (w, a))) = mbindd U (btgd j (g ⋆kdm 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
j: K
A: Type
g, f: W * A -> T j A

(fun (k : K) '(w, a) => mbindd (T k) (btgd j g ◻ allK (incr w)) (btgd j f k (w, a))) = btgd j (g ⋆kdm 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
j: K
A: Type
g, f: W * A -> T j A
k: K
w: W
a: A

mbindd (T k) (btgd j g ◻ allK (incr w)) (btgd j f k (w, a)) = btgd j (g ⋆kdm 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
j: K
A: Type
g, f: W * A -> T j A
k: K
w: W
a: A

mbindd (T k) (btgd j g ◻ allK (incr w)) match k == j with | left x => rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl x in f (w, a) | right _ => mret T k a end = match k == j with | left x => rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl x in kbindd (T j) j (g ∘ incr w) (f (w, a)) | right _ => mret T k a end
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
g, f: W * A -> T j A
w: W
a: A
DESTR_EQs: j = j

mbindd (T j) (btgd j g ◻ allK (incr w)) (rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl eq_refl in f (w, a)) = rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl eq_refl in kbindd (T j) j (g ∘ incr w) (f (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
j: K
A: Type
g, f: W * A -> T j A
k: K
w: W
a: A
DESTR_NEQ: k <> j
DESTR_NEQs: j <> k
mbindd (T k) (btgd j g ◻ allK (incr w)) (mret T k a) = mret T 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
j: K
A: Type
g, f: W * A -> T j A
w: W
a: A
DESTR_EQs: j = j

mbindd (T j) (btgd j g ◻ allK (incr w)) (rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl eq_refl in f (w, a)) = rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl eq_refl in kbindd (T j) j (g ∘ incr w) (f (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
j: K
A: Type
g, f: W * A -> T j A
w: W
a: A
DESTR_EQs: j = j

mbindd (T j) (btgd j g ◻ allK (incr w)) (f (w, a)) = kbindd (T j) j (g ∘ incr w) (f (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
j: K
A: Type
g, f: W * A -> T j A
w: W
a: A
DESTR_EQs: j = j

mbindd (T j) (btgd j g ◻ allK (incr w)) (f (w, a)) = mbindd (T j) (btgd j (g ∘ incr w)) (f (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
j: K
A: Type
g, f: W * A -> T j A
w: W
a: A
DESTR_EQs: j = j

btgd j g ◻ allK (incr w) = btgd j (g ∘ incr 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
j: K
A: Type
g, f: W * A -> T j A
w: W
a: A
DESTR_EQs: j = j
k: K
w': W
a': A

(btgd j g ◻ allK (incr w)) k (w', a') = btgd j (g ∘ incr w) k (w', a')
compare values k and j.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
g, f: W * A -> T j A
k: K
w: W
a: A
DESTR_NEQ: k <> j
DESTR_NEQs: j <> k

mbindd (T k) (btgd j g ◻ allK (incr w)) (mret T k a) = mret T 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
j: K
A: Type
g, f: W * A -> T j A
k: K
w: W
a: A
DESTR_NEQ: k <> j
DESTR_NEQs: j <> k

(mbindd (T k) (btgd j g ◻ allK (incr w)) ∘ mret T k) a = mret T 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
j: K
A: Type
g, f: W * A -> T j A
k: K
w: W
a: A
DESTR_NEQ: k <> j
DESTR_NEQs: j <> k

((btgd j g ◻ allK (incr w)) k ∘ Monad.ret) a = mret T 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
j: K
A: Type
g, f: W * A -> T j A
k: K
w: W
a: A
DESTR_NEQ: k <> j
DESTR_NEQs: j <> k

match k == j with | left x => rew [fun H : K => T H A] eq_ind_r (fun k : K => j = k) eq_refl x in g (w ● Ƶ, a) | right _ => mret T k a end = mret T k a
compare values k and j. 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
j: K
A: Type

forall i : K, j <> i -> forall (g : W * A -> T i A) (f : W * A -> T j A), kbindd U i g ∘ kbindd U j f = mbindd U (btgd i g ⋆dm btgd j 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
j: K
A: Type

forall i : K, j <> i -> forall (g : W * A -> T i A) (f : W * A -> T j A), kbindd U i g ∘ kbindd U j f = mbindd U (btgd i g ⋆dm btgd j 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
j: K
A: Type
i: K
Hneq: j <> i
g: W * A -> T i A
f: W * A -> T j A

kbindd U i g ∘ kbindd U j f = mbindd U (btgd i g ⋆dm btgd j 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
j: K
A: Type
i: K
Hneq: j <> i
g: W * A -> T i A
f: W * A -> T j A

mbindd U (btgd i g) ∘ mbindd U (btgd j f) = mbindd U (btgd i g ⋆dm btgd j f)
now rewrite (mbindd_mbindd U). 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
j: K
A: Type

forall (f : W * A -> T j A) (a : A), kbindd (T j) j f (mret T j a) = f (Ƶ, 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
j: K
A: Type

forall (f : W * A -> T j A) (a : A), kbindd (T j) j f (mret T j a) = f (Ƶ, 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
j: K
A: Type
f: W * A -> T j A
a: A

kbindd (T j) j f (mret T j a) = f (Ƶ, 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
j: K
A: Type
f: W * A -> T j A
a: A

mbindd (T j) (btgd j f) (mret T j a) = f (Ƶ, 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
j: K
A: Type
f: W * A -> T j A
a: A

(mbindd (T j) (btgd j f) ∘ mret T j) a = f (Ƶ, 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
j: K
A: Type
f: W * A -> T j A
a: A

(btgd j f j ∘ Monad.ret) a = f (Ƶ, a)
now autorewrite with tea_tgt_eq. 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
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> T j A) (a : A), kbindd (T i) j f (mret T i a) = mret T i 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
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> T j A) (a : A), kbindd (T i) j f (mret T i a) = mret T i 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
a: A

kbindd (T i) j f (mret T i a) = mret T i 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
a: A

mbindd (T i) (btgd j f) (mret T i a) = mret T i 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
a: A

(mbindd (T i) (btgd j f) ∘ mret T i) a = mret T i 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
a: A

(btgd j f i ∘ Monad.ret) a = mret T i a
now autorewrite with tea_tgt_neq. Qed. (** *** Composition with special cases *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall (g : W * A -> A) (f : W * A -> T j A), kmapd U j g ∘ kbindd U j f = kbindd U j (fun '(w, a) => kmapd (T j) j (g ∘ incr w) (f (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
j: K
A: Type

forall (g : W * A -> A) (f : W * A -> T j A), kmapd U j g ∘ kbindd U j f = kbindd U j (fun '(w, a) => kmapd (T j) j (g ∘ incr w) (f (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
j: K
A: Type
g: W * A -> A
f: W * A -> T j A

kmapd U j g ∘ kbindd U j f = kbindd U j (fun '(w, a) => kmapd (T j) j (g ∘ incr w) (f (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
j: K
A: Type
g: W * A -> A
f: W * A -> T j A

kbindd U j (mret T j ∘ g) ∘ kbindd U j f = kbindd U j (fun '(w, a) => kmapd (T j) j (g ∘ incr w) (f (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
j: K
A: Type
g: W * A -> A
f: W * A -> T j A

kbindd U j ((mret T j ∘ g) ⋆kdm f) = kbindd U j (fun '(w, a) => kmapd (T j) j (g ∘ incr w) (f (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
j: K
A: Type
g: W * A -> A
f: W * A -> T j A

(mret T j ∘ g) ⋆kdm f = (fun '(w, a) => kmapd (T j) j (g ∘ incr w) (f (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
j: K
A: Type
g: W * A -> A
f: W * A -> T j A

(fun '(w, a) => kbindd (T j) j (mret T j ∘ g ∘ incr w) (f (w, a))) = (fun '(w, a) => kmapd (T j) j (g ∘ incr w) (f (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
j: K
A: Type
g: W * A -> A
f: W * A -> T j A
w: W
a: A

kbindd (T j) j (mret T j ∘ g ∘ incr w) (f (w, a)) = kmapd (T j) j (g ∘ incr w) (f (w, a))
now rewrite kmapd_to_kbindd. 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
j: K
A: Type

forall (g : A -> T j A) (f : W * A -> T j A), kbind U j g ∘ kbindd U j f = kbindd U j (kbind (T j) j 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
j: K
A: Type

forall (g : A -> T j A) (f : W * A -> T j A), kbind U j g ∘ kbindd U j f = kbindd U j (kbind (T j) j 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
j: K
A: Type
g: A -> T j A
f: W * A -> T j A

kbind U j g ∘ kbindd U j f = kbindd U j (kbind (T j) j 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
j: K
A: Type
g: A -> T j A
f: W * A -> T j A

kbindd U j (g ∘ extract) ∘ kbindd U j f = kbindd U j (kbind (T j) j 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
j: K
A: Type
g: A -> T j A
f: W * A -> T j A

kbindd U j ((g ∘ extract) ⋆kdm f) = kbindd U j (kbind (T j) j 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
j: K
A: Type
g: A -> T j A
f: W * A -> T j A

(g ∘ extract) ⋆kdm f = kbind (T j) j 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
j: K
A: Type
g: A -> T j A
f: W * A -> T j A

(fun '(w, a) => kbindd (T j) j (g ∘ extract ∘ incr w) (f (w, a))) = kbind (T j) j 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
j: K
A: Type
g: A -> T j A
f: W * A -> T j A
w: W
a: A

kbindd (T j) j (g ∘ extract ∘ incr w) (f (w, a)) = (kbind (T j) j g ∘ f) (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
j: K
A: Type
g: A -> T j A
f: W * A -> T j A
w: W
a: A

kbindd (T j) j (g ∘ (extract ∘ incr w)) (f (w, a)) = (kbind (T j) j g ∘ f) (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
j: K
A: Type
g: A -> T j A
f: W * A -> T j A
w: W
a: A

kbindd (T j) j (g ∘ extract) (f (w, a)) = (kbind (T j) j g ∘ f) (w, a)
now rewrite kbind_to_kbindd. 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
j: K
A: Type

forall (g : A -> A) (f : W * A -> T j A), kmap U j g ∘ kbindd U j f = kbindd U j (fun '(w, a) => kmap (T j) j g (f (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
j: K
A: Type

forall (g : A -> A) (f : W * A -> T j A), kmap U j g ∘ kbindd U j f = kbindd U j (fun '(w, a) => kmap (T j) j g (f (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
j: K
A: Type
g: A -> A
f: W * A -> T j A

kmap U j g ∘ kbindd U j f = kbindd U j (fun '(w, a) => kmap (T j) j g (f (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
j: K
A: Type
g: A -> A
f: W * A -> T j A

mmap U (tgt j g) ∘ mbindd U (btgd j f) = mbindd U (btgd j (fun '(w, a) => mmap (T j) (tgt j g) (f (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
j: K
A: Type
g: A -> A
f: W * A -> T j A

mbindd U ((mret T ◻ tgt j g) ◻ allK extract) ∘ mbindd U (btgd j f) = mbindd U (btgd j (fun '(w, a) => mmap (T j) (tgt j g) (f (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
j: K
A: Type
g: A -> A
f: W * A -> T j A

mbindd U (fun (k : K) '(w, a) => mbindd (T k) (((mret T ◻ tgt j g) ◻ allK extract) ◻ allK (incr w)) (btgd j f k (w, a))) = mbindd U (btgd j (fun '(w, a) => mmap (T j) (tgt j g) (f (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
j: K
A: Type
g: A -> A
f: W * A -> T j A

(fun (k : K) '(w, a) => mbindd (T k) (((mret T ◻ tgt j g) ◻ allK extract) ◻ allK (incr w)) (btgd j f k (w, a))) = btgd j (fun '(w, a) => mmap (T j) (tgt j g) (f (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
j: K
A: Type
g: A -> A
f: W * A -> T j A
k: K
w: W
a: A

mbindd (T k) (((mret T ◻ tgt j g) ◻ allK extract) ◻ allK (incr w)) (btgd j f k (w, a)) = btgd j (fun '(w, a) => mmap (T j) (tgt j g) (f (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: Type
g: A -> A
k: K
f: W * A -> T k A
w: W
a: A
DESTR_EQs: k = k

mbindd (T k) (((mret T ◻ tgt k g) ◻ allK extract) ◻ allK (incr w)) (btgd k f k (w, a)) = btgd k (fun '(w, a) => mmap (T k) (tgt k g) (f (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
j: K
A: Type
g: A -> A
f: W * A -> T j A
k: K
w: W
a: A
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j
mbindd (T k) (((mret T ◻ tgt j g) ◻ allK extract) ◻ allK (incr w)) (btgd j f k (w, a)) = btgd j (fun '(w, a) => mmap (T j) (tgt j g) (f (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: Type
g: A -> A
k: K
f: W * A -> T k A
w: W
a: A
DESTR_EQs: k = k

mbindd (T k) (((mret T ◻ tgt k g) ◻ allK extract) ◻ allK (incr w)) (btgd k f k (w, a)) = btgd k (fun '(w, a) => mmap (T k) (tgt k g) (f (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: Type
g: A -> A
k: K
f: W * A -> T k A
w: W
a: A
DESTR_EQs: k = k

mbindd (T k) (((mret T ◻ tgt k g) ◻ allK extract) ◻ allK (incr w)) (f (w, a)) = mmap (T k) (tgt k g) (f (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: Type
g: A -> A
k: K
f: W * A -> T k A
w: W
a: A
DESTR_EQs: k = k

mbindd (T k) (((mret T ◻ tgt k g) ◻ allK extract) ◻ allK (incr w)) (f (w, a)) = mbindd (T k) ((mret T ◻ tgt k g) ◻ allK extract) (f (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: Type
g: A -> A
k: K
f: W * A -> T k A
w: W
a: A
DESTR_EQs: k = k

((mret T ◻ tgt k g) ◻ allK extract) ◻ allK (incr w) = (mret T ◻ tgt 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
A: Type
g: A -> A
k: K
f: W * A -> T k A
w: W
a: A
DESTR_EQs: k = k
k': K
w': W
a': A

(((mret T ◻ tgt k g) ◻ allK extract) ◻ allK (incr w)) k' (w', a') = ((mret T ◻ tgt k g) ◻ 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: Type
g: A -> A
k: K
f: W * A -> T k A
w: W
a: A
DESTR_EQs: k = k
k': K
w': W
a': A

(((mret T ◻ tgt k g) ◻ allK extract) ◻ allK (incr w)) k' (w', a') = ((mret T ◻ tgt k g) ◻ allK extract) k' (w', a')
reflexivity.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
g: A -> A
f: W * A -> T j A
k: K
w: W
a: A
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

mbindd (T k) (((mret T ◻ tgt j g) ◻ allK extract) ◻ allK (incr w)) (btgd j f k (w, a)) = btgd j (fun '(w, a) => mmap (T j) (tgt j g) (f (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
j: K
A: Type
g: A -> A
f: W * A -> T j A
k: K
w: W
a: A
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

mbindd (T k) (((mret T ◻ tgt j g) ◻ allK extract) ◻ allK (incr w)) ((mret T k ∘ extract) (w, a)) = (mret T k ∘ extract) (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
j: K
A: Type
g: A -> A
f: W * A -> T j A
k: K
w: W
a: A
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

mbindd (T k) (fun (k : K) (a : W * A) => mret T k (tgt j g k (allK extract k (allK (incr w) k a)))) (mret T k a) = mret T 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
j: K
A: Type
g: A -> A
f: W * A -> T j A
k: K
w: W
a: A
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

(mbindd (T k) (fun (k : K) (a : W * A) => mret T k (tgt j g k (allK extract k (allK (incr w) k a)))) ∘ mret T k) a = mret T 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
j: K
A: Type
g: A -> A
f: W * A -> T j A
k: K
w: W
a: A
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

((fun a : W * A => mret T k (tgt j g k (allK extract k (allK (incr w) k a)))) ∘ Monad.ret) a = mret T k a
rewrite tgt_neq; auto. 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
j: K
A: Type

forall (g : W * A -> T j A) (f : W * A -> A), kbindd U j g ∘ kmapd U j f = kbindd U j (fun '(w, a) => g (w, f (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
j: K
A: Type

forall (g : W * A -> T j A) (f : W * A -> A), kbindd U j g ∘ kmapd U j f = kbindd U j (fun '(w, a) => g (w, f (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
j: K
A: Type
g: W * A -> T j A
f: W * A -> A

kbindd U j g ∘ kmapd U j f = kbindd U j (fun '(w, a) => g (w, f (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
j: K
A: Type
g: W * A -> T j A
f: W * A -> A

kbindd U j g ∘ kbindd U j (mret T j ∘ f) = kbindd U j (fun '(w, a) => g (w, f (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
j: K
A: Type
g: W * A -> T j A
f: W * A -> A

kbindd U j (g ⋆kdm (mret T j ∘ f)) = kbindd U j (fun '(w, a) => g (w, f (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
j: K
A: Type
g: W * A -> T j A
f: W * A -> A

g ⋆kdm (mret T j ∘ f) = (fun '(w, a) => g (w, f (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
j: K
A: Type
g: W * A -> T j A
f: W * A -> A
w: W
a: A

(g ⋆kdm (mret T j ∘ f)) (w, a) = g (w, f (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
j: K
A: Type
g: W * A -> T j A
f: W * A -> A
w: W
a: A

kbindd (T j) j (g ∘ incr w) (mret T j (f (w, a))) = g (w, f (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
j: K
A: Type
g: W * A -> T j A
f: W * A -> A
w: W
a: A

(g ∘ incr w) (Ƶ, f (w, a)) = g (w, f (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
j: K
A: Type
g: W * A -> T j A
f: W * A -> A
w: W
a: A

g (w ● Ƶ, f (w, a)) = g (w, f (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
j: K
A: Type

forall (g : W * A -> T j A) (f : A -> T j A), kbindd U j g ∘ kbind U j f = kbindd U j (fun '(w, a) => kbindd (T j) j (g ∘ incr w) (f 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
j: K
A: Type

forall (g : W * A -> T j A) (f : A -> T j A), kbindd U j g ∘ kbind U j f = kbindd U j (fun '(w, a) => kbindd (T j) j (g ∘ incr w) (f 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
j: K
A: Type
g: W * A -> T j A
f: A -> T j A

kbindd U j g ∘ kbind U j f = kbindd U j (fun '(w, a) => kbindd (T j) j (g ∘ incr w) (f 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
j: K
A: Type
g: W * A -> T j A
f: A -> T j A

kbindd U j g ∘ kbindd U j (f ∘ extract) = kbindd U j (fun '(w, a) => kbindd (T j) j (g ∘ incr w) (f a))
now rewrite kbindd_kbindd_eq. Qed. (* TODO <<kbindd_kmap>> *) End DecoratedMonad. (** ** Mixed structure composition laws *) (** Composition laws involving <<kbind>> and <<kmapd>> *) (**********************************************************************) (* TODO <<kbind_kmapd>> *) (* TODO <<kmapd_kbind>> *) (** ** Decorated functors (<<kmapd>>) *) (**********************************************************************) Section DecoratedFunctor. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T} {j: K}. (** *** 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
j: K

forall A : Type, kmapd U j 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
j: K

forall A : Type, kmapd U j 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
j: K
A: Type

kmapd U j 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
j: K
A: Type

mmapd U (tgtd j 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
j: K
A: Type

mmapd U (tgtd j extract) = mmapd U (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
j: K
A: Type

tgtd j extract = 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
j: K
A: Type
k: K

tgtd j extract 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: Type
k: K
DESTR_EQs: k = k

tgtd k extract 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
j: K
A: Type
k: K
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j
tgtd j extract 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: Type
k: K
DESTR_EQs: k = k

tgtd k extract k = allK extract k
now autorewrite with tea_tgt.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
k: K
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

tgtd j extract k = allK extract k
now autorewrite with tea_tgt. 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
j: K

forall (A : Type) (g f : W * A -> A), kmapd U j g ∘ kmapd U j f = kmapd U j (fun '(w, a) => g (w, f (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
j: K

forall (A : Type) (g f : W * A -> A), kmapd U j g ∘ kmapd U j f = kmapd U j (fun '(w, a) => g (w, f (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
j: K
A: Type
g, f: W * A -> A

kmapd U j g ∘ kmapd U j f = kmapd U j (fun '(w, a) => g (w, f (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
j: K
A: Type
g, f: W * A -> A

mmapd U (tgtd j g) ∘ mmapd U (tgtd j f) = mmapd U (tgtd j (fun '(w, a) => g (w, f (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
j: K
A: Type
g, f: W * A -> A

mmapd U (fun (k : K) '(w, a) => tgtd j g k (w, tgtd j f k (w, a))) = mmapd U (tgtd j (fun '(w, a) => g (w, f (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
j: K
A: Type
g, f: W * A -> A

(fun (k : K) '(w, a) => tgtd j g k (w, tgtd j f k (w, a))) = tgtd j (fun '(w, a) => g (w, f (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
j: K
A: Type
g, f: W * A -> A
k: K
w: W
a: A

tgtd j g k (w, tgtd j f k (w, a)) = tgtd j (fun '(w, a) => g (w, f (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: Type
g, f: W * A -> A
k: K
w: W
a: A
DESTR_EQs: k = k

tgtd k g k (w, tgtd k f k (w, a)) = tgtd k (fun '(w, a) => g (w, f (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
j: K
A: Type
g, f: W * A -> A
k: K
w: W
a: A
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j
tgtd j g k (w, tgtd j f k (w, a)) = tgtd j (fun '(w, a) => g (w, f (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: Type
g, f: W * A -> A
k: K
w: W
a: A
DESTR_EQs: k = k

tgtd k g k (w, tgtd k f k (w, a)) = tgtd k (fun '(w, a) => g (w, f (w, a))) k (w, a)
now autorewrite with tea_tgt.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
g, f: W * A -> A
k: K
w: W
a: A
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

tgtd j g k (w, tgtd j f k (w, a)) = tgtd j (fun '(w, a) => g (w, f (w, a))) k (w, a)
now autorewrite with tea_tgt_neq. 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
j: K

forall (A : Type) (f : W * A -> A) (a : A), kmapd (T j) j f (mret T j a) = mret T j (f (Ƶ, 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
j: K

forall (A : Type) (f : W * A -> A) (a : A), kmapd (T j) j f (mret T j a) = mret T j (f (Ƶ, 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
j: K
A: Type
f: W * A -> A
a: A

kmapd (T j) j f (mret T j a) = mret T j (f (Ƶ, 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
j: K
A: Type
f: W * A -> A
a: A

mmapd (T j) (tgtd j f) (mret T j a) = mret T j (f (Ƶ, 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
j: K
A: Type
f: W * A -> A
a: A

mret T j (tgtd j f j (Ƶ, a)) = mret T j (f (Ƶ, a))
now autorewrite with tea_tgt. 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
j: K

forall (A : Type) (k : K), k <> j -> forall (f : W * A -> A) (a : A), kmapd (T k) j f (mret T k a) = mret T 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
j: K

forall (A : Type) (k : K), k <> j -> forall (f : W * A -> A) (a : A), kmapd (T k) j f (mret T k a) = mret T 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
j: K
A: Type
k: K
neq: k <> j
f: W * A -> A
a: A

kmapd (T k) j f (mret T k a) = mret T 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
j: K
A: Type
k: K
neq: k <> j
f: W * A -> A
a: A

mmapd (T k) (tgtd j f) (mret T k a) = mret T 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
j: K
A: Type
k: K
neq: k <> j
f: W * A -> A
a: A

mret T k (tgtd j f k (Ƶ, a)) = mret T k a
now autorewrite with tea_tgt_neq. Qed. (* TODO <<kmap_kmapd>> *) (* TODO <<kmapd_kmap>> *) End DecoratedFunctor. (** ** Monads (<<kbind>>) *) (**********************************************************************) Definition compose_km `{ix: Index} {W: Type} {T: K -> Type -> Type} `{forall k, MBind W T (T k)} `{! MReturn T} {j: K} {A: Type} (g: A -> T j A) (f: A -> T j A): A -> T j A := (kbind (T j) j g ∘ f). Infix "⋆km" := compose_km (at level 40). Section Monad. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T} {j: K}. (** *** 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
j: K

forall A : Type, kbind U j (mret T j) = 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
j: K

forall A : Type, kbind U j (mret T j) = 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
j: K
A: Type

kbind U j (mret T j) = 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
j: K
A: Type

mbind U (btg j (mret T j)) = 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
j: K
A: Type

mbind U (btg j (mret T j)) = mbind U (fun k : K => mret T 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
j: K
A: Type

btg j (mret T j) = (fun k : K => mret T 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
j: K
A: Type
k: K

btg j (mret T j) k = mret T 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: Type
k: K
DESTR_EQs: k = k

btg k (mret T k) k = mret T 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
j: K
A: Type
k: K
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j
btg j (mret T j) k = mret T 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: Type
k: K
DESTR_EQs: k = k

btg k (mret T k) k = mret T k
now autorewrite with tea_tgt_eq.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
k: K
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

btg j (mret T j) k = mret T k
now autorewrite with tea_tgt_neq. 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
j: K

forall (A : Type) (g f : A -> T j A), kbind U j g ∘ kbind U j f = kbind U j (g ⋆km 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
j: K

forall (A : Type) (g f : A -> T j A), kbind U j g ∘ kbind U j f = kbind U j (g ⋆km 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
j: K
A: Type
g, f: A -> T j A

kbind U j g ∘ kbind U j f = kbind U j (g ⋆km 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
j: K
A: Type
g, f: A -> T j A

mbind U (btg j g) ∘ mbind U (btg j f) = mbind U (btg j (g ⋆km 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
j: K
A: Type
g, f: A -> T j A

mbind U (fun k : K => mbind (T k) (btg j g) ○ btg j f k) = mbind U (btg j (g ⋆km 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
j: K
A: Type
g, f: A -> T j A

(fun k : K => mbind (T k) (btg j g) ○ btg j f k) = btg j (g ⋆km 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
j: K
A: Type
g, f: A -> T j A
k: K
a: A

mbind (T k) (btg j g) (btg j f k a) = btg j (g ⋆km 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: Type
k: K
f, g: A -> T k A
a: A
DESTR_EQs: k = k

mbind (T k) (btg k g) (btg k f k a) = btg k (g ⋆km 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
j: K
A: Type
g, f: A -> T j A
k: K
a: A
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j
mbind (T k) (btg j g) (btg j f k a) = btg j (g ⋆km 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: Type
k: K
f, g: A -> T k A
a: A
DESTR_EQs: k = k

mbind (T k) (btg k g) (btg k f k a) = btg k (g ⋆km f) k a
now autorewrite with tea_tgt_eq.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
g, f: A -> T j A
k: K
a: A
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

mbind (T k) (btg j g) (btg j f k a) = btg j (g ⋆km 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
j: K
A: Type
g, f: A -> T j A
k: K
a: A
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

mbind (T k) (btg j g) (mret T k a) = mret T 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
j: K
A: Type
g, f: A -> T j A
k: K
a: A
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

btg j g k a = mret T k a
now autorewrite with tea_tgt_neq. 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
j: K

forall (A : Type) (f : A -> T j A) (a : A), kbind (T j) j f (mret T j a) = f 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
j: K

forall (A : Type) (f : A -> T j A) (a : A), kbind (T j) j f (mret T j a) = f 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
j: K
A: Type
f: A -> T j A
a: A

kbind (T j) j f (mret T j a) = f 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
j: K
A: Type
f: A -> T j A
a: A

mbind (T j) (btg j f) (mret T j a) = f 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
j: K
A: Type
f: A -> T j A
a: A

btg j f j a = f a
now autorewrite with tea_tgt_eq. 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
j: K

forall (A : Type) (i : K), j <> i -> forall (f : A -> T j A) (a : A), kbind (T i) j f (mret T i a) = mret T i 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
j: K

forall (A : Type) (i : K), j <> i -> forall (f : A -> T j A) (a : A), kbind (T i) j f (mret T i a) = mret T i 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
a: A

kbind (T i) j f (mret T i a) = mret T i 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
a: A

mbind (T i) (btg j f) (mret T i a) = mret T i 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
a: A

btg j f i a = mret T i a
now autorewrite with tea_tgt_neq. Qed. (* TODO <<kmap_kbind>> *) (* TODO <<kbind_kmap>> *) End Monad. (** ** Functors (<<kmap>>) *) (**********************************************************************) Section Functor. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T} {j: K}. (** *** 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
j: K

forall A : Type, kmap U j 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
j: K

forall A : Type, kmap U j 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
j: K
A: Type

kmap U j 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
j: K
A: Type

mmap U (tgt j 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
j: K
A: Type

mmap U (tgt j id) = mmap U (allK 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
j: K
A: Type

tgt j id = allK 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
j: K
A: Type
k: K

tgt j id k = allK id 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
j: K
A: Type
DESTR_EQs: j = j

tgt j id j = allK id j
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
k: K
DESTR_NEQ: k <> j
DESTR_NEQs: j <> k
tgt j id k = allK id 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
j: K
A: Type
k: K
DESTR_NEQ: k <> j
DESTR_NEQs: j <> k

tgt j id k = allK id k
now autorewrite with tea_tgt_neq. 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
j: K

forall (A : Type) (g f : A -> A), kmap U j g ∘ kmap U j f = kmap U j (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
j: K

forall (A : Type) (g f : A -> A), kmap U j g ∘ kmap U j f = kmap U j (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
j: K
A: Type
g, f: A -> A

kmap U j g ∘ kmap U j f = kmap U j (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
j: K
A: Type
g, f: A -> A

mmap U (tgt j g) ∘ mmap U (tgt j f) = mmap U (tgt j (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
j: K
A: Type
g, f: A -> A

mmap U (tgt j g ◻ tgt j f) = mmap U (tgt j (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
j: K
A: Type
g, f: A -> A

tgt j g ◻ tgt j f = tgt j (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
j: K
A: Type
g, f: A -> A
k: K

(tgt j g ◻ tgt j f) k = tgt j (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
j: K
A: Type
g, f: A -> A
k: K

tgt j g k ∘ tgt j f k = tgt j (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: Type
g, f: A -> A
k: K
DESTR_EQs: k = k

tgt k g k ∘ tgt k f k = tgt 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
j: K
A: Type
g, f: A -> A
k: K
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j
tgt j g k ∘ tgt j f k = tgt j (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: Type
g, f: A -> A
k: K
DESTR_EQs: k = k

tgt k g k ∘ tgt k f k = tgt k (g ∘ f) k
now autorewrite with tea_tgt_eq.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
g, f: A -> A
k: K
DESTR_NEQ: j <> k
DESTR_NEQs: k <> j

tgt j g k ∘ tgt j f k = tgt j (g ∘ f) k
now autorewrite with tea_tgt_neq. Qed. (** *** Naturality w.r.t. <<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
j: K
A: Type

forall (f : A -> A) (a : A), kmap (T j) j f (mret T j a) = mret T j (f 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
j: K
A: Type

forall (f : A -> A) (a : A), kmap (T j) j f (mret T j a) = mret T j (f 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
j: K
A: Type
f: A -> A
a: A

kmap (T j) j f (mret T j a) = mret T j (f 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
j: K
A: Type
f: A -> A
a: A

mmap (T j) (tgt j f) (mret T j a) = mret T j (f 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
j: K
A: Type
f: A -> A
a: A

mret T j (tgt j f j a) = mret T j (f a)
now rewrite tgt_eq. 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
j: K
A: Type

forall i : K, j <> i -> forall (f : A -> A) (a : A), kmap (T i) j f (mret T i a) = mret T i 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
j: K
A: Type

forall i : K, j <> i -> forall (f : A -> A) (a : A), kmap (T i) j f (mret T i a) = mret T i 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
a: A

kmap (T i) j f (mret T i a) = mret T i 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
a: A

mmap (T i) (tgt j f) (mret T i a) = mret T i 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
a: A

mret T i (tgt j f i a) = mret T i a
rewrite tgt_neq; auto. Qed. End Functor. (** ** Notations **) (**********************************************************************) Module Notations. Infix "⋆dtm" := compose_dtm (at level 40): tealeaves_scope. Infix "⋆kdm" := compose_kdm (at level 40): tealeaves_scope. Infix "⋆km" := compose_km (at level 40): tealeaves_scope. End Notations. Import Container.Notations. (** * Characterizing occurrences post-operation (targetted operations) *) (**********************************************************************) Section DTM_membership_targetted. Context (U: Type -> Type) `{MultiDecoratedTraversablePreModule W T U} `{! MultiDecoratedTraversableMonad W T}. Context (j: K) {A: Type}. (** *** Occurrences in <<kbindd>> with context *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall (f : W * A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (j, a2)) ∈md kbindd U j f t -> exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall (f : W * A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (j, a2)) ∈md kbindd U j f t -> exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (j, a2)) ∈md kbindd U j f t

exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (j, a2)) ∈md mbindd U (btgd j f) t

exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: exists (k1 : K) (w1 w2 : W) (a : A), (w1, (k1, a)) ∈md t /\ (w2, (j, a2)) ∈md btgd j f k1 (w1, a) /\ wtotal = w1 ● w2

exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
wtotal: W
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (j, a2)) ∈md btgd j f k1 (w1, a)
hyp3: wtotal = w1 ● w2

exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (j, a2)) ∈md btgd j f k1 (w1, a)

exists (w3 w4 : W) (a1 : A), (w3, (j, a1)) ∈md t /\ (w4, (j, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
k1: K
f: W * A -> T k1 A
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (k1, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1

exists (w3 w4 : W) (a1 : A), (w3, (k1, a1)) ∈md t /\ (w4, (k1, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (j, a2)) ∈md btgd j f k1 (w1, a)
DESTR_NEQ: j <> k1
DESTR_NEQs: k1 <> j
exists (w3 w4 : W) (a1 : A), (w3, (j, a1)) ∈md t /\ (w4, (j, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
k1: K
f: W * A -> T k1 A
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (k1, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1

exists (w3 w4 : W) (a1 : A), (w3, (k1, a1)) ∈md t /\ (w4, (k1, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
k1: K
f: W * A -> T k1 A
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (k1, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1

(w1, (k1, a)) ∈md t /\ (w2, (k1, a2)) ∈md f (w1, a) /\ w1 ● w2 = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
k1: K
f: W * A -> T k1 A
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (k1, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1

(w1, (k1, a)) ∈md 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
A: Type
k1: K
f: W * A -> T k1 A
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (k1, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1
(w2, (k1, a2)) ∈md f (w1, 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: Type
k1: K
f: W * A -> T k1 A
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (k1, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1
w1 ● w2 = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
k1: K
f: W * A -> T k1 A
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (k1, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1

(w1, (k1, a)) ∈md t
auto.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
k1: K
f: W * A -> T k1 A
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (k1, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1

(w2, (k1, a2)) ∈md f (w1, 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: Type
k1: K
f: W * A -> T k1 A
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (k1, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1
w1 ● w2 = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
k1: K
f: W * A -> T k1 A
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (k1, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1

(w2, (k1, a2)) ∈md f (w1, 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: Type
k1: K
f: W * A -> T k1 A
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (k1, a2)) ∈md f (w1, a)
DESTR_EQs: k1 = k1

(w2, (k1, a2)) ∈md f (w1, a)
auto.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
k1: K
f: W * A -> T k1 A
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (k1, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1

w1 ● w2 = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
k1: K
f: W * A -> T k1 A
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (k1, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1

w1 ● w2 = w1 ● w2
reflexivity. }
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (j, a2)) ∈md btgd j f k1 (w1, a)
DESTR_NEQ: j <> k1
DESTR_NEQs: k1 <> j

exists (w3 w4 : W) (a1 : A), (w3, (j, a1)) ∈md t /\ (w4, (j, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (j, a2)) ∈md (mret T k1 ∘ extract) (w1, a)
DESTR_NEQ: j <> k1
DESTR_NEQs: k1 <> j

exists (w3 w4 : W) (a1 : A), (w3, (j, a1)) ∈md t /\ (w4, (j, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (j, a2)) ∈md mret T k1 a
DESTR_NEQ: j <> k1
DESTR_NEQs: k1 <> j

exists (w3 w4 : W) (a1 : A), (w3, (j, a1)) ∈md t /\ (w4, (j, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: w2 = Ƶ /\ k1 = j /\ a = a2
DESTR_NEQ: j <> k1
DESTR_NEQs: k1 <> j

exists (w3 w4 : W) (a1 : A), (w3, (j, a1)) ∈md t /\ (w4, (j, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
H1: w2 = Ƶ
H2: k1 = j
H3: a = a2
DESTR_NEQ: j <> k1
DESTR_NEQs: k1 <> j

exists (w3 w4 : W) (a1 : A), (w3, (j, a1)) ∈md t /\ (w4, (j, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A
w1: W
hyp1: (w1, (j, a2)) ∈md t
DESTR_NEQs, DESTR_NEQ: j <> j

exists (w2 w3 : W) (a1 : A), (w2, (j, a1)) ∈md t /\ (w3, (j, a2)) ∈md f (w2, a1) /\ w1 ● Ƶ = w2 ● w3
contradiction. 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
j: K
A: Type

forall (f : W * A -> T j A) (t : U A) (wtotal : W) (a2 : A), (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2) -> (wtotal, (j, a2)) ∈md kbindd U j f 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
j: K
A: Type

forall (f : W * A -> T j A) (t : U A) (wtotal : W) (a2 : A), (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2) -> (wtotal, (j, a2)) ∈md kbindd U j f 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
j: K
A: Type
f: W * A -> T j A
t: U A
wtotal: W
a2: A
w1, w2: W
a1: A
hyp: (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2

(wtotal, (j, a2)) ∈md kbindd U j f 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
j: K
A: Type
f: W * A -> T j A
t: U A
wtotal: W
a2: A
w1, w2: W
a1: A
H1: (w1, (j, a1)) ∈md t
H2: (w2, (j, a2)) ∈md f (w1, a1)
H3: wtotal = w1 ● w2

(wtotal, (j, a2)) ∈md kbindd U j f 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
j: K
A: Type
f: W * A -> T j A
t: U A
wtotal: W
a2: A
w1, w2: W
a1: A
H1: (w1, (j, a1)) ∈md t
H2: (w2, (j, a2)) ∈md f (w1, a1)
H3: wtotal = w1 ● w2

(wtotal, (j, a2)) ∈md mbindd U (btgd j f) 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
j: K
A: Type
f: W * A -> T j A
t: U A
wtotal: W
a2: A
w1, w2: W
a1: A
H1: (w1, (j, a1)) ∈md t
H2: (w2, (j, a2)) ∈md f (w1, a1)
H3: wtotal = w1 ● w2

exists (k1 : K) (w1 w2 : W) (a : A), (w1, (k1, a)) ∈md t /\ (w2, (j, a2)) ∈md btgd j f k1 (w1, a) /\ wtotal = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
wtotal: W
a2: A
w1, w2: W
a1: A
H1: (w1, (j, a1)) ∈md t
H2: (w2, (j, a2)) ∈md f (w1, a1)
H3: wtotal = w1 ● w2

(w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md btgd j f j (w1, a1) /\ wtotal = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
wtotal: W
a2: A
w1, w2: W
a1: A
H1: (w1, (j, a1)) ∈md t
H2: (w2, (j, a2)) ∈md f (w1, a1)
H3: wtotal = w1 ● w2

(w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2
auto. 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
j: K
A: Type

forall (f : W * A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (j, a2)) ∈md kbindd U j f t <-> (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall (f : W * A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (j, a2)) ∈md kbindd U j f t <-> (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2)
split; auto using inmd_kbindd_eq_iff1, inmd_kbindd_eq_iff2. 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
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (i, a2)) ∈md kbindd U j f t -> (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (i, a2)) ∈md kbindd U j f t -> (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md kbindd U j f t

(wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md mbindd U (btgd j f) t

(wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: exists (k1 : K) (w1 w2 : W) (a : A), (w1, (k1, a)) ∈md t /\ (w2, (i, a2)) ∈md btgd j f k1 (w1, a) /\ wtotal = w1 ● w2

(wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (i, a2)) ∈md btgd j f k1 (w1, a)
hyp3: wtotal = w1 ● w2

(wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (i, a2)) ∈md btgd j f k1 (w1, a)

(w1 ● w2, (i, a2)) ∈md t \/ (exists (w3 w4 : W) (a1 : A), (w3, (j, a1)) ∈md t /\ (w4, (i, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
i, k1: K
f: W * A -> T k1 A
Hneq: k1 <> i
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (i, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1

(w1 ● w2, (i, a2)) ∈md t \/ (exists (w3 w4 : W) (a1 : A), (w3, (k1, a1)) ∈md t /\ (w4, (i, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (i, a2)) ∈md btgd j f k1 (w1, a)
DESTR_NEQ: j <> k1
DESTR_NEQs: k1 <> j
(w1 ● w2, (i, a2)) ∈md t \/ (exists (w3 w4 : W) (a1 : A), (w3, (j, a1)) ∈md t /\ (w4, (i, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
i, k1: K
f: W * A -> T k1 A
Hneq: k1 <> i
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (i, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1

(w1 ● w2, (i, a2)) ∈md t \/ (exists (w3 w4 : W) (a1 : A), (w3, (k1, a1)) ∈md t /\ (w4, (i, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
i, k1: K
f: W * A -> T k1 A
Hneq: k1 <> i
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (i, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1

exists (w3 w4 : W) (a1 : A), (w3, (k1, a1)) ∈md t /\ (w4, (i, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
i, k1: K
f: W * A -> T k1 A
Hneq: k1 <> i
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (i, a2)) ∈md btgd k1 f k1 (w1, a)
DESTR_EQs: k1 = k1

(w1, (k1, a)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a) /\ w1 ● w2 = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, 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
i, k1: K
f: W * A -> T k1 A
Hneq: k1 <> i
t: U A
a2: A
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (i, a2)) ∈md f (w1, a)
DESTR_EQs: k1 = k1

(w1, (k1, a)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a) /\ w1 ● w2 = w1 ● w2
splits; auto.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (i, a2)) ∈md btgd j f k1 (w1, a)
DESTR_NEQ: j <> k1
DESTR_NEQs: k1 <> j

(w1 ● w2, (i, a2)) ∈md t \/ (exists (w3 w4 : W) (a1 : A), (w3, (j, a1)) ∈md t /\ (w4, (i, a2)) ∈md f (w3, a1) /\ w1 ● w2 = w3 ● w4)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (i, a2)) ∈md btgd j f k1 (w1, a)
DESTR_NEQ: j <> k1
DESTR_NEQs: k1 <> j

(w1 ● w2, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (i, a2)) ∈md (mret T k1 ∘ extract) (w1, a)
DESTR_NEQ: j <> k1
DESTR_NEQs: k1 <> j

(w1 ● w2, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (i, a2)) ∈md mret T k1 (extract (w1, a))
DESTR_NEQ: j <> k1
DESTR_NEQs: k1 <> j

(w1 ● w2, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: (w2, (i, a2)) ∈md mret T k1 a
DESTR_NEQ: j <> k1
DESTR_NEQs: k1 <> j

(w1 ● w2, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
k1: K
w1, w2: W
a: A
hyp1: (w1, (k1, a)) ∈md t
hyp2: w2 = Ƶ /\ k1 = i /\ a = a2
DESTR_NEQ: j <> k1
DESTR_NEQs: k1 <> j

(w1 ● w2, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w1: W
hyp1: (w1, (i, a2)) ∈md t
DESTR_NEQs: i <> j
DESTR_NEQ: j <> i

(w1 ● Ƶ, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w1: W
hyp1: (w1, (i, a2)) ∈md t
DESTR_NEQs: i <> j
DESTR_NEQ: j <> i

(w1, (i, a2)) ∈md t
auto. 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
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2) -> (wtotal, (i, a2)) ∈md kbindd U j f 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
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2) -> (wtotal, (i, a2)) ∈md kbindd U j f 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2)

(wtotal, (i, a2)) ∈md kbindd U j f 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t

(wtotal, (i, a2)) ∈md kbindd U j f 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2
(wtotal, (i, a2)) ∈md kbindd U j f 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t

(wtotal, (i, a2)) ∈md kbindd U j f 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t

exists (k1 : K) (w1 w2 : W) (a : A), (w1, (k1, a)) ∈md t /\ (w2, (i, a2)) ∈md btgd j f k1 (w1, a) /\ wtotal = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t

(wtotal, (i, a2)) ∈md t /\ (Ƶ, (i, a2)) ∈md btgd j f i (wtotal, a2) /\ wtotal = wtotal ● Ƶ
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t

(wtotal, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t
(Ƶ, (i, a2)) ∈md btgd j f i (wtotal, a2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t
wtotal = wtotal ● Ƶ
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t

(wtotal, (i, a2)) ∈md t
auto.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t

(Ƶ, (i, a2)) ∈md btgd j f i (wtotal, a2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t
wtotal = wtotal ● Ƶ
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t

(Ƶ, (i, a2)) ∈md btgd j f i (wtotal, a2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t

(Ƶ, (i, a2)) ∈md (mret T i ∘ extract) (wtotal, a2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t

(Ƶ, (i, a2)) ∈md mret T i a2
rewrite inmd_mret_iff; auto.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t

wtotal = wtotal ● Ƶ
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: (wtotal, (i, a2)) ∈md t

wtotal = wtotal ● Ƶ
now simpl_monoid. }
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
hyp: exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2

(wtotal, (i, a2)) ∈md kbindd U j f 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
wtotal: W
a2: A
w1, w2: W
a1: A
hyp1: (w1, (j, a1)) ∈md t
hyp2: (w2, (i, a2)) ∈md f (w1, a1)
hyp3: wtotal = w1 ● w2

(wtotal, (i, a2)) ∈md kbindd U j f 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w1, w2: W
a1: A
hyp1: (w1, (j, a1)) ∈md t
hyp2: (w2, (i, a2)) ∈md f (w1, a1)

(w1 ● w2, (i, a2)) ∈md kbindd U j f 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w1, w2: W
a1: A
hyp1: (w1, (j, a1)) ∈md t
hyp2: (w2, (i, a2)) ∈md f (w1, a1)

exists (k1 : K) (w3 w4 : W) (a : A), (w3, (k1, a)) ∈md t /\ (w4, (i, a2)) ∈md btgd j f k1 (w3, a) /\ w1 ● w2 = w3 ● w4
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w1, w2: W
a1: A
hyp1: (w1, (j, a1)) ∈md t
hyp2: (w2, (i, a2)) ∈md f (w1, a1)

(w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md btgd j f j (w1, a1) /\ w1 ● w2 = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w1, w2: W
a1: A
hyp1: (w1, (j, a1)) ∈md t
hyp2: (w2, (i, a2)) ∈md f (w1, a1)

(w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w1 ● w2 = w1 ● w2
auto. 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
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (i, a2)) ∈md kbindd U j f t <-> (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (i, a2)) ∈md kbindd U j f t <-> (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ wtotal = w1 ● w2)
split; auto using inmd_kbindd_neq_iff1, inmd_kbindd_neq_iff2. Qed. (** *** Corollaries for <<kbind>>, <<kmapd>>, and <<kmap>>*) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall (f : A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (j, a2)) ∈md kbind U j f t <-> (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f a1 /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall (f : A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (j, a2)) ∈md kbind U j f t <-> (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f a1 /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> T j A
t: U A
wtotal: W
a2: A

(wtotal, (j, a2)) ∈md kbind U j f t <-> (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f a1 /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> T j A
t: U A
wtotal: W
a2: A

(wtotal, (j, a2)) ∈md kbindd U j (f ∘ extract) t <-> (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f a1 /\ wtotal = w1 ● w2)
now rewrite (inmd_kbindd_eq_iff). 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
j: K
A: Type

forall i : K, j <> i -> forall (f : A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (i, a2)) ∈md kbind U j f t <-> (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f a1 /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall i : K, j <> i -> forall (f : A -> T j A) (t : U A) (wtotal : W) (a2 : A), (wtotal, (i, a2)) ∈md kbind U j f t <-> (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f a1 /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
wtotal: W
a2: A

(wtotal, (i, a2)) ∈md kbind U j f t <-> (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f a1 /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
wtotal: W
a2: A

(wtotal, (i, a2)) ∈md kbindd U j (f ∘ extract) t <-> (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f a1 /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
wtotal: W
a2: A

(wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md (f ∘ extract) (w1, a1) /\ wtotal = w1 ● w2) <-> (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f a1 /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
wtotal: W
a2: A

(wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (extract (w1, a1)) /\ wtotal = w1 ● w2) <-> (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f a1 /\ wtotal = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
wtotal: W
a2: A

(wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f a1 /\ wtotal = w1 ● w2) <-> (wtotal, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f a1 /\ wtotal = w1 ● w2)
easy. 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
j: K
A: Type

forall (f : W * A -> A) (t : U A) (w : W) (a2 : A), (w, (j, a2)) ∈md kmapd U j f t <-> (exists a1 : A, (w, (j, a1)) ∈md t /\ a2 = f (w, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall (f : W * A -> A) (t : U A) (w : W) (a2 : A), (w, (j, a2)) ∈md kmapd U j f t <-> (exists a1 : A, (w, (j, a1)) ∈md t /\ a2 = f (w, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> A
t: U A
w: W
a2: A

(w, (j, a2)) ∈md kmapd U j f t <-> (exists a1 : A, (w, (j, a1)) ∈md t /\ a2 = f (w, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> A
t: U A
w: W
a2: A

(w, (j, a2)) ∈md mmapd U (tgtd j f) t <-> (exists a1 : A, (w, (j, a1)) ∈md t /\ a2 = f (w, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> A
t: U A
w: W
a2: A

(exists a : A, (w, (j, a)) ∈md t /\ a2 = tgtd j f j (w, a)) <-> (exists a1 : A, (w, (j, a1)) ∈md t /\ a2 = f (w, a1))
now rewrite tgtd_eq. 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
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> A) (t : U A) (w : W) (a2 : A), (w, (i, a2)) ∈md kmapd U j f t <-> (w, (i, a2)) ∈md 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
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> A) (t : U A) (w : W) (a2 : A), (w, (i, a2)) ∈md kmapd U j f t <-> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
w: W
a2: A

(w, (i, a2)) ∈md kmapd U j f t <-> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
w: W
a2: A

(w, (i, a2)) ∈md mmapd U (tgtd j f) t <-> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
w: W
a2: A

(exists a : A, (w, (i, a)) ∈md t /\ a2 = tgtd j f i (w, a)) <-> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
w: W
a2: A

(exists a : A, (w, (i, a)) ∈md t /\ a2 = extract (w, a)) <-> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
w: W
a2: A

(exists a : A, (w, (i, a)) ∈md t /\ a2 = a) <-> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
w: W
a2: A

(exists a : A, (w, (i, a)) ∈md t /\ a2 = a) -> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
w: W
a2: A
(w, (i, a2)) ∈md t -> exists a : A, (w, (i, a)) ∈md t /\ a2 = 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
w: W
a2: A

(exists a : A, (w, (i, a)) ∈md t /\ a2 = a) -> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
w: W
a: A
hyp: (w, (i, a)) ∈md t

(w, (i, a)) ∈md t
auto.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
w: W
a2: A

(w, (i, a2)) ∈md t -> exists a : A, (w, (i, a)) ∈md t /\ a2 = 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
w: W
a2: A
hyp: (w, (i, a2)) ∈md t

exists a : A, (w, (i, a)) ∈md t /\ a2 = a
now (exists a2). 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
j: K
A: Type

forall (f : A -> A) (t : U A) (w : W) (a2 : A), (w, (j, a2)) ∈md kmap U j f t <-> (exists a1 : A, (w, (j, a1)) ∈md t /\ a2 = f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall (f : A -> A) (t : U A) (w : W) (a2 : A), (w, (j, a2)) ∈md kmap U j f t <-> (exists a1 : A, (w, (j, a1)) ∈md t /\ a2 = f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> A
t: U A
w: W
a2: A

(w, (j, a2)) ∈md kmap U j f t <-> (exists a1 : A, (w, (j, a1)) ∈md t /\ a2 = f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> A
t: U A
w: W
a2: A

(w, (j, a2)) ∈md mmap U (tgt j f) t <-> (exists a1 : A, (w, (j, a1)) ∈md t /\ a2 = f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> A
t: U A
w: W
a2: A

(exists a : A, (w, (j, a)) ∈md t /\ a2 = tgt j f j a) <-> (exists a1 : A, (w, (j, a1)) ∈md t /\ a2 = f a1)
now rewrite tgt_eq. 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
j: K
A: Type

forall i : K, j <> i -> forall (f : A -> A) (t : U A) (w : W) (a2 : A), (w, (i, a2)) ∈md kmap U j f t <-> (w, (i, a2)) ∈md 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
j: K
A: Type

forall i : K, j <> i -> forall (f : A -> A) (t : U A) (w : W) (a2 : A), (w, (i, a2)) ∈md kmap U j f t <-> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
w: W
a2: A

(w, (i, a2)) ∈md kmap U j f t <-> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
w: W
a2: A

(w, (i, a2)) ∈md mmap U (tgt j f) t <-> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
w: W
a2: A

(exists a : A, (w, (i, a)) ∈md t /\ a2 = tgt j f i a) <-> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
w: W
a2: A

(exists a : A, (w, (i, a)) ∈md t /\ a2 = id a) <-> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
w: W
a2: A

(exists a : A, (w, (i, a)) ∈md t /\ a2 = id a) -> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
w: W
a2: A
(w, (i, a2)) ∈md t -> exists a : A, (w, (i, a)) ∈md t /\ a2 = id 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
w: W
a2: A

(exists a : A, (w, (i, a)) ∈md t /\ a2 = id a) -> (w, (i, a2)) ∈md 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
w: W
a: A
hyp: (w, (i, a)) ∈md t

(w, (i, id a)) ∈md t
auto.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
w: W
a2: A

(w, (i, a2)) ∈md t -> exists a : A, (w, (i, a)) ∈md t /\ a2 = id 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
w: W
a2: A
hyp: (w, (i, a2)) ∈md t

exists a : A, (w, (i, a)) ∈md t /\ a2 = id a
now (exists a2). Qed. (** *** Occurrences without context *) (********************************************************************)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall (f : W * A -> T j A) (t : U A) (a2 : A), (j, a2) ∈m kbindd U j f t <-> (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (j, a2) ∈m f (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall (f : W * A -> T j A) (t : U A) (a2 : A), (j, a2) ∈m kbindd U j f t <-> (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (j, a2) ∈m f (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A

(j, a2) ∈m kbindd U j f t <-> (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (j, a2) ∈m f (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A

(exists w : W, (w, (j, a2)) ∈md kbindd U j f t) <-> (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (j, a2) ∈m f (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A

(exists w : W, (w, (j, a2)) ∈md kbindd U j f t) <-> (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (j, a2)) ∈md f (w1, a1)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A

(exists (w w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ w = w1 ● w2) <-> (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (j, a2)) ∈md f (w1, a1)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A

(exists (w w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ w = w1 ● w2) -> exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (j, a2)) ∈md f (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A
(exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (j, a2)) ∈md f (w1, a1))) -> exists (w w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ w = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A

(exists (w w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ w = w1 ● w2) -> exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (j, a2)) ∈md f (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A
w, w1, w2: W
a1: A
hyp1: (w1, (j, a1)) ∈md t
hyp2: (w2, (j, a2)) ∈md f (w1, a1)
hyp3: w = w1 ● w2

exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (j, a2)) ∈md f (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A
w, w1, w2: W
a1: A
hyp1: (w1, (j, a1)) ∈md t
hyp2: (w2, (j, a2)) ∈md f (w1, a1)
hyp3: w = w1 ● w2

exists a3 : A, (?w1, (j, a3)) ∈md t /\ (exists w0 : W, (w0, (j, a2)) ∈md f (?w1, a3))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A
w, w1, w2: W
a1: A
hyp1: (w1, (j, a1)) ∈md t
hyp2: (w2, (j, a2)) ∈md f (w1, a1)
hyp3: w = w1 ● w2

(?w1, (j, ?a1)) ∈md t /\ (exists w0 : W, (w0, (j, a2)) ∈md f (?w1, ?a1))
split; eauto.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A

(exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (j, a2)) ∈md f (w1, a1))) -> exists (w w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ w = w1 ● w2
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> T j A
t: U A
a2: A
w: W
a1: A
hyp1: (w, (j, a1)) ∈md t
w2: W
hyp2: (w2, (j, a2)) ∈md f (w, a1)

exists (w w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (j, a2)) ∈md f (w1, a1) /\ w = w1 ● w2
repeat eexists; eauto. 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
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> T j A) (t : U A) (a2 : A), (i, a2) ∈m kbindd U j f t <-> (i, a2) ∈m t \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m f (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> T j A) (t : U A) (a2 : A), (i, a2) ∈m kbindd U j f t <-> (i, a2) ∈m t \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m f (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A

(i, a2) ∈m kbindd U j f t <-> (i, a2) ∈m t \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m f (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A

(exists w : W, (w, (i, a2)) ∈md kbindd U j f t) <-> (i, a2) ∈m t \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m f (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A

(exists w : W, (w, (i, a2)) ∈md kbindd U j f t) <-> (exists w : W, (w, (i, a2)) ∈md t) \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A

(exists w : W, (w, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2)) <-> (exists w : W, (w, (i, a2)) ∈md t) \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A

(exists w : W, (w, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2)) -> (exists w : W, (w, (i, a2)) ∈md t) \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
(exists w : W, (w, (i, a2)) ∈md t) \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1))) -> exists w : W, (w, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A

(exists w : W, (w, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2)) -> (exists w : W, (w, (i, a2)) ∈md t) \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w: W
hyp: (w, (i, a2)) ∈md t

(exists w : W, (w, (i, a2)) ∈md t) \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w: W
hyp: exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2
(exists w : W, (w, (i, a2)) ∈md t) \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w: W
hyp: (w, (i, a2)) ∈md t

(exists w : W, (w, (i, a2)) ∈md t) \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w: W
hyp: (w, (i, a2)) ∈md t

exists w : W, (w, (i, a2)) ∈md t
eauto.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w: W
hyp: exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2

(exists w : W, (w, (i, a2)) ∈md t) \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1)))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w: W
hyp: exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2

exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w, w1, w2: W
a1: A
hyp1: (w1, (j, a1)) ∈md t
hyp2: (w2, (i, a2)) ∈md f (w1, a1)
hyp3: w = w1 ● w2

exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1))
repeat eexists; eauto.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A

(exists w : W, (w, (i, a2)) ∈md t) \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1))) -> exists w : W, (w, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
hyp: exists w : W, (w, (i, a2)) ∈md t

exists w : W, (w, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
hyp: exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1))
exists w : W, (w, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
hyp: exists w : W, (w, (i, a2)) ∈md t

exists w : W, (w, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w: W
hyp: (w, (i, a2)) ∈md t

exists w : W, (w, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w: W
hyp: (w, (i, a2)) ∈md t

(?w, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ ?w = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w: W
hyp: (w, (i, a2)) ∈md t

(?w, (i, a2)) ∈md t
eauto.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
hyp: exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (exists w : W, (w, (i, a2)) ∈md f (w1, a1))

exists w : W, (w, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w1: W
a1: A
hyp1: (w1, (j, a1)) ∈md t
w2: W
hyp2: (w2, (i, a2)) ∈md f (w1, a1)

exists w : W, (w, (i, a2)) ∈md t \/ (exists (w1 w2 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (w2, (i, a2)) ∈md f (w1, a1) /\ w = w1 ● w2)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w1: W
a1: A
hyp1: (w1, (j, a1)) ∈md t
w2: W
hyp2: (w2, (i, a2)) ∈md f (w1, a1)

(?w, (i, a2)) ∈md t \/ (exists (w3 w4 : W) (a3 : A), (w3, (j, a3)) ∈md t /\ (w4, (i, a2)) ∈md f (w3, a3) /\ ?w = w3 ● w4)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> T j A
t: U A
a2: A
w1: W
a1: A
hyp1: (w1, (j, a1)) ∈md t
w2: W
hyp2: (w2, (i, a2)) ∈md f (w1, a1)

exists (w3 w4 : W) (a3 : A), (w3, (j, a3)) ∈md t /\ (w4, (i, a2)) ∈md f (w3, a3) /\ ?w = w3 ● w4
repeat eexists; eauto. 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
j: K
A: Type

forall (f : A -> T j A) (t : U A) (a2 : A), (j, a2) ∈m kbind U j f t <-> (exists a1 : A, (j, a1) ∈m t /\ (j, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall (f : A -> T j A) (t : U A) (a2 : A), (j, a2) ∈m kbind U j f t <-> (exists a1 : A, (j, a1) ∈m t /\ (j, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> T j A
t: U A
a2: A

(j, a2) ∈m kbind U j f t <-> (exists a1 : A, (j, a1) ∈m t /\ (j, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> T j A
t: U A
a2: A

(j, a2) ∈m kbindd U j (f ∘ extract) t <-> (exists a1 : A, (j, a1) ∈m t /\ (j, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> T j A
t: U A
a2: A

(exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (j, a2) ∈m (f ∘ extract) (w1, a1)) <-> (exists a1 : A, (j, a1) ∈m t /\ (j, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> T j A
t: U A
a2: A

(exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (j, a2) ∈m (f ∘ extract) (w1, a1)) <-> (exists a1 : A, (exists w : W, (w, (j, a1)) ∈md t) /\ (j, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> T j A
t: U A
a2: A

(exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (j, a2) ∈m f (extract (w1, a1))) <-> (exists a1 : A, (exists w : W, (w, (j, a1)) ∈md t) /\ (j, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> T j A
t: U A
a2: A

(exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (j, a2) ∈m f a1) <-> (exists a1 : A, (exists w : W, (w, (j, a1)) ∈md t) /\ (j, a2) ∈m f a1)
firstorder. 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
j: K
A: Type

forall i : K, j <> i -> forall (f : A -> T j A) (t : U A) (a2 : A), (i, a2) ∈m kbind U j f t <-> (i, a2) ∈m t \/ (exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall i : K, j <> i -> forall (f : A -> T j A) (t : U A) (a2 : A), (i, a2) ∈m kbind U j f t <-> (i, a2) ∈m t \/ (exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A

(i, a2) ∈m kbind U j f t <-> (i, a2) ∈m t \/ (exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A

(i, a2) ∈m kbindd U j (f ∘ extract) t <-> (i, a2) ∈m t \/ (exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A

(i, a2) ∈m t \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1)) <-> (i, a2) ∈m t \/ (exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A

(i, a2) ∈m t \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1)) -> (i, a2) ∈m t \/ (exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
(i, a2) ∈m t \/ (exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1) -> (i, a2) ∈m t \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A

(i, a2) ∈m t \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1)) -> (i, a2) ∈m t \/ (exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
hyp: (i, a2) ∈m t

(i, a2) ∈m t \/ (exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
hyp: exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1)
(i, a2) ∈m t \/ (exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
hyp: (i, a2) ∈m t

(i, a2) ∈m t \/ (exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1)
now 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
hyp: exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1)

(i, a2) ∈m t \/ (exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
hyp: exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1)

exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
hyp: exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m f (extract (w1, a1))

exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
hyp: exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m f a1

exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
x: W
a1: A
hyp1: (x, (j, a1)) ∈md t
hyp2: (i, a2) ∈m f a1

exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
x: W
a1: A
hyp1: (j, a1) ∈m t
hyp2: (i, a2) ∈m f a1

exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1
eauto.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A

(i, a2) ∈m t \/ (exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1) -> (i, a2) ∈m t \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
hyp: (i, a2) ∈m t

(i, a2) ∈m t \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
hyp: exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1
(i, a2) ∈m t \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
hyp: (i, a2) ∈m t

(i, a2) ∈m t \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1))
now 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
hyp: exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1

(i, a2) ∈m t \/ (exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2: A
hyp: exists a1 : A, (j, a1) ∈m t /\ (i, a2) ∈m f a1

exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2, a1: A
hyp1: (j, a1) ∈m t
hyp2: (i, a2) ∈m f a1

exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2, a1: A
hyp1: exists w : W, (w, (j, a1)) ∈md t
hyp2: (i, a2) ∈m f a1

exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2, a1: A
w1: W
hyp1: (w1, (j, a1)) ∈md t
hyp2: (i, a2) ∈m f a1

exists (w1 : W) (a1 : A), (w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> T j A
t: U A
a2, a1: A
w1: W
hyp1: (w1, (j, a1)) ∈md t
hyp2: (i, a2) ∈m f a1

(w1, (j, a1)) ∈md t /\ (i, a2) ∈m (f ∘ extract) (w1, a1)
auto. 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
j: K
A: Type

forall (f : W * A -> A) (t : U A) (a2 : A), (j, a2) ∈m kmapd U j f t <-> (exists (w : W) (a1 : A), (w, (j, a1)) ∈md t /\ a2 = f (w, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall (f : W * A -> A) (t : U A) (a2 : A), (j, a2) ∈m kmapd U j f t <-> (exists (w : W) (a1 : A), (w, (j, a1)) ∈md t /\ a2 = f (w, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> A
t: U A
a2: A

(j, a2) ∈m kmapd U j f t <-> (exists (w : W) (a1 : A), (w, (j, a1)) ∈md t /\ a2 = f (w, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> A
t: U A
a2: A

(j, a2) ∈m mmapd U (tgtd j f) t <-> (exists (w : W) (a1 : A), (w, (j, a1)) ∈md t /\ a2 = f (w, a1))
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: W * A -> A
t: U A
a2: A

(exists (w : W) (a : A), (w, (j, a)) ∈md t /\ a2 = tgtd j f j (w, a)) <-> (exists (w : W) (a1 : A), (w, (j, a1)) ∈md t /\ a2 = f (w, a1))
now rewrite tgtd_eq. 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
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> A) (t : U A) (a2 : A), (i, a2) ∈m kmapd U j f t <-> (i, a2) ∈m 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
j: K
A: Type

forall i : K, j <> i -> forall (f : W * A -> A) (t : U A) (a2 : A), (i, a2) ∈m kmapd U j f t <-> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
a2: A

(i, a2) ∈m kmapd U j f t <-> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
a2: A

(i, a2) ∈m mmapd U (tgtd j f) t <-> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
a2: A

(exists (w : W) (a : A), (w, (i, a)) ∈md t /\ a2 = tgtd j f i (w, a)) <-> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
a2: A

(exists (w : W) (a : A), (w, (i, a)) ∈md t /\ a2 = extract (w, a)) <-> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
a2: A

(exists (w : W) (a : A), (w, (i, a)) ∈md t /\ a2 = a) <-> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
a2: A

(exists (w : W) (a : A), (w, (i, a)) ∈md t /\ a2 = a) -> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
a2: A
(i, a2) ∈m t -> exists (w : W) (a : A), (w, (i, a)) ∈md t /\ a2 = 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
a2: A

(exists (w : W) (a : A), (w, (i, a)) ∈md t /\ a2 = a) -> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
w: W
a: A
hyp: (w, (i, a)) ∈md t

(i, a) ∈m t
eapply inmd_implies_in; eauto.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
a2: A

(i, a2) ∈m t -> exists (w : W) (a : A), (w, (i, a)) ∈md t /\ a2 = 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
a2: A
hyp: (i, a2) ∈m t

exists (w : W) (a : A), (w, (i, a)) ∈md t /\ a2 = 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
a2: A
hyp: exists w : W, (w, (i, a2)) ∈md t

exists (w : W) (a : A), (w, (i, a)) ∈md t /\ a2 = 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
j: K
A: Type
i: K
Hneq: j <> i
f: W * A -> A
t: U A
a2: A
w: W
hyp: (w, (i, a2)) ∈md t

exists (w : W) (a : A), (w, (i, a)) ∈md t /\ a2 = a
eauto. 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
j: K
A: Type

forall (f : A -> A) (t : U A) (a2 : A), (j, a2) ∈m kmap U j f t <-> (exists a1 : A, (j, a1) ∈m t /\ a2 = f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type

forall (f : A -> A) (t : U A) (a2 : A), (j, a2) ∈m kmap U j f t <-> (exists a1 : A, (j, a1) ∈m t /\ a2 = f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> A
t: U A
a2: A

(j, a2) ∈m kmap U j f t <-> (exists a1 : A, (j, a1) ∈m t /\ a2 = f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> A
t: U A
a2: A

(j, a2) ∈m mmap U (tgt j f) t <-> (exists a1 : A, (j, a1) ∈m t /\ a2 = f a1)
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
f: A -> A
t: U A
a2: A

(exists a : A, (j, a) ∈m t /\ a2 = tgt j f j a) <-> (exists a1 : A, (j, a1) ∈m t /\ a2 = f a1)
now rewrite tgt_eq. 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
j: K
A: Type

forall i : K, j <> i -> forall (f : A -> A) (t : U A) (a2 : A), (i, a2) ∈m kmap U j f t <-> (i, a2) ∈m 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
j: K
A: Type

forall i : K, j <> i -> forall (f : A -> A) (t : U A) (a2 : A), (i, a2) ∈m kmap U j f t <-> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
a2: A

(i, a2) ∈m kmap U j f t <-> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
a2: A

(i, a2) ∈m mmap U (tgt j f) t <-> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
a2: A

(exists a : A, (i, a) ∈m t /\ a2 = tgt j f i a) <-> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
a2: A

(exists a : A, (i, a) ∈m t /\ a2 = id a) <-> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
a2: A

(exists a : A, (i, a) ∈m t /\ a2 = id a) -> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
a2: A
(i, a2) ∈m t -> exists a : A, (i, a) ∈m t /\ a2 = id 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
a2: A

(exists a : A, (i, a) ∈m t /\ a2 = id a) -> (i, a2) ∈m 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
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
a: A
hyp: (i, a) ∈m t

(i, id a) ∈m t
assumption.
U: Type -> Type
ix: Index
W: Type
T: K -> Type -> Type
MReturn0: MReturn T
MBind0: MBind W T U
H: forall k : K, MBind W T (T k)
mn_op: Monoid_op W
mn_unit: Monoid_unit W
H0: MultiDecoratedTraversablePreModule W T U
MultiDecoratedTraversableMonad0: MultiDecoratedTraversableMonad W T
j: K
A: Type
i: K
Hneq: j <> i
f: A -> A
t: U A
a2: A

(i, a2) ∈m t -> exists a : A, (i, a) ∈m t /\ a2 = id a
intros; now (exists a2). Qed. End DTM_membership_targetted.