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.TraversableFunctor
Classes.Kleisli.TraversableFunctor.#[local] Generalizable Variablesϕ G.(** * Categorical Traversable Functors from Kleisli Traversable Functors *)(**********************************************************************)(** ** Derived Operations *)(**********************************************************************)ModuleDerivedOperations.#[export] InstanceDist_Traverse (T: Type -> Type) `{Traverse T}
: ApplicativeDist T := funG___A => traverse (@id (G A)).EndDerivedOperations.(** ** Compatibility Classes *)(**********************************************************************)ClassCompat_Dist_Traverse
(F: Type -> Type)
`{Traverse_F: Traverse F}
`{Dist_F: ApplicativeDist F} :=
compat_dist_traverse:
Dist_F = @DerivedOperations.Dist_Traverse F Traverse_F.
F: Type -> Type Traverse_F: Traverse F
Compat_Dist_Traverse F
F: Type -> Type Traverse_F: Traverse F
Compat_Dist_Traverse F
reflexivity.Qed.
F: Type -> Type Traverse_F: Traverse F Map_F: Map F Dist_F: ApplicativeDist F Compat: Compat_Dist_Traverse F
forall (G : Type -> Type) (Map_G : Map G)
(Pure_G : Pure G) (Mult_G : Mult G) (A : Type),
F (G A) -> dist F G = traverse id
F: Type -> Type Traverse_F: Traverse F Map_F: Map F Dist_F: ApplicativeDist F Compat: Compat_Dist_Traverse F
forall (G : Type -> Type) (Map_G : Map G)
(Pure_G : Pure G) (Mult_G : Mult G) (A : Type),
F (G A) -> dist F G = traverse id
nowrewrite compat_dist_traverse.Qed.(** ** Derived Instances *)(**********************************************************************)ModuleDerivedInstances.Sectionproofs.Context
(T: Type -> Type)
`{Kleisli.TraversableFunctor.TraversableFunctor T}.(* Alectryon doesn't like this Import KleisliToCategorical.TraversableFunctor.DerivedOperations. *)Import DerivedOperations.Import Kleisli.TraversableFunctor.DerivedOperations.Import Kleisli.TraversableFunctor.DerivedInstances.
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T
forall (G : Type -> Type) (H2 : Map G) (H3 : Pure G)
(H4 : Mult G),
Applicative G ->
Natural (@dist T (Dist_Traverse T) G H2 H3 H4)
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T
forall (G : Type -> Type) (H2 : Map G) (H3 : Pure G)
(H4 : Mult G),
Applicative G ->
Natural (@dist T (Dist_Traverse T) G H2 H3 H4)
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G
Natural (@dist T (Dist_Traverse T) G H2 H3 H4)
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G
Functor (T ○ G)
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G
Functor (G ○ T)
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G
forall (AB : Type) (f : A -> B),
map f ∘ dist T G = dist T G ∘ map f
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G
Functor (T ○ G)
typeclasses eauto.
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G
Functor (G ○ T)
typeclasses eauto.
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G
forall (AB : Type) (f : A -> B),
map f ∘ dist T G = dist T G ∘ map f
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G A, B: Type f: A -> B
map f ∘ dist T G = dist T G ∘ map f
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G A, B: Type f: A -> B
map (traverse f) ∘ traverse id =
traverse id ∘ traverse (map f)
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G A, B: Type f: A -> B
traverse (kc2 f id) = traverse id ∘ traverse (map f)
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G A, B: Type f: A -> B
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G A, B: Type f: A -> B
traverse (kc2 f id) = traverse (kc2 id (map f))
(* (These rewrites are hidden) *)
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G A, B: Type f: A -> B
traverse (kc2 f id) = traverse (kc2 id (map f))
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G: Type -> Type H2: Map G H3: Pure G H4: Mult G H0: Applicative G A, B: Type f: A -> B
traverse (kc2 f id) = traverse (kc2 id (map f))
reflexivity.Qed.
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T
forall (G1G2 : Type -> Type) (H0 : Map G1)
(H1 : Mult G1) (H2 : Pure G1) (H3 : Map G2)
(H4 : Mult G2) (H5 : Pure G2)
(ϕ : forallA : Type, G1 A -> G2 A),
ApplicativeMorphism G1 G2 ϕ ->
forallA : Type,
dist T G2 ∘ map (ϕ A) = ϕ (T A) ∘ dist T G1
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T
forall (G1G2 : Type -> Type) (H0 : Map G1)
(H1 : Mult G1) (H2 : Pure G1) (H3 : Map G2)
(H4 : Mult G2) (H5 : Pure G2)
(ϕ : forallA : Type, G1 A -> G2 A),
ApplicativeMorphism G1 G2 ϕ ->
forallA : Type,
dist T G2 ∘ map (ϕ A) = ϕ (T A) ∘ dist T G1
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G1, G2: Type -> Type H0: Map G1 H1: Mult G1 H2: Pure G1 H3: Map G2 H4: Mult G2 H5: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H6: ApplicativeMorphism G1 G2 ϕ A: Type
dist T G2 ∘ map (ϕ A) = ϕ (T A) ∘ dist T G1
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G1, G2: Type -> Type H0: Map G1 H1: Mult G1 H2: Pure G1 H3: Map G2 H4: Mult G2 H5: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H6: ApplicativeMorphism G1 G2 ϕ A: Type
traverse id ∘ traverse (ϕ A) = ϕ (T A) ∘ traverse id
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G1, G2: Type -> Type H0: Map G1 H1: Mult G1 H2: Pure G1 H3: Map G2 H4: Mult G2 H5: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H6: ApplicativeMorphism G1 G2 ϕ A: Type
map (traverse id) ∘ traverse (ϕ A) =
ϕ (T A) ∘ traverse id
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G1, G2: Type -> Type H0: Map G1 H1: Mult G1 H2: Pure G1 H3: Map G2 H4: Mult G2 H5: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H6: ApplicativeMorphism G1 G2 ϕ A: Type app1: Applicative G1 app2: Applicative G2
map (traverse id) ∘ traverse (ϕ A) =
ϕ (T A) ∘ traverse id
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G1, G2: Type -> Type H0: Map G1 H1: Mult G1 H2: Pure G1 H3: Map G2 H4: Mult G2 H5: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H6: ApplicativeMorphism G1 G2 ϕ A: Type app1: Applicative G1 app2: Applicative G2
traverse (kc2 id (ϕ A)) = ϕ (T A) ∘ traverse id
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G1, G2: Type -> Type H0: Map G1 H1: Mult G1 H2: Pure G1 H3: Map G2 H4: Mult G2 H5: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H6: ApplicativeMorphism G1 G2 ϕ A: Type app1: Applicative G1 app2: Applicative G2
traverse (kc2 id (ϕ A)) = ϕ (T A) ∘ traverse id
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G1, G2: Type -> Type H0: Map G1 H1: Mult G1 H2: Pure G1 H3: Map G2 H4: Mult G2 H5: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H6: ApplicativeMorphism G1 G2 ϕ A: Type app1: Applicative G1 app2: Applicative G2
traverse (kc2 id (ϕ A)) = traverse (ϕ A ∘ id)
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G1, G2: Type -> Type H0: Map G1 H1: Mult G1 H2: Pure G1 H3: Map G2 H4: Mult G2 H5: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H6: ApplicativeMorphism G1 G2 ϕ A: Type app1: Applicative G1 app2: Applicative G2
Mult_compose (funA : Type => A) G2 = H4
nowrewrite (Mult_compose_identity2 G2).Qed.
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T
forallA : Type, dist T (funA0 : Type => A0) = id
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T
forallA : Type, dist T (funA0 : Type => A0) = id
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T A: Type
dist T (funA0 : Type => A0) = id
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T A: Type
traverse id = id
apply (trf_traverse_id (T := T)).Qed.
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T
forall (G1 : Type -> Type) (H2 : Map G1)
(H3 : Pure G1) (H4 : Mult G1),
Applicative G1 ->
forall (G2 : Type -> Type) (H6 : Map G2)
(H7 : Pure G2) (H8 : Mult G2),
Applicative G2 ->
forallA : Type,
dist T (G1 ∘ G2) = map (dist T G2) ∘ dist T G1
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T
forall (G1 : Type -> Type) (H2 : Map G1)
(H3 : Pure G1) (H4 : Mult G1),
Applicative G1 ->
forall (G2 : Type -> Type) (H6 : Map G2)
(H7 : Pure G2) (H8 : Mult G2),
Applicative G2 ->
forallA : Type,
dist T (G1 ∘ G2) = map (dist T G2) ∘ dist T G1
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G1: Type -> Type H2: Map G1 H3: Pure G1 H4: Mult G1 H0: Applicative G1 G2: Type -> Type H6: Map G2 H7: Pure G2 H8: Mult G2 H1: Applicative G2 A: Type
dist T (G1 ∘ G2) = map (dist T G2) ∘ dist T G1
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G1: Type -> Type H2: Map G1 H3: Pure G1 H4: Mult G1 H0: Applicative G1 G2: Type -> Type H6: Map G2 H7: Pure G2 H8: Mult G2 H1: Applicative G2 A: Type
traverse id = map (traverse id) ∘ traverse id
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G1: Type -> Type H2: Map G1 H3: Pure G1 H4: Mult G1 H0: Applicative G1 G2: Type -> Type H6: Map G2 H7: Pure G2 H8: Mult G2 H1: Applicative G2 A: Type
traverse id = traverse (kc2 id id)
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G1: Type -> Type H2: Map G1 H3: Pure G1 H4: Mult G1 H0: Applicative G1 G2: Type -> Type H6: Map G2 H7: Pure G2 H8: Mult G2 H1: Applicative G2 A: Type
traverse id = traverse (map id ∘ id)
T: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T G1: Type -> Type H2: Map G1 H3: Pure G1 H4: Mult G1 H0: Applicative G1 G2: Type -> Type H6: Map G2 H7: Pure G2 H8: Mult G2 H1: Applicative G2 A: Type