]> matita.cs.unibo.it Git - helm.git/blob - helm/matita/library/Z/times.ma
ocaml 3.09 transition
[helm.git] / helm / matita / library / Z / times.ma
1 (**************************************************************************)
2 (*       __                                                               *)
3 (*      ||M||                                                             *)
4 (*      ||A||       A project by Andrea Asperti                           *)
5 (*      ||T||                                                             *)
6 (*      ||I||       Developers:                                           *)
7 (*      ||T||       A.Asperti, C.Sacerdoti Coen,                          *)
8 (*      ||A||       E.Tassi, S.Zacchiroli                                 *)
9 (*      \   /                                                             *)
10 (*       \ /        This file is distributed under the terms of the       *)
11 (*        v         GNU Lesser General Public License Version 2.1         *)
12 (*                                                                        *)
13 (**************************************************************************)
14
15 set "baseuri" "cic:/matita/Z/times".
16
17 include "nat/lt_arith.ma".
18 include "Z/plus.ma".
19
20 definition Ztimes :Z \to Z \to Z \def
21 \lambda x,y.
22   match x with
23     [ OZ \Rightarrow OZ
24     | (pos m) \Rightarrow
25         match y with
26          [ OZ \Rightarrow OZ
27          | (pos n) \Rightarrow (pos (pred ((S m) * (S n))))
28          | (neg n) \Rightarrow (neg (pred ((S m) * (S n))))]
29     | (neg m) \Rightarrow
30         match y with
31          [ OZ \Rightarrow OZ
32          | (pos n) \Rightarrow (neg (pred ((S m) * (S n))))
33          | (neg n) \Rightarrow (pos (pred ((S m) * (S n))))]].
34          
35 (*CSC: the URI must disappear: there is a bug now *)
36 interpretation "integer times" 'times x y = (cic:/matita/Z/times/Ztimes.con x y).
37
38 theorem Ztimes_z_OZ:  \forall z:Z. z*OZ = OZ.
39 intro.elim z.
40 simplify.reflexivity.
41 simplify.reflexivity.
42 simplify.reflexivity.
43 qed.
44
45 theorem Ztimes_neg_Zopp: \forall n:nat.\forall x:Z.
46 neg n * x = - (pos n * x).
47 intros.elim x.
48 simplify.reflexivity.
49 simplify.reflexivity.
50 simplify.reflexivity.
51 qed.
52 theorem symmetric_Ztimes : symmetric Z Ztimes.
53 change with (\forall x,y:Z. x*y = y*x).
54 intros.elim x.rewrite > Ztimes_z_OZ.reflexivity.
55 elim y.simplify.reflexivity. 
56 change with (pos (pred ((S n) * (S n1))) = pos (pred ((S n1) * (S n)))).
57 rewrite < sym_times.reflexivity.
58 change with (neg (pred ((S n) * (S n1))) = neg (pred ((S n1) * (S n)))).
59 rewrite < sym_times.reflexivity.
60 elim y.simplify.reflexivity.
61 change with (neg (pred ((S n) * (S n1))) = neg (pred ((S n1) * (S n)))).
62 rewrite < sym_times.reflexivity.
63 change with (pos (pred ((S n) * (S n1))) = pos (pred ((S n1) * (S n)))).
64 rewrite < sym_times.reflexivity.
65 qed.
66
67 variant sym_Ztimes : \forall x,y:Z. x*y = y*x
68 \def symmetric_Ztimes.
69
70 theorem associative_Ztimes: associative Z Ztimes.
71 change with (\forall x,y,z:Z. (x*y)*z = x*(y*z)).
72 intros.elim x.
73   simplify.reflexivity. 
74   elim y.
75     simplify.reflexivity.
76     elim z.
77       simplify.reflexivity.
78       change with 
79        (pos (pred ((S (pred ((S n) * (S n1)))) * (S n2))) =
80        pos (pred ((S n) * (S (pred ((S n1) * (S n2))))))).
81         rewrite < S_pred.rewrite < S_pred.rewrite < assoc_times.reflexivity.
82          apply lt_O_times_S_S.apply lt_O_times_S_S.
83       change with 
84        (neg (pred ((S (pred ((S n) * (S n1)))) * (S n2))) =
85        neg (pred ((S n) * (S (pred ((S n1) * (S n2))))))).
86         rewrite < S_pred.rewrite < S_pred.rewrite < assoc_times.reflexivity.
87          apply lt_O_times_S_S.apply lt_O_times_S_S.
88     elim z.
89       simplify.reflexivity.
90       change with 
91        (neg (pred ((S (pred ((S n) * (S n1)))) * (S n2))) =
92        neg (pred ((S n) * (S (pred ((S n1) * (S n2))))))).
93         rewrite < S_pred.rewrite < S_pred.rewrite < assoc_times.reflexivity.
94          apply lt_O_times_S_S.apply lt_O_times_S_S.
95       change with 
96        (pos (pred ((S (pred ((S n) * (S n1)))) * (S n2))) =
97        pos(pred ((S n) * (S (pred ((S n1) * (S n2))))))).
98         rewrite < S_pred.rewrite < S_pred.rewrite < assoc_times.reflexivity.
99         apply lt_O_times_S_S.apply lt_O_times_S_S.
100   elim y.
101     simplify.reflexivity.
102     elim z.
103       simplify.reflexivity.
104       change with 
105        (neg (pred ((S (pred ((S n) * (S n1)))) * (S n2))) =
106        neg (pred ((S n) * (S (pred ((S n1) * (S n2))))))).
107         rewrite < S_pred.rewrite < S_pred.rewrite < assoc_times.reflexivity.
108          apply lt_O_times_S_S.apply lt_O_times_S_S.
109       change with 
110        (pos (pred ((S (pred ((S n) * (S n1)))) * (S n2))) =
111        pos (pred ((S n) * (S (pred ((S n1) * (S n2))))))).
112         rewrite < S_pred.rewrite < S_pred.rewrite < assoc_times.reflexivity.
113          apply lt_O_times_S_S.apply lt_O_times_S_S.
114     elim z.
115       simplify.reflexivity.
116       change with 
117        (pos (pred ((S (pred ((S n) * (S n1)))) * (S n2))) =
118        pos (pred ((S n) * (S (pred ((S n1) * (S n2))))))).
119         rewrite < S_pred.rewrite < S_pred.rewrite < assoc_times.reflexivity.
120          apply lt_O_times_S_S.apply lt_O_times_S_S.
121       change with 
122        (neg (pred ((S (pred ((S n) * (S n1)))) * (S n2))) =
123        neg(pred ((S n) * (S (pred ((S n1) * (S n2))))))).
124         rewrite < S_pred.rewrite < S_pred.rewrite < assoc_times.reflexivity.
125          apply lt_O_times_S_S.apply lt_O_times_S_S.
126 qed.
127
128 variant assoc_Ztimes : \forall x,y,z:Z. 
129 (x * y) * z = x * (y * z) \def 
130 associative_Ztimes.
131
132 lemma times_minus1: \forall n,p,q:nat. lt q p \to
133 (S n) * (S (pred ((S p) - (S q)))) =
134 pred ((S n) * (S p)) - pred ((S n) * (S q)).
135 intros.
136 rewrite < S_pred.  
137 rewrite > minus_pred_pred.
138 rewrite < distr_times_minus. 
139 reflexivity.
140 (* we now close all positivity conditions *)
141 apply lt_O_times_S_S.                    
142 apply lt_O_times_S_S.
143 simplify.unfold lt.
144 apply le_SO_minus.  exact H.
145 qed.
146
147 lemma Ztimes_Zplus_pos_neg_pos: \forall n,p,q:nat.
148 (pos n)*((neg p)+(pos q)) = (pos n)*(neg p)+ (pos n)*(pos q). 
149 intros.
150 simplify. 
151 change in match (p + n * (S p)) with (pred ((S n) * (S p))).
152 change in match (q + n * (S q)) with (pred ((S n) * (S q))).
153 rewrite < nat_compare_pred_pred.
154 rewrite < nat_compare_times_l.
155 rewrite < nat_compare_S_S.
156 apply (nat_compare_elim p q).
157 intro.
158 (* uff *)
159 change with (pos (pred ((S n) * (S (pred ((S q) - (S p)))))) =
160             pos (pred ((pred ((S n) * (S q))) - (pred ((S n) * (S p)))))).
161 rewrite < (times_minus1 n q p H).reflexivity.
162 intro.rewrite < H.simplify.reflexivity.
163 intro.
164 change with (neg (pred ((S n) * (S (pred ((S p) - (S q)))))) =
165             neg (pred ((pred ((S n) * (S p))) - (pred ((S n) * (S q)))))). 
166 rewrite < (times_minus1 n p q H).reflexivity.                                 
167 (* two more positivity conditions from nat_compare_pred_pred *)   
168 apply lt_O_times_S_S.  
169 apply lt_O_times_S_S. 
170 qed. 
171
172 lemma Ztimes_Zplus_pos_pos_neg: \forall n,p,q:nat.
173 (pos n)*((pos p)+(neg q)) = (pos n)*(pos p)+ (pos n)*(neg q).
174 intros.
175 rewrite < sym_Zplus.
176 rewrite > Ztimes_Zplus_pos_neg_pos.
177 apply sym_Zplus.
178 qed.
179
180 lemma distributive2_Ztimes_pos_Zplus: 
181 distributive2 nat Z (\lambda n,z. (pos n) * z) Zplus.
182 change with (\forall n,y,z.
183 (pos n) * (y + z) = (pos n) * y + (pos n) * z).  
184 intros.elim y.
185   reflexivity.
186   elim z.
187     reflexivity.
188     change with
189      (pos (pred ((S n) * ((S n1) + (S n2)))) =
190      pos (pred ((S n) * (S n1) + (S n) * (S n2)))).
191       rewrite < distr_times_plus.reflexivity.
192     apply Ztimes_Zplus_pos_pos_neg.
193   elim z.
194     reflexivity.
195     apply Ztimes_Zplus_pos_neg_pos.
196     change with
197      (neg (pred ((S n) * ((S n1) + (S n2)))) =
198      neg (pred ((S n) * (S n1) + (S n) * (S n2)))).
199     rewrite < distr_times_plus.reflexivity.
200 qed.
201
202 variant distr_Ztimes_Zplus_pos: \forall n,y,z.
203 (pos n) * (y + z) = ((pos n) * y + (pos n) * z) \def
204 distributive2_Ztimes_pos_Zplus.
205
206 lemma distributive2_Ztimes_neg_Zplus : 
207 distributive2 nat Z (\lambda n,z. (neg n) * z) Zplus.
208 change with (\forall n,y,z.
209 (neg n) * (y + z) = (neg n) * y + (neg n) * z).  
210 intros.
211 rewrite > Ztimes_neg_Zopp. 
212 rewrite > distr_Ztimes_Zplus_pos.
213 rewrite > Zopp_Zplus.
214 rewrite < Ztimes_neg_Zopp. rewrite < Ztimes_neg_Zopp.
215 reflexivity.
216 qed.
217
218 variant distr_Ztimes_Zplus_neg: \forall n,y,z.
219 (neg n) * (y + z) = (neg n) * y + (neg n) * z \def
220 distributive2_Ztimes_neg_Zplus.
221
222 theorem distributive_Ztimes_Zplus: distributive Z Ztimes Zplus.
223 change with (\forall x,y,z:Z. x * (y + z) = x*y + x*z).
224 intros.elim x.
225 (* case x = OZ *)
226 simplify.reflexivity.
227 (* case x = pos n *)
228 apply distr_Ztimes_Zplus_pos.
229 (* case x = neg n *)
230 apply distr_Ztimes_Zplus_neg.
231 qed.
232
233 variant distr_Ztimes_Zplus: \forall x,y,z.
234 x * (y + z) = x*y + x*z \def
235 distributive_Ztimes_Zplus.