198 by (simp_tac (simpset() addsimps [zdiff_def]) 1); |
198 by (simp_tac (simpset() addsimps [zdiff_def]) 1); |
199 qed "zdiff_self"; |
199 qed "zdiff_self"; |
200 |
200 |
201 Addsimps [zdiff0, zdiff0_right, zdiff_self]; |
201 Addsimps [zdiff0, zdiff0_right, zdiff_self]; |
202 |
202 |
203 (** Distributive laws for constants only **) |
203 |
204 |
204 (** Special simplification, for constants only **) |
205 Addsimps (map (read_instantiate_sg (sign_of thy) [("w", "number_of ?v")]) |
205 |
|
206 fun inst x t = read_instantiate_sg (sign_of Bin.thy) [(x,t)]; |
|
207 |
|
208 (*Distributive laws*) |
|
209 Addsimps (map (inst "w" "number_of ?v") |
206 [zadd_zmult_distrib, zadd_zmult_distrib2, |
210 [zadd_zmult_distrib, zadd_zmult_distrib2, |
207 zdiff_zmult_distrib, zdiff_zmult_distrib2]); |
211 zdiff_zmult_distrib, zdiff_zmult_distrib2]); |
208 |
212 |
|
213 Addsimps (map (inst "x" "number_of ?v") |
|
214 [zless_zminus, zle_zminus, equation_zminus]); |
|
215 Addsimps (map (inst "y" "number_of ?v") |
|
216 [zminus_zless, zminus_zle, zminus_equation]); |
|
217 |
|
218 |
209 (** Special-case simplification for small constants **) |
219 (** Special-case simplification for small constants **) |
210 |
220 |
211 Goal "#0 * z = (#0::int)"; |
221 Goal "#0 * z = (#0::int)"; |
212 by (Simp_tac 1); |
222 by (Simp_tac 1); |
213 qed "zmult_0"; |
223 qed "zmult_0"; |
222 |
232 |
223 Goal "z * #1 = (z::int)"; |
233 Goal "z * #1 = (z::int)"; |
224 by (Simp_tac 1); |
234 by (Simp_tac 1); |
225 qed "zmult_1_right"; |
235 qed "zmult_1_right"; |
226 |
236 |
227 (*For specialist use*) |
237 Goal "#-1 * z = -(z::int)"; |
|
238 by (simp_tac (simpset() addsimps zcompare_rls@[zmult_zminus]) 1); |
|
239 qed "zmult_minus1"; |
|
240 |
|
241 Goal "z * #-1 = -(z::int)"; |
|
242 by (simp_tac (simpset() addsimps zcompare_rls@[zmult_zminus_right]) 1); |
|
243 qed "zmult_minus1_right"; |
|
244 |
|
245 Addsimps [zmult_0, zmult_0_right, |
|
246 zmult_1, zmult_1_right, |
|
247 zmult_minus1, zmult_minus1_right]; |
|
248 |
|
249 (*For specialist use: NOT as default simprules*) |
228 Goal "#2 * z = (z+z::int)"; |
250 Goal "#2 * z = (z+z::int)"; |
229 by (simp_tac (simpset() addsimps [zadd_zmult_distrib]) 1); |
251 by (simp_tac (simpset() addsimps [zadd_zmult_distrib]) 1); |
230 qed "zmult_2"; |
252 qed "zmult_2"; |
231 |
253 |
232 Goal "z * #2 = (z+z::int)"; |
254 Goal "z * #2 = (z+z::int)"; |
233 by (simp_tac (simpset() addsimps [zadd_zmult_distrib2]) 1); |
255 by (simp_tac (simpset() addsimps [zadd_zmult_distrib2]) 1); |
234 qed "zmult_2_right"; |
256 qed "zmult_2_right"; |
235 |
257 |
236 Addsimps [zmult_0, zmult_0_right, |
258 |
237 zmult_1, zmult_1_right]; |
259 (** Inequality reasoning **) |
238 |
260 |
239 Goal "(w < z + (#1::int)) = (w<z | w=z)"; |
261 Goal "(w < z + (#1::int)) = (w<z | w=z)"; |
240 by (simp_tac (simpset() addsimps [zless_add_int_Suc_eq]) 1); |
262 by (simp_tac (simpset() addsimps [zless_add_int_Suc_eq]) 1); |
241 qed "zless_add1_eq"; |
263 qed "zless_add1_eq"; |
242 |
264 |
244 by (simp_tac (simpset() addsimps [add_int_Suc_zle_eq]) 1); |
266 by (simp_tac (simpset() addsimps [add_int_Suc_zle_eq]) 1); |
245 qed "add1_zle_eq"; |
267 qed "add1_zle_eq"; |
246 Addsimps [add1_zle_eq]; |
268 Addsimps [add1_zle_eq]; |
247 |
269 |
248 Goal "neg x = (x < #0)"; |
270 Goal "neg x = (x < #0)"; |
249 by (simp_tac (simpset() addsimps [neg_eq_less_nat0]) 1); |
271 by (simp_tac (simpset() addsimps [neg_eq_less_int0]) 1); |
250 qed "neg_eq_less_0"; |
272 qed "neg_eq_less_0"; |
251 |
273 |
252 Goal "(~neg x) = (int 0 <= x)"; |
274 Goal "(~neg x) = (int 0 <= x)"; |
253 by (simp_tac (simpset() addsimps [not_neg_eq_ge_nat0]) 1); |
275 by (simp_tac (simpset() addsimps [not_neg_eq_ge_int0]) 1); |
254 qed "not_neg_eq_ge_0"; |
276 qed "not_neg_eq_ge_0"; |
255 |
277 |
256 Goal "#0 <= int m"; |
278 Goal "#0 <= int m"; |
257 by (Simp_tac 1); |
279 by (Simp_tac 1); |
258 qed "zero_zle_int"; |
280 qed "zero_zle_int"; |
259 AddIffs [zero_zle_int]; |
281 AddIffs [zero_zle_int]; |
|
282 |
|
283 |
|
284 (** Products of signs **) |
|
285 |
|
286 Goal "[| (m::int) < #0; n < #0 |] ==> #0 < m*n"; |
|
287 by (dtac zmult_zless_mono1_neg 1); |
|
288 by Auto_tac; |
|
289 qed "neg_times_neg_is_pos"; |
|
290 |
|
291 Goal "[| (m::int) < #0; #0 < n |] ==> m*n < #0"; |
|
292 by (dtac zmult_zless_mono1 1); |
|
293 by Auto_tac; |
|
294 qed "neg_times_pos_is_neg"; |
|
295 |
|
296 Goal "[| #0 < (m::int); n < #0 |] ==> m*n < #0"; |
|
297 by (dtac zmult_zless_mono1_neg 1); |
|
298 by Auto_tac; |
|
299 qed "pos_times_neg_is_neg"; |
|
300 |
|
301 Goal "[| #0 < (m::int); #0 < n |] ==> #0 < m*n"; |
|
302 by (dtac zmult_zless_mono1 1); |
|
303 by Auto_tac; |
|
304 qed "pos_times_pos_is_pos"; |
260 |
305 |
261 |
306 |
262 (** Needed because (int 0) rewrites to #0. |
307 (** Needed because (int 0) rewrites to #0. |
263 Can these be generalized without evaluating large numbers?**) |
308 Can these be generalized without evaluating large numbers?**) |
264 |
309 |
337 |
382 |
338 Goal "neg (number_of (w BIT x)) = neg (number_of w)"; |
383 Goal "neg (number_of (w BIT x)) = neg (number_of w)"; |
339 by (Asm_simp_tac 1); |
384 by (Asm_simp_tac 1); |
340 by (int_case_tac "number_of w" 1); |
385 by (int_case_tac "number_of w" 1); |
341 by (ALLGOALS (asm_simp_tac |
386 by (ALLGOALS (asm_simp_tac |
342 (simpset() addsimps [zadd_int, neg_eq_less_nat0, |
387 (simpset() addsimps [zadd_int, neg_eq_less_int0, |
343 symmetric zdiff_def] @ zcompare_rls))); |
388 symmetric zdiff_def] @ zcompare_rls))); |
344 qed "neg_number_of_BIT"; |
389 qed "neg_number_of_BIT"; |
345 |
390 |
346 |
391 |
347 (** Less-than-or-equals (<=) **) |
392 (** Less-than-or-equals (<=) **) |
669 by (auto_tac (claset() addIs [zless_trans], |
714 by (auto_tac (claset() addIs [zless_trans], |
670 simpset() addsimps [neg_eq_less_0, zle_def])); |
715 simpset() addsimps [neg_eq_less_0, zle_def])); |
671 qed "nat_less_eq_zless"; |
716 qed "nat_less_eq_zless"; |
672 |
717 |
673 |
718 |
|
719 (*Towards canonical simplification*) |
674 Addsimps zadd_ac; |
720 Addsimps zadd_ac; |
675 Addsimps zmult_ac; |
721 Addsimps zmult_ac; |
|
722 Addsimps [zmult_zminus, zmult_zminus_right]; |