]> matita.cs.unibo.it Git - helm.git/blob - helm/matita/library/nat/le_arith.ma
Committing all the recent development of Andrea after the merge between his
[helm.git] / helm / matita / library / nat / le_arith.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/le_arith".
16
17 include "higher_order_defs/functions.ma".
18 include "nat/times.ma".
19 include "nat/orders.ma".
20 include "nat/compare.ma".
21
22 (* plus *)
23 theorem monotonic_le_plus_r: 
24 \forall n:nat.monotonic nat le (\lambda m.plus n m).
25 simplify.intros.elim n.
26 simplify.assumption.
27 simplify.apply le_S_S.assumption.
28 qed.
29
30 theorem le_plus_r: \forall p,n,m:nat. le n m \to le (plus p n) (plus p m)
31 \def monotonic_le_plus_r.
32
33 theorem monotonic_le_plus_l: 
34 \forall m:nat.monotonic nat le (\lambda n.plus n m).
35 simplify.intros.
36 rewrite < sym_plus.rewrite < sym_plus m.
37 apply le_plus_r.assumption.
38 qed.
39
40 theorem le_plus_l: \forall p,n,m:nat. le n m \to le (plus n p) (plus m p)
41 \def monotonic_le_plus_l.
42
43 theorem le_plus: \forall n1,n2,m1,m2:nat. le n1 n2  \to le m1 m2 
44 \to le (plus n1 m1) (plus n2 m2).
45 intros.
46 apply trans_le ? (plus n2 m1).
47 apply le_plus_l.assumption.
48 apply le_plus_r.assumption.
49 qed.
50
51 theorem le_plus_n :\forall n,m:nat. le m (plus n m).
52 intros.change with le (plus O m) (plus n m).
53 apply le_plus_l.apply le_O_n.
54 qed.
55
56 theorem eq_plus_to_le: \forall n,m,p:nat.eq nat n (plus m p) 
57 \to le m n.
58 intros.rewrite > H.
59 rewrite < sym_plus.
60 apply le_plus_n.
61 qed.
62
63 (* times *)
64 theorem monotonic_le_times_r: 
65 \forall n:nat.monotonic nat le (\lambda m.times n m).
66 simplify.intros.elim n.
67 simplify.apply le_O_n.
68 simplify.apply le_plus.
69 assumption.
70 assumption.
71 qed.
72
73 theorem le_times_r: \forall p,n,m:nat. le n m \to le (times p n) (times p m)
74 \def monotonic_le_times_r.
75
76 theorem monotonic_le_times_l: 
77 \forall m:nat.monotonic nat le (\lambda n.times n m).
78 simplify.intros.
79 rewrite < sym_times.rewrite < sym_times m.
80 apply le_times_r.assumption.
81 qed.
82
83 theorem le_times_l: \forall p,n,m:nat. le n m \to le (times n p) (times m p)
84 \def monotonic_le_times_l.
85
86 theorem le_times: \forall n1,n2,m1,m2:nat. le n1 n2  \to le m1 m2 
87 \to le (times n1 m1) (times n2 m2).
88 intros.
89 apply trans_le ? (times n2 m1).
90 apply le_times_l.assumption.
91 apply le_times_r.assumption.
92 qed.
93
94 theorem le_times_n: \forall n,m:nat.le (S O) n \to le m (times n m).
95 intros.elim H.simplify.
96 elim (plus_n_O ?).apply le_n.
97 simplify.rewrite < sym_plus.apply le_plus_n.
98 qed.
99