1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| The HELM team. *)
8 (* ||A|| http://helm.cs.unibo.it *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU General Public License Version 2 *)
13 (**************************************************************************)
15 include "ground/insert_eq/insert_eq_1.ma".
16 include "ground/arith/nat_succ.ma".
18 (* ORDER FOR NON-NEGATIVE INTEGERS ******************************************)
22 inductive nle (m:nat): predicate nat ≝
24 | nle_succ_dx: ∀n. nle m n → nle m (↑n)
28 "less equal (non-negative integers)"
31 (* Basic constructions ******************************************************)
34 lemma nle_succ_dx_refl (m): m ≤ ↑m.
35 /2 width=1 by nle_refl, nle_succ_dx/ qed.
38 lemma nle_zero_sx (m): 𝟎 ≤ m.
39 #m @(nat_ind_succ … m) -m /2 width=1 by nle_succ_dx/
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/
48 lemma nat_split_le_ge (m) (n): ∨∨ m ≤ n | n ≤ m.
49 #m #n @(nat_ind_2_succ … m n) -m -n
50 [ /2 width=1 by or_introl/
51 | /2 width=1 by or_intror/
52 | #m #n * /3 width=2 by nle_succ_bi, or_introl, or_intror/
56 (* Basic destructions *******************************************************)
58 lemma nle_des_succ_sn (m) (n): ↑m ≤ n → m ≤ n.
59 #m #n #H elim H -n /2 width=1 by nle_succ_dx/
62 (* Basic inversions *********************************************************)
65 lemma nle_inv_succ_bi (m) (n): ↑m ≤ ↑n → m ≤ n.
66 #m #n @(insert_eq_1 … (↑n))
68 [ #H >(eq_inv_nsucc_bi … H) -n //
69 | #o #Ho #H >(eq_inv_nsucc_bi … H) -n
70 /2 width=1 by nle_des_succ_sn/
75 lemma nle_inv_zero_dx (m): m ≤ 𝟎 → 𝟎 = m.
76 #m @(insert_eq_1 … (𝟎))
79 | #y #_ #H elim (eq_inv_zero_nsucc … H)
83 (* Advanced inversions ******************************************************)
85 (*** le_plus_xSy_O_false *)
86 lemma nle_inv_succ_zero (m): ↑m ≤ 𝟎 → ⊥.
87 /3 width=2 by nle_inv_zero_dx, eq_inv_zero_nsucc/ qed-.
89 lemma nle_inv_succ_sn_refl (m): ↑m ≤ m → ⊥.
90 #m @(nat_ind_succ … m) -m [| #m #IH ] #H
91 [ /3 width=2 by nle_inv_zero_dx, eq_inv_zero_nsucc/
92 | /3 width=1 by nle_inv_succ_bi/
96 (*** le_to_le_to_eq *)
97 theorem nle_antisym (m) (n): m ≤ n → n ≤ m → m = n.
100 lapply (nle_des_succ_sn … Hn) #H
101 lapply (IH H) -IH -H #H destruct
102 elim (nle_inv_succ_sn_refl … Hn)
105 (* Advanced eliminations ****************************************************)
108 lemma nle_ind_alt (Q: relation2 nat nat):
110 (∀m,n. m ≤ n → Q m n → Q (↑m) (↑n)) →
112 #Q #IH1 #IH2 #m #n @(nat_ind_2_succ … m n) -m -n //
113 [ #m #H elim (nle_inv_succ_zero … H)
114 | /4 width=1 by nle_inv_succ_bi/
118 (* Advanced constructions ***************************************************)
120 (*** transitive_le *)
121 theorem nle_trans: Transitive … nle.
122 #m #n #H elim H -n /3 width=1 by nle_des_succ_sn/
125 (*** decidable_le le_dec *)
126 lemma nle_dec (m) (n): Decidable … (m ≤ n).
127 #m #n elim (nat_split_le_ge m n) [ /2 width=1 by or_introl/ ]
128 #Hnm elim (eq_nat_dec m n) [ #H destruct /2 width=1 by nle_refl, or_introl/ ]
129 /4 width=1 by nle_antisym, or_intror/