~ubuntu-branches/ubuntu/wily/coq-doc/wily

« back to all changes in this revision

Viewing changes to theories/Numbers/Integer/Abstract/ZAddOrder.v

  • Committer: Bazaar Package Importer
  • Author(s): Stéphane Glondu, Stéphane Glondu, Samuel Mimram
  • Date: 2010-01-07 22:50:39 UTC
  • mfrom: (1.2.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20100107225039-n3cq82589u0qt0s2
Tags: 8.2pl1-1
[ Stéphane Glondu ]
* New upstream release (Closes: #563669)
  - remove patches
* Packaging overhaul:
  - use git, advertise it in Vcs-* fields of debian/control
  - use debhelper 7 and dh with override
  - use source format 3.0 (quilt)
* debian/control:
  - set Maintainer to d-o-m, set Uploaders to Sam and myself
  - add Homepage field
  - bump Standards-Version to 3.8.3
* Register PDF documentation into doc-base
* Add debian/watch
* Update debian/copyright

[ Samuel Mimram ]
* Change coq-doc's description to mention that it provides documentation in
  pdf format, not postscript, closes: #543545.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
(************************************************************************)
 
10
 
 
11
(*i $Id: ZAddOrder.v 11040 2008-06-03 00:04:16Z letouzey $ i*)
 
12
 
 
13
Require Export ZLt.
 
14
 
 
15
Module ZAddOrderPropFunct (Import ZAxiomsMod : ZAxiomsSig).
 
16
Module Export ZOrderPropMod := ZOrderPropFunct ZAxiomsMod.
 
17
Open Local Scope IntScope.
 
18
 
 
19
(* Theorems that are true on both natural numbers and integers *)
 
20
 
 
21
Theorem Zadd_lt_mono_l : forall n m p : Z, n < m <-> p + n < p + m.
 
22
Proof NZadd_lt_mono_l.
 
23
 
 
24
Theorem Zadd_lt_mono_r : forall n m p : Z, n < m <-> n + p < m + p.
 
25
Proof NZadd_lt_mono_r.
 
26
 
 
27
Theorem Zadd_lt_mono : forall n m p q : Z, n < m -> p < q -> n + p < m + q.
 
28
Proof NZadd_lt_mono.
 
29
 
 
30
Theorem Zadd_le_mono_l : forall n m p : Z, n <= m <-> p + n <= p + m.
 
31
Proof NZadd_le_mono_l.
 
32
 
 
33
Theorem Zadd_le_mono_r : forall n m p : Z, n <= m <-> n + p <= m + p.
 
34
Proof NZadd_le_mono_r.
 
35
 
 
36
Theorem Zadd_le_mono : forall n m p q : Z, n <= m -> p <= q -> n + p <= m + q.
 
37
Proof NZadd_le_mono.
 
38
 
 
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.
 
41
 
 
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.
 
44
 
 
45
Theorem Zadd_pos_pos : forall n m : Z, 0 < n -> 0 < m -> 0 < n + m.
 
46
Proof NZadd_pos_pos.
 
47
 
 
48
Theorem Zadd_pos_nonneg : forall n m : Z, 0 < n -> 0 <= m -> 0 < n + m.
 
49
Proof NZadd_pos_nonneg.
 
50
 
 
51
Theorem Zadd_nonneg_pos : forall n m : Z, 0 <= n -> 0 < m -> 0 < n + m.
 
52
Proof NZadd_nonneg_pos.
 
53
 
 
54
Theorem Zadd_nonneg_nonneg : forall n m : Z, 0 <= n -> 0 <= m -> 0 <= n + m.
 
55
Proof NZadd_nonneg_nonneg.
 
56
 
 
57
Theorem Zlt_add_pos_l : forall n m : Z, 0 < n -> m < n + m.
 
58
Proof NZlt_add_pos_l.
 
59
 
 
60
Theorem Zlt_add_pos_r : forall n m : Z, 0 < n -> m < m + n.
 
61
Proof NZlt_add_pos_r.
 
62
 
 
63
Theorem Zle_lt_add_lt : forall n m p q : Z, n <= m -> p + m < q + n -> p < q.
 
64
Proof NZle_lt_add_lt.
 
65
 
 
66
Theorem Zlt_le_add_lt : forall n m p q : Z, n < m -> p + m <= q + n -> p < q.
 
67
Proof NZlt_le_add_lt.
 
68
 
 
69
Theorem Zle_le_add_le : forall n m p q : Z, n <= m -> p + m <= q + n -> p <= q.
 
70
Proof NZle_le_add_le.
 
71
 
 
72
Theorem Zadd_lt_cases : forall n m p q : Z, n + m < p + q -> n < p \/ m < q.
 
73
Proof NZadd_lt_cases.
 
74
 
 
75
Theorem Zadd_le_cases : forall n m p q : Z, n + m <= p + q -> n <= p \/ m <= q.
 
76
Proof NZadd_le_cases.
 
77
 
 
78
Theorem Zadd_neg_cases : forall n m : Z, n + m < 0 -> n < 0 \/ m < 0.
 
79
Proof NZadd_neg_cases.
 
80
 
 
81
Theorem Zadd_pos_cases : forall n m : Z, 0 < n + m -> 0 < n \/ 0 < m.
 
82
Proof NZadd_pos_cases.
 
83
 
 
84
Theorem Zadd_nonpos_cases : forall n m : Z, n + m <= 0 -> n <= 0 \/ m <= 0.
 
85
Proof NZadd_nonpos_cases.
 
86
 
 
87
Theorem Zadd_nonneg_cases : forall n m : Z, 0 <= n + m -> 0 <= n \/ 0 <= m.
 
88
Proof NZadd_nonneg_cases.
 
89
 
 
90
(* Theorems that are either not valid on N or have different proofs on N and Z *)
 
91
 
 
92
Theorem Zadd_neg_neg : forall n m : Z, n < 0 -> m < 0 -> n + m < 0.
 
93
Proof.
 
94
intros n m H1 H2. rewrite <- (Zadd_0_l 0). now apply Zadd_lt_mono.
 
95
Qed.
 
96
 
 
97
Theorem Zadd_neg_nonpos : forall n m : Z, n < 0 -> m <= 0 -> n + m < 0.
 
98
Proof.
 
99
intros n m H1 H2. rewrite <- (Zadd_0_l 0). now apply Zadd_lt_le_mono.
 
100
Qed.
 
101
 
 
102
Theorem Zadd_nonpos_neg : forall n m : Z, n <= 0 -> m < 0 -> n + m < 0.
 
103
Proof.
 
104
intros n m H1 H2. rewrite <- (Zadd_0_l 0). now apply Zadd_le_lt_mono.
 
105
Qed.
 
106
 
 
107
Theorem Zadd_nonpos_nonpos : forall n m : Z, n <= 0 -> m <= 0 -> n + m <= 0.
 
108
Proof.
 
109
intros n m H1 H2. rewrite <- (Zadd_0_l 0). now apply Zadd_le_mono.
 
110
Qed.
 
111
 
 
112
(** Sub and order *)
 
113
 
 
114
Theorem Zlt_0_sub : forall n m : Z, 0 < m - n <-> n < m.
 
115
Proof.
 
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.
 
118
Qed.
 
119
 
 
120
Notation Zsub_pos := Zlt_0_sub (only parsing).
 
121
 
 
122
Theorem Zle_0_sub : forall n m : Z, 0 <= m - n <-> n <= m.
 
123
Proof.
 
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.
 
126
Qed.
 
127
 
 
128
Notation Zsub_nonneg := Zle_0_sub (only parsing).
 
129
 
 
130
Theorem Zlt_sub_0 : forall n m : Z, n - m < 0 <-> n < m.
 
131
Proof.
 
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.
 
134
Qed.
 
135
 
 
136
Notation Zsub_neg := Zlt_sub_0 (only parsing).
 
137
 
 
138
Theorem Zle_sub_0 : forall n m : Z, n - m <= 0 <-> n <= m.
 
139
Proof.
 
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.
 
142
Qed.
 
143
 
 
144
Notation Zsub_nonpos := Zle_sub_0 (only parsing).
 
145
 
 
146
Theorem Zopp_lt_mono : forall n m : Z, n < m <-> - m < - n.
 
147
Proof.
 
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.
 
150
Qed.
 
151
 
 
152
Theorem Zopp_le_mono : forall n m : Z, n <= m <-> - m <= - n.
 
153
Proof.
 
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.
 
156
Qed.
 
157
 
 
158
Theorem Zopp_pos_neg : forall n : Z, 0 < - n <-> n < 0.
 
159
Proof.
 
160
intro n; rewrite (Zopp_lt_mono n 0); now rewrite Zopp_0.
 
161
Qed.
 
162
 
 
163
Theorem Zopp_neg_pos : forall n : Z, - n < 0 <-> 0 < n.
 
164
Proof.
 
165
intro n. rewrite (Zopp_lt_mono 0 n). now rewrite Zopp_0.
 
166
Qed.
 
167
 
 
168
Theorem Zopp_nonneg_nonpos : forall n : Z, 0 <= - n <-> n <= 0.
 
169
Proof.
 
170
intro n; rewrite (Zopp_le_mono n 0); now rewrite Zopp_0.
 
171
Qed.
 
172
 
 
173
Theorem Zopp_nonpos_nonneg : forall n : Z, - n <= 0 <-> 0 <= n.
 
174
Proof.
 
175
intro n. rewrite (Zopp_le_mono 0 n). now rewrite Zopp_0.
 
176
Qed.
 
177
 
 
178
Theorem Zsub_lt_mono_l : forall n m p : Z, n < m <-> p - m < p - n.
 
179
Proof.
 
180
intros n m p. do 2 rewrite <- Zadd_opp_r. rewrite <- Zadd_lt_mono_l.
 
181
apply Zopp_lt_mono.
 
182
Qed.
 
183
 
 
184
Theorem Zsub_lt_mono_r : forall n m p : Z, n < m <-> n - p < m - p.
 
185
Proof.
 
186
intros n m p; do 2 rewrite <- Zadd_opp_r; apply Zadd_lt_mono_r.
 
187
Qed.
 
188
 
 
189
Theorem Zsub_lt_mono : forall n m p q : Z, n < m -> q < p -> n - p < m - q.
 
190
Proof.
 
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].
 
194
Qed.
 
195
 
 
196
Theorem Zsub_le_mono_l : forall n m p : Z, n <= m <-> p - m <= p - n.
 
197
Proof.
 
198
intros n m p; do 2 rewrite <- Zadd_opp_r; rewrite <- Zadd_le_mono_l;
 
199
apply Zopp_le_mono.
 
200
Qed.
 
201
 
 
202
Theorem Zsub_le_mono_r : forall n m p : Z, n <= m <-> n - p <= m - p.
 
203
Proof.
 
204
intros n m p; do 2 rewrite <- Zadd_opp_r; apply Zadd_le_mono_r.
 
205
Qed.
 
206
 
 
207
Theorem Zsub_le_mono : forall n m p q : Z, n <= m -> q <= p -> n - p <= m - q.
 
208
Proof.
 
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].
 
212
Qed.
 
213
 
 
214
Theorem Zsub_lt_le_mono : forall n m p q : Z, n < m -> q <= p -> n - p < m - q.
 
215
Proof.
 
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].
 
219
Qed.
 
220
 
 
221
Theorem Zsub_le_lt_mono : forall n m p q : Z, n <= m -> q < p -> n - p < m - q.
 
222
Proof.
 
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].
 
226
Qed.
 
227
 
 
228
Theorem Zle_lt_sub_lt : forall n m p q : Z, n <= m -> p - n < q - m -> p < q.
 
229
Proof.
 
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].
 
232
Qed.
 
233
 
 
234
Theorem Zlt_le_sub_lt : forall n m p q : Z, n < m -> p - n <= q - m -> p < q.
 
235
Proof.
 
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].
 
238
Qed.
 
239
 
 
240
Theorem Zle_le_sub_lt : forall n m p q : Z, n <= m -> p - n <= q - m -> p <= q.
 
241
Proof.
 
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].
 
244
Qed.
 
245
 
 
246
Theorem Zlt_add_lt_sub_r : forall n m p : Z, n + p < m <-> n < m - p.
 
247
Proof.
 
248
intros n m p. stepl (n + p - p < m - p) by symmetry; apply Zsub_lt_mono_r.
 
249
now rewrite Zadd_simpl_r.
 
250
Qed.
 
251
 
 
252
Theorem Zle_add_le_sub_r : forall n m p : Z, n + p <= m <-> n <= m - p.
 
253
Proof.
 
254
intros n m p. stepl (n + p - p <= m - p) by symmetry; apply Zsub_le_mono_r.
 
255
now rewrite Zadd_simpl_r.
 
256
Qed.
 
257
 
 
258
Theorem Zlt_add_lt_sub_l : forall n m p : Z, n + p < m <-> p < m - n.
 
259
Proof.
 
260
intros n m p. rewrite Zadd_comm; apply Zlt_add_lt_sub_r.
 
261
Qed.
 
262
 
 
263
Theorem Zle_add_le_sub_l : forall n m p : Z, n + p <= m <-> p <= m - n.
 
264
Proof.
 
265
intros n m p. rewrite Zadd_comm; apply Zle_add_le_sub_r.
 
266
Qed.
 
267
 
 
268
Theorem Zlt_sub_lt_add_r : forall n m p : Z, n - p < m <-> n < m + p.
 
269
Proof.
 
270
intros n m p. stepl (n - p + p < m + p) by symmetry; apply Zadd_lt_mono_r.
 
271
now rewrite Zsub_simpl_r.
 
272
Qed.
 
273
 
 
274
Theorem Zle_sub_le_add_r : forall n m p : Z, n - p <= m <-> n <= m + p.
 
275
Proof.
 
276
intros n m p. stepl (n - p + p <= m + p) by symmetry; apply Zadd_le_mono_r.
 
277
now rewrite Zsub_simpl_r.
 
278
Qed.
 
279
 
 
280
Theorem Zlt_sub_lt_add_l : forall n m p : Z, n - m < p <-> n < m + p.
 
281
Proof.
 
282
intros n m p. rewrite Zadd_comm; apply Zlt_sub_lt_add_r.
 
283
Qed.
 
284
 
 
285
Theorem Zle_sub_le_add_l : forall n m p : Z, n - m <= p <-> n <= m + p.
 
286
Proof.
 
287
intros n m p. rewrite Zadd_comm; apply Zle_sub_le_add_r.
 
288
Qed.
 
289
 
 
290
Theorem Zlt_sub_lt_add : forall n m p q : Z, n - m < p - q <-> n + q < m + p.
 
291
Proof.
 
292
intros n m p q. rewrite Zlt_sub_lt_add_l. rewrite Zadd_sub_assoc.
 
293
now rewrite <- Zlt_add_lt_sub_r.
 
294
Qed.
 
295
 
 
296
Theorem Zle_sub_le_add : forall n m p q : Z, n - m <= p - q <-> n + q <= m + p.
 
297
Proof.
 
298
intros n m p q. rewrite Zle_sub_le_add_l. rewrite Zadd_sub_assoc.
 
299
now rewrite <- Zle_add_le_sub_r.
 
300
Qed.
 
301
 
 
302
Theorem Zlt_sub_pos : forall n m : Z, 0 < m <-> n - m < n.
 
303
Proof.
 
304
intros n m. stepr (n - m < n - 0) by now rewrite Zsub_0_r. apply Zsub_lt_mono_l.
 
305
Qed.
 
306
 
 
307
Theorem Zle_sub_nonneg : forall n m : Z, 0 <= m <-> n - m <= n.
 
308
Proof.
 
309
intros n m. stepr (n - m <= n - 0) by now rewrite Zsub_0_r. apply Zsub_le_mono_l.
 
310
Qed.
 
311
 
 
312
Theorem Zsub_lt_cases : forall n m p q : Z, n - m < p - q -> n < m \/ q < p.
 
313
Proof.
 
314
intros n m p q H. rewrite Zlt_sub_lt_add in H. now apply Zadd_lt_cases.
 
315
Qed.
 
316
 
 
317
Theorem Zsub_le_cases : forall n m p q : Z, n - m <= p - q -> n <= m \/ q <= p.
 
318
Proof.
 
319
intros n m p q H. rewrite Zle_sub_le_add in H. now apply Zadd_le_cases.
 
320
Qed.
 
321
 
 
322
Theorem Zsub_neg_cases : forall n m : Z, n - m < 0 -> n < 0 \/ 0 < m.
 
323
Proof.
 
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.
 
327
Qed.
 
328
 
 
329
Theorem Zsub_pos_cases : forall n m : Z, 0 < n - m -> 0 < n \/ m < 0.
 
330
Proof.
 
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.
 
334
Qed.
 
335
 
 
336
Theorem Zsub_nonpos_cases : forall n m : Z, n - m <= 0 -> n <= 0 \/ 0 <= m.
 
337
Proof.
 
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.
 
341
Qed.
 
342
 
 
343
Theorem Zsub_nonneg_cases : forall n m : Z, 0 <= n - m -> 0 <= n \/ m <= 0.
 
344
Proof.
 
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.
 
348
Qed.
 
349
 
 
350
Section PosNeg.
 
351
 
 
352
Variable P : Z -> Prop.
 
353
Hypothesis P_wd : predicate_wd Zeq P.
 
354
 
 
355
Add Morphism P with signature Zeq ==> iff as P_morph. Proof. exact P_wd. Qed.
 
356
 
 
357
Theorem Z0_pos_neg :
 
358
  P 0 -> (forall n : Z, 0 < n -> P n /\ P (- n)) -> forall n : Z, P n.
 
359
Proof.
 
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.
 
363
now rewrite H3.
 
364
apply H2 in H3; now destruct H3.
 
365
Qed.
 
366
 
 
367
End PosNeg.
 
368
 
 
369
Ltac Z0_pos_neg n := induction_maker n ltac:(apply Z0_pos_neg).
 
370
 
 
371
End ZAddOrderPropFunct.
 
372
 
 
373