From Undecidability.Shared.Libs.PSL Require Import BasicDefinitions.
From Undecidability.Shared.Libs.PSL Require Import FiniteTypes.FinTypes.
From Undecidability.Shared.Libs.PSL Require Import Vectors.Vectors.
From Undecidability.Shared.Libs.PSL Require Import Vectors.VectorDupfree.
From Undecidability.Shared.Libs.PSL Require Import FiniteTypes.Cardinality.
Definition Fin_initVect (n : nat) : Vector.t (Fin.t n) n :=
tabulate (fun i : Fin.t n => i).
Definition Fin_initVect_nth (n : nat) (k : Fin.t n) :
Vector.nth (Fin_initVect n) k = k.
(* Function that produces a list of all Vectors of length n over A *)
Fixpoint Vector_pow {X: Type} (A: list X) n {struct n} : list (Vector.t X n) :=
match n with
| 0 => [Vector.nil _]
| S n => concat (map (fun a => map (fun v => a:::v) (Vector_pow A n) ) A)
end.
Instance Vector_finTypeC (A:finType) n: finTypeC (EqType (Vector.t A n)).

Lemma prod_enum_ok (T1 T2: finType) (x: T1 * T2):
BasicDefinitions.count (prodLists (elem T1) (elem T2)) x = 1.