Definition ListToCP {T : Type} (l : list T) (Default : T) : cartesianPower T (length l).Fixpoint circPermNCP {T:Type} {m:nat} (n : nat) (cp : cartesianPower T (S (S m))) :=
  match n with
  | 0 => cp
  | S p => circPermNCP p (consTailCP (tailCP cp) (headCP cp))
  end.

(* Specifications: *)
Lemma circPermNCP0 {T:Type} {n:nat} : forall (cp : cartesianPower T (S (S n))), cp = circPermNCP 0 cp.
Lemma circPermNCPOK {T:Type} {m:nat} : forall (n : nat) (cp : cartesianPower T (S (S m))), circPermNCP (S n) cp = circPermNCP n (consTailCP (tailCP cp) (headCP cp)).
Lemma nthCircPermNAny {T:Type} {m:nat} : forall (cp : cartesianPower T (S (S m))) (Default : T) id n, id + n <= S m -> nthCP (S id + n) cp Default = nthCP (S id) (circPermNCP n cp) Default.
Lemma circPermNIdFirst {T:Type} {n:nat} : forall (cp : cartesianPower T (S (S n))) (Default : T), nthCP 1 cp Default = nthCP 1 (circPermNCP (S (S n)) cp) Default.
Lemma circPermNConsTlOK {T:Type} {m:nat} : forall (n : nat) (cp : cartesianPower T (S (S m))), consTailCP (tailCP (circPermNCP n cp)) (headCP (circPermNCP n cp)) = circPermNCP n (consTailCP (tailCP cp) (headCP cp)).
Lemma circPermPerm {T:Type} {m:nat} : forall (n : nat) (cp : cartesianPower T (S (S m))), circPermNCP (S (S (S n))) cp = circPermNCP 1 (circPermNCP (S (S n)) cp).
Lemma nthCP01 {T:Type} {n:nat} : forall (cp : cartesianPower T (S n)) Default, nthCP 0 cp Default = nthCP 1 cp Default.
Lemma circPermNIdAux {T:Type} {n:nat} : forall (cp : cartesianPower T (S (S n))) (Default : T), cp = circPermNCP (S (S n)) cp.
Lemma circPermNId {T:Type} {n:nat} : forall (cp : cartesianPower T (S (S n))), cp = circPermNCP (S (S n)) cp.
Lemma circPermNConsOK {T:Type} {n:nat} : forall (cp : cartesianPower T (S n)) (t1 t2 : T), circPermNCP (S n) (consTailCP (consTailCP cp t1) t2) = consHeadCP t1 (consHeadCP t2 cp).
Lemma listInd {T : Type} : forall n (l l' : list T) Default, length l = (S n) -> length l' = (S n) -> hd Default l = hd Default l' -> tl l = tl l' -> l = l'.
Lemma CPLHd {T : Type} : forall (a : T) l Default, hd Default (CPToList (ListToCP (a :: l) Default)) = a.
Lemma ListToCPTl {T : Type} : forall (a a0 : T) l (Ha0l : (S (length l)) = length (a0 :: l)) Haa0l Default, tailCPbis (length (a :: a0 :: l)) (length (a :: l)) (ListToCP (a :: a0 :: l) Default) Haa0l Ha0l = ListToCP (a0 :: l) Default.
Lemma CPToListTl1 {T : Type} : forall (a a0 : T) l (cp : cartesianPower T (length (a :: a0 :: l))), tl (CPToList cp) = CPToList (tailCP cp).
Lemma CPToListTl2 {T : Type} {n : nat} : forall (cp : cartesianPower T (S (S n))), tl (CPToList cp) = CPToList (tailCP cp).
Lemma CPCPL {T : Type} : forall (a : T) l (cp1 : cartesianPower T (length (a :: l))) (cp2 : cartesianPower T (S(length l))), cp1 = cp2 -> CPToList cp1 = CPToList cp2.
Lemma CPLCP {T : Type} {n : nat} : forall (cp1 cp2 : cartesianPower T (S n)), CPToList cp1 = CPToList cp2 -> cp1 = cp2.
Lemma CPLRec {T : Type} : forall (a : T) l Default, (a :: (CPToList (ListToCP l Default))) = CPToList (ListToCP (a :: l) Default).
Lemma CPLOK {T : Type} : forall (l : list T) Default, CPToList (ListToCP l Default) = l.