Definition Research : IdiomaticTransformation (KSApplicative a b) F.Record Traversal := traversal 
 { container :> Type -> Type
 ; traverse : forall a b (F : Applicative), (a -> F b) -> container a -> F (container b)
 ; free_applicative : forall a b (F G : Applicative) (eta : IdiomaticTransformation F G) (f : a -> F b) (x : container a),
       eta _ (traverse f x) = traverse (fun y => eta _ (f y)) x
 ; traverse_identity : forall a (x : container a),
       traverse (F:=IdApplicative) (fun y => y) x = x
 ; traverse_compose :
   forall a b c (F G : Applicative) (f : a -> F b) (g : b -> G c) (x : container a),
       traverse (F:=ComposeApplicative F G) (fun y => map g (f y)) x =
       map (traverse g) (traverse f x)
 }.Record Traversal := traversal 
 { container :> Type -> Type
 ; traverse : forall a b (F : Applicative), (a -> F b) -> container a -> F (container b)
 ; free_applicative : forall a b (F G : Applicative) (eta : IdiomaticTransformation F G) (f : a -> F b) (x : container a),
       eta _ (traverse f x) = traverse (fun y => eta _ (f y)) x
 ; traverse_identity : forall a (x : container a),
       traverse (F:=IdApplicative) (fun y => y) x = x
 ; traverse_compose :
   forall a b c (F G : Applicative) (f : a -> F b) (g : b -> G c) (x : container a),
       traverse (F:=ComposeApplicative F G) (fun y => map g (f y)) x =
       map (traverse g) (traverse f x)
 }.Record Traversal := traversal 
 { container :> Type -> Type
 ; traverse : forall a b (F : Applicative), (a -> F b) -> container a -> F (container b)
 ; free_applicative : forall a b (F G : Applicative) (eta : IdiomaticTransformation F G) (f : a -> F b) (x : container a),
       eta _ (traverse f x) = traverse (fun y => eta _ (f y)) x
 ; traverse_identity : forall a (x : container a),
       traverse (F:=IdApplicative) (fun y => y) x = x
 ; traverse_compose :
   forall a b c (F G : Applicative) (f : a -> F b) (g : b -> G c) (x : container a),
       traverse (F:=ComposeApplicative F G) (fun y => map g (f y)) x =
       map (traverse g) (traverse f x)
 }.Record Traversal := traversal 
 { container :> Type -> Type
 ; traverse : forall a b (F : Applicative), (a -> F b) -> container a -> F (container b)
 ; free_applicative : forall a b (F G : Applicative) (eta : IdiomaticTransformation F G) (f : a -> F b) (x : container a),
       eta _ (traverse f x) = traverse (fun y => eta _ (f y)) x
 ; traverse_identity : forall a (x : container a),
       traverse (F:=IdApplicative) (fun y => y) x = x
 ; traverse_compose :
   forall a b c (F G : Applicative) (f : a -> F b) (g : b -> G c) (x : container a),
       traverse (F:=ComposeApplicative F G) (fun y => map g (f y)) x =
       map (traverse g) (traverse f x)
 }.Record Traversal := traversal 
 { container :> Type -> Type
 ; traverse : forall a b (F : Applicative), (a -> F b) -> container a -> F (container b)
 ; free_applicative : forall a b (F G : Applicative) (eta : IdiomaticTransformation F G) (f : a -> F b) (x : container a),
       eta _ (traverse f x) = traverse (fun y => eta _ (f y)) x
 ; traverse_identity : forall a (x : container a),
       traverse (F:=IdApplicative) (fun y => y) x = x
 ; traverse_compose :
   forall a b c (F G : Applicative) (f : a -> F b) (g : b -> G c) (x : container a),
       traverse (F:=ComposeApplicative F G) (fun y => map g (f y)) x =
       map (traverse g) (traverse f x)
 }.Record Traversal := traversal 
 { container :> Type -> Type
 ; traverse : forall a b (F : Applicative), (a -> F b) -> container a -> F (container b)
 ; free_applicative : forall a b (F G : Applicative) (eta : IdiomaticTransformation F G) (f : a -> F b) (x : container a),
       eta _ (traverse f x) = traverse (fun y => eta _ (f y)) x
 ; traverse_identity : forall a (x : container a),
       traverse (F:=IdApplicative) (fun y => y) x = x
 ; traverse_compose :
   forall a b c (F G : Applicative) (f : a -> F b) (g : b -> G c) (x : container a),
       traverse (F:=ComposeApplicative F G) (fun y => map g (f y)) x =
       map (traverse g) (traverse f x)
 }.Record Traversal := traversal 
 { container :> Type -> Type
 ; traverse : forall a b (F : Applicative), (a -> F b) -> container a -> F (container b)
 ; free_applicative : forall a b (F G : Applicative) (eta : IdiomaticTransformation F G) (f : a -> F b) (x : container a),
       eta _ (traverse f x) = traverse (fun y => eta _ (f y)) x
 ; traverse_identity : forall a (x : container a),
       traverse (F:=IdApplicative) (fun y => y) x = x
 ; traverse_compose :
   forall a b c (F G : Applicative) (f : a -> F b) (g : b -> G c) (x : container a),
       traverse (F:=ComposeApplicative F G) (fun y => map g (f y)) x =
       map (traverse g) (traverse f x)
 }.

(* Specifications: *)
Lemma traverseVector_free_applicative n a b (F G : Applicative) (eta :IdiomaticTransformation F G) (f : a -> F b) (x : Vector.t a n) : eta _ (traverseVector f x) = traverseVector (fun y => eta _ (f y)) x.
Lemma traverseVector_identity n a (x : Vector.t a n) : traverseVector (F:=IdApplicative) (fun y => y) x = x.
Lemma traverseVector_compose n a b c (F G : Applicative) (f : a -> F b) (g : b -> G c) (x : Vector.t a n) : traverseVector (F:=ComposeApplicative F G) (fun y => map g (f y)) x = map (traverseVector g) (traverseVector f x).