proposition: Lemma PermOKAux {T : Type} {m : nat} : forall (appPred : (cartesianPower T (S (S m))) -> Prop) n, (forall (A : T) (X : cartesianPower T (S m)), appPred (consHeadCP A X) -> appPred (consTailCP X A)) -> forall (X : cartesianPower T (S (S m))), appPred X -> appPred (circPermNCP n X).
proof: Proof. intros appPred n HPerm. induction n. simpl; auto. intros X HappPred. assert (H : appPred (circPermNCP n X)) by (apply IHn; assumption); clear IHn; clear HappPred. rewrite consHeadCPOK in H. apply HPerm in H. rewrite circPermNCPOK. rewrite <- circPermNConsTlOK. assumption. Qed.
imports: Arith NArith List Sorting Coq.Program.Equality