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 Tforall 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 Tforall 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 TNatural (@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 TNatural (@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 Tforall (A B : Type) (f : A -> B), map (T ∘ U) f ∘ ret (T ∘ U) = ret (T ∘ U) ∘ map (fun A0 : Type => A0) fU, 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 -> Bmap (T ∘ U) f ∘ ret (T ∘ U) = ret (T ∘ U) ∘ map (fun A : Type => A) fU, 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 -> Bmap T (map U f) ∘ (ret T ∘ ret U) = ret T ∘ ret U ∘ map (fun A : Type => A) fU, 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 -> Bmap T (map U f) ∘ ret T ∘ ret U = ret T ∘ ret U ∘ map (fun A : Type => A) fU, 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 -> Bmap T (map U f) ∘ ret T ∘ ret U = ret T ∘ ret U ∘ map (fun A : Type => A) fU, 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 -> Bret T ∘ map (fun A : Type => A) (map U f) ∘ ret U = ret T ∘ ret U ∘ map (fun A : Type => A) fU, 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 -> Bret T ∘ map U f ∘ ret U = ret T ∘ ret U ∘ fnow 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
A, B: Type
f: A -> Bret T ∘ (map U f ∘ ret U) = ret T ∘ ret U ∘ fU, 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 TNatural (@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 TNatural (@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 Tforall (A B : Type) (f : A -> B), map (T ∘ U) f ∘ join (T ∘ U) = join (T ∘ U) ∘ map (T ∘ U ∘ (T ∘ U)) fU, 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 -> Bmap (T ∘ U) f ∘ join (T ∘ U) = join (T ∘ U) ∘ map (T ∘ U ∘ (T ∘ U)) fU, 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 -> Bmap 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 -> Bmap 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 -> Bmap 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 -> Bjoin 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 -> Bjoin 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 -> Bjoin 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 -> Bjoin 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 -> Bjoin 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 -> Bjoin 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 -> Bjoin 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)(* 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 -> Bjoin 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)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, B: Type
f: A -> Bjoin 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)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: Typejoin (T ∘ U) ∘ ret (T ∘ U) = idU, 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: Typejoin (T ∘ U) ∘ ret (T ∘ U) = idU, 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: Typejoin (T ∘ U) ∘ ret (T ∘ U) = idU, 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: Typemap T (join U) ∘ join T ∘ map T (δ U T) ∘ (ret T ∘ ret U) = idU, 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: Typemap T (join U) ∘ join T ∘ (map T (δ U T) ∘ (ret T ∘ ret U)) = idU, 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: Typemap T (join U) ∘ join T ∘ (map T (δ U T) ∘ ret T ∘ ret U) = idU, 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: Typemap T (join U) ∘ join T ∘ (ret T ∘ map (fun A : Type => A) (δ U T) ∘ ret U) = idU, 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: Typemap T (join U) ∘ join T ∘ (ret T ∘ δ U T ∘ ret U) = idU, 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: Typemap T (join U) ∘ (join T ∘ (ret T ∘ (δ U T ∘ ret U))) = idU, 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: Typemap T (join U) ∘ (join T ∘ ret T ∘ (δ U T ∘ ret U)) = idU, 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: Typemap T (join U) ∘ (id ∘ (δ U T ∘ ret U)) = idU, 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: Typemap T (join U) ∘ (id ∘ (δ U T ∘ ret U)) = idU, 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: Typemap T (join U) ∘ (id ∘ map T (ret U)) = idU, 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: Typemap T (join U) ∘ map T (ret U) = idU, 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: Typemap T (join U ∘ ret U) = idnow 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: Typemap T id = idU, 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: Typejoin (T ∘ U) ∘ map (T ∘ U) (ret (T ∘ U)) = idU, 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: Typejoin (T ∘ U) ∘ map (T ∘ U) (ret (T ∘ U)) = idU, 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: Typejoin (T ∘ U) ∘ map (T ∘ U) (ret (T ∘ U)) = idU, 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: Typemap T (join U) ∘ join T ∘ map T (δ U T) ∘ map (T ∘ U) (ret T ∘ ret U) = idU, 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: Typejoin T ∘ map (T ∘ T) (join U) ∘ map T (δ U T) ∘ map (T ∘ U) (ret T ∘ ret U) = idU, 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: Typejoin T ∘ map T (map T (join U)) ∘ map T (δ U T) ∘ map T (map U (ret T ∘ ret U)) = idU, 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: Typejoin T ∘ (map T (map T (join U)) ∘ (map T (δ U T) ∘ map T (map U (ret T ∘ ret U)))) = idU, 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: Typejoin T ∘ (map T (map T (join U)) ∘ (map T (δ U T) ∘ map T (map U (ret T ∘ ret U)))) = idU, 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: Typejoin T ∘ map T (map T (join U) ∘ (δ U T ∘ map U (ret T ∘ ret U))) = idU, 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: Typejoin T ∘ map T (map T (join U) ∘ (δ U T ∘ map U (ret T ∘ ret U))) = idU, 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: Typejoin T ∘ map T (map T (join U) ∘ (δ U T ∘ (map U (ret T) ∘ map U (ret U)))) = idU, 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: Typejoin T ∘ map T (map T (join U) ∘ (δ U T ∘ map U (ret T) ∘ map U (ret U))) = idU, 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: Typejoin T ∘ map T (map T (join U) ∘ (ret T ∘ map U (ret U))) = idU, 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: Typejoin T ∘ map T (map T (join U) ∘ ret T ∘ map U (ret U)) = idU, 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: Typejoin T ∘ map T (ret T ∘ map (fun A : Type => A) (join U) ∘ map U (ret U)) = idU, 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: Typejoin T ∘ map T (ret T ∘ join U ∘ map U (ret U)) = idU, 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: Typejoin T ∘ map T (ret T ∘ (join U ∘ map U (ret U))) = idU, 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: Typejoin T ∘ map T (ret T ∘ id) = idU, 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: Typejoin T ∘ (map T (ret T) ∘ map T id) = idU, 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: Typejoin T ∘ map T (ret T) ∘ map T id = idnow 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: Typeid ∘ map T id = idU, 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: Typejoin (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: Typejoin (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: Typejoin (T ∘ U) ∘ join (T ∘ U) = join (T ∘ U) ∘ map (T ∘ U) (join (T ∘ U))(* 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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))(* 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: Typemap 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))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: Typemap 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: Typemap 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: Typemap 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))))(* 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: Typemap 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)))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: Typemap 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)))(* 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: Typejoin 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))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: Typejoin 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: Typejoin 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: Typejoin 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: Typejoin 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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: Typemap 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))(* 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: Typemap 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: Typemap 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: Typemap (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))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.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))