| author | wenzelm | 
| Wed, 27 Sep 2006 21:13:11 +0200 | |
| changeset 20735 | a041bf3c8f2f | 
| parent 20713 | 823967ef47f1 | 
| child 21243 | afffe1f72143 | 
| permissions | -rw-r--r-- | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 1 | (* Title: HOL/Integ/int_arith1.ML | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 2 | ID: $Id$ | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 3 | Authors: Larry Paulson and Tobias Nipkow | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 4 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 5 | Simprocs and decision procedure for linear arithmetic. | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 6 | *) | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 7 | |
| 14329 | 8 | (** Misc ML bindings **) | 
| 9 | ||
| 20485 | 10 | val succ_Pls = thm "succ_Pls"; | 
| 11 | val succ_Min = thm "succ_Min"; | |
| 12 | val succ_1 = thm "succ_1"; | |
| 13 | val succ_0 = thm "succ_0"; | |
| 15013 | 14 | |
| 20485 | 15 | val pred_Pls = thm "pred_Pls"; | 
| 16 | val pred_Min = thm "pred_Min"; | |
| 17 | val pred_1 = thm "pred_1"; | |
| 18 | val pred_0 = thm "pred_0"; | |
| 15013 | 19 | |
| 20485 | 20 | val minus_Pls = thm "minus_Pls"; | 
| 21 | val minus_Min = thm "minus_Min"; | |
| 22 | val minus_1 = thm "minus_1"; | |
| 23 | val minus_0 = thm "minus_0"; | |
| 15013 | 24 | |
| 20485 | 25 | val add_Pls = thm "add_Pls"; | 
| 26 | val add_Min = thm "add_Min"; | |
| 27 | val add_BIT_11 = thm "add_BIT_11"; | |
| 28 | val add_BIT_10 = thm "add_BIT_10"; | |
| 29 | val add_BIT_0 = thm "add_BIT_0"; | |
| 30 | val add_Pls_right = thm "add_Pls_right"; | |
| 31 | val add_Min_right = thm "add_Min_right"; | |
| 15013 | 32 | |
| 20485 | 33 | val mult_Pls = thm "mult_Pls"; | 
| 34 | val mult_Min = thm "mult_Min"; | |
| 35 | val mult_num1 = thm "mult_num1"; | |
| 36 | val mult_num0 = thm "mult_num0"; | |
| 15013 | 37 | |
| 38 | val neg_def = thm "neg_def"; | |
| 39 | val iszero_def = thm "iszero_def"; | |
| 40 | ||
| 20485 | 41 | val number_of_succ = thm "number_of_succ"; | 
| 42 | val number_of_pred = thm "number_of_pred"; | |
| 43 | val number_of_minus = thm "number_of_minus"; | |
| 44 | val number_of_add = thm "number_of_add"; | |
| 45 | val diff_number_of_eq = thm "diff_number_of_eq"; | |
| 46 | val number_of_mult = thm "number_of_mult"; | |
| 47 | val double_number_of_BIT = thm "double_number_of_BIT"; | |
| 48 | val numeral_0_eq_0 = thm "numeral_0_eq_0"; | |
| 49 | val numeral_1_eq_1 = thm "numeral_1_eq_1"; | |
| 50 | val numeral_m1_eq_minus_1 = thm "numeral_m1_eq_minus_1"; | |
| 51 | val mult_minus1 = thm "mult_minus1"; | |
| 52 | val mult_minus1_right = thm "mult_minus1_right"; | |
| 53 | val minus_number_of_mult = thm "minus_number_of_mult"; | |
| 54 | val zero_less_nat_eq = thm "zero_less_nat_eq"; | |
| 55 | val eq_number_of_eq = thm "eq_number_of_eq"; | |
| 56 | val iszero_number_of_Pls = thm "iszero_number_of_Pls"; | |
| 57 | val nonzero_number_of_Min = thm "nonzero_number_of_Min"; | |
| 58 | val iszero_number_of_BIT = thm "iszero_number_of_BIT"; | |
| 59 | val iszero_number_of_0 = thm "iszero_number_of_0"; | |
| 60 | val iszero_number_of_1 = thm "iszero_number_of_1"; | |
| 61 | val less_number_of_eq_neg = thm "less_number_of_eq_neg"; | |
| 62 | val le_number_of_eq = thm "le_number_of_eq"; | |
| 63 | val not_neg_number_of_Pls = thm "not_neg_number_of_Pls"; | |
| 64 | val neg_number_of_Min = thm "neg_number_of_Min"; | |
| 65 | val neg_number_of_BIT = thm "neg_number_of_BIT"; | |
| 66 | val le_number_of_eq_not_less = thm "le_number_of_eq_not_less"; | |
| 67 | val abs_number_of = thm "abs_number_of"; | |
| 68 | val number_of_reorient = thm "number_of_reorient"; | |
| 69 | val add_number_of_left = thm "add_number_of_left"; | |
| 70 | val mult_number_of_left = thm "mult_number_of_left"; | |
| 71 | val add_number_of_diff1 = thm "add_number_of_diff1"; | |
| 72 | val add_number_of_diff2 = thm "add_number_of_diff2"; | |
| 73 | val less_iff_diff_less_0 = thm "less_iff_diff_less_0"; | |
| 74 | val eq_iff_diff_eq_0 = thm "eq_iff_diff_eq_0"; | |
| 75 | val le_iff_diff_le_0 = thm "le_iff_diff_le_0"; | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 76 | |
| 20485 | 77 | val arith_extra_simps = thms "arith_extra_simps"; | 
| 78 | val arith_simps = thms "arith_simps"; | |
| 79 | val rel_simps = thms "rel_simps"; | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 80 | |
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 81 | val zless_imp_add1_zle = thm "zless_imp_add1_zle"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 82 | |
| 20485 | 83 | val combine_common_factor = thm "combine_common_factor"; | 
| 84 | val eq_add_iff1 = thm "eq_add_iff1"; | |
| 85 | val eq_add_iff2 = thm "eq_add_iff2"; | |
| 86 | val less_add_iff1 = thm "less_add_iff1"; | |
| 87 | val less_add_iff2 = thm "less_add_iff2"; | |
| 88 | val le_add_iff1 = thm "le_add_iff1"; | |
| 89 | val le_add_iff2 = thm "le_add_iff2"; | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 90 | |
| 20485 | 91 | val arith_special = thms "arith_special"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 92 | |
| 20485 | 93 | structure Int_Numeral_Base_Simprocs = | 
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 94 | struct | 
| 20113 | 95 | fun prove_conv tacs ctxt (_: thm list) (t, u) = | 
| 15531 | 96 | if t aconv u then NONE | 
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 97 | else | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 98 | let val eq = HOLogic.mk_Trueprop (HOLogic.mk_eq (t, u)) | 
| 20113 | 99 | in SOME (Goal.prove ctxt [] [] eq (K (EVERY tacs))) end | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 100 | |
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 101 | fun prove_conv_nohyps tacs sg = prove_conv tacs sg []; | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 102 | |
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 103 | fun prep_simproc (name, pats, proc) = | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 104 | Simplifier.simproc (Theory.sign_of (the_context())) name pats proc; | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 105 | |
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 106 |   fun is_numeral (Const("Numeral.number_of", _) $ w) = true
 | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 107 | | is_numeral _ = false | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 108 | |
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 109 | fun simplify_meta_eq f_number_of_eq f_eq = | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 110 | mk_meta_eq ([f_eq, f_number_of_eq] MRS trans) | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 111 | |
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 112 | (*reorientation simprules using ==, for the following simproc*) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 113 | val meta_zero_reorient = zero_reorient RS eq_reflection | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 114 | val meta_one_reorient = one_reorient RS eq_reflection | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 115 | val meta_number_of_reorient = number_of_reorient RS eq_reflection | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 116 | |
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 117 | (*reorientation simplification procedure: reorients (polymorphic) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 118 | 0 = x, 1 = x, nnn = x provided x isn't 0, 1 or a numeral.*) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 119 | fun reorient_proc sg _ (_ $ t $ u) = | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 120 | case u of | 
| 20713 
823967ef47f1
renamed 0 and 1 to HOL.zero and HOL.one respectivly; introduced corresponding syntactic classes
 haftmann parents: 
20485diff
changeset | 121 | 	Const("HOL.zero", _) => NONE
 | 
| 
823967ef47f1
renamed 0 and 1 to HOL.zero and HOL.one respectivly; introduced corresponding syntactic classes
 haftmann parents: 
20485diff
changeset | 122 |       | Const("HOL.one", _) => NONE
 | 
| 15531 | 123 |       | Const("Numeral.number_of", _) $ _ => NONE
 | 
| 124 | | _ => SOME (case t of | |
| 20713 
823967ef47f1
renamed 0 and 1 to HOL.zero and HOL.one respectivly; introduced corresponding syntactic classes
 haftmann parents: 
20485diff
changeset | 125 | 		  Const("HOL.zero", _) => meta_zero_reorient
 | 
| 
823967ef47f1
renamed 0 and 1 to HOL.zero and HOL.one respectivly; introduced corresponding syntactic classes
 haftmann parents: 
20485diff
changeset | 126 | 		| Const("HOL.one", _) => meta_one_reorient
 | 
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 127 | 		| Const("Numeral.number_of", _) $ _ => meta_number_of_reorient)
 | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 128 | |
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 129 | val reorient_simproc = | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 130 |       prep_simproc ("reorient_simproc", ["0=x", "1=x", "number_of w = x"], reorient_proc)
 | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 131 | |
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 132 | end; | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 133 | |
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 134 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 135 | Addsimps arith_special; | 
| 20485 | 136 | Addsimprocs [Int_Numeral_Base_Simprocs.reorient_simproc]; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 137 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 138 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 139 | structure Int_Numeral_Simprocs = | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 140 | struct | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 141 | |
| 20485 | 142 | (*Maps 0 to Numeral0 and 1 to Numeral1 so that arithmetic in Int_Numeral_Base_Simprocs | 
| 11868 
56db9f3a6b3e
Numerals now work for the integers: the binary numerals for 0 and 1 rewrite
 paulson parents: 
11713diff
changeset | 143 | isn't complicated by the abstract 0 and 1.*) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 144 | val numeral_syms = [numeral_0_eq_0 RS sym, numeral_1_eq_1 RS sym]; | 
| 11868 
56db9f3a6b3e
Numerals now work for the integers: the binary numerals for 0 and 1 rewrite
 paulson parents: 
11713diff
changeset | 145 | |
| 14474 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 146 | (** New term ordering so that AC-rewriting brings numerals to the front **) | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 147 | |
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 148 | (*Order integers by absolute value and then by sign. The standard integer | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 149 | ordering is not well-founded.*) | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 150 | fun num_ord (i,j) = | 
| 15965 
f422f8283491
Use of IntInf.int instead of int in most numeric simprocs; avoids
 paulson parents: 
15921diff
changeset | 151 | (case IntInf.compare (IntInf.abs i, IntInf.abs j) of | 
| 16973 | 152 | EQUAL => int_ord (IntInf.sign i, IntInf.sign j) | 
| 14474 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 153 | | ord => ord); | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 154 | |
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 155 | (*This resembles Term.term_ord, but it puts binary numerals before other | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 156 | non-atomic terms.*) | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 157 | local open Term | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 158 | in | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 159 | fun numterm_ord (Abs (_, T, t), Abs(_, U, u)) = | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 160 | (case numterm_ord (t, u) of EQUAL => typ_ord (T, U) | ord => ord) | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 161 | | numterm_ord | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 162 |      (Const("Numeral.number_of", _) $ v, Const("Numeral.number_of", _) $ w) =
 | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 163 | num_ord (HOLogic.dest_binum v, HOLogic.dest_binum w) | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 164 |   | numterm_ord (Const("Numeral.number_of", _) $ _, _) = LESS
 | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 165 |   | numterm_ord (_, Const("Numeral.number_of", _) $ _) = GREATER
 | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 166 | | numterm_ord (t, u) = | 
| 16973 | 167 | (case int_ord (size_of_term t, size_of_term u) of | 
| 14474 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 168 | EQUAL => | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 169 | let val (f, ts) = strip_comb t and (g, us) = strip_comb u in | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 170 | (case hd_ord (f, g) of EQUAL => numterms_ord (ts, us) | ord => ord) | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 171 | end | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 172 | | ord => ord) | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 173 | and numterms_ord (ts, us) = list_ord numterm_ord (ts, us) | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 174 | end; | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 175 | |
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 176 | fun numtermless tu = (numterm_ord tu = LESS); | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 177 | |
| 20485 | 178 | (*Defined in this file, but perhaps needed only for Int_Numeral_Base_Simprocs of type nat.*) | 
| 14474 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 179 | val num_ss = HOL_ss settermless numtermless; | 
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 180 | |
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 181 | |
| 
00292f6f8d13
New simplification ordering to move numerals together. Fixes a bug in the
 paulson parents: 
14390diff
changeset | 182 | (** Utilities **) | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 183 | |
| 19481 
a6205c6203ea
renamed HOLogic.mk_bin to mk_binum for consistency with dest_binum
 paulson parents: 
19277diff
changeset | 184 | fun mk_numeral T n = HOLogic.number_of_const T $ HOLogic.mk_binum n; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 185 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 186 | (*Decodes a binary INTEGER*) | 
| 20713 
823967ef47f1
renamed 0 and 1 to HOL.zero and HOL.one respectivly; introduced corresponding syntactic classes
 haftmann parents: 
20485diff
changeset | 187 | fun dest_numeral (Const("HOL.zero", _)) = 0
 | 
| 
823967ef47f1
renamed 0 and 1 to HOL.zero and HOL.one respectivly; introduced corresponding syntactic classes
 haftmann parents: 
20485diff
changeset | 188 |   | dest_numeral (Const("HOL.one", _)) = 1
 | 
| 13462 | 189 |   | dest_numeral (Const("Numeral.number_of", _) $ w) =
 | 
| 10890 | 190 | (HOLogic.dest_binum w | 
| 191 |       handle TERM _ => raise TERM("Int_Numeral_Simprocs.dest_numeral:1", [w]))
 | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 192 |   | dest_numeral t = raise TERM("Int_Numeral_Simprocs.dest_numeral:2", [t]);
 | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 193 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 194 | fun find_first_numeral past (t::terms) = | 
| 13462 | 195 | ((dest_numeral t, rev past @ terms) | 
| 196 | handle TERM _ => find_first_numeral (t::past) terms) | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 197 |   | find_first_numeral past [] = raise TERM("find_first_numeral", []);
 | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 198 | |
| 19233 
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
 haftmann parents: 
19044diff
changeset | 199 | val mk_plus = HOLogic.mk_binop "HOL.plus"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 200 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 201 | fun mk_minus t = | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 202 | let val T = Term.fastype_of t | 
| 19233 
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
 haftmann parents: 
19044diff
changeset | 203 |   in Const ("HOL.uminus", T --> T) $ t
 | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 204 | end; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 205 | |
| 11868 
56db9f3a6b3e
Numerals now work for the integers: the binary numerals for 0 and 1 rewrite
 paulson parents: 
11713diff
changeset | 206 | (*Thus mk_sum[t] yields t+0; longer sums don't have a trailing zero*) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 207 | fun mk_sum T [] = mk_numeral T 0 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 208 | | mk_sum T [t,u] = mk_plus (t, u) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 209 | | mk_sum T (t :: ts) = mk_plus (t, mk_sum T ts); | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 210 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 211 | (*this version ALWAYS includes a trailing zero*) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 212 | fun long_mk_sum T [] = mk_numeral T 0 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 213 | | long_mk_sum T (t :: ts) = mk_plus (t, mk_sum T ts); | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 214 | |
| 19233 
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
 haftmann parents: 
19044diff
changeset | 215 | val dest_plus = HOLogic.dest_bin "HOL.plus" Term.dummyT; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 216 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 217 | (*decompose additions AND subtractions as a sum*) | 
| 19233 
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
 haftmann parents: 
19044diff
changeset | 218 | fun dest_summing (pos, Const ("HOL.plus", _) $ t $ u, ts) =
 | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 219 | dest_summing (pos, t, dest_summing (pos, u, ts)) | 
| 19233 
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
 haftmann parents: 
19044diff
changeset | 220 |   | dest_summing (pos, Const ("HOL.minus", _) $ t $ u, ts) =
 | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 221 | dest_summing (pos, t, dest_summing (not pos, u, ts)) | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 222 | | dest_summing (pos, t, ts) = | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 223 | if pos then t::ts else mk_minus t :: ts; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 224 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 225 | fun dest_sum t = dest_summing (true, t, []); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 226 | |
| 19233 
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
 haftmann parents: 
19044diff
changeset | 227 | val mk_diff = HOLogic.mk_binop "HOL.minus"; | 
| 
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
 haftmann parents: 
19044diff
changeset | 228 | val dest_diff = HOLogic.dest_bin "HOL.minus" Term.dummyT; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 229 | |
| 19233 
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
 haftmann parents: 
19044diff
changeset | 230 | val mk_times = HOLogic.mk_binop "HOL.times"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 231 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 232 | fun mk_prod T = | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 233 | let val one = mk_numeral T 1 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 234 | fun mk [] = one | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 235 | | mk [t] = t | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 236 | | mk (t :: ts) = if t = one then mk ts else mk_times (t, mk ts) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 237 | in mk end; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 238 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 239 | (*This version ALWAYS includes a trailing one*) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 240 | fun long_mk_prod T [] = mk_numeral T 1 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 241 | | long_mk_prod T (t :: ts) = mk_times (t, mk_prod T ts); | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 242 | |
| 19233 
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
 haftmann parents: 
19044diff
changeset | 243 | val dest_times = HOLogic.dest_bin "HOL.times" Term.dummyT; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 244 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 245 | fun dest_prod t = | 
| 13462 | 246 | let val (t,u) = dest_times t | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 247 | in dest_prod t @ dest_prod u end | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 248 | handle TERM _ => [t]; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 249 | |
| 13462 | 250 | (*DON'T do the obvious simplifications; that would create special cases*) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 251 | fun mk_coeff (k, t) = mk_times (mk_numeral (Term.fastype_of t) k, t); | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 252 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 253 | (*Express t as a product of (possibly) a numeral with other sorted terms*) | 
| 19233 
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
 haftmann parents: 
19044diff
changeset | 254 | fun dest_coeff sign (Const ("HOL.uminus", _) $ t) = dest_coeff (~sign) t
 | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 255 | | dest_coeff sign t = | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 256 | let val ts = sort Term.term_ord (dest_prod t) | 
| 13462 | 257 | val (n, ts') = find_first_numeral [] ts | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 258 | handle TERM _ => (1, ts) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 259 | in (sign*n, mk_prod (Term.fastype_of t) ts') end; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 260 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 261 | (*Find first coefficient-term THAT MATCHES u*) | 
| 13462 | 262 | fun find_first_coeff past u [] = raise TERM("find_first_coeff", [])
 | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 263 | | find_first_coeff past u (t::terms) = | 
| 13462 | 264 | let val (n,u') = dest_coeff 1 t | 
| 265 | in if u aconv u' then (n, rev past @ terms) | |
| 266 | else find_first_coeff (t::past) u terms | |
| 267 | end | |
| 268 | handle TERM _ => find_first_coeff (t::past) u terms; | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 269 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 270 | |
| 11868 
56db9f3a6b3e
Numerals now work for the integers: the binary numerals for 0 and 1 rewrite
 paulson parents: 
11713diff
changeset | 271 | (*Simplify Numeral0+n, n+Numeral0, Numeral1*n, n*Numeral1*) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 272 | val add_0s = thms "add_0s"; | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 273 | val mult_1s = thms "mult_1s"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 274 | |
| 11868 
56db9f3a6b3e
Numerals now work for the integers: the binary numerals for 0 and 1 rewrite
 paulson parents: 
11713diff
changeset | 275 | (*To perform binary arithmetic. The "left" rewriting handles patterns | 
| 20485 | 276 | created by the Int_Numeral_Base_Simprocs, such as 3 * (5 * x). *) | 
| 277 | val simps = [numeral_0_eq_0 RS sym, numeral_1_eq_1 RS sym, | |
| 13462 | 278 | add_number_of_left, mult_number_of_left] @ | 
| 20485 | 279 | arith_simps @ rel_simps; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 280 | |
| 14113 | 281 | (*Binary arithmetic BUT NOT ADDITION since it may collapse adjacent terms | 
| 282 | during re-arrangement*) | |
| 20485 | 283 | val non_add_simps = | 
| 284 | subtract Thm.eq_thm [add_number_of_left, number_of_add RS sym] simps; | |
| 14113 | 285 | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 286 | (*To evaluate binary negations of coefficients*) | 
| 15013 | 287 | val minus_simps = [numeral_m1_eq_minus_1 RS sym, number_of_minus RS sym, | 
| 20485 | 288 | minus_1, minus_0, minus_Pls, minus_Min, | 
| 289 | pred_1, pred_0, pred_Pls, pred_Min]; | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 290 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 291 | (*To let us treat subtraction as addition*) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 292 | val diff_simps = [diff_minus, minus_add_distrib, minus_minus]; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 293 | |
| 10713 
69c9fc1d11f2
simproc bug fix: negative literals and large terms
 paulson parents: 
10693diff
changeset | 294 | (*push the unary minus down: - x * y = x * - y *) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 295 | val minus_mult_eq_1_to_2 = | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 296 | [minus_mult_left RS sym, minus_mult_right] MRS trans |> standard; | 
| 10713 
69c9fc1d11f2
simproc bug fix: negative literals and large terms
 paulson parents: 
10693diff
changeset | 297 | |
| 
69c9fc1d11f2
simproc bug fix: negative literals and large terms
 paulson parents: 
10693diff
changeset | 298 | (*to extract again any uncancelled minuses*) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 299 | val minus_from_mult_simps = | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 300 | [minus_minus, minus_mult_left RS sym, minus_mult_right RS sym]; | 
| 10713 
69c9fc1d11f2
simproc bug fix: negative literals and large terms
 paulson parents: 
10693diff
changeset | 301 | |
| 
69c9fc1d11f2
simproc bug fix: negative literals and large terms
 paulson parents: 
10693diff
changeset | 302 | (*combine unary minus with numeric literals, however nested within a product*) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 303 | val mult_minus_simps = | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 304 | [mult_assoc, minus_mult_left, minus_mult_eq_1_to_2]; | 
| 10713 
69c9fc1d11f2
simproc bug fix: negative literals and large terms
 paulson parents: 
10693diff
changeset | 305 | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 306 | (*Apply the given rewrite (if present) just once*) | 
| 15531 | 307 | fun trans_tac NONE = all_tac | 
| 308 | | trans_tac (SOME th) = ALLGOALS (rtac (th RS trans)); | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 309 | |
| 18328 | 310 | fun simplify_meta_eq rules = | 
| 311 | let val ss0 = HOL_basic_ss addeqcongs [eq_cong2] addsimps rules | |
| 312 | in fn ss => simplify (Simplifier.inherit_context ss ss0) o mk_meta_eq end | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 313 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 314 | structure CancelNumeralsCommon = | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 315 | struct | 
| 13462 | 316 | val mk_sum = mk_sum | 
| 317 | val dest_sum = dest_sum | |
| 318 | val mk_coeff = mk_coeff | |
| 319 | val dest_coeff = dest_coeff 1 | |
| 320 | val find_first_coeff = find_first_coeff [] | |
| 16973 | 321 | val trans_tac = fn _ => trans_tac | 
| 18328 | 322 | |
| 323 | val norm_ss1 = num_ss addsimps numeral_syms @ add_0s @ mult_1s @ | |
| 324 | diff_simps @ minus_simps @ add_ac | |
| 20485 | 325 | val norm_ss2 = num_ss addsimps non_add_simps @ mult_minus_simps | 
| 18328 | 326 | val norm_ss3 = num_ss addsimps minus_from_mult_simps @ add_ac @ mult_ac | 
| 16973 | 327 | fun norm_tac ss = | 
| 18328 | 328 | ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss1)) | 
| 329 | THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss2)) | |
| 330 | THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss3)) | |
| 331 | ||
| 20485 | 332 | val numeral_simp_ss = HOL_ss addsimps add_0s @ simps | 
| 18328 | 333 | fun numeral_simp_tac ss = ALLGOALS (simp_tac (Simplifier.inherit_context ss numeral_simp_ss)) | 
| 16973 | 334 | val simplify_meta_eq = simplify_meta_eq (add_0s @ mult_1s) | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 335 | end; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 336 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 337 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 338 | structure EqCancelNumerals = CancelNumeralsFun | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 339 | (open CancelNumeralsCommon | 
| 20485 | 340 | val prove_conv = Int_Numeral_Base_Simprocs.prove_conv | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 341 | val mk_bal = HOLogic.mk_eq | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 342 | val dest_bal = HOLogic.dest_bin "op =" Term.dummyT | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 343 | val bal_add1 = eq_add_iff1 RS trans | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 344 | val bal_add2 = eq_add_iff2 RS trans | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 345 | ); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 346 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 347 | structure LessCancelNumerals = CancelNumeralsFun | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 348 | (open CancelNumeralsCommon | 
| 20485 | 349 | val prove_conv = Int_Numeral_Base_Simprocs.prove_conv | 
| 19277 | 350 | val mk_bal = HOLogic.mk_binrel "Orderings.less" | 
| 351 | val dest_bal = HOLogic.dest_bin "Orderings.less" Term.dummyT | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 352 | val bal_add1 = less_add_iff1 RS trans | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 353 | val bal_add2 = less_add_iff2 RS trans | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 354 | ); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 355 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 356 | structure LeCancelNumerals = CancelNumeralsFun | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 357 | (open CancelNumeralsCommon | 
| 20485 | 358 | val prove_conv = Int_Numeral_Base_Simprocs.prove_conv | 
| 19277 | 359 | val mk_bal = HOLogic.mk_binrel "Orderings.less_eq" | 
| 360 | val dest_bal = HOLogic.dest_bin "Orderings.less_eq" Term.dummyT | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 361 | val bal_add1 = le_add_iff1 RS trans | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 362 | val bal_add2 = le_add_iff2 RS trans | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 363 | ); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 364 | |
| 13462 | 365 | val cancel_numerals = | 
| 20485 | 366 | map Int_Numeral_Base_Simprocs.prep_simproc | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 367 |    [("inteq_cancel_numerals",
 | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 368 | ["(l::'a::number_ring) + m = n", | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 369 | "(l::'a::number_ring) = m + n", | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 370 | "(l::'a::number_ring) - m = n", | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 371 | "(l::'a::number_ring) = m - n", | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 372 | "(l::'a::number_ring) * m = n", | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 373 | "(l::'a::number_ring) = m * n"], | 
| 20045 
e66efbafbf1f
simprocs: no theory argument -- use simpset context instead;
 wenzelm parents: 
19617diff
changeset | 374 | K EqCancelNumerals.proc), | 
| 13462 | 375 |     ("intless_cancel_numerals",
 | 
| 14738 | 376 |      ["(l::'a::{ordered_idom,number_ring}) + m < n",
 | 
| 377 |       "(l::'a::{ordered_idom,number_ring}) < m + n",
 | |
| 378 |       "(l::'a::{ordered_idom,number_ring}) - m < n",
 | |
| 379 |       "(l::'a::{ordered_idom,number_ring}) < m - n",
 | |
| 380 |       "(l::'a::{ordered_idom,number_ring}) * m < n",
 | |
| 381 |       "(l::'a::{ordered_idom,number_ring}) < m * n"],
 | |
| 20045 
e66efbafbf1f
simprocs: no theory argument -- use simpset context instead;
 wenzelm parents: 
19617diff
changeset | 382 | K LessCancelNumerals.proc), | 
| 13462 | 383 |     ("intle_cancel_numerals",
 | 
| 14738 | 384 |      ["(l::'a::{ordered_idom,number_ring}) + m <= n",
 | 
| 385 |       "(l::'a::{ordered_idom,number_ring}) <= m + n",
 | |
| 386 |       "(l::'a::{ordered_idom,number_ring}) - m <= n",
 | |
| 387 |       "(l::'a::{ordered_idom,number_ring}) <= m - n",
 | |
| 388 |       "(l::'a::{ordered_idom,number_ring}) * m <= n",
 | |
| 389 |       "(l::'a::{ordered_idom,number_ring}) <= m * n"],
 | |
| 20045 
e66efbafbf1f
simprocs: no theory argument -- use simpset context instead;
 wenzelm parents: 
19617diff
changeset | 390 | K LeCancelNumerals.proc)]; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 391 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 392 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 393 | structure CombineNumeralsData = | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 394 | struct | 
| 15965 
f422f8283491
Use of IntInf.int instead of int in most numeric simprocs; avoids
 paulson parents: 
15921diff
changeset | 395 | val add = IntInf.+ | 
| 13462 | 396 | val mk_sum = long_mk_sum (*to work for e.g. 2*x + 3*x *) | 
| 397 | val dest_sum = dest_sum | |
| 398 | val mk_coeff = mk_coeff | |
| 399 | val dest_coeff = dest_coeff 1 | |
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 400 | val left_distrib = combine_common_factor RS trans | 
| 20485 | 401 | val prove_conv = Int_Numeral_Base_Simprocs.prove_conv_nohyps | 
| 16973 | 402 | val trans_tac = fn _ => trans_tac | 
| 18328 | 403 | |
| 404 | val norm_ss1 = num_ss addsimps numeral_syms @ add_0s @ mult_1s @ | |
| 405 | diff_simps @ minus_simps @ add_ac | |
| 20485 | 406 | val norm_ss2 = num_ss addsimps non_add_simps @ mult_minus_simps | 
| 18328 | 407 | val norm_ss3 = num_ss addsimps minus_from_mult_simps @ add_ac @ mult_ac | 
| 16973 | 408 | fun norm_tac ss = | 
| 18328 | 409 | ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss1)) | 
| 410 | THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss2)) | |
| 411 | THEN ALLGOALS (simp_tac (Simplifier.inherit_context ss norm_ss3)) | |
| 412 | ||
| 20485 | 413 | val numeral_simp_ss = HOL_ss addsimps add_0s @ simps | 
| 18328 | 414 | fun numeral_simp_tac ss = ALLGOALS (simp_tac (Simplifier.inherit_context ss numeral_simp_ss)) | 
| 16973 | 415 | val simplify_meta_eq = simplify_meta_eq (add_0s @ mult_1s) | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 416 | end; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 417 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 418 | structure CombineNumerals = CombineNumeralsFun(CombineNumeralsData); | 
| 13462 | 419 | |
| 420 | val combine_numerals = | |
| 20485 | 421 | Int_Numeral_Base_Simprocs.prep_simproc | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 422 |     ("int_combine_numerals", 
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 423 | ["(i::'a::number_ring) + j", "(i::'a::number_ring) - j"], | 
| 20045 
e66efbafbf1f
simprocs: no theory argument -- use simpset context instead;
 wenzelm parents: 
19617diff
changeset | 424 | K CombineNumerals.proc); | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 425 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 426 | end; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 427 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 428 | Addsimprocs Int_Numeral_Simprocs.cancel_numerals; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 429 | Addsimprocs [Int_Numeral_Simprocs.combine_numerals]; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 430 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 431 | (*examples: | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 432 | print_depth 22; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 433 | set timing; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 434 | set trace_simp; | 
| 13462 | 435 | fun test s = (Goal s, by (Simp_tac 1)); | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 436 | |
| 11704 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 437 | test "l + 2 + 2 + 2 + (l + 2) + (oo + 2) = (uu::int)"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 438 | |
| 11704 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 439 | test "2*u = (u::int)"; | 
| 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 440 | test "(i + j + 12 + (k::int)) - 15 = y"; | 
| 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 441 | test "(i + j + 12 + (k::int)) - 5 = y"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 442 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 443 | test "y - b < (b::int)"; | 
| 11704 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 444 | test "y - (3*b + c) < (b::int) - 2*c"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 445 | |
| 11704 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 446 | test "(2*x - (u*v) + y) - v*3*u = (w::int)"; | 
| 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 447 | test "(2*x*u*v + (u*v)*4 + y) - v*u*4 = (w::int)"; | 
| 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 448 | test "(2*x*u*v + (u*v)*4 + y) - v*u = (w::int)"; | 
| 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 449 | test "u*v - (x*u*v + (u*v)*4 + y) = (w::int)"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 450 | |
| 11704 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 451 | test "(i + j + 12 + (k::int)) = u + 15 + y"; | 
| 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 452 | test "(i + j*2 + 12 + (k::int)) = j + 5 + y"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 453 | |
| 11704 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 454 | test "2*y + 3*z + 6*w + 2*y + 3*z + 2*u = 2*y' + 3*z' + 6*w' + 2*y' + 3*z' + u + (vv::int)"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 455 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 456 | test "a + -(b+c) + b = (d::int)"; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 457 | test "a + -(b+c) - b = (d::int)"; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 458 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 459 | (*negative numerals*) | 
| 11704 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 460 | test "(i + j + -2 + (k::int)) - (u + 5 + y) = zz"; | 
| 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 461 | test "(i + j + -3 + (k::int)) < u + 5 + y"; | 
| 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 462 | test "(i + j + 3 + (k::int)) < u + -6 + y"; | 
| 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 463 | test "(i + j + -12 + (k::int)) - 15 = y"; | 
| 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 464 | test "(i + j + 12 + (k::int)) - -15 = y"; | 
| 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 465 | test "(i + j + -12 + (k::int)) - -15 = y"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 466 | *) | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 467 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 468 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 469 | (** Constant folding for multiplication in semirings **) | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 470 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 471 | (*We do not need folding for addition: combine_numerals does the same thing*) | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 472 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 473 | structure Semiring_Times_Assoc_Data : ASSOC_FOLD_DATA = | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 474 | struct | 
| 20045 
e66efbafbf1f
simprocs: no theory argument -- use simpset context instead;
 wenzelm parents: 
19617diff
changeset | 475 | val assoc_ss = HOL_ss addsimps mult_ac | 
| 
e66efbafbf1f
simprocs: no theory argument -- use simpset context instead;
 wenzelm parents: 
19617diff
changeset | 476 | val eq_reflection = eq_reflection | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 477 | end; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 478 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 479 | structure Semiring_Times_Assoc = Assoc_Fold (Semiring_Times_Assoc_Data); | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 480 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 481 | val assoc_fold_simproc = | 
| 20485 | 482 | Int_Numeral_Base_Simprocs.prep_simproc | 
| 14738 | 483 |    ("semiring_assoc_fold", ["(a::'a::comm_semiring_1_cancel) * b"],
 | 
| 20045 
e66efbafbf1f
simprocs: no theory argument -- use simpset context instead;
 wenzelm parents: 
19617diff
changeset | 484 | K Semiring_Times_Assoc.proc); | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 485 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 486 | Addsimprocs [assoc_fold_simproc]; | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 487 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 488 | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 489 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 490 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 491 | (*** decision procedure for linear arithmetic ***) | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 492 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 493 | (*---------------------------------------------------------------------------*) | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 494 | (* Linear arithmetic *) | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 495 | (*---------------------------------------------------------------------------*) | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 496 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 497 | (* | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 498 | Instantiation of the generic linear arithmetic package for int. | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 499 | *) | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 500 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 501 | (* Update parameters of arithmetic prover *) | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 502 | local | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 503 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 504 | (* reduce contradictory <= to False *) | 
| 13462 | 505 | val add_rules = | 
| 20485 | 506 | simp_thms @ arith_simps @ rel_simps @ arith_special @ | 
| 14390 | 507 | [neg_le_iff_le, numeral_0_eq_0, numeral_1_eq_1, | 
| 14369 | 508 | minus_zero, diff_minus, left_minus, right_minus, | 
| 20485 | 509 | mult_zero_left, mult_zero_right, mult_num1, mult_1_right, | 
| 14369 | 510 | minus_mult_left RS sym, minus_mult_right RS sym, | 
| 511 | minus_add_distrib, minus_minus, mult_assoc, | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 512 | of_nat_0, of_nat_1, of_nat_Suc, of_nat_add, of_nat_mult, | 
| 20254 
58b71535ed00
lin_arith_prover splits certain operators (e.g. min, max, abs)
 webertj parents: 
20113diff
changeset | 513 | of_int_0, of_int_1, of_int_add, of_int_mult, int_eq_of_nat] | 
| 
58b71535ed00
lin_arith_prover splits certain operators (e.g. min, max, abs)
 webertj parents: 
20113diff
changeset | 514 | |
| 
58b71535ed00
lin_arith_prover splits certain operators (e.g. min, max, abs)
 webertj parents: 
20113diff
changeset | 515 | val nat_inj_thms = [zle_int RS iffD2, | 
| 
58b71535ed00
lin_arith_prover splits certain operators (e.g. min, max, abs)
 webertj parents: 
20113diff
changeset | 516 | int_int_eq RS iffD2] | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 517 | |
| 20485 | 518 | val Int_Numeral_Base_Simprocs = [assoc_fold_simproc, Int_Numeral_Simprocs.combine_numerals]@ | 
| 20254 
58b71535ed00
lin_arith_prover splits certain operators (e.g. min, max, abs)
 webertj parents: 
20113diff
changeset | 519 | Int_Numeral_Simprocs.cancel_numerals | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 520 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 521 | in | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 522 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 523 | val int_arith_setup = | 
| 18708 | 524 |   Fast_Arith.map_data (fn {add_mono_thms, mult_mono_thms, inj_thms, lessD, neqE, simpset} =>
 | 
| 14368 
2763da611ad9
converted Real/Lubs to Isar script. Converting arithmetic setup
 paulson parents: 
14331diff
changeset | 525 |    {add_mono_thms = add_mono_thms,
 | 
| 15184 | 526 | mult_mono_thms = [mult_strict_left_mono,mult_left_mono] @ mult_mono_thms, | 
| 20254 
58b71535ed00
lin_arith_prover splits certain operators (e.g. min, max, abs)
 webertj parents: 
20113diff
changeset | 527 | inj_thms = nat_inj_thms @ inj_thms, | 
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14271diff
changeset | 528 | lessD = lessD @ [zless_imp_add1_zle], | 
| 19044 
d4bc0ee9383a
got rid of superfluous linorder_neqE-instance for int.
 nipkow parents: 
18708diff
changeset | 529 | neqE = neqE, | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 530 | simpset = simpset addsimps add_rules | 
| 20485 | 531 | addsimprocs Int_Numeral_Base_Simprocs | 
| 18708 | 532 | addcongs [if_weak_cong]}) #> | 
| 20254 
58b71535ed00
lin_arith_prover splits certain operators (e.g. min, max, abs)
 webertj parents: 
20113diff
changeset | 533 |   arith_inj_const ("NatArith.of_nat", HOLogic.natT --> HOLogic.intT) #>
 | 
| 18708 | 534 |   arith_inj_const ("IntDef.int", HOLogic.natT --> HOLogic.intT) #>
 | 
| 20254 
58b71535ed00
lin_arith_prover splits certain operators (e.g. min, max, abs)
 webertj parents: 
20113diff
changeset | 535 | arith_discrete "IntDef.int" | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 536 | |
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 537 | end; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 538 | |
| 13462 | 539 | val fast_int_arith_simproc = | 
| 540 | Simplifier.simproc (Theory.sign_of (the_context())) | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 541 | "fast_int_arith" | 
| 14738 | 542 |      ["(m::'a::{ordered_idom,number_ring}) < n",
 | 
| 543 |       "(m::'a::{ordered_idom,number_ring}) <= n",
 | |
| 544 |       "(m::'a::{ordered_idom,number_ring}) = n"] Fast_Arith.lin_arith_prover;
 | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 545 | |
| 20254 
58b71535ed00
lin_arith_prover splits certain operators (e.g. min, max, abs)
 webertj parents: 
20113diff
changeset | 546 | Addsimprocs [fast_int_arith_simproc]; | 
| 13462 | 547 | |
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 548 | |
| 15661 
9ef583b08647
reverted renaming of Some/None in comments and strings;
 wenzelm parents: 
15531diff
changeset | 549 | (* Some test data | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 550 | Goal "!!a::int. [| a <= b; c <= d; x+y<z |] ==> a+c <= b+d"; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 551 | by (fast_arith_tac 1); | 
| 11704 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 552 | Goal "!!a::int. [| a < b; c < d |] ==> a-d+ 2 <= b+(-c)"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 553 | by (fast_arith_tac 1); | 
| 11868 
56db9f3a6b3e
Numerals now work for the integers: the binary numerals for 0 and 1 rewrite
 paulson parents: 
11713diff
changeset | 554 | Goal "!!a::int. [| a < b; c < d |] ==> a+c+ 1 < b+d"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 555 | by (fast_arith_tac 1); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 556 | Goal "!!a::int. [| a <= b; b+b <= c |] ==> a+a <= c"; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 557 | by (fast_arith_tac 1); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 558 | Goal "!!a::int. [| a+b <= i+j; a<=b; i<=j |] \ | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 559 | \ ==> a+a <= j+j"; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 560 | by (fast_arith_tac 1); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 561 | Goal "!!a::int. [| a+b < i+j; a<b; i<j |] \ | 
| 11704 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 562 | \ ==> a+a - - -1 < j+j - 3"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 563 | by (fast_arith_tac 1); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 564 | Goal "!!a::int. a+b+c <= i+j+k & a<=b & b<=c & i<=j & j<=k --> a+a+a <= k+k+k"; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 565 | by (arith_tac 1); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 566 | Goal "!!a::int. [| a+b+c+d <= i+j+k+l; a<=b; b<=c; c<=d; i<=j; j<=k; k<=l |] \ | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 567 | \ ==> a <= l"; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 568 | by (fast_arith_tac 1); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 569 | Goal "!!a::int. [| a+b+c+d <= i+j+k+l; a<=b; b<=c; c<=d; i<=j; j<=k; k<=l |] \ | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 570 | \ ==> a+a+a+a <= l+l+l+l"; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 571 | by (fast_arith_tac 1); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 572 | Goal "!!a::int. [| a+b+c+d <= i+j+k+l; a<=b; b<=c; c<=d; i<=j; j<=k; k<=l |] \ | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 573 | \ ==> a+a+a+a+a <= l+l+l+l+i"; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 574 | by (fast_arith_tac 1); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 575 | Goal "!!a::int. [| a+b+c+d <= i+j+k+l; a<=b; b<=c; c<=d; i<=j; j<=k; k<=l |] \ | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 576 | \ ==> a+a+a+a+a+a <= l+l+l+l+i+l"; | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 577 | by (fast_arith_tac 1); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 578 | Goal "!!a::int. [| a+b+c+d <= i+j+k+l; a<=b; b<=c; c<=d; i<=j; j<=k; k<=l |] \ | 
| 11704 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 wenzelm parents: 
11701diff
changeset | 579 | \ ==> 6*a <= 5*l+i"; | 
| 9436 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 580 | by (fast_arith_tac 1); | 
| 
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
 wenzelm parents: diff
changeset | 581 | *) |