]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/ground/arith/arith.txt
arithmetics for λδ
[helm.git] / matita / matita / contribs / lambdadelta / ground / arith / arith.txt
1 (* Equalities ***************************************************************)
2
3 (*** plus_minus_plus_plus_l *) (**)
4 lemma plus_minus_plus_plus_l: ∀z,x,y,h. z + (x + h) - (y + h) = z + x - y.
5 #H1 #H2 #H3 #H4
6 <nplus_assoc <nminus_plus_dx_bi // qed-.
7
8 fact plus_minus_minus_be_aux: ∀i,x,y,z. y ≤ z → z ≤ x → i = z - y → x - z + i = x - y.
9 /2 width=1 by plus_minus_minus_be/ qed-.
10
11 (* Properties ***************************************************************)
12
13 (*** lt_plus_Sn_r *) (**)
14 lemma lt_plus_Sn_r: ∀a,x,n. a < a + x + ↑n.
15 /2 width=1/ qed-.
16
17 lemma monotonic_le_minus_l2: ∀x1,x2,y,z. x1 ≤ x2 → x1 - y - z ≤ x2 - y - z.
18 /3 width=1 by monotonic_le_minus_l/ qed.
19
20 (* Inversion & forward lemmas ***********************************************)
21
22 lemma le_plus_xySz_x_false: ∀y,z,x. x + y + S z ≤ x → ⊥.
23 #y #z #x elim x -x /3 width=1 by le_S_S_to_le/
24 #H elim (le_plus_xSy_O_false … H)
25 qed-.
26
27 lemma plus_xySz_x_false: ∀z,x,y. x + y + S z = x → ⊥.
28 /2 width=4 by le_plus_xySz_x_false/ qed-.
29
30 lemma nat_elim_le_sn (Q:relation …):
31       (∀m1,m2. (∀m. m < m2-m1 → Q (m2-m) m2) → m1 ≤ m2 → Q m1 m2) →
32       ∀n1,n2. n1 ≤ n2 → Q n1 n2.
33 #Q #IH #n1 #n2 #Hn
34 <(minus_minus_m_m … Hn) -Hn
35 lapply (minus_le n2 n1)
36 let d ≝ (n2-n1)
37 @(nat_elim1 … d) -d -n1 #d
38 @pull_2 #Hd
39 <(minus_minus_m_m … Hd) in ⊢ (%→?); -Hd
40 let n1 ≝ (n2-d) #IHd
41 @IH -IH [| // ] #m #Hn
42 /4 width=3 by lt_to_le, lt_to_le_to_lt/
43 qed-.
44
45 (* Decidability of predicates ***********************************************)
46
47 lemma dec_lt (R:predicate nat):
48       (∀n. Decidable … (R n)) →
49       ∀n. Decidable … (∃∃m. m < n & R m).
50 #R #HR #n elim n -n [| #n * ]
51 [ @or_intror * /2 width=2 by lt_zero_false/
52 | * /4 width=3 by lt_S, or_introl, ex2_intro/
53 | #H0 elim (HR n) -HR
54   [ /3 width=3 by or_introl, ex2_intro/
55   | #Hn @or_intror * #m #Hmn #Hm
56     elim (le_to_or_lt_eq … Hmn) -Hmn #H destruct [ -Hn | -H0 ]
57     /4 width=3 by lt_S_S_to_lt, ex2_intro/
58   ]
59 ]
60 qed-.
61
62 lemma dec_min (R:predicate nat):
63       (∀n. Decidable … (R n)) → ∀n. R n →
64       ∃∃m. m ≤ n & R m & (∀p. p < m → R p → ⊥).
65 #R #HR #n
66 @(nat_elim1 n) -n #n #IH #Hn
67 elim (dec_lt … HR n) -HR [ -Hn | -IH ]
68 [ * #p #Hpn #Hp
69   elim (IH … Hpn Hp) -IH -Hp #m #Hmp #Hm #HNm
70   @(ex3_intro … Hm HNm) -HNm
71   /3 width=3 by lt_to_le, le_to_lt_to_lt/
72 | /4 width=4 by ex3_intro, ex2_intro/
73 ]
74 qed-.