]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/ground/arith/nat_plus.ma
ffb181cc4908dea0a5048498cb6c2a11a453f56a
[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_iter_succ.ma".
16
17 (* 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 (* 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 lemma nplus_succ_sn (m) (n): โ†‘(m+n) = โ†‘m + n.
44 #m #n @(niter_appl โ€ฆ nsucc)
45 qed.
46
47 (*** plus_O_n.con *)
48 lemma nplus_zero_sn (m): m = ๐ŸŽ + m.
49 #m @(nat_ind โ€ฆ m) -m //
50 qed.
51
52 (*** commutative_plus *)
53 lemma nplus_comm: commutative โ€ฆ nplus.
54 #m @(nat_ind โ€ฆ m) -m //
55 qed-.
56
57 lemma nplus_one_sn (n): โ†‘n = ๐Ÿ + n.
58 #n <nplus_comm // qed.
59
60 (*** associative_plus *)
61 lemma nplus_assoc: associative โ€ฆ nplus.
62 #m #n #o @(nat_ind โ€ฆ o) -o //
63 #o #IH <nplus_succ_dx <nplus_succ_dx <nplus_succ_dx <IH -IH //
64 qed.
65
66 (*** assoc_plus1 *)
67 lemma nplus_plus_comm_12 (o) (m) (n): m + n + o = n + (m + o).
68 #o #m #n <nplus_comm in โŠข (??(?%?)?); // qed.
69
70 (*** plus_plus_comm_23 *)
71 lemma nplus_plus_comm_23 (o) (m) (n): o + m + n = o + n + m.
72 #o #m #n >nplus_assoc >nplus_assoc <nplus_comm in โŠข (??(??%)?); //
73 qed-.
74
75 (* Basic inversions *********************************************************)
76
77 lemma eq_inv_nzero_plus (m) (n): ๐ŸŽ = m + n โ†’ โˆงโˆง ๐ŸŽ = m & ๐ŸŽ = n.
78 #m #n @(nat_ind โ€ฆ n) -n /2 width=1 by conj/
79 #n #_ <nplus_succ_dx #H
80 elim (eq_inv_nzero_succ โ€ฆ H)
81 qed-.
82
83 (*** injective_plus_l *)
84 lemma eq_inv_nplus_bi_dx (o) (m) (n): m + o = n + o โ†’ m = n.
85 #o @(nat_ind โ€ฆ o) -o /3 width=1 by eq_inv_nsucc_bi/
86 qed-.
87
88 (*** injective_plus_r *)
89 lemma eq_inv_nplus_bi_sn (o) (m) (n): o + m = o + n โ†’ m = n.
90 #o #m #n <nplus_comm <nplus_comm in โŠข (???%โ†’?);
91 /2 width=2 by eq_inv_nplus_bi_dx/ qed-.
92
93 (* Advanced eliminations ****************************************************)
94
95 (*** nat_ind_plus *)
96 lemma nat_ind_plus (Q:predicate โ€ฆ):
97       Q (๐ŸŽ) โ†’ (โˆ€n. Q n โ†’ Q (๐Ÿ+n)) โ†’ โˆ€n. Q n.
98 #Q #IH1 #IH2 #n @(nat_ind โ€ฆ n) -n /2 width=1 by/
99 qed-.