Built with Alectryon, running Coq+SerAPI v8.16.0+0.16.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
From Tealeaves Require Import
  Classes.Categorical.DecoratedFunctor
  Classes.Categorical.DecoratedMonad (shift, shift_map2, shift_spec, shift_zero, shift_extract)
  Classes.Categorical.RightComodule
  Classes.Categorical.Bimonad
  Functors.Early.Writer.

#[local] Generalizable Variables E T W F G.

Import Monad.Notations.
Import Strength.Notations.
Import Product.Notations.
Import Monoid.Notations.
Import Categorical.Monad.Notations.

#[local] Arguments map F%function_scope {Map} {A B}%type_scope f%function_scope _.
#[local] Arguments dec {E}%type_scope F%function_scope {Decorate} {A}%type_scope _.
#[local] Arguments ret T%function_scope {Return} (A)%type_scope _.
#[local] Arguments join T%function_scope {Join} {A}%type_scope _.

(** * A Decorated Functor is Precisely a Right comodule of <<(E ×)>> *)
(**********************************************************************)
Definition RightComodule_DecoratedFunctor
  `{DecoratedFunctor E F}
 : RightComodule F (prod E) :=
  {| rcom_coaction_coaction := dfun_dec_dec;
     rcom_map_extr_coaction := dfun_dec_extract;
  |}.

Definition DecoratedFunctor_RightComodule
  `{Map F} `{RightCoaction F (prod E)}
  `{! RightComodule F (prod E)} `{Monoid E}
 : DecoratedFunctor E F :=
  {| dfun_dec_dec := rcom_coaction_coaction;
     dfun_dec_extract := rcom_map_extr_coaction;
  |}.

(** * Decorated Functors Form a Monoidal Category *)
(**********************************************************************)

(** ** Null-Decorated Functors *)
(** Every functor is trivially decorated using the operation that
    pairs each leaf with the unit of the monoid. We call such functors
    null-decorated. This allows us to see _all_ functors as (maybe
    trivially) decorated. *)
(**********************************************************************)
Section DecoratedFunctor_Zero.

  Context
    `{Monoid W}
    `{Functor F}.

  Instance Decorate_zero: Decorate W F :=
    fun A => @map F _ A (W * A) (pair Ƶ).

  
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F

Natural (@dec W F Decorate_zero)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F

Natural (@dec W F Decorate_zero)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F

forall (A B : Type) (f : A -> B), map (F ○ prod W) f ∘ dec F = dec F ∘ map F f
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F
A, B: Type
f: A -> B

map (F ○ prod W) f ∘ dec F = dec F ∘ map F f
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F
A, B: Type
f: A -> B

map F (map (prod W) f) ∘ map F (pair Ƶ) = map F (pair Ƶ) ∘ map F f
now do 2 rewrite fun_map_map. Qed.
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F
A: Type

dec F ∘ dec F = map F cojoin ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F
A: Type

dec F ∘ dec F = map F cojoin ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F
A: Type

dec F ∘ dec F = map F cojoin ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F
A: Type

map F (pair Ƶ) ∘ map F (pair Ƶ) = map F cojoin ∘ map F (pair Ƶ)
now do 2 rewrite fun_map_map. Qed.
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F
A: Type

map F extract ∘ dec F = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F
A: Type

map F extract ∘ dec F = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F
A: Type

map F extract ∘ dec F = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F
A: Type

map F extract ∘ map F (pair Ƶ) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F
A: Type

map F (extract ∘ pair Ƶ) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
Map_F: Map F
H0: Functor F
A: Type

map F (fun a : A => a) = id
now rewrite fun_map_id. Qed. Instance DecoratedFunctor_zero: DecoratedFunctor W F := {| dfun_dec_natural := Natural_dec_zero; dfun_dec_dec := @dec_dec_zero; dfun_dec_extract := @dec_extract_zero; |}. End DecoratedFunctor_Zero. (** ** The Identity Null-Decorated functor *) (**********************************************************************) Section DecoratedFunctor_I. Context `{Monoid W}. Definition dec_I: forall A, A -> prod W A := fun A => @pair W A Ƶ. #[global] Instance Decorate_I: Decorate W (fun A => A) := dec_I.
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W

Natural (fun A : Type => dec (fun A0 : Type => A0))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W

Natural (fun A : Type => dec (fun A0 : Type => A0))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W

forall (A B : Type) (f : A -> B), map (prod W) f ∘ dec (fun A0 : Type => A0) = dec (fun A0 : Type => A0) ∘ map (fun H : Type => H) f
reflexivity. Qed.
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
A: Type

dec (fun A : Type => A) ∘ dec (fun A : Type => A) = map (fun A : Type => A) (fun '(n, a) => (n, (n, a))) ∘ dec (fun A : Type => A)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
A: Type

dec (fun A : Type => A) ∘ dec (fun A : Type => A) = map (fun A : Type => A) (fun '(n, a) => (n, (n, a))) ∘ dec (fun A : Type => A)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
A: Type

dec (fun A : Type => A) ∘ dec (fun A : Type => A) = map (fun A : Type => A) (fun '(n, a) => (n, (n, a))) ∘ dec (fun A : Type => A)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
A: Type

pair unit0 ○ pair unit0 = pair unit0 ○ pair unit0
reflexivity. Qed.
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
A: Type

map (fun A : Type => A) extract ∘ dec (fun A : Type => A) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
A: Type

map (fun A : Type => A) extract ∘ dec (fun A : Type => A) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
A: Type

map (fun A : Type => A) extract ∘ dec (fun A : Type => A) = id
reflexivity. Qed. #[global] Instance DecoratedFunctor_I: DecoratedFunctor W (fun A => A) := {| dfun_dec_natural := Natural_dec_I; dfun_dec_dec := @dec_dec_I; dfun_dec_extract := @dec_extract_I; |}. End DecoratedFunctor_I. (** ** Decorated Functors are Closed under Composition *) (**********************************************************************) Section Decoratedfunctor_composition. Context `{Monoid W} `{Map F} `{Map G} `{Decorate W F} `{Decorate W G} `{! DecoratedFunctor W F} `{! DecoratedFunctor W G}. #[global] Instance Decorate_compose: Decorate W (F ∘ G) := fun A => map F (shift G) ∘ dec F ∘ map F (dec G).
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G

Natural (fun A : Type => dec (F ∘ G))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G

Natural (fun A : Type => dec (F ∘ G))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G

forall (A B : Type) (f : A -> B), map (F ∘ G ○ prod W) f ∘ dec (F ∘ G) = dec (F ∘ G) ∘ map (F ∘ G) f
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map (F ∘ G ○ prod W) f ∘ dec (F ∘ G) = dec (F ∘ G) ∘ map (F ∘ G) f
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map (F ∘ G) (map (prod W) f) ∘ dec (F ∘ G) = dec (F ∘ G) ∘ map F (map G f)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (map G (map (prod W) f)) ∘ dec (F ∘ G) = dec (F ∘ G) ∘ map F (map G f)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (map G (map (prod W) f)) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (map G f)
(* Move << F (shift G)>> past <<F (G ∘ F) f>>. *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (map G (map (prod W) f)) ∘ map F (shift G) ∘ dec F ∘ map F (dec G) = map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (map G f)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (map G (map (prod W) f) ∘ shift G) ∘ dec F ∘ map F (dec G) = map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (map G f)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (map (G ∘ prod W) f ∘ shift G) ∘ dec F ∘ map F (dec G) = map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (map G f)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (map (G ∘ prod W) f ∘ shift G) ∘ dec F ∘ map F (dec G) = map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (map G f)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (shift G ∘ map (prod W ∘ G ∘ prod W) f) ∘ dec F ∘ map F (dec G) = map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (map G f)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (shift G ∘ map (prod W ∘ G ∘ prod W) f) ∘ dec F ∘ map F (dec G) = map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (map G f)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (shift G) ∘ map F (map (prod W ∘ G ∘ prod W) f) ∘ dec F ∘ map F (dec G) = map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (map G f)
(* mov <<dec F>> past <<F ∘ W ∘ G ∘ W f>> *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (shift G) ∘ map (F ∘ prod W) (map (G ∘ prod W) f) ∘ dec F ∘ map F (dec G) = map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (map G f)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (shift G) ∘ (map (F ∘ prod W) (map (G ∘ prod W) f) ∘ dec F ∘ map F (dec G)) = map F (shift G) ∘ (dec F ∘ (map F (dec G) ∘ map F (map G f)))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (shift G) ∘ (dec F ∘ map F (map (G ∘ prod W) f) ∘ map F (dec G)) = map F (shift G) ∘ (dec F ∘ (map F (dec G) ∘ map F (map G f)))
(* move <<F (dec G)>> past <<F ((G ∘ W) f)>> *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (shift G) ∘ (dec F ∘ (map F (map (G ∘ prod W) f) ∘ map F (dec G))) = map F (shift G) ∘ (dec F ∘ (map F (dec G) ∘ map F (map G f)))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (shift G) ∘ (dec F ∘ map F (map (G ∘ prod W) f ∘ dec G)) = map F (shift G) ∘ (dec F ∘ (map F (dec G) ∘ map F (map G f)))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (shift G) ∘ (dec F ∘ map F (map (G ∘ prod W) f ∘ dec G)) = map F (shift G) ∘ (dec F ∘ (map F (dec G) ∘ map F (map G f)))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (shift G) ∘ (dec F ∘ map F (dec G ∘ map G f)) = map F (shift G) ∘ (dec F ∘ (map F (dec G) ∘ map F (map G f)))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A, B: Type
f: A -> B

map F (shift G) ∘ (dec F ∘ map F (dec G ∘ map G f)) = map F (shift G) ∘ (dec F ∘ (map F (dec G) ∘ map F (map G f)))
now rewrite <- (fun_map_map (F := F)). Qed. (** The next few lemmas are used to build up a proof of the "double decoration law", [dfun_dec_dec (F ∘ G)] *) (** Split the decoration wire on <<G>> into two wires with <<dfun_dec_dec G>> law. *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map (G ∘ prod W) cojoin ∘ σ) ∘ dec F ∘ map F (dec G) = map F (σ) ∘ dec F ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map (G ∘ prod W) cojoin ∘ σ) ∘ dec F ∘ map F (dec G) = map F (σ) ∘ dec F ∘ map F (dec G ∘ dec G)
(* Move <<F (strength)>> past <<F ((W ○ G) (cojoin (prod W)))>> *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ ∘ map (prod W ○ G) cojoin) ∘ dec F ∘ map F (dec G) = map F (σ) ∘ dec F ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ ∘ map (prod W) (map G cojoin)) ∘ dec F ∘ map F (dec G) = map F (σ) ∘ dec F ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ map F (map (prod W) (map G cojoin)) ∘ dec F ∘ map F (dec G) = map F (σ) ∘ dec F ∘ map F (dec G ∘ dec G)
(* Move <<dec F>> past <<F ((W ○ G) (cojoin (prod W)))>> *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ map (F ∘ prod W) (map G cojoin) ∘ dec F ∘ map F (dec G) = map F (σ) ∘ dec F ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ (map (F ∘ prod W) (map G cojoin) ∘ dec F) ∘ map F (dec G) = map F (σ) ∘ dec F ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ (dec F ∘ map F (map G cojoin)) ∘ map F (dec G) = map F (σ) ∘ dec F ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ (dec F ∘ (map F (map G cojoin) ∘ map F (dec G))) = map F (σ) ∘ dec F ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ (dec F ∘ map F (map G cojoin ∘ dec G)) = map F (σ) ∘ dec F ∘ map F (dec G ∘ dec G)
now rewrite <- (dfun_dec_dec (E := W) (F := G)). Qed.
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map G cojoin ∘ σ = σ ∘ map (prod W) (σ) ∘ cojoin
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map G cojoin ∘ σ = σ ∘ map (prod W) (σ) ∘ cojoin
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type
w: W
a: G A

(map G cojoin ∘ σ) (w, a) = (σ ∘ map (prod W) (σ) ∘ cojoin) (w, a)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type
w: W
a: G A

map G cojoin (map G (pair w) a) = (let '(a, t) := map (prod W) (fun '(a, t) => map G (pair a) t) (cojoin (w, a)) in map G (pair a) t)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type
w: W
a: G A

map G cojoin (map G (pair w) a) = map G (pair (id w)) (map G (pair w) a)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type
w: W
a: G A

(map G cojoin ∘ map G (pair w)) a = (map G (pair (id w)) ∘ map G (pair w)) a
now do 2 rewrite (fun_map_map (F := G)). Qed. (** Split the decoration wire on <<F>> into two wires with <<dfun_dec_dec F>>. *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G cojoin ∘ σ) ∘ dec F = map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G cojoin ∘ σ) ∘ dec F = map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ ∘ map (prod W) (σ) ∘ cojoin) ∘ dec F = map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ ∘ map (prod W) (σ)) ∘ map F cojoin ∘ dec F = map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ ∘ map (prod W) (σ)) ∘ (map F cojoin ∘ dec F) = map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ ∘ map (prod W) (σ)) ∘ (dec F ∘ dec F) = map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ ∘ map (prod W) (σ)) ∘ dec F ∘ dec F = map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ map F (map (prod W) (σ)) ∘ dec F ∘ dec F = map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ (map F (map (prod W) (σ)) ∘ dec F) ∘ dec F = map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ (map (F ∘ prod W) (σ) ∘ dec F) ∘ dec F = map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F
now rewrite (natural (ϕ := @dec W F _) (strength (B := A))). Qed. (** Slide the upper decoration wire on <<G>> past the lower decoration wire on <<F>>, which requires crossing them. *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ dec F ∘ map F (dec G) = map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ dec F ∘ map F (dec G) = map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ dec F ∘ map F (dec G) = map (F ∘ G) (σ) ∘ map F (dec G) ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ dec F ∘ map F (dec G) = map (F ∘ G) (σ) ∘ map F (dec G) ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ dec F ∘ map F (dec G) = map F (map G (σ) ∘ dec G) ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ dec F ∘ map F (dec G) = map F (map G (σ) ∘ dec G ∘ σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ dec F ∘ map F (dec G) = map F (map G (σ) ∘ dec G ∘ σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ (dec F ∘ map F (dec G)) = map F (map G (σ) ∘ dec G ∘ σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ (map (F ○ prod W) (dec G) ∘ dec F) = map F (map G (σ) ∘ dec G ∘ σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ (map F (map (prod W) (dec G)) ∘ dec F) = map F (map G (σ) ∘ dec G ∘ σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ) ∘ map F (map (prod W) (dec G)) ∘ dec F = map F (map G (σ) ∘ dec G ∘ σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ ∘ map (prod W) (dec G)) ∘ dec F = map F (map G (σ) ∘ dec G ∘ σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (σ ∘ map (prod W) (dec G)) = map F (map G (σ) ∘ dec G ∘ σ)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

σ ∘ map (prod W) (dec G) = map G (σ) ∘ dec G ∘ σ
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type
w: W
x: G A

map G (pair (id w)) (dec G x) = map G (σ) (dec G (map G (pair w) x))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type
w: W
x: G A

(map G (pair (id w)) ∘ dec G) x = map G (σ) ((dec G ∘ map G (pair w)) x)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type
w: W
x: G A

(map G (pair (id w)) ∘ dec G) x = map G (σ) ((map (G ○ prod W) (pair w) ∘ dec G) x)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type
w: W
x: G A

(map G (pair (id w)) ∘ dec G) x = map G (σ) ((map G (map (prod W) (pair w)) ∘ dec G) x)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type
w: W
x: G A

(map G (pair (id w)) ∘ dec G) x = (map G (σ) ∘ (map G (map (prod W) (pair w)) ∘ dec G)) x
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type
w: W
x: G A

(map G (pair (id w)) ∘ dec G) x = (map G (σ) ∘ map G (map (prod W) (pair w)) ∘ dec G) x
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type
w: W
x: G A

(map G (pair (id w)) ∘ dec G) x = (map G (σ ∘ map (prod W) (pair w)) ∘ dec G) x
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type
w: W
x: G A

map G (pair w) (dec G x) = map G (fun a : W * A => let '(a0, t) := map (prod W) (pair w) a in map (prod W) (pair a0) t) (dec G x)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type
w: W
x: G A

pair w = (fun a : W * A => let '(a0, t) := map (prod W) (pair w) a in map (prod W) (pair a0) t)
now ext [? ?]. Qed. (** Re-arrange using naturality *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G

forall A : Type, map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ (map F (map G (μ (prod W))) ∘ map F (σ)) ∘ dec F ∘ map F (dec G) = map F (map G (μ (prod W)) ∘ map G (map (prod W ∘ prod W) (μ (prod W))) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G

forall A : Type, map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ (map F (map G (μ (prod W))) ∘ map F (σ)) ∘ dec F ∘ map F (dec G) = map F (map G (μ (prod W)) ∘ map G (map (prod W ∘ prod W) (μ (prod W))) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ (map F (map G (μ (prod W))) ∘ map F (σ)) ∘ dec F ∘ map F (dec G) = map F (map G (μ (prod W)) ∘ map G (map (prod W ∘ prod W) (μ (prod W))) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ (map F (map G (μ (prod W))) ∘ map F (σ)) ∘ dec F = map F (map G (μ (prod W)) ∘ map G (map (prod W ∘ prod W) (μ (prod W))) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ) ∘ dec F
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ (map F (map G (μ (prod W))) ∘ map F (σ)) = map F (map G (μ (prod W)) ∘ map G (map (prod W ∘ prod W) (μ (prod W))) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) ∘ map F (σ) = map F (map G (μ (prod W)) ∘ map G (map (prod W ∘ prod W) (μ (prod W))) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) ∘ map F (σ) = map F (map G (μ (prod W)) ∘ map G (map (prod W) (map (prod W) (μ (prod W)))) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) ∘ map F (σ) = map F (map G (μ (prod W)) ∘ map (G ○ prod W) (map (prod W) (μ (prod W))) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) ∘ map F (σ) = map F (map G (μ (prod W)) ∘ (map (G ○ prod W) (map (prod W) (μ (prod W))) ∘ σ)) ∘ dec F ∘ map F (dec G) ∘ map F (σ)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) ∘ map F (σ) = map F (map G (μ (prod W)) ∘ (σ ∘ map (prod W ○ G) (map (prod W) (μ (prod W))))) ∘ dec F ∘ map F (dec G) ∘ map F (σ)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) ∘ map F (σ) = map F (map G (μ (prod W))) ∘ map F (σ ∘ map (prod W ○ G) (map (prod W) (μ (prod W)))) ∘ dec F ∘ map F (dec G) ∘ map F (σ)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) ∘ map F (σ) = map F (map G (μ (prod W))) ∘ (map F (σ) ∘ map F (map (prod W ○ G) (map (prod W) (μ (prod W))))) ∘ dec F ∘ map F (dec G) ∘ map F (σ)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) ∘ map F (σ) = map F (map G (μ (prod W))) ∘ (map F (σ) ∘ map F (map (prod W ○ G) (map (prod W) (μ (prod W)))) ∘ dec F) ∘ map F (dec G) ∘ map F (σ)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) ∘ map F (σ) = map F (map G (μ (prod W))) ∘ (map F (σ) ∘ map (F ○ prod W) (map G (map (prod W) (μ (prod W)))) ∘ dec F) ∘ map F (dec G) ∘ map F (σ)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ (map F (σ) ∘ dec F) ∘ map F (dec G) ∘ map F (map G (μ (prod W))) ∘ map F (σ) = map F (map G (μ (prod W))) ∘ (map F (σ) ∘ (map (F ○ prod W) (map G (map (prod W) (μ (prod W)))) ∘ dec F)) ∘ map F (dec G) ∘ map F (σ)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ (map F (σ) ∘ dec F) ∘ map F (dec G) ∘ map F (map G (μ (prod W))) ∘ map F (σ) = map F (map G (μ (prod W))) ∘ (map F (σ) ∘ (dec F ∘ map F (map G (map (prod W) (μ (prod W)))))) ∘ map F (dec G) ∘ map F (σ)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ (map F (σ) ∘ dec F) ∘ map F (dec G) ∘ map F (map G (μ (prod W))) = map F (map G (μ (prod W))) ∘ (map F (σ) ∘ (dec F ∘ map F (map G (map (prod W) (μ (prod W)))))) ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) = map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (map G (map (prod W) (μ (prod W)))) ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) = map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ (map F (map G (map (prod W) (μ (prod W)))) ∘ map F (dec G))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) = map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (map G (map (prod W) (μ (prod W))) ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) = map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (map (G ∘ prod W) (μ (prod W)) ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) = map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G ∘ map G (μ (prod W)))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (μ (prod W))) = map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ (map F (dec G) ∘ map F (map G (μ (prod W))))
reflexivity. Qed. #[local] Set Keyed Unification.
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

dec (F ∘ G) ∘ dec (F ∘ G) = map (F ∘ G) cojoin ∘ dec (F ∘ G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

dec (F ∘ G) ∘ dec (F ∘ G) = map (F ∘ G) cojoin ∘ dec (F ∘ G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

dec (F ∘ G) ∘ dec (F ∘ G) = map (F ∘ G) cojoin ∘ dec (F ∘ G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G cojoin) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G))
(* Rewrite the RHS with the butterfly law *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G cojoin) ∘ map F (shift G) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G cojoin ∘ shift G) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G cojoin ∘ (map G (uncurry incr) ∘ σ)) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G cojoin ∘ map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (cojoin ∘ uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (cojoin ∘ μ (prod W)) ∘ σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W)) ∘ cojoin ∘ map (prod W) cojoin) ∘ σ) ∘ dec F ∘ map F (dec G)
(* Rewrite the outer (prod W) wire with the <<dfun_dec_dec>> law *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W)) ∘ cojoin) ∘ map G (map (prod W) cojoin) ∘ σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W)) ∘ cojoin) ∘ map (G ∘ prod W) cojoin ∘ σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W)) ∘ cojoin) ∘ (map (G ∘ prod W) cojoin ∘ σ)) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W)) ∘ cojoin)) ∘ map F (map (G ∘ prod W) cojoin ∘ σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W)) ∘ cojoin)) ∘ (map F (map (G ∘ prod W) cojoin ∘ σ) ∘ dec F ∘ map F (dec G))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W)) ∘ cojoin)) ∘ (map F (σ) ∘ dec F ∘ map F (dec G ∘ dec G))
(* Rewrite the outer (prod W) wire with the <<dfun_dec_dec>> law *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W)) ∘ cojoin)) ∘ map F (σ) ∘ dec F ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W)) ∘ cojoin) ∘ σ) ∘ dec F ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W))) ∘ map G cojoin ∘ σ) ∘ dec F ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W))) ∘ (map G cojoin ∘ σ)) ∘ dec F ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W)))) ∘ map F (map G cojoin ∘ σ) ∘ dec F ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W)))) ∘ (map F (map G cojoin ∘ σ) ∘ dec F) ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W)))) ∘ (map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F) ∘ map F (dec G ∘ dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map (F ∘ G) (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W))) ∘ (map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F) ∘ map F (dec G ∘ dec G)
(* Slide a decoration on <<F>> and one on <<G>> past each other *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map (F ∘ G) (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W))) ∘ (map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F) ∘ (map F (dec G) ∘ map F (dec G))
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = map (F ∘ G) (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (shift G) ∘ dec F ∘ map F (dec G) = map (F ∘ G) (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (shift G) ∘ dec F ∘ map F (dec G) = map (F ∘ G) (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ map (F ∘ G) (map (prod W) (bdist (prod W) (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (shift G) ∘ dec F ∘ map F (dec G) = map (F ∘ G) (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ map (F ∘ G) (map (prod W) (bdist (prod W) (prod W))) ∘ map F (σ) ∘ dec F ∘ (map F (σ) ∘ dec F ∘ map F (dec G)) ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (shift G) ∘ dec F ∘ map F (dec G) = map (F ∘ G) (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ map (F ∘ G) (map (prod W) (bdist (prod W) (prod W))) ∘ map F (σ) ∘ dec F ∘ (map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F) ∘ map F (dec G)
(* Flatten out a distribution bubble. Move the second decoration on <<F>> out of the way to juxtapose the two distributions. *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) ∘ map F (shift G) ∘ dec F ∘ map F (dec G) = map (F ∘ G) (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W))) ∘ map F (σ) ∘ dec F ∘ (map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F) ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map (F ∘ G) (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W))) ∘ map F (σ) ∘ dec F ∘ (map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F) ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W) ∘ map (prod W) (bdist (prod W) (prod W))) ∘ σ) ∘ dec F ∘ (map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F) ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ map G (map (prod W) (bdist (prod W) (prod W))) ∘ σ) ∘ dec F ∘ (map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F) ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ map (G ○ prod W) (bdist (prod W) (prod W)) ∘ σ) ∘ dec F ∘ (map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F) ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ (map (G ○ prod W) (bdist (prod W) (prod W)) ∘ σ)) ∘ dec F ∘ (map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F) ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ (σ ∘ map (prod W ○ G) (bdist (prod W) (prod W)))) ∘ dec F ∘ (map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F) ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ σ ∘ map (prod W ○ G) (bdist (prod W) (prod W))) ∘ dec F ∘ map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ σ) ∘ map F (map (prod W ○ G) (bdist (prod W) (prod W))) ∘ dec F ∘ map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ σ) ∘ map (F ∘ prod W) (map G (bdist (prod W) (prod W))) ∘ dec F ∘ map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ σ) ∘ (map (F ∘ prod W) (map G (bdist (prod W) (prod W))) ∘ dec F) ∘ map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ σ) ∘ (dec F ∘ map F (map G (bdist (prod W) (prod W)))) ∘ map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ σ) ∘ dec F ∘ map F (map G (bdist (prod W) (prod W))) ∘ map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ σ) ∘ dec F ∘ map (F ∘ G) (bdist (prod W) (prod W)) ∘ map (F ∘ G) (bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ σ) ∘ dec F ∘ (map (F ∘ G) (bdist (prod W) (prod W)) ∘ map (F ∘ G) (bdist (prod W) (prod W))) ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ σ) ∘ dec F ∘ map (F ∘ G) (bdist (prod W) (prod W) ∘ bdist (prod W) (prod W)) ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ σ) ∘ dec F ∘ map (F ∘ G) id ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ σ) ∘ dec F ∘ id ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (map (prod W) (μ (prod W)) ∘ μ (prod W)) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
(* final cleanup *)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (μ (prod W) ∘ map (prod W ∘ prod W) (μ (prod W))) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (μ (prod W)) ∘ map G (map (prod W ∘ prod W) (μ (prod W))) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr)) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ map F (map G (uncurry incr) ∘ σ) ∘ dec F ∘ map F (dec G) = map F (map G (μ (prod W)) ∘ map G (map (prod W ∘ prod W) (μ (prod W))) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (uncurry incr)) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ (map F (map G (uncurry incr)) ∘ map F (σ)) ∘ dec F ∘ map F (dec G) = map F (map G (μ (prod W)) ∘ map G (map (prod W ∘ prod W) (μ (prod W))) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G (μ (prod W))) ∘ map F (σ) ∘ dec F ∘ map F (dec G) ∘ (map F (map G (μ (prod W))) ∘ map F (σ)) ∘ dec F ∘ map F (dec G) = map F (map G (μ (prod W)) ∘ map G (map (prod W ∘ prod W) (μ (prod W))) ∘ σ) ∘ dec F ∘ map F (dec G) ∘ map F (σ) ∘ dec F ∘ map F (dec G)
apply dec_dec_compose_5. Qed. #[local] Unset Keyed Unification.
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map (F ∘ G) extract ∘ dec (F ∘ G) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map (F ∘ G) extract ∘ dec (F ∘ G) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map (F ∘ G) extract ∘ dec (F ∘ G) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G extract) ∘ (map F (shift G) ∘ dec F ∘ map F (dec G)) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G extract) ∘ map F (shift G) ∘ dec F ∘ map F (dec G) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G extract) ∘ map F (shift G) ∘ dec F ∘ map F (dec G) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G extract ∘ shift G) ∘ dec F ∘ map F (dec G) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G extract ∘ extract) ∘ dec F ∘ map F (dec G) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G extract) ∘ map F extract ∘ dec F ∘ map F (dec G) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G extract) ∘ (map F extract ∘ (dec F ∘ map F (dec G))) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G extract) ∘ (map F extract ∘ dec F ∘ map F (dec G)) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G extract) ∘ (id ∘ map F (dec G)) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G extract) ∘ map F (dec G) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F (map G extract ∘ dec G) = id
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
F: Type -> Type
H0: Map F
G: Type -> Type
H1: Map G
H2: Decorate W F
H3: Decorate W G
DecoratedFunctor0: DecoratedFunctor W F
DecoratedFunctor1: DecoratedFunctor W G
A: Type

map F id = id
now rewrite (fun_map_id (F := F)). Qed. #[global] Instance DecoratedFunctor_compose: DecoratedFunctor W (F ∘ G) := {| dfun_dec_natural := Natural_dec_compose; dfun_dec_dec := @dec_dec_compose; dfun_dec_extract := @dec_extract_compose; |}. End Decoratedfunctor_composition. (** ** Category Laws for Composition of Decorated Functors *) (** Next we prove that composition of decorated functors satisfies the laws of a category, i.e. that composition with the identity decorated functor on the left or is the identity, and that composition is associative. This is not immediately obvious because in each case we must verify that the <<dec>> operation is the same for both sides. *) (**********************************************************************) Section DecoratedFunctor_composition_laws. Section identity_laws. (** Let <<T>> be a decorated functor. *) Context `{Functor T} `{dec_T: Decorate W T} `{op: Monoid_op W} `{unit: Monoid_unit W} `{! DecoratedFunctor W T} `{! Monoid W}. (** *** Composition with a zero-decorated functor *) (** When <<F>> has a trivial decoration, <<dec (F ∘T)>> and <<dec (T ∘ F)>> have a special form. *) (******************************************************************) Section zero_decorated_composition. (** Let <<F>> be a functor, which we will treat as zero-decorated. *) Context (F: Type -> Type) `{Functor F}. (** Composition with a zero-decorated functor on the left returns <<T>>. *)
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F

forall A : Type, dec (F ∘ T) = map F (dec T)
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F

forall A : Type, dec (F ∘ T) = map F (dec T)
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

dec (F ∘ T) = map F (dec T)
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map F (shift T) ∘ dec F ∘ map F (dec T) = map F (dec T)
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map F (shift T) ∘ map F (pair Ƶ) ∘ map F (dec T) = map F (dec T)
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map F (shift T ∘ pair Ƶ ∘ dec T) = map F (dec T)
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

shift T ∘ pair Ƶ ∘ dec T = dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (uncurry incr) ∘ σ ∘ pair Ƶ ∘ dec T = dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (uncurry incr) ∘ (σ ∘ pair Ƶ) ∘ dec T = dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (uncurry incr) ∘ map T (pair Ƶ) ∘ dec T = dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (uncurry incr ∘ pair Ƶ) ∘ dec T = dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (uncurry incr ∘ η (prod W) (W * A)) ∘ dec T = dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (μ (prod W) ∘ η (prod W) (W * A)) ∘ dec T = dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T id ∘ dec T = dec T
now rewrite (fun_map_id (F := T)). Qed. (** Composition with the identity functor on the left returns <<T>>. *)
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F

forall A : Type, dec (T ∘ F) = map T (σ) ∘ dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F

forall A : Type, dec (T ∘ F) = map T (σ) ∘ dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

dec (T ∘ F) = map T (σ) ∘ dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (shift F) ∘ dec T ∘ map T (dec F) = map T (σ) ∘ dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (shift F) ∘ dec T ∘ map T (map F (pair Ƶ)) = map T (σ) ∘ dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (shift F) ∘ (dec T ∘ map T (map F (pair Ƶ))) = map T (σ) ∘ dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (shift F) ∘ (map (T ○ prod W) (map F (pair Ƶ)) ∘ dec T) = map T (σ) ∘ dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (shift F) ∘ map (T ○ prod W) (map F (pair Ƶ)) ∘ dec T = map T (σ) ∘ dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (shift F) ∘ map (T ○ prod W) (map F (pair Ƶ)) = map T (σ)
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (shift F) ∘ map T (map (prod W) (map F (pair Ƶ))) = map T (σ)
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

map T (shift F ∘ map (prod W) (map F (pair Ƶ))) = map T (σ)
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type

shift F ∘ map (prod W) (map F (pair Ƶ)) = σ
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type
w: W
t: F A

shift F (id w, map F (pair Ƶ) t) = map F (pair w) t
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type
w: W
t: F A

shift F (w, map F (pair Ƶ) t) = map F (pair w) t
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type
w: W
t: F A

map F (map_fst (fun m : W => w ● m)) (map F (pair Ƶ) t) = map F (pair w) t
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type
w: W
t: F A

(map F (map_fst (fun m : W => w ● m)) ∘ map F (pair Ƶ)) t = map F (pair w) t
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type
w: W
t: F A

map F (map_fst (fun m : W => w ● m) ∘ pair Ƶ) t = map F (pair w) t
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type
w: W
t: F A

map_fst (fun m : W => w ● m) ∘ pair Ƶ = pair w
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
F: Type -> Type
Map_F0: Map F
H0: Functor F
A: Type
w: W
t: F A
a: A

(w ● Ƶ, id a) = (w, a)
now simpl_monoid. Qed. End zero_decorated_composition. (** *** Composition with the identity decorated functor *) (******************************************************************)
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W

forall A : Type, dec ((fun A0 : Type => A0) ∘ T) = dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W

forall A : Type, dec ((fun A0 : Type => A0) ∘ T) = dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
A: Type

dec ((fun A : Type => A) ∘ T) = dec T
now rewrite (decorate_zero_compose_l (fun A => A)). Qed.
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W

forall A : Type, dec (T ∘ (fun A0 : Type => A0)) = dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W

forall A : Type, dec (T ∘ (fun A0 : Type => A0)) = dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
A: Type

dec (T ∘ (fun A : Type => A)) = dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
A: Type

map T (σ) ∘ dec T = dec T
T: Type -> Type
Map_F: Map T
H: Functor T
W: Type
dec_T: Decorate W T
op: Monoid_op W
unit: Monoid_unit W
DecoratedFunctor0: DecoratedFunctor W T
Monoid0: Monoid W
A: Type

map T id ∘ dec T = dec T
now rewrite (fun_map_id (F := T)). Qed. End identity_laws. Section associativity_law. Context `{op: Monoid_op W} `{unit: Monoid_unit W} `{! Monoid W} `{Map T1} `{Map T2} `{Map T3} `{dec_T1: Decorate W T1} `{dec_T2: Decorate W T2} `{dec_T3: Decorate W T3} `{! DecoratedFunctor W T1} `{! DecoratedFunctor W T2} `{! DecoratedFunctor W T3}.
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3

forall A : Type, map T2 (map T1 (μ (prod W)) ∘ σ ∘ μ (prod W)) ∘ σ = map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3

forall A : Type, map T2 (map T1 (μ (prod W)) ∘ σ ∘ μ (prod W)) ∘ σ = map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T2 (map T1 (μ (prod W)) ∘ σ ∘ μ (prod W)) ∘ σ = map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))

(map T2 (map T1 (μ (prod W)) ∘ σ ∘ μ (prod W)) ∘ σ) (w1, t) = (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) (w1, t)
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))

map T2 (fun a : W * (W * T1 (W * A)) => map T1 (μ (prod W)) (σ (μ (prod W) a))) (map T2 (pair w1) t) = map T2 (map T1 (μ (prod W)) ○ σ) (map T2 (pair (id w1)) (map T2 (map T1 (μ (prod W)) ○ σ) t))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))

(map T2 (fun a : W * (W * T1 (W * A)) => map T1 (μ (prod W)) (σ (μ (prod W) a))) ∘ map T2 (pair w1)) t = map T2 (map T1 (μ (prod W)) ○ σ) ((map T2 (pair (id w1)) ∘ map T2 (map T1 (μ (prod W)) ○ σ)) t)
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))

(map T2 (fun a : W * (W * T1 (W * A)) => map T1 (μ (prod W)) (σ (μ (prod W) a))) ∘ map T2 (pair w1)) t = map T2 (map T1 (μ (prod W)) ○ σ) ((map T2 (pair w1) ∘ map T2 (map T1 (μ (prod W)) ○ σ)) t)
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))

map T2 ((fun a : W * (W * T1 (W * A)) => map T1 (μ (prod W)) (σ (μ (prod W) a))) ∘ pair w1) t = map T2 (map T1 (μ (prod W)) ○ σ) (map T2 (pair w1 ∘ (map T1 (μ (prod W)) ○ σ)) t)
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))

map T2 ((fun a : W * (W * T1 (W * A)) => map T1 (μ (prod W)) (σ (μ (prod W) a))) ∘ pair w1) t = (map T2 (map T1 (μ (prod W)) ○ σ) ∘ map T2 (pair w1 ∘ (map T1 (μ (prod W)) ○ σ))) t
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))

map T2 ((fun a : W * (W * T1 (W * A)) => map T1 (μ (prod W)) (σ (μ (prod W) a))) ∘ pair w1) t = map T2 (map T1 (μ (prod W)) ○ σ ∘ (pair w1 ∘ (map T1 (μ (prod W)) ○ σ))) t
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))

(fun a : W * (W * T1 (W * A)) => map T1 (μ (prod W)) (σ (μ (prod W) a))) ∘ pair w1 = map T1 (μ (prod W)) ○ σ ∘ (pair w1 ∘ (map T1 (μ (prod W)) ○ σ))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))
w2: W
t2: T1 (W * A)

((fun a : W * (W * T1 (W * A)) => map T1 (μ (prod W)) (σ (μ (prod W) a))) ∘ pair w1) (w2, t2) = (map T1 (μ (prod W)) ○ σ ∘ (pair w1 ∘ (map T1 (μ (prod W)) ○ σ))) (w2, t2)
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))
w2: W
t2: T1 (W * A)

map T1 (μ (prod W)) (map T1 (pair (w1 ● w2)) (id t2)) = map T1 (μ (prod W)) (map T1 (pair w1) (map T1 (μ (prod W)) (map T1 (pair w2) t2)))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))
w2: W
t2: T1 (W * A)

map T1 (μ (prod W)) (map T1 (pair (w1 ● w2)) t2) = map T1 (μ (prod W)) (map T1 (pair w1) (map T1 (μ (prod W)) (map T1 (pair w2) t2)))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))
w2: W
t2: T1 (W * A)

(map T1 (μ (prod W)) ∘ map T1 (pair (w1 ● w2))) t2 = map T1 (μ (prod W)) (map T1 (pair w1) ((map T1 (μ (prod W)) ∘ map T1 (pair w2)) t2))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))
w2: W
t2: T1 (W * A)

map T1 (μ (prod W) ∘ pair (w1 ● w2)) t2 = map T1 (μ (prod W)) (map T1 (pair w1) (map T1 (μ (prod W) ∘ pair w2) t2))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))
w2: W
t2: T1 (W * A)

map T1 (μ (prod W) ∘ pair (w1 ● w2)) t2 = map T1 (μ (prod W) ∘ (pair w1 ∘ (μ (prod W) ∘ pair w2))) t2
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))
w2: W
t2: T1 (W * A)

μ (prod W) ∘ pair (w1 ● w2) = μ (prod W) ∘ (pair w1 ∘ (μ (prod W) ∘ pair w2))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))
w2: W
t2: T1 (W * A)
w3: W
a: A

(μ (prod W) ∘ pair (w1 ● w2)) (w3, a) = (μ (prod W) ∘ (pair w1 ∘ (μ (prod W) ∘ pair w2))) (w3, a)
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))
w2: W
t2: T1 (W * A)
w3: W
a: A

((w1 ● w2) ● w3, id a) = (w1 ● (w2 ● w3), id (id a))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type
w1: W
t: T2 (W * T1 (W * A))
w2: W
t2: T1 (W * A)
w3: W
a: A

(w1 ● w2) ● w3 = w1 ● (w2 ● w3)
now rewrite monoid_assoc. Qed. Set Keyed Unification.
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3

forall A : Type, dec (T3 ∘ T2 ∘ T1) = dec (T3 ∘ T2 ∘ T1)
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3

forall A : Type, dec (T3 ∘ T2 ∘ T1) = dec (T3 ∘ T2 ∘ T1)
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

dec (T3 ∘ T2 ∘ T1) = dec (T3 ∘ T2 ∘ T1)
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map (T3 ∘ T2) (shift T1) ∘ (map T3 (shift T2) ∘ dec T3 ∘ map T3 (dec T2)) ∘ map (T3 ∘ T2) (dec T1) = map T3 (shift (T2 ∘ T1)) ∘ dec T3 ∘ map T3 (map T2 (shift T1) ∘ dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map (T3 ∘ T2) (shift T1) ∘ map T3 (shift T2) ∘ dec T3 ∘ map T3 (dec T2) ∘ map (T3 ∘ T2) (dec T1) = map T3 (shift (T2 ∘ T1)) ∘ dec T3 ∘ map T3 (map T2 (shift T1) ∘ dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (shift T1) ∘ shift T2) ∘ dec T3 ∘ map T3 (dec T2) ∘ map (T3 ∘ T2) (dec T1) = map T3 (shift (T2 ∘ T1)) ∘ dec T3 ∘ map T3 (map T2 (shift T1) ∘ dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (shift T1) ∘ shift T2) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (shift (T2 ∘ T1)) ∘ dec T3 ∘ map T3 (map T2 (shift T1) ∘ dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (uncurry incr) ∘ σ) ∘ (map T2 (uncurry incr) ∘ σ)) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (shift (T2 ∘ T1)) ∘ dec T3 ∘ map T3 (map T2 (shift T1) ∘ dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (uncurry incr) ∘ σ) ∘ map T2 (uncurry incr) ∘ σ) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (shift (T2 ∘ T1)) ∘ dec T3 ∘ map T3 (map T2 (shift T1) ∘ dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (uncurry incr) ∘ σ ∘ uncurry incr) ∘ σ) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (shift (T2 ∘ T1)) ∘ dec T3 ∘ map T3 (map T2 (shift T1) ∘ dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ ∘ μ (prod W)) ∘ σ) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (shift (T2 ∘ T1)) ∘ dec T3 ∘ map T3 (map T2 (shift T1) ∘ dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (shift (T2 ∘ T1)) ∘ dec T3 ∘ map T3 (map T2 (shift T1) ∘ dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (map (T2 ∘ T1) (uncurry incr) ∘ σ) ∘ dec T3 ∘ map T3 (map T2 (map T1 (uncurry incr) ∘ σ) ∘ dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (map (T2 ∘ T1) (uncurry incr) ∘ σ) ∘ dec T3 ∘ map T3 (map T2 (map T1 (uncurry incr) ∘ σ) ∘ dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (map (T2 ∘ T1) (uncurry incr) ∘ σ) ∘ dec T3 ∘ (map T3 (H0 (W * T1 (W * A)) (T1 (W * A)) (map T1 (uncurry incr) ∘ σ)) ∘ map T3 (dec T2 ∘ map T2 (dec T1)))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (map (T2 ∘ T1) (uncurry incr) ∘ σ) ∘ dec T3 ∘ (map T3 (map T2 (map T1 (uncurry incr) ∘ σ)) ∘ map T3 (dec T2 ∘ map T2 (dec T1)))
(* ^^ not sure why this guy got unfolded *)
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (map (T2 ∘ T1) (uncurry incr) ∘ σ) ∘ dec T3 ∘ map T3 (map T2 (map T1 (uncurry incr) ∘ σ)) ∘ map T3 (dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (map (T2 ∘ T1) (μ (prod W)) ∘ σ) ∘ dec T3 ∘ map T3 (map T2 (map T1 (μ (prod W)) ∘ σ)) ∘ map T3 (dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (map (T2 ∘ T1) (μ (prod W)) ∘ σ) ∘ (dec T3 ∘ map T3 (map T2 (map T1 (μ (prod W)) ∘ σ))) ∘ map T3 (dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (map (T2 ∘ T1) (μ (prod W)) ∘ σ) ∘ (map (T3 ○ prod W) (map T2 (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3) ∘ map T3 (dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1)) = map T3 (map (T2 ∘ T1) (μ (prod W)) ∘ σ) ∘ map (T3 ○ prod W) (map T2 (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3 ∘ map T3 (dec T2 ∘ map T2 (dec T1))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3 = map T3 (map (T2 ∘ T1) (μ (prod W)) ∘ σ) ∘ map (T3 ○ prod W) (map T2 (map T1 (μ (prod W)) ∘ σ)) ∘ dec T3
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) = map T3 (map (T2 ∘ T1) (μ (prod W)) ∘ σ) ∘ map (T3 ○ prod W) (map T2 (map T1 (μ (prod W)) ∘ σ))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T3 (map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ)) = map T3 (map (T2 ∘ T1) (μ (prod W)) ∘ σ ∘ map (prod W) (map T2 (map T1 (μ (prod W)) ∘ σ)))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ) = map (T2 ∘ T1) (μ (prod W)) ∘ σ ∘ map (prod W) (map T2 (map T1 (μ (prod W)) ∘ σ))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ) = map (T2 ∘ T1) (μ (prod W)) ∘ (map T2 (σ) ∘ σ) ∘ map (prod W) (map T2 (map T1 (μ (prod W)) ∘ σ))
W: Type
op: Monoid_op W
unit: Monoid_unit W
Monoid0: Monoid W
T1: Type -> Type
H: Map T1
T2: Type -> Type
H0: Map T2
T3: Type -> Type
H1: Map T3
dec_T1: Decorate W T1
dec_T2: Decorate W T2
dec_T3: Decorate W T3
DecoratedFunctor0: DecoratedFunctor W T1
DecoratedFunctor1: DecoratedFunctor W T2
DecoratedFunctor2: DecoratedFunctor W T3
A: Type

map T2 (map T1 (μ (prod W)) ∘ σ) ∘ σ ∘ map (prod W ∘ T2) (map T1 (μ (prod W)) ∘ σ) = map (T2 ∘ T1) (μ (prod W)) ∘ map T2 (σ) ∘ σ ∘ map (prod W) (map T2 (map T1 (μ (prod W)) ∘ σ))
now rewrite (fun_map_map (F := T2)). Qed. Unset Keyed Unification. End associativity_law. End DecoratedFunctor_composition_laws. (** ** Composition with Null-Decorated Functors *) (**********************************************************************) Section DecoratedFunctor_zero_composition. Context (F G: Type -> Type) `{Monoid W} `{Functor F} `{DecoratedFunctor W G}. Instance: Decorate W F := Decorate_zero.
F, G: Type -> Type
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
Map_F: Map F
H0: Functor F
H1: Map G
H2: Decorate W G
H3: DecoratedFunctor W G
A: Type

dec (F ∘ G) = map F (dec G)
F, G: Type -> Type
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
Map_F: Map F
H0: Functor F
H1: Map G
H2: Decorate W G
H3: DecoratedFunctor W G
A: Type

dec (F ∘ G) = map F (dec G)
F, G: Type -> Type
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
Map_F: Map F
H0: Functor F
H1: Map G
H2: Decorate W G
H3: DecoratedFunctor W G
A: Type

dec (F ∘ G) = map F (dec G)
F, G: Type -> Type
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
Map_F: Map F
H0: Functor F
H1: Map G
H2: Decorate W G
H3: DecoratedFunctor W G
A: Type

map F (shift G) ∘ dec F ∘ map F (dec G) = map F (dec G)
F, G: Type -> Type
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
Map_F: Map F
H0: Functor F
H1: Map G
H2: Decorate W G
H3: DecoratedFunctor W G
A: Type

map F (shift G) ∘ map F (pair Ƶ) ∘ map F (dec G) = map F (dec G)
F, G: Type -> Type
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
Map_F: Map F
H0: Functor F
H1: Map G
H2: Decorate W G
H3: DecoratedFunctor W G
A: Type

map F (shift G) ∘ (map F (pair Ƶ) ∘ map F (dec G)) = map F (dec G)
F, G: Type -> Type
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
Map_F: Map F
H0: Functor F
H1: Map G
H2: Decorate W G
H3: DecoratedFunctor W G
A: Type

map F (shift G ∘ (pair Ƶ ∘ dec G)) = map F (dec G)
F, G: Type -> Type
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
Map_F: Map F
H0: Functor F
H1: Map G
H2: Decorate W G
H3: DecoratedFunctor W G
A: Type

map F (shift G ∘ pair Ƶ ∘ dec G) = map F (dec G)
F, G: Type -> Type
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
Map_F: Map F
H0: Functor F
H1: Map G
H2: Decorate W G
H3: DecoratedFunctor W G
A: Type

map F (id ∘ dec G) = map F (dec G)
F, G: Type -> Type
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
Map_F: Map F
H0: Functor F
H1: Map G
H2: Decorate W G
H3: DecoratedFunctor W G
A: Type
id = shift G ∘ (fun a : G (W * A) => (Ƶ, a))
F, G: Type -> Type
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
Map_F: Map F
H0: Functor F
H1: Map G
H2: Decorate W G
H3: DecoratedFunctor W G
A: Type

id = shift G ∘ (fun a : G (W * A) => (Ƶ, a))
F, G: Type -> Type
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
Map_F: Map F
H0: Functor F
H1: Map G
H2: Decorate W G
H3: DecoratedFunctor W G
A: Type
g: G (W * A)

id g = (shift G ∘ (fun a : G (W * A) => (Ƶ, a))) g
F, G: Type -> Type
W: Type
op: Monoid_op W
unit0: Monoid_unit W
H: Monoid W
Map_F: Map F
H0: Functor F
H1: Map G
H2: Decorate W G
H3: DecoratedFunctor W G
A: Type
g: G (W * A)

id g = shift G (Ƶ, g)
now rewrite (shift_zero G). Qed. End DecoratedFunctor_zero_composition. (** * Monad Operations in As Homomorphisms of Decorated Functors *) (**********************************************************************) Section DecoratedMonad_characterization. Context `{Categorical.Monad.Monad T} `{Decorate W T} `{Monoid W} `{! Categorical.DecoratedFunctor.DecoratedFunctor W T}. (** <<ret T>> commutes with decoration if and only if <<dec T>> maps <<ret T>> to <<ret (T ∘ W)>> *)
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

dec T ∘ η T A = η T (W * A) ∘ dec (fun x : Type => x) <-> dec T ∘ η T A = η (T ∘ prod W) A
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

dec T ∘ η T A = η T (W * A) ∘ dec (fun x : Type => x) <-> dec T ∘ η T A = η (T ∘ prod W) A
split... Qed. (** <<join T>> commutes with decoration if and only if <<dec T>> maps <<join T>> to <<join (T ∘ prod W)>> of <<dec T ∘ map T (dec T)>> (in other words iff <<dec T>> commutes with <<join>>). *)
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

dec T ∘ μ T = μ T ∘ dec (T ∘ T) <-> dec T ∘ μ T = μ (T ∘ prod W) ∘ dec T ∘ map T (dec T)
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

dec T ∘ μ T = μ T ∘ dec (T ∘ T) <-> dec T ∘ μ T = μ (T ∘ prod W) ∘ dec T ∘ map T (dec T)
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

μ T ∘ dec (T ∘ T) = μ (T ∘ prod W) ∘ dec T ∘ map T (dec T)
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

μ T ∘ (map T (shift T) ∘ dec T ∘ map T (dec T)) = map T (μ (prod W)) ∘ μ T ∘ map T (σ) ∘ dec T ∘ map T (dec T)
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

μ T ∘ map T (shift T) ∘ dec T ∘ map T (dec T) = map T (μ (prod W)) ∘ μ T ∘ map T (σ) ∘ dec T ∘ map T (dec T)
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

μ T ∘ map T (shift T) ∘ dec T = map T (μ (prod W)) ∘ μ T ∘ map T (σ) ∘ dec T
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

μ T ∘ map T (shift T) = map T (μ (prod W)) ∘ μ T ∘ map T (σ)
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

μ T ∘ map T (shift T) = μ T ∘ map (T ∘ T) (μ (prod W)) ∘ map T (σ)
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

μ T ∘ map T (shift T) = μ T ∘ map T (map T (μ (prod W))) ∘ map T (σ)
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

μ T ∘ map T (shift T) = μ T ∘ (map T (map T (μ (prod W))) ∘ map T (σ))
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

μ T ∘ map T (shift T) = μ T ∘ (map T (map T (μ (prod W))) ∘ map T (σ))
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

μ T ∘ map T (shift T) = μ T ∘ map T (map T (μ (prod W)) ∘ σ)
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

μ T ∘ map T (map T (uncurry incr) ∘ σ) = μ T ∘ map T (map T (μ (prod W)) ∘ σ)
T: Type -> Type
H: Map T
H0: Return T
H1: Join T
H2: Monad T
W: Type
H3: Decorate W T
op: Monoid_op W
unit0: Monoid_unit W
H4: Monoid W
H5: DecoratedFunctor W T
A: Type

μ T ∘ map T (map T (μ (prod W)) ∘ σ) = μ T ∘ map T (map T (μ (prod W)) ∘ σ)
reflexivity. Qed. (* TODO Prove (T ∘ prod W) is a monad *) (* Theorem decorated_monad_compatibility_spec: Monad_Hom T (T ∘ prod W) (@dec W T _) <-> DecoratePreservingTransformation (fun A => A) T (ret T) /\ DecoratePreservingTransformation (T ∘ T) T (@join T _). Proof with auto. split. - introv mhom. inverts mhom. inverts mhom_domain. split. + constructor... introv. symmetry. rewrite dec_ret_iff. apply mhom_ret. + constructor... introv. symmetry. rewrite dec_join_iff. apply mhom_join. - intros [h1 h2]. inverts h1. inverts h2. constructor; try typeclasses eauto. + admit. + admit. + introv rewrite <- dec_ret_iff... + introv. rewrite <- dec_join_iff... Qed. Theorem decorated_monad_spec: Categorical.DecoratedMonad.DecoratedMonad W T <-> Monad_Hom T (T ∘ prod W) (@dec W T _). Proof with try typeclasses eauto. rewrite decorated_monad_compatibility_spec. split; intro hyp. - inversion hyp. constructor... + constructor... intros. now rewrite (dmon_ret (W := W) (T := T)). + constructor... intros. now rewrite (dmon_join (W := W) (T := T)). - destruct hyp as [hyp1 hyp2]. constructor... + intros. inversion hyp1. now rewrite dectrans_commute. + intros. inversion hyp2. now rewrite <- dectrans_commute. Qed. *) End DecoratedMonad_characterization.