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*) |