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 VariablesE 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 ×)>> *)(**********************************************************************)DefinitionRightComodule_DecoratedFunctor
`{DecoratedFunctor E F}
: RightComodule F (prod E) :=
{| rcom_coaction_coaction := dfun_dec_dec;
rcom_map_extr_coaction := dfun_dec_extract;
|}.DefinitionDecoratedFunctor_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. *)(**********************************************************************)SectionDecoratedFunctor_Zero.Context
`{Monoid W}
`{Functor F}.InstanceDecorate_zero: Decorate W F :=
funA => @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 (AB : 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
nowdo2rewrite 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 Ƶ)
nowdo2rewrite 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 (funa : A => a) = id
nowrewrite fun_map_id.Qed.InstanceDecoratedFunctor_zero: DecoratedFunctor W F :=
{| dfun_dec_natural := Natural_dec_zero;
dfun_dec_dec := @dec_dec_zero;
dfun_dec_extract := @dec_extract_zero;
|}.EndDecoratedFunctor_Zero.(** ** The Identity Null-Decorated functor *)(**********************************************************************)SectionDecoratedFunctor_I.Context
`{Monoid W}.Definitiondec_I: forallA, A -> prod W A :=
funA => @pair W A Ƶ.#[global] InstanceDecorate_I: Decorate W (funA => A) := dec_I.
W: Type op: Monoid_op W unit0: Monoid_unit W H: Monoid W
Natural (funA : Type => dec (funA0 : Type => A0))
W: Type op: Monoid_op W unit0: Monoid_unit W H: Monoid W
Natural (funA : Type => dec (funA0 : Type => A0))
W: Type op: Monoid_op W unit0: Monoid_unit W H: Monoid W
forall (AB : Type) (f : A -> B),
map (prod W) f ∘ dec (funA0 : Type => A0) =
dec (funA0 : Type => A0) ∘ map (funH : Type => H) f
reflexivity.Qed.
W: Type op: Monoid_op W unit0: Monoid_unit W H: Monoid W A: Type
dec (funA : Type => A) ∘ dec (funA : Type => A) =
map (funA : Type => A) (fun '(n, a) => (n, (n, a)))
∘ dec (funA : Type => A)
W: Type op: Monoid_op W unit0: Monoid_unit W H: Monoid W A: Type
dec (funA : Type => A) ∘ dec (funA : Type => A) =
map (funA : Type => A) (fun '(n, a) => (n, (n, a)))
∘ dec (funA : Type => A)
W: Type op: Monoid_op W unit0: Monoid_unit W H: Monoid W A: Type
dec (funA : Type => A) ∘ dec (funA : Type => A) =
map (funA : Type => A) (fun '(n, a) => (n, (n, a)))
∘ dec (funA : 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 (funA : Type => A) extract
∘ dec (funA : Type => A) = id
W: Type op: Monoid_op W unit0: Monoid_unit W H: Monoid W A: Type
map (funA : Type => A) extract
∘ dec (funA : Type => A) = id
W: Type op: Monoid_op W unit0: Monoid_unit W H: Monoid W A: Type
map (funA : Type => A) extract
∘ dec (funA : Type => A) = id
reflexivity.Qed.#[global] InstanceDecoratedFunctor_I:
DecoratedFunctor W (funA => A) :=
{| dfun_dec_natural := Natural_dec_I;
dfun_dec_dec := @dec_dec_I;
dfun_dec_extract := @dec_extract_I;
|}.EndDecoratedFunctor_I.(** ** Decorated Functors are Closed under Composition *)(**********************************************************************)SectionDecoratedfunctor_composition.Context
`{Monoid W}
`{Map F} `{Map G}
`{Decorate W F} `{Decorate W G}
`{! DecoratedFunctor W F}
`{! DecoratedFunctor W G}.#[global] InstanceDecorate_compose: Decorate W (F ∘ G) :=
funA => 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 (funA : 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 (funA : 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 (AB : 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)))
nowrewrite <- (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)
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)
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)
nowrewrite <- (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
nowdo2rewrite (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
nowrewrite (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
(funa : 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 =
(funa : 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
forallA : 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
forallA : 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)
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
nowrewrite (fun_map_id (F := F)).Qed.#[global] InstanceDecoratedFunctor_compose: DecoratedFunctor W (F ∘ G) :=
{| dfun_dec_natural := Natural_dec_compose;
dfun_dec_dec := @dec_dec_compose;
dfun_dec_extract := @dec_extract_compose;
|}.EndDecoratedfunctor_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. *)(**********************************************************************)SectionDecoratedFunctor_composition_laws.Sectionidentity_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. *)(******************************************************************)Sectionzero_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
forallA : 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
forallA : 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
nowrewrite (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
forallA : 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
forallA : 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 (funm : 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 (funm : 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 (funm : 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 (funm : 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.Endzero_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
forallA : Type,
dec ((funA0 : 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
forallA : Type,
dec ((funA0 : 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
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
forallA : Type,
dec (T ∘ (funA0 : 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
forallA : Type,
dec (T ∘ (funA0 : 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 ∘ (funA : 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
nowrewrite (fun_map_id (F := T)).Qed.Endidentity_laws.Sectionassociativity_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
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
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
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))
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))
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))
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))
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))
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))
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
((funa : 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))
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)
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)
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)
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)
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)
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)
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)
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
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
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
forallA : 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
forallA : 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
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
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
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
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
nowrewrite (fun_map_map (F := T2)).Qed.Unset Keyed Unification.Endassociativity_law.EndDecoratedFunctor_composition_laws.(** ** Composition with Null-Decorated Functors *)(**********************************************************************)SectionDecoratedFunctor_zero_composition.Context
(FG: 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 ∘ (funa : 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 ∘ (funa : 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 ∘ (funa : 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)
nowrewrite (shift_zero G).Qed.EndDecoratedFunctor_zero_composition.(** * Monad Operations in As Homomorphisms of Decorated Functors *)(**********************************************************************)SectionDecoratedMonad_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 (funx : 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 (funx : 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. *)EndDecoratedMonad_characterization.