src/HOL/Integ/NatSimprocs.ML
changeset 8766 1ef6e77e12ee
parent 8759 49154c960140
child 8776 60821dbc9f18
equal deleted inserted replaced
8765:1bc30ff5fc54 8766:1ef6e77e12ee
     9 Goal "number_of v + (number_of v' + (k::nat)) = \
     9 Goal "number_of v + (number_of v' + (k::nat)) = \
    10 \        (if neg (number_of v) then number_of v' + k \
    10 \        (if neg (number_of v) then number_of v' + k \
    11 \         else if neg (number_of v') then number_of v + k \
    11 \         else if neg (number_of v') then number_of v + k \
    12 \         else number_of (bin_add v v') + k)";
    12 \         else number_of (bin_add v v') + k)";
    13 by (Simp_tac 1);
    13 by (Simp_tac 1);
    14 qed "add_nat_number_of_add";
    14 qed "nat_number_of_add_left";
    15 
    15 
    16 
    16 
    17 (** For cancel_numerals **)
    17 (** For cancel_numerals **)
    18 
    18 
    19 Goal "j <= (i::nat) ==> ((i*u + m) - (j*u + n)) = (((i-j)*u + m) - n)";
    19 Goal "j <= (i::nat) ==> ((i*u + m) - (j*u + n)) = (((i-j)*u + m) - n)";
    20 by (asm_simp_tac (simpset() addsplits [nat_diff_split'] 
    20 by (asm_simp_tac (simpset() addsplits [nat_diff_split'] 
    21 		            addsimps [add_mult_distrib]) 1);
    21 		            addsimps [add_mult_distrib]) 1);
    22 qed "diff_add_eq1";
    22 qed "nat_diff_add_eq1";
    23 
    23 
    24 Goal "i <= (j::nat) ==> ((i*u + m) - (j*u + n)) = (m - ((j-i)*u + n))";
    24 Goal "i <= (j::nat) ==> ((i*u + m) - (j*u + n)) = (m - ((j-i)*u + n))";
    25 by (asm_simp_tac (simpset() addsplits [nat_diff_split'] 
    25 by (asm_simp_tac (simpset() addsplits [nat_diff_split'] 
    26 		            addsimps [add_mult_distrib]) 1);
    26 		            addsimps [add_mult_distrib]) 1);
    27 qed "diff_add_eq2";
    27 qed "nat_diff_add_eq2";
    28 
    28 
    29 Goal "j <= (i::nat) ==> (i*u + m = j*u + n) = ((i-j)*u + m = n)";
    29 Goal "j <= (i::nat) ==> (i*u + m = j*u + n) = ((i-j)*u + m = n)";
    30 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] 
    30 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] 
    31                                   addsimps [add_mult_distrib]));
    31                                   addsimps [add_mult_distrib]));
    32 qed "eq_add_iff1";
    32 qed "nat_eq_add_iff1";
    33 
    33 
    34 Goal "i <= (j::nat) ==> (i*u + m = j*u + n) = (m = (j-i)*u + n)";
    34 Goal "i <= (j::nat) ==> (i*u + m = j*u + n) = (m = (j-i)*u + n)";
    35 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] 
    35 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] 
    36                                   addsimps [add_mult_distrib]));
    36                                   addsimps [add_mult_distrib]));
    37 qed "eq_add_iff2";
    37 qed "nat_eq_add_iff2";
    38 
    38 
    39 Goal "j <= (i::nat) ==> (i*u + m < j*u + n) = ((i-j)*u + m < n)";
    39 Goal "j <= (i::nat) ==> (i*u + m < j*u + n) = ((i-j)*u + m < n)";
    40 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] 
    40 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] 
    41                                   addsimps [add_mult_distrib]));
    41                                   addsimps [add_mult_distrib]));
    42 qed "less_add_iff1";
    42 qed "nat_less_add_iff1";
    43 
    43 
    44 Goal "i <= (j::nat) ==> (i*u + m < j*u + n) = (m < (j-i)*u + n)";
    44 Goal "i <= (j::nat) ==> (i*u + m < j*u + n) = (m < (j-i)*u + n)";
    45 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] 
    45 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] 
    46                                   addsimps [add_mult_distrib]));
    46                                   addsimps [add_mult_distrib]));
    47 qed "less_add_iff2";
    47 qed "nat_less_add_iff2";
    48 
    48 
    49 Goal "j <= (i::nat) ==> (i*u + m <= j*u + n) = ((i-j)*u + m <= n)";
    49 Goal "j <= (i::nat) ==> (i*u + m <= j*u + n) = ((i-j)*u + m <= n)";
    50 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] 
    50 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] 
    51                                   addsimps [add_mult_distrib]));
    51                                   addsimps [add_mult_distrib]));
    52 qed "le_add_iff1";
    52 qed "nat_le_add_iff1";
    53 
    53 
    54 Goal "i <= (j::nat) ==> (i*u + m <= j*u + n) = (m <= (j-i)*u + n)";
    54 Goal "i <= (j::nat) ==> (i*u + m <= j*u + n) = (m <= (j-i)*u + n)";
    55 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] 
    55 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] 
    56                                   addsimps [add_mult_distrib]));
    56                                   addsimps [add_mult_distrib]));
    57 qed "le_add_iff2";
    57 qed "nat_le_add_iff2";
    58 
    58 
    59 structure Nat_Numeral_Simprocs =
    59 structure Nat_Numeral_Simprocs =
    60 struct
    60 struct
    61 
    61 
    62 (*Utilities for simproc inverse_fold*)
    62 (*Utilities*)
    63 
    63 
    64 fun mk_numeral n = HOLogic.number_of_const $ NumeralSyntax.mk_bin n;
    64 fun mk_numeral n = HOLogic.number_of_const HOLogic.natT $ 
       
    65                    NumeralSyntax.mk_bin n;
    65 
    66 
    66 (*Decodes a unary or binary numeral to a NATURAL NUMBER*)
    67 (*Decodes a unary or binary numeral to a NATURAL NUMBER*)
    67 fun dest_numeral (Const ("0", _)) = 0
    68 fun dest_numeral (Const ("0", _)) = 0
    68   | dest_numeral (Const ("Suc", _) $ t) = 1 + dest_numeral t
    69   | dest_numeral (Const ("Suc", _) $ t) = 1 + dest_numeral t
    69   | dest_numeral (Const("Numeral.number_of", _) $ w) = 
    70   | dest_numeral (Const("Numeral.number_of", _) $ w) = 
    76   | find_first_numeral past [] = raise TERM("find_first_numeral", []);
    77   | find_first_numeral past [] = raise TERM("find_first_numeral", []);
    77 
    78 
    78 val zero = mk_numeral 0;
    79 val zero = mk_numeral 0;
    79 val mk_plus = HOLogic.mk_binop "op +";
    80 val mk_plus = HOLogic.mk_binop "op +";
    80 
    81 
       
    82 (*Thus mk_sum[t] yields t+#0; longer sums don't have a trailing zero*)
    81 fun mk_sum []        = zero
    83 fun mk_sum []        = zero
       
    84   | mk_sum [t,u]     = mk_plus (t, u)
    82   | mk_sum (t :: ts) = mk_plus (t, mk_sum ts);
    85   | mk_sum (t :: ts) = mk_plus (t, mk_sum ts);
    83 
    86 
    84 val dest_plus = HOLogic.dest_bin "op +" HOLogic.natT;
    87 val dest_plus = HOLogic.dest_bin "op +" HOLogic.natT;
    85 
    88 
    86 (*extract the outer Sucs from a term and convert them to a binary numeral*)
    89 (*extract the outer Sucs from a term and convert them to a binary numeral*)
   108 	(K tacs))
   111 	(K tacs))
   109       handle ERROR => error 
   112       handle ERROR => error 
   110 	  ("The error(s) above occurred while trying to prove " ^
   113 	  ("The error(s) above occurred while trying to prove " ^
   111 	   (string_of_cterm (cterm_of sg (mk_eqv (t, u))))));
   114 	   (string_of_cterm (cterm_of sg (mk_eqv (t, u))))));
   112 
   115 
   113 fun all_simp_tac ss rules = ALLGOALS (simp_tac (ss addsimps rules));
   116 val bin_simps = [add_nat_number_of, nat_number_of_add_left,
       
   117 		 diff_nat_number_of, le_nat_number_of_eq_not_less, 
       
   118 		 less_nat_number_of, Let_number_of, nat_number_of] @ 
       
   119                 bin_arith_simps @ bin_rel_simps;
   114 
   120 
   115 val add_norm_tac = ALLGOALS (simp_tac (HOL_ss addsimps add_ac));
   121 val add_norm_tac = ALLGOALS (simp_tac (HOL_ss addsimps add_ac));
       
   122 
   116 
   123 
   117 (****combine_coeffs will make this obsolete****)
   124 (****combine_coeffs will make this obsolete****)
   118 structure FoldSucData =
   125 structure FoldSucData =
   119   struct
   126   struct
   120   val mk_numeral	= mk_numeral
   127   val mk_numeral	= mk_numeral
   126   val dest_diff		= HOLogic.dest_bin "op -" HOLogic.natT
   133   val dest_diff		= HOLogic.dest_bin "op -" HOLogic.natT
   127   val dest_Suc		= HOLogic.dest_Suc
   134   val dest_Suc		= HOLogic.dest_Suc
   128   val double_diff_eq	= diff_add_assoc_diff
   135   val double_diff_eq	= diff_add_assoc_diff
   129   val move_diff_eq	= diff_add_assoc2
   136   val move_diff_eq	= diff_add_assoc2
   130   val prove_conv	= prove_conv
   137   val prove_conv	= prove_conv
   131   val numeral_simp_tac	= all_simp_tac (simpset()
   138   val numeral_simp_tac	= ALLGOALS
   132 					  addsimps [Suc_nat_number_of_add])
   139                 (simp_tac (HOL_ss addsimps [numeral_0_eq_0 RS sym]@bin_simps))
   133   val add_norm_tac	= ALLGOALS (simp_tac (simpset() addsimps Suc_eq_add_numeral_1::add_ac))
   140   val add_norm_tac	= ALLGOALS (simp_tac (simpset() addsimps Suc_eq_add_numeral_1::add_ac))
   134   end;
   141   end;
   135 
   142 
   136 structure FoldSuc = FoldSucFun (FoldSucData);
   143 structure FoldSuc = FoldSucFun (FoldSucData);
   137 
   144 
   183 
   190 
   184 (*Simplify #1*n and n*#1 to n*)
   191 (*Simplify #1*n and n*#1 to n*)
   185 val add_0s = map (rename_numerals NatBin.thy) [add_0, add_0_right];
   192 val add_0s = map (rename_numerals NatBin.thy) [add_0, add_0_right];
   186 val mult_1s = map (rename_numerals NatBin.thy) [mult_1, mult_1_right];
   193 val mult_1s = map (rename_numerals NatBin.thy) [mult_1, mult_1_right];
   187 
   194 
   188 val bin_simps = [add_nat_number_of, add_nat_number_of_add] @ 
       
   189                 bin_arith_simps @ bin_rel_simps;
       
   190 
       
   191 structure CancelNumeralsCommon =
   195 structure CancelNumeralsCommon =
   192   struct
   196   struct
   193   val mk_sum    	= mk_sum
   197   val mk_sum    	= mk_sum
   194   val dest_sum		= dest_Sucs_sum
   198   val dest_sum		= dest_Sucs_sum
   195   val mk_coeff		= mk_coeff
   199   val mk_coeff		= mk_coeff
   196   val dest_coeff	= dest_coeff
   200   val dest_coeff	= dest_coeff
   197   val find_first_coeff	= find_first_coeff []
   201   val find_first_coeff	= find_first_coeff []
   198   val prove_conv	= prove_conv
   202   val prove_conv	= prove_conv
   199   val numeral_simp_tac	= ALLGOALS (simp_tac (simpset() addsimps [numeral_0_eq_0 RS sym]))
       
   200   val norm_tac = ALLGOALS
   203   val norm_tac = ALLGOALS
   201                    (simp_tac (HOL_ss addsimps add_0s@mult_1s@bin_simps@
   204                    (simp_tac (HOL_ss addsimps add_0s@mult_1s@bin_simps@
   202                                               [Suc_eq_add_numeral_1]@add_ac))
   205                                               [Suc_eq_add_numeral_1]@add_ac))
   203                  THEN ALLGOALS (simp_tac (HOL_ss addsimps mult_ac))
   206                  THEN ALLGOALS (simp_tac (HOL_ss addsimps mult_ac))
       
   207   val numeral_simp_tac	= ALLGOALS
       
   208                 (simp_tac (HOL_ss addsimps [numeral_0_eq_0 RS sym]@add_0s@bin_simps))
   204   end;
   209   end;
   205 
   210 
   206 
   211 
   207 (* nat eq *)
   212 (* nat eq *)
   208 structure EqCancelNumerals = CancelNumeralsFun
   213 structure EqCancelNumerals = CancelNumeralsFun
   209  (open CancelNumeralsCommon
   214  (open CancelNumeralsCommon
   210   val mk_bal   = HOLogic.mk_eq
   215   val mk_bal   = HOLogic.mk_eq
   211   val dest_bal = HOLogic.dest_bin "op =" HOLogic.natT
   216   val dest_bal = HOLogic.dest_bin "op =" HOLogic.natT
   212   val bal_add1	= eq_add_iff1 RS trans
   217   val bal_add1	= nat_eq_add_iff1 RS trans
   213   val bal_add2	= eq_add_iff2 RS trans
   218   val bal_add2	= nat_eq_add_iff2 RS trans
   214 );
   219 );
   215 
   220 
   216 (* nat less *)
   221 (* nat less *)
   217 structure LessCancelNumerals = CancelNumeralsFun
   222 structure LessCancelNumerals = CancelNumeralsFun
   218  (open CancelNumeralsCommon
   223  (open CancelNumeralsCommon
   219   val mk_bal   = HOLogic.mk_binrel "op <"
   224   val mk_bal   = HOLogic.mk_binrel "op <"
   220   val dest_bal = HOLogic.dest_bin "op <" HOLogic.natT
   225   val dest_bal = HOLogic.dest_bin "op <" HOLogic.natT
   221   val bal_add1	= less_add_iff1 RS trans
   226   val bal_add1	= nat_less_add_iff1 RS trans
   222   val bal_add2	= less_add_iff2 RS trans
   227   val bal_add2	= nat_less_add_iff2 RS trans
   223 );
   228 );
   224 
   229 
   225 (* nat le *)
   230 (* nat le *)
   226 structure LeCancelNumerals = CancelNumeralsFun
   231 structure LeCancelNumerals = CancelNumeralsFun
   227  (open CancelNumeralsCommon
   232  (open CancelNumeralsCommon
   228   val mk_bal   = HOLogic.mk_binrel "op <="
   233   val mk_bal   = HOLogic.mk_binrel "op <="
   229   val dest_bal = HOLogic.dest_bin "op <=" HOLogic.natT
   234   val dest_bal = HOLogic.dest_bin "op <=" HOLogic.natT
   230   val bal_add1	= le_add_iff1 RS trans
   235   val bal_add1	= nat_le_add_iff1 RS trans
   231   val bal_add2	= le_add_iff2 RS trans
   236   val bal_add2	= nat_le_add_iff2 RS trans
   232 );
   237 );
   233 
   238 
   234 (* nat diff *)
   239 (* nat diff *)
   235 structure DiffCancelNumerals = CancelNumeralsFun
   240 structure DiffCancelNumerals = CancelNumeralsFun
   236  (open CancelNumeralsCommon
   241  (open CancelNumeralsCommon
   237   val mk_bal   = HOLogic.mk_binop "op -"
   242   val mk_bal   = HOLogic.mk_binop "op -"
   238   val dest_bal = HOLogic.dest_bin "op -" HOLogic.natT
   243   val dest_bal = HOLogic.dest_bin "op -" HOLogic.natT
   239   val bal_add1	= diff_add_eq1 RS trans
   244   val bal_add1	= nat_diff_add_eq1 RS trans
   240   val bal_add2	= diff_add_eq2 RS trans
   245   val bal_add2	= nat_diff_add_eq2 RS trans
   241 );
   246 );
   242 
   247 
   243 
   248 
   244 val cancel_numerals = 
   249 val cancel_numerals = 
   245   map prep_simproc
   250   map prep_simproc
   266 
   271 
   267 
   272 
   268 end;
   273 end;
   269 
   274 
   270 
   275 
   271 Addsimprocs [Nat_Numeral_Simprocs.fold_Suc];
   276 (**Addsimprocs [Nat_Numeral_Simprocs.fold_Suc];**)
   272 Addsimprocs Nat_Numeral_Simprocs.cancel_numerals;
   277 Addsimprocs Nat_Numeral_Simprocs.cancel_numerals;
   273 
   278 
   274 (*examples:
   279 (*examples:
   275 print_depth 22;
   280 print_depth 22;
   276 set proof_timing;
   281 set proof_timing;