]> matita.cs.unibo.it Git - helm.git/blob - helm/software/matita/library/nat/orders.ma
Preparing for 0.5.9 release.
[helm.git] / helm / software / matita / library / nat / orders.ma
1 (**************************************************************************)
2 (*       ___                                                                *)
3 (*      ||M||                                                             *)
4 (*      ||A||       A project by Andrea Asperti                           *)
5 (*      ||T||                                                             *)
6 (*      ||I||       Developers:                                           *)
7 (*      ||T||       A.Asperti, C.Sacerdoti Coen,                          *)
8 (*      ||A||       E.Tassi, S.Zacchiroli                                 *)
9 (*      \   /                                                             *)
10 (*       \ /        This file is distributed under the terms of the       *)
11 (*        v         GNU Lesser General Public License Version 2.1         *)
12 (*                                                                        *)
13 (**************************************************************************)
14
15 include "nat/nat.ma".
16 include "higher_order_defs/ordering.ma".
17
18 (* definitions *)
19 inductive le (n:nat) : nat \to Prop \def
20   | le_n : le n n
21   | le_S : \forall m:nat. le n m \to le n (S m).
22
23 interpretation "natural 'less or equal to'" 'leq x y = (le x y).
24
25 interpretation "natural 'neither less nor equal to'" 'nleq x y = (Not (le x y)).
26
27 definition lt: nat \to nat \to Prop \def
28 \lambda n,m:nat.(S n) \leq m.
29
30 interpretation "natural 'less than'" 'lt x y = (lt x y).
31
32 interpretation "natural 'not less than'" 'nless x y = (Not (lt x y)).
33
34 definition ge: nat \to nat \to Prop \def
35 \lambda n,m:nat.m \leq n.
36
37 interpretation "natural 'greater or equal to'" 'geq x y = (ge x y).
38
39 definition gt: nat \to nat \to Prop \def
40 \lambda n,m:nat.m<n.
41
42 interpretation "natural 'greater than'" 'gt x y = (gt x y).
43
44 interpretation "natural 'not greater than'" 'ngtr x y = (Not (gt x y)).
45
46 theorem transitive_le : transitive nat le.
47 unfold transitive.intros.elim H1.
48 assumption.
49 apply le_S.assumption.
50 qed.
51
52 theorem trans_le: \forall n,m,p:nat. n \leq m \to m \leq p \to n \leq p
53 \def transitive_le.
54
55 theorem transitive_lt: transitive nat lt.
56 unfold transitive.unfold lt.intros.elim H1.
57 apply le_S. assumption.
58 apply le_S.assumption.
59 qed.
60
61 theorem trans_lt: \forall n,m,p:nat. lt n m \to lt m p \to lt n p
62 \def transitive_lt.
63
64 theorem le_S_S: \forall n,m:nat. n \leq m \to S n \leq S m.
65 intros.elim H.
66 apply le_n.
67 apply le_S.assumption.
68 qed.
69
70 theorem le_O_n : \forall n:nat. O \leq n.
71 intros.elim n.
72 apply le_n.apply 
73 le_S. assumption.
74 qed.
75
76 theorem le_n_Sn : \forall n:nat. n \leq S n.
77 intros. apply le_S.apply le_n.
78 qed.
79
80 theorem le_pred_n : \forall n:nat. pred n \leq n.
81 intros.elim n.
82 simplify.apply le_n.
83 simplify.apply le_n_Sn.
84 qed.
85
86 theorem le_S_S_to_le : \forall n,m:nat. S n \leq S m \to n \leq m.
87 intros.change with (pred (S n) \leq pred (S m)).
88 elim H.apply le_n.apply (trans_le ? (pred n1)).assumption.
89 apply le_pred_n.
90 qed.
91
92 theorem lt_S_S_to_lt: \forall n,m. 
93   S n < S m \to n < m.
94 intros. apply le_S_S_to_le. assumption.
95 qed.
96
97 theorem lt_to_lt_S_S: ∀n,m. n < m → S n < S m.
98 intros;
99 unfold lt in H;
100 apply (le_S_S ? ? H).
101 qed.
102
103 theorem leS_to_not_zero : \forall n,m:nat. S n \leq m \to not_zero m.
104 intros.elim H.exact I.exact I.
105 qed.
106
107 (* not le *)
108 theorem not_le_Sn_O: \forall n:nat. S n \nleq O.
109 intros.unfold Not.simplify.intros.apply (leS_to_not_zero ? ? H).
110 qed.
111
112 theorem not_le_Sn_n: \forall n:nat. S n \nleq n.
113 intros.elim n.apply not_le_Sn_O.unfold Not.simplify.intros.cut (S n1 \leq n1).
114 apply H.assumption.
115 apply le_S_S_to_le.assumption.
116 qed.
117
118 theorem lt_pred: \forall n,m. 
119   O < n \to n < m \to pred n < pred m. 
120 apply nat_elim2
121   [intros.apply False_ind.apply (not_le_Sn_O ? H)
122   |intros.apply False_ind.apply (not_le_Sn_O ? H1)
123   |intros.simplify.unfold.apply le_S_S_to_le.assumption
124   ]
125 qed.
126
127 theorem S_pred: \forall n:nat.lt O n \to eq nat n (S (pred n)).
128 intro.elim n.apply False_ind.exact (not_le_Sn_O O H).
129 apply eq_f.apply pred_Sn.
130 qed.
131
132 theorem le_pred_to_le:
133  ∀n,m. O < m → pred n ≤ pred m → n ≤ m.
134 intros 2;
135 elim n;
136 [ apply le_O_n
137 | simplify in H2;
138   rewrite > (S_pred m);
139   [ apply le_S_S;
140     assumption
141   | assumption
142   ]
143 ].
144 qed.
145
146 theorem le_to_le_pred:
147  ∀n,m. n ≤ m → pred n ≤ pred m.
148 intros 2;
149 elim n;
150 [ simplify;
151   apply le_O_n
152 | simplify;
153   elim m in H1 ⊢ %;
154   [ elim (not_le_Sn_O ? H1)
155   | simplify;
156     apply le_S_S_to_le;
157     assumption
158   ]
159 ].
160 qed.
161
162 (* le to lt or eq *)
163 theorem le_to_or_lt_eq : \forall n,m:nat. 
164 n \leq m \to n < m \lor n = m.
165 intros.elim H.
166 right.reflexivity.
167 left.unfold lt.apply le_S_S.assumption.
168 qed.
169
170 theorem Not_lt_n_n: ∀n. n ≮ n.
171 intro;
172 unfold Not;
173 intro;
174 unfold lt in H;
175 apply (not_le_Sn_n ? H).
176 qed.
177
178 (* not eq *)
179 theorem lt_to_not_eq : \forall n,m:nat. n<m \to n \neq m.
180 unfold Not.intros.cut ((le (S n) m) \to False).
181 apply Hcut.assumption.rewrite < H1.
182 apply not_le_Sn_n.
183 qed.
184
185 (*not lt*)
186 theorem eq_to_not_lt: \forall a,b:nat.
187 a = b \to a \nlt b.
188 intros.
189 unfold Not.
190 intros.
191 rewrite > H in H1.
192 apply (lt_to_not_eq b b)
193 [ assumption
194 | reflexivity
195 ]
196 qed.
197
198 theorem lt_n_m_to_not_lt_m_Sn: ∀n,m. n < m → m ≮ S n.
199 intros;
200 unfold Not;
201 intro;
202 unfold lt in H;
203 unfold lt in H1;
204 generalize in match (le_S_S ? ? H);
205 intro;
206 generalize in match (transitive_le ? ? ? H2 H1);
207 intro;
208 apply (not_le_Sn_n ? H3).
209 qed.
210
211 (* le vs. lt *)
212 theorem lt_to_le : \forall n,m:nat. n<m \to n \leq m.
213 simplify.intros.unfold lt in H.elim H.
214 apply le_S. apply le_n.
215 apply le_S. assumption.
216 qed.
217
218 theorem lt_S_to_le : \forall n,m:nat. n < S m \to n \leq m.
219 simplify.intros.
220 apply le_S_S_to_le.assumption.
221 qed.
222
223 theorem not_le_to_lt: \forall n,m:nat. n \nleq m \to m<n.
224 intros 2.
225 apply (nat_elim2 (\lambda n,m.n \nleq m \to m<n)).
226 intros.apply (absurd (O \leq n1)).apply le_O_n.assumption.
227 unfold Not.unfold lt.intros.apply le_S_S.apply le_O_n.
228 unfold Not.unfold lt.intros.apply le_S_S.apply H.intros.apply H1.apply le_S_S.
229 assumption.
230 qed.
231
232 theorem lt_to_not_le: \forall n,m:nat. n<m \to m \nleq n.
233 unfold Not.unfold lt.intros 3.elim H.
234 apply (not_le_Sn_n n H1).
235 apply H2.apply lt_to_le. apply H3.
236 qed.
237
238 theorem not_lt_to_le: \forall n,m:nat. Not (lt n m) \to le m n.
239 simplify.intros.
240 apply lt_S_to_le.
241 apply not_le_to_lt.exact H.
242 qed.
243
244 theorem le_to_not_lt: \forall n,m:nat. le n m \to Not (lt m n).
245 intros.unfold Not.unfold lt.
246 apply lt_to_not_le.unfold lt.
247 apply le_S_S.assumption.
248 qed.
249
250 theorem not_eq_to_le_to_lt: ∀n,m. n≠m → n≤m → n<m.
251 intros;
252 elim (le_to_or_lt_eq ? ? H1);
253 [ assumption
254 | elim (H H2)
255 ].
256 qed.
257
258 (* le elimination *)
259 theorem le_n_O_to_eq : \forall n:nat. n \leq O \to O=n.
260 intro.elim n.reflexivity.
261 apply False_ind.
262 apply not_le_Sn_O;
263 [2: apply H1 | skip].
264 qed.
265
266 theorem le_n_O_elim: \forall n:nat.n \leq O \to \forall P: nat \to Prop.
267 P O \to P n.
268 intro.elim n.
269 assumption.
270 apply False_ind.
271 apply  (not_le_Sn_O ? H1).
272 qed.
273
274 theorem le_n_Sm_elim : \forall n,m:nat.n \leq S m \to 
275 \forall P:Prop. (S n \leq S m \to P) \to (n=S m \to P) \to P.
276 intros 4.elim H.
277 apply H2.reflexivity.
278 apply H3. apply le_S_S. assumption.
279 qed.
280
281 (* le and eq *)
282 lemma le_to_le_to_eq: \forall n,m. n \le m \to m \le n \to n = m.
283 apply nat_elim2
284   [intros.apply le_n_O_to_eq.assumption
285   |intros.apply sym_eq.apply le_n_O_to_eq.assumption
286   |intros.apply eq_f.apply H
287     [apply le_S_S_to_le.assumption
288     |apply le_S_S_to_le.assumption
289     ]
290   ]
291 qed.
292
293 (* lt and le trans *)
294 theorem lt_O_S : \forall n:nat. O < S n.
295 intro. unfold. apply le_S_S. apply le_O_n.
296 qed.
297
298 theorem lt_to_le_to_lt: \forall n,m,p:nat. lt n m \to le m p \to lt n p.
299 intros.elim H1.
300 assumption.unfold lt.apply le_S.assumption.
301 qed.
302
303 theorem le_to_lt_to_lt: \forall n,m,p:nat. le n m \to lt m p \to lt n p.
304 intros 4.elim H.
305 assumption.apply H2.unfold lt.
306 apply lt_to_le.assumption.
307 qed.
308
309 theorem lt_S_to_lt: \forall n,m. S n < m \to n < m.
310 intros.
311 apply (trans_lt ? (S n))
312   [apply le_n|assumption]
313 qed.
314
315 theorem ltn_to_ltO: \forall n,m:nat. lt n m \to lt O m.
316 intros.apply (le_to_lt_to_lt O n).
317 apply le_O_n.assumption.
318 qed.
319
320 theorem lt_SO_n_to_lt_O_pred_n: \forall n:nat.
321 (S O) \lt n \to O \lt (pred n).
322 intros.
323 apply (ltn_to_ltO (pred (S O)) (pred n) ?).
324  apply (lt_pred (S O) n);
325  [ apply (lt_O_S O) 
326  | assumption
327  ]
328 qed.
329
330 theorem lt_O_n_elim: \forall n:nat. lt O n \to 
331 \forall P:nat\to Prop. (\forall m:nat.P (S m)) \to P n.
332 intro.elim n.apply False_ind.exact (not_le_Sn_O O H).
333 apply H2.
334 qed.
335
336 (* other abstract properties *)
337 theorem antisymmetric_le : antisymmetric nat le.
338 unfold antisymmetric.intros 2.
339 apply (nat_elim2 (\lambda n,m.(n \leq m \to m \leq n \to n=m))).
340 intros.apply le_n_O_to_eq.assumption.
341 intros.apply False_ind.apply (not_le_Sn_O ? H).
342 intros.apply eq_f.apply H.
343 apply le_S_S_to_le.assumption.
344 apply le_S_S_to_le.assumption.
345 qed.
346
347 theorem antisym_le: \forall n,m:nat. n \leq m \to m \leq n \to n=m
348 \def antisymmetric_le.
349
350 theorem le_n_m_to_lt_m_Sn_to_eq_n_m: ∀n,m. n ≤ m → m < S n → n=m.
351 intros;
352 unfold lt in H1;
353 generalize in match (le_S_S_to_le ? ? H1);
354 intro;
355 apply antisym_le;
356 assumption.
357 qed.
358
359 theorem decidable_le: \forall n,m:nat. decidable (n \leq m).
360 intros.
361 apply (nat_elim2 (\lambda n,m.decidable (n \leq m))).
362 intros.unfold decidable.left.apply le_O_n.
363 intros.unfold decidable.right.exact (not_le_Sn_O n1).
364 intros 2.unfold decidable.intro.elim H.
365 left.apply le_S_S.assumption.
366 right.unfold Not.intro.apply H1.apply le_S_S_to_le.assumption.
367 qed.
368
369 theorem decidable_lt: \forall n,m:nat. decidable (n < m).
370 intros.exact (decidable_le (S n) m).
371 qed.
372
373 (* well founded induction principles *)
374
375 theorem nat_elim1 : \forall n:nat.\forall P:nat \to Prop. 
376 (\forall m.(\forall p. (p \lt m) \to P p) \to P m) \to P n.
377 intros.cut (\forall q:nat. q \le n \to P q).
378 apply (Hcut n).apply le_n.
379 elim n.apply (le_n_O_elim q H1).
380 apply H.
381 intros.apply False_ind.apply (not_le_Sn_O p H2).
382 apply H.intros.apply H1.
383 cut (p < S n1).
384 apply lt_S_to_le.assumption.
385 apply (lt_to_le_to_lt p q (S n1) H3 H2).
386 qed.
387
388 (* some properties of functions *)
389
390 definition increasing \def \lambda f:nat \to nat. 
391 \forall n:nat. f n < f (S n).
392
393 theorem increasing_to_monotonic: \forall f:nat \to nat.
394 increasing f \to monotonic nat lt f.
395 unfold monotonic.unfold lt.unfold increasing.unfold lt.intros.elim H1.apply H.
396 apply (trans_le ? (f n1)).
397 assumption.apply (trans_le ? (S (f n1))).
398 apply le_n_Sn.
399 apply H.
400 qed.
401
402 theorem le_n_fn: \forall f:nat \to nat. (increasing f) 
403 \to \forall n:nat. n \le (f n).
404 intros.elim n.
405 apply le_O_n.
406 apply (trans_le ? (S (f n1))).
407 apply le_S_S.apply H1.
408 simplify in H. unfold increasing in H.unfold lt in H.apply H.
409 qed.
410
411 theorem increasing_to_le: \forall f:nat \to nat. (increasing f) 
412 \to \forall m:nat. \exists i. m \le (f i).
413 intros.elim m.
414 apply (ex_intro ? ? O).apply le_O_n.
415 elim H1.
416 apply (ex_intro ? ? (S a)).
417 apply (trans_le ? (S (f a))).
418 apply le_S_S.assumption.
419 simplify in H.unfold increasing in H.unfold lt in H.
420 apply H.
421 qed.
422
423 theorem increasing_to_le2: \forall f:nat \to nat. (increasing f) 
424 \to \forall m:nat. (f O) \le m \to 
425 \exists i. (f i) \le m \land m <(f (S i)).
426 intros.elim H1.
427 apply (ex_intro ? ? O).
428 split.apply le_n.apply H.
429 elim H3.elim H4.
430 cut ((S n1) < (f (S a)) \lor (S n1) = (f (S a))).
431 elim Hcut.
432 apply (ex_intro ? ? a).
433 split.apply le_S. assumption.assumption.
434 apply (ex_intro ? ? (S a)).
435 split.rewrite < H7.apply le_n.
436 rewrite > H7.
437 apply H.
438 apply le_to_or_lt_eq.apply H6.
439 qed.