]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/ground/arith/nat_plus.ma
arithmetics for λδ
[helm.git] / matita / matita / contribs / lambdadelta / ground / arith / nat_plus.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/arith/nat_succ_iter.ma".
16
17 (* ADDITION FOR NON-NEGATIVE INTEGERS ***************************************)
18
19 (*** plus *)
20 definition nplus: nat → nat → nat ≝
21            λm,n. nsucc^n m.
22
23 interpretation
24   "plus (positive integers)"
25   'plus m n = (nplus m n).
26
27 (* Basic rewrites ***********************************************************)
28
29 (*** plus_n_O *)
30 lemma nplus_zero_dx (m): m = m + 𝟎.
31 // qed.
32
33 lemma nplus_one_dx (n): ↑n = n + 𝟏.
34 // qed.
35
36 (* Advanved rewrites (semigroup properties) *********************************)
37
38 (*** plus_n_Sm *)
39 lemma nplus_succ_dx (m) (n): ↑(m+n) = m + ↑n.
40 #m #n @(niter_succ … nsucc)
41 qed.
42
43 (*** plus_S1 *)
44 lemma nplus_succ_sn (m) (n): ↑(m+n) = ↑m + n.
45 #m #n @(niter_appl … nsucc)
46 qed.
47
48 (*** plus_O_n.con *)
49 lemma nplus_zero_sn (m): m = 𝟎 + m.
50 #m @(nat_ind … m) -m //
51 qed.
52
53 (*** commutative_plus *)
54 lemma nplus_comm: commutative … nplus.
55 #m @(nat_ind … m) -m //
56 qed-.
57
58 (*** associative_plus *)
59 lemma nplus_assoc: associative … nplus.
60 #m #n #o @(nat_ind … o) -o //
61 #o #IH <nplus_succ_dx <nplus_succ_dx <nplus_succ_dx <IH -IH //
62 qed.
63
64 (* Advanced constructions ***************************************************)
65
66 lemma nplus_one_sn (n): ↑n = 𝟏 + n.
67 #n <nplus_comm // qed.
68
69 lemma nplus_succ_shift (m) (n): ↑m + n = m + ↑n.
70 // qed-.
71
72 (*** assoc_plus1 *)
73 lemma nplus_plus_comm_12 (o) (m) (n): m + n + o = n + (m + o).
74 #o #m #n <nplus_comm in ⊢ (??(?%?)?); // qed.
75
76 (*** plus_plus_comm_23 *)
77 lemma nplus_plus_comm_23 (o) (m) (n): o + m + n = o + n + m.
78 #o #m #n >nplus_assoc >nplus_assoc <nplus_comm in ⊢ (??(??%)?); //
79 qed-.
80
81 (* Basic inversions *********************************************************)
82
83 lemma eq_inv_nzero_plus (m) (n): 𝟎 = m + n → ∧∧ 𝟎 = m & 𝟎 = n.
84 #m #n @(nat_ind … n) -n /2 width=1 by conj/
85 #n #_ <nplus_succ_dx #H
86 elim (eq_inv_nzero_succ … H)
87 qed-.
88
89 (*** injective_plus_l *)
90 lemma eq_inv_nplus_bi_dx (o) (m) (n): m + o = n + o → m = n.
91 #o @(nat_ind … o) -o /3 width=1 by eq_inv_nsucc_bi/
92 qed-.
93
94 (*** injective_plus_r *)
95 lemma eq_inv_nplus_bi_sn (o) (m) (n): o + m = o + n → m = n.
96 #o #m #n <nplus_comm <nplus_comm in ⊢ (???%→?);
97 /2 width=2 by eq_inv_nplus_bi_dx/
98 qed-.
99
100 (* Advanced eliminations ****************************************************)
101
102 (*** nat_ind_plus *)
103 lemma nat_ind_plus (Q:predicate …):
104       Q (𝟎) → (∀n. Q n → Q (𝟏+n)) → ∀n. Q n.
105 #Q #IH1 #IH2 #n @(nat_ind … n) -n /2 width=1 by/
106 qed-.