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