Definition ListToCP {T : Type} (l : list T) (Default : T) : cartesianPower T (length l).

(* Specifications: *)
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.