Record IdiomaticTransformation (F G:Applicative) := idiomaticTransformation 
 { transform :> forall a, F a -> G a
 ; _ : forall a (x:a), transform (pure F x) = pure G x
 ; _ : forall a b (f : F (a -> b)) x, transform (ap f x) = ap (transform f) (transform x)
 }.Record IdiomaticTransformation (F G:Applicative) := idiomaticTransformation 
 { transform :> forall a, F a -> G a
 ; _ : forall a (x:a), transform (pure F x) = pure G x
 ; _ : forall a b (f : F (a -> b)) x, transform (ap f x) = ap (transform f) (transform x)
 }.Record IdiomaticTransformation (F G:Applicative) := idiomaticTransformation 
 { transform :> forall a, F a -> G a
 ; _ : forall a (x:a), transform (pure F x) = pure G x
 ; _ : forall a b (f : F (a -> b)) x, transform (ap f x) = ap (transform f) (transform x)
 }.

(* Specifications: *)
Lemma idiomaticTransform_pure a (x:a) : eta _ (pure F x) = pure G x.
Lemma idiomaticTransform_ap a b (f: F (a -> b)) (x: F a) : eta _ (ap f x) = ap (eta _ f) (eta _ x).
Lemma idiomaticTransform_map a b (f: a -> b) (x: F a) : eta _ (map f x) = map f (eta _ x).
Lemma idiomaticTransform_sequenceVector n a (v : Vector.t (F a) n) : eta _ (sequenceVector v) = sequenceVector (Vector.map (eta _) v).
Lemma idiomaticTransform_traverseVector n a b (f : a -> F b) (v : Vector.t a n) : eta _ (traverseVector f v) = traverseVector (fun y => eta _ (f y)) v.
Lemma extract_pure i a (x : a) : extract (KSpure i i x) = x.
Lemma extract_ap i a b (f : KleeneStore i i (a -> b)) (x : KleeneStore i i a) : extract (KSap f x) = extract f (extract x).