summaryrefslogtreecommitdiff
path: root/theories/Arith/Even.v
diff options
context:
space:
mode:
Diffstat (limited to 'theories/Arith/Even.v')
-rw-r--r--theories/Arith/Even.v387
1 files changed, 198 insertions, 189 deletions
diff --git a/theories/Arith/Even.v b/theories/Arith/Even.v
index cdbc86df..83c0ce17 100644
--- a/theories/Arith/Even.v
+++ b/theories/Arith/Even.v
@@ -6,7 +6,7 @@
(* * GNU Lesser General Public License Version 2.1 *)
(************************************************************************)
-(*i $Id: Even.v 5920 2004-07-16 20:01:26Z herbelin $ i*)
+(*i $Id: Even.v 9245 2006-10-17 12:53:34Z notin $ i*)
(** Here we define the predicates [even] and [odd] by mutual induction
and we prove the decidability and the exclusion of those predicates.
@@ -16,6 +16,9 @@ Open Local Scope nat_scope.
Implicit Types m n : nat.
+
+(** * Definition of [even] and [odd], and basic facts *)
+
Inductive even : nat -> Prop :=
| even_O : even 0
| even_S : forall n, odd n -> even (S n)
@@ -27,279 +30,285 @@ Hint Constructors odd: arith.
Lemma even_or_odd : forall n, even n \/ odd n.
Proof.
-induction n.
-auto with arith.
-elim IHn; auto with arith.
+ induction n.
+ auto with arith.
+ elim IHn; auto with arith.
Qed.
Lemma even_odd_dec : forall n, {even n} + {odd n}.
Proof.
-induction n.
-auto with arith.
-elim IHn; auto with arith.
+ induction n.
+ auto with arith.
+ elim IHn; auto with arith.
Qed.
Lemma not_even_and_odd : forall n, even n -> odd n -> False.
Proof.
-induction n.
-intros. inversion H0.
-intros. inversion H. inversion H0. auto with arith.
+ induction n.
+ intros even_0 odd_0. inversion odd_0.
+ intros even_Sn odd_Sn. inversion even_Sn. inversion odd_Sn. auto with arith.
Qed.
+
+(** * Facts about [even] & [odd] wrt. [plus] *)
+
Lemma even_plus_aux :
- forall n m,
- (odd (n + m) <-> odd n /\ even m \/ even n /\ odd m) /\
- (even (n + m) <-> even n /\ even m \/ odd n /\ odd m).
+ forall n m,
+ (odd (n + m) <-> odd n /\ even m \/ even n /\ odd m) /\
+ (even (n + m) <-> even n /\ even m \/ odd n /\ odd m).
Proof.
-intros n; elim n; simpl in |- *; auto with arith.
-intros m; split; auto.
-split.
-intros H; right; split; auto with arith.
-intros H'; case H'; auto with arith.
-intros H'0; elim H'0; intros H'1 H'2; inversion H'1.
-intros H; elim H; auto.
-split; auto with arith.
-intros H'; elim H'; auto with arith.
-intros H; elim H; auto.
-intros H'0; elim H'0; intros H'1 H'2; inversion H'1.
-intros n0 H' m; elim (H' m); intros H'1 H'2; elim H'1; intros E1 E2; elim H'2;
- intros E3 E4; clear H'1 H'2.
-split; split.
-intros H'0; case E3.
-inversion H'0; auto.
-intros H; elim H; intros H0 H1; clear H; auto with arith.
-intros H; elim H; intros H0 H1; clear H; auto with arith.
-intros H'0; case H'0; intros C0; case C0; intros C1 C2.
-apply odd_S.
-apply E4; left; split; auto with arith.
-inversion C1; auto.
-apply odd_S.
-apply E4; right; split; auto with arith.
-inversion C1; auto.
-intros H'0.
-case E1.
-inversion H'0; auto.
-intros H; elim H; intros H0 H1; clear H; auto with arith.
-intros H; elim H; intros H0 H1; clear H; auto with arith.
-intros H'0; case H'0; intros C0; case C0; intros C1 C2.
-apply even_S.
-apply E2; left; split; auto with arith.
-inversion C1; auto.
-apply even_S.
-apply E2; right; split; auto with arith.
-inversion C1; auto.
+ intros n; elim n; simpl in |- *; auto with arith.
+ intros m; split; auto.
+ split.
+ intros H; right; split; auto with arith.
+ intros H'; case H'; auto with arith.
+ intros H'0; elim H'0; intros H'1 H'2; inversion H'1.
+ intros H; elim H; auto.
+ split; auto with arith.
+ intros H'; elim H'; auto with arith.
+ intros H; elim H; auto.
+ intros H'0; elim H'0; intros H'1 H'2; inversion H'1.
+ intros n0 H' m; elim (H' m); intros H'1 H'2; elim H'1; intros E1 E2; elim H'2;
+ intros E3 E4; clear H'1 H'2.
+ split; split.
+ intros H'0; case E3.
+ inversion H'0; auto.
+ intros H; elim H; intros H0 H1; clear H; auto with arith.
+ intros H; elim H; intros H0 H1; clear H; auto with arith.
+ intros H'0; case H'0; intros C0; case C0; intros C1 C2.
+ apply odd_S.
+ apply E4; left; split; auto with arith.
+ inversion C1; auto.
+ apply odd_S.
+ apply E4; right; split; auto with arith.
+ inversion C1; auto.
+ intros H'0.
+ case E1.
+ inversion H'0; auto.
+ intros H; elim H; intros H0 H1; clear H; auto with arith.
+ intros H; elim H; intros H0 H1; clear H; auto with arith.
+ intros H'0; case H'0; intros C0; case C0; intros C1 C2.
+ apply even_S.
+ apply E2; left; split; auto with arith.
+ inversion C1; auto.
+ apply even_S.
+ apply E2; right; split; auto with arith.
+ inversion C1; auto.
Qed.
Lemma even_even_plus : forall n m, even n -> even m -> even (n + m).
Proof.
-intros n m; case (even_plus_aux n m).
-intros H H0; case H0; auto.
+ intros n m; case (even_plus_aux n m).
+ intros H H0; case H0; auto.
Qed.
Lemma odd_even_plus : forall n m, odd n -> odd m -> even (n + m).
Proof.
-intros n m; case (even_plus_aux n m).
-intros H H0; case H0; auto.
+ intros n m; case (even_plus_aux n m).
+ intros H H0; case H0; auto.
Qed.
-
+
Lemma even_plus_even_inv_r : forall n m, even (n + m) -> even n -> even m.
Proof.
-intros n m H; case (even_plus_aux n m).
-intros H' H'0; elim H'0.
-intros H'1; case H'1; auto.
-intros H0; elim H0; auto.
-intros H0 H1 H2; case (not_even_and_odd n); auto.
-case H0; auto.
+ intros n m H; case (even_plus_aux n m).
+ intros H' H'0; elim H'0.
+ intros H'1; case H'1; auto.
+ intros H0; elim H0; auto.
+ intros H0 H1 H2; case (not_even_and_odd n); auto.
+ case H0; auto.
Qed.
Lemma even_plus_even_inv_l : forall n m, even (n + m) -> even m -> even n.
Proof.
-intros n m H; case (even_plus_aux n m).
-intros H' H'0; elim H'0.
-intros H'1; case H'1; auto.
-intros H0; elim H0; auto.
-intros H0 H1 H2; case (not_even_and_odd m); auto.
-case H0; auto.
+ intros n m H; case (even_plus_aux n m).
+ intros H' H'0; elim H'0.
+ intros H'1; case H'1; auto.
+ intros H0; elim H0; auto.
+ intros H0 H1 H2; case (not_even_and_odd m); auto.
+ case H0; auto.
Qed.
-
+
Lemma even_plus_odd_inv_r : forall n m, even (n + m) -> odd n -> odd m.
Proof.
-intros n m H; case (even_plus_aux n m).
-intros H' H'0; elim H'0.
-intros H'1; case H'1; auto.
-intros H0 H1 H2; case (not_even_and_odd n); auto.
-case H0; auto.
-intros H0; case H0; auto.
+ intros n m H; case (even_plus_aux n m).
+ intros H' H'0; elim H'0.
+ intros H'1; case H'1; auto.
+ intros H0 H1 H2; case (not_even_and_odd n); auto.
+ case H0; auto.
+ intros H0; case H0; auto.
Qed.
-
+
Lemma even_plus_odd_inv_l : forall n m, even (n + m) -> odd m -> odd n.
Proof.
-intros n m H; case (even_plus_aux n m).
-intros H' H'0; elim H'0.
-intros H'1; case H'1; auto.
-intros H0 H1 H2; case (not_even_and_odd m); auto.
-case H0; auto.
-intros H0; case H0; auto.
+ intros n m H; case (even_plus_aux n m).
+ intros H' H'0; elim H'0.
+ intros H'1; case H'1; auto.
+ intros H0 H1 H2; case (not_even_and_odd m); auto.
+ case H0; auto.
+ intros H0; case H0; auto.
Qed.
Hint Resolve even_even_plus odd_even_plus: arith.
-
+
Lemma odd_plus_l : forall n m, odd n -> even m -> odd (n + m).
Proof.
-intros n m; case (even_plus_aux n m).
-intros H; case H; auto.
+ intros n m; case (even_plus_aux n m).
+ intros H; case H; auto.
Qed.
Lemma odd_plus_r : forall n m, even n -> odd m -> odd (n + m).
Proof.
-intros n m; case (even_plus_aux n m).
-intros H; case H; auto.
+ intros n m; case (even_plus_aux n m).
+ intros H; case H; auto.
Qed.
Lemma odd_plus_even_inv_l : forall n m, odd (n + m) -> odd m -> even n.
Proof.
-intros n m H; case (even_plus_aux n m).
-intros H' H'0; elim H'.
-intros H'1; case H'1; auto.
-intros H0 H1 H2; case (not_even_and_odd m); auto.
-case H0; auto.
-intros H0; case H0; auto.
+ intros n m H; case (even_plus_aux n m).
+ intros H' H'0; elim H'.
+ intros H'1; case H'1; auto.
+ intros H0 H1 H2; case (not_even_and_odd m); auto.
+ case H0; auto.
+ intros H0; case H0; auto.
Qed.
Lemma odd_plus_even_inv_r : forall n m, odd (n + m) -> odd n -> even m.
Proof.
-intros n m H; case (even_plus_aux n m).
-intros H' H'0; elim H'.
-intros H'1; case H'1; auto.
-intros H0; case H0; auto.
-intros H0 H1 H2; case (not_even_and_odd n); auto.
-case H0; auto.
+ intros n m H; case (even_plus_aux n m).
+ intros H' H'0; elim H'.
+ intros H'1; case H'1; auto.
+ intros H0; case H0; auto.
+ intros H0 H1 H2; case (not_even_and_odd n); auto.
+ case H0; auto.
Qed.
Lemma odd_plus_odd_inv_l : forall n m, odd (n + m) -> even m -> odd n.
Proof.
-intros n m H; case (even_plus_aux n m).
-intros H' H'0; elim H'.
-intros H'1; case H'1; auto.
-intros H0; case H0; auto.
-intros H0 H1 H2; case (not_even_and_odd m); auto.
-case H0; auto.
+ intros n m H; case (even_plus_aux n m).
+ intros H' H'0; elim H'.
+ intros H'1; case H'1; auto.
+ intros H0; case H0; auto.
+ intros H0 H1 H2; case (not_even_and_odd m); auto.
+ case H0; auto.
Qed.
-
+
Lemma odd_plus_odd_inv_r : forall n m, odd (n + m) -> even n -> odd m.
Proof.
-intros n m H; case (even_plus_aux n m).
-intros H' H'0; elim H'.
-intros H'1; case H'1; auto.
-intros H0 H1 H2; case (not_even_and_odd n); auto.
-case H0; auto.
-intros H0; case H0; auto.
+ intros n m H; case (even_plus_aux n m).
+ intros H' H'0; elim H'.
+ intros H'1; case H'1; auto.
+ intros H0 H1 H2; case (not_even_and_odd n); auto.
+ case H0; auto.
+ intros H0; case H0; auto.
Qed.
Hint Resolve odd_plus_l odd_plus_r: arith.
-
+
+
+(** * Facts about [even] and [odd] wrt. [mult] *)
+
Lemma even_mult_aux :
- forall n m,
- (odd (n * m) <-> odd n /\ odd m) /\ (even (n * m) <-> even n \/ even m).
+ forall n m,
+ (odd (n * m) <-> odd n /\ odd m) /\ (even (n * m) <-> even n \/ even m).
Proof.
-intros n; elim n; simpl in |- *; auto with arith.
-intros m; split; split; auto with arith.
-intros H'; inversion H'.
-intros H'; elim H'; auto.
-intros n0 H' m; split; split; auto with arith.
-intros H'0.
-elim (even_plus_aux m (n0 * m)); intros H'3 H'4; case H'3; intros H'1 H'2;
- case H'1; auto.
-intros H'5; elim H'5; intros H'6 H'7; auto with arith.
-split; auto with arith.
-case (H' m).
-intros H'8 H'9; case H'9.
-intros H'10; case H'10; auto with arith.
-intros H'11 H'12; case (not_even_and_odd m); auto with arith.
-intros H'5; elim H'5; intros H'6 H'7; case (not_even_and_odd (n0 * m)); auto.
-case (H' m).
-intros H'8 H'9; case H'9; auto.
-intros H'0; elim H'0; intros H'1 H'2; clear H'0.
-elim (even_plus_aux m (n0 * m)); auto.
-intros H'0 H'3.
-elim H'0.
-intros H'4 H'5; apply H'5; auto.
-left; split; auto with arith.
-case (H' m).
-intros H'6 H'7; elim H'7.
-intros H'8 H'9; apply H'9.
-left.
-inversion H'1; auto.
-intros H'0.
-elim (even_plus_aux m (n0 * m)); intros H'3 H'4; case H'4.
-intros H'1 H'2.
-elim H'1; auto.
-intros H; case H; auto.
-intros H'5; elim H'5; intros H'6 H'7; auto with arith.
-left.
-case (H' m).
-intros H'8; elim H'8.
-intros H'9; elim H'9; auto with arith.
-intros H'0; elim H'0; intros H'1.
-case (even_or_odd m); intros H'2.
-apply even_even_plus; auto.
-case (H' m).
-intros H H0; case H0; auto.
-apply odd_even_plus; auto.
-inversion H'1; case (H' m); auto.
-intros H1; case H1; auto.
-apply even_even_plus; auto.
-case (H' m).
-intros H H0; case H0; auto.
+ intros n; elim n; simpl in |- *; auto with arith.
+ intros m; split; split; auto with arith.
+ intros H'; inversion H'.
+ intros H'; elim H'; auto.
+ intros n0 H' m; split; split; auto with arith.
+ intros H'0.
+ elim (even_plus_aux m (n0 * m)); intros H'3 H'4; case H'3; intros H'1 H'2;
+ case H'1; auto.
+ intros H'5; elim H'5; intros H'6 H'7; auto with arith.
+ split; auto with arith.
+ case (H' m).
+ intros H'8 H'9; case H'9.
+ intros H'10; case H'10; auto with arith.
+ intros H'11 H'12; case (not_even_and_odd m); auto with arith.
+ intros H'5; elim H'5; intros H'6 H'7; case (not_even_and_odd (n0 * m)); auto.
+ case (H' m).
+ intros H'8 H'9; case H'9; auto.
+ intros H'0; elim H'0; intros H'1 H'2; clear H'0.
+ elim (even_plus_aux m (n0 * m)); auto.
+ intros H'0 H'3.
+ elim H'0.
+ intros H'4 H'5; apply H'5; auto.
+ left; split; auto with arith.
+ case (H' m).
+ intros H'6 H'7; elim H'7.
+ intros H'8 H'9; apply H'9.
+ left.
+ inversion H'1; auto.
+ intros H'0.
+ elim (even_plus_aux m (n0 * m)); intros H'3 H'4; case H'4.
+ intros H'1 H'2.
+ elim H'1; auto.
+ intros H; case H; auto.
+ intros H'5; elim H'5; intros H'6 H'7; auto with arith.
+ left.
+ case (H' m).
+ intros H'8; elim H'8.
+ intros H'9; elim H'9; auto with arith.
+ intros H'0; elim H'0; intros H'1.
+ case (even_or_odd m); intros H'2.
+ apply even_even_plus; auto.
+ case (H' m).
+ intros H H0; case H0; auto.
+ apply odd_even_plus; auto.
+ inversion H'1; case (H' m); auto.
+ intros H1; case H1; auto.
+ apply even_even_plus; auto.
+ case (H' m).
+ intros H H0; case H0; auto.
Qed.
-
+
Lemma even_mult_l : forall n m, even n -> even (n * m).
Proof.
-intros n m; case (even_mult_aux n m); auto.
-intros H H0; case H0; auto.
+ intros n m; case (even_mult_aux n m); auto.
+ intros H H0; case H0; auto.
Qed.
Lemma even_mult_r : forall n m, even m -> even (n * m).
Proof.
-intros n m; case (even_mult_aux n m); auto.
-intros H H0; case H0; auto.
+ intros n m; case (even_mult_aux n m); auto.
+ intros H H0; case H0; auto.
Qed.
Hint Resolve even_mult_l even_mult_r: arith.
-
+
Lemma even_mult_inv_r : forall n m, even (n * m) -> odd n -> even m.
Proof.
-intros n m H' H'0.
-case (even_mult_aux n m).
-intros H'1 H'2; elim H'2.
-intros H'3; elim H'3; auto.
-intros H; case (not_even_and_odd n); auto.
+ intros n m H' H'0.
+ case (even_mult_aux n m).
+ intros H'1 H'2; elim H'2.
+ intros H'3; elim H'3; auto.
+ intros H; case (not_even_and_odd n); auto.
Qed.
Lemma even_mult_inv_l : forall n m, even (n * m) -> odd m -> even n.
Proof.
-intros n m H' H'0.
-case (even_mult_aux n m).
-intros H'1 H'2; elim H'2.
-intros H'3; elim H'3; auto.
-intros H; case (not_even_and_odd m); auto.
+ intros n m H' H'0.
+ case (even_mult_aux n m).
+ intros H'1 H'2; elim H'2.
+ intros H'3; elim H'3; auto.
+ intros H; case (not_even_and_odd m); auto.
Qed.
Lemma odd_mult : forall n m, odd n -> odd m -> odd (n * m).
Proof.
-intros n m; case (even_mult_aux n m); intros H; case H; auto.
+ intros n m; case (even_mult_aux n m); intros H; case H; auto.
Qed.
Hint Resolve even_mult_l even_mult_r odd_mult: arith.
Lemma odd_mult_inv_l : forall n m, odd (n * m) -> odd n.
Proof.
-intros n m H'.
-case (even_mult_aux n m).
-intros H'1 H'2; elim H'1.
-intros H'3; elim H'3; auto.
+ intros n m H'.
+ case (even_mult_aux n m).
+ intros H'1 H'2; elim H'1.
+ intros H'3; elim H'3; auto.
Qed.
-
+
Lemma odd_mult_inv_r : forall n m, odd (n * m) -> odd m.
Proof.
-intros n m H'.
-case (even_mult_aux n m).
-intros H'1 H'2; elim H'1.
-intros H'3; elim H'3; auto.
+ intros n m H'.
+ case (even_mult_aux n m).
+ intros H'1 H'2; elim H'1.
+ intros H'3; elim H'3; auto.
Qed.