src/HOL/Integ/IntArith.ML
changeset 8776 60821dbc9f18
parent 8763 22d4c641ebff
child 8785 00cff9d083df
equal deleted inserted replaced
8775:626274171eab 8776:60821dbc9f18
   157                 bin_arith_simps @ bin_rel_simps;
   157                 bin_arith_simps @ bin_rel_simps;
   158 
   158 
   159 (*To let us treat subtraction as addition*)
   159 (*To let us treat subtraction as addition*)
   160 val diff_simps = [zdiff_def, zminus_zadd_distrib, zminus_zminus];
   160 val diff_simps = [zdiff_def, zminus_zadd_distrib, zminus_zminus];
   161 
   161 
       
   162 val def_trans = def_imp_eq RS trans;
       
   163 
       
   164 (*Apply the given rewrite (if present) just once*)
       
   165 fun subst_tac None      = all_tac
       
   166   | subst_tac (Some th) = ALLGOALS (rtac (th RS def_trans));
       
   167 
   162 val mk_eqv = HOLogic.mk_Trueprop o HOLogic.mk_eq;
   168 val mk_eqv = HOLogic.mk_Trueprop o HOLogic.mk_eq;
   163 
   169 
   164 fun prove_conv tacs sg (t, u) =
   170 fun prove_conv name tacs sg (t, u) =
   165   if t aconv u then None
   171   if t aconv u then None
   166   else
   172   else
   167   Some
   173   Some
   168      (mk_meta_eq (prove_goalw_cterm [] (cterm_of sg (mk_eqv (t, u)))
   174      (mk_meta_eq (prove_goalw_cterm [] (cterm_of sg (mk_eqv (t, u)))
   169 	(K tacs))
   175 	(K tacs))
   170       handle ERROR => error 
   176       handle ERROR => error 
   171 	  ("The error(s) above occurred while trying to prove " ^
   177 	  ("The error(s) above occurred while trying to prove " ^
   172 	   (string_of_cterm (cterm_of sg (mk_eqv (t, u))))));
   178 	   string_of_cterm (cterm_of sg (mk_eqv (t, u))) ^ 
       
   179 	   "\nInternal failure of simproc " ^ name));
   173 
   180 
   174 fun prep_simproc (name, pats, proc) = Simplifier.mk_simproc name pats proc;
   181 fun prep_simproc (name, pats, proc) = Simplifier.mk_simproc name pats proc;
   175 fun prep_pat s = Thm.read_cterm (Theory.sign_of Int.thy) (s, HOLogic.termT);
   182 fun prep_pat s = Thm.read_cterm (Theory.sign_of Int.thy) (s, HOLogic.termT);
   176 val prep_pats = map prep_pat;
   183 val prep_pats = map prep_pat;
   177 
   184 
   180   val mk_sum    	= mk_sum
   187   val mk_sum    	= mk_sum
   181   val dest_sum		= dest_sum
   188   val dest_sum		= dest_sum
   182   val mk_coeff		= mk_coeff
   189   val mk_coeff		= mk_coeff
   183   val dest_coeff	= dest_coeff 1
   190   val dest_coeff	= dest_coeff 1
   184   val find_first_coeff	= find_first_coeff []
   191   val find_first_coeff	= find_first_coeff []
   185   val prove_conv	= prove_conv
   192   val subst_tac         = subst_tac
   186   val norm_tac = ALLGOALS (simp_tac (HOL_ss addsimps add_0s@mult_1s@diff_simps@zadd_ac))
   193   val norm_tac = ALLGOALS (simp_tac (HOL_ss addsimps add_0s@mult_1s@diff_simps@
       
   194                                                      zadd_ac))
   187                  THEN ALLGOALS
   195                  THEN ALLGOALS
   188                     (simp_tac (HOL_ss addsimps [zmult_zminus_right RS sym]@bin_simps@zmult_ac))
   196                     (simp_tac (HOL_ss addsimps [zmult_zminus_right RS sym]@
       
   197                                                bin_simps@zadd_ac@zmult_ac))
   189   val numeral_simp_tac	= ALLGOALS (simp_tac (HOL_ss addsimps add_0s@bin_simps))
   198   val numeral_simp_tac	= ALLGOALS (simp_tac (HOL_ss addsimps add_0s@bin_simps))
   190   end;
   199   end;
   191 
   200 
   192 
   201 
   193 (* int eq *)
       
   194 structure EqCancelNumerals = CancelNumeralsFun
   202 structure EqCancelNumerals = CancelNumeralsFun
   195  (open CancelNumeralsCommon
   203  (open CancelNumeralsCommon
       
   204   val prove_conv = prove_conv "inteq_cancel_numerals"
   196   val mk_bal   = HOLogic.mk_eq
   205   val mk_bal   = HOLogic.mk_eq
   197   val dest_bal = HOLogic.dest_bin "op =" HOLogic.intT
   206   val dest_bal = HOLogic.dest_bin "op =" HOLogic.intT
   198   val bal_add1	= eq_add_iff1 RS trans
   207   val bal_add1 = eq_add_iff1 RS trans
   199   val bal_add2	= eq_add_iff2 RS trans
   208   val bal_add2 = eq_add_iff2 RS trans
   200 );
   209 );
   201 
   210 
   202 (* int less *)
       
   203 structure LessCancelNumerals = CancelNumeralsFun
   211 structure LessCancelNumerals = CancelNumeralsFun
   204  (open CancelNumeralsCommon
   212  (open CancelNumeralsCommon
       
   213   val prove_conv = prove_conv "intless_cancel_numerals"
   205   val mk_bal   = HOLogic.mk_binrel "op <"
   214   val mk_bal   = HOLogic.mk_binrel "op <"
   206   val dest_bal = HOLogic.dest_bin "op <" HOLogic.intT
   215   val dest_bal = HOLogic.dest_bin "op <" HOLogic.intT
   207   val bal_add1	= less_add_iff1 RS trans
   216   val bal_add1 = less_add_iff1 RS trans
   208   val bal_add2	= less_add_iff2 RS trans
   217   val bal_add2 = less_add_iff2 RS trans
   209 );
   218 );
   210 
   219 
   211 (* int le *)
       
   212 structure LeCancelNumerals = CancelNumeralsFun
   220 structure LeCancelNumerals = CancelNumeralsFun
   213  (open CancelNumeralsCommon
   221  (open CancelNumeralsCommon
       
   222   val prove_conv = prove_conv "intle_cancel_numerals"
   214   val mk_bal   = HOLogic.mk_binrel "op <="
   223   val mk_bal   = HOLogic.mk_binrel "op <="
   215   val dest_bal = HOLogic.dest_bin "op <=" HOLogic.intT
   224   val dest_bal = HOLogic.dest_bin "op <=" HOLogic.intT
   216   val bal_add1	= le_add_iff1 RS trans
   225   val bal_add1 = le_add_iff1 RS trans
   217   val bal_add2	= le_add_iff2 RS trans
   226   val bal_add2 = le_add_iff2 RS trans
   218 );
   227 );
   219 
   228 
   220 (* int diff *)
       
   221 structure DiffCancelNumerals = CancelNumeralsFun
   229 structure DiffCancelNumerals = CancelNumeralsFun
   222  (open CancelNumeralsCommon
   230  (open CancelNumeralsCommon
       
   231   val prove_conv = prove_conv "intdiff_cancel_numerals"
   223   val mk_bal   = HOLogic.mk_binop "op -"
   232   val mk_bal   = HOLogic.mk_binop "op -"
   224   val dest_bal = HOLogic.dest_bin "op -" HOLogic.intT
   233   val dest_bal = HOLogic.dest_bin "op -" HOLogic.intT
   225   val bal_add1	= diff_add_eq1 RS trans
   234   val bal_add1 = diff_add_eq1 RS trans
   226   val bal_add2	= diff_add_eq2 RS trans
   235   val bal_add2 = diff_add_eq2 RS trans
   227 );
   236 );
   228 
   237 
   229 
   238 
   230 val cancel_numerals = 
   239 val cancel_numerals = 
   231   map prep_simproc
   240   map prep_simproc
   285 test "(i + j + #12 + (k::int)) - #-15 = y";
   294 test "(i + j + #12 + (k::int)) - #-15 = y";
   286 test "(i + j + #-12 + (k::int)) - #-15 = y";
   295 test "(i + j + #-12 + (k::int)) - #-15 = y";
   287 *)
   296 *)
   288 
   297 
   289 
   298 
   290 
       
   291 (****************************************************************************************************************************************************************************************************************************************************************
       
   292 
       
   293 
       
   294 structure Int_CC_Data : COMBINE_COEFF_DATA =
       
   295 struct
       
   296   val ss		= HOL_ss
       
   297   val eq_reflection	= eq_reflection
       
   298   val thy		= Bin.thy
       
   299   val T			= HOLogic.intT
       
   300 
       
   301   val trans		= trans
       
   302   val add_ac		= zadd_ac
       
   303   val diff_def		= zdiff_def
       
   304   val minus_add_distrib	= zminus_zadd_distrib
       
   305   val minus_minus	= zminus_zminus
       
   306   val mult_commute	= zmult_commute
       
   307   val mult_1_right	= zmult_1_right
       
   308   val add_mult_distrib = zadd_zmult_distrib2
       
   309   val diff_mult_distrib = zdiff_zmult_distrib2
       
   310   val mult_minus_right = zmult_zminus_right
       
   311 
       
   312   val rel_iff_rel_0_rls = [zless_iff_zdiff_zless_0, eq_iff_zdiff_eq_0, 
       
   313 			   zle_iff_zdiff_zle_0]
       
   314   fun dest_eqI th = 
       
   315       #1 (HOLogic.dest_bin "op =" HOLogic.boolT 
       
   316 	      (HOLogic.dest_Trueprop (concl_of th)))
       
   317 
       
   318 end;
       
   319 
       
   320 structure Int_CC = Combine_Coeff (Int_CC_Data);
       
   321 
       
   322 Addsimprocs [Int_CC.sum_conv, Int_CC.rel_conv];
       
   323 ****************************************************************)
       
   324 
       
   325 
       
   326 (** Constant folding for integer plus and times **)
   299 (** Constant folding for integer plus and times **)
   327 
   300 
   328 (*We do not need
   301 (*We do not need
   329     structure Int_Plus_Assoc = Assoc_Fold (Int_Plus_Assoc_Data);
   302     structure Int_Plus_Assoc = Assoc_Fold (Int_Plus_Assoc_Data);
   330   because cancel_coeffs does the same thing*)
   303   because cancel_coeffs does the same thing*)