]> matita.cs.unibo.it Git - helm.git/blob - helm/software/matita/library/nat/orders.ma
Renamed iterative into map_iter_p and moved around a few theorems.
[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 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 (*CSC: the URI must disappear: there is a bug now *)
26 interpretation "natural 'less or equal to'" 'leq x y = (cic:/matita/nat/orders/le.ind#xpointer(1/1) x y).
27 (*CSC: the URI must disappear: there is a bug now *)
28 interpretation "natural 'neither less nor equal to'" 'nleq x y =
29   (cic:/matita/logic/connectives/Not.con
30     (cic:/matita/nat/orders/le.ind#xpointer(1/1) x y)).
31
32 definition lt: nat \to nat \to Prop \def
33 \lambda n,m:nat.(S n) \leq m.
34
35 (*CSC: the URI must disappear: there is a bug now *)
36 interpretation "natural 'less than'" 'lt x y = (cic:/matita/nat/orders/lt.con x y).
37 (*CSC: the URI must disappear: there is a bug now *)
38 interpretation "natural 'not less than'" 'nless x y =
39   (cic:/matita/logic/connectives/Not.con (cic:/matita/nat/orders/lt.con x y)).
40
41 definition ge: nat \to nat \to Prop \def
42 \lambda n,m:nat.m \leq n.
43
44 (*CSC: the URI must disappear: there is a bug now *)
45 interpretation "natural 'greater or equal to'" 'geq x y = (cic:/matita/nat/orders/ge.con x y).
46
47 definition gt: nat \to nat \to Prop \def
48 \lambda n,m:nat.m<n.
49
50 (*CSC: the URI must disappear: there is a bug now *)
51 interpretation "natural 'greater than'" 'gt x y = (cic:/matita/nat/orders/gt.con x y).
52 (*CSC: the URI must disappear: there is a bug now *)
53 interpretation "natural 'not greater than'" 'ngtr x y =
54   (cic:/matita/logic/connectives/Not.con (cic:/matita/nat/orders/gt.con x y)).
55
56 theorem transitive_le : transitive nat le.
57 unfold transitive.intros.elim H1.
58 assumption.
59 apply le_S.assumption.
60 qed.
61
62 theorem trans_le: \forall n,m,p:nat. n \leq m \to m \leq p \to n \leq p
63 \def transitive_le.
64
65 theorem transitive_lt: transitive nat lt.
66 unfold transitive.unfold lt.intros.elim H1.
67 apply le_S. assumption.
68 apply le_S.assumption.
69 qed.
70
71 theorem trans_lt: \forall n,m,p:nat. lt n m \to lt m p \to lt n p
72 \def transitive_lt.
73
74 theorem le_S_S: \forall n,m:nat. n \leq m \to S n \leq S m.
75 intros.elim H.
76 apply le_n.
77 apply le_S.assumption.
78 qed.
79
80 theorem le_O_n : \forall n:nat. O \leq n.
81 intros.elim n.
82 apply le_n.apply 
83 le_S. assumption.
84 qed.
85
86 theorem le_n_Sn : \forall n:nat. n \leq S n.
87 intros. apply le_S.apply le_n.
88 qed.
89
90 theorem le_pred_n : \forall n:nat. pred n \leq n.
91 intros.elim n.
92 simplify.apply le_n.
93 simplify.apply le_n_Sn.
94 qed.
95
96 theorem le_S_S_to_le : \forall n,m:nat. S n \leq S m \to n \leq m.
97 intros.change with (pred (S n) \leq pred (S m)).
98 elim H.apply le_n.apply (trans_le ? (pred n1)).assumption.
99 apply le_pred_n.
100 qed.
101
102 theorem leS_to_not_zero : \forall n,m:nat. S n \leq m \to not_zero m.
103 intros.elim H.exact I.exact I.
104 qed.
105
106 (* not le *)
107 theorem not_le_Sn_O: \forall n:nat. S n \nleq O.
108 intros.unfold Not.simplify.intros.apply (leS_to_not_zero ? ? H).
109 qed.
110
111 theorem not_le_Sn_n: \forall n:nat. S n \nleq n.
112 intros.elim n.apply not_le_Sn_O.unfold Not.simplify.intros.cut (S n1 \leq n1).
113 apply H.assumption.
114 apply le_S_S_to_le.assumption.
115 qed.
116
117 (* le to lt or eq *)
118 theorem le_to_or_lt_eq : \forall n,m:nat. 
119 n \leq m \to n < m \lor n = m.
120 intros.elim H.
121 right.reflexivity.
122 left.unfold lt.apply le_S_S.assumption.
123 qed.
124
125 (* not eq *)
126 theorem lt_to_not_eq : \forall n,m:nat. n<m \to n \neq m.
127 unfold Not.intros.cut ((le (S n) m) \to False).
128 apply Hcut.assumption.rewrite < H1.
129 apply not_le_Sn_n.
130 qed.
131
132 (* le vs. lt *)
133 theorem lt_to_le : \forall n,m:nat. n<m \to n \leq m.
134 simplify.intros.unfold lt in H.elim H.
135 apply le_S. apply le_n.
136 apply le_S. assumption.
137 qed.
138
139 theorem lt_S_to_le : \forall n,m:nat. n < S m \to n \leq m.
140 simplify.intros.
141 apply le_S_S_to_le.assumption.
142 qed.
143
144 theorem not_le_to_lt: \forall n,m:nat. n \nleq m \to m<n.
145 intros 2.
146 apply (nat_elim2 (\lambda n,m.n \nleq m \to m<n)).
147 intros.apply (absurd (O \leq n1)).apply le_O_n.assumption.
148 unfold Not.unfold lt.intros.apply le_S_S.apply le_O_n.
149 unfold Not.unfold lt.intros.apply le_S_S.apply H.intros.apply H1.apply le_S_S.
150 assumption.
151 qed.
152
153 theorem lt_to_not_le: \forall n,m:nat. n<m \to m \nleq n.
154 unfold Not.unfold lt.intros 3.elim H.
155 apply (not_le_Sn_n n H1).
156 apply H2.apply lt_to_le. apply H3.
157 qed.
158
159 theorem not_lt_to_le: \forall n,m:nat. Not (lt n m) \to le m n.
160 simplify.intros.
161 apply lt_S_to_le.
162 apply not_le_to_lt.exact H.
163 qed.
164
165 theorem le_to_not_lt: \forall n,m:nat. le n m \to Not (lt m n).
166 intros.unfold Not.unfold lt.
167 apply lt_to_not_le.unfold lt.
168 apply le_S_S.assumption.
169 qed.
170
171 (* le elimination *)
172 theorem le_n_O_to_eq : \forall n:nat. n \leq O \to O=n.
173 intro.elim n.reflexivity.
174 apply False_ind.
175 apply not_le_Sn_O.
176 goal 17. apply H1.
177 qed.
178
179 theorem le_n_O_elim: \forall n:nat.n \leq O \to \forall P: nat \to Prop.
180 P O \to P n.
181 intro.elim n.
182 assumption.
183 apply False_ind.
184 apply  (not_le_Sn_O ? H1).
185 qed.
186
187 theorem le_n_Sm_elim : \forall n,m:nat.n \leq S m \to 
188 \forall P:Prop. (S n \leq S m \to P) \to (n=S m \to P) \to P.
189 intros 4.elim H.
190 apply H2.reflexivity.
191 apply H3. apply le_S_S. assumption.
192 qed.
193
194 (* le to eq *)
195 lemma le_to_le_to_eq: \forall n,m. n \le m \to m \le n \to n = m.
196 apply nat_elim2
197   [intros.apply le_n_O_to_eq.assumption
198   |intros.apply sym_eq.apply le_n_O_to_eq.assumption
199   |intros.apply eq_f.apply H
200     [apply le_S_S_to_le.assumption
201     |apply le_S_S_to_le.assumption
202     ]
203   ]
204 qed.
205
206 (* lt and le trans *)
207 theorem lt_O_S : \forall n:nat. O < S n.
208 intro. unfold. apply le_S_S. apply le_O_n.
209 qed.
210
211 theorem lt_to_le_to_lt: \forall n,m,p:nat. lt n m \to le m p \to lt n p.
212 intros.elim H1.
213 assumption.unfold lt.apply le_S.assumption.
214 qed.
215
216 theorem le_to_lt_to_lt: \forall n,m,p:nat. le n m \to lt m p \to lt n p.
217 intros 4.elim H.
218 assumption.apply H2.unfold lt.
219 apply lt_to_le.assumption.
220 qed.
221
222 theorem lt_S_to_lt: \forall n,m. S n < m \to n < m.
223 intros.
224 apply (trans_lt ? (S n))
225   [apply le_n|assumption]
226 qed.
227
228 theorem ltn_to_ltO: \forall n,m:nat. lt n m \to lt O m.
229 intros.apply (le_to_lt_to_lt O n).
230 apply le_O_n.assumption.
231 qed.
232
233 theorem lt_O_n_elim: \forall n:nat. lt O n \to 
234 \forall P:nat\to Prop. (\forall m:nat.P (S m)) \to P n.
235 intro.elim n.apply False_ind.exact (not_le_Sn_O O H).
236 apply H2.
237 qed.
238
239 (* other abstract properties *)
240 theorem antisymmetric_le : antisymmetric nat le.
241 unfold antisymmetric.intros 2.
242 apply (nat_elim2 (\lambda n,m.(n \leq m \to m \leq n \to n=m))).
243 intros.apply le_n_O_to_eq.assumption.
244 intros.apply False_ind.apply (not_le_Sn_O ? H).
245 intros.apply eq_f.apply H.
246 apply le_S_S_to_le.assumption.
247 apply le_S_S_to_le.assumption.
248 qed.
249
250 theorem antisym_le: \forall n,m:nat. n \leq m \to m \leq n \to n=m
251 \def antisymmetric_le.
252
253 theorem decidable_le: \forall n,m:nat. decidable (n \leq m).
254 intros.
255 apply (nat_elim2 (\lambda n,m.decidable (n \leq m))).
256 intros.unfold decidable.left.apply le_O_n.
257 intros.unfold decidable.right.exact (not_le_Sn_O n1).
258 intros 2.unfold decidable.intro.elim H.
259 left.apply le_S_S.assumption.
260 right.unfold Not.intro.apply H1.apply le_S_S_to_le.assumption.
261 qed.
262
263 theorem decidable_lt: \forall n,m:nat. decidable (n < m).
264 intros.exact (decidable_le (S n) m).
265 qed.
266
267 (* well founded induction principles *)
268
269 theorem nat_elim1 : \forall n:nat.\forall P:nat \to Prop. 
270 (\forall m.(\forall p. (p \lt m) \to P p) \to P m) \to P n.
271 intros.cut (\forall q:nat. q \le n \to P q).
272 apply (Hcut n).apply le_n.
273 elim n.apply (le_n_O_elim q H1).
274 apply H.
275 intros.apply False_ind.apply (not_le_Sn_O p H2).
276 apply H.intros.apply H1.
277 cut (p < S n1).
278 apply lt_S_to_le.assumption.
279 apply (lt_to_le_to_lt p q (S n1) H3 H2).
280 qed.
281
282 (* some properties of functions *)
283
284 definition increasing \def \lambda f:nat \to nat. 
285 \forall n:nat. f n < f (S n).
286
287 theorem increasing_to_monotonic: \forall f:nat \to nat.
288 increasing f \to monotonic nat lt f.
289 unfold monotonic.unfold lt.unfold increasing.unfold lt.intros.elim H1.apply H.
290 apply (trans_le ? (f n1)).
291 assumption.apply (trans_le ? (S (f n1))).
292 apply le_n_Sn.
293 apply H.
294 qed.
295
296 theorem le_n_fn: \forall f:nat \to nat. (increasing f) 
297 \to \forall n:nat. n \le (f n).
298 intros.elim n.
299 apply le_O_n.
300 apply (trans_le ? (S (f n1))).
301 apply le_S_S.apply H1.
302 simplify in H. unfold increasing in H.unfold lt in H.apply H.
303 qed.
304
305 theorem increasing_to_le: \forall f:nat \to nat. (increasing f) 
306 \to \forall m:nat. \exists i. m \le (f i).
307 intros.elim m.
308 apply (ex_intro ? ? O).apply le_O_n.
309 elim H1.
310 apply (ex_intro ? ? (S a)).
311 apply (trans_le ? (S (f a))).
312 apply le_S_S.assumption.
313 simplify in H.unfold increasing in H.unfold lt in H.
314 apply H.
315 qed.
316
317 theorem increasing_to_le2: \forall f:nat \to nat. (increasing f) 
318 \to \forall m:nat. (f O) \le m \to 
319 \exists i. (f i) \le m \land m <(f (S i)).
320 intros.elim H1.
321 apply (ex_intro ? ? O).
322 split.apply le_n.apply H.
323 elim H3.elim H4.
324 cut ((S n1) < (f (S a)) \lor (S n1) = (f (S a))).
325 elim Hcut.
326 apply (ex_intro ? ? a).
327 split.apply le_S. assumption.assumption.
328 apply (ex_intro ? ? (S a)).
329 split.rewrite < H7.apply le_n.
330 rewrite > H7.
331 apply H.
332 apply le_to_or_lt_eq.apply H6.
333 qed.