aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremakarov2007-11-14 19:47:46 +0000
committeremakarov2007-11-14 19:47:46 +0000
commit87bfa992d0373cd1bfeb046f5a3fc38775837e83 (patch)
tree5a222411c15652daf51a6405e2334a44a9c95bea
parentd04ad26f4bb424581db2bbadef715fef491243b3 (diff)
Update on Numbers; renamed ZOrder.v to ZLt to remove clash with ZArith/Zorder on MacOS.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@10323 85f007b7-540e-0410-9357-904b9bb8a0f7
-rw-r--r--Makefile.common2
-rw-r--r--theories/Numbers/Integer/Abstract/ZAxioms.v4
-rw-r--r--theories/Numbers/Integer/Abstract/ZBase.v11
-rw-r--r--theories/Numbers/Integer/Abstract/ZLt.v (renamed from theories/Numbers/Integer/Abstract/ZOrder.v)98
-rw-r--r--theories/Numbers/Integer/Abstract/ZPlus.v170
-rw-r--r--theories/Numbers/Integer/Abstract/ZPlusOrder.v61
-rw-r--r--theories/Numbers/Integer/Abstract/ZTimes.v71
-rw-r--r--theories/Numbers/Integer/Abstract/ZTimesOrder.v76
-rw-r--r--theories/Numbers/Integer/Binary/ZBinary.v29
-rw-r--r--theories/Numbers/Integer/NatPairs/ZNatPairs.v19
-rw-r--r--theories/Numbers/Integer/TreeMod/ZTreeMod.v12
-rw-r--r--theories/Numbers/NatInt/NZAxioms.v8
-rw-r--r--theories/Numbers/NatInt/NZOrder.v200
-rw-r--r--theories/Numbers/NatInt/NZTimes.v18
-rw-r--r--theories/Numbers/NatInt/NZTimesOrder.v67
-rw-r--r--theories/Numbers/Natural/Abstract/NAxioms.v3
-rw-r--r--theories/Numbers/Natural/Abstract/NBase.v18
-rw-r--r--theories/Numbers/Natural/Abstract/NMinus.v10
-rw-r--r--theories/Numbers/Natural/Abstract/NOrder.v183
-rw-r--r--theories/Numbers/Natural/Abstract/NPlus.v12
-rw-r--r--theories/Numbers/Natural/Abstract/NTimes.v38
-rw-r--r--theories/Numbers/Natural/Abstract/NTimesOrder.v164
-rw-r--r--theories/Numbers/Natural/Binary/NBinDefs.v11
-rw-r--r--theories/Numbers/Natural/Peano/NPeano.v12
24 files changed, 758 insertions, 539 deletions
diff --git a/Makefile.common b/Makefile.common
index a28b456b98..032a6d5d0b 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -685,7 +685,7 @@ INTEGERABSTRACTVO:=\
$(INTABSTRACTDIR)/ZBase.vo\
$(INTABSTRACTDIR)/ZPlus.vo\
$(INTABSTRACTDIR)/ZTimes.vo\
- $(INTABSTRACTDIR)/ZOrder.vo\
+ $(INTABSTRACTDIR)/ZLt.vo\
$(INTABSTRACTDIR)/ZPlusOrder.vo\
$(INTABSTRACTDIR)/ZTimesOrder.vo
diff --git a/theories/Numbers/Integer/Abstract/ZAxioms.v b/theories/Numbers/Integer/Abstract/ZAxioms.v
index e81cffe4f3..fdc7bab4cb 100644
--- a/theories/Numbers/Integer/Abstract/ZAxioms.v
+++ b/theories/Numbers/Integer/Abstract/ZAxioms.v
@@ -45,9 +45,13 @@ Notation "x >= y" := (NZle y x) (only parsing) : IntScope.
Parameter Zopp : Z -> Z.
+(*Notation "- 1" := (Zopp 1) : IntScope.
+Check (-1).*)
+
Add Morphism Zopp with signature Zeq ==> Zeq as Zopp_wd.
Notation "- x" := (Zopp x) (at level 35, right associativity) : IntScope.
+Notation "- 1" := (Zopp (NZsucc NZ0)) : IntScope.
Open Local Scope IntScope.
diff --git a/theories/Numbers/Integer/Abstract/ZBase.v b/theories/Numbers/Integer/Abstract/ZBase.v
index ace49428d2..db5bc99f92 100644
--- a/theories/Numbers/Integer/Abstract/ZBase.v
+++ b/theories/Numbers/Integer/Abstract/ZBase.v
@@ -10,10 +10,15 @@
(*i i*)
+Require Export Decidable.
Require Export ZAxioms.
Require Import NZTimesOrder.
-Module ZBasePropFunct (Export ZAxiomsMod : ZAxiomsSig).
+Module ZBasePropFunct (Import ZAxiomsMod : ZAxiomsSig).
+
+(* Note: writing "Export" instead of "Import" on the previous line leads to
+some warnings about hiding repeated declarations and results in the loss of
+notations in Zplus and later *)
Open Local Scope IntScope.
@@ -43,8 +48,8 @@ Proof NZsucc_inj_wd_neg.
(* Decidability and stability of equality was proved only in NZOrder, but
since it does not mention order, we'll put it here *)
-Theorem Zeq_em : forall n m : Z, n == m \/ n ~= m.
-Proof NZeq_em.
+Theorem Zeq_dec : forall n m : Z, decidable (n == m).
+Proof NZeq_dec.
Theorem Zeq_dne : forall n m : Z, ~ ~ n == m <-> n == m.
Proof NZeq_dne.
diff --git a/theories/Numbers/Integer/Abstract/ZOrder.v b/theories/Numbers/Integer/Abstract/ZLt.v
index 9b452039cb..a81b3a4196 100644
--- a/theories/Numbers/Integer/Abstract/ZOrder.v
+++ b/theories/Numbers/Integer/Abstract/ZLt.v
@@ -34,14 +34,14 @@ Theorem Zmax_wd :
forall n1 n2 : Z, n1 == n2 -> forall m1 m2 : Z, m1 == m2 -> Zmax n1 m1 == Zmax n2 m2.
Proof NZmax_wd.
-Theorem Zle_lt_or_eq : forall n m : Z, n <= m <-> n < m \/ n == m.
-Proof NZle_lt_or_eq.
+Theorem Zlt_eq_cases : forall n m : Z, n <= m <-> n < m \/ n == m.
+Proof NZlt_eq_cases.
Theorem Zlt_irrefl : forall n : Z, ~ n < n.
Proof NZlt_irrefl.
-Theorem Zlt_succ_le : forall n m : Z, n < S m <-> n <= m.
-Proof NZlt_succ_le.
+Theorem Zlt_succ_r : forall n m : Z, n < S m <-> n <= m.
+Proof NZlt_succ_r.
Theorem Zmin_l : forall n m : Z, n <= m -> Zmin n m == n.
Proof NZmin_l.
@@ -63,44 +63,44 @@ Proof NZlt_le_incl.
Theorem Zlt_neq : forall n m : Z, n < m -> n ~= m.
Proof NZlt_neq.
-Theorem Zlt_le_neq : forall n m : Z, n < m <-> n <= m /\ n ~= m.
-Proof NZlt_le_neq.
+Theorem Zle_neq : forall n m : Z, n < m <-> n <= m /\ n ~= m.
+Proof NZle_neq.
Theorem Zle_refl : forall n : Z, n <= n.
Proof NZle_refl.
-Theorem Zlt_succ_r : forall n : Z, n < S n.
-Proof NZlt_succ_r.
+Theorem Zlt_succ_diag_r : forall n : Z, n < S n.
+Proof NZlt_succ_diag_r.
-Theorem Zle_succ_r : forall n : Z, n <= S n.
-Proof NZle_succ_r.
+Theorem Zle_succ_diag_r : forall n : Z, n <= S n.
+Proof NZle_succ_diag_r.
-Theorem Zlt_lt_succ : forall n m : Z, n < m -> n < S m.
-Proof NZlt_lt_succ.
+Theorem Zlt_lt_succ_r : forall n m : Z, n < m -> n < S m.
+Proof NZlt_lt_succ_r.
-Theorem Zle_le_succ : forall n m : Z, n <= m -> n <= S m.
-Proof NZle_le_succ.
+Theorem Zle_le_succ_r : forall n m : Z, n <= m -> n <= S m.
+Proof NZle_le_succ_r.
-Theorem Zle_succ_le_or_eq_succ : forall n m : Z, n <= S m <-> n <= m \/ n == S m.
-Proof NZle_succ_le_or_eq_succ.
+Theorem Zle_succ_r : forall n m : Z, n <= S m <-> n <= m \/ n == S m.
+Proof NZle_succ_r.
-Theorem Zneq_succ_l : forall n : Z, S n ~= n.
-Proof NZneq_succ_l.
+Theorem Zneq_succ_diag_l : forall n : Z, S n ~= n.
+Proof NZneq_succ_diag_l.
-Theorem Znlt_succ_l : forall n : Z, ~ S n < n.
-Proof NZnlt_succ_l.
+Theorem Zneq_succ_diag_r : forall n : Z, n ~= S n.
+Proof NZneq_succ_diag_r.
-Theorem Znle_succ_l : forall n : Z, ~ S n <= n.
-Proof NZnle_succ_l.
+Theorem Znlt_succ_diag_l : forall n : Z, ~ S n < n.
+Proof NZnlt_succ_diag_l.
-Theorem Zlt_le_succ : forall n m : Z, n < m <-> S n <= m.
-Proof NZlt_le_succ.
+Theorem Znle_succ_diag_l : forall n : Z, ~ S n <= n.
+Proof NZnle_succ_diag_l.
-Theorem Zlt_succ_lt : forall n m : Z, S n < m -> n < m.
-Proof NZlt_succ_lt.
+Theorem Zle_succ_l : forall n m : Z, S n <= m <-> n < m.
+Proof NZle_succ_l.
-Theorem Zle_succ_le : forall n m : Z, S n <= m -> n <= m.
-Proof NZle_succ_le.
+Theorem Zlt_succ_l : forall n m : Z, S n < m -> n < m.
+Proof NZlt_succ_l.
Theorem Zsucc_lt_mono : forall n m : Z, n < m <-> S n < S m.
Proof NZsucc_lt_mono.
@@ -111,6 +111,8 @@ Proof NZsucc_le_mono.
Theorem Zlt_asymm : forall n m, n < m -> ~ m < n.
Proof NZlt_asymm.
+Notation Zlt_ngt := Zlt_asymm (only parsing).
+
Theorem Zlt_trans : forall n m p : Z, n < m -> m < p -> n < p.
Proof NZlt_trans.
@@ -126,11 +128,16 @@ Proof NZlt_le_trans.
Theorem Zle_antisymm : forall n m : Z, n <= m -> m <= n -> n == m.
Proof NZle_antisymm.
+Theorem Zlt_1_l : forall n m : Z, 0 < n -> n < m -> 1 < m.
+Proof NZlt_1_l.
+
(** Trichotomy, decidability, and double negation elimination *)
Theorem Zlt_trichotomy : forall n m : Z, n < m \/ n == m \/ m < n.
Proof NZlt_trichotomy.
+Notation Zlt_eq_gt_cases := Zlt_trichotomy (only parsing).
+
Theorem Zlt_gt_cases : forall n m : Z, n ~= m <-> n < m \/ n > m.
Proof NZlt_gt_cases.
@@ -149,8 +156,8 @@ Proof NZle_ngt.
Theorem Znlt_ge : forall n m : Z, ~ n < m <-> n >= m.
Proof NZnlt_ge.
-Theorem Zlt_em : forall n m : Z, n < m \/ ~ n < m.
-Proof NZlt_em.
+Theorem Zlt_dec : forall n m : Z, decidable (n < m).
+Proof NZlt_dec.
Theorem Zlt_dne : forall n m, ~ ~ n < m <-> n < m.
Proof NZlt_dne.
@@ -161,14 +168,14 @@ Proof NZnle_gt.
Theorem Zlt_nge : forall n m : Z, n < m <-> ~ n >= m.
Proof NZlt_nge.
-Theorem Zle_em : forall n m : Z, n <= m \/ ~ n <= m.
-Proof NZle_em.
+Theorem Zle_dec : forall n m : Z, decidable (n <= m).
+Proof NZle_dec.
Theorem Zle_dne : forall n m : Z, ~ ~ n <= m <-> n <= m.
Proof NZle_dne.
-Theorem Zlt_nlt_succ : forall n m : Z, n < m <-> ~ m < S n.
-Proof NZlt_nlt_succ.
+Theorem Znlt_succ_r : forall n m : Z, ~ m < S n <-> n < m.
+Proof NZnlt_succ_r.
Theorem Zlt_exists_pred :
forall z n : Z, z < n -> exists k : Z, n == S k /\ z <= k.
@@ -307,17 +314,17 @@ Proof NZgt_wf.
Theorem Zlt_pred_l : forall n : Z, P n < n.
Proof.
-intro n; pattern n at 2; qsetoid_rewrite <- (Zsucc_pred n); apply Zlt_succ_r.
+intro n; pattern n at 2; qsetoid_rewrite <- (Zsucc_pred n); apply Zlt_succ_diag_r.
Qed.
Theorem Zle_pred_l : forall n : Z, P n <= n.
Proof.
-intro; le_less; apply Zlt_pred_l.
+intro; apply Zlt_le_incl; apply Zlt_pred_l.
Qed.
Theorem Zlt_le_pred : forall n m : Z, n < m <-> n <= P m.
Proof.
-intros n m; rewrite <- (Zsucc_pred m); rewrite Zpred_succ. apply Zlt_succ_le.
+intros n m; rewrite <- (Zsucc_pred m); rewrite Zpred_succ. apply Zlt_succ_r.
Qed.
Theorem Znle_pred_r : forall n : Z, ~ n <= P n.
@@ -328,17 +335,17 @@ Qed.
Theorem Zlt_pred_le : forall n m : Z, P n < m <-> n <= m.
Proof.
intros n m; pattern n at 2; qsetoid_rewrite <- (Zsucc_pred n).
-apply Zlt_le_succ.
+symmetry; apply Zle_succ_l.
Qed.
Theorem Zlt_lt_pred : forall n m : Z, n < m -> P n < m.
Proof.
-intros; apply <- Zlt_pred_le; le_less.
+intros; apply <- Zlt_pred_le; now apply Zlt_le_incl.
Qed.
Theorem Zle_le_pred : forall n m : Z, n <= m -> P n <= m.
Proof.
-intros; le_less; now apply <- Zlt_pred_le.
+intros; apply Zlt_le_incl; now apply <- Zlt_pred_le.
Qed.
Theorem Zlt_pred_lt : forall n m : Z, n < P m -> n < m.
@@ -348,7 +355,7 @@ Qed.
Theorem Zle_pred_lt : forall n m : Z, n <= P m -> n <= m.
Proof.
-intros; le_less; now apply <- Zlt_le_pred.
+intros; apply Zlt_le_incl; now apply <- Zlt_le_pred.
Qed.
Theorem Zpred_lt_mono : forall n m : Z, n < m <-> P n < P m.
@@ -373,7 +380,7 @@ Qed.
Theorem Zlt_pred_lt_succ : forall n m : Z, P n < m <-> n < S m.
Proof.
-intros; rewrite Zlt_pred_le; symmetry; apply Zlt_succ_le.
+intros; rewrite Zlt_pred_le; symmetry; apply Zlt_succ_r.
Qed.
Theorem Zle_pred_lt_succ : forall n m : Z, P n <= m <-> n <= S m.
@@ -386,5 +393,12 @@ Proof.
intro; apply Zlt_neq; apply Zlt_pred_l.
Qed.
+Theorem Zlt_n1_r : forall n m : Z, n < m -> m < 0 -> n < -1.
+Proof.
+intros n m H1 H2. apply -> Zlt_le_pred in H2.
+setoid_replace (P 0) with (-1) in H2. now apply NZlt_le_trans with m.
+apply <- Zeq_opp_r. now rewrite Zopp_pred, Zopp_0.
+Qed.
+
End ZOrderPropFunct.
diff --git a/theories/Numbers/Integer/Abstract/ZPlus.v b/theories/Numbers/Integer/Abstract/ZPlus.v
index 16fe114313..b0cebd482d 100644
--- a/theories/Numbers/Integer/Abstract/ZPlus.v
+++ b/theories/Numbers/Integer/Abstract/ZPlus.v
@@ -85,7 +85,7 @@ intros n m; rewrite (Zplus_comm n (P m)), (Zplus_comm n m);
apply Zplus_pred_l.
Qed.
-Theorem Zplus_opp_minus : forall n m : Z, n + (- m) == n - m.
+Theorem Zplus_opp_r : forall n m : Z, n + (- m) == n - m.
Proof.
NZinduct m.
rewrite Zopp_0; rewrite Zminus_0_r; now rewrite Zplus_0_r.
@@ -94,12 +94,12 @@ Qed.
Theorem Zminus_0_l : forall n : Z, 0 - n == - n.
Proof.
-intro n; rewrite <- Zplus_opp_minus; now rewrite Zplus_0_l.
+intro n; rewrite <- Zplus_opp_r; now rewrite Zplus_0_l.
Qed.
Theorem Zminus_succ_l : forall n m : Z, S n - m == S (n - m).
Proof.
-intros n m; do 2 rewrite <- Zplus_opp_minus; now rewrite Zplus_succ_l.
+intros n m; do 2 rewrite <- Zplus_opp_r; now rewrite Zplus_succ_l.
Qed.
Theorem Zminus_pred_l : forall n m : Z, P n - m == P (n - m).
@@ -127,24 +127,24 @@ now rewrite Zminus_0_r.
intro n. rewrite Zminus_succ_r, Zminus_succ_l; now rewrite Zpred_succ.
Qed.
-Theorem Zplus_opp_r : forall n : Z, n + (- n) == 0.
+Theorem Zplus_opp_diag_l : forall n : Z, - n + n == 0.
Proof.
-intro n; rewrite Zplus_opp_minus; now rewrite Zminus_diag.
+intro n; now rewrite Zplus_comm, Zplus_opp_r, Zminus_diag.
Qed.
-Theorem Zplus_opp_l : forall n : Z, - n + n == 0.
+Theorem Zplus_opp_diag_r : forall n : Z, n + (- n) == 0.
Proof.
-intro n; rewrite Zplus_comm; apply Zplus_opp_r.
+intro n; rewrite Zplus_comm; apply Zplus_opp_diag_l.
Qed.
-Theorem Zminus_swap : forall n m : Z, - m + n == n - m.
+Theorem Zplus_opp_l : forall n m : Z, - m + n == n - m.
Proof.
-intros n m; rewrite <- Zplus_opp_minus; now rewrite Zplus_comm.
+intros n m; rewrite <- Zplus_opp_r; now rewrite Zplus_comm.
Qed.
Theorem Zplus_minus_assoc : forall n m p : Z, n + (m - p) == (n + m) - p.
Proof.
-intros n m p; do 2 rewrite <- Zplus_opp_minus; now rewrite Zplus_assoc.
+intros n m p; do 2 rewrite <- Zplus_opp_r; now rewrite Zplus_assoc.
Qed.
Theorem Zopp_involutive : forall n : Z, - (- n) == n.
@@ -164,7 +164,7 @@ Qed.
Theorem Zopp_minus_distr : forall n m : Z, - (n - m) == - n + m.
Proof.
-intros n m; rewrite <- Zplus_opp_minus, Zopp_plus_distr.
+intros n m; rewrite <- Zplus_opp_r, Zopp_plus_distr.
now rewrite Zopp_involutive.
Qed.
@@ -178,57 +178,163 @@ Proof.
intros n m; split; [apply Zopp_inj | apply Zopp_wd].
Qed.
+Theorem Zeq_opp_l : forall n m : Z, - n == m <-> n == - m.
+Proof.
+intros n m. now rewrite <- (Zopp_inj_wd (- n) m), Zopp_involutive.
+Qed.
+
+Theorem Zeq_opp_r : forall n m : Z, n == - m <-> - n == m.
+Proof.
+symmetry; apply Zeq_opp_l.
+Qed.
+
Theorem Zminus_plus_distr : forall n m p : Z, n - (m + p) == (n - m) - p.
Proof.
-intros n m p; rewrite <- Zplus_opp_minus, Zopp_plus_distr, Zplus_assoc.
-now do 2 rewrite Zplus_opp_minus.
+intros n m p; rewrite <- Zplus_opp_r, Zopp_plus_distr, Zplus_assoc.
+now do 2 rewrite Zplus_opp_r.
Qed.
Theorem Zminus_minus_distr : forall n m p : Z, n - (m - p) == (n - m) + p.
Proof.
-intros n m p; rewrite <- Zplus_opp_minus, Zopp_minus_distr, Zplus_assoc.
-now rewrite Zplus_opp_minus.
+intros n m p; rewrite <- Zplus_opp_r, Zopp_minus_distr, Zplus_assoc.
+now rewrite Zplus_opp_r.
Qed.
-Theorem Zminus_opp : forall n m : Z, n - (- m) == n + m.
+Theorem Zminus_opp_r : forall n m : Z, n - (- m) == n + m.
Proof.
-intros n m; rewrite <- Zplus_opp_minus; now rewrite Zopp_involutive.
+intros n m; rewrite <- Zplus_opp_r; now rewrite Zopp_involutive.
Qed.
Theorem Zplus_minus_swap : forall n m p : Z, n + m - p == n - p + m.
Proof.
-intros n m p. rewrite <- Zplus_minus_assoc, <- (Zplus_opp_minus n p), <- Zplus_assoc.
-now rewrite Zminus_swap.
+intros n m p. rewrite <- Zplus_minus_assoc, <- (Zplus_opp_r n p), <- Zplus_assoc.
+now rewrite Zplus_opp_l.
Qed.
-Theorem Zminus_plus_diag : forall n m : Z, n - m + m == n.
+Theorem Zminus_cancel_l : forall n m p : Z, n - m == n - p <-> m == p.
Proof.
-intros; rewrite <- Zplus_minus_swap; rewrite <- Zplus_minus_assoc;
-rewrite Zminus_diag; now rewrite Zplus_0_r.
+intros n m p. rewrite <- (Zplus_cancel_l (n - m) (n - p) (- n)).
+do 2 rewrite Zplus_minus_assoc. rewrite Zplus_opp_diag_l; do 2 rewrite Zminus_0_l.
+apply Zopp_inj_wd.
Qed.
-Theorem Zplus_minus_diag : forall n m : Z, n + m - m == n.
+Theorem Zminus_cancel_r : forall n m p : Z, n - p == m - p <-> n == m.
Proof.
-intros; rewrite <- Zplus_minus_assoc; rewrite Zminus_diag; now rewrite Zplus_0_r.
+intros n m p.
+stepl (n - p + p == m - p + p) by apply Zplus_cancel_r.
+now do 2 rewrite <- Zminus_minus_distr, Zminus_diag, Zminus_0_r.
Qed.
-Theorem Zplus_minus_eq_l : forall n m p : Z, m + p == n <-> n - m == p.
+(* The next several theorems are devoted to moving terms from one side of
+an equation to the other. The name contains the operation in the original
+equation (plus or minus) and the indication whether the left or right term
+is moved. *)
+
+Theorem Zplus_move_l : forall n m p : Z, n + m == p <-> m == p - n.
Proof.
intros n m p.
-stepl (-m + (m + p) == -m + n) by apply Zplus_cancel_l.
-stepr (p == n - m) by now split.
-rewrite Zplus_assoc, Zplus_opp_l, Zplus_0_l. now rewrite Zminus_swap.
+stepl (n + m - n == p - n) by apply Zminus_cancel_r.
+now rewrite Zplus_comm, <- Zplus_minus_assoc, Zminus_diag, Zplus_0_r.
+Qed.
+
+Theorem Zplus_move_r : forall n m p : Z, n + m == p <-> n == p - m.
+Proof.
+intros n m p; rewrite Zplus_comm; now apply Zplus_move_l.
+Qed.
+
+(* The two theorems above do not allow rewriting subformulas of the form
+n - m == p to n == p + m since subtraction is in the right-hand side of
+the equation. Hence the following two theorems. *)
+
+Theorem Zminus_move_l : forall n m p : Z, n - m == p <-> - m == p - n.
+Proof.
+intros n m p; rewrite <- (Zplus_opp_r n m); apply Zplus_move_l.
Qed.
-Theorem Zplus_minus_eq_r : forall n m p : Z, m + p == n <-> n - p == m.
+Theorem Zminus_move_r : forall n m p : Z, n - m == p <-> n == p + m.
Proof.
-intros n m p; rewrite Zplus_comm; now apply Zplus_minus_eq_l.
+intros n m p; rewrite <- (Zplus_opp_r n m). now rewrite Zplus_move_r, Zminus_opp_r.
Qed.
-Theorem Zminus_eq : forall n m : Z, n - m == 0 <-> n == m.
+Theorem Zplus_move_0_l : forall n m : Z, n + m == 0 <-> m == - n.
Proof.
-intros n m. rewrite <- Zplus_minus_eq_l, Zplus_0_r; now split.
+intros n m; now rewrite Zplus_move_l, Zminus_0_l.
Qed.
+Theorem Zplus_move_0_r : forall n m : Z, n + m == 0 <-> n == - m.
+Proof.
+intros n m; now rewrite Zplus_move_r, Zminus_0_l.
+Qed.
+
+Theorem Zminus_move_0_l : forall n m : Z, n - m == 0 <-> - m == - n.
+Proof.
+intros n m. now rewrite Zminus_move_l, Zminus_0_l.
+Qed.
+
+Theorem Zminus_move_0_r : forall n m : Z, n - m == 0 <-> n == m.
+Proof.
+intros n m. now rewrite Zminus_move_r, Zplus_0_l.
+Qed.
+
+(* The following section is devoted to cancellation of like terms. The name
+includes the first operator and the position of the term being canceled. *)
+
+Theorem Zplus_simpl_l : forall n m : Z, n + m - n == m.
+Proof.
+intros; now rewrite Zplus_minus_swap, Zminus_diag, Zplus_0_l.
+Qed.
+
+Theorem Zplus_simpl_r : forall n m : Z, n + m - m == n.
+Proof.
+intros; now rewrite <- Zplus_minus_assoc, Zminus_diag, Zplus_0_r.
+Qed.
+
+Theorem Zminus_simpl_l : forall n m : Z, - n - m + n == - m.
+Proof.
+intros; now rewrite <- Zplus_minus_swap, Zplus_opp_diag_l, Zminus_0_l.
+Qed.
+
+Theorem Zminus_simpl_r : forall n m : Z, n - m + m == n.
+Proof.
+intros; now rewrite <- Zminus_minus_distr, Zminus_diag, Zminus_0_r.
+Qed.
+
+(* Now we have two sums or differences; the name includes the two operators
+and the position of the terms being canceled *)
+
+Theorem Zplus_plus_simpl_l_l : forall n m p : Z, (n + m) - (n + p) == m - p.
+Proof.
+intros n m p. now rewrite (Zplus_comm n m), <- Zplus_minus_assoc,
+Zminus_plus_distr, Zminus_diag, Zminus_0_l, Zplus_opp_r.
+Qed.
+
+Theorem Zplus_plus_simpl_l_r : forall n m p : Z, (n + m) - (p + n) == m - p.
+Proof.
+intros n m p. rewrite (Zplus_comm p n); apply Zplus_plus_simpl_l_l.
+Qed.
+
+Theorem Zplus_plus_simpl_r_l : forall n m p : Z, (n + m) - (m + p) == n - p.
+Proof.
+intros n m p. rewrite (Zplus_comm n m); apply Zplus_plus_simpl_l_l.
+Qed.
+
+Theorem Zplus_plus_simpl_r_r : forall n m p : Z, (n + m) - (p + m) == n - p.
+Proof.
+intros n m p. rewrite (Zplus_comm p m); apply Zplus_plus_simpl_r_l.
+Qed.
+
+Theorem Zminus_plus_simpl_r_l : forall n m p : Z, (n - m) + (m + p) == n + p.
+Proof.
+intros n m p. now rewrite <- Zminus_minus_distr, Zminus_plus_distr, Zminus_diag,
+Zminus_0_l, Zminus_opp_r.
+Qed.
+
+Theorem Zminus_plus_simpl_r_r : forall n m p : Z, (n - m) + (p + m) == n + p.
+Proof.
+intros n m p. rewrite (Zplus_comm p m); apply Zminus_plus_simpl_r_l.
+Qed.
+
+(* Of course, there are many other variants *)
+
End ZPlusPropFunct.
diff --git a/theories/Numbers/Integer/Abstract/ZPlusOrder.v b/theories/Numbers/Integer/Abstract/ZPlusOrder.v
index 01226b1218..ce79055a71 100644
--- a/theories/Numbers/Integer/Abstract/ZPlusOrder.v
+++ b/theories/Numbers/Integer/Abstract/ZPlusOrder.v
@@ -10,7 +10,7 @@
(*i i*)
-Require Export ZOrder.
+Require Export ZLt.
Module ZPlusOrderPropFunct (Import ZAxiomsMod : ZAxiomsSig).
Module Export ZOrderPropMod := ZOrderPropFunct ZAxiomsMod.
@@ -94,25 +94,25 @@ Proof NZplus_nonneg_cases.
Theorem Zlt_lt_minus : forall n m : Z, n < m <-> 0 < m - n.
Proof.
intros n m. stepr (0 + n < m - n + n) by symmetry; apply Zplus_lt_mono_r.
-rewrite Zplus_0_l; now rewrite Zminus_plus_diag.
+rewrite Zplus_0_l; now rewrite Zminus_simpl_r.
Qed.
Theorem Zle_le_minus : forall n m : Z, n <= m <-> 0 <= m - n.
Proof.
intros n m; stepr (0 + n <= m - n + n) by symmetry; apply Zplus_le_mono_r.
-rewrite Zplus_0_l; now rewrite Zminus_plus_diag.
+rewrite Zplus_0_l; now rewrite Zminus_simpl_r.
Qed.
Theorem Zopp_lt_mono : forall n m : Z, n < m <-> - m < - n.
Proof.
intros n m. stepr (m + - m < m + - n) by symmetry; apply Zplus_lt_mono_l.
-do 2 rewrite Zplus_opp_minus. rewrite Zminus_diag. apply Zlt_lt_minus.
+do 2 rewrite Zplus_opp_r. rewrite Zminus_diag. apply Zlt_lt_minus.
Qed.
Theorem Zopp_le_mono : forall n m : Z, n <= m <-> - m <= - n.
Proof.
intros n m. stepr (m + - m <= m + - n) by symmetry; apply Zplus_le_mono_l.
-do 2 rewrite Zplus_opp_minus. rewrite Zminus_diag. apply Zle_le_minus.
+do 2 rewrite Zplus_opp_r. rewrite Zminus_diag. apply Zle_le_minus.
Qed.
Theorem Zopp_pos_neg : forall n : Z, 0 < - n <-> n < 0.
@@ -137,13 +137,13 @@ Qed.
Theorem Zminus_lt_mono_l : forall n m p : Z, n < m <-> p - m < p - n.
Proof.
-intros n m p. do 2 rewrite <- Zplus_opp_minus. rewrite <- Zplus_lt_mono_l.
+intros n m p. do 2 rewrite <- Zplus_opp_r. rewrite <- Zplus_lt_mono_l.
apply Zopp_lt_mono.
Qed.
Theorem Zminus_lt_mono_r : forall n m p : Z, n < m <-> n - p < m - p.
Proof.
-intros n m p; do 2 rewrite <- Zplus_opp_minus; apply Zplus_lt_mono_r.
+intros n m p; do 2 rewrite <- Zplus_opp_r; apply Zplus_lt_mono_r.
Qed.
Theorem Zminus_lt_mono : forall n m p q : Z, n < m -> q < p -> n - p < m - q.
@@ -155,13 +155,13 @@ Qed.
Theorem Zminus_le_mono_l : forall n m p : Z, n <= m <-> p - m <= p - n.
Proof.
-intros n m p; do 2 rewrite <- Zplus_opp_minus; rewrite <- Zplus_le_mono_l;
+intros n m p; do 2 rewrite <- Zplus_opp_r; rewrite <- Zplus_le_mono_l;
apply Zopp_le_mono.
Qed.
Theorem Zminus_le_mono_r : forall n m p : Z, n <= m <-> n - p <= m - p.
Proof.
-intros n m p; do 2 rewrite <- Zplus_opp_minus; apply Zplus_le_mono_r.
+intros n m p; do 2 rewrite <- Zplus_opp_r; apply Zplus_le_mono_r.
Qed.
Theorem Zminus_le_mono : forall n m p q : Z, n <= m -> q <= p -> n - p <= m - q.
@@ -188,31 +188,31 @@ Qed.
Theorem Zle_lt_minus_lt : forall n m p q : Z, n <= m -> p - n < q - m -> p < q.
Proof.
intros n m p q H1 H2. apply (Zle_lt_plus_lt (- m) (- n));
-[now apply -> Zopp_le_mono | now do 2 rewrite Zplus_opp_minus].
+[now apply -> Zopp_le_mono | now do 2 rewrite Zplus_opp_r].
Qed.
Theorem Zlt_le_minus_lt : forall n m p q : Z, n < m -> p - n <= q - m -> p < q.
Proof.
intros n m p q H1 H2. apply (Zlt_le_plus_lt (- m) (- n));
-[now apply -> Zopp_lt_mono | now do 2 rewrite Zplus_opp_minus].
+[now apply -> Zopp_lt_mono | now do 2 rewrite Zplus_opp_r].
Qed.
Theorem Zle_le_minus_lt : forall n m p q : Z, n <= m -> p - n <= q - m -> p <= q.
Proof.
intros n m p q H1 H2. apply (Zle_le_plus_le (- m) (- n));
-[now apply -> Zopp_le_mono | now do 2 rewrite Zplus_opp_minus].
+[now apply -> Zopp_le_mono | now do 2 rewrite Zplus_opp_r].
Qed.
Theorem Zlt_plus_lt_minus_r : forall n m p : Z, n + p < m <-> n < m - p.
Proof.
intros n m p. stepl (n + p - p < m - p) by symmetry; apply Zminus_lt_mono_r.
-now rewrite Zplus_minus_diag.
+now rewrite Zplus_simpl_r.
Qed.
Theorem Zle_plus_le_minus_r : forall n m p : Z, n + p <= m <-> n <= m - p.
Proof.
intros n m p. stepl (n + p - p <= m - p) by symmetry; apply Zminus_le_mono_r.
-now rewrite Zplus_minus_diag.
+now rewrite Zplus_simpl_r.
Qed.
Theorem Zlt_plus_lt_minus_l : forall n m p : Z, n + p < m <-> p < m - n.
@@ -228,13 +228,13 @@ Qed.
Theorem Zlt_minus_lt_plus_r : forall n m p : Z, n - p < m <-> n < m + p.
Proof.
intros n m p. stepl (n - p + p < m + p) by symmetry; apply Zplus_lt_mono_r.
-now rewrite Zminus_plus_diag.
+now rewrite Zminus_simpl_r.
Qed.
Theorem Zle_minus_le_plus_r : forall n m p : Z, n - p <= m <-> n <= m + p.
Proof.
intros n m p. stepl (n - p + p <= m + p) by symmetry; apply Zplus_le_mono_r.
-now rewrite Zminus_plus_diag.
+now rewrite Zminus_simpl_r.
Qed.
Theorem Zlt_minus_lt_plus_l : forall n m p : Z, n - m < p <-> n < m + p.
@@ -281,32 +281,53 @@ Qed.
Theorem Zminus_neg_cases : forall n m : Z, n - m < 0 -> n < 0 \/ 0 < m.
Proof.
-intros n m H; rewrite <- Zplus_opp_minus in H.
+intros n m H; rewrite <- Zplus_opp_r in H.
setoid_replace (0 < m) with (- m < 0) using relation iff by (symmetry; apply Zopp_neg_pos).
now apply Zplus_neg_cases.
Qed.
Theorem Zminus_pos_cases : forall n m : Z, 0 < n - m -> 0 < n \/ m < 0.
Proof.
-intros n m H; rewrite <- Zplus_opp_minus in H.
+intros n m H; rewrite <- Zplus_opp_r in H.
setoid_replace (m < 0) with (0 < - m) using relation iff by (symmetry; apply Zopp_pos_neg).
now apply Zplus_pos_cases.
Qed.
Theorem Zminus_nonpos_cases : forall n m : Z, n - m <= 0 -> n <= 0 \/ 0 <= m.
Proof.
-intros n m H; rewrite <- Zplus_opp_minus in H.
+intros n m H; rewrite <- Zplus_opp_r in H.
setoid_replace (0 <= m) with (- m <= 0) using relation iff by (symmetry; apply Zopp_nonpos_nonneg).
now apply Zplus_nonpos_cases.
Qed.
Theorem Zminus_nonneg_cases : forall n m : Z, 0 <= n - m -> 0 <= n \/ m <= 0.
Proof.
-intros n m H; rewrite <- Zplus_opp_minus in H.
+intros n m H; rewrite <- Zplus_opp_r in H.
setoid_replace (m <= 0) with (0 <= - m) using relation iff by (symmetry; apply Zopp_nonneg_nonpos).
now apply Zplus_nonneg_cases.
Qed.
+Section PosNeg.
+
+Variable P : Z -> Prop.
+Hypothesis P_wd : predicate_wd Zeq P.
+
+Add Morphism P with signature Zeq ==> iff as P_morph. Proof. exact P_wd. Qed.
+
+Theorem Z0_pos_neg :
+ P 0 -> (forall n : Z, 0 < n -> P n /\ P (- n)) -> forall n : Z, P n.
+Proof.
+intros H1 H2 n. destruct (Zlt_trichotomy n 0) as [H3 | [H3 | H3]].
+apply <- Zopp_pos_neg in H3. apply H2 in H3. destruct H3 as [_ H3].
+now rewrite Zopp_involutive in H3.
+now rewrite H3.
+apply H2 in H3; now destruct H3.
+Qed.
+
+End PosNeg.
+
+Ltac Z0_pos_neg n := induction_maker n ltac:(apply Z0_pos_neg).
+
End ZPlusOrderPropFunct.
diff --git a/theories/Numbers/Integer/Abstract/ZTimes.v b/theories/Numbers/Integer/Abstract/ZTimes.v
index 14c59fcfa0..89249d1ed9 100644
--- a/theories/Numbers/Integer/Abstract/ZTimes.v
+++ b/theories/Numbers/Integer/Abstract/ZTimes.v
@@ -10,7 +10,6 @@
(*i i*)
-Require Export Ring.
Require Export ZPlus.
Module ZTimesPropFunct (Import ZAxiomsMod : ZAxiomsSig).
@@ -21,20 +20,20 @@ Theorem Ztimes_wd :
forall n1 n2 : Z, n1 == n2 -> forall m1 m2 : Z, m1 == m2 -> n1 * m1 == n2 * m2.
Proof NZtimes_wd.
-Theorem Ztimes_0_r : forall n : Z, n * 0 == 0.
-Proof NZtimes_0_r.
-
-Theorem Ztimes_succ_r : forall n m : Z, n * (S m) == n * m + n.
-Proof NZtimes_succ_r.
-
-(** Theorems that are valid for both natural numbers and integers *)
-
Theorem Ztimes_0_l : forall n : Z, 0 * n == 0.
Proof NZtimes_0_l.
Theorem Ztimes_succ_l : forall n m : Z, (S n) * m == n * m + m.
Proof NZtimes_succ_l.
+(** Theorems that are valid for both natural numbers and integers *)
+
+Theorem Ztimes_0_r : forall n : Z, n * 0 == 0.
+Proof NZtimes_0_r.
+
+Theorem Ztimes_succ_r : forall n m : Z, n * (S m) == n * m + n.
+Proof NZtimes_succ_r.
+
Theorem Ztimes_comm : forall n m : Z, n * m == m * n.
Proof NZtimes_comm.
@@ -44,6 +43,13 @@ Proof NZtimes_plus_distr_r.
Theorem Ztimes_plus_distr_l : forall n m p : Z, n * (m + p) == n * m + n * p.
Proof NZtimes_plus_distr_l.
+(* A note on naming: right (correspondingly, left) distributivity happens
+when the sum is multiplied by a number on the right (left), not when the
+sum itself is the right (left) factor in the product (see planetmath.org
+and mathworld.wolfram.com). In the old library BinInt, distributivity over
+subtraction was named correctly, but distributivity over addition was named
+incorrectly. The names in Isabelle/HOL library are also incorrect. *)
+
Theorem Ztimes_assoc : forall n m p : Z, n * (m * p) == (n * m) * p.
Proof NZtimes_assoc.
@@ -56,29 +62,11 @@ Proof NZtimes_1_r.
(* The following two theorems are true in an ordered ring,
but since they don't mention order, we'll put them here *)
-Theorem Ztimes_eq_0 : forall n m : Z, n * m == 0 -> n == 0 \/ m == 0.
-Proof NZtimes_eq_0.
+Theorem Zeq_times_0 : forall n m : Z, n * m == 0 <-> n == 0 \/ m == 0.
+Proof NZeq_times_0.
-Theorem Ztimes_neq_0 : forall n m : Z, n ~= 0 /\ m ~= 0 <-> n * m ~= 0.
-Proof NZtimes_neq_0.
-
-(** Z forms a ring *)
-
-Lemma Zring : ring_theory 0 1 NZplus NZtimes NZminus Zopp NZeq.
-Proof.
-constructor.
-exact Zplus_0_l.
-exact Zplus_comm.
-exact Zplus_assoc.
-exact Ztimes_1_l.
-exact Ztimes_comm.
-exact Ztimes_assoc.
-exact Ztimes_plus_distr_r.
-intros; now rewrite Zplus_opp_minus.
-exact Zplus_opp_r.
-Qed.
-
-Add Ring ZR : Zring.
+Theorem Zneq_times_0 : forall n m : Z, n ~= 0 /\ m ~= 0 <-> n * m ~= 0.
+Proof NZneq_times_0.
(** Theorems that are either not valid on N or have different proofs on N and Z *)
@@ -94,29 +82,32 @@ Proof.
intros n m; rewrite (Ztimes_comm (P n) m), (Ztimes_comm n m). apply Ztimes_pred_r.
Qed.
-Theorem Ztimes_opp_r : forall n m : Z, n * (- m) == - (n * m).
+Theorem Ztimes_opp_l : forall n m : Z, (- n) * m == - (n * m).
Proof.
-intros; ring.
+intros n m. apply -> Zplus_move_0_r.
+now rewrite <- Ztimes_plus_distr_r, Zplus_opp_diag_l, Ztimes_0_l.
Qed.
-Theorem Ztimes_opp_l : forall n m : Z, (- n) * m == - (n * m).
+Theorem Ztimes_opp_r : forall n m : Z, n * (- m) == - (n * m).
Proof.
-intros; ring.
+intros n m; rewrite (Ztimes_comm n (- m)), (Ztimes_comm n m); apply Ztimes_opp_l.
Qed.
Theorem Ztimes_opp_opp : forall n m : Z, (- n) * (- m) == n * m.
Proof.
-intros; ring.
+intros n m; now rewrite Ztimes_opp_l, Ztimes_opp_r, Zopp_involutive.
Qed.
-Theorem Ztimes_minus_distr_r : forall n m p : Z, n * (m - p) == n * m - n * p.
+Theorem Ztimes_minus_distr_l : forall n m p : Z, n * (m - p) == n * m - n * p.
Proof.
-intros; ring.
+intros n m p. do 2 rewrite <- Zplus_opp_r. rewrite Ztimes_plus_distr_l.
+now rewrite Ztimes_opp_r.
Qed.
-Theorem Ztimes_minus_distr_l : forall n m p : Z, (n - m) * p == n * p - m * p.
+Theorem Ztimes_minus_distr_r : forall n m p : Z, (n - m) * p == n * p - m * p.
Proof.
-intros; ring.
+intros n m p; rewrite (Ztimes_comm (n - m) p), (Ztimes_comm n p), (Ztimes_comm m p);
+now apply Ztimes_minus_distr_l.
Qed.
End ZTimesPropFunct.
diff --git a/theories/Numbers/Integer/Abstract/ZTimesOrder.v b/theories/Numbers/Integer/Abstract/ZTimesOrder.v
index 1b9e9b5192..287fdb7f19 100644
--- a/theories/Numbers/Integer/Abstract/ZTimesOrder.v
+++ b/theories/Numbers/Integer/Abstract/ZTimesOrder.v
@@ -96,11 +96,20 @@ Proof NZtimes_neg_pos.
Theorem Ztimes_nonpos_nonneg : forall n m : Z, n <= 0 -> 0 <= m -> n * m <= 0.
Proof NZtimes_nonpos_nonneg.
-Theorem Ztimes_eq_0 : forall n m : Z, n * m == 0 -> n == 0 \/ m == 0.
-Proof NZtimes_eq_0.
+Theorem Zlt_1_times_pos : forall n m : Z, 1 < n -> 0 < m -> 1 < n * m.
+Proof NZlt_1_times_pos.
-Theorem Ztimes_neq_0 : forall n m : Z, n ~= 0 /\ m ~= 0 <-> n * m ~= 0.
-Proof NZtimes_neq_0.
+Theorem Zeq_times_0 : forall n m : Z, n * m == 0 <-> n == 0 \/ m == 0.
+Proof NZeq_times_0.
+
+Theorem Zneq_times_0 : forall n m : Z, n ~= 0 /\ m ~= 0 <-> n * m ~= 0.
+Proof NZneq_times_0.
+
+Theorem Zeq_times_0_l : forall n m : Z, n * m == 0 -> m ~= 0 -> n == 0.
+Proof NZeq_times_0_l.
+
+Theorem Zeq_times_0_r : forall n m : Z, n * m == 0 -> n ~= 0 -> m == 0.
+Proof NZeq_times_0_r.
Theorem Ztimes_pos : forall n m : Z, 0 < n * m <-> (0 < n /\ 0 < m) \/ (m < 0 /\ n < 0).
Proof NZtimes_pos.
@@ -114,7 +123,64 @@ Proof NZtimes_2_mono_l.
(** Theorems that are either not valid on N or have different proofs on N and Z *)
-(* None? *)
+Theorem Zlt_1_times_neg : forall n m : Z, n < -1 -> m < 0 -> 1 < n * m.
+Proof.
+intros n m H1 H2. apply -> (NZtimes_lt_mono_neg_r m) in H1.
+apply <- Zopp_pos_neg in H2. rewrite Ztimes_opp_l, Ztimes_1_l in H1.
+now apply Zlt_1_l with (- m).
+assumption.
+Qed.
+
+Theorem Zlt_times_n1_neg : forall n m : Z, 1 < n -> m < 0 -> n * m < -1.
+Proof.
+intros n m H1 H2. apply -> (NZtimes_lt_mono_neg_r m) in H1.
+rewrite Ztimes_1_l in H1. now apply Zlt_n1_r with m.
+assumption.
+Qed.
+
+Theorem Zlt_times_n1_pos : forall n m : Z, n < -1 -> 0 < m -> n * m < -1.
+Proof.
+intros n m H1 H2. apply -> (NZtimes_lt_mono_pos_r m) in H1.
+rewrite Ztimes_opp_l, Ztimes_1_l in H1.
+apply <- Zopp_neg_pos in H2. now apply Zlt_n1_r with (- m).
+assumption.
+Qed.
+
+Theorem Zlt_1_l_times : forall n m : Z, 1 < n -> n * m < -1 \/ n * m == 0 \/ 1 < n * m.
+Proof.
+intros n m H; destruct (Zlt_trichotomy m 0) as [H1 | [H1 | H1]].
+left. now apply Zlt_times_n1_neg.
+right; left; now rewrite H1, Ztimes_0_r.
+right; right; now apply Zlt_1_times_pos.
+Qed.
+
+Theorem Zlt_n1_r_times : forall n m : Z, n < -1 -> n * m < -1 \/ n * m == 0 \/ 1 < n * m.
+Proof.
+intros n m H; destruct (Zlt_trichotomy m 0) as [H1 | [H1 | H1]].
+right; right. now apply Zlt_1_times_neg.
+right; left; now rewrite H1, Ztimes_0_r.
+left. now apply Zlt_times_n1_pos.
+Qed.
+
+Theorem Zeq_times_1 : forall n m : Z, n * m == 1 -> n == 1 \/ n == -1.
+Proof.
+assert (F : ~ 1 < -1).
+intro H.
+assert (H1 : -1 < 0). apply <- Zopp_neg_pos. apply Zlt_succ_diag_r.
+assert (H2 : 1 < 0) by now apply Zlt_trans with (-1). false_hyp H2 Znlt_succ_diag_l.
+Z0_pos_neg n.
+intros m H; rewrite Ztimes_0_l in H; false_hyp H Zneq_succ_diag_r.
+intros n H; split; apply <- Zle_succ_l in H; le_elim H.
+intros m H1; apply (Zlt_1_l_times n m) in H.
+rewrite H1 in H; destruct H as [H | [H | H]].
+false_hyp H F. false_hyp H Zneq_succ_diag_l. false_hyp H Zlt_irrefl.
+intros; now left.
+intros m H1; apply (Zlt_1_l_times n m) in H. rewrite Ztimes_opp_l in H1;
+apply -> Zeq_opp_l in H1. rewrite H1 in H; destruct H as [H | [H | H]].
+false_hyp H Zlt_irrefl. apply -> Zeq_opp_l in H. rewrite Zopp_0 in H.
+false_hyp H Zneq_succ_diag_l. false_hyp H F.
+intros; right; symmetry; now apply Zopp_wd.
+Qed.
End ZTimesOrderPropFunct.
diff --git a/theories/Numbers/Integer/Binary/ZBinary.v b/theories/Numbers/Integer/Binary/ZBinary.v
index 3c680ec918..96e01a731c 100644
--- a/theories/Numbers/Integer/Binary/ZBinary.v
+++ b/theories/Numbers/Integer/Binary/ZBinary.v
@@ -100,14 +100,14 @@ intros; rewrite <- Zsucc_succ'; rewrite <- Zpred_pred';
apply Zminus_succ_r.
Qed.
-Theorem NZtimes_0_r : forall n : Z, n * 0 = 0.
+Theorem NZtimes_0_l : forall n : Z, 0 * n = 0.
Proof.
-exact Zmult_0_r.
+reflexivity.
Qed.
-Theorem NZtimes_succ_r : forall n m : Z, n * (NZsucc m) = n * m + n.
+Theorem NZtimes_succ_l : forall n m : Z, (NZsucc n) * m = n * m + m.
Proof.
-intros; rewrite <- Zsucc_succ'; apply Zmult_succ_r.
+intros; rewrite <- Zsucc_succ'; apply Zmult_succ_l.
Qed.
End NZAxiomsMod.
@@ -137,7 +137,7 @@ Proof.
congruence.
Qed.
-Theorem NZle_lt_or_eq : forall n m : Z, n <= m <-> n < m \/ n = m.
+Theorem NZlt_eq_cases : forall n m : Z, n <= m <-> n < m \/ n = m.
Proof.
intros n m; split. apply Zle_lt_or_eq.
intro H; destruct H as [H | H]. now apply Zlt_le_weak. rewrite H; apply Zle_refl.
@@ -148,7 +148,7 @@ Proof.
exact Zlt_irrefl.
Qed.
-Theorem NZlt_succ_le : forall n m : Z, n < (NZsucc m) <-> n <= m.
+Theorem NZlt_succ_r : forall n m : Z, n < (NZsucc m) <-> n <= m.
Proof.
intros; unfold NZsucc; rewrite <- Zsucc_succ'; split;
[apply Zlt_succ_le | apply Zle_lt_succ].
@@ -215,6 +215,23 @@ End ZBinAxiomsMod.
Module Export ZBinTimesOrderPropMod := ZTimesOrderPropFunct ZBinAxiomsMod.
+(** Z forms a ring *)
+
+(*Lemma Zring : ring_theory 0 1 NZplus NZtimes NZminus Zopp NZeq.
+Proof.
+constructor.
+exact Zplus_0_l.
+exact Zplus_comm.
+exact Zplus_assoc.
+exact Ztimes_1_l.
+exact Ztimes_comm.
+exact Ztimes_assoc.
+exact Ztimes_plus_distr_r.
+intros; now rewrite Zplus_opp_minus.
+exact Zplus_opp_r.
+Qed.
+
+Add Ring ZR : Zring.*)
diff --git a/theories/Numbers/Integer/NatPairs/ZNatPairs.v b/theories/Numbers/Integer/NatPairs/ZNatPairs.v
index 8e31331b4b..fc9115e20f 100644
--- a/theories/Numbers/Integer/NatPairs/ZNatPairs.v
+++ b/theories/Numbers/Integer/NatPairs/ZNatPairs.v
@@ -12,6 +12,7 @@
Require Import NMinus. (* The most complete file for natural numbers *)
Require Export ZTimesOrder. (* The most complete file for integers *)
+Require Export Ring.
Module ZPairsAxiomsMod (Import NAxiomsMod : NAxiomsSig) <: ZAxiomsSig.
Module Import NPropMod := NMinusPropFunct NAxiomsMod. (* Get all properties of natural numbers *)
@@ -251,16 +252,16 @@ Proof.
intros n m; unfold NZminus, Zeq; simpl. symmetry; now rewrite plus_succ_r.
Qed.
-Theorem NZtimes_0_r : forall n : Z, n * 0 == 0.
+Theorem NZtimes_0_l : forall n : Z, 0 * n == 0.
Proof.
intro n; unfold NZtimes, Zeq; simpl.
-repeat rewrite times_0_r. now rewrite plus_assoc.
+repeat rewrite times_0_l. now rewrite plus_assoc.
Qed.
-Theorem NZtimes_succ_r : forall n m : Z, n * (Zsucc m) == n * m + n.
+Theorem NZtimes_succ_l : forall n m : Z, (Zsucc n) * m == n * m + m.
Proof.
intros n m; unfold NZtimes, NZsucc, Zeq; simpl.
-do 2 rewrite times_succ_r. ring.
+do 2 rewrite times_succ_l. ring.
Qed.
End NZAxiomsMod.
@@ -292,7 +293,7 @@ Qed.
Add Morphism NZle with signature Zeq ==> Zeq ==> iff as NZle_wd.
Proof.
unfold NZle, Zle, Zeq; intros n1 m1 H1 n2 m2 H2; simpl.
-do 2 rewrite le_lt_or_eq. rewrite (NZlt_wd n1 m1 H1 n2 m2 H2). fold (m1 < m2)%Int.
+do 2 rewrite lt_eq_cases. rewrite (NZlt_wd n1 m1 H1 n2 m2 H2). fold (m1 < m2)%Int.
fold (n1 == n2)%Int (m1 == m2)%Int; fold (n1 == m1)%Int in H1; fold (n2 == m2)%Int in H2.
now rewrite H1, H2.
Qed.
@@ -331,9 +332,9 @@ Qed.
Open Local Scope IntScope.
-Theorem NZle_lt_or_eq : forall n m : Z, n <= m <-> n < m \/ n == m.
+Theorem NZlt_eq_cases : forall n m : Z, n <= m <-> n < m \/ n == m.
Proof.
-intros n m; unfold Zlt, Zle, Zeq; simpl. apply le_lt_or_eq.
+intros n m; unfold Zlt, Zle, Zeq; simpl. apply lt_eq_cases.
Qed.
Theorem NZlt_irrefl : forall n : Z, ~ (n < n).
@@ -341,9 +342,9 @@ Proof.
intros n; unfold Zlt, Zeq; simpl. apply lt_irrefl.
Qed.
-Theorem NZlt_succ_le : forall n m : Z, n < (Zsucc m) <-> n <= m.
+Theorem NZlt_succ_r : forall n m : Z, n < (Zsucc m) <-> n <= m.
Proof.
-intros n m; unfold Zlt, Zle, Zeq; simpl. rewrite plus_succ_l; apply lt_succ_le.
+intros n m; unfold Zlt, Zle, Zeq; simpl. rewrite plus_succ_l; apply lt_succ_r.
Qed.
Theorem NZmin_l : forall n m : Z, n <= m -> Zmin n m == n.
diff --git a/theories/Numbers/Integer/TreeMod/ZTreeMod.v b/theories/Numbers/Integer/TreeMod/ZTreeMod.v
index 75e9c9f77e..db09c2ec7a 100644
--- a/theories/Numbers/Integer/TreeMod/ZTreeMod.v
+++ b/theories/Numbers/Integer/TreeMod/ZTreeMod.v
@@ -212,18 +212,18 @@ rewrite Zminus_mod_idemp_l.
now replace ([|n|] - ([|m|] + 1))%Z with ([|n|] - [|m|] - 1)%Z by auto with zarith.
Qed.
-Theorem NZtimes_0_r : forall n : NZ, n * 0 == 0.
+Theorem NZtimes_0_l : forall n : NZ, 0 * n == 0.
Proof.
intro n; unfold NZtimes, NZ0, NZ, NZeq. rewrite w_spec.(spec_mul).
-rewrite w_spec.(spec_0). now rewrite Zmult_0_r.
+rewrite w_spec.(spec_0). now rewrite Zmult_0_l.
Qed.
-Theorem NZtimes_succ_r : forall n m : NZ, n * (S m) == n * m + n.
+Theorem NZtimes_succ_l : forall n m : NZ, (S n) * m == n * m + m.
Proof.
intros n m; unfold NZtimes, NZsucc, NZplus, NZeq. rewrite w_spec.(spec_mul).
-rewrite w_spec.(spec_add). rewrite w_spec.(spec_mul). rewrite w_spec.(spec_succ).
-rewrite Zplus_mod_idemp_l. rewrite Zmult_mod_idemp_r.
-rewrite Zmult_plus_distr_r. now rewrite Zmult_1_r.
+rewrite w_spec.(spec_add), w_spec.(spec_mul), w_spec.(spec_succ).
+rewrite Zplus_mod_idemp_l, Zmult_mod_idemp_l.
+now rewrite Zmult_plus_distr_l, Zmult_1_l.
Qed.
End NZBigIntsAxiomsMod.
diff --git a/theories/Numbers/NatInt/NZAxioms.v b/theories/Numbers/NatInt/NZAxioms.v
index 9c9161e2b3..f218ed6a64 100644
--- a/theories/Numbers/NatInt/NZAxioms.v
+++ b/theories/Numbers/NatInt/NZAxioms.v
@@ -60,8 +60,8 @@ Axiom NZplus_succ_l : forall n m : NZ, (S n) + m == S (n + m).
Axiom NZminus_0_r : forall n : NZ, n - 0 == n.
Axiom NZminus_succ_r : forall n m : NZ, n - (S m) == P (n - m).
-Axiom NZtimes_0_r : forall n : NZ, n * 0 == 0.
-Axiom NZtimes_succ_r : forall n m : NZ, n * (S m) == n * m + n.
+Axiom NZtimes_0_l : forall n : NZ, 0 * n == 0.
+Axiom NZtimes_succ_l : forall n m : NZ, S n * m == n * m + m.
End NZAxiomsSig.
@@ -84,9 +84,9 @@ Notation "x <= y" := (NZle x y) : NatIntScope.
Notation "x > y" := (NZlt y x) (only parsing) : NatIntScope.
Notation "x >= y" := (NZle y x) (only parsing) : NatIntScope.
-Axiom NZle_lt_or_eq : forall n m : NZ, n <= m <-> n < m \/ n == m.
+Axiom NZlt_eq_cases : forall n m : NZ, n <= m <-> n < m \/ n == m.
Axiom NZlt_irrefl : forall n : NZ, ~ (n < n).
-Axiom NZlt_succ_le : forall n m : NZ, n < S m <-> n <= m.
+Axiom NZlt_succ_r : forall n m : NZ, n < S m <-> n <= m.
Axiom NZmin_l : forall n m : NZ, n <= m -> NZmin n m == n.
Axiom NZmin_r : forall n m : NZ, m <= n -> NZmin n m == m.
diff --git a/theories/Numbers/NatInt/NZOrder.v b/theories/Numbers/NatInt/NZOrder.v
index 4ded2b8928..df2f224f49 100644
--- a/theories/Numbers/NatInt/NZOrder.v
+++ b/theories/Numbers/NatInt/NZOrder.v
@@ -12,14 +12,23 @@
Require Import NZAxioms.
Require Import NZTimes.
+Require Import Decidable.
Module NZOrderPropFunct (Import NZOrdAxiomsMod : NZOrdAxiomsSig).
Module Export NZTimesPropMod := NZTimesPropFunct NZAxiomsMod.
Open Local Scope NatIntScope.
-Ltac le_less := rewrite NZle_lt_or_eq; left; try assumption.
-Ltac le_equal := rewrite NZle_lt_or_eq; right; try reflexivity; try assumption.
-Ltac le_elim H := rewrite NZle_lt_or_eq in H; destruct H as [H | H].
+Ltac le_elim H := rewrite NZlt_eq_cases in H; destruct H as [H | H].
+
+Theorem NZlt_le_incl : forall n m : NZ, n < m -> n <= m.
+Proof.
+intros; apply <- NZlt_eq_cases; now left.
+Qed.
+
+Theorem NZeq_le_incl : forall n m : NZ, n == m -> n <= m.
+Proof.
+intros; apply <- NZlt_eq_cases; now right.
+Qed.
Lemma NZlt_stepl : forall x y z : NZ, x < y -> x == z -> z < y.
Proof.
@@ -46,106 +55,101 @@ Declare Right Step NZlt_stepr.
Declare Left Step NZle_stepl.
Declare Right Step NZle_stepr.
-Theorem NZlt_le_incl : forall n m : NZ, n < m -> n <= m.
-Proof.
-intros; now le_less.
-Qed.
-
Theorem NZlt_neq : forall n m : NZ, n < m -> n ~= m.
Proof.
intros n m H1 H2; rewrite H2 in H1; false_hyp H1 NZlt_irrefl.
Qed.
-Theorem NZlt_le_neq : forall n m : NZ, n < m <-> n <= m /\ n ~= m.
+Theorem NZle_neq : forall n m : NZ, n < m <-> n <= m /\ n ~= m.
Proof.
intros n m; split; [intro H | intros [H1 H2]].
-split. le_less. now apply NZlt_neq.
+split. now apply NZlt_le_incl. now apply NZlt_neq.
le_elim H1. assumption. false_hyp H1 H2.
Qed.
Theorem NZle_refl : forall n : NZ, n <= n.
Proof.
-intro; now le_equal.
+intro; now apply NZeq_le_incl.
Qed.
-Theorem NZlt_succ_r : forall n : NZ, n < S n.
+Theorem NZlt_succ_diag_r : forall n : NZ, n < S n.
Proof.
-intro n. rewrite NZlt_succ_le. now le_equal.
+intro n. rewrite NZlt_succ_r. now apply NZeq_le_incl.
Qed.
-Theorem NZle_succ_r : forall n : NZ, n <= S n.
+Theorem NZle_succ_diag_r : forall n : NZ, n <= S n.
Proof.
-intro; le_less; apply NZlt_succ_r.
+intro; apply NZlt_le_incl; apply NZlt_succ_diag_r.
Qed.
-Theorem NZlt_lt_succ : forall n m : NZ, n < m -> n < S m.
+Theorem NZlt_lt_succ_r : forall n m : NZ, n < m -> n < S m.
Proof.
-intros. rewrite NZlt_succ_le. now le_less.
+intros. rewrite NZlt_succ_r. now apply NZlt_le_incl.
Qed.
-Theorem NZle_le_succ : forall n m : NZ, n <= m -> n <= S m.
+Theorem NZle_le_succ_r : forall n m : NZ, n <= m -> n <= S m.
Proof.
-intros n m H; rewrite <- NZlt_succ_le in H; now le_less.
+intros n m H. rewrite <- NZlt_succ_r in H. now apply NZlt_le_incl.
Qed.
-Theorem NZle_succ_le_or_eq_succ : forall n m : NZ, n <= S m <-> n <= m \/ n == S m.
+Theorem NZle_succ_r : forall n m : NZ, n <= S m <-> n <= m \/ n == S m.
Proof.
-intros n m; rewrite NZle_lt_or_eq. now rewrite NZlt_succ_le.
+intros n m; rewrite NZlt_eq_cases. now rewrite NZlt_succ_r.
Qed.
(* The following theorem is a special case of neq_succ_iter_l below,
-but we prove it independently *)
+but we prove it separately *)
-Theorem NZneq_succ_l : forall n : NZ, S n ~= n.
+Theorem NZneq_succ_diag_l : forall n : NZ, S n ~= n.
Proof.
-intros n H. pose proof (NZlt_succ_r n) as H1. rewrite H in H1.
+intros n H. pose proof (NZlt_succ_diag_r n) as H1. rewrite H in H1.
false_hyp H1 NZlt_irrefl.
Qed.
-Theorem NZnlt_succ_l : forall n : NZ, ~ S n < n.
+Theorem NZneq_succ_diag_r : forall n : NZ, n ~= S n.
Proof.
-intros n H; apply NZlt_lt_succ in H. false_hyp H NZlt_irrefl.
+intro n; apply NZneq_symm; apply NZneq_succ_diag_l.
Qed.
-Theorem NZnle_succ_l : forall n : NZ, ~ S n <= n.
+Theorem NZnlt_succ_diag_l : forall n : NZ, ~ S n < n.
+Proof.
+intros n H; apply NZlt_lt_succ_r in H. false_hyp H NZlt_irrefl.
+Qed.
+
+Theorem NZnle_succ_diag_l : forall n : NZ, ~ S n <= n.
Proof.
intros n H; le_elim H.
-false_hyp H NZnlt_succ_l. false_hyp H NZneq_succ_l.
+false_hyp H NZnlt_succ_diag_l. false_hyp H NZneq_succ_diag_l.
Qed.
-Theorem NZlt_le_succ : forall n m : NZ, n < m <-> S n <= m.
+Theorem NZle_succ_l : forall n m : NZ, S n <= m <-> n < m.
Proof.
intro n; NZinduct m n.
setoid_replace (n < n) with False using relation iff by
(apply -> neg_false; apply NZlt_irrefl).
now setoid_replace (S n <= n) with False using relation iff by
- (apply -> neg_false; apply NZnle_succ_l).
-intro m. rewrite NZlt_succ_le. rewrite NZle_succ_le_or_eq_succ.
-rewrite NZsucc_inj_wd. rewrite (NZle_lt_or_eq n m).
+ (apply -> neg_false; apply NZnle_succ_diag_l).
+intro m. rewrite NZlt_succ_r. rewrite NZle_succ_r.
+rewrite NZsucc_inj_wd. rewrite (NZlt_eq_cases n m).
rewrite or_cancel_r.
+intros H1 H2; rewrite H2 in H1; false_hyp H1 NZnle_succ_diag_l.
apply NZlt_neq.
-intros H1 H2; rewrite H2 in H1; false_hyp H1 NZnle_succ_l.
reflexivity.
Qed.
-Theorem NZlt_succ_lt : forall n m : NZ, S n < m -> n < m.
-Proof.
-intros n m H; apply <- NZlt_le_succ; now le_less.
-Qed.
-
-Theorem NZle_succ_le : forall n m : NZ, S n <= m -> n <= m.
+Theorem NZlt_succ_l : forall n m : NZ, S n < m -> n < m.
Proof.
-intros n m H; le_less; now apply <- NZlt_le_succ.
+intros n m H; apply -> NZle_succ_l; now apply NZlt_le_incl.
Qed.
Theorem NZsucc_lt_mono : forall n m : NZ, n < m <-> S n < S m.
Proof.
-intros n m. rewrite NZlt_le_succ. symmetry. apply NZlt_succ_le.
+intros n m. rewrite <- NZle_succ_l. symmetry. apply NZlt_succ_r.
Qed.
Theorem NZsucc_le_mono : forall n m : NZ, n <= m <-> S n <= S m.
Proof.
-intros n m. do 2 rewrite NZle_lt_or_eq.
+intros n m. do 2 rewrite NZlt_eq_cases.
rewrite <- NZsucc_lt_mono; now rewrite NZsucc_inj_wd.
Qed.
@@ -154,9 +158,9 @@ Proof.
intros n m; NZinduct n m.
intros H _; false_hyp H NZlt_irrefl.
intro n; split; intros H H1 H2.
-apply NZlt_succ_lt in H1. apply -> NZlt_succ_le in H2. le_elim H2.
+apply NZlt_succ_l in H1. apply -> NZlt_succ_r in H2. le_elim H2.
now apply H. rewrite H2 in H1; false_hyp H1 NZlt_irrefl.
-apply NZlt_lt_succ in H2. apply -> NZlt_le_succ in H1. le_elim H1.
+apply NZlt_lt_succ_r in H2. apply <- NZle_succ_l in H1. le_elim H1.
now apply H. rewrite H1 in H2; false_hyp H2 NZlt_irrefl.
Qed.
@@ -164,10 +168,10 @@ Theorem NZlt_trans : forall n m p : NZ, n < m -> m < p -> n < p.
Proof.
intros n m p; NZinduct p m.
intros _ H; false_hyp H NZlt_irrefl.
-intro p. do 2 rewrite NZlt_succ_le.
+intro p. do 2 rewrite NZlt_succ_r.
split; intros H H1 H2.
-le_less; le_elim H2; [now apply H | now rewrite H2 in H1].
-assert (n <= p) as H3. apply H. assumption. now le_less.
+apply NZlt_le_incl; le_elim H2; [now apply H | now rewrite H2 in H1].
+assert (n <= p) as H3. apply H. assumption. now apply NZlt_le_incl.
le_elim H3. assumption. rewrite <- H3 in H2.
elimtype False; now apply (NZlt_asymm n m).
Qed.
@@ -175,8 +179,8 @@ Qed.
Theorem NZle_trans : forall n m p : NZ, n <= m -> m <= p -> n <= p.
Proof.
intros n m p H1 H2; le_elim H1.
-le_elim H2. le_less; now apply NZlt_trans with (m := m).
-le_less; now rewrite <- H2. now rewrite H1.
+le_elim H2. apply NZlt_le_incl; now apply NZlt_trans with (m := m).
+apply NZlt_le_incl; now rewrite <- H2. now rewrite H1.
Qed.
Theorem NZle_lt_trans : forall n m p : NZ, n <= m -> m < p -> n < p.
@@ -197,17 +201,22 @@ intros n m H1 H2; now (le_elim H1; le_elim H2);
[elimtype False; apply (NZlt_asymm n m) | | |].
Qed.
+Theorem NZlt_1_l : forall n m : NZ, 0 < n -> n < m -> 1 < m.
+Proof.
+intros n m H1 H2. apply <- NZle_succ_l in H1. now apply NZle_lt_trans with n.
+Qed.
+
(** Trichotomy, decidability, and double negation elimination *)
Theorem NZlt_trichotomy : forall n m : NZ, n < m \/ n == m \/ m < n.
Proof.
intros n m; NZinduct n m.
right; now left.
-intro n; rewrite NZlt_succ_le. stepr ((S n < m \/ S n == m) \/ m <= n) by tauto.
-rewrite <- (NZle_lt_or_eq (S n) m).
+intro n; rewrite NZlt_succ_r. stepr ((S n < m \/ S n == m) \/ m <= n) by tauto.
+rewrite <- (NZlt_eq_cases (S n) m).
setoid_replace (n == m) with (m == n) using relation iff by now split.
-stepl (n < m \/ m < n \/ m == n) by tauto. rewrite <- NZle_lt_or_eq.
-apply or_iff_compat_r. apply NZlt_le_succ.
+stepl (n < m \/ m < n \/ m == n) by tauto. rewrite <- NZlt_eq_cases.
+apply or_iff_compat_r. symmetry; apply NZle_succ_l.
Qed.
(* Decidability of equality, even though true in each finite ring, does not
@@ -215,7 +224,8 @@ have a uniform proof. Otherwise, the proof for two fixed numbers would
reduce to a normal form that will say if the numbers are equal or not,
which cannot be true in all finite rings. Therefore, we prove decidability
in the presence of order. *)
-Theorem NZeq_em : forall n m : NZ, n == m \/ n ~= m.
+
+Theorem NZeq_dec : forall n m : NZ, decidable (n == m).
Proof.
intros n m; destruct (NZlt_trichotomy n m) as [H | [H | H]].
right; intro H1; rewrite H1 in H; false_hyp H NZlt_irrefl.
@@ -226,7 +236,7 @@ Qed.
Theorem NZeq_dne : forall n m, ~ ~ n == m <-> n == m.
Proof.
intros n m; split; intro H.
-destruct (NZeq_em n m) as [H1 | H1].
+destruct (NZeq_dec n m) as [H1 | H1].
assumption. false_hyp H1 H.
intro H1; now apply H1.
Qed.
@@ -241,7 +251,7 @@ Qed.
Theorem NZle_gt_cases : forall n m : NZ, n <= m \/ n > m.
Proof.
intros n m; destruct (NZlt_trichotomy n m) as [H | [H | H]].
-left; now le_less. left; now le_equal. now right.
+left; now apply NZlt_le_incl. left; now apply NZeq_le_incl. now right.
Qed.
(* The following theorem is cleary redundant, but helps not to
@@ -255,7 +265,7 @@ Qed.
Theorem NZle_ge_cases : forall n m : NZ, n <= m \/ n >= m.
Proof.
intros n m; destruct (NZle_gt_cases n m) as [H | H].
-now left. right; le_less.
+now left. right; now apply NZlt_le_incl.
Qed.
Theorem NZle_ngt : forall n m : NZ, n <= m <-> ~ n > m.
@@ -267,12 +277,13 @@ assumption. false_hyp H1 H.
Qed.
(* Redundant but useful *)
+
Theorem NZnlt_ge : forall n m : NZ, ~ n < m <-> n >= m.
Proof.
intros n m; symmetry; apply NZle_ngt.
Qed.
-Theorem NZlt_em : forall n m : NZ, n < m \/ ~ n < m.
+Theorem NZlt_dec : forall n m : NZ, decidable (n < m).
Proof.
intros n m; destruct (NZle_gt_cases m n);
[right; now apply -> NZle_ngt | now left].
@@ -281,7 +292,7 @@ Qed.
Theorem NZlt_dne : forall n m, ~ ~ n < m <-> n < m.
Proof.
intros n m; split; intro H;
-[destruct (NZlt_em n m) as [H1 | H1]; [assumption | false_hyp H1 H] |
+[destruct (NZlt_dec n m) as [H1 | H1]; [assumption | false_hyp H1 H] |
intro H1; false_hyp H H1].
Qed.
@@ -291,12 +302,13 @@ intros n m. rewrite NZle_ngt. apply NZlt_dne.
Qed.
(* Redundant but useful *)
+
Theorem NZlt_nge : forall n m : NZ, n < m <-> ~ n >= m.
Proof.
intros n m; symmetry; apply NZnle_gt.
Qed.
-Theorem NZle_em : forall n m : NZ, n <= m \/ ~ n <= m.
+Theorem NZle_dec : forall n m : NZ, decidable (n <= m).
Proof.
intros n m; destruct (NZle_gt_cases n m);
[now left | right; now apply <- NZnle_gt].
@@ -305,13 +317,13 @@ Qed.
Theorem NZle_dne : forall n m : NZ, ~ ~ n <= m <-> n <= m.
Proof.
intros n m; split; intro H;
-[destruct (NZle_em n m) as [H1 | H1]; [assumption | false_hyp H1 H] |
+[destruct (NZle_dec n m) as [H1 | H1]; [assumption | false_hyp H1 H] |
intro H1; false_hyp H H1].
Qed.
-Theorem NZlt_nlt_succ : forall n m : NZ, n < m <-> ~ m < S n.
+Theorem NZnlt_succ_r : forall n m : NZ, ~ m < S n <-> n < m.
Proof.
-intros n m; rewrite NZlt_succ_le; symmetry; apply NZnle_gt.
+intros n m; rewrite NZlt_succ_r; apply NZnle_gt.
Qed.
(* The difference between integers and natural numbers is that for
@@ -327,9 +339,9 @@ Proof.
intro z; NZinduct n z.
intros m H1 H2; apply <- NZnle_gt in H1; false_hyp H2 H1.
intro n; split; intros IH m H1 H2.
-apply -> NZle_succ_le_or_eq_succ in H2; destruct H2 as [H2 | H2].
-now apply IH. exists n. now split; [| rewrite <- NZlt_succ_le; rewrite <- H2].
-apply IH. assumption. now apply NZle_le_succ.
+apply -> NZle_succ_r in H2; destruct H2 as [H2 | H2].
+now apply IH. exists n. now split; [| rewrite <- NZlt_succ_r; rewrite <- H2].
+apply IH. assumption. now apply NZle_le_succ_r.
Qed.
Theorem NZlt_exists_pred :
@@ -351,7 +363,7 @@ Theorem NZlt_succ_iter_r :
forall (n : nat) (m : NZ), m < NZsucc_iter (Datatypes.S n) m.
Proof.
intros n m; induction n as [| n IH]; simpl in *.
-apply NZlt_succ_r. now apply NZlt_lt_succ.
+apply NZlt_succ_diag_r. now apply NZlt_lt_succ_r.
Qed.
Theorem NZneq_succ_iter_l :
@@ -389,16 +401,16 @@ Lemma NZrs_rs' : A z -> right_step -> right_step'.
Proof.
intros Az RS n H1 H2.
le_elim H1. apply NZlt_exists_pred in H1. destruct H1 as [k [H3 H4]].
-rewrite H3. apply RS; [assumption | apply H2; [assumption | rewrite H3; apply NZlt_succ_r]].
+rewrite H3. apply RS; [assumption | apply H2; [assumption | rewrite H3; apply NZlt_succ_diag_r]].
rewrite <- H1; apply Az.
Qed.
Lemma NZrs'_rs'' : right_step' -> right_step''.
Proof.
intros RS' n; split; intros H1 m H2 H3.
-apply -> NZlt_succ_le in H3; le_elim H3;
+apply -> NZlt_succ_r in H3; le_elim H3;
[now apply H1 | rewrite H3 in *; now apply RS'].
-apply H1; [assumption | now apply NZlt_lt_succ].
+apply H1; [assumption | now apply NZlt_lt_succ_r].
Qed.
Lemma NZrbase : A' z.
@@ -408,7 +420,7 @@ Qed.
Lemma NZA'A_right : (forall n : NZ, A' n) -> forall n : NZ, z <= n -> A n.
Proof.
-intros H1 n H2. apply H1 with (n := S n); [assumption | apply NZlt_succ_r].
+intros H1 n H2. apply H1 with (n := S n); [assumption | apply NZlt_succ_diag_r].
Qed.
Theorem NZstrong_right_induction: right_step' -> forall n : NZ, z <= n -> A n.
@@ -427,9 +439,9 @@ Theorem NZright_induction' :
Proof.
intros L R n.
destruct (NZlt_trichotomy n z) as [H | [H | H]].
-apply L; now le_less.
-apply L; now le_equal.
-apply NZright_induction. apply L; now le_equal. assumption. now le_less.
+apply L; now apply NZlt_le_incl.
+apply L; now apply NZeq_le_incl.
+apply NZright_induction. apply L; now apply NZeq_le_incl. assumption. now apply NZlt_le_incl.
Qed.
Theorem NZstrong_right_induction' :
@@ -437,9 +449,9 @@ Theorem NZstrong_right_induction' :
Proof.
intros L R n.
destruct (NZlt_trichotomy n z) as [H | [H | H]].
-apply L; now le_less.
-apply L; now le_equal.
-apply NZstrong_right_induction. assumption. now le_less.
+apply L; now apply NZlt_le_incl.
+apply L; now apply NZeq_le_incl.
+apply NZstrong_right_induction. assumption. now apply NZlt_le_incl.
Qed.
End RightInduction.
@@ -454,28 +466,28 @@ Let left_step'' := forall n : NZ, A' n <-> A' (S n).
Lemma NZls_ls' : A z -> left_step -> left_step'.
Proof.
intros Az LS n H1 H2. le_elim H1.
-apply LS; [assumption | apply H2; [now apply -> NZlt_le_succ | now le_equal]].
+apply LS; [assumption | apply H2; [now apply <- NZle_succ_l | now apply NZeq_le_incl]].
rewrite H1; apply Az.
Qed.
Lemma NZls'_ls'' : left_step' -> left_step''.
Proof.
intros LS' n; split; intros H1 m H2 H3.
-apply NZle_succ_le in H3. now apply H1.
+apply -> NZle_succ_l in H3. apply NZlt_le_incl in H3. now apply H1.
le_elim H3.
-apply -> NZlt_le_succ in H3. now apply H1.
+apply <- NZle_succ_l in H3. now apply H1.
rewrite <- H3 in *; now apply LS'.
Qed.
Lemma NZlbase : A' (S z).
Proof.
-intros m H1 H2. apply <- NZlt_le_succ in H2.
+intros m H1 H2. apply -> NZle_succ_l in H2.
apply -> NZle_ngt in H1. false_hyp H2 H1.
Qed.
Lemma NZA'A_left : (forall n : NZ, A' n) -> forall n : NZ, n <= z -> A n.
Proof.
-intros H1 n H2. apply H1 with (n := n); [assumption | now le_equal].
+intros H1 n H2. apply H1 with (n := n); [assumption | now apply NZeq_le_incl].
Qed.
Theorem NZstrong_left_induction: left_step' -> forall n : NZ, n <= z -> A n.
@@ -494,9 +506,9 @@ Theorem NZleft_induction' :
Proof.
intros R L n.
destruct (NZlt_trichotomy n z) as [H | [H | H]].
-apply NZleft_induction. apply R. now le_equal. assumption. now le_less.
-rewrite H; apply R; le_equal.
-apply R; le_less.
+apply NZleft_induction. apply R. now apply NZeq_le_incl. assumption. now apply NZlt_le_incl.
+rewrite H; apply R; now apply NZeq_le_incl.
+apply R; now apply NZlt_le_incl.
Qed.
Theorem NZstrong_left_induction' :
@@ -504,9 +516,9 @@ Theorem NZstrong_left_induction' :
Proof.
intros R L n.
destruct (NZlt_trichotomy n z) as [H | [H | H]].
-apply NZstrong_left_induction; auto. le_less.
-rewrite H; apply R; le_equal.
-apply R; le_less.
+apply NZstrong_left_induction; auto. now apply NZlt_le_incl.
+rewrite H; apply R; now apply NZeq_le_incl.
+apply R; now apply NZlt_le_incl.
Qed.
End LeftInduction.
@@ -519,9 +531,9 @@ Theorem NZorder_induction :
Proof.
intros Az RS LS n.
destruct (NZlt_trichotomy n z) as [H | [H | H]].
-now apply NZleft_induction; [| | le_less].
+now apply NZleft_induction; [| | apply NZlt_le_incl].
now rewrite H.
-now apply NZright_induction; [| | le_less].
+now apply NZright_induction; [| | apply NZlt_le_incl].
Qed.
Theorem NZorder_induction' :
@@ -531,7 +543,7 @@ Theorem NZorder_induction' :
forall n : NZ, A n.
Proof.
intros Az AS AP n; apply NZorder_induction; try assumption.
-intros m H1 H2. apply AP in H2; [| now apply -> NZlt_le_succ].
+intros m H1 H2. apply AP in H2; [| now apply <- NZle_succ_l].
unfold predicate_wd, fun_wd in A_wd; apply -> (A_wd (P (S m)) m);
[assumption | apply NZpred_succ].
Qed.
@@ -560,8 +572,8 @@ Theorem NZlt_ind : forall (n : NZ),
forall m : NZ, n < m -> A m.
Proof.
intros n H1 H2 m H3.
-apply NZright_induction with (S n); [assumption | | now apply -> NZlt_le_succ].
-intros; apply H2; try assumption. now apply <- NZlt_le_succ.
+apply NZright_induction with (S n); [assumption | | now apply <- NZle_succ_l].
+intros; apply H2; try assumption. now apply -> NZle_succ_l.
Qed.
(** Elimintation principle for <= *)
@@ -632,7 +644,7 @@ apply NZAcc_gt_wd.
intros n H; constructor; intros y [H1 H2].
apply <- NZnle_gt in H2. elim H2. now apply NZle_lt_trans with n.
intros n H1 H2; constructor; intros m [H3 H4].
-apply H2. assumption. now apply -> NZlt_le_succ.
+apply H2. assumption. now apply <- NZle_succ_l.
Qed.
End WF.
diff --git a/theories/Numbers/NatInt/NZTimes.v b/theories/Numbers/NatInt/NZTimes.v
index e0d1f63501..20bd3cdc61 100644
--- a/theories/Numbers/NatInt/NZTimes.v
+++ b/theories/Numbers/NatInt/NZTimes.v
@@ -17,20 +17,20 @@ Module NZTimesPropFunct (Import NZAxiomsMod : NZAxiomsSig).
Module Export NZPlusPropMod := NZPlusPropFunct NZAxiomsMod.
Open Local Scope NatIntScope.
-Theorem NZtimes_0_l : forall n : NZ, 0 * n == 0.
+Theorem NZtimes_0_r : forall n : NZ, n * 0 == 0.
Proof.
NZinduct n.
-now rewrite NZtimes_0_r.
-intro. rewrite NZtimes_succ_r. now rewrite NZplus_0_r.
+now rewrite NZtimes_0_l.
+intro. rewrite NZtimes_succ_l. now rewrite NZplus_0_r.
Qed.
-Theorem NZtimes_succ_l : forall n m : NZ, (S n) * m == n * m + m.
+Theorem NZtimes_succ_r : forall n m : NZ, n * (S m) == n * m + n.
Proof.
-intros n m; NZinduct m.
-do 2 rewrite NZtimes_0_r; now rewrite NZplus_0_l.
-intro m. do 2 rewrite NZtimes_succ_r. do 2 rewrite NZplus_succ_r.
-rewrite NZsucc_inj_wd. rewrite <- (NZplus_assoc (n * m) n m).
-rewrite (NZplus_comm n m). rewrite NZplus_assoc.
+intros n m; NZinduct n.
+do 2 rewrite NZtimes_0_l; now rewrite NZplus_0_l.
+intro n. do 2 rewrite NZtimes_succ_l. do 2 rewrite NZplus_succ_r.
+rewrite NZsucc_inj_wd. rewrite <- (NZplus_assoc (n * m) m n).
+rewrite (NZplus_comm m n). rewrite NZplus_assoc.
now rewrite NZplus_cancel_r.
Qed.
diff --git a/theories/Numbers/NatInt/NZTimesOrder.v b/theories/Numbers/NatInt/NZTimesOrder.v
index 6fc0078c04..4b4516069e 100644
--- a/theories/Numbers/NatInt/NZTimesOrder.v
+++ b/theories/Numbers/NatInt/NZTimesOrder.v
@@ -200,11 +200,11 @@ Theorem NZtimes_lt_mono_neg_l : forall p n m : NZ, p < 0 -> (n < m <-> p * m < p
Proof.
NZord_induct p.
intros n m H; false_hyp H NZlt_irrefl.
-intros p H1 _ n m H2. apply NZlt_succ_lt in H2. apply <- NZnle_gt in H2. false_hyp H1 H2.
-intros p H IH n m H1. apply -> NZlt_le_succ in H.
+intros p H1 _ n m H2. apply NZlt_succ_l in H2. apply <- NZnle_gt in H2. false_hyp H1 H2.
+intros p H IH n m H1. apply <- NZle_succ_l in H.
le_elim H. assert (LR : forall n m : NZ, n < m -> p * m < p * n).
intros n1 m1 H2. apply (NZle_lt_plus_lt n1 m1).
-now le_less. do 2 rewrite <- NZtimes_succ_l. now apply -> IH.
+now apply NZlt_le_incl. do 2 rewrite <- NZtimes_succ_l. now apply -> IH.
split; [apply LR |]. intro H2. apply -> NZlt_dne; intro H3.
apply <- NZle_ngt in H3. le_elim H3.
apply NZlt_asymm in H2. apply H2. now apply LR.
@@ -222,17 +222,17 @@ Qed.
Theorem NZtimes_le_mono_nonneg_l : forall n m p : NZ, 0 <= p -> n <= m -> p * n <= p * m.
Proof.
intros n m p H1 H2. le_elim H1.
-le_elim H2. le_less. now apply -> NZtimes_lt_mono_pos_l.
-le_equal; now rewrite H2.
-le_equal; rewrite <- H1; now do 2 rewrite NZtimes_0_l.
+le_elim H2. apply NZlt_le_incl. now apply -> NZtimes_lt_mono_pos_l.
+apply NZeq_le_incl; now rewrite H2.
+apply NZeq_le_incl; rewrite <- H1; now do 2 rewrite NZtimes_0_l.
Qed.
Theorem NZtimes_le_mono_nonpos_l : forall n m p : NZ, p <= 0 -> n <= m -> p * m <= p * n.
Proof.
intros n m p H1 H2. le_elim H1.
-le_elim H2. le_less. now apply -> NZtimes_lt_mono_neg_l.
-le_equal; now rewrite H2.
-le_equal; rewrite H1; now do 2 rewrite NZtimes_0_l.
+le_elim H2. apply NZlt_le_incl. now apply -> NZtimes_lt_mono_neg_l.
+apply NZeq_le_incl; now rewrite H2.
+apply NZeq_le_incl; rewrite H1; now do 2 rewrite NZtimes_0_l.
Qed.
Theorem NZtimes_le_mono_nonneg_r : forall n m p : NZ, 0 <= p -> n <= m -> n * p <= m * p.
@@ -272,7 +272,7 @@ Qed.
Theorem NZtimes_le_mono_pos_l : forall n m p : NZ, 0 < p -> (n <= m <-> p * n <= p * m).
Proof.
-intros n m p H; do 2 rewrite NZle_lt_or_eq.
+intros n m p H; do 2 rewrite NZlt_eq_cases.
rewrite (NZtimes_lt_mono_pos_l p n m); [assumption |].
now rewrite -> (NZtimes_cancel_l n m p);
[intro H1; rewrite H1 in H; false_hyp H NZlt_irrefl |].
@@ -286,7 +286,7 @@ Qed.
Theorem NZtimes_le_mono_neg_l : forall n m p : NZ, p < 0 -> (n <= m <-> p * m <= p * n).
Proof.
-intros n m p H; do 2 rewrite NZle_lt_or_eq.
+intros n m p H; do 2 rewrite NZlt_eq_cases.
rewrite (NZtimes_lt_mono_neg_l p n m); [assumption |].
rewrite -> (NZtimes_cancel_l m n p);
[intro H1; rewrite H1 in H; false_hyp H NZlt_irrefl |].
@@ -304,7 +304,7 @@ Theorem NZtimes_lt_mono :
Proof.
intros n m p q H1 H2 H3 H4.
apply NZle_lt_trans with (m * p).
-apply NZtimes_le_mono_nonneg_r; [assumption | now le_less].
+apply NZtimes_le_mono_nonneg_r; [assumption | now apply NZlt_le_incl].
apply -> NZtimes_lt_mono_pos_l; [assumption | now apply NZle_lt_trans with n].
Qed.
@@ -316,10 +316,10 @@ Theorem NZtimes_le_mono :
Proof.
intros n m p q H1 H2 H3 H4.
le_elim H2; le_elim H4.
-le_less; now apply NZtimes_lt_mono.
-rewrite <- H4; apply NZtimes_le_mono_nonneg_r; [assumption | now le_less].
-rewrite <- H2; apply NZtimes_le_mono_nonneg_l; [assumption | now le_less].
-rewrite H2; rewrite H4; now le_equal.
+apply NZlt_le_incl; now apply NZtimes_lt_mono.
+rewrite <- H4; apply NZtimes_le_mono_nonneg_r; [assumption | now apply NZlt_le_incl].
+rewrite <- H2; apply NZtimes_le_mono_nonneg_l; [assumption | now apply NZlt_le_incl].
+rewrite H2; rewrite H4; now apply NZeq_le_incl.
Qed.
Theorem NZtimes_pos_pos : forall n m : NZ, 0 < n -> 0 < m -> 0 < n * m.
@@ -368,25 +368,46 @@ Proof.
intros; rewrite NZtimes_comm; now apply NZtimes_nonneg_nonpos.
Qed.
-Theorem NZtimes_eq_0 : forall n m : NZ, n * m == 0 -> n == 0 \/ m == 0.
+Theorem NZlt_1_times_pos : forall n m : NZ, 1 < n -> 0 < m -> 1 < n * m.
Proof.
-intros n m H; destruct (NZlt_trichotomy n 0) as [H1 | [H1 | H1]];
+intros n m H1 H2. apply -> (NZtimes_lt_mono_pos_r m) in H1.
+rewrite NZtimes_1_l in H1. now apply NZlt_1_l with m.
+assumption.
+Qed.
+
+Theorem NZeq_times_0 : forall n m : NZ, n * m == 0 <-> n == 0 \/ m == 0.
+Proof.
+intros n m; split.
+intro H; destruct (NZlt_trichotomy n 0) as [H1 | [H1 | H1]];
destruct (NZlt_trichotomy m 0) as [H2 | [H2 | H2]];
try (now right); try (now left).
elimtype False; now apply (NZlt_neq 0 (n * m)); [apply NZtimes_neg_neg |].
elimtype False; now apply (NZlt_neq (n * m) 0); [apply NZtimes_neg_pos |].
elimtype False; now apply (NZlt_neq (n * m) 0); [apply NZtimes_pos_neg |].
elimtype False; now apply (NZlt_neq 0 (n * m)); [apply NZtimes_pos_pos |].
+intros [H | H]. now rewrite H, NZtimes_0_l. now rewrite H, NZtimes_0_r.
Qed.
-Theorem NZtimes_neq_0 : forall n m : NZ, n ~= 0 /\ m ~= 0 <-> n * m ~= 0.
+Theorem NZneq_times_0 : forall n m : NZ, n ~= 0 /\ m ~= 0 <-> n * m ~= 0.
Proof.
intros n m; split; intro H.
-intro H1; apply NZtimes_eq_0 in H1. tauto.
+intro H1; apply -> NZeq_times_0 in H1. tauto.
split; intro H1; rewrite H1 in H;
(rewrite NZtimes_0_l in H || rewrite NZtimes_0_r in H); now apply H.
Qed.
+Theorem NZeq_times_0_l : forall n m : NZ, n * m == 0 -> m ~= 0 -> n == 0.
+Proof.
+intros n m H1 H2. apply -> NZeq_times_0 in H1. destruct H1 as [H1 | H1].
+assumption. false_hyp H1 H2.
+Qed.
+
+Theorem NZeq_times_0_r : forall n m : NZ, n * m == 0 -> n ~= 0 -> m == 0.
+Proof.
+intros n m H1 H2; apply -> NZeq_times_0 in H1. destruct H1 as [H1 | H1].
+false_hyp H1 H2. assumption.
+Qed.
+
Theorem NZtimes_pos : forall n m : NZ, 0 < n * m <-> (0 < n /\ 0 < m) \/ (m < 0 /\ n < 0).
Proof.
intros n m; split; [intro H | intros [[H1 H2] | [H1 H2]]].
@@ -420,12 +441,12 @@ Qed.
Theorem NZtimes_2_mono_l : forall n m : NZ, n < m -> 1 + (1 + 1) * n < (1 + 1) * m.
Proof.
-intros n m H. apply -> NZlt_le_succ in H.
+intros n m H. apply <- NZle_succ_l in H.
apply -> (NZtimes_le_mono_pos_l (S n) m (1 + 1)) in H.
repeat rewrite NZtimes_plus_distr_r in *; repeat rewrite NZtimes_1_l in *.
repeat rewrite NZplus_succ_r in *. repeat rewrite NZplus_succ_l in *. rewrite NZplus_0_l.
-now apply <- NZlt_le_succ.
-apply NZplus_pos_pos; now apply NZlt_succ_r.
+now apply -> NZle_succ_l.
+apply NZplus_pos_pos; now apply NZlt_succ_diag_r.
Qed.
End NZTimesOrderPropFunct.
diff --git a/theories/Numbers/Natural/Abstract/NAxioms.v b/theories/Numbers/Natural/Abstract/NAxioms.v
index 7cfff8e030..86a828d037 100644
--- a/theories/Numbers/Natural/Abstract/NAxioms.v
+++ b/theories/Numbers/Natural/Abstract/NAxioms.v
@@ -64,5 +64,8 @@ Axiom recursion_succ :
Aeq a a -> fun2_wd Neq Aeq Aeq f ->
forall n : N, Aeq (recursion a f (S n)) (f n (recursion a f n)).
+(*Axiom dep_rec :
+ forall A : N -> Type, A 0 -> (forall n : N, A n -> A (S n)) -> forall n : N, A n.*)
+
End NAxiomsSig.
diff --git a/theories/Numbers/Natural/Abstract/NBase.v b/theories/Numbers/Natural/Abstract/NBase.v
index d71f98057f..bcef668677 100644
--- a/theories/Numbers/Natural/Abstract/NBase.v
+++ b/theories/Numbers/Natural/Abstract/NBase.v
@@ -10,6 +10,7 @@
(*i i*)
+Require Export Decidable.
Require Export NAxioms.
Require Import NZTimesOrder. (* The last property functor on NZ, which subsumes all others *)
@@ -59,8 +60,8 @@ Proof NZsucc_inj_wd_neg.
(* Decidability and stability of equality was proved only in NZOrder, but
since it does not mention order, we'll put it here *)
-Theorem eq_em : forall n m : N, n == m \/ n ~= m.
-Proof NZeq_em.
+Theorem eq_dec : forall n m : N, decidable (n == m).
+Proof NZeq_dec.
Theorem eq_dne : forall n m : N, ~ ~ n == m <-> n == m.
Proof NZeq_dne.
@@ -99,16 +100,21 @@ pattern false at 2; replace false with (if_zero false true 0) by apply if_zero_0
now rewrite H.
Qed.
+Theorem neq_0_succ : forall n : N, 0 ~= S n.
+Proof.
+intro n; apply neq_symm; apply neq_succ_0.
+Qed.
+
(* Next, we show that all numbers are nonnegative and recover regular induction
from the bidirectional induction on NZ *)
Theorem le_0_l : forall n : N, 0 <= n.
Proof.
NZinduct n.
-le_equal.
+now apply NZeq_le_incl.
intro n; split.
-apply NZle_le_succ.
-intro H; apply -> NZle_succ_le_or_eq_succ in H; destruct H as [H | H].
+apply NZle_le_succ_r.
+intro H; apply -> NZle_succ_r in H; destruct H as [H | H].
assumption.
symmetry in H; false_hyp H neq_succ_0.
Qed.
@@ -144,7 +150,7 @@ Proof.
intro H; apply (neq_succ_0 0). apply H.
Qed.
-Theorem neq_0_succ : forall n, n ~= 0 <-> exists m, n == S m.
+Theorem neq_0_r : forall n, n ~= 0 <-> exists m, n == S m.
Proof.
cases n. split; intro H;
[now elim H | destruct H as [m H]; symmetry in H; false_hyp H neq_succ_0].
diff --git a/theories/Numbers/Natural/Abstract/NMinus.v b/theories/Numbers/Natural/Abstract/NMinus.v
index c109ff904a..f7c9cf19bb 100644
--- a/theories/Numbers/Natural/Abstract/NMinus.v
+++ b/theories/Numbers/Natural/Abstract/NMinus.v
@@ -63,8 +63,8 @@ Proof.
intros n m p; induct p.
intro; now do 2 rewrite minus_0_r.
intros p IH H. do 2 rewrite minus_succ_r.
-rewrite <- IH; [now apply le_succ_le |].
-rewrite plus_pred_r. apply minus_gt. now apply <- lt_le_succ.
+rewrite <- IH; [apply lt_le_incl; now apply -> le_succ_l |].
+rewrite plus_pred_r. apply minus_gt. now apply -> le_succ_l.
reflexivity.
Qed.
@@ -129,7 +129,7 @@ Qed.
Theorem le_minus_l : forall n m : N, n - m <= n.
Proof.
intro n; induct m.
-rewrite minus_0_r; le_equal.
+rewrite minus_0_r; now apply eq_le_incl.
intros m IH. rewrite minus_succ_r.
apply le_trans with (n - m); [apply le_pred_l | assumption].
Qed.
@@ -150,7 +150,7 @@ Proof.
intros n m; cases m.
now rewrite pred_0, times_0_r, minus_0_l.
intro m; rewrite pred_succ, times_succ_r, <- plus_minus_assoc.
-le_equal.
+now apply eq_le_incl.
now rewrite minus_diag, plus_0_r.
Qed.
@@ -163,7 +163,7 @@ rewrite minus_succ_l; [assumption |]. do 2 rewrite times_succ_l.
rewrite (plus_comm ((n - m) * p) p), (plus_comm (n * p) p).
rewrite <- (plus_minus_assoc p (n * p) (m * p)); [now apply times_le_mono_r |].
now apply <- plus_cancel_l.
-assert (H1 : S n <= m); [now apply -> lt_le_succ |].
+assert (H1 : S n <= m); [now apply <- le_succ_l |].
setoid_replace (S n - m) with 0 by now apply <- minus_0_le.
setoid_replace ((S n * p) - m * p) with 0 by (apply <- minus_0_le; now apply times_le_mono_r).
apply times_0_l.
diff --git a/theories/Numbers/Natural/Abstract/NOrder.v b/theories/Numbers/Natural/Abstract/NOrder.v
index bc3aace381..33214cd1bf 100644
--- a/theories/Numbers/Natural/Abstract/NOrder.v
+++ b/theories/Numbers/Natural/Abstract/NOrder.v
@@ -36,14 +36,14 @@ Theorem max_wd :
forall n1 n2 : N, n1 == n2 -> forall m1 m2 : N, m1 == m2 -> max n1 m1 == max n2 m2.
Proof NZmax_wd.
-Theorem le_lt_or_eq : forall n m : N, n <= m <-> n < m \/ n == m.
-Proof NZle_lt_or_eq.
+Theorem lt_eq_cases : forall n m : N, n <= m <-> n < m \/ n == m.
+Proof NZlt_eq_cases.
Theorem lt_irrefl : forall n : N, ~ n < n.
Proof NZlt_irrefl.
-Theorem lt_succ_le : forall n m : N, n < S m <-> n <= m.
-Proof NZlt_succ_le.
+Theorem lt_succ_r : forall n m : N, n < S m <-> n <= m.
+Proof NZlt_succ_r.
Theorem min_l : forall n m : N, n <= m -> min n m == n.
Proof NZmin_l.
@@ -62,47 +62,50 @@ Proof NZmax_r.
Theorem lt_le_incl : forall n m : N, n < m -> n <= m.
Proof NZlt_le_incl.
+Theorem eq_le_incl : forall n m : N, n == m -> n <= m.
+Proof NZeq_le_incl.
+
Theorem lt_neq : forall n m : N, n < m -> n ~= m.
Proof NZlt_neq.
-Theorem lt_le_neq : forall n m : N, n < m <-> n <= m /\ n ~= m.
-Proof NZlt_le_neq.
+Theorem le_neq : forall n m : N, n < m <-> n <= m /\ n ~= m.
+Proof NZle_neq.
Theorem le_refl : forall n : N, n <= n.
Proof NZle_refl.
-Theorem lt_succ_r : forall n : N, n < S n.
-Proof NZlt_succ_r.
+Theorem lt_succ_diag_r : forall n : N, n < S n.
+Proof NZlt_succ_diag_r.
-Theorem le_succ_r : forall n : N, n <= S n.
-Proof NZle_succ_r.
+Theorem le_succ_diag_r : forall n : N, n <= S n.
+Proof NZle_succ_diag_r.
-Theorem lt_lt_succ : forall n m : N, n < m -> n < S m.
-Proof NZlt_lt_succ.
+Theorem lt_lt_succ_r : forall n m : N, n < m -> n < S m.
+Proof NZlt_lt_succ_r.
-Theorem le_le_succ : forall n m : N, n <= m -> n <= S m.
-Proof NZle_le_succ.
+Theorem le_le_succ_r : forall n m : N, n <= m -> n <= S m.
+Proof NZle_le_succ_r.
-Theorem le_succ_le_or_eq_succ : forall n m : N, n <= S m <-> n <= m \/ n == S m.
-Proof NZle_succ_le_or_eq_succ.
+Theorem le_succ_r : forall n m : N, n <= S m <-> n <= m \/ n == S m.
+Proof NZle_succ_r.
-Theorem neq_succ_l : forall n : N, S n ~= n.
-Proof NZneq_succ_l.
+Theorem neq_succ_diag_l : forall n : N, S n ~= n.
+Proof NZneq_succ_diag_l.
-Theorem nlt_succ_l : forall n : N, ~ S n < n.
-Proof NZnlt_succ_l.
+Theorem neq_succ_diag_r : forall n : N, n ~= S n.
+Proof NZneq_succ_diag_r.
-Theorem nle_succ_l : forall n : N, ~ S n <= n.
-Proof NZnle_succ_l.
+Theorem nlt_succ_diag_l : forall n : N, ~ S n < n.
+Proof NZnlt_succ_diag_l.
-Theorem lt_le_succ : forall n m : N, n < m <-> S n <= m.
-Proof NZlt_le_succ.
+Theorem nle_succ_diag_l : forall n : N, ~ S n <= n.
+Proof NZnle_succ_diag_l.
-Theorem lt_succ_lt : forall n m : N, S n < m -> n < m.
-Proof NZlt_succ_lt.
+Theorem le_succ_l : forall n m : N, S n <= m <-> n < m.
+Proof NZle_succ_l.
-Theorem le_succ_le : forall n m : N, S n <= m -> n <= m.
-Proof NZle_succ_le.
+Theorem lt_succ_l : forall n m : N, S n < m -> n < m.
+Proof NZlt_succ_l.
Theorem succ_lt_mono : forall n m : N, n < m <-> S n < S m.
Proof NZsucc_lt_mono.
@@ -110,9 +113,11 @@ Proof NZsucc_lt_mono.
Theorem succ_le_mono : forall n m : N, n <= m <-> S n <= S m.
Proof NZsucc_le_mono.
-Theorem lt_asymm : forall n m, n < m -> ~ m < n.
+Theorem lt_asymm : forall n m : N, n < m -> ~ m < n.
Proof NZlt_asymm.
+Notation lt_ngt := lt_asymm (only parsing).
+
Theorem lt_trans : forall n m p : N, n < m -> m < p -> n < p.
Proof NZlt_trans.
@@ -133,6 +138,8 @@ Proof NZle_antisymm.
Theorem lt_trichotomy : forall n m : N, n < m \/ n == m \/ m < n.
Proof NZlt_trichotomy.
+Notation lt_eq_gt_cases := lt_trichotomy (only parsing).
+
Theorem lt_gt_cases : forall n m : N, n ~= m <-> n < m \/ n > m.
Proof NZlt_gt_cases.
@@ -151,10 +158,10 @@ Proof NZle_ngt.
Theorem nlt_ge : forall n m : N, ~ n < m <-> n >= m.
Proof NZnlt_ge.
-Theorem lt_em : forall n m : N, n < m \/ ~ n < m.
-Proof NZlt_em.
+Theorem lt_dec : forall n m : N, decidable (n < m).
+Proof NZlt_dec.
-Theorem lt_dne : forall n m, ~ ~ n < m <-> n < m.
+Theorem lt_dne : forall n m : N, ~ ~ n < m <-> n < m.
Proof NZlt_dne.
Theorem nle_gt : forall n m : N, ~ n <= m <-> n > m.
@@ -163,14 +170,14 @@ Proof NZnle_gt.
Theorem lt_nge : forall n m : N, n < m <-> ~ n >= m.
Proof NZlt_nge.
-Theorem le_em : forall n m : N, n <= m \/ ~ n <= m.
-Proof NZle_em.
+Theorem le_dec : forall n m : N, decidable (n <= m).
+Proof NZle_dec.
Theorem le_dne : forall n m : N, ~ ~ n <= m <-> n <= m.
Proof NZle_dne.
-Theorem lt_nlt_succ : forall n m : N, n < m <-> ~ m < S n.
-Proof NZlt_nlt_succ.
+Theorem nlt_succ_r : forall n m : N, ~ m < S n <-> n < m.
+Proof NZnlt_succ_r.
Theorem lt_exists_pred :
forall z n : N, z < n -> exists k : N, n == S k /\ z <= k.
@@ -212,9 +219,9 @@ Proof NZright_induction'.
Theorem left_induction' :
forall A : N -> Prop, predicate_wd Neq A ->
forall z : N,
- (forall n : NZ, z <= n -> A n) ->
+ (forall n : N, z <= n -> A n) ->
(forall n : N, n < z -> A (S n) -> A n) ->
- forall n : NZ, A n.
+ forall n : N, A n.
Proof NZleft_induction'.
Theorem strong_right_induction :
@@ -313,35 +320,75 @@ Proof.
intro n; apply -> le_ngt. apply le_0_l.
Qed.
-Theorem nle_succ_0 : forall n, ~ (S n <= 0).
+Theorem nle_succ_0 : forall n : N, ~ (S n <= 0).
Proof.
-intros n H; apply <- lt_le_succ in H; false_hyp H nlt_0_r.
+intros n H; apply -> le_succ_l in H; false_hyp H nlt_0_r.
Qed.
-Theorem le_0_eq_0 : forall n, n <= 0 <-> n == 0.
+Theorem le_0_r : forall n : N, n <= 0 <-> n == 0.
Proof.
intros n; split; intro H.
le_elim H; [false_hyp H nlt_0_r | assumption].
-le_equal.
+now apply eq_le_incl.
Qed.
-Theorem lt_0_succ : forall n, 0 < S n.
+Theorem lt_0_succ : forall n : N, 0 < S n.
Proof.
-induct n; [apply lt_succ_r | intros n H; now apply lt_lt_succ].
+induct n; [apply lt_succ_diag_r | intros n H; now apply lt_lt_succ_r].
Qed.
-Theorem lt_lt_0 : forall n m, n < m -> 0 < m.
+Theorem neq_0_lt_0 : forall n : N, n ~= 0 <-> 0 < n.
+Proof.
+cases n.
+split; intro H; [now elim H | intro; now apply lt_irrefl with 0].
+intro n; split; intro H; [apply lt_0_succ | apply neq_succ_0].
+Qed.
+
+Theorem eq_0_gt_0_cases : forall n : N, n == 0 \/ 0 < n.
+Proof.
+cases n.
+now left.
+intro; right; apply lt_0_succ.
+Qed.
+
+Theorem zero_one : forall n : N, n == 0 \/ n == 1 \/ 1 < n.
+Proof.
+induct n. now left.
+cases n. intros; right; now left.
+intros n IH. destruct IH as [H | [H | H]].
+false_hyp H neq_succ_0.
+right; right. rewrite H. apply lt_succ_diag_r.
+right; right. now apply lt_lt_succ_r.
+Qed.
+
+Theorem lt_1_r : forall n : N, n < 1 <-> n == 0.
+Proof.
+cases n.
+split; intro; [reflexivity | apply lt_succ_diag_r].
+intros n. rewrite <- succ_lt_mono.
+split; intro H; [false_hyp H nlt_0_r | false_hyp H neq_succ_0].
+Qed.
+
+Theorem le_1_r : forall n : N, n <= 1 <-> n == 0 \/ n == 1.
+Proof.
+cases n.
+split; intro; [now left | apply le_succ_diag_r].
+intro n. rewrite <- succ_le_mono, le_0_r, succ_inj_wd.
+split; [intro; now right | intros [H | H]; [false_hyp H neq_succ_0 | assumption]].
+Qed.
+
+Theorem lt_lt_0 : forall n m : N, n < m -> 0 < m.
Proof.
intros n m; induct n.
trivial.
-intros n IH H. apply IH; now apply lt_succ_lt.
+intros n IH H. apply IH; now apply lt_succ_l.
Qed.
-Theorem neq_0_lt_0 : forall n, n ~= 0 <-> 0 < n.
+Theorem lt_1_l : forall n m p : N, n < m -> m < p -> 1 < p.
Proof.
-cases n.
-split; intro H; [now elim H | intro; now apply lt_irrefl with 0].
-intro n; split; intro H; [apply lt_0_succ | apply neq_succ_0].
+intros n m p H1 H2.
+apply le_lt_trans with m. apply <- le_succ_l. apply le_lt_trans with n.
+apply le_0_l. assumption. assumption.
Qed.
(** Elimination principlies for < and <= for relations *)
@@ -357,30 +404,30 @@ Add Morphism R with signature Neq ==> Neq ==> iff as R_morph2.
Proof R_wd.
Theorem le_ind_rel :
- (forall m, R 0 m) ->
- (forall n m, n <= m -> R n m -> R (S n) (S m)) ->
- forall n m, n <= m -> R n m.
+ (forall m : N, R 0 m) ->
+ (forall n m : N, n <= m -> R n m -> R (S n) (S m)) ->
+ forall n m : N, n <= m -> R n m.
Proof.
intros Base Step; induct n.
intros; apply Base.
intros n IH m H. elim H using le_ind.
solve_predicate_wd.
-apply Step; [| apply IH]; now le_equal.
-intros k H1 H2. apply le_succ_le in H1. auto.
+apply Step; [| apply IH]; now apply eq_le_incl.
+intros k H1 H2. apply -> le_succ_l in H1. apply lt_le_incl in H1. auto.
Qed.
Theorem lt_ind_rel :
- (forall m, R 0 (S m)) ->
- (forall n m, n < m -> R n m -> R (S n) (S m)) ->
- forall n m, n < m -> R n m.
+ (forall m : N, R 0 (S m)) ->
+ (forall n m : N, n < m -> R n m -> R (S n) (S m)) ->
+ forall n m : N, n < m -> R n m.
Proof.
intros Base Step; induct n.
intros m H. apply lt_exists_pred in H; destruct H as [m' [H _]].
rewrite H; apply Base.
intros n IH m H. elim H using lt_ind.
solve_predicate_wd.
-apply Step; [| apply IH]; now apply lt_succ_r.
-intros k H1 H2. apply lt_succ_lt in H1. auto.
+apply Step; [| apply IH]; now apply lt_succ_diag_r.
+intros k H1 H2. apply lt_succ_l in H1. auto.
Qed.
End RelElim.
@@ -396,15 +443,15 @@ Qed.
Theorem le_pred_l : forall n : N, P n <= n.
Proof.
cases n.
-rewrite pred_0; le_equal.
-intros; rewrite pred_succ; apply le_succ_r.
+rewrite pred_0; now apply eq_le_incl.
+intros; rewrite pred_succ; apply le_succ_diag_r.
Qed.
Theorem lt_pred_l : forall n : N, n ~= 0 -> P n < n.
Proof.
cases n.
intro H; elimtype False; now apply H.
-intros; rewrite pred_succ; apply lt_succ_r.
+intros; rewrite pred_succ; apply lt_succ_diag_r.
Qed.
Theorem le_le_pred : forall n m : N, n <= m -> P n <= m.
@@ -421,14 +468,14 @@ Theorem lt_le_pred : forall n m : N, n < m -> n <= P m. (* Converse is false for
Proof.
intro n; cases m.
intro H; false_hyp H nlt_0_r.
-intros m IH. rewrite pred_succ; now apply -> lt_succ_le.
+intros m IH. rewrite pred_succ; now apply -> lt_succ_r.
Qed.
Theorem lt_pred_le : forall n m : N, P n < m -> n <= m. (* Converse is false for n == m == 0 *)
Proof.
intros n m; cases n.
-rewrite pred_0; intro H; le_less.
-intros n IH. rewrite pred_succ in IH. now apply -> lt_le_succ.
+rewrite pred_0; intro H; now apply lt_le_incl.
+intros n IH. rewrite pred_succ in IH. now apply <- le_succ_l.
Qed.
Theorem lt_pred_lt : forall n m : N, n < P m -> n < m.
@@ -467,12 +514,12 @@ Qed.
Theorem le_succ_le_pred : forall n m : N, S n <= m -> n <= P m. (* Converse is false for n == m == 0 *)
Proof.
-intros n m H. apply lt_le_pred. now apply <- lt_le_succ.
+intros n m H. apply lt_le_pred. now apply -> le_succ_l.
Qed.
Theorem lt_pred_lt_succ : forall n m : N, P n < m -> n < S m. (* Converse is false for n == m == 0 *)
Proof.
-intros n m H. apply <- lt_succ_le. now apply lt_pred_le.
+intros n m H. apply <- lt_succ_r. now apply lt_pred_le.
Qed.
Theorem le_pred_le_succ : forall n m : N, P n <= m <-> n <= S m.
diff --git a/theories/Numbers/Natural/Abstract/NPlus.v b/theories/Numbers/Natural/Abstract/NPlus.v
index a033d95a09..d1269cf03f 100644
--- a/theories/Numbers/Natural/Abstract/NPlus.v
+++ b/theories/Numbers/Natural/Abstract/NPlus.v
@@ -61,7 +61,7 @@ Proof NZplus_cancel_r.
(** Theorems that are valid for natural numbers but cannot be proved for Z *)
-Theorem plus_eq_0 : forall n m : N, n + m == 0 <-> n == 0 /\ m == 0.
+Theorem eq_plus_0 : forall n m : N, n + m == 0 <-> n == 0 /\ m == 0.
Proof.
intros n m; induct n.
(* The next command does not work with the axiom plus_0_l from NPlusSig *)
@@ -73,7 +73,7 @@ setoid_replace (S n == 0) with False using relation iff by
(apply -> neg_false; apply neq_succ_0). tauto.
Qed.
-Theorem plus_eq_succ :
+Theorem eq_plus_succ :
forall n m : N, (exists p : N, n + m == S p) <->
(exists n' : N, n == S n') \/ (exists m' : N, m == S m').
Proof.
@@ -88,16 +88,16 @@ left; now exists n.
exists (n + m); now rewrite plus_succ_l.
Qed.
-Theorem plus_eq_1 : forall n m : N,
+Theorem eq_plus_1 : forall n m : N,
n + m == 1 -> n == 1 /\ m == 0 \/ n == 0 /\ m == 1.
Proof.
intros n m H.
assert (H1 : exists p : N, n + m == S p) by now exists 0.
-apply -> plus_eq_succ in H1. destruct H1 as [[n' H1] | [m' H1]].
+apply -> eq_plus_succ in H1. destruct H1 as [[n' H1] | [m' H1]].
left. rewrite H1 in H; rewrite plus_succ_l in H; apply succ_inj in H.
-apply -> plus_eq_0 in H. destruct H as [H2 H3]; rewrite H2 in H1; now split.
+apply -> eq_plus_0 in H. destruct H as [H2 H3]; rewrite H2 in H1; now split.
right. rewrite H1 in H; rewrite plus_succ_r in H; apply succ_inj in H.
-apply -> plus_eq_0 in H. destruct H as [H2 H3]; rewrite H3 in H1; now split.
+apply -> eq_plus_0 in H. destruct H as [H2 H3]; rewrite H3 in H1; now split.
Qed.
Theorem succ_plus_discr : forall n m : N, m ~= S (n + m).
diff --git a/theories/Numbers/Natural/Abstract/NTimes.v b/theories/Numbers/Natural/Abstract/NTimes.v
index 6a22e476da..e15f02a1ef 100644
--- a/theories/Numbers/Natural/Abstract/NTimes.v
+++ b/theories/Numbers/Natural/Abstract/NTimes.v
@@ -20,20 +20,20 @@ Theorem times_wd :
forall n1 n2 : N, n1 == n2 -> forall m1 m2 : N, m1 == m2 -> n1 * m1 == n2 * m2.
Proof NZtimes_wd.
-Theorem times_0_r : forall n, n * 0 == 0.
-Proof NZtimes_0_r.
-
-Theorem times_succ_r : forall n m, n * (S m) == n * m + n.
-Proof NZtimes_succ_r.
-
-(** Theorems that are valid for both natural numbers and integers *)
-
Theorem times_0_l : forall n : N, 0 * n == 0.
Proof NZtimes_0_l.
Theorem times_succ_l : forall n m : N, (S n) * m == n * m + m.
Proof NZtimes_succ_l.
+(** Theorems that are valid for both natural numbers and integers *)
+
+Theorem times_0_r : forall n, n * 0 == 0.
+Proof NZtimes_0_r.
+
+Theorem times_succ_r : forall n m, n * (S m) == n * m + n.
+Proof NZtimes_succ_r.
+
Theorem times_comm : forall n m : N, n * m == m * n.
Proof NZtimes_comm.
@@ -54,28 +54,6 @@ Proof NZtimes_1_r.
(** Theorems that cannot be proved in NZTimes *)
-Theorem times_eq_0 : forall n m, n * m == 0 -> n == 0 \/ m == 0.
-Proof.
-induct n; induct m.
-intros; now left.
-intros; now left.
-intros; now right.
-intros m IH H1. rewrite times_succ_l in H1.
-rewrite plus_succ_r in H1. now apply neq_succ_0 in H1.
-Qed.
-
-Theorem times_eq_1 : forall n m : N, n * m == 1 -> n == 1 /\ m == 1.
-Proof.
-intros n m; induct n.
-intro H; rewrite times_0_l in H; symmetry in H; false_hyp H neq_succ_0.
-intros n IH H. rewrite times_succ_l in H. apply plus_eq_1 in H.
-destruct H as [[H1 H2] | [H1 H2]].
-apply IH in H1. destruct H1 as [_ H1]. rewrite H1 in H2; false_hyp H2 neq_succ_0.
-apply times_eq_0 in H1. destruct H1 as [H1 | H1].
-rewrite H1; now split.
-rewrite H2 in H1; false_hyp H1 neq_succ_0.
-Qed.
-
(* In proving the correctness of the definition of multiplication on
integers constructed from pairs of natural numbers, we'll need the
following fact about natural numbers:
diff --git a/theories/Numbers/Natural/Abstract/NTimesOrder.v b/theories/Numbers/Natural/Abstract/NTimesOrder.v
index ec010ecee9..d6c0bfafa1 100644
--- a/theories/Numbers/Natural/Abstract/NTimesOrder.v
+++ b/theories/Numbers/Natural/Abstract/NTimesOrder.v
@@ -10,118 +10,56 @@
(*i i*)
-Require Export NOrder.
+Require Export NPlusOrder.
Module NTimesOrderPropFunct (Import NAxiomsMod : NAxiomsSig).
-Module Export NOrderPropMod := NOrderPropFunct NAxiomsMod.
+Module Export NPlusOrderPropMod := NPlusOrderPropFunct NAxiomsMod.
Open Local Scope NatScope.
-Theorem plus_lt_mono_l : forall n m p : N, n < m <-> p + n < p + m.
-Proof NZplus_lt_mono_l.
-
-Theorem plus_lt_mono_r : forall n m p : N, n < m <-> n + p < m + p.
-Proof NZplus_lt_mono_r.
-
-Theorem plus_lt_mono : forall n m p q : N, n < m -> p < q -> n + p < m + q.
-Proof NZplus_lt_mono.
-
-Theorem plus_le_mono_l : forall n m p : N, n <= m <-> p + n <= p + m.
-Proof NZplus_le_mono_l.
-
-Theorem plus_le_mono_r : forall n m p : N, n <= m <-> n + p <= m + p.
-Proof NZplus_le_mono_r.
-
-Theorem plus_le_mono : forall n m p q : N, n <= m -> p <= q -> n + p <= m + q.
-Proof NZplus_le_mono.
-
-Theorem plus_lt_le_mono : forall n m p q : N, n < m -> p <= q -> n + p < m + q.
-Proof NZplus_lt_le_mono.
-
-Theorem plus_le_lt_mono : forall n m p q : N, n <= m -> p < q -> n + p < m + q.
-Proof NZplus_le_lt_mono.
-
-Theorem plus_pos_pos : forall n m : N, 0 < n -> 0 < m -> 0 < n + m.
-Proof NZplus_pos_pos.
-
-Theorem lt_plus_pos_l : forall n m : N, 0 < n -> m < n + m.
-Proof NZlt_plus_pos_l.
-
-Theorem lt_plus_pos_r : forall n m : N, 0 < n -> m < m + n.
-Proof NZlt_plus_pos_r.
-
-Theorem le_lt_plus_lt : forall n m p q : N, n <= m -> p + m < q + n -> p < q.
-Proof NZle_lt_plus_lt.
-
-Theorem lt_le_plus_lt : forall n m p q : N, n < m -> p + m <= q + n -> p < q.
-Proof NZlt_le_plus_lt.
-
-Theorem le_le_plus_le : forall n m p q : N, n <= m -> p + m <= q + n -> p <= q.
-Proof NZle_le_plus_le.
-
-Theorem plus_lt_cases : forall n m p q : N, n + m < p + q -> n < p \/ m < q.
-Proof NZplus_lt_cases.
+Theorem times_lt_pred :
+ forall p q n m : N, S p == q -> (p * n < p * m <-> q * n + m < q * m + n).
+Proof NZtimes_lt_pred.
-Theorem plus_le_cases : forall n m p q : N, n + m <= p + q -> n <= p \/ m <= q.
-Proof NZplus_le_cases.
+Theorem times_lt_mono_pos_l : forall p n m : N, 0 < p -> (n < m <-> p * n < p * m).
+Proof NZtimes_lt_mono_pos_l.
-Theorem plus_pos_cases : forall n m : N, 0 < n + m -> 0 < n \/ 0 < m.
-Proof NZplus_pos_cases.
+Theorem times_lt_mono_pos_r : forall p n m : N, 0 < p -> (n < m <-> n * p < m * p).
+Proof NZtimes_lt_mono_pos_r.
-(** Theorems true for natural numbers *)
+Theorem times_cancel_l : forall n m p : N, p ~= 0 -> (p * n == p * m <-> n == m).
+Proof NZtimes_cancel_l.
-Theorem le_plus_r : forall n m : N, n <= n + m.
-Proof.
-intro n; induct m.
-rewrite plus_0_r; le_equal.
-intros m IH. rewrite plus_succ_r; now apply le_le_succ.
-Qed.
+Theorem times_cancel_r : forall n m p : N, p ~= 0 -> (n * p == m * p <-> n == m).
+Proof NZtimes_cancel_r.
-Theorem lt_lt_plus_r : forall n m p : N, n < m -> n < m + p.
-Proof.
-intros n m p H; rewrite <- (plus_0_r n).
-apply plus_lt_le_mono; [assumption | apply le_0_l].
-Qed.
+Theorem times_le_mono_pos_l : forall n m p : N, 0 < p -> (n <= m <-> p * n <= p * m).
+Proof NZtimes_le_mono_pos_l.
-Theorem lt_lt_plus_l : forall n m p : N, n < m -> n < p + m.
-Proof.
-intros n m p; rewrite plus_comm; apply lt_lt_plus_r.
-Qed.
+Theorem times_le_mono_pos_r : forall n m p : N, 0 < p -> (n <= m <-> n * p <= m * p).
+Proof NZtimes_le_mono_pos_r.
-Theorem plus_pos_l : forall n m : N, 0 < n -> 0 < n + m.
-Proof.
-intros; apply NZplus_pos_nonneg. assumption. apply le_0_l.
-Qed.
+Theorem times_pos_pos : forall n m : N, 0 < n -> 0 < m -> 0 < n * m.
+Proof NZtimes_pos_pos.
-Theorem plus_pos_r : forall n m : N, 0 < m -> 0 < n + m.
-Proof.
-intros; apply NZplus_nonneg_pos. apply le_0_l. assumption.
-Qed.
+Theorem lt_1_times_pos : forall n m : N, 1 < n -> 0 < m -> 1 < n * m.
+Proof NZlt_1_times_pos.
-(* The following property is used to prove the correctness of the
-definition of order on integers constructed from pairs of natural numbers *)
+Theorem eq_times_0 : forall n m : N, n * m == 0 <-> n == 0 \/ m == 0.
+Proof NZeq_times_0.
-Theorem plus_lt_repl_pair : forall n m n' m' u v : N,
- n + u < m + v -> n + m' == n' + m -> n' + u < m' + v.
-Proof.
-intros n m n' m' u v H1 H2.
-symmetry in H2. assert (H3 : n' + m <= n + m') by now le_equal.
-pose proof (plus_lt_le_mono _ _ _ _ H1 H3) as H4.
-rewrite (plus_shuffle2 n u), (plus_shuffle1 m v), (plus_comm m n) in H4.
-do 2 rewrite <- plus_assoc in H4. do 2 apply <- plus_lt_mono_l in H4.
-now rewrite (plus_comm n' u), (plus_comm m' v).
-Qed.
+Theorem neq_times_0 : forall n m : N, n ~= 0 /\ m ~= 0 <-> n * m ~= 0.
+Proof NZneq_times_0.
-(** Multiplication and order *)
+Theorem eq_times_0_l : forall n m : N, n * m == 0 -> m ~= 0 -> n == 0.
+Proof NZeq_times_0_l.
-Theorem times_lt_pred :
- forall p q n m : N, S p == q -> (p * n < p * m <-> q * n + m < q * m + n).
-Proof NZtimes_lt_pred.
+Theorem eq_times_0_r : forall n m : N, n * m == 0 -> n ~= 0 -> m == 0.
+Proof NZeq_times_0_r.
-Theorem times_lt_mono_pos_l : forall p n m : N, 0 < p -> (n < m <-> p * n < p * m).
-Proof NZtimes_lt_mono_pos_l.
+Theorem times_2_mono_l : forall n m : N, n < m -> 1 + (1 + 1) * n < (1 + 1) * m.
+Proof NZtimes_2_mono_l.
-Theorem times_lt_mono_pos_r : forall p n m : N, 0 < p -> (n < m <-> n * p < m * p).
-Proof NZtimes_lt_mono_pos_r.
+(** Theorems that are either not valid on Z or have different proofs on N and Z *)
Theorem times_le_mono_l : forall n m p : N, n <= m -> p * n <= p * m.
Proof.
@@ -133,18 +71,6 @@ Proof.
intros; apply NZtimes_le_mono_nonneg_r. apply le_0_l. assumption.
Qed.
-Theorem times_cancel_l : forall n m p : N, p ~= 0 -> (p * n == p * m <-> n == m).
-Proof NZtimes_cancel_l.
-
-Theorem times_cancel_r : forall n m p : N, p ~= 0 -> (n * p == m * p <-> n == m).
-Proof NZtimes_cancel_r.
-
-Theorem times_le_mono_pos_l : forall n m p : N, 0 < p -> (n <= m <-> p * n <= p * m).
-Proof NZtimes_le_mono_pos_l.
-
-Theorem times_le_mono_pos_r : forall n m p : N, 0 < p -> (n <= m <-> n * p <= m * p).
-Proof NZtimes_le_mono_pos_r.
-
Theorem times_lt_mono : forall n m p q : N, n < m -> p < q -> n * p < m * q.
Proof.
intros; apply NZtimes_lt_mono; try assumption; apply le_0_l.
@@ -155,18 +81,6 @@ Proof.
intros; apply NZtimes_le_mono; try assumption; apply le_0_l.
Qed.
-Theorem Ztimes_pos_pos : forall n m : N, 0 < n -> 0 < m -> 0 < n * m.
-Proof NZtimes_pos_pos.
-
-Theorem times_eq_0 : forall n m : N, n * m == 0 -> n == 0 \/ m == 0.
-Proof NZtimes_eq_0.
-
-Theorem times_neq_0 : forall n m : N, n ~= 0 /\ m ~= 0 <-> n * m ~= 0.
-Proof NZtimes_neq_0.
-
-Theorem times_2_mono_l : forall n m : N, n < m -> 1 + (1 + 1) * n < (1 + 1) * m.
-Proof NZtimes_2_mono_l.
-
Theorem times_pos : forall n m : N, n * m > 0 <-> n > 0 /\ m > 0.
Proof.
intros n m; split; [intro H | intros [H1 H2]].
@@ -174,5 +88,19 @@ apply -> NZtimes_pos in H. destruct H as [[H1 H2] | [H1 H2]]. now split. false_h
now apply NZtimes_pos_pos.
Qed.
+Theorem eq_times_1 : forall n m : N, n * m == 1 <-> n == 1 /\ m == 1.
+Proof.
+intros n m.
+split; [| intros [H1 H2]; now rewrite H1, H2, times_1_l].
+intro H; destruct (NZlt_trichotomy n 1) as [H1 | [H1 | H1]].
+apply -> lt_1_r in H1. rewrite H1, times_0_l in H. false_hyp H neq_0_succ.
+rewrite H1, times_1_l in H; now split.
+destruct (eq_0_gt_0_cases m) as [H2 | H2].
+rewrite H2, times_0_r in H; false_hyp H neq_0_succ.
+apply -> (times_lt_mono_pos_r m) in H1; [| assumption]. rewrite times_1_l in H1.
+assert (H3 : 1 < n * m) by now apply (lt_1_l 0 m).
+rewrite H in H3; false_hyp H3 lt_irrefl.
+Qed.
+
End NTimesOrderPropFunct.
diff --git a/theories/Numbers/Natural/Binary/NBinDefs.v b/theories/Numbers/Natural/Binary/NBinDefs.v
index 9a5ff0e4ba..66402f7614 100644
--- a/theories/Numbers/Natural/Binary/NBinDefs.v
+++ b/theories/Numbers/Natural/Binary/NBinDefs.v
@@ -247,16 +247,15 @@ simpl. rewrite Pminus_mask_succ_r, Pminus_mask_carry_spec.
now destruct (Pminus_mask p q) as [| r |]; [| destruct r |].
Qed.
-Theorem NZtimes_0_r : forall n : NZ, n * N0 = N0.
+Theorem NZtimes_0_l : forall n : NZ, N0 * n = N0.
Proof.
destruct n; reflexivity.
Qed.
-Theorem NZtimes_succ_r : forall n m : NZ, n * (NZsucc m) = n * m + n.
+Theorem NZtimes_succ_l : forall n m : NZ, (NZsucc n) * m = n * m + m.
Proof.
destruct n as [| n]; destruct m as [| m]; simpl; try reflexivity.
-now rewrite Pmult_1_r.
-now rewrite (Pmult_comm n (Psucc m)), Pmult_Sn_m, (Pplus_comm n), Pmult_comm.
+now rewrite Pmult_Sn_m, Pplus_comm.
Qed.
End NZAxiomsMod.
@@ -286,7 +285,7 @@ Proof.
congruence.
Qed.
-Theorem NZle_lt_or_eq : forall n m : N, n <= m <-> n < m \/ n = m.
+Theorem NZlt_eq_cases : forall n m : N, n <= m <-> n < m \/ n = m.
Proof.
intros n m. unfold le, lt. rewrite <- Ncompare_eq_correct.
destruct (n ?= m); split; intro H1; (try discriminate); try (now left); try now right.
@@ -298,7 +297,7 @@ Proof.
intro n; unfold lt; now rewrite Ncompare_diag.
Qed.
-Theorem NZlt_succ_le : forall n m : NZ, n < (NZsucc m) <-> n <= m.
+Theorem NZlt_succ_r : forall n m : NZ, n < (NZsucc m) <-> n <= m.
Proof.
intros n m; unfold lt, le; destruct n as [| p]; destruct m as [| q]; simpl;
split; intro H; try reflexivity; try discriminate.
diff --git a/theories/Numbers/Natural/Peano/NPeano.v b/theories/Numbers/Natural/Peano/NPeano.v
index 14899ed1dc..26a6053eb1 100644
--- a/theories/Numbers/Natural/Peano/NPeano.v
+++ b/theories/Numbers/Natural/Peano/NPeano.v
@@ -98,14 +98,14 @@ Proof.
intros n m; induction n m using nat_double_ind; simpl; auto. apply NZminus_0_r.
Qed.
-Theorem NZtimes_0_r : forall n : nat, n * 0 = 0.
+Theorem NZtimes_0_l : forall n : nat, 0 * n = 0.
Proof.
-exact mult_0_r.
+reflexivity.
Qed.
-Theorem NZtimes_succ_r : forall n m : nat, n * (S m) = n * m + n.
+Theorem NZtimes_succ_l : forall n m : nat, S n * m = n * m + m.
Proof.
-intros n m; symmetry; apply mult_n_Sm.
+intros n m; now rewrite plus_comm.
Qed.
End NZAxiomsMod.
@@ -135,7 +135,7 @@ Proof.
congruence.
Qed.
-Theorem NZle_lt_or_eq : forall n m : nat, n <= m <-> n < m \/ n = m.
+Theorem NZlt_eq_cases : forall n m : nat, n <= m <-> n < m \/ n = m.
Proof.
intros n m; split.
apply le_lt_or_eq.
@@ -148,7 +148,7 @@ Proof.
exact lt_irrefl.
Qed.
-Theorem NZlt_succ_le : forall n m : nat, n < S m <-> n <= m.
+Theorem NZlt_succ_r : forall n m : nat, n < S m <-> n <= m.
Proof.
intros n m; split; [apply lt_n_Sm_le | apply le_lt_n_Sm].
Qed.