(* We define the parity predicates*)
 
Definition Even (z : Z) : Prop := exists z1 : _, z = (2 * z1)%Z.Definition Odd (z : Z) : Prop := exists z1 : _, z = (2 * z1 + 1)%Z.

(* Specifications: *)
Theorem OddSEven : forall n : Z, Odd n -> Even (Zsucc n).
Theorem EvenSOdd : forall n : Z, Even n -> Odd (Zsucc n).
Theorem OddSEvenInv : forall n : Z, Odd (Zsucc n) -> Even n.
Theorem EvenSOddInv : forall n : Z, Even (Zsucc n) -> Odd n.
Theorem EvenO : Even 0.
Theorem Odd1 : Odd 1.
Theorem OddOpp : forall z : Z, Odd z -> Odd (- z).
Theorem EvenOpp : forall z : Z, Even z -> Even (- z).
Theorem OddEvenDec : forall n : Z, {Odd n} + {Even n}.
Theorem OddNEven : forall n : Z, Odd n -> ~ Even n.
Theorem EvenNOdd : forall n : Z, Even n -> ~ Odd n.
Theorem EvenPlus1 : forall n m : Z, Even n -> Even m -> Even (n + m).
Theorem EvenPlus2 : forall n m : Z, Odd n -> Odd m -> Even (n + m).
Theorem OddPlus1 : forall n m : Z, Odd n -> Even m -> Odd (n + m).
Theorem OddPlus2 : forall n m : Z, Even n -> Odd m -> Odd (n + m).
Theorem EvenPlusInv1 : forall n m : Z, Even (n + m) -> Even n -> Even m.
Theorem EvenPlusInv2 : forall n m : Z, Even (n + m) -> Odd n -> Odd m.
Theorem OddPlusInv1 : forall n m : Z, Odd (n + m) -> Odd m -> Even n.
Theorem OddPlusInv2 : forall n m : Z, Odd (n + m) -> Even m -> Odd n.
Theorem EvenMult1 : forall n m : Z, Even n -> Even (n * m).
Theorem EvenMult2 : forall n m : Z, Even m -> Even (n * m).
Theorem OddMult : forall n m : Z, Odd n -> Odd m -> Odd (n * m).
Theorem EvenMultInv : forall n m : Z, Even (n * m) -> Odd n -> Even m.
Theorem OddMultInv : forall n m : Z, Odd (n * m) -> Odd n.
Theorem EvenExp : forall (n : Z) (m : nat), Even n -> Even (Zpower_nat n (S m)).
Theorem OddExp : forall (n : Z) (m : nat), Odd n -> Odd (Zpower_nat n m).