1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| A.Asperti, C.Sacerdoti Coen, *)
8 (* ||A|| E.Tassi, S.Zacchiroli *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU Lesser General Public License Version 2.1 *)
13 (**************************************************************************)
15 set "baseuri" "cic:/matita/nat/orders".
17 include "nat/plus.ma".
18 include "higher_order_defs/ordering.ma".
21 inductive le (n:nat) : nat \to Prop \def
23 | le_S : \forall m:nat. le n m \to le n (S m).
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).
28 definition lt: nat \to nat \to Prop \def
29 \lambda n,m:nat.(S n) \leq m.
31 (*CSC: the URI must disappear: there is a bug now *)
32 interpretation "natural 'less than'" 'lt x y = (cic:/matita/nat/orders/lt.con x y).
34 definition ge: nat \to nat \to Prop \def
35 \lambda n,m:nat.m \leq n.
37 (*CSC: the URI must disappear: there is a bug now *)
38 interpretation "natural 'greater or equal to'" 'geq x y = (cic:/matita/nat/orders/ge.con x y).
40 definition gt: nat \to nat \to Prop \def
43 (*CSC: the URI must disappear: there is a bug now *)
44 interpretation "natural 'greater than'" 'gt x y = (cic:/matita/nat/orders/gt.con x y).
46 theorem transitive_le : transitive nat le.
47 simplify.intros.elim H1.
49 apply le_S.assumption.
52 theorem trans_le: \forall n,m,p:nat. n \leq m \to m \leq p \to n \leq p
55 theorem transitive_lt: transitive nat lt.
56 simplify.intros.elim H1.
57 apply le_S. assumption.
58 apply le_S.assumption.
61 theorem trans_lt: \forall n,m,p:nat. lt n m \to lt m p \to lt n p
64 theorem le_S_S: \forall n,m:nat. n \leq m \to S n \leq S m.
67 apply le_S.assumption.
70 theorem le_O_n : \forall n:nat. O \leq n.
76 theorem le_n_Sn : \forall n:nat. n \leq S n.
77 intros. apply le_S.apply le_n.
80 theorem le_pred_n : \forall n:nat. pred n \leq n.
83 simplify.apply le_n_Sn.
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.
92 theorem leS_to_not_zero : \forall n,m:nat. S n \leq m \to not_zero m.
93 intros.elim H.exact I.exact I.
97 theorem not_le_Sn_O: \forall n:nat. \lnot (S n \leq O).
98 intros.simplify.intros.apply leS_to_not_zero ? ? H.
101 theorem not_le_Sn_n: \forall n:nat. \lnot (S n \leq n).
102 intros.elim n.apply not_le_Sn_O.simplify.intros.cut S n1 \leq n1.
104 apply le_S_S_to_le.assumption.
108 theorem lt_to_not_eq : \forall n,m:nat. n<m \to \lnot (n=m).
109 simplify.intros.cut (le (S n) m) \to False.
110 apply Hcut.assumption.rewrite < H1.
115 theorem lt_to_le : \forall n,m:nat. n<m \to n \leq m.
116 simplify.intros.elim H.
117 apply le_S. apply le_n.
118 apply le_S. assumption.
121 theorem lt_S_to_le : \forall n,m:nat. n < S m \to n \leq m.
123 apply le_S_S_to_le.assumption.
126 theorem not_le_to_lt: \forall n,m:nat. \lnot (n \leq m) \to m<n.
128 apply nat_elim2 (\lambda n,m.\lnot (n \leq m) \to m<n).
129 intros.apply absurd (O \leq n1).apply le_O_n.assumption.
130 simplify.intros.apply le_S_S.apply le_O_n.
131 simplify.intros.apply le_S_S.apply H.intros.apply H1.apply le_S_S.
135 theorem lt_to_not_le: \forall n,m:nat. n<m \to \lnot (m \leq n).
136 simplify.intros 3.elim H.
137 apply not_le_Sn_n n H1.
138 apply H2.apply lt_to_le. apply H3.
141 theorem not_lt_to_le: \forall n,m:nat. Not (lt n m) \to le m n.
144 apply not_le_to_lt.exact H.
147 theorem le_to_not_lt: \forall n,m:nat. le n m \to Not (lt m n).
149 change with Not (le (S m) n).
150 apply lt_to_not_le.simplify.
151 apply le_S_S.assumption.
155 theorem le_n_O_to_eq : \forall n:nat. n \leq O \to O=n.
156 intro.elim n.reflexivity.
158 (* non si applica not_le_Sn_O *)
159 apply (not_le_Sn_O ? H1).
162 theorem le_n_O_elim: \forall n:nat.n \leq O \to \forall P: nat \to Prop.
167 apply (not_le_Sn_O ? H1).
170 theorem le_n_Sm_elim : \forall n,m:nat.n \leq S m \to
171 \forall P:Prop. (S n \leq S m \to P) \to (n=S m \to P) \to P.
173 apply H2.reflexivity.
174 apply H3. apply le_S_S. assumption.
177 (* lt and le trans *)
178 theorem lt_to_le_to_lt: \forall n,m,p:nat. lt n m \to le m p \to lt n p.
180 assumption.simplify.apply le_S.assumption.
183 theorem le_to_lt_to_lt: \forall n,m,p:nat. le n m \to lt m p \to lt n p.
185 assumption.apply H2.simplify.
186 apply lt_to_le.assumption.
189 theorem ltn_to_ltO: \forall n,m:nat. lt n m \to lt O m.
190 intros.apply le_to_lt_to_lt O n.
191 apply le_O_n.assumption.
194 theorem lt_O_n_elim: \forall n:nat. lt O n \to
195 \forall P:nat\to Prop. (\forall m:nat.P (S m)) \to P n.
196 intro.elim n.apply False_ind.exact not_le_Sn_O O H.
200 (* other abstract properties *)
201 theorem antisymmetric_le : antisymmetric nat le.
203 apply nat_elim2 (\lambda n,m.(n \leq m \to m \leq n \to n=m)).
204 intros.apply le_n_O_to_eq.assumption.
205 intros.apply False_ind.apply not_le_Sn_O ? H.
206 intros.apply eq_f.apply H.
207 apply le_S_S_to_le.assumption.
208 apply le_S_S_to_le.assumption.
211 theorem antisym_le: \forall n,m:nat. n \leq m \to m \leq n \to n=m
212 \def antisymmetric_le.
214 theorem decidable_le: \forall n,m:nat. decidable (n \leq m).
216 apply nat_elim2 (\lambda n,m.decidable (n \leq m)).
217 intros.simplify.left.apply le_O_n.
218 intros.simplify.right.exact not_le_Sn_O n1.
219 intros 2.simplify.intro.elim H.
220 left.apply le_S_S.assumption.
221 right.intro.apply H1.apply le_S_S_to_le.assumption.
224 theorem decidable_lt: \forall n,m:nat. decidable (n < m).
225 intros.exact decidable_le (S n) m.