| author | wenzelm | 
| Mon, 13 Feb 2023 11:53:35 +0100 | |
| changeset 77290 | 12fd873af77c | 
| parent 74633 | 994a2b9daf1d | 
| child 82967 | 73af47bc277c | 
| permissions | -rw-r--r-- | 
| 65367 | 1 | (* Title: HOL/Library/Cancellation/cancel_data.ML | 
| 2 | Author: Lawrence C Paulson, Cambridge University Computer Laboratory | |
| 65029 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 3 | Author: Mathias Fleury, MPII | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 4 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 5 | Datastructure for the cancelation simprocs. | 
| 65367 | 6 | *) | 
| 65029 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 7 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 8 | signature CANCEL_DATA = | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 9 | sig | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 10 | val mk_sum : typ -> term list -> term | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 11 | val dest_sum : term -> term list | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 12 | val mk_coeff : int * term -> term | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 13 | val dest_coeff : term -> int * term | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 14 | val find_first_coeff : term -> term list -> int * term list | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 15 | val trans_tac : Proof.context -> thm option -> tactic | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 16 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 17 | val norm_ss1 : simpset | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 18 | val norm_ss2: simpset | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 19 | val norm_tac: Proof.context -> tactic | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 20 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 21 | val numeral_simp_tac : Proof.context -> tactic | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 22 | val simplify_meta_eq : Proof.context -> thm -> thm | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 23 | val prove_conv : tactic list -> Proof.context -> thm list -> term * term -> thm option | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 24 | end; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 25 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 26 | structure Cancel_Data : CANCEL_DATA = | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 27 | struct | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 28 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 29 | (*** Utilities ***) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 30 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 31 | (*No reordering of the arguments.*) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 32 | fun fast_mk_iterate_add (n, mset) = | 
| 74633 | 33 | \<^Const>\<open>iterate_add \<open>fastype_of mset\<close> for n mset\<close>; | 
| 65029 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 34 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 35 | (*iterate_add is not symmetric, unlike multiplication over natural numbers.*) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 36 | fun mk_iterate_add (t, u) = | 
| 69593 | 37 | (if fastype_of t = \<^typ>\<open>nat\<close> then (t, u) else (u, t)) | 
| 65029 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 38 | |> fast_mk_iterate_add; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 39 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 40 | (*Maps n to #n for n = 1, 2*) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 41 | val numeral_syms = | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 42 |   map (fn th => th RS sym) @{thms numeral_One numeral_2_eq_2 numeral_1_eq_Suc_0};
 | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 43 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 44 | val numeral_sym_ss = | 
| 69593 | 45 | simpset_of (put_simpset HOL_basic_ss \<^context> addsimps numeral_syms); | 
| 65029 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 46 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 47 | fun mk_number 1 = HOLogic.numeral_const HOLogic.natT $ HOLogic.one_const | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 48 | | mk_number n = HOLogic.mk_number HOLogic.natT n; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 49 | fun dest_number t = Int.max (0, snd (HOLogic.dest_number t)); | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 50 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 51 | fun find_first_numeral past (t::terms) = | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 52 | ((dest_number t, t, rev past @ terms) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 53 | handle TERM _ => find_first_numeral (t::past) terms) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 54 |   | find_first_numeral _ [] = raise TERM("find_first_numeral", []);
 | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 55 | |
| 74633 | 56 | fun typed_zero T = \<^Const>\<open>Groups.zero T\<close>; | 
| 57 | fun typed_one T = \<^Const>\<open>numeral T for \<^Const>\<open>num.One\<close>\<close>; | |
| 58 | val mk_plus = HOLogic.mk_binop \<^const_name>\<open>plus\<close>; | |
| 65029 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 59 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 60 | (*Thus mk_sum[t] yields t+0; longer sums don't have a trailing zero.*) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 61 | fun mk_sum T [] = typed_zero T | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 62 | | mk_sum _ [t,u] = mk_plus (t, u) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 63 | | mk_sum T (t :: ts) = mk_plus (t, mk_sum T ts); | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 64 | |
| 74633 | 65 | val dest_plus = HOLogic.dest_bin \<^const_name>\<open>plus\<close> dummyT; | 
| 65029 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 66 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 67 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 68 | (*** Other simproc items ***) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 69 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 70 | val bin_simps = | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 71 |   (@{thm numeral_One} RS sym) ::
 | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 72 |   @{thms add_numeral_left diff_nat_numeral diff_0_eq_0 mult_numeral_left(1)
 | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 73 | if_True if_False not_False_eq_True nat_0 nat_numeral nat_neg_numeral iterate_add_simps(1) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 74 | iterate_add_empty arith_simps rel_simps of_nat_numeral}; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 75 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 76 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 77 | (*** CancelNumerals simprocs ***) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 78 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 79 | val one = mk_number 1; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 80 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 81 | fun mk_prod T [] = typed_one T | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 82 | | mk_prod _ [t] = t | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 83 | | mk_prod T (t :: ts) = if t = one then mk_prod T ts else mk_iterate_add (t, mk_prod T ts); | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 84 | |
| 69593 | 85 | val dest_iterate_add = HOLogic.dest_bin \<^const_name>\<open>iterate_add\<close> dummyT; | 
| 65029 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 86 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 87 | fun dest_iterate_adds t = | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 88 | let val (t,u) = dest_iterate_add t in | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 89 | t :: dest_iterate_adds u end | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 90 | handle TERM _ => [t]; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 91 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 92 | fun mk_coeff (k,t) = mk_iterate_add (mk_number k, t); | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 93 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 94 | (*Express t as a product of (possibly) a numeral with other factors, sorted*) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 95 | fun dest_coeff t = | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 96 | let | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 97 | val T = fastype_of t | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 98 | val ts = sort Term_Ord.term_ord (dest_iterate_adds t); | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 99 | val (n, _, ts') = | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 100 | find_first_numeral [] ts | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 101 | handle TERM _ => (1, one, ts); | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 102 | in (n, mk_prod T ts') end; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 103 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 104 | (*Find first coefficient-term THAT MATCHES u*) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 105 | fun find_first_coeff _ _ [] = raise TERM("find_first_coeff", [])
 | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 106 | | find_first_coeff past u (t::terms) = | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 107 | let val (n,u') = dest_coeff t in | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 108 | if u aconv u' then (n, rev past @ terms) else find_first_coeff (t::past) u terms end | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 109 | handle TERM _ => find_first_coeff (t::past) u terms; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 110 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 111 | (* | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 112 | Split up a sum into the list of its constituent terms. | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 113 | *) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 114 | fun dest_summation (t, ts) = | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 115 | let val (t1,t2) = dest_plus t in | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 116 | dest_summation (t1, dest_summation (t2, ts)) end | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 117 | handle TERM _ => t :: ts; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 118 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 119 | fun dest_sum t = dest_summation (t, []); | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 120 | |
| 69593 | 121 | val rename_numerals = simplify (put_simpset numeral_sym_ss \<^context>) o Thm.transfer \<^theory>; | 
| 65029 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 122 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 123 | (*Simplify \<open>iterate_add (Suc 0) n\<close>, \<open>iterate_add n (Suc 0)\<close>, \<open>n+0\<close>, and \<open>0+n\<close> to \<open>n\<close>*) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 124 | val add_0s  = map rename_numerals @{thms monoid_add_class.add_0_left monoid_add_class.add_0_right};
 | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 125 | val mult_1s = map rename_numerals @{thms iterate_add_1 iterate_add_simps(2)[of 0]};
 | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 126 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 127 | (*And these help the simproc return False when appropriate. We use the same list as the | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 128 | simproc for natural numbers, but adapted.*) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 129 | fun contra_rules ctxt = | 
| 69593 | 130 |   @{thms le_zero_eq}  @ Named_Theorems.get ctxt \<^named_theorems>\<open>cancelation_simproc_eq_elim\<close>;
 | 
| 65029 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 131 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 132 | fun simplify_meta_eq ctxt = | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 133 | Arith_Data.simplify_meta_eq | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 134 |     (@{thms numeral_1_eq_Suc_0 Nat.add_0_right
 | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 135 | mult_0 mult_0_right mult_1 mult_1_right iterate_add_Numeral1 of_nat_numeral | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 136 | monoid_add_class.add_0_left iterate_add_simps(1) monoid_add_class.add_0_right | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 137 | iterate_add_Numeral1} @ | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 138 | contra_rules ctxt) ctxt; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 139 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 140 | val mk_sum = mk_sum; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 141 | val dest_sum = dest_sum; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 142 | val mk_coeff = mk_coeff; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 143 | val dest_coeff = dest_coeff; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 144 | val find_first_coeff = find_first_coeff []; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 145 | val trans_tac = Numeral_Simprocs.trans_tac; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 146 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 147 | val norm_ss1 = | 
| 69593 | 148 | simpset_of (put_simpset Numeral_Simprocs.num_ss \<^context> addsimps | 
| 65029 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 149 |     numeral_syms @ add_0s @ mult_1s @ @{thms ac_simps iterate_add_simps});
 | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 150 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 151 | val norm_ss2 = | 
| 69593 | 152 | simpset_of (put_simpset Numeral_Simprocs.num_ss \<^context> addsimps | 
| 65029 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 153 | bin_simps @ | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 154 |     @{thms ac_simps});
 | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 155 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 156 | fun norm_tac ctxt = | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 157 | ALLGOALS (simp_tac (put_simpset norm_ss1 ctxt)) | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 158 | THEN ALLGOALS (simp_tac (put_simpset norm_ss2 ctxt)); | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 159 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 160 | val mset_simps_ss = | 
| 69593 | 161 | simpset_of (put_simpset HOL_basic_ss \<^context> addsimps bin_simps); | 
| 65029 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 162 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 163 | fun numeral_simp_tac ctxt = ALLGOALS (simp_tac (put_simpset mset_simps_ss ctxt)); | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 164 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 165 | val simplify_meta_eq = simplify_meta_eq; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 166 | val prove_conv = Arith_Data.prove_conv; | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 167 | |
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 168 | end | 
| 
00731700e54f
cancellation simprocs generalising the multiset simprocs
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 169 |