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.

This file contains a formalization of distributive laws in the sense of Beck, i.e. a distribution of one monad over another with compatibility properties such that the composition of the two also forms a monad.

From Tealeaves Require Export
  Classes.Categorical.Monad
  Functors.Compose.

#[local] Generalizable Variables T U A B.
#[local] Arguments map F%function_scope {Map}
  {A B}%type_scope f%function_scope _.
#[local] Arguments join T%function_scope {Join} {A}%type_scope _.
#[local] Arguments ret T%function_scope {Return} {A}%type_scope _.

(** * Beck Distribution Laws *)
(**********************************************************************)
Class BeckDistribution (U T: Type -> Type)
  := bdist: forall {A: Type}, U (T A) -> T (U A).

Arguments bdist U T%function_scope {BeckDistribution} {A}%type_scope _.

#[local] Notation "'δ'" := (bdist): tealeaves_scope.

Section BeckDistributiveLaw.

  Context
    (U T: Type -> Type)
    `{Monad U}
    `{Monad T}
    `{BeckDistribution U T}.

  Class BeckDistributiveLaw :=
    { bdist_monad_l: Monad T;
      bdist_monad_r: Monad U;
      bdist_natural :> Natural (@bdist U T _);
      bdist_join_l:
      `(bdist U T ∘ join U =
          map T (join U) ∘ bdist U T ∘ map U (bdist U T (A := A)));
      bdist_join_r:
      `(bdist U T ∘ map U (join T) =
          join T ∘ map T (bdist U T) ∘ bdist U T (A := T A));
      bdist_unit_l:
      `(bdist U T ∘ ret U (A := T A) = map T (ret U));
      bdist_unit_r:
      `(bdist U T ∘ map U (ret T) = ret T (A := U A));
    }.

End BeckDistributiveLaw.

(** * Beck Distributive Laws Induce a Composite Monad *)
(**********************************************************************)
Section BeckDistributivelaw_composite_monad.

  Context
    `{BeckDistributiveLaw U T}.

  Existing Instance bdist_monad_l.
  Existing Instance bdist_monad_r.

  #[export] Instance Ret_Beck: Return (T ∘ U) :=
    fun A => ret T ∘ ret U.

  (* we join <<T>> before <<U>> *)
  #[export] Instance Join_Beck: Join (T ∘ U) :=
    fun A => map T (join U) ∘ join T ∘ map T (bdist U T).

  
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T

forall A : Type, map T (join U) ∘ join T = join T ∘ map (T ∘ T) (join U)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T

forall A : Type, map T (join U) ∘ join T = join T ∘ map (T ∘ T) (join U)
intros; now rewrite (natural (ϕ := @join T _)). Qed.
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T

Natural (@ret (T ∘ U) Ret_Beck)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T

Natural (@ret (T ∘ U) Ret_Beck)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T

forall (A B : Type) (f : A -> B), map (T ∘ U) f ∘ ret (T ∘ U) = ret (T ∘ U) ∘ map (fun A0 : Type => A0) f
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

map (T ∘ U) f ∘ ret (T ∘ U) = ret (T ∘ U) ∘ map (fun A : Type => A) f
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

map T (map U f) ∘ (ret T ∘ ret U) = ret T ∘ ret U ∘ map (fun A : Type => A) f
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

map T (map U f) ∘ ret T ∘ ret U = ret T ∘ ret U ∘ map (fun A : Type => A) f
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

map T (map U f) ∘ ret T ∘ ret U = ret T ∘ ret U ∘ map (fun A : Type => A) f
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

ret T ∘ map (fun A : Type => A) (map U f) ∘ ret U = ret T ∘ ret U ∘ map (fun A : Type => A) f
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

ret T ∘ map U f ∘ ret U = ret T ∘ ret U ∘ f
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

ret T ∘ (map U f ∘ ret U) = ret T ∘ ret U ∘ f
now rewrite (natural (G := U) (F := fun A => A)). Qed. #[local] Set Keyed Unification.
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T

Natural (@join (T ∘ U) Join_Beck)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T

Natural (@join (T ∘ U) Join_Beck)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T

forall (A B : Type) (f : A -> B), map (T ∘ U) f ∘ join (T ∘ U) = join (T ∘ U) ∘ map (T ∘ U ∘ (T ∘ U)) f
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

map (T ∘ U) f ∘ join (T ∘ U) = join (T ∘ U) ∘ map (T ∘ U ∘ (T ∘ U)) f
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

map T (map U f) ∘ (map T (join U) ∘ join T ∘ map T (δ U T)) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map (T ∘ U) f)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

map T (map U f) ∘ map T (join U) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map (T ∘ U) f)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

map T (map U f ∘ join U) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map (T ∘ U) f)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

join T ∘ map (T ∘ T) (map U f ∘ join U) ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map (T ∘ U) f)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

join T ∘ map (T ∘ T) (join U ∘ map (U ∘ U) f) ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map (T ∘ U) f)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

join T ∘ (map (T ∘ T) (join U) ∘ map (T ∘ T) (map (U ∘ U) f)) ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map (T ∘ U) f)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

join T ∘ (map T (map T (join U)) ∘ map T (map T (map U (map U f)))) ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map (T ∘ U) f)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

join T ∘ map T (map T (join U)) ∘ (map T (map T (map U (map U f))) ∘ map T (δ U T)) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map (T ∘ U) f)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

join T ∘ map T (map T (join U)) ∘ map T (map T (map U (map U f)) ∘ δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map (T ∘ U) f)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

join T ∘ map T (map T (join U)) ∘ map T (δ U T ∘ map (U ○ T) (map U f)) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map (T ∘ U) f)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

join T ∘ map T (map T (join U)) ∘ (map T (δ U T) ∘ map T (map (U ○ T) (map U f))) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map (T ∘ U) f)
(* RHS *)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A, B: Type
f: A -> B

join T ∘ map T (map T (join U)) ∘ (map T (δ U T) ∘ map T (map (U ○ T) (map U f))) = join T ∘ map (T ∘ T) (join U) ∘ map T (δ U T) ∘ map (T ∘ U) (map (T ∘ U) f)
reflexivity. Qed. #[local] Unset Keyed Unification.
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join (T ∘ U) ∘ ret (T ∘ U) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join (T ∘ U) ∘ ret (T ∘ U) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join (T ∘ U) ∘ ret (T ∘ U) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (δ U T) ∘ (ret T ∘ ret U) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ (map T (δ U T) ∘ (ret T ∘ ret U)) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ (map T (δ U T) ∘ ret T ∘ ret U) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ (ret T ∘ map (fun A : Type => A) (δ U T) ∘ ret U) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ (ret T ∘ δ U T ∘ ret U) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ (join T ∘ (ret T ∘ (δ U T ∘ ret U))) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ (join T ∘ ret T ∘ (δ U T ∘ ret U)) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ (id ∘ (δ U T ∘ ret U)) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ (id ∘ (δ U T ∘ ret U)) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ (id ∘ map T (ret U)) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ map T (ret U) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U ∘ ret U) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T id = id
now rewrite (fun_map_id (F := T)). Qed.
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join (T ∘ U) ∘ map (T ∘ U) (ret (T ∘ U)) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join (T ∘ U) ∘ map (T ∘ U) (ret (T ∘ U)) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join (T ∘ U) ∘ map (T ∘ U) (ret (T ∘ U)) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (ret T ∘ ret U) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map (T ∘ T) (join U) ∘ map T (δ U T) ∘ map (T ∘ U) (ret T ∘ ret U) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (map T (join U)) ∘ map T (δ U T) ∘ map T (map U (ret T ∘ ret U)) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ (map T (map T (join U)) ∘ (map T (δ U T) ∘ map T (map U (ret T ∘ ret U)))) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ (map T (map T (join U)) ∘ (map T (δ U T) ∘ map T (map U (ret T ∘ ret U)))) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (map T (join U) ∘ (δ U T ∘ map U (ret T ∘ ret U))) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (map T (join U) ∘ (δ U T ∘ map U (ret T ∘ ret U))) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (map T (join U) ∘ (δ U T ∘ (map U (ret T) ∘ map U (ret U)))) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (map T (join U) ∘ (δ U T ∘ map U (ret T) ∘ map U (ret U))) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (map T (join U) ∘ (ret T ∘ map U (ret U))) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (map T (join U) ∘ ret T ∘ map U (ret U)) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (ret T ∘ map (fun A : Type => A) (join U) ∘ map U (ret U)) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (ret T ∘ join U ∘ map U (ret U)) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (ret T ∘ (join U ∘ map U (ret U))) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (ret T ∘ id) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ (map T (ret T) ∘ map T id) = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (ret T) ∘ map T id = id
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

id ∘ map T id = id
now rewrite (fun_map_id (F := T)). Qed.
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join (T ∘ U) ∘ join (T ∘ U) = join (T ∘ U) ∘ map (T ∘ U) (join (T ∘ U))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join (T ∘ U) ∘ join (T ∘ U) = join (T ∘ U) ∘ map (T ∘ U) (join (T ∘ U))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join (T ∘ U) ∘ join (T ∘ U) = join (T ∘ U) ∘ map (T ∘ U) (join (T ∘ U))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (δ U T) ∘ (map T (join U) ∘ join T ∘ map T (δ U T)) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
(* Pull one <<join U>> to the same side as the other *)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (δ U T) ∘ map T (join U) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ (map T (δ U T) ∘ map T (join U)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (δ U T ∘ join U) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (map T (join U) ∘ δ U T ∘ map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ (map T (map T (join U) ∘ δ U T) ∘ map T (map U (δ U T))) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ (map T (map T (join U)) ∘ map T (δ U T) ∘ map T (map U (δ U T))) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (map T (join U)) ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
(* Re-associate <<join U>> *)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ (join T ∘ map (T ∘ T) (join U)) ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ (map T (join U) ∘ join T) ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ map T (join U) ∘ join T ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U ∘ join U) ∘ join T ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U ∘ map U (join U)) ∘ join T ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ map T (map U (join U)) ∘ join T ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ (map T (map U (join U)) ∘ join T) ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ (join T ∘ map (T ∘ T) (map U (join U))) ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map (T ∘ T) (map U (join U)) ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
(* Pull one <<join T>> to next to the other (past distributions) *)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ (map T (map (T ∘ U) (join U)) ∘ map T (δ U T)) ∘ map T (map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (map (T ∘ U) (join U) ∘ δ U T) ∘ map T (map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ (map T (map (T ∘ U) (join U) ∘ δ U T) ∘ map T (map U (δ U T))) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)) ∘ join T ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ (map T (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)) ∘ join T) ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ (join T ∘ map (T ∘ T) (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T))) ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ join T ∘ map (T ∘ T) (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)) ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
(* Re-associate <<join T>> *)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ (join T ∘ join T) ∘ map (T ∘ T) (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)) ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ (join T ∘ map T (join T)) ∘ map (T ∘ T) (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)) ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (join T) ∘ map (T ∘ T) (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)) ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
(* Unite everything under the top-level <<map T>> *)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ (map T (join T) ∘ map T (map T (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)))) ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (join T ∘ map T (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T))) ∘ map T (δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ (map T (join T ∘ map T (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T))) ∘ map T (δ U T)) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (join T ∘ map T (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)) ∘ δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (map T (join U) ∘ join T ∘ map T (δ U T))
(* Unite everything under the top-level <<map T>> on the RHS too *)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (join T ∘ map T (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)) ∘ δ U T) = map T (join U) ∘ join T ∘ map T (δ U T) ∘ map T (map U (map T (join U) ∘ join T ∘ map T (δ U T)))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (join T ∘ map T (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)) ∘ δ U T) = map T (join U) ∘ join T ∘ (map T (δ U T) ∘ map T (map U (map T (join U) ∘ join T ∘ map T (δ U T))))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (join T ∘ map T (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)) ∘ δ U T) = map T (join U) ∘ join T ∘ (map T (δ U T) ∘ map T (map U (map T (join U) ∘ join T ∘ map T (δ U T))))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join U) ∘ join T ∘ map T (join T ∘ map T (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)) ∘ δ U T) = map T (join U) ∘ join T ∘ map T (δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T)))
(* Simplify remaining goal by cancelling out equals *)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (join T ∘ map T (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)) ∘ δ U T) = map T (δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T)))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (map (T ∘ U) (join U) ∘ δ U T ∘ map U (δ U T)) ∘ δ U T = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
(* Move join over distributions *)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ (map T (map (T ∘ U) (join U)) ∘ map T (δ U T) ∘ map T (map U (δ U T))) ∘ δ U T = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map T (map (T ∘ U) (join U)) ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ δ U T = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map (T ∘ T) (map U (join U)) ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ δ U T = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

join T ∘ map (T ∘ T) (map U (join U)) ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ δ U T = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (map U (join U)) ∘ join T ∘ map T (δ U T) ∘ map T (map U (δ U T)) ∘ δ U T = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (map U (join U)) ∘ (join T ∘ map T (δ U T)) ∘ map T (map U (δ U T)) ∘ δ U T = δ U T ∘ map U (map T (join U) ∘ (join T ∘ map T (δ U T)))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (map U (join U)) ∘ (join T ∘ map T (δ U T)) ∘ (map T (map U (δ U T)) ∘ δ U T) = δ U T ∘ map U (map T (join U) ∘ (join T ∘ map T (δ U T)))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (map U (join U)) ∘ (join T ∘ map T (δ U T)) ∘ (map (T ∘ U) (δ U T) ∘ δ U T) = δ U T ∘ map U (map T (join U) ∘ (join T ∘ map T (δ U T)))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (map U (join U)) ∘ (join T ∘ map T (δ U T)) ∘ (δ U T ∘ map (U ○ T) (δ U T)) = δ U T ∘ map U (map T (join U) ∘ (join T ∘ map T (δ U T)))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (map U (join U)) ∘ (join T ∘ map T (δ U T)) ∘ (δ U T ∘ map (U ○ T) (δ U T)) = δ U T ∘ map U (map T (join U) ∘ (join T ∘ map T (δ U T)))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (map U (join U)) ∘ (join T ∘ map T (δ U T)) ∘ (δ U T ∘ map U (map T (δ U T))) = δ U T ∘ map U (map T (join U) ∘ (join T ∘ map T (δ U T)))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (map U (join U)) ∘ join T ∘ map T (δ U T) ∘ δ U T ∘ map U (map T (δ U T)) = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (map U (join U)) ∘ (join T ∘ map T (δ U T) ∘ δ U T) ∘ map U (map T (δ U T)) = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (map U (join U)) ∘ (δ U T ∘ map U (join T)) ∘ map U (map T (δ U T)) = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
(* Make some final naturality pulls *)
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map T (map U (join U)) ∘ δ U T ∘ map U (join T) ∘ map U (map T (δ U T)) = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

map (T ∘ U) (join U) ∘ δ U T ∘ map U (join T) ∘ map U (map T (δ U T)) = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

δ U T ∘ map (U ○ T) (join U) ∘ map U (join T) ∘ map U (map T (δ U T)) = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

δ U T ∘ map U (map T (join U)) ∘ map U (join T) ∘ map U (map T (δ U T)) = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

δ U T ∘ map U (map T (join U)) ∘ (map U (join T) ∘ map U (map T (δ U T))) = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

δ U T ∘ map U (map T (join U)) ∘ map U (join T ∘ map T (δ U T)) = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
U, T: Type -> Type
H: Map U
H0: Return U
H1: Join U
H3: Map T
H4: Return T
H5: Join T
H7: BeckDistribution U T
H2: BeckDistributiveLaw U T
A: Type

δ U T ∘ (map U (map T (join U)) ∘ map U (join T ∘ map T (δ U T))) = δ U T ∘ map U (map T (join U) ∘ join T ∘ map T (δ U T))
now rewrite (fun_map_map (F := U)). Qed. #[export, program] Instance Monad_Beck: Monad (T ∘ U) := {| mon_ret_natural := Natural_ret_Beck; mon_join_natural := Natural_join_Beck; mon_join_ret := fun A => join_ret_Beck; mon_join_map_ret := fun A => join_map_ret_Beck; mon_join_join := fun A => join_join_Beck; |}. End BeckDistributivelaw_composite_monad.