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
  Functors.Early.Batch
  Classes.Coalgebraic.TraversableFunctor
  Classes.Kleisli.TraversableFunctor.

Import Batch.Notations.
Import Applicative.Notations.
Import Kleisli.TraversableFunctor.Notations.

#[local] Generalizable Variables ϕ T G A B C.

(** * Categorical Traversable Monads from Kleisli Traversable Monads *)
(**********************************************************************)

(** ** Derived Operations *)
(**********************************************************************)
Module DerivedOperations.

  #[export] Instance Traverse_ToBatch
    (T: Type -> Type) `{ToBatch T}: Traverse T :=
  fun G _ _ _ A B f =>
    runBatch (G := G) f (C := T B) ∘ toBatch.

End DerivedOperations.

Module DerivedInstances.

  Import DerivedOperations.

  Context
    `{Coalgebraic.TraversableFunctor.TraversableFunctor T}.

  (** ** <<⋆2>> as <<runBatch ∘ map runBatch ∘ double_batch>> *)
  (********************************************************************)
  

forall (G1 : Type -> Type) (Map_G : Map G1) (Pure_G : Pure G1) (Mult_G : Mult G1), Applicative G1 -> forall (G2 : Type -> Type) (Map_G0 : Map G2) (Pure_G0 : Pure G2) (Mult_G0 : Mult G2), Applicative G2 -> forall (B C : Type) (g : B -> G2 C) (A : Type) (f : A -> G1 B), g ⋆2 f = runBatch f ∘ map (runBatch g) ∘ double_batch

forall (G1 : Type -> Type) (Map_G : Map G1) (Pure_G : Pure G1) (Mult_G : Mult G1), Applicative G1 -> forall (G2 : Type -> Type) (Map_G0 : Map G2) (Pure_G0 : Pure G2) (Mult_G0 : Mult G2), Applicative G2 -> forall (B C : Type) (g : B -> G2 C) (A : Type) (f : A -> G1 B), g ⋆2 f = runBatch f ∘ map (runBatch g) ∘ double_batch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
B, C: Type
g: B -> G2 C
A: Type
f: A -> G1 B

g ⋆2 f = runBatch f ∘ map (runBatch g) ∘ double_batch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
B, C: Type
g: B -> G2 C
A: Type
f: A -> G1 B
a: A

(g ⋆2 f) a = (runBatch f ∘ map (runBatch g) ∘ double_batch) a
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
B, C: Type
g: B -> G2 C
A: Type
f: A -> G1 B
a: A

(g ⋆2 f) a = runBatch f (map (runBatch g) (double_batch a))
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
B, C: Type
g: B -> G2 C
A: Type
f: A -> G1 B
a: A

(g ⋆2 f) a = runBatch f (map (runBatch g) (Done (batch B C) ⧆ a))
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
B, C: Type
g: B -> G2 C
A: Type
f: A -> G1 B
a: A

(g ⋆2 f) a = runBatch f (map (compose (runBatch g)) (Done (batch B C)) ⧆ a)
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
B, C: Type
g: B -> G2 C
A: Type
f: A -> G1 B
a: A

(g ⋆2 f) a = runBatch f (Done (runBatch g ∘ batch B C) ⧆ a)
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
B, C: Type
g: B -> G2 C
A: Type
f: A -> G1 B
a: A

(g ⋆2 f) a = runBatch f (Done g ⧆ a)
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
B, C: Type
g: B -> G2 C
A: Type
f: A -> G1 B
a: A

(g ⋆2 f) a = runBatch f (Done g) <⋆> f a
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
B, C: Type
g: B -> G2 C
A: Type
f: A -> G1 B
a: A

(g ⋆2 f) a = pure g <⋆> f a
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
B, C: Type
g: B -> G2 C
A: Type
f: A -> G1 B
a: A

(g ⋆2 f) a = map g (f a)
reflexivity. Qed. (** ** Derived Laws *) (**********************************************************************)

forall A : Type, traverse id = id

forall A : Type, traverse id = id
A: Type

traverse id = id
A: Type

runBatch id ∘ toBatch = id
A: Type

extract_Batch ∘ toBatch = id
A: Type

id = id
reflexivity. Qed.

forall (G1 : Type -> Type) (Map_G : Map G1) (Pure_G : Pure G1) (Mult_G : Mult G1), Applicative G1 -> forall (G2 : Type -> Type) (Map_G0 : Map G2) (Pure_G0 : Pure G2) (Mult_G0 : Mult G2), Applicative G2 -> forall (A B C : Type) (g : B -> G2 C) (f : A -> G1 B), map (traverse g) ∘ traverse f = traverse (g ⋆2 f)

forall (G1 : Type -> Type) (Map_G : Map G1) (Pure_G : Pure G1) (Mult_G : Mult G1), Applicative G1 -> forall (G2 : Type -> Type) (Map_G0 : Map G2) (Pure_G0 : Pure G2) (Mult_G0 : Mult G2), Applicative G2 -> forall (A B C : Type) (g : B -> G2 C) (f : A -> G1 B), map (traverse g) ∘ traverse f = traverse (g ⋆2 f)
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

map (traverse g) ∘ traverse f = traverse (g ⋆2 f)
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

map (runBatch g ∘ toBatch) ∘ (runBatch f ∘ toBatch) = runBatch (g ⋆2 f) ∘ toBatch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

map (runBatch g) ∘ map toBatch ∘ (runBatch f ∘ toBatch) = runBatch (g ⋆2 f) ∘ toBatch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

map (runBatch g) ∘ (map toBatch ∘ (runBatch f ∘ toBatch)) = runBatch (g ⋆2 f) ∘ toBatch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

map (runBatch g) ∘ (map toBatch ∘ runBatch f ∘ toBatch) = runBatch (g ⋆2 f) ∘ toBatch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

map (runBatch g) ∘ (runBatch f ∘ map toBatch ∘ toBatch) = runBatch (g ⋆2 f) ∘ toBatch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

map (runBatch g) ∘ (runBatch f ∘ (map toBatch ∘ toBatch)) = runBatch (g ⋆2 f) ∘ toBatch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

map (runBatch g) ∘ (runBatch f ∘ (cojoin_Batch ∘ toBatch)) = runBatch (g ⋆2 f) ∘ toBatch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

map (runBatch g) ∘ (runBatch f ∘ (runBatch double_batch ∘ toBatch)) = runBatch (g ⋆2 f) ∘ toBatch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

map (runBatch g) ∘ runBatch f ∘ (runBatch double_batch ∘ toBatch) = runBatch (g ⋆2 f) ∘ toBatch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

map (runBatch g) ∘ runBatch f ∘ runBatch double_batch ∘ toBatch = runBatch (g ⋆2 f) ∘ toBatch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

runBatch f ∘ map (runBatch g) ∘ runBatch double_batch ∘ toBatch = runBatch (g ⋆2 f) ∘ toBatch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

runBatch (runBatch f ∘ map (runBatch g) ∘ double_batch) ∘ toBatch = runBatch (g ⋆2 f) ∘ toBatch
G1: Type -> Type
Map_G: Map G1
Pure_G: Pure G1
Mult_G: Mult G1
H0: Applicative G1
G2: Type -> Type
Map_G0: Map G2
Pure_G0: Pure G2
Mult_G0: Mult G2
H1: Applicative G2
A, B, C: Type
g: B -> G2 C
f: A -> G1 B

runBatch (runBatch f ∘ map (runBatch g) ∘ double_batch) ∘ toBatch = runBatch (runBatch f ∘ map (runBatch g) ∘ double_batch) ∘ toBatch
reflexivity. Qed.

forall (G1 G2 : Type -> Type) (H0 : Map G1) (H1 : Mult G1) (H2 : Pure G1) (H3 : Map G2) (H4 : Mult G2) (H5 : Pure G2) (ϕ : forall A : Type, G1 A -> G2 A), ApplicativeMorphism G1 G2 ϕ -> forall (A B : Type) (f : A -> G1 B), ϕ (T B) ∘ traverse f = traverse (ϕ B ∘ f)

forall (G1 G2 : Type -> Type) (H0 : Map G1) (H1 : Mult G1) (H2 : Pure G1) (H3 : Map G2) (H4 : Mult G2) (H5 : Pure G2) (ϕ : forall A : Type, G1 A -> G2 A), ApplicativeMorphism G1 G2 ϕ -> forall (A B : Type) (f : A -> G1 B), ϕ (T B) ∘ traverse f = traverse (ϕ B ∘ f)
G1, G2: Type -> Type
H0: Map G1
H1: Mult G1
H2: Pure G1
H3: Map G2
H4: Mult G2
H5: Pure G2
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
f: A -> G1 B

ϕ (T B) ∘ traverse f = traverse (ϕ B ∘ f)
G1, G2: Type -> Type
H0: Map G1
H1: Mult G1
H2: Pure G1
H3: Map G2
H4: Mult G2
H5: Pure G2
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
f: A -> G1 B

ϕ (T B) ∘ (runBatch f ∘ toBatch) = runBatch (ϕ B ∘ f) ∘ toBatch
G1, G2: Type -> Type
H0: Map G1
H1: Mult G1
H2: Pure G1
H3: Map G2
H4: Mult G2
H5: Pure G2
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
f: A -> G1 B

ϕ (T B) ∘ runBatch f ∘ toBatch = runBatch (ϕ B ∘ f) ∘ toBatch
G1, G2: Type -> Type
H0: Map G1
H1: Mult G1
H2: Pure G1
H3: Map G2
H4: Mult G2
H5: Pure G2
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
f: A -> G1 B

runBatch (ϕ B ∘ f) ∘ toBatch = runBatch (ϕ B ∘ f) ∘ toBatch
reflexivity. Qed. (** ** Typeclass Instances *) (********************************************************************) #[export] Instance TraversableFunctor_Kleisli_From_Coalgebraic: Kleisli.TraversableFunctor.TraversableFunctor T := {| trf_traverse_id := traverse_id; trf_traverse_traverse := @traverse_traverse; trf_traverse_morphism := @traverse_morphism; |}. End DerivedInstances.