]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/ground/arith/nat_le.ma
arithmetics for λδ
[helm.git] / matita / matita / contribs / lambdadelta / ground / arith / nat_le.ma
1 (**************************************************************************)
2 (*       ___                                                              *)
3 (*      ||M||                                                             *)
4 (*      ||A||       A project by Andrea Asperti                           *)
5 (*      ||T||                                                             *)
6 (*      ||I||       Developers:                                           *)
7 (*      ||T||         The HELM team.                                      *)
8 (*      ||A||         http://helm.cs.unibo.it                             *)
9 (*      \   /                                                             *)
10 (*       \ /        This file is distributed under the terms of the       *)
11 (*        v         GNU General Public License Version 2                  *)
12 (*                                                                        *)
13 (**************************************************************************)
14
15 include "ground/insert_eq/insert_eq_0.ma".
16 include "ground/arith/nat_succ.ma".
17
18 (* NON-NEGATIVE INTEGERS ****************************************************)
19
20 (*** le *)
21 (*** le_ind *)
22 inductive nle (m:nat): predicate nat ≝
23 | nle_refl   : nle m m
24 | nle_succ_dx: ∀n. nle m n → nle m (↑n)
25 .
26
27 interpretation
28   "less equal (non-negative integers)"
29   'leq m n = (nle m n).
30
31 (* Basic constructions ******************************************************)
32
33 (*** le_n_Sn *)
34 lemma nle_succ_dx_refl (m): m ≤ ↑m.
35 /2 width=1 by nle_refl, nle_succ_dx/ qed.
36
37 (*** le_O_n *)
38 lemma nle_zero_sx (m): 𝟎 ≤ m.
39 #m @(nat_ind … m) -m /2 width=1 by nle_succ_dx/
40 qed.
41
42 (*** le_S_S *)
43 lemma nle_succ_bi (m) (n): m ≤ n → ↑m ≤ ↑n.
44 #m #n #H elim H -n /2 width=1 by nle_refl, nle_succ_dx/
45 qed.
46
47 (*** le_or_ge *)
48 lemma nle_ge_e (m) (n): ∨∨ m ≤ n | n ≤ m.
49 #m @(nat_ind … m) -m [ /2 width=1 by or_introl/ ]
50 #m #IH #n @(nat_ind … n) -n [ /2 width=1 by or_intror/ ]
51 #n #_ elim (IH n) -IH /3 width=2 by nle_succ_bi, or_introl, or_intror/
52 qed-.
53
54 (* Basic inversions *********************************************************)
55
56 lemma nle_inv_succ_sn (m) (n): ↑m ≤ n → m ≤ n.
57 #m #n #H elim H -n /2 width=1 by nle_succ_dx/
58 qed-.
59
60 (*** le_S_S_to_le *)
61 lemma nle_inv_succ_bi (m) (n): ↑m ≤ ↑n → m ≤ n.
62 #m #n @(insert_eq_0 … (↑n))
63 #y * -y
64 [ #H <(eq_inv_nsucc_bi … H) -m //
65 | #y #Hy #H >(eq_inv_nsucc_bi … H) -n /2 width=1 by nle_inv_succ_sn/
66 ]
67 qed-.
68
69 (*** le_n_O_to_eq *)
70 lemma nle_inv_zero_dx (m): m ≤ 𝟎 → 𝟎 = m.
71 #m @(insert_eq_0 … (𝟎))
72 #y * -y
73 [ #H destruct //
74 | #y #_ #H elim (eq_inv_nzero_succ … H)
75 ]
76 qed-.
77
78 lemma nle_inv_succ_sn_refl (m): ↑m ≤ m → ⊥.
79 #m @(nat_ind … m) -m [| #m #IH ] #H
80 [ /3 width=2 by nle_inv_zero_dx, eq_inv_nzero_succ/
81 | /3 width=1 by nle_inv_succ_bi/
82 ]
83 qed-.
84
85 (* Order properties *********************************************************)
86
87 (*** le_to_le_to_eq *)
88 theorem nle_antisym (m) (n): m ≤ n → n ≤ m → m = n.
89 #m #n #H elim H -n //
90 #n #_ #IH #Hn
91 lapply (nle_inv_succ_sn … Hn) #H
92 lapply (IH H) -IH -H #H destruct
93 elim (nle_inv_succ_sn_refl … Hn)
94 qed-.
95
96 (*** transitive_le *)
97 theorem nle_trans: Transitive … nle.
98 #m #n #H elim H -n /3 width=1 by nle_inv_succ_sn/
99 qed-.
100
101 (* Advanced constructions ***************************************************)
102
103 (*** decidable_le *)
104 lemma nle_dec (m) (n): Decidable … (m ≤ n).
105 #m #n elim (nle_ge_e m n) [ /2 width=1 by or_introl/ ]
106 #Hnm elim (eq_nat_dec m n) [ #H destruct /2 width=1 by nle_refl, or_introl/ ]
107 /4 width=1 by nle_antisym, or_intror/
108 qed-.