1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| A.Asperti, C.Sacerdoti Coen, *)
8 (* ||A|| E.Tassi, S.Zacchiroli *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU Lesser General Public License Version 2.1 *)
13 (**************************************************************************)
15 set "baseuri" "cic:/matita/Z/".
19 inductive Z : Set \def
24 definition Z_of_nat \def
25 \lambda n. match n with
27 | (S n)\Rightarrow pos n].
31 definition neg_Z_of_nat \def
32 \lambda n. match n with
34 | (S n)\Rightarrow neg n].
40 | (pos n) \Rightarrow n
41 | (neg n) \Rightarrow n].
43 definition OZ_testb \def
47 | (pos n) \Rightarrow false
48 | (neg n) \Rightarrow false].
51 \forall z. if_then_else (OZ_testb z) (eq Z z OZ) (Not (eq Z z OZ)).
52 intros.elim z.simplify.reflexivity.
56 | (pos n) \Rightarrow False
57 | (neg n) \Rightarrow False].
58 apply Hcut.rewrite > H.simplify.exact I.
62 | (pos n) \Rightarrow False
63 | (neg n) \Rightarrow False].
64 apply Hcut. rewrite > H.simplify.exact I.
68 \lambda z. match z with
69 [ OZ \Rightarrow pos O
70 | (pos n) \Rightarrow pos (S n)
74 | (S p) \Rightarrow neg p]].
77 \lambda z. match z with
78 [ OZ \Rightarrow neg O
82 | (S p) \Rightarrow pos p]
83 | (neg n) \Rightarrow neg (S n)].
85 theorem Zpred_succ: \forall z:Z. eq Z (Zpred (Zsucc z)) z.
86 intros.elim z.reflexivity.
92 theorem Zsucc_pred: \forall z:Z. eq Z (Zsucc (Zpred z)) z.
93 intros.elim z.reflexivity.
99 let rec Zplus x y : Z \def
102 | (pos m) \Rightarrow
105 | (pos n) \Rightarrow (pos (S (plus m n)))
106 | (neg n) \Rightarrow
107 match nat_compare m n with
108 [ LT \Rightarrow (neg (pred (minus n m)))
110 | GT \Rightarrow (pos (pred (minus m n)))]]
111 | (neg m) \Rightarrow
114 | (pos n) \Rightarrow
115 match nat_compare m n with
116 [ LT \Rightarrow (pos (pred (minus n m)))
118 | GT \Rightarrow (neg (pred (minus m n)))]
119 | (neg n) \Rightarrow (neg (S (plus m n)))]].
121 theorem Zplus_z_O: \forall z:Z. eq Z (Zplus z OZ) z.
123 simplify.reflexivity.
124 simplify.reflexivity.
125 simplify.reflexivity.
128 theorem sym_Zplus : \forall x,y:Z. eq Z (Zplus x y) (Zplus y x).
129 intros.elim x.simplify.rewrite > Zplus_z_O y.reflexivity.
130 elim y.simplify.reflexivity.
132 rewrite < (sym_plus e e1).reflexivity.
134 rewrite > nat_compare_invert e e1.
135 simplify.elim nat_compare e1 e.simplify.reflexivity.
136 simplify. reflexivity.
137 simplify. reflexivity.
138 elim y.simplify.reflexivity.
139 simplify.rewrite > nat_compare_invert e e1.
140 simplify.elim nat_compare e1 e.simplify.reflexivity.
141 simplify. reflexivity.
142 simplify. reflexivity.
143 simplify.elim (sym_plus e1 e).reflexivity.
146 theorem Zpred_neg : \forall z:Z. eq Z (Zpred z) (Zplus (neg O) z).
148 simplify.reflexivity.
149 simplify.reflexivity.
150 elim e.simplify.reflexivity.
151 simplify.reflexivity.
154 theorem Zsucc_pos : \forall z:Z. eq Z (Zsucc z) (Zplus (pos O) z).
156 simplify.reflexivity.
157 elim e.simplify.reflexivity.
158 simplify.reflexivity.
159 simplify.reflexivity.
162 theorem Zplus_succ_pred_pp :
163 \forall n,m. eq Z (Zplus (pos n) (pos m)) (Zplus (Zsucc (pos n)) (Zpred (pos m))).
166 simplify.reflexivity.
167 simplify.reflexivity.
170 rewrite < plus_n_O e.reflexivity.
172 rewrite < plus_n_Sm e e1.reflexivity.
175 theorem Zplus_succ_pred_pn :
176 \forall n,m. eq Z (Zplus (pos n) (neg m)) (Zplus (Zsucc (pos n)) (Zpred (neg m))).
180 theorem Zplus_succ_pred_np :
181 \forall n,m. eq Z (Zplus (neg n) (pos m)) (Zplus (Zsucc (neg n)) (Zpred (pos m))).
184 simplify.reflexivity.
185 simplify.reflexivity.
187 simplify.reflexivity.
188 simplify.reflexivity.
191 theorem Zplus_succ_pred_nn:
192 \forall n,m. eq Z (Zplus (neg n) (neg m)) (Zplus (Zsucc (neg n)) (Zpred (neg m))).
195 simplify.reflexivity.
196 simplify.reflexivity.
198 simplify.rewrite < plus_n_Sm e O.reflexivity.
199 simplify.rewrite > plus_n_Sm e (S e1).reflexivity.
202 (*CSC: da qui in avanti rewrite ancora non utilizzata *)
203 theorem Zplus_succ_pred:
204 \forall x,y. eq Z (Zplus x y) (Zplus (Zsucc x) (Zpred y)).
207 simplify.reflexivity.
208 simplify.reflexivity.
209 elim (Zsucc_pos ?).elim (sym_eq ? ? ? (Zsucc_pred ?)).reflexivity.
210 elim y.elim sym_Zplus ? ?.elim sym_Zplus (Zpred OZ) ?.
211 elim (Zpred_neg ?).elim (sym_eq ? ? ? (Zpred_succ ?)).
212 simplify.reflexivity.
213 apply Zplus_succ_pred_nn.
214 apply Zplus_succ_pred_np.
215 elim y.simplify.reflexivity.
216 apply Zplus_succ_pred_pn.
217 apply Zplus_succ_pred_pp.
220 theorem Zsucc_plus_pp :
221 \forall n,m. eq Z (Zplus (Zsucc (pos n)) (pos m)) (Zsucc (Zplus (pos n) (pos m))).
225 theorem Zsucc_plus_pn :
226 \forall n,m. eq Z (Zplus (Zsucc (pos n)) (neg m)) (Zsucc (Zplus (pos n) (neg m))).
229 (\lambda n,m. eq Z (Zplus (Zsucc (pos n)) (neg m)) (Zsucc (Zplus (pos n) (neg m)))).intro.
231 simplify. reflexivity.
232 elim e.simplify. reflexivity.
233 simplify. reflexivity.
235 simplify. reflexivity.
236 simplify.reflexivity.
238 elim (Zplus_succ_pred_pn ? m1).
242 theorem Zsucc_plus_nn :
243 \forall n,m. eq Z (Zplus (Zsucc (neg n)) (neg m)) (Zsucc (Zplus (neg n) (neg m))).
246 (\lambda n,m. eq Z (Zplus (Zsucc (neg n)) (neg m)) (Zsucc (Zplus (neg n) (neg m)))).intro.
248 simplify. reflexivity.
249 elim e.simplify. reflexivity.
250 simplify. reflexivity.
252 simplify. reflexivity.
253 simplify.reflexivity.
255 elim (Zplus_succ_pred_nn ? m1).
259 theorem Zsucc_plus_np :
260 \forall n,m. eq Z (Zplus (Zsucc (neg n)) (pos m)) (Zsucc (Zplus (neg n) (pos m))).
263 (\lambda n,m. eq Z (Zplus (Zsucc (neg n)) (pos m)) (Zsucc (Zplus (neg n) (pos m)))).
265 simplify. reflexivity.
266 elim e.simplify. reflexivity.
267 simplify. reflexivity.
269 simplify. reflexivity.
270 simplify.reflexivity.
273 elim (Zplus_succ_pred_np ? (S m1)).
278 theorem Zsucc_plus : \forall x,y:Z. eq Z (Zplus (Zsucc x) y) (Zsucc (Zplus x y)).
279 intros.elim x.elim y.
280 simplify. reflexivity.
281 elim (Zsucc_pos ?).reflexivity.
282 simplify.reflexivity.
283 elim y.elim sym_Zplus ? ?.elim sym_Zplus OZ ?.simplify.reflexivity.
287 elim (sym_Zplus OZ ?).reflexivity.
292 theorem Zpred_plus : \forall x,y:Z. eq Z (Zplus (Zpred x) y) (Zpred (Zplus x y)).
294 cut eq Z (Zpred (Zplus x y)) (Zpred (Zplus (Zsucc (Zpred x)) y)).
295 elim (sym_eq ? ? ? Hcut).
296 elim (sym_eq ? ? ? (Zsucc_plus ? ?)).
297 elim (sym_eq ? ? ? (Zpred_succ ?)).
299 elim (sym_eq ? ? ? (Zsucc_pred ?)).
303 theorem assoc_Zplus :
304 \forall x,y,z:Z. eq Z (Zplus x (Zplus y z)) (Zplus (Zplus x y) z).
305 intros.elim x.simplify.reflexivity.
306 elim e.elim (Zpred_neg (Zplus y z)).
308 elim (Zpred_plus ? ?).
310 elim (sym_eq ? ? ? (Zpred_plus (neg e1) ?)).
311 elim (sym_eq ? ? ? (Zpred_plus (neg e1) ?)).
312 elim (sym_eq ? ? ? (Zpred_plus (Zplus (neg e1) y) ?)).
313 apply f_equal.assumption.
314 elim e.elim (Zsucc_pos ?).
316 apply (sym_eq ? ? ? (Zsucc_plus ? ?)) .
317 elim (sym_eq ? ? ? (Zsucc_plus (pos e1) ?)).
318 elim (sym_eq ? ? ? (Zsucc_plus (pos e1) ?)).
319 elim (sym_eq ? ? ? (Zsucc_plus (Zplus (pos e1) y) ?)).
320 apply f_equal.assumption.