1
(************************************************************************)
2
(* v * The Coq Proof Assistant / The Coq Development Team *)
3
(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
4
(* \VV/ **************************************************************)
5
(* // * This file is distributed under the terms of the *)
6
(* * GNU Lesser General Public License Version 2.1 *)
7
(************************************************************************)
8
(* Evgeny Makarov, INRIA, 2007 *)
9
(************************************************************************)
11
(*i $Id: ZAddOrder.v 11040 2008-06-03 00:04:16Z letouzey $ i*)
15
Module ZAddOrderPropFunct (Import ZAxiomsMod : ZAxiomsSig).
16
Module Export ZOrderPropMod := ZOrderPropFunct ZAxiomsMod.
17
Open Local Scope IntScope.
19
(* Theorems that are true on both natural numbers and integers *)
21
Theorem Zadd_lt_mono_l : forall n m p : Z, n < m <-> p + n < p + m.
22
Proof NZadd_lt_mono_l.
24
Theorem Zadd_lt_mono_r : forall n m p : Z, n < m <-> n + p < m + p.
25
Proof NZadd_lt_mono_r.
27
Theorem Zadd_lt_mono : forall n m p q : Z, n < m -> p < q -> n + p < m + q.
30
Theorem Zadd_le_mono_l : forall n m p : Z, n <= m <-> p + n <= p + m.
31
Proof NZadd_le_mono_l.
33
Theorem Zadd_le_mono_r : forall n m p : Z, n <= m <-> n + p <= m + p.
34
Proof NZadd_le_mono_r.
36
Theorem Zadd_le_mono : forall n m p q : Z, n <= m -> p <= q -> n + p <= m + q.
39
Theorem Zadd_lt_le_mono : forall n m p q : Z, n < m -> p <= q -> n + p < m + q.
40
Proof NZadd_lt_le_mono.
42
Theorem Zadd_le_lt_mono : forall n m p q : Z, n <= m -> p < q -> n + p < m + q.
43
Proof NZadd_le_lt_mono.
45
Theorem Zadd_pos_pos : forall n m : Z, 0 < n -> 0 < m -> 0 < n + m.
48
Theorem Zadd_pos_nonneg : forall n m : Z, 0 < n -> 0 <= m -> 0 < n + m.
49
Proof NZadd_pos_nonneg.
51
Theorem Zadd_nonneg_pos : forall n m : Z, 0 <= n -> 0 < m -> 0 < n + m.
52
Proof NZadd_nonneg_pos.
54
Theorem Zadd_nonneg_nonneg : forall n m : Z, 0 <= n -> 0 <= m -> 0 <= n + m.
55
Proof NZadd_nonneg_nonneg.
57
Theorem Zlt_add_pos_l : forall n m : Z, 0 < n -> m < n + m.
60
Theorem Zlt_add_pos_r : forall n m : Z, 0 < n -> m < m + n.
63
Theorem Zle_lt_add_lt : forall n m p q : Z, n <= m -> p + m < q + n -> p < q.
66
Theorem Zlt_le_add_lt : forall n m p q : Z, n < m -> p + m <= q + n -> p < q.
69
Theorem Zle_le_add_le : forall n m p q : Z, n <= m -> p + m <= q + n -> p <= q.
72
Theorem Zadd_lt_cases : forall n m p q : Z, n + m < p + q -> n < p \/ m < q.
75
Theorem Zadd_le_cases : forall n m p q : Z, n + m <= p + q -> n <= p \/ m <= q.
78
Theorem Zadd_neg_cases : forall n m : Z, n + m < 0 -> n < 0 \/ m < 0.
79
Proof NZadd_neg_cases.
81
Theorem Zadd_pos_cases : forall n m : Z, 0 < n + m -> 0 < n \/ 0 < m.
82
Proof NZadd_pos_cases.
84
Theorem Zadd_nonpos_cases : forall n m : Z, n + m <= 0 -> n <= 0 \/ m <= 0.
85
Proof NZadd_nonpos_cases.
87
Theorem Zadd_nonneg_cases : forall n m : Z, 0 <= n + m -> 0 <= n \/ 0 <= m.
88
Proof NZadd_nonneg_cases.
90
(* Theorems that are either not valid on N or have different proofs on N and Z *)
92
Theorem Zadd_neg_neg : forall n m : Z, n < 0 -> m < 0 -> n + m < 0.
94
intros n m H1 H2. rewrite <- (Zadd_0_l 0). now apply Zadd_lt_mono.
97
Theorem Zadd_neg_nonpos : forall n m : Z, n < 0 -> m <= 0 -> n + m < 0.
99
intros n m H1 H2. rewrite <- (Zadd_0_l 0). now apply Zadd_lt_le_mono.
102
Theorem Zadd_nonpos_neg : forall n m : Z, n <= 0 -> m < 0 -> n + m < 0.
104
intros n m H1 H2. rewrite <- (Zadd_0_l 0). now apply Zadd_le_lt_mono.
107
Theorem Zadd_nonpos_nonpos : forall n m : Z, n <= 0 -> m <= 0 -> n + m <= 0.
109
intros n m H1 H2. rewrite <- (Zadd_0_l 0). now apply Zadd_le_mono.
114
Theorem Zlt_0_sub : forall n m : Z, 0 < m - n <-> n < m.
116
intros n m. stepl (0 + n < m - n + n) by symmetry; apply Zadd_lt_mono_r.
117
rewrite Zadd_0_l; now rewrite Zsub_simpl_r.
120
Notation Zsub_pos := Zlt_0_sub (only parsing).
122
Theorem Zle_0_sub : forall n m : Z, 0 <= m - n <-> n <= m.
124
intros n m; stepl (0 + n <= m - n + n) by symmetry; apply Zadd_le_mono_r.
125
rewrite Zadd_0_l; now rewrite Zsub_simpl_r.
128
Notation Zsub_nonneg := Zle_0_sub (only parsing).
130
Theorem Zlt_sub_0 : forall n m : Z, n - m < 0 <-> n < m.
132
intros n m. stepl (n - m + m < 0 + m) by symmetry; apply Zadd_lt_mono_r.
133
rewrite Zadd_0_l; now rewrite Zsub_simpl_r.
136
Notation Zsub_neg := Zlt_sub_0 (only parsing).
138
Theorem Zle_sub_0 : forall n m : Z, n - m <= 0 <-> n <= m.
140
intros n m. stepl (n - m + m <= 0 + m) by symmetry; apply Zadd_le_mono_r.
141
rewrite Zadd_0_l; now rewrite Zsub_simpl_r.
144
Notation Zsub_nonpos := Zle_sub_0 (only parsing).
146
Theorem Zopp_lt_mono : forall n m : Z, n < m <-> - m < - n.
148
intros n m. stepr (m + - m < m + - n) by symmetry; apply Zadd_lt_mono_l.
149
do 2 rewrite Zadd_opp_r. rewrite Zsub_diag. symmetry; apply Zlt_0_sub.
152
Theorem Zopp_le_mono : forall n m : Z, n <= m <-> - m <= - n.
154
intros n m. stepr (m + - m <= m + - n) by symmetry; apply Zadd_le_mono_l.
155
do 2 rewrite Zadd_opp_r. rewrite Zsub_diag. symmetry; apply Zle_0_sub.
158
Theorem Zopp_pos_neg : forall n : Z, 0 < - n <-> n < 0.
160
intro n; rewrite (Zopp_lt_mono n 0); now rewrite Zopp_0.
163
Theorem Zopp_neg_pos : forall n : Z, - n < 0 <-> 0 < n.
165
intro n. rewrite (Zopp_lt_mono 0 n). now rewrite Zopp_0.
168
Theorem Zopp_nonneg_nonpos : forall n : Z, 0 <= - n <-> n <= 0.
170
intro n; rewrite (Zopp_le_mono n 0); now rewrite Zopp_0.
173
Theorem Zopp_nonpos_nonneg : forall n : Z, - n <= 0 <-> 0 <= n.
175
intro n. rewrite (Zopp_le_mono 0 n). now rewrite Zopp_0.
178
Theorem Zsub_lt_mono_l : forall n m p : Z, n < m <-> p - m < p - n.
180
intros n m p. do 2 rewrite <- Zadd_opp_r. rewrite <- Zadd_lt_mono_l.
184
Theorem Zsub_lt_mono_r : forall n m p : Z, n < m <-> n - p < m - p.
186
intros n m p; do 2 rewrite <- Zadd_opp_r; apply Zadd_lt_mono_r.
189
Theorem Zsub_lt_mono : forall n m p q : Z, n < m -> q < p -> n - p < m - q.
191
intros n m p q H1 H2.
192
apply NZlt_trans with (m - p);
193
[now apply -> Zsub_lt_mono_r | now apply -> Zsub_lt_mono_l].
196
Theorem Zsub_le_mono_l : forall n m p : Z, n <= m <-> p - m <= p - n.
198
intros n m p; do 2 rewrite <- Zadd_opp_r; rewrite <- Zadd_le_mono_l;
202
Theorem Zsub_le_mono_r : forall n m p : Z, n <= m <-> n - p <= m - p.
204
intros n m p; do 2 rewrite <- Zadd_opp_r; apply Zadd_le_mono_r.
207
Theorem Zsub_le_mono : forall n m p q : Z, n <= m -> q <= p -> n - p <= m - q.
209
intros n m p q H1 H2.
210
apply NZle_trans with (m - p);
211
[now apply -> Zsub_le_mono_r | now apply -> Zsub_le_mono_l].
214
Theorem Zsub_lt_le_mono : forall n m p q : Z, n < m -> q <= p -> n - p < m - q.
216
intros n m p q H1 H2.
217
apply NZlt_le_trans with (m - p);
218
[now apply -> Zsub_lt_mono_r | now apply -> Zsub_le_mono_l].
221
Theorem Zsub_le_lt_mono : forall n m p q : Z, n <= m -> q < p -> n - p < m - q.
223
intros n m p q H1 H2.
224
apply NZle_lt_trans with (m - p);
225
[now apply -> Zsub_le_mono_r | now apply -> Zsub_lt_mono_l].
228
Theorem Zle_lt_sub_lt : forall n m p q : Z, n <= m -> p - n < q - m -> p < q.
230
intros n m p q H1 H2. apply (Zle_lt_add_lt (- m) (- n));
231
[now apply -> Zopp_le_mono | now do 2 rewrite Zadd_opp_r].
234
Theorem Zlt_le_sub_lt : forall n m p q : Z, n < m -> p - n <= q - m -> p < q.
236
intros n m p q H1 H2. apply (Zlt_le_add_lt (- m) (- n));
237
[now apply -> Zopp_lt_mono | now do 2 rewrite Zadd_opp_r].
240
Theorem Zle_le_sub_lt : forall n m p q : Z, n <= m -> p - n <= q - m -> p <= q.
242
intros n m p q H1 H2. apply (Zle_le_add_le (- m) (- n));
243
[now apply -> Zopp_le_mono | now do 2 rewrite Zadd_opp_r].
246
Theorem Zlt_add_lt_sub_r : forall n m p : Z, n + p < m <-> n < m - p.
248
intros n m p. stepl (n + p - p < m - p) by symmetry; apply Zsub_lt_mono_r.
249
now rewrite Zadd_simpl_r.
252
Theorem Zle_add_le_sub_r : forall n m p : Z, n + p <= m <-> n <= m - p.
254
intros n m p. stepl (n + p - p <= m - p) by symmetry; apply Zsub_le_mono_r.
255
now rewrite Zadd_simpl_r.
258
Theorem Zlt_add_lt_sub_l : forall n m p : Z, n + p < m <-> p < m - n.
260
intros n m p. rewrite Zadd_comm; apply Zlt_add_lt_sub_r.
263
Theorem Zle_add_le_sub_l : forall n m p : Z, n + p <= m <-> p <= m - n.
265
intros n m p. rewrite Zadd_comm; apply Zle_add_le_sub_r.
268
Theorem Zlt_sub_lt_add_r : forall n m p : Z, n - p < m <-> n < m + p.
270
intros n m p. stepl (n - p + p < m + p) by symmetry; apply Zadd_lt_mono_r.
271
now rewrite Zsub_simpl_r.
274
Theorem Zle_sub_le_add_r : forall n m p : Z, n - p <= m <-> n <= m + p.
276
intros n m p. stepl (n - p + p <= m + p) by symmetry; apply Zadd_le_mono_r.
277
now rewrite Zsub_simpl_r.
280
Theorem Zlt_sub_lt_add_l : forall n m p : Z, n - m < p <-> n < m + p.
282
intros n m p. rewrite Zadd_comm; apply Zlt_sub_lt_add_r.
285
Theorem Zle_sub_le_add_l : forall n m p : Z, n - m <= p <-> n <= m + p.
287
intros n m p. rewrite Zadd_comm; apply Zle_sub_le_add_r.
290
Theorem Zlt_sub_lt_add : forall n m p q : Z, n - m < p - q <-> n + q < m + p.
292
intros n m p q. rewrite Zlt_sub_lt_add_l. rewrite Zadd_sub_assoc.
293
now rewrite <- Zlt_add_lt_sub_r.
296
Theorem Zle_sub_le_add : forall n m p q : Z, n - m <= p - q <-> n + q <= m + p.
298
intros n m p q. rewrite Zle_sub_le_add_l. rewrite Zadd_sub_assoc.
299
now rewrite <- Zle_add_le_sub_r.
302
Theorem Zlt_sub_pos : forall n m : Z, 0 < m <-> n - m < n.
304
intros n m. stepr (n - m < n - 0) by now rewrite Zsub_0_r. apply Zsub_lt_mono_l.
307
Theorem Zle_sub_nonneg : forall n m : Z, 0 <= m <-> n - m <= n.
309
intros n m. stepr (n - m <= n - 0) by now rewrite Zsub_0_r. apply Zsub_le_mono_l.
312
Theorem Zsub_lt_cases : forall n m p q : Z, n - m < p - q -> n < m \/ q < p.
314
intros n m p q H. rewrite Zlt_sub_lt_add in H. now apply Zadd_lt_cases.
317
Theorem Zsub_le_cases : forall n m p q : Z, n - m <= p - q -> n <= m \/ q <= p.
319
intros n m p q H. rewrite Zle_sub_le_add in H. now apply Zadd_le_cases.
322
Theorem Zsub_neg_cases : forall n m : Z, n - m < 0 -> n < 0 \/ 0 < m.
324
intros n m H; rewrite <- Zadd_opp_r in H.
325
setoid_replace (0 < m) with (- m < 0) using relation iff by (symmetry; apply Zopp_neg_pos).
326
now apply Zadd_neg_cases.
329
Theorem Zsub_pos_cases : forall n m : Z, 0 < n - m -> 0 < n \/ m < 0.
331
intros n m H; rewrite <- Zadd_opp_r in H.
332
setoid_replace (m < 0) with (0 < - m) using relation iff by (symmetry; apply Zopp_pos_neg).
333
now apply Zadd_pos_cases.
336
Theorem Zsub_nonpos_cases : forall n m : Z, n - m <= 0 -> n <= 0 \/ 0 <= m.
338
intros n m H; rewrite <- Zadd_opp_r in H.
339
setoid_replace (0 <= m) with (- m <= 0) using relation iff by (symmetry; apply Zopp_nonpos_nonneg).
340
now apply Zadd_nonpos_cases.
343
Theorem Zsub_nonneg_cases : forall n m : Z, 0 <= n - m -> 0 <= n \/ m <= 0.
345
intros n m H; rewrite <- Zadd_opp_r in H.
346
setoid_replace (m <= 0) with (0 <= - m) using relation iff by (symmetry; apply Zopp_nonneg_nonpos).
347
now apply Zadd_nonneg_cases.
352
Variable P : Z -> Prop.
353
Hypothesis P_wd : predicate_wd Zeq P.
355
Add Morphism P with signature Zeq ==> iff as P_morph. Proof. exact P_wd. Qed.
358
P 0 -> (forall n : Z, 0 < n -> P n /\ P (- n)) -> forall n : Z, P n.
360
intros H1 H2 n. destruct (Zlt_trichotomy n 0) as [H3 | [H3 | H3]].
361
apply <- Zopp_pos_neg in H3. apply H2 in H3. destruct H3 as [_ H3].
362
now rewrite Zopp_involutive in H3.
364
apply H2 in H3; now destruct H3.
369
Ltac Z0_pos_neg n := induction_maker n ltac:(apply Z0_pos_neg).
371
End ZAddOrderPropFunct.