src/HOL/Tools/numeral_simprocs.ML
changeset 45437 958d19d3405b
parent 45306 1e380c50a183
child 45620 f2a587696afb
equal deleted inserted replaced
45436:62bc9474d04b 45437:958d19d3405b
   176 
   176 
   177 (*Simplify Numeral0+n, n+Numeral0, Numeral1*n, n*Numeral1, 1*x, x*1, x/1 *)
   177 (*Simplify Numeral0+n, n+Numeral0, Numeral1*n, n*Numeral1, 1*x, x*1, x/1 *)
   178 val add_0s =  @{thms add_0s};
   178 val add_0s =  @{thms add_0s};
   179 val mult_1s = @{thms mult_1s mult_1_left mult_1_right divide_1};
   179 val mult_1s = @{thms mult_1s mult_1_left mult_1_right divide_1};
   180 
   180 
       
   181 (* For post-simplification of the rhs of simproc-generated rules *)
       
   182 val post_simps =
       
   183     [@{thm numeral_0_eq_0}, @{thm numeral_1_eq_1},
       
   184      @{thm add_0_left}, @{thm add_0_right},
       
   185      @{thm mult_zero_left}, @{thm mult_zero_right},
       
   186      @{thm mult_1_left}, @{thm mult_1_right},
       
   187      @{thm mult_minus1}, @{thm mult_minus1_right}]
       
   188 
       
   189 val field_post_simps =
       
   190     post_simps @ [@{thm divide_zero_left}, @{thm divide_1}]
       
   191                       
   181 (*Simplify inverse Numeral1, a/Numeral1*)
   192 (*Simplify inverse Numeral1, a/Numeral1*)
   182 val inverse_1s = [@{thm inverse_numeral_1}];
   193 val inverse_1s = [@{thm inverse_numeral_1}];
   183 val divide_1s = [@{thm divide_numeral_1}];
   194 val divide_1s = [@{thm divide_numeral_1}];
   184 
   195 
   185 (*To perform binary arithmetic.  The "left" rewriting handles patterns
   196 (*To perform binary arithmetic.  The "left" rewriting handles patterns
   233     THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss2))
   244     THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss2))
   234     THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss3))
   245     THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss3))
   235 
   246 
   236   val numeral_simp_ss = HOL_ss addsimps add_0s @ simps
   247   val numeral_simp_ss = HOL_ss addsimps add_0s @ simps
   237   fun numeral_simp_tac ss = ALLGOALS (simp_tac (Simplifier.inherit_context ss numeral_simp_ss))
   248   fun numeral_simp_tac ss = ALLGOALS (simp_tac (Simplifier.inherit_context ss numeral_simp_ss))
   238   val simplify_meta_eq = Arith_Data.simplify_meta_eq (add_0s @ mult_1s)
   249   val simplify_meta_eq = Arith_Data.simplify_meta_eq post_simps
   239   val prove_conv = Arith_Data.prove_conv
   250   val prove_conv = Arith_Data.prove_conv
   240 end;
   251 end;
   241 
   252 
   242 structure EqCancelNumerals = CancelNumeralsFun
   253 structure EqCancelNumerals = CancelNumeralsFun
   243  (open CancelNumeralsCommon
   254  (open CancelNumeralsCommon
   285     THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss2))
   296     THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss2))
   286     THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss3))
   297     THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss3))
   287 
   298 
   288   val numeral_simp_ss = HOL_ss addsimps add_0s @ simps
   299   val numeral_simp_ss = HOL_ss addsimps add_0s @ simps
   289   fun numeral_simp_tac ss = ALLGOALS (simp_tac (Simplifier.inherit_context ss numeral_simp_ss))
   300   fun numeral_simp_tac ss = ALLGOALS (simp_tac (Simplifier.inherit_context ss numeral_simp_ss))
   290   val simplify_meta_eq = Arith_Data.simplify_meta_eq (add_0s @ mult_1s)
   301   val simplify_meta_eq = Arith_Data.simplify_meta_eq post_simps
   291 end;
   302 end;
   292 
   303 
   293 structure CombineNumerals = CombineNumeralsFun(CombineNumeralsData);
   304 structure CombineNumerals = CombineNumeralsFun(CombineNumeralsData);
   294 
   305 
   295 (*Version for fields, where coefficients can be fractions*)
   306 (*Version for fields, where coefficients can be fractions*)
   312     THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss2))
   323     THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss2))
   313     THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss3))
   324     THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss3))
   314 
   325 
   315   val numeral_simp_ss = HOL_ss addsimps add_0s @ simps @ [@{thm add_frac_eq}]
   326   val numeral_simp_ss = HOL_ss addsimps add_0s @ simps @ [@{thm add_frac_eq}]
   316   fun numeral_simp_tac ss = ALLGOALS (simp_tac (Simplifier.inherit_context ss numeral_simp_ss))
   327   fun numeral_simp_tac ss = ALLGOALS (simp_tac (Simplifier.inherit_context ss numeral_simp_ss))
   317   val simplify_meta_eq = Arith_Data.simplify_meta_eq (add_0s @ mult_1s @ divide_1s)
   328   val simplify_meta_eq = Arith_Data.simplify_meta_eq field_post_simps
   318 end;
   329 end;
   319 
   330 
   320 structure FieldCombineNumerals = CombineNumeralsFun(FieldCombineNumeralsData);
   331 structure FieldCombineNumerals = CombineNumeralsFun(FieldCombineNumeralsData);
   321 
   332 
   322 fun combine_numerals ss ct = CombineNumerals.proc ss (term_of ct)
   333 fun combine_numerals ss ct = CombineNumerals.proc ss (term_of ct)
   354 
   365 
   355   val numeral_simp_ss = HOL_ss addsimps
   366   val numeral_simp_ss = HOL_ss addsimps
   356     [@{thm eq_number_of_eq}, @{thm less_number_of}, @{thm le_number_of}] @ simps
   367     [@{thm eq_number_of_eq}, @{thm less_number_of}, @{thm le_number_of}] @ simps
   357   fun numeral_simp_tac ss = ALLGOALS (simp_tac (Simplifier.inherit_context ss numeral_simp_ss))
   368   fun numeral_simp_tac ss = ALLGOALS (simp_tac (Simplifier.inherit_context ss numeral_simp_ss))
   358   val simplify_meta_eq = Arith_Data.simplify_meta_eq
   369   val simplify_meta_eq = Arith_Data.simplify_meta_eq
   359     [@{thm Nat.add_0}, @{thm Nat.add_0_right}, @{thm mult_zero_left},
   370     ([@{thm Nat.add_0}, @{thm Nat.add_0_right}] @ post_simps)
   360       @{thm mult_zero_right}, @{thm mult_Bit1}, @{thm mult_1_right}];
       
   361   val prove_conv = Arith_Data.prove_conv
   371   val prove_conv = Arith_Data.prove_conv
   362 end
   372 end
   363 
   373 
   364 (*Version for semiring_div*)
   374 (*Version for semiring_div*)
   365 structure DivCancelNumeralFactor = CancelNumeralFactorFun
   375 structure DivCancelNumeralFactor = CancelNumeralFactorFun