src/HOL/Integ/Bin.ML
changeset 6917 eba301caceea
parent 6910 7c3503ae3d78
child 6941 f52c70a449fb
equal deleted inserted replaced
6916:4957978b6f9e 6917:eba301caceea
   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];