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 Export
Classes.Categorical.Applicative
Classes.Kleisli.TraversableFunctor
Functors.Early.List.Import Applicative.Notations.#[local] Generalizable VariablesF.(** * The <<Backwards>> Applicative *)(**********************************************************************)SectionBackwards.RecordBackwards (F: Type -> Type) A :=
mkBackwards { forwards: F A }.#[global] Arguments mkBackwards {F}%function_scope
{A}%type_scope forwards.#[global] Arguments forwards {F}%function_scope
{A}%type_scope b.(** ** Functor Instance *)(********************************************************************)Sectionfunctor.Context `{Functor F}.#[export] InstanceMap_Backwards: Map (Backwards F) :=
funABfb => mkBackwards (map f (forwards b)).
F: Type -> Type Map_F: Map F H: Functor F
Functor (Backwards F)
F: Type -> Type Map_F: Map F H: Functor F
Functor (Backwards F)
F: Type -> Type Map_F: Map F H: Functor F
forallA : Type, map id = id
F: Type -> Type Map_F: Map F H: Functor F
forall (ABC : Type) (f : A -> B) (g : B -> C),
map g ∘ map f = map (g ∘ f)
F: Type -> Type Map_F: Map F H: Functor F
forallA : Type, map id = id
F: Type -> Type Map_F: Map F H: Functor F A: Type
map id = id
F: Type -> Type Map_F: Map F H: Functor F A: Type x: F A
map id {| forwards := x |} = id {| forwards := x |}
F: Type -> Type Map_F: Map F H: Functor F A: Type x: F A
{|
forwards := map id (forwards {| forwards := x |})
|} = id {| forwards := x |}
F: Type -> Type Map_F: Map F H: Functor F A: Type x: F A
{| forwards := id (forwards {| forwards := x |}) |} =
id {| forwards := x |}
reflexivity.
F: Type -> Type Map_F: Map F H: Functor F
forall (ABC : Type) (f : A -> B) (g : B -> C),
map g ∘ map f = map (g ∘ f)
F: Type -> Type Map_F: Map F H: Functor F A, B, C: Type f: A -> B g: B -> C
map g ∘ map f = map (g ∘ f)
F: Type -> Type Map_F: Map F H: Functor F A, B, C: Type f: A -> B g: B -> C x: F A
(map g ∘ map f) {| forwards := x |} =
map (g ∘ f) {| forwards := x |}
F: Type -> Type Map_F: Map F H: Functor F A, B, C: Type f: A -> B g: B -> C x: F A
((funb : Backwards F B =>
{| forwards := map g (forwards b) |})
∘ (funb : Backwards F A =>
{| forwards := map f (forwards b) |}))
{| forwards := x |} =
{|
forwards :=
map (g ∘ f) (forwards {| forwards := x |})
|}
F: Type -> Type Map_F: Map F H: Functor F A, B, C: Type f: A -> B g: B -> C x: F A
((funb : Backwards F B =>
{| forwards := map g (forwards b) |})
∘ (funb : Backwards F A =>
{| forwards := map f (forwards b) |}))
{| forwards := x |} =
{|
forwards :=
(map g ∘ map f) (forwards {| forwards := x |})
|}
reflexivity.Qed.
F: Type -> Type Map_F: Map F H: Functor F
Natural (@forwards F)
F: Type -> Type Map_F: Map F H: Functor F
Natural (@forwards F)
F: Type -> Type Map_F: Map F H: Functor F
forall (AB : Type) (f : A -> B),
map f ∘ forwards = forwards ∘ map f
F: Type -> Type Map_F: Map F H: Functor F A, B: Type f: A -> B
map f ∘ forwards = forwards ∘ map f
F: Type -> Type Map_F: Map F H: Functor F A, B: Type f: A -> B x: F A
(map f ∘ forwards) {| forwards := x |} =
(forwards ∘ map f) {| forwards := x |}
reflexivity.Qed.Endfunctor.(** ** Applicative Instance *)(********************************************************************)Sectionapplicative.Context
`{Applicative F}.#[export] InstancePure_Backwards: Pure (Backwards F) :=
funAa => mkBackwards (pure a).Definitionswap {AB}: B * A -> A * B :=
fun '(b, a) => (a, b).Definitionmult_Backwards {AB}:
Backwards F A -> Backwards F B -> Backwards F (A * B) :=
funbabb => mkBackwards (map swap (forwards bb ⊗ forwards ba)).#[export] InstanceMult_Backwards: Mult (Backwards F) :=
funAB '(x, y) => mult_Backwards x y.
F: Type -> Type Map_G: Map F Pure_G: Pure F Mult_G: Mult F H: Applicative F
Applicative (Backwards F)
F: Type -> Type Map_G: Map F Pure_G: Pure F Mult_G: Mult F H: Applicative F
Applicative (Backwards F)
F: Type -> Type Map_G: Map F Pure_G: Pure F Mult_G: Mult F H: Applicative F
Functor (Backwards F)
F: Type -> Type Map_G: Map F Pure_G: Pure F Mult_G: Mult F H: Applicative F A, B: Type f: A -> B x: A
{| forwards := map f (pure x) |} =
{| forwards := pure (f x) |}
F: Type -> Type Map_G: Map F Pure_G: Pure F Mult_G: Mult F H: Applicative F A, B, C, D: Type f: A -> C g: B -> D x: Backwards F A y: Backwards F B
{|
forwards :=
map swap (map g (forwards y) ⊗ map f (forwards x))
|} =
{|
forwards :=
map (map_tensor f g)
(map swap (forwards y ⊗ forwards x))
|}
F: Type -> Type Map_G: Map F Pure_G: Pure F Mult_G: Mult F H: Applicative F A, B, C: Type x: Backwards F A y: Backwards F B z: Backwards F C
F: Type -> Type Map_G: Map F Pure_G: Pure F Mult_G: Mult F H: Applicative F A, B, C: Type x: Backwards F A y: Backwards F B z: Backwards F C c: C b: B a: A
(associator ∘ (swap ∘ (map_snd swap ∘ associator)))
(c, b, a) = (swap ∘ map_fst swap) (c, b, a)
reflexivity.
F: Type -> Type Map_G: Map F Pure_G: Pure F Mult_G: Mult F H: Applicative F A: Type x: Backwards F A
{|
forwards :=
map left_unitor (map swap (forwards x ⊗ pure tt))
|} = x
F: Type -> Type Map_G: Map F Pure_G: Pure F Mult_G: Mult F H: Applicative F A: Type forward: F A
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G
ApplicativeMorphism (Backwards (Backwards G)) G
(funA : Type => forwards ∘ forwards)
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G
ApplicativeMorphism (Backwards (Backwards G)) G
(funA : Type => forwards ∘ forwards)
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
map swap (map swap (x ⊗ y)) = x ⊗ y
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
(map swap ∘ map swap) (x ⊗ y) = x ⊗ y
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
map (swap ∘ swap) (x ⊗ y) = x ⊗ y
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
map id (x ⊗ y) = x ⊗ y
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
id = swap ∘ swap
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
id = swap ∘ swap
now ext [a b].Qed.
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G
ApplicativeMorphism G (Backwards (Backwards G))
(funA : Type => mkBackwards ∘ mkBackwards)
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G
ApplicativeMorphism G (Backwards (Backwards G))
(funA : Type => mkBackwards ∘ mkBackwards)
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
{| forwards := {| forwards := x ⊗ y |} |} =
mult_Backwards {| forwards := {| forwards := x |} |}
{| forwards := {| forwards := y |} |}
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
{| forwards := {| forwards := x ⊗ y |} |} =
mult_Backwards {| forwards := {| forwards := x |} |}
{| forwards := {| forwards := y |} |}
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
{| forwards := {| forwards := x ⊗ y |} |} =
{|
forwards :=
map swap
(forwards {| forwards := {| forwards := y |} |}
⊗ forwards
{| forwards := {| forwards := x |} |})
|}
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
{| forwards := x ⊗ y |} =
map swap {| forwards := map swap (x ⊗ y) |}
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
{| forwards := x ⊗ y |} =
{| forwards := map swap (map swap (x ⊗ y)) |}
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
x ⊗ y = map swap (map swap (x ⊗ y))
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
x ⊗ y = (map swap ∘ map swap) (x ⊗ y)
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
x ⊗ y = map (swap ∘ swap) (x ⊗ y)
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
x ⊗ y = map id (x ⊗ y)
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
id = swap ∘ swap
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type x: G A y: G B
id = swap ∘ swap
now ext [a b].Qed.Context
{AB: Type}
{f: A -> G B}
(t: T A).(** ** Traversing by <<Backwards (Backwards G)>> *)(******************************************************************)
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type f: A -> G B t: T A
forwards
(forwards
(traverse (mkBackwards ∘ (mkBackwards ∘ f)) t)) =
traverse f t
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type f: A -> G B t: T A
forwards
(forwards
(traverse (mkBackwards ∘ (mkBackwards ∘ f)) t)) =
traverse f t
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type f: A -> G B t: T A
forwards
(forwards
(traverse (mkBackwards ∘ (mkBackwards ∘ f)) t)) =
traverse f t
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type f: A -> G B t: T A
forwards
((forwards
∘ traverse (mkBackwards ∘ (mkBackwards ∘ f))) t) =
traverse f t
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type f: A -> G B t: T A
(forwards ∘ forwards
∘ traverse (mkBackwards ∘ (mkBackwards ∘ f))) t =
traverse f t
T, G: Type -> Type Traverse_T: Traverse T H: TraversableFunctor T Map_G: Map G Pure_G: Pure G Mult_G: Mult G H0: Applicative G A, B: Type f: A -> G B t: T A
traverse
(forwards ∘ forwards
∘ (mkBackwards ∘ (mkBackwards ∘ f))) t =
traverse f t
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l)))
traverse f (a :: l) =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev (a :: l))))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B
pure nil = map (List.rev (A:=B)) (pure nil)
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B
pure nil = pure (List.rev nil)
reflexivity.
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l)))
traverse f (a :: l) =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev (a :: l))))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l)))
pure cons <⋆> f a <⋆> traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f)
(List.rev l ++ a :: nil)))
(* left *)
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l)))
pure cons <⋆> f a <⋆>
map (List.rev (A:=B))
(forwards (traverse (mkBackwards ∘ f) (List.rev l))) =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f)
(List.rev l ++ a :: nil)))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l)))
pure cons <⋆> f a <⋆>
(pure (List.rev (A:=B)) <⋆>
forwards (traverse (mkBackwards ∘ f) (List.rev l))) =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f)
(List.rev l ++ a :: nil)))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l)))
pure (compose ∘ cons) <⋆> f a <⋆>
pure (List.rev (A:=B)) <⋆>
forwards (traverse (mkBackwards ∘ f) (List.rev l)) =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f)
(List.rev l ++ a :: nil)))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l)))
pure
((funf : (list B -> list B) -> list B -> list B =>
f (List.rev (A:=B))) ∘ (compose ∘ cons)) <⋆> f a <⋆>
forwards (traverse (mkBackwards ∘ f) (List.rev l)) =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f)
(List.rev l ++ a :: nil)))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l)))
pure (funa : B => cons a ○ List.rev (A:=B)) <⋆> f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ○ f)
(List.rev l ++ a :: nil)))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l)))
(funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (funa : B => cons a ○ List.rev (A:=B)) <⋆> f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ○ f)
(List.rev l ++ a :: nil)))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l)))
(funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) x: B y: list B
x :: List.rev y =
(compose (List.rev (A:=B)) ∘ Basics.flip snoc) x y
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) x: B y: list B
x :: List.rev y = List.rev (y ++ x :: nil)
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) x: B y: list B
x :: List.rev y = x :: List.rev y
reflexivity.
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (funa : B => cons a ○ List.rev (A:=B)) <⋆> f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ○ f)
(List.rev l ++ a :: nil)))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (compose (List.rev (A:=B)) ∘ Basics.flip snoc) <⋆>
f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ○ f)
(List.rev l ++ a :: nil)))
(* right *)
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (compose (List.rev (A:=B)) ∘ Basics.flip snoc) <⋆>
f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
map (List.rev (A:=B))
(forwards
(pure snoc <⋆>
traverse (mkBackwards ○ f) (List.rev l) <⋆>
{| forwards := f a |}))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (compose (List.rev (A:=B)) ∘ Basics.flip snoc) <⋆>
f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
forwards
(map (List.rev (A:=B))
(pure snoc <⋆>
traverse (mkBackwards ○ f) (List.rev l) <⋆>
{| forwards := f a |}))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (compose (List.rev (A:=B)) ∘ Basics.flip snoc) <⋆>
f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
forwards
(pure (List.rev (A:=B)) <⋆>
(pure snoc <⋆>
traverse (mkBackwards ○ f) (List.rev l) <⋆>
{| forwards := f a |}))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (compose (List.rev (A:=B)) ∘ Basics.flip snoc) <⋆>
f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
forwards
(pure ((compose ∘ compose) (List.rev (A:=B)) snoc) <⋆>
traverse (mkBackwards ○ f) (List.rev l) <⋆>
{| forwards := f a |})
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (compose (List.rev (A:=B)) ∘ Basics.flip snoc) <⋆>
f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
map evalAt (forwards {| forwards := f a |}) <⋆>
forwards
(pure ((compose ∘ compose) (List.rev (A:=B)) snoc) <⋆>
traverse (mkBackwards ○ f) (List.rev l))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (compose (List.rev (A:=B)) ∘ Basics.flip snoc) <⋆>
f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
map evalAt (forwards {| forwards := f a |}) <⋆>
(map evalAt
(forwards (traverse (mkBackwards ○ f) (List.rev l))) <⋆>
forwards
(pure ((compose ∘ compose) (List.rev (A:=B)) snoc)))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (compose (List.rev (A:=B)) ∘ Basics.flip snoc) <⋆>
f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
pure (compose ∘ evalAt) <⋆>
forwards {| forwards := f a |} <⋆>
map evalAt
(forwards (traverse (mkBackwards ○ f) (List.rev l))) <⋆>
forwards
(pure ((compose ∘ compose) (List.rev (A:=B)) snoc))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (compose (List.rev (A:=B)) ∘ Basics.flip snoc) <⋆>
f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
pure (compose ∘ evalAt) <⋆> f a <⋆>
map evalAt
(forwards (traverse (mkBackwards ○ f) (List.rev l))) <⋆>
pure ((compose ∘ compose) (List.rev (A:=B)) snoc)
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (compose (List.rev (A:=B)) ∘ Basics.flip snoc) <⋆>
f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
pure (compose ∘ (compose ∘ evalAt)) <⋆> f a <⋆>
pure evalAt <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) <⋆>
pure ((compose ∘ compose) (List.rev (A:=B)) snoc)
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (compose (List.rev (A:=B)) ∘ Basics.flip snoc) <⋆>
f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
pure
((compose ∘ compose) compose compose compose compose
compose
(funf : (list B -> B -> list B) -> list B =>
f ((compose ∘ compose) (List.rev (A:=B)) snoc))
(compose
∘ (compose
∘ (fun (a : B) (f : B -> list B) => f a)))) <⋆>
f a <⋆>
pure
(fun (a : list B) (f : list B -> B -> list B) => f a) <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B a: A l: list A IHl: traverse f l =
map (List.rev (A:=B))
(forwards
(traverse (mkBackwards ∘ f) (List.rev l))) cut: (funb : B => cons b ○ List.rev (A:=B)) =
compose (List.rev (A:=B)) ∘ Basics.flip snoc
pure (compose (List.rev (A:=B)) ∘ Basics.flip snoc) <⋆>
f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l)) =
pure
((funf : (list B ->
(list B -> B -> list B) -> B -> list B) ->
list B -> list B =>
f
(fun (a : list B) (f0 : list B -> B -> list B)
=> f0 a))
∘ (compose ∘ compose) compose compose compose
compose compose
(funf : (list B -> B -> list B) -> list B =>
f ((compose ∘ compose) (List.rev (A:=B)) snoc))
(compose
∘ (compose
∘ (fun (a : B) (f : B -> list B) => f a)))) <⋆>
f a <⋆>
forwards (traverse (mkBackwards ○ f) (List.rev l))
reflexivity.Qed.
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G
forall (AB : Type) (f : A -> G B) (l : list A),
traverse f (List.rev l) =
forwards
(map (List.rev (A:=B))
(traverse (mkBackwards ∘ f) l))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G
forall (AB : Type) (f : A -> G B) (l : list A),
traverse f (List.rev l) =
forwards
(map (List.rev (A:=B))
(traverse (mkBackwards ∘ f) l))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: A -> G B l: list A