1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
(************************************************************************)
(* * The Rocq Prover / The Rocq Development Team *)
(* v * Copyright INRIA, CNRS and contributors *)
(* <O___,, * (see version control and CREDITS file for authors & dates) *)
(* \VV/ **************************************************************)
(* // * This file is distributed under the terms of the *)
(* * GNU Lesser General Public License Version 2.1 *)
(* * (see LICENSE file for the text of the license) *)
(************************************************************************)
From Stdlib Require Import Bool ZMulOrder NZParity.
(** Some more properties of [even] and [odd]. *)
Module Type ZParityProp (Import Z : ZAxiomsSig')
(Import ZP : ZMulOrderProp Z).
Include NZParityProp Z Z ZP.
Lemma odd_pred : forall n, odd (P n) = even n.
Proof.
intros n. rewrite <- (succ_pred n) at 2. symmetry. apply even_succ.
Qed.
Lemma even_pred : forall n, even (P n) = odd n.
Proof.
intros n. rewrite <- (succ_pred n) at 2. symmetry. apply odd_succ.
Qed.
Lemma even_opp : forall n, even (-n) = even n.
Proof.
assert (H : forall n, Even n -> Even (-n)).
{ intros n (m,H). exists (-m). rewrite mul_opp_r. now f_equiv. }
intros n. rewrite eq_iff_eq_true, !even_spec.
split.
- rewrite <- (opp_involutive n) at 2. apply H.
- apply H.
Qed.
Lemma odd_opp : forall n, odd (-n) = odd n.
Proof.
intros. rewrite <- !negb_even. now rewrite even_opp.
Qed.
Lemma even_sub : forall n m, even (n-m) = Bool.eqb (even n) (even m).
Proof.
intros. now rewrite <- add_opp_r, even_add, even_opp.
Qed.
Lemma odd_sub : forall n m, odd (n-m) = xorb (odd n) (odd m).
Proof.
intros. now rewrite <- add_opp_r, odd_add, odd_opp.
Qed.
End ZParityProp.
|