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.Coalgebraic.DecoratedTraversableFunctor
Classes.Kleisli.DecoratedTraversableFunctor
Adapters.KleisliToCoalgebraic.DecoratedTraversableFunctor
Classes.Kleisli.Theory.DecoratedTraversableFunctor
Theory.TraversableFunctor
Functors.List
Misc.NaturalNumbers.Import Applicative.Notations.Import Monoid.Notations.Import DecoratedTraversableFunctor.Notations.Import Kleisli.TraversableFunctor.Notations.Import Subset.Notations.(** * Telescoping Decoration for the List Functor *)(**********************************************************************)(** ** The <<decorate_telescoping_list>> Operation *)(**********************************************************************)Fixpointdecorate_telescoping_list_rec (n: nat) {A: Type} (l: list A):
list (nat * A) :=
match l with
| nil => nil
| x :: xs =>
(n, x) :: decorate_telescoping_list_rec (S n) xs
end.Definitiondecorate_telescoping_list {A: Type} (l: list A):
list (nat * A) := decorate_telescoping_list_rec 0 l.(** ** Alternative Characterization of <<decorate_telescoping_list>> *)(**********************************************************************)Fixpointdecorate_telescoping_list_alt {A: Type} (l: list A):
list (nat * A) :=
match l with
| nil => nil
| x :: xs =>
(0, x) :: map (F := list) (incr 1) (decorate_telescoping_list_alt xs)
end.(** ** Rewriting Rules for <<decorate_telescoping_list>> *)(**********************************************************************)Sectiondecorate_telescoping_list_rw.Context {A: Type}.
A: Type
decorate_telescoping_list_alt nil = nil
A: Type
decorate_telescoping_list_alt nil = nil
reflexivity.Qed.
A: Type
forall (a : A) (l : list A),
decorate_telescoping_list_alt (a :: l) =
(0, a)
:: map (incr 1) (decorate_telescoping_list_alt l)
A: Type
forall (a : A) (l : list A),
decorate_telescoping_list_alt (a :: l) =
(0, a)
:: map (incr 1) (decorate_telescoping_list_alt l)
reflexivity.Qed.
A: Type
foralll1l2 : list A,
decorate_telescoping_list_alt (l1 ++ l2) =
decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2)
A: Type
foralll1l2 : list A,
decorate_telescoping_list_alt (l1 ++ l2) =
decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2)
A: Type a: A l1: list A IHl1: foralll2 : list A,
decorate_telescoping_list_alt (l1 ++ l2) =
decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2) l2: list A
decorate_telescoping_list_alt ((a :: l1) ++ l2) =
decorate_telescoping_list_alt (a :: l1) ++
map (incr (length (a :: l1)))
(decorate_telescoping_list_alt l2)
decorate_telescoping_list_alt l2 =
map id (decorate_telescoping_list_alt l2)
A: Type l2: list A
decorate_telescoping_list_alt l2 =
id (decorate_telescoping_list_alt l2)
reflexivity.
A: Type a: A l1: list A IHl1: foralll2 : list A,
decorate_telescoping_list_alt (l1 ++ l2) =
decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2) l2: list A
decorate_telescoping_list_alt ((a :: l1) ++ l2) =
decorate_telescoping_list_alt (a :: l1) ++
map (incr (length (a :: l1)))
(decorate_telescoping_list_alt l2)
A: Type a: A l1: list A IHl1: foralll2 : list A,
decorate_telescoping_list_alt (l1 ++ l2) =
decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2) l2: list A
decorate_telescoping_list_alt (a :: l1 ++ l2) =
decorate_telescoping_list_alt (a :: l1) ++
map (incr (length (a :: l1)))
(decorate_telescoping_list_alt l2)
A: Type a: A l1: list A IHl1: foralll2 : list A,
decorate_telescoping_list_alt (l1 ++ l2) =
decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2) l2: list A
(0, a)
:: map (incr 1)
(decorate_telescoping_list_alt (l1 ++ l2)) =
decorate_telescoping_list_alt (a :: l1) ++
map (incr (length (a :: l1)))
(decorate_telescoping_list_alt l2)
A: Type a: A l1: list A IHl1: foralll2 : list A,
decorate_telescoping_list_alt (l1 ++ l2) =
decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2) l2: list A
(0, a)
:: map (incr 1)
(decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2)) =
decorate_telescoping_list_alt (a :: l1) ++
map (incr (length (a :: l1)))
(decorate_telescoping_list_alt l2)
A: Type a: A l1: list A IHl1: foralll2 : list A,
decorate_telescoping_list_alt (l1 ++ l2) =
decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2) l2: list A
A: Type a: A l1: list A IHl1: foralll2 : list A,
decorate_telescoping_list_alt (l1 ++ l2) =
decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2) l2: list A
A: Type a: A l1: list A IHl1: foralll2 : list A,
decorate_telescoping_list_alt (l1 ++ l2) =
decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2) l2: list A
A: Type a: A l1: list A IHl1: foralll2 : list A,
decorate_telescoping_list_alt (l1 ++ l2) =
decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2) l2: list A
A: Type a: A l1: list A IHl1: foralll2 : list A,
decorate_telescoping_list_alt (l1 ++ l2) =
decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2) l2: list A
(0, a)
:: map (incr 1) (decorate_telescoping_list_alt l1) ++
map (incr (length (a :: l1)))
(decorate_telescoping_list_alt l2) =
decorate_telescoping_list_alt (a :: l1) ++
map (incr (length (a :: l1)))
(decorate_telescoping_list_alt l2)
A: Type a: A l: list A IHl: foralln : nat,
decorate_telescoping_list_rec n l =
map (incr n) (decorate_telescoping_list_alt l)
foralln : nat,
decorate_telescoping_list_rec n (a :: l) =
map (incr n) (decorate_telescoping_list_alt (a :: l))
A: Type a: A l: list A IHl: foralln : nat,
decorate_telescoping_list_rec n l =
map (incr n) (decorate_telescoping_list_alt l) n: nat
decorate_telescoping_list_rec n (a :: l) =
map (incr n) (decorate_telescoping_list_alt (a :: l))
A: Type a: A l: list A IHl: foralln : nat,
decorate_telescoping_list_rec n l =
map (incr n) (decorate_telescoping_list_alt l) n: nat
(n, a) :: decorate_telescoping_list_rec (S n) l =
(n ● 0, a)
:: map (incr n)
(map (incr 1) (decorate_telescoping_list_alt l))
A: Type a: A l: list A IHl: foralln : nat,
decorate_telescoping_list_rec n l =
map (incr n) (decorate_telescoping_list_alt l) n: nat
(n, a)
:: map (incr (S n)) (decorate_telescoping_list_alt l) =
(n ● 0, a)
:: map (incr n)
(map (incr 1) (decorate_telescoping_list_alt l))
A: Type a: A l: list A IHl: foralln : nat,
decorate_telescoping_list_rec n l =
map (incr n) (decorate_telescoping_list_alt l) n: nat
(n, a)
:: map (incr (S n)) (decorate_telescoping_list_alt l) =
(n ● (Ƶ : nat), a)
:: map (incr n)
(map (incr 1) (decorate_telescoping_list_alt l))
A: Type a: A l: list A IHl: foralln : nat,
decorate_telescoping_list_rec n l =
map (incr n) (decorate_telescoping_list_alt l) n: nat
(n, a)
:: map (incr (S n)) (decorate_telescoping_list_alt l) =
(n, a)
:: map (incr n)
(map (incr 1) (decorate_telescoping_list_alt l))
A: Type a: A l: list A IHl: foralln : nat,
decorate_telescoping_list_rec n l =
map (incr n) (decorate_telescoping_list_alt l) n: nat
(n, a)
:: map (incr (S n)) (decorate_telescoping_list_alt l) =
(n, a)
:: (map (incr n) ∘ map (incr 1))
(decorate_telescoping_list_alt l)
A: Type a: A l: list A IHl: foralln : nat,
decorate_telescoping_list_rec n l =
map (incr n) (decorate_telescoping_list_alt l) n: nat
(n, a)
:: map (incr (S n)) (decorate_telescoping_list_alt l) =
(n, a)
:: map (incr n ∘ incr 1)
(decorate_telescoping_list_alt l)
A: Type a: A l: list A IHl: foralln : nat,
decorate_telescoping_list_rec n l =
map (incr n) (decorate_telescoping_list_alt l) n: nat
(n, a)
:: map (incr (S n)) (decorate_telescoping_list_alt l) =
(n, a)
:: map (incr (n ● 1))
(decorate_telescoping_list_alt l)
A: Type a: A l: list A IHl: foralln : nat,
decorate_telescoping_list_rec n l =
map (incr n) (decorate_telescoping_list_alt l) n: nat
(n, a)
:: map (incr (S n)) (decorate_telescoping_list_alt l) =
(n, a)
:: map (incr (S n)) (decorate_telescoping_list_alt l)
reflexivity.
A: Type l: list A H: foralln : nat,
decorate_telescoping_list_rec n l =
map (incr n) (decorate_telescoping_list_alt l)
decorate_telescoping_list_rec 0 l =
decorate_telescoping_list_alt l
A: Type l: list A H: decorate_telescoping_list_rec 0 l =
map (incr 0) (decorate_telescoping_list_alt l)
decorate_telescoping_list_rec 0 l =
decorate_telescoping_list_alt l
A: Type l: list A H: decorate_telescoping_list_rec 0 l =
map id (decorate_telescoping_list_alt l)
decorate_telescoping_list_rec 0 l =
decorate_telescoping_list_alt l
A: Type l: list A H: decorate_telescoping_list_rec 0 l =
map (incr 0) (decorate_telescoping_list_alt l)
id = incr 0
A: Type l: list A H: decorate_telescoping_list_rec 0 l =
id (decorate_telescoping_list_alt l)
decorate_telescoping_list_rec 0 l =
decorate_telescoping_list_alt l
A: Type l: list A H: decorate_telescoping_list_rec 0 l =
map (incr 0) (decorate_telescoping_list_alt l)
id = incr 0
A: Type l: list A H: decorate_telescoping_list_rec 0 l =
map (incr 0) (decorate_telescoping_list_alt l)
id = incr 0
A: Type l: list A H: decorate_telescoping_list_rec 0 l =
map (incr 0) (decorate_telescoping_list_alt l)
id = incr (Ƶ : nat)
nowrewrite incr_zero.Qed.(** ** Associated <<mapdt>> Operation *)(**********************************************************************)Fixpointmapdt_telescoping_list
{G: Type -> Type} `{Map G} `{Pure G} `{Mult G}
{A B: Type} (f: nat * A -> G B) (l: list A)
: G (list B) :=
match l with
| nil => pure (@nil B)
| x :: xs =>
pure (@List.cons B) <⋆> f (0, x) <⋆>
mapdt_telescoping_list (f ⦿ 1) xs
end.#[export] InstanceMapdt_Telescoping_List:
Mapdt nat list := @mapdt_telescoping_list.
forall (G : Type -> Type) (Map_G : Map G)
(Pure_G : Pure G) (Mult_G : Mult G),
Applicative G ->
forall (AB : Type) (f : nat * A -> G B) (l : list A),
mapdt f l =
traverse f (decorate_telescoping_list_alt l)
forall (G : Type -> Type) (Map_G : Map G)
(Pure_G : Pure G) (Mult_G : Mult G),
Applicative G ->
forall (AB : Type) (f : nat * A -> G B) (l : list A),
mapdt f l =
traverse f (decorate_telescoping_list_alt l)
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: nat * A -> G B l: list A
mapdt f l =
traverse f (decorate_telescoping_list_alt l)
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type l: list A
forallf : nat * A -> G B,
mapdt f l =
traverse f (decorate_telescoping_list_alt l)
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: nat * A -> G B
mapdt f nil =
traverse f (decorate_telescoping_list_alt nil)
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type a: A l: list A IHl: forallf : nat * A -> G B,
mapdt f l =
traverse f (decorate_telescoping_list_alt l) f: nat * A -> G B
mapdt f (a :: l) =
traverse f (decorate_telescoping_list_alt (a :: l))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type f: nat * A -> G B
mapdt f nil =
traverse f (decorate_telescoping_list_alt nil)
reflexivity.
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type a: A l: list A IHl: forallf : nat * A -> G B,
mapdt f l =
traverse f (decorate_telescoping_list_alt l) f: nat * A -> G B
mapdt f (a :: l) =
traverse f (decorate_telescoping_list_alt (a :: l))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type a: A l: list A IHl: forallf : nat * A -> G B,
mapdt f l =
traverse f (decorate_telescoping_list_alt l) f: nat * A -> G B
pure cons <⋆> f (0, a) <⋆> mapdt (f ⦿ 1) l =
pure cons <⋆> f (0, a) <⋆>
traverse f
(map (incr 1) (decorate_telescoping_list_alt l))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type a: A l: list A IHl: forallf : nat * A -> G B,
mapdt f l =
traverse f (decorate_telescoping_list_alt l) f: nat * A -> G B
mapdt (f ⦿ 1) l =
traverse f
(map (incr 1) (decorate_telescoping_list_alt l))
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type a: A l: list A IHl: forallf : nat * A -> G B,
mapdt f l =
traverse f (decorate_telescoping_list_alt l) f: nat * A -> G B
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type a: A l: list A IHl: forallf : nat * A -> G B,
mapdt f l =
traverse f (decorate_telescoping_list_alt l) f: nat * A -> G B
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G A, B: Type a: A l: list A IHl: forallf : nat * A -> G B,
mapdt f l =
traverse f (decorate_telescoping_list_alt l) f: nat * A -> G B
reflexivity.Qed.(** ** Rewriting Rules for <<decorate_telescoping_list>> *)(**********************************************************************)Sectionmapdt_telescoping_list_rw.Context {AB: Type}.Context
{G: Type -> Type}
`{Applicative G}.Implicit Type (f: nat * A -> G B).
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G
forallf, mapdt_telescoping_list f nil = pure nil
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G
forallf, mapdt_telescoping_list f nil = pure nil
reflexivity.Qed.
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G
forallf (a : A) (l : list A),
mapdt_telescoping_list f (a :: l) =
pure cons <⋆> f (0, a) <⋆>
mapdt_telescoping_list (f ⦿ 1) l
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G
forallf (a : A) (l : list A),
mapdt_telescoping_list f (a :: l) =
pure cons <⋆> f (0, a) <⋆>
mapdt_telescoping_list (f ⦿ 1) l
reflexivity.Qed.
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G
forallf (l1l2 : list A),
mapdt_telescoping_list f (l1 ++ l2) =
pure (app (A:=B)) <⋆> mapdt_telescoping_list f l1 <⋆>
mapdt_telescoping_list (f ⦿ length l1) l2
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G
forallf (l1l2 : list A),
mapdt_telescoping_list f (l1 ++ l2) =
pure (app (A:=B)) <⋆> mapdt_telescoping_list f l1 <⋆>
mapdt_telescoping_list (f ⦿ length l1) l2
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G f: nat * A -> G B l1, l2: list A
mapdt_telescoping_list f (l1 ++ l2) =
pure (app (A:=B)) <⋆> mapdt_telescoping_list f l1 <⋆>
mapdt_telescoping_list (f ⦿ length l1) l2
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G f: nat * A -> G B l1, l2: list A
traverse f (decorate_telescoping_list_alt (l1 ++ l2)) =
pure (app (A:=B)) <⋆> mapdt_telescoping_list f l1 <⋆>
mapdt_telescoping_list (f ⦿ length l1) l2
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G f: nat * A -> G B l1, l2: list A
traverse f
(decorate_telescoping_list_alt l1 ++
map (incr (length l1))
(decorate_telescoping_list_alt l2)) =
pure (app (A:=B)) <⋆> mapdt_telescoping_list f l1 <⋆>
mapdt_telescoping_list (f ⦿ length l1) l2
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G f: nat * A -> G B l1, l2: list A
pure (app (A:=B)) <⋆>
traverse f (decorate_telescoping_list_alt l1) <⋆>
traverse f
(map (incr (length l1))
(decorate_telescoping_list_alt l2)) =
pure (app (A:=B)) <⋆> mapdt_telescoping_list f l1 <⋆>
mapdt_telescoping_list (f ⦿ length l1) l2
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G f: nat * A -> G B l1, l2: list A
pure (app (A:=B)) <⋆> mapdt f l1 <⋆>
traverse f
(map (incr (length l1))
(decorate_telescoping_list_alt l2)) =
pure (app (A:=B)) <⋆> mapdt_telescoping_list f l1 <⋆>
mapdt_telescoping_list (f ⦿ length l1) l2
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G f: nat * A -> G B l1, l2: list A
pure (app (A:=B)) <⋆> mapdt f l1 <⋆>
(traverse f ∘ map (incr (length l1)))
(decorate_telescoping_list_alt l2) =
pure (app (A:=B)) <⋆> mapdt_telescoping_list f l1 <⋆>
mapdt_telescoping_list (f ⦿ length l1) l2
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G f: nat * A -> G B l1, l2: list A
pure (app (A:=B)) <⋆> mapdt f l1 <⋆>
traverse (f ∘ incr (length l1))
(decorate_telescoping_list_alt l2) =
pure (app (A:=B)) <⋆> mapdt_telescoping_list f l1 <⋆>
mapdt_telescoping_list (f ⦿ length l1) l2
A, B: Type G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H: Applicative G f: nat * A -> G B l1, l2: list A
pure (app (A:=B)) <⋆> mapdt f l1 <⋆>
mapdt (f ∘ incr (length l1)) l2 =
pure (app (A:=B)) <⋆> mapdt_telescoping_list f l1 <⋆>
mapdt_telescoping_list (f ⦿ length l1) l2
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: nat * B -> G2 C f: nat * A -> G1 B l: list A
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type f: nat * A -> G1 B l: list A
(ϕ (list B) ∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (ϕ B ∘ f) l
A: Type l: list A
mapdt_telescoping_list extract l = id l
A: Type
mapdt_telescoping_list extract nil = id nil
A: Type a: A l: list A IHl: mapdt_telescoping_list extract l = id l
mapdt_telescoping_list extract (a :: l) = id (a :: l)
A: Type
mapdt_telescoping_list extract nil = id nil
A: Type
pure nil = id nil
reflexivity.
A: Type a: A l: list A IHl: mapdt_telescoping_list extract l = id l
mapdt_telescoping_list extract (a :: l) = id (a :: l)
A: Type a: A l: list A IHl: mapdt_telescoping_list extract l = id l
pure cons <⋆> extract (0, a) <⋆>
mapdt_telescoping_list (extract ⦿ 1) l =
id (a :: l)
A: Type a: A l: list A IHl: mapdt_telescoping_list extract l = id l
pure cons <⋆> extract (0, a) <⋆>
mapdt_telescoping_list extract l =
id (a :: l)
A: Type a: A l: list A IHl: mapdt_telescoping_list extract l = id l
pure cons <⋆> extract (0, a) <⋆> id l = id (a :: l)
reflexivity.
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: nat * B -> G2 C f: nat * A -> G1 B l: list A
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l
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: nat * B -> G2 C l: list A
forallf : nat * A -> G1 B,
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l
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 l: list A
forall (g : nat * B -> G2 C) (f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l
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: nat * B -> G2 C f: nat * A -> G1 B
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f)
(a :: l) = mapdt_telescoping_list (g ⋆3 f) (a :: l)
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: nat * B -> G2 C f: nat * A -> G1 B
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: nat * B -> G2 C f: nat * A -> G1 B
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: nat * B -> G2 C f: nat * A -> G1 B
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: nat * B -> G2 C f: nat * A -> G1 B
pure (mapdt_telescoping_list g nil) =
mapdt_telescoping_list (g ⋆3 f) nil
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: nat * B -> G2 C f: nat * A -> G1 B
pure (pure nil) = mapdt_telescoping_list (g ⋆3 f) nil
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: nat * B -> G2 C f: nat * A -> G1 B
pure (pure nil) = pure nil
reflexivity.
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f)
(a :: l) = mapdt_telescoping_list (g ⋆3 f) (a :: l)
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
map (mapdt_telescoping_list g)
(mapdt_telescoping_list f (a :: l)) =
mapdt_telescoping_list (g ⋆3 f) (a :: l)
(* left *)
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
map (mapdt_telescoping_list g)
(pure cons <⋆> f (0, a) <⋆>
mapdt_telescoping_list (f ⦿ 1) l) =
mapdt_telescoping_list (g ⋆3 f) (a :: l)
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
map (compose (mapdt_telescoping_list g))
(pure cons <⋆> f (0, a)) <⋆>
mapdt_telescoping_list (f ⦿ 1) l =
mapdt_telescoping_list (g ⋆3 f) (a :: l)
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
map (compose (compose (mapdt_telescoping_list g)))
(pure cons) <⋆> f (0, a) <⋆>
mapdt_telescoping_list (f ⦿ 1) l =
mapdt_telescoping_list (g ⋆3 f) (a :: l)
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
mapdt_telescoping_list (g ⋆3 f) (a :: l)
(* right *)
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
pure cons <⋆> (g ⋆3 f) (0, a) <⋆>
mapdt_telescoping_list ((g ⋆3 f) ⦿ 1) l
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
pure (pure cons) <⋆> (g ⋆3 f) (0, a) <⋆>
mapdt_telescoping_list ((g ⋆3 f) ⦿ 1) l
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
pure (pure cons) <⋆> (g ⋆3 f) (0, a) <⋆>
mapdt_telescoping_list (g ⦿ 1 ⋆3 f ⦿ 1) l
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
pure (pure cons) <⋆> map (g ∘ pair 0) (f (0, a)) <⋆>
mapdt_telescoping_list (g ⦿ 1 ⋆3 f ⦿ 1) l
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
pure (pure cons) <⋆> map (g ∘ pair 0) (f (0, a)) <⋆>
(map (mapdt_telescoping_list (g ⦿ 1))
∘ mapdt_telescoping_list (f ⦿ 1)) l
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
pure (pure cons) <⋆> map (g ∘ pair 0) (f (0, a)) <⋆>
map (mapdt_telescoping_list (g ⦿ 1))
(mapdt_telescoping_list (f ⦿ 1) l)
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
map (ap G2)
(pure (pure cons) <⋆> map (g ∘ pair 0) (f (0, a))) <⋆>
map (mapdt_telescoping_list (g ⦿ 1))
(mapdt_telescoping_list (f ⦿ 1) l)
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
map (ap G2)
(map (ap G2) (pure (pure cons)) <⋆>
map (g ∘ pair 0) (f (0, a))) <⋆>
map (mapdt_telescoping_list (g ⦿ 1))
(mapdt_telescoping_list (f ⦿ 1) l)
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
map (ap G2)
(pure (ap G2 (pure cons)) <⋆>
map (g ∘ pair 0) (f (0, a))) <⋆>
map (mapdt_telescoping_list (g ⦿ 1))
(mapdt_telescoping_list (f ⦿ 1) l)
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
map (compose (ap G2)) (pure (ap G2 (pure cons))) <⋆>
map (g ∘ pair 0) (f (0, a)) <⋆>
map (mapdt_telescoping_list (g ⦿ 1))
(mapdt_telescoping_list (f ⦿ 1) l)
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
pure (ap G2 ∘ ap G2 (pure cons)) <⋆>
map (g ∘ pair 0) (f (0, a)) <⋆>
map (mapdt_telescoping_list (g ⦿ 1))
(mapdt_telescoping_list (f ⦿ 1) l)
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
map (precompose (mapdt_telescoping_list (g ⦿ 1)))
(pure (ap G2 ∘ ap G2 (pure cons)) <⋆>
map (g ∘ pair 0) (f (0, a))) <⋆>
mapdt_telescoping_list (f ⦿ 1) l
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
map
(compose
(precompose (mapdt_telescoping_list (g ⦿ 1))))
(pure (ap G2 ∘ ap G2 (pure cons))) <⋆>
map (g ∘ pair 0) (f (0, a)) <⋆>
mapdt_telescoping_list (f ⦿ 1) l
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
pure
(precompose (mapdt_telescoping_list (g ⦿ 1))
∘ (ap G2 ∘ ap G2 (pure cons))) <⋆>
map (g ∘ pair 0) (f (0, a)) <⋆>
mapdt_telescoping_list (f ⦿ 1) l
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
map (precompose (g ∘ pair 0))
(pure
(precompose (mapdt_telescoping_list (g ⦿ 1))
∘ (ap G2 ∘ ap G2 (pure cons)))) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l
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 a: A l: list A IHl: forall (g : nat * B -> G2 C)
(f : nat * A -> G1 B),
(map (mapdt_telescoping_list g)
∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (g ⋆3 f) l g: nat * B -> G2 C f: nat * A -> G1 B
pure (compose (mapdt_telescoping_list g) ∘ cons) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l =
pure
(precompose (g ∘ pair 0)
(precompose (mapdt_telescoping_list (g ⦿ 1))
∘ (ap G2 ∘ ap G2 (pure cons)))) <⋆>
f (0, a) <⋆> mapdt_telescoping_list (f ⦿ 1) l
reflexivity.
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type f: nat * A -> G1 B l: list A
(ϕ (list B) ∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (ϕ B ∘ f) l
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type l: list A
forallf : nat * A -> G1 B,
(ϕ (list B) ∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (ϕ B ∘ f) l
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type f: nat * A -> G1 B
(ϕ (list B) ∘ mapdt_telescoping_list f) nil =
mapdt_telescoping_list (ϕ B ∘ f) nil
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type a: A l: list A IHl: forallf : nat * A -> G1 B,
(ϕ (list B) ∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (ϕ B ∘ f) l f: nat * A -> G1 B
(ϕ (list B) ∘ mapdt_telescoping_list f) (a :: l) =
mapdt_telescoping_list (ϕ B ∘ f) (a :: l)
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type f: nat * A -> G1 B
(ϕ (list B) ∘ mapdt_telescoping_list f) nil =
mapdt_telescoping_list (ϕ B ∘ f) nil
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type f: nat * A -> G1 B
ϕ (list B) (mapdt_telescoping_list f nil) =
mapdt_telescoping_list (ϕ B ○ f) nil
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type f: nat * A -> G1 B
ϕ (list B) (pure nil) = pure nil
nowrewrite appmor_pure.
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type a: A l: list A IHl: forallf : nat * A -> G1 B,
(ϕ (list B) ∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (ϕ B ∘ f) l f: nat * A -> G1 B
(ϕ (list B) ∘ mapdt_telescoping_list f) (a :: l) =
mapdt_telescoping_list (ϕ B ∘ f) (a :: l)
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type a: A l: list A IHl: forallf : nat * A -> G1 B,
(ϕ (list B) ∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (ϕ B ∘ f) l f: nat * A -> G1 B
ϕ (list B) (mapdt_telescoping_list f (a :: l)) =
mapdt_telescoping_list (ϕ B ∘ f) (a :: l)
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type a: A l: list A IHl: forallf : nat * A -> G1 B,
(ϕ (list B) ∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (ϕ B ∘ f) l f: nat * A -> G1 B
ϕ (list B)
(pure cons <⋆> f (0, a) <⋆>
mapdt_telescoping_list (f ⦿ 1) l) =
mapdt_telescoping_list (ϕ B ∘ f) (a :: l)
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type a: A l: list A IHl: forallf : nat * A -> G1 B,
(ϕ (list B) ∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (ϕ B ∘ f) l f: nat * A -> G1 B
ϕ (list B -> list B) (pure cons <⋆> f (0, a)) <⋆>
ϕ (list B) (mapdt_telescoping_list (f ⦿ 1) l) =
mapdt_telescoping_list (ϕ B ∘ f) (a :: l)
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type a: A l: list A IHl: forallf : nat * A -> G1 B,
(ϕ (list B) ∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (ϕ B ∘ f) l f: nat * A -> G1 B
ϕ (B -> list B -> list B) (pure cons) <⋆>
ϕ B (f (0, a)) <⋆>
ϕ (list B) (mapdt_telescoping_list (f ⦿ 1) l) =
mapdt_telescoping_list (ϕ B ∘ f) (a :: l)
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type a: A l: list A IHl: forallf : nat * A -> G1 B,
(ϕ (list B) ∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (ϕ B ∘ f) l f: nat * A -> G1 B
pure cons <⋆> ϕ B (f (0, a)) <⋆>
ϕ (list B) (mapdt_telescoping_list (f ⦿ 1) l) =
mapdt_telescoping_list (ϕ B ∘ f) (a :: l)
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type a: A l: list A IHl: forallf : nat * A -> G1 B,
(ϕ (list B) ∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (ϕ B ∘ f) l f: nat * A -> G1 B
pure cons <⋆> ϕ B (f (0, a)) <⋆>
ϕ (list B) (mapdt_telescoping_list (f ⦿ 1) l) =
pure cons <⋆> (ϕ B ∘ f) (0, a) <⋆>
mapdt_telescoping_list ((ϕ B ∘ f) ⦿ 1) l
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type a: A l: list A IHl: forallf : nat * A -> G1 B,
(ϕ (list B) ∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (ϕ B ∘ f) l f: nat * A -> G1 B
pure cons <⋆> ϕ B (f (0, a)) <⋆>
(ϕ (list B) ∘ mapdt_telescoping_list (f ⦿ 1)) l =
pure cons <⋆> (ϕ B ∘ f) (0, a) <⋆>
mapdt_telescoping_list ((ϕ B ∘ f) ⦿ 1) l
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type a: A l: list A IHl: forallf : nat * A -> G1 B,
(ϕ (list B) ∘ mapdt_telescoping_list f) l =
mapdt_telescoping_list (ϕ B ∘ f) l f: nat * A -> G1 B
pure cons <⋆> ϕ B (f (0, a)) <⋆>
mapdt_telescoping_list (ϕ B ∘ f ⦿ 1) l =
pure cons <⋆> (ϕ B ∘ f) (0, a) <⋆>
mapdt_telescoping_list ((ϕ B ∘ f) ⦿ 1) l
reflexivity.Qed.(** ** Derived Operation Compatibility *)(**********************************************************************)#[export] InstanceToBatch3_Telescoping_List: ToBatch3 nat list
:= DerivedOperations.ToBatch3_Mapdt (H := Mapdt_Telescoping_List).#[export] InstanceMapd_List_Telescope: Mapd nat list :=
DerivedOperations.Mapd_Mapdt.#[export] InstanceCompat_Mapd_Mapdt_Telescoping_List:
Compat_Mapd_Mapdt nat list := ltac:(typeclasses eauto).
Compat_Traverse_Mapdt nat list
Compat_Traverse_Mapdt nat list
Traverse_list = DerivedOperations.Traverse_Mapdt
G: Type -> Type MapG: Map G PureG: Pure G MultG: Mult G
Traverse_list G MapG PureG MultG =
DerivedOperations.Traverse_Mapdt G MapG PureG MultG
G: Type -> Type MapG: Map G PureG: Pure G MultG: Mult G A, B: Type f: A -> G B l: list A
Traverse_list G MapG PureG MultG A B f l =
DerivedOperations.Traverse_Mapdt G MapG PureG MultG A
B f l
G: Type -> Type MapG: Map G PureG: Pure G MultG: Mult G A, B: Type f: A -> G B l: list A
traverse f l =
DerivedOperations.Traverse_Mapdt G MapG PureG MultG A
B f l
G: Type -> Type MapG: Map G PureG: Pure G MultG: Mult G A, B: Type f: A -> G B l: list A
traverse f l = mapdt (f ∘ extract) l
G: Type -> Type MapG: Map G PureG: Pure G MultG: Mult G A, B: Type f: A -> G B
traverse f nil = mapdt (f ∘ extract) nil
G: Type -> Type MapG: Map G PureG: Pure G MultG: Mult G A, B: Type f: A -> G B a: A rest: list A IHrest: traverse f rest = mapdt (f ∘ extract) rest
traverse f (a :: rest) =
mapdt (f ∘ extract) (a :: rest)
G: Type -> Type MapG: Map G PureG: Pure G MultG: Mult G A, B: Type f: A -> G B
traverse f nil = mapdt (f ∘ extract) nil
reflexivity.
G: Type -> Type MapG: Map G PureG: Pure G MultG: Mult G A, B: Type f: A -> G B a: A rest: list A IHrest: traverse f rest = mapdt (f ∘ extract) rest
traverse f (a :: rest) =
mapdt (f ∘ extract) (a :: rest)
G: Type -> Type MapG: Map G PureG: Pure G MultG: Mult G A, B: Type f: A -> G B a: A rest: list A IHrest: traverse f rest = mapdt (f ∘ extract) rest
pure cons <⋆> f a <⋆> traverse f rest =
pure cons <⋆> (f ∘ extract) (0, a) <⋆>
mapdt ((f ∘ extract) ⦿ 1) rest
G: Type -> Type MapG: Map G PureG: Pure G MultG: Mult G A, B: Type f: A -> G B a: A rest: list A IHrest: traverse f rest = mapdt (f ∘ extract) rest
traverse f rest = mapdt ((f ∘ extract) ⦿ 1) rest
G: Type -> Type MapG: Map G PureG: Pure G MultG: Mult G A, B: Type f: A -> G B a: A rest: list A IHrest: traverse f rest = mapdt (f ∘ extract) rest
Map_list A B f l = DerivedOperations.Map_Mapdt A B f l
A, B: Type f: A -> B
Map_list A B f nil =
DerivedOperations.Map_Mapdt A B f nil
A, B: Type f: A -> B a: A rest: list A IHrest: Map_list A B f rest =
DerivedOperations.Map_Mapdt A B f rest
Map_list A B f (a :: rest) =
DerivedOperations.Map_Mapdt A B f (a :: rest)
A, B: Type f: A -> B
Map_list A B f nil =
DerivedOperations.Map_Mapdt A B f nil
reflexivity.
A, B: Type f: A -> B a: A rest: list A IHrest: Map_list A B f rest =
DerivedOperations.Map_Mapdt A B f rest
Map_list A B f (a :: rest) =
DerivedOperations.Map_Mapdt A B f (a :: rest)
A, B: Type f: A -> B a: A rest: list A IHrest: Map_list A B f rest =
DerivedOperations.Map_Mapdt A B f rest
f a :: Map_list A B f rest =
pure cons ((f ∘ extract) (0, a))
(mapdt ((f ∘ extract) ⦿ 1) rest)
A, B: Type f: A -> B a: A rest: list A IHrest: Map_list A B f rest =
DerivedOperations.Map_Mapdt A B f rest
Map_list A B f rest = mapdt ((f ∘ extract) ⦿ 1) rest
A, B: Type f: A -> B a: A rest: list A IHrest: Map_list A B f rest =
DerivedOperations.Map_Mapdt A B f rest
DerivedOperations.Map_Mapdt A B f rest =
mapdt ((f ∘ extract) ⦿ 1) rest
A, B: Type f: A -> B a: A rest: list A IHrest: Map_list A B f rest =
DerivedOperations.Map_Mapdt A B f rest
DerivedOperations.Map_Mapdt A B f rest =
mapdt (f ∘ extract) rest
reflexivity.Qed.(** ** Associated <<toctxlist>> and <<toctxset>> Operations *)(**********************************************************************)#[export] InstanceToCtxlist_List_Telescoping:
ToCtxlist nat list := ToCtxlist_Mapdt.#[export] InstanceToCtxset_List_Telescoping:
ToCtxset nat list := ToCtxset_Mapdt.
Compat_ToSubset_ToCtxset nat list
Compat_ToSubset_ToCtxset nat list
ToSubset_list = ToSubset_ToCtxset
A: Type l: list A a: A
ToSubset_list A l a = ToSubset_ToCtxset A l a
A: Type l: list A a: A
tosubset l a = ToSubset_ToCtxset A l a
A: Type l: list A a: A
tosubset l a = (map extract ∘ toctxset) l a
A: Type l: list A a: A
tosubset l a = (map extract ∘ ToCtxset_Mapdt A) l a
A: Type l: list A a: A
tosubset l a = (map extract ∘ mapdReduce ret) l a
A: Type l: list A a: A
tosubset l a = mapdReduce (map extract ∘ ret) l a
A: Type l: list A a: A
mapReduce ret l a = mapdReduce (map extract ∘ ret) l a
A: Type l: list A a: A
mapdReduce (ret ∘ extract) l a =
mapdReduce (map extract ∘ ret) l a
A: Type l: list A a: A
mapdReduce (ret ∘ extract) l a =
mapdReduce (ret ∘ map extract) l a
reflexivity.Qed.(** * Fully Recursive Decoration for the List Functor *)(**********************************************************************)(** ** The <<decorate_list_full>> Operation *)(**********************************************************************)Definitiondecorate_list_full {A: Type} (l: list A):
list (nat * A) :=
map (pair (length l)) l.(** ** The Associated <<mapdt_list_full>> Operation *)(**********************************************************************)Definitionmapdt_list_full
{G: Type -> Type} `{Map G} `{Pure G} `{Mult G}
{A B: Type} (f: nat * A -> G B) (l: list A)
: G (list B) :=
traverse (T := list) (G := G) (f ∘ pair (length l)) l.#[export] InstanceMapdt_List_Full: Mapdt nat list := @mapdt_list_full.(** ** <<DecoratedTraversableFunctor>> Typeclass Instance *)(**********************************************************************)
DecoratedTraversableFunctor nat list
DecoratedTraversableFunctor nat list
A: Type l: list A
traverse (extract ∘ pair (length l)) l = id l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A
(map
(funl : list B => traverse (g ∘ pair (length l)) l)
∘ (funl : list A => traverse (f ∘ pair (length l)) l))
l = traverse ((g ⋆3 f) ∘ pair (length l)) l
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type f: nat * A -> G1 B l: list A
(ϕ (list B)
∘ (funl : list A => traverse (f ∘ pair (length l)) l))
l = traverse (ϕ B ∘ f ∘ pair (length l)) l
A: Type l: list A
traverse (extract ∘ pair (length l)) l = id l
A: Type l: list A
traverse id l = id l
nowrewrite trf_traverse_id.
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: nat * B -> G2 C f: nat * A -> G1 B l: list A
(map
(funl : list B => traverse (g ∘ pair (length l)) l)
∘ (funl : list A => traverse (f ∘ pair (length l)) l))
l = traverse ((g ⋆3 f) ∘ pair (length l)) l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A
map
(funl : list B => traverse (g ∘ pair (length l)) l)
(traverse (f ∘ pair (length l)) l) =
traverse ((g ⋆3 f) ∘ pair (length l)) l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A
(g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
map
(funl : list B => traverse (g ∘ pair (length l)) l)
(traverse (f ∘ pair (length l)) l) =
traverse ((g ⋆3 f) ∘ pair (length l)) l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A
(g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
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: nat * B -> G2 C f: nat * A -> G1 B l: list A a: A
((g ⋆3 f) ∘ pair (length l)) a =
(g ∘ pair (length l) ⋆2 f ∘ pair (length l)) 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 A, B, C: Type g: nat * B -> G2 C f: nat * A -> G1 B l: list A a: 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 A, B, C: Type g: nat * B -> G2 C f: nat * A -> G1 B l: list A a: 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 A, B, C: Type g: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
map
(funl : list B => traverse (g ∘ pair (length l)) l)
(traverse (f ∘ pair (length l)) l) =
traverse ((g ⋆3 f) ∘ pair (length l)) l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
map
(funl : list B => traverse (g ∘ pair (length l)) l)
(traverse (f ∘ pair (length l)) l) =
traverse ((g ⋆3 f) ∘ pair (length l)) l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
map
(funl : list B => traverse (g ∘ pair (length l)) l)
(traverse (f ∘ pair (length l)) l) =
traverse (g ∘ pair (length l) ⋆2 f ∘ pair (length l))
l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
map
(funl : list B => traverse (g ∘ pair (length l)) l)
(traverse (f ∘ pair (length l)) l) =
traverse (g ∘ pair (length l) ⋆2 f ∘ pair (length l))
l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
(funa : Vector (plength l) B =>
traverse (g ∘ pair (length (trav_make l a)))
(trav_make l a)) =
traverse (g ∘ pair (length l)) ○ trav_make l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l) cut: (funa : Vector (plength l) B =>
traverse (g ∘ pair (length (trav_make l a)))
(trav_make l a)) =
traverse (g ∘ pair (length l)) ○ trav_make l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l)
(funa : Vector (plength l) B =>
traverse (g ∘ pair (length (trav_make l a)))
(trav_make l a)) =
traverse (g ∘ pair (length l)) ○ trav_make l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l) a: Vector (plength l) B
traverse (g ∘ pair (length (trav_make l a)))
(trav_make l a) =
traverse (g ∘ pair (length l)) (trav_make l 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 A, B, C: Type g: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l) a: Vector (plength l) B
traverse (g ∘ pair (plength (trav_make l a)))
(trav_make l a) =
traverse (g ∘ pair (length l)) (trav_make l 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 A, B, C: Type g: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l) a: Vector (plength l) B
traverse (g ∘ pair (plength (trav_make l a)))
(trav_make l a) =
traverse (g ∘ pair (plength l)) (trav_make l 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 A, B, C: Type g: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l) a: Vector (plength l) B
traverse (g ∘ pair (plength l)) (trav_make l a) =
traverse (g ∘ pair (plength l)) (trav_make l a)
reflexivity.
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l) cut: (funa : Vector (plength l) B =>
traverse (g ∘ pair (length (trav_make l a)))
(trav_make l a)) =
traverse (g ∘ pair (length l)) ○ trav_make l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l) cut: (funa : Vector (plength l) B =>
traverse (g ∘ pair (length (trav_make l a)))
(trav_make l a)) =
traverse (g ∘ pair (length l)) ○ trav_make l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l) cut: (funa : Vector (plength l) B =>
traverse (g ∘ pair (length (trav_make l a)))
(trav_make l a)) =
traverse (g ∘ pair (length l)) ○ trav_make l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l) cut: (funa : Vector (plength l) B =>
traverse (g ∘ pair (length (trav_make l a)))
(trav_make l a)) =
traverse (g ∘ pair (length l)) ○ trav_make l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l) cut: (funa : Vector (plength l) B =>
traverse (g ∘ pair (length (trav_make l a)))
(trav_make l a)) =
traverse (g ∘ pair (length l)) ○ trav_make l
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: nat * B -> G2 C f: nat * A -> G1 B l: list A kc_spec: (g ⋆3 f) ∘ pair (length l) =
g ∘ pair (length l) ⋆2 f ∘ pair (length l) cut: (funa : Vector (plength l) B =>
traverse (g ∘ pair (length (trav_make l a)))
(trav_make l a)) =
traverse (g ∘ pair (length l)) ○ trav_make l
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type f: nat * A -> G1 B l: list A
(ϕ (list B)
∘ (funl : list A => traverse (f ∘ pair (length l)) l))
l = traverse (ϕ B ∘ f ∘ pair (length l)) l
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type f: nat * A -> G1 B l: list A
(ϕ (list B)
∘ (funl : list A => traverse (f ∘ pair (length l)) l))
l = traverse (ϕ B ∘ (f ∘ pair (length l))) l
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 morphism: ApplicativeMorphism G1 G2 ϕ A, B: Type f: nat * A -> G1 B l: list A
(ϕ (list B)
∘ (funl : list A => traverse (f ∘ pair (length l)) l))
l = (ϕ (list B) ∘ traverse (f ∘ pair (length l))) l
reflexivity.Qed.(** ** Derived <<toBatch3>> and <<mapd>> *)(**********************************************************************)#[export] InstanceToBatch3_List_Full: ToBatch3 nat list
:= DerivedOperations.ToBatch3_Mapdt (H := Mapdt_List_Full).#[export] InstanceMapd_List_Full: Mapd nat list :=
@DerivedOperations.Mapd_Mapdt nat list Mapdt_List_Full.(** ** Compatibility Instances *)(**********************************************************************)
Compat_Traverse_Mapdt nat list
Compat_Traverse_Mapdt nat list
Traverse_list = DerivedOperations.Traverse_Mapdt
reflexivity.Qed.#[export] InstanceCompat_Mapd_Mapdt_List_Full:
Compat_Mapd_Mapdt nat list :=
ltac:(typeclasses eauto).
Compat_Map_Mapdt nat list
Compat_Map_Mapdt nat list
Map_list = DerivedOperations.Map_Mapdt
Map_list =
(fun (AB : Type) (f : A -> B) => mapdt (f ∘ extract))
Map_list =
(fun (AB : Type) (f : A -> B) =>
mapdt_list_full (f ∘ extract))
Map_list =
(fun (AB : Type) (f : A -> B) (l : list A) =>
traverse (f ∘ extract ∘ pair (length l)) l)
A, B: Type f: A -> B l: list A
Map_list A B f l =
traverse (f ∘ extract ∘ pair (length l)) l
A, B: Type f: A -> B l: list A
Map_list A B f l =
traverse (f ∘ (extract ∘ pair (length l))) l
A, B: Type f: A -> B l: list A
Map_list A B f l = traverse (f ∘ id) l
A, B: Type f: A -> B l: list A
Map_list A B f l = traverse f l
A, B: Type f: A -> B l: list A
Map_list A B f l = map f l
reflexivity.Qed.#[export] InstanceToCtxlist_List_Full:
ToCtxlist nat list := ToCtxlist_Mapdt.#[export] InstanceToCtxset_List_Full:
ToCtxset nat list := ToCtxset_Mapdt.