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 *)
(**********************************************************************)
Fixpoint decorate_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.

Definition decorate_telescoping_list {A: Type} (l: list A):
  list (nat * A) := decorate_telescoping_list_rec 0 l.

(** ** Alternative Characterization of <<decorate_telescoping_list>> *)
(**********************************************************************)
Fixpoint decorate_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>> *)
(**********************************************************************)
Section decorate_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

forall l1 l2 : list A, decorate_telescoping_list_alt (l1 ++ l2) = decorate_telescoping_list_alt l1 ++ map (incr (length l1)) (decorate_telescoping_list_alt l2)
A: Type

forall l1 l2 : list A, decorate_telescoping_list_alt (l1 ++ l2) = decorate_telescoping_list_alt l1 ++ map (incr (length l1)) (decorate_telescoping_list_alt l2)
A: Type
l1, l2: list A

decorate_telescoping_list_alt (l1 ++ l2) = decorate_telescoping_list_alt l1 ++ map (incr (length l1)) (decorate_telescoping_list_alt l2)
A: Type
l1: list A

forall l2 : list A, decorate_telescoping_list_alt (l1 ++ l2) = decorate_telescoping_list_alt l1 ++ map (incr (length l1)) (decorate_telescoping_list_alt l2)
A: Type
l2: list A

decorate_telescoping_list_alt (nil ++ l2) = decorate_telescoping_list_alt nil ++ map (incr (length nil)) (decorate_telescoping_list_alt l2)
A: Type
a: A
l1: list A
IHl1: forall l2 : 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
l2: list A

decorate_telescoping_list_alt (nil ++ l2) = decorate_telescoping_list_alt nil ++ map (incr (length nil)) (decorate_telescoping_list_alt l2)
A: Type
l2: list A

decorate_telescoping_list_alt l2 = map (incr 0) (decorate_telescoping_list_alt l2)
A: Type
l2: list A

decorate_telescoping_list_alt l2 = map (incr (Ƶ : nat)) (decorate_telescoping_list_alt l2)
A: Type
l2: list A

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: forall l2 : 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: forall l2 : 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: forall l2 : 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: forall l2 : 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: forall l2 : 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 1) (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: forall l2 : 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 1) ∘ 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: forall l2 : 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 1 ∘ 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: forall l2 : 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 (1 ● 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: forall l2 : 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)
reflexivity. Qed. End decorate_telescoping_list_rw. (** ** Equivalence *) (**********************************************************************)

forall (A : Type) (l : list A), decorate_telescoping_list l = decorate_telescoping_list_alt l

forall (A : Type) (l : list A), decorate_telescoping_list l = decorate_telescoping_list_alt l
A: Type
l: list A

decorate_telescoping_list l = decorate_telescoping_list_alt l
A: Type
l: list A

decorate_telescoping_list_rec 0 l = decorate_telescoping_list_alt l
A: Type
l: list A

forall n : nat, decorate_telescoping_list_rec n l = map (incr n) (decorate_telescoping_list_alt l)
A: Type
l: list A
H: forall n : 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

forall n : nat, decorate_telescoping_list_rec n l = map (incr n) (decorate_telescoping_list_alt l)
A: Type

forall n : nat, decorate_telescoping_list_rec n nil = map (incr n) (decorate_telescoping_list_alt nil)
A: Type
a: A
l: list A
IHl: forall n : nat, decorate_telescoping_list_rec n l = map (incr n) (decorate_telescoping_list_alt l)
forall n : nat, decorate_telescoping_list_rec n (a :: l) = map (incr n) (decorate_telescoping_list_alt (a :: l))
A: Type

forall n : nat, decorate_telescoping_list_rec n nil = map (incr n) (decorate_telescoping_list_alt nil)
reflexivity.
A: Type
a: A
l: list A
IHl: forall n : nat, decorate_telescoping_list_rec n l = map (incr n) (decorate_telescoping_list_alt l)

forall 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: forall n : 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: forall n : 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: forall n : 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: forall n : 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: forall n : 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: forall n : 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: forall n : 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: forall n : 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: forall n : 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: forall n : 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)
now rewrite incr_zero. Qed. (** ** Associated <<mapdt>> Operation *) (**********************************************************************) Fixpoint mapdt_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] Instance Mapdt_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 (A B : 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 (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
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

forall f : 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: forall f : 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: forall f : 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: forall f : 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: forall f : 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: forall f : nat * A -> G B, mapdt f l = traverse f (decorate_telescoping_list_alt l)
f: nat * A -> G B

traverse (f ⦿ 1) (decorate_telescoping_list_alt 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: forall f : nat * A -> G B, mapdt f l = traverse f (decorate_telescoping_list_alt l)
f: nat * A -> G B

traverse (f ⦿ 1) (decorate_telescoping_list_alt 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: forall f : nat * A -> G B, mapdt f l = traverse f (decorate_telescoping_list_alt l)
f: nat * A -> G B

traverse (f ⦿ 1) (decorate_telescoping_list_alt l) = traverse (f ∘ incr 1) (decorate_telescoping_list_alt l)
reflexivity. Qed. (** ** Rewriting Rules for <<decorate_telescoping_list>> *) (**********************************************************************) Section mapdt_telescoping_list_rw. Context {A B: 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

forall f, 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

forall f, 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

forall f (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

forall f (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

forall f (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

forall f (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

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
reflexivity. Qed. End mapdt_telescoping_list_rw. (** ** Typeclass Instance *) (**********************************************************************)

DecoratedTraversableFunctor nat list

DecoratedTraversableFunctor nat list
A: Type
l: list A

mapdt_telescoping_list extract 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 (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
ϕ: forall A : 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

forall 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
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

(map (mapdt_telescoping_list g) ∘ mapdt_telescoping_list f) 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
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

(map (mapdt_telescoping_list g) ∘ mapdt_telescoping_list f) 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

map (mapdt_telescoping_list g) (mapdt_telescoping_list f 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

map (mapdt_telescoping_list g) (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 (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 ⦿ 13 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 ⦿ 13 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
ϕ: forall A : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
l: list A

forall f : 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
ϕ: forall A : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
a: A
l: list A
IHl: forall f : 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
ϕ: forall A : 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
ϕ: forall A : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
f: nat * A -> G1 B

ϕ (list B) (pure nil) = pure nil
now rewrite appmor_pure.
G1, G2: Type -> Type
H0: Map G1
H1: Mult G1
H2: Pure G1
H3: Map G2
H4: Mult G2
H5: Pure G2
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
a: A
l: list A
IHl: forall f : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
a: A
l: list A
IHl: forall f : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
a: A
l: list A
IHl: forall f : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
a: A
l: list A
IHl: forall f : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
a: A
l: list A
IHl: forall f : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
a: A
l: list A
IHl: forall f : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
a: A
l: list A
IHl: forall f : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
a: A
l: list A
IHl: forall f : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
a: A
l: list A
IHl: forall f : 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] Instance ToBatch3_Telescoping_List: ToBatch3 nat list := DerivedOperations.ToBatch3_Mapdt (H := Mapdt_Telescoping_List). #[export] Instance Mapd_List_Telescope: Mapd nat list := DerivedOperations.Mapd_Mapdt. #[export] Instance Compat_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

mapdt (f ∘ extract) 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

mapdt (f ∘ extract) rest = mapdt (f ∘ extract) rest
reflexivity. Qed.

Compat_Map_Mapdt nat list

Compat_Map_Mapdt nat list

Map_list = DerivedOperations.Map_Mapdt
A, B: Type
f: A -> B
l: list A

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] Instance ToCtxlist_List_Telescoping: ToCtxlist nat list := ToCtxlist_Mapdt. #[export] Instance ToCtxset_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 *) (**********************************************************************) Definition decorate_list_full {A: Type} (l: list A): list (nat * A) := map (pair (length l)) l. (** ** The Associated <<mapdt_list_full>> Operation *) (**********************************************************************) Definition mapdt_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] Instance Mapdt_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 (fun l : list B => traverse (g ∘ pair (length l)) l) ∘ (fun l : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
f: nat * A -> G1 B
l: list A
(ϕ (list B) ∘ (fun l : 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
now rewrite 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 (fun l : list B => traverse (g ∘ pair (length l)) l) ∘ (fun l : 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 (fun l : 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 (fun l : 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

map g (map (pair (length l)) (f (length l, a))) = map (g ○ pair (length l)) (f (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

(map g ∘ map (pair (length l))) (f (length l, a)) = map (g ○ pair (length l)) (f (length l, a))
now rewrite (fun_map_map (F := G1)).
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 (fun l : 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 (fun l : 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 (fun l : 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 (fun l : 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 (fun l : list B => traverse (g ∘ pair (length l)) l) (traverse (f ∘ pair (length l)) l) = (map (traverse (g ∘ pair (length l))) ∘ traverse (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 (fun l : list B => traverse (g ∘ pair (length l)) l) (map (trav_make l) (forwards (traverse (mkBackwards ∘ (f ∘ pair (length l))) (trav_contents l)))) = (map (traverse (g ∘ pair (length l))) ∘ traverse (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 (fun l : list B => traverse (g ∘ pair (length l)) l) ∘ map (trav_make l)) (forwards (traverse (mkBackwards ∘ (f ∘ pair (length l))) (trav_contents l))) = (map (traverse (g ∘ pair (length l))) ∘ traverse (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 ((fun l : list B => traverse (g ∘ pair (length l)) l) ∘ trav_make l) (forwards (traverse (mkBackwards ∘ (f ∘ pair (length l))) (trav_contents l))) = (map (traverse (g ∘ pair (length l))) ∘ traverse (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 ((fun l : list B => traverse (g ∘ pair (length l)) l) ∘ trav_make l) (forwards (traverse (mkBackwards ∘ (f ∘ pair (length l))) (trav_contents l))) = (map (traverse (g ∘ pair (length l))) ∘ traverse (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 (fun a : Vector (plength l) B => traverse (g ∘ pair (length (trav_make l a))) (trav_make l a)) (forwards (traverse (mkBackwards ∘ (f ∘ pair (length l))) (trav_contents l))) = (map (traverse (g ∘ pair (length l))) ∘ traverse (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)

(fun 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
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: (fun 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
map (fun a : Vector (plength l) B => traverse (g ∘ pair (length (trav_make l a))) (trav_make l a)) (forwards (traverse (mkBackwards ∘ (f ∘ pair (length l))) (trav_contents l))) = (map (traverse (g ∘ pair (length l))) ∘ traverse (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)

(fun 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
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: (fun 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

map (fun a : Vector (plength l) B => traverse (g ∘ pair (length (trav_make l a))) (trav_make l a)) (forwards (traverse (mkBackwards ∘ (f ∘ pair (length l))) (trav_contents l))) = (map (traverse (g ∘ pair (length l))) ∘ traverse (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)
cut: (fun 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

map (traverse (g ∘ pair (length l)) ○ trav_make l) (forwards (traverse (mkBackwards ∘ (f ∘ pair (length l))) (trav_contents l))) = (map (traverse (g ∘ pair (length l))) ∘ traverse (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)
cut: (fun 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

map (traverse (g ∘ pair (length l)) ∘ trav_make l) (forwards (traverse (mkBackwards ∘ (f ∘ pair (length l))) (trav_contents l))) = (map (traverse (g ∘ pair (length l))) ∘ traverse (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)
cut: (fun 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

(map (traverse (g ∘ pair (length l))) ∘ map (trav_make l)) (forwards (traverse (mkBackwards ∘ (f ∘ pair (length l))) (trav_contents l))) = (map (traverse (g ∘ pair (length l))) ∘ traverse (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)
cut: (fun 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

map (traverse (g ∘ pair (length l))) (map (trav_make l) (forwards (traverse (mkBackwards ∘ (f ∘ pair (length l))) (trav_contents l)))) = (map (traverse (g ∘ pair (length l))) ∘ traverse (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)
cut: (fun 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

map (traverse (g ∘ pair (length l))) (traverse (f ∘ pair (length l)) l) = (map (traverse (g ∘ pair (length l))) ∘ traverse (f ∘ pair (length l))) l
reflexivity.
G1, G2: Type -> Type
H0: Map G1
H1: Mult G1
H2: Pure G1
H3: Map G2
H4: Mult G2
H5: Pure G2
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
f: nat * A -> G1 B
l: list A

(ϕ (list B) ∘ (fun l : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
f: nat * A -> G1 B
l: list A

(ϕ (list B) ∘ (fun l : 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
ϕ: forall A : Type, G1 A -> G2 A
morphism: ApplicativeMorphism G1 G2 ϕ
A, B: Type
f: nat * A -> G1 B
l: list A

(ϕ (list B) ∘ (fun l : list A => traverse (f ∘ pair (length l)) l)) l = (ϕ (list B) ∘ traverse (f ∘ pair (length l))) l
reflexivity. Qed. (** ** Derived <<toBatch3>> and <<mapd>> *) (**********************************************************************) #[export] Instance ToBatch3_List_Full: ToBatch3 nat list := DerivedOperations.ToBatch3_Mapdt (H := Mapdt_List_Full). #[export] Instance Mapd_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] Instance Compat_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 (A B : Type) (f : A -> B) => mapdt (f ∘ extract))

Map_list = (fun (A B : Type) (f : A -> B) => mapdt_list_full (f ∘ extract))

Map_list = (fun (A B : 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] Instance ToCtxlist_List_Full: ToCtxlist nat list := ToCtxlist_Mapdt. #[export] Instance ToCtxset_List_Full: ToCtxset nat list := ToCtxset_Mapdt.

Compat_ToSubset_ToCtxset nat list

Compat_ToSubset_ToCtxset nat list
apply Compat_ToSubset_ToCtxset_Traverse. Qed.