158 in |
158 in |
159 fun numterm_ord (Abs (_, T, t), Abs(_, U, u)) = |
159 fun numterm_ord (Abs (_, T, t), Abs(_, U, u)) = |
160 (case numterm_ord (t, u) of EQUAL => typ_ord (T, U) | ord => ord) |
160 (case numterm_ord (t, u) of EQUAL => typ_ord (T, U) | ord => ord) |
161 | numterm_ord |
161 | numterm_ord |
162 (Const("Numeral.number_of", _) $ v, Const("Numeral.number_of", _) $ w) = |
162 (Const("Numeral.number_of", _) $ v, Const("Numeral.number_of", _) $ w) = |
163 num_ord (HOLogic.dest_binum v, HOLogic.dest_binum w) |
163 num_ord (HOLogic.dest_numeral v, HOLogic.dest_numeral w) |
164 | numterm_ord (Const("Numeral.number_of", _) $ _, _) = LESS |
164 | numterm_ord (Const("Numeral.number_of", _) $ _, _) = LESS |
165 | numterm_ord (_, Const("Numeral.number_of", _) $ _) = GREATER |
165 | numterm_ord (_, Const("Numeral.number_of", _) $ _) = GREATER |
166 | numterm_ord (t, u) = |
166 | numterm_ord (t, u) = |
167 (case int_ord (size_of_term t, size_of_term u) of |
167 (case int_ord (size_of_term t, size_of_term u) of |
168 EQUAL => |
168 EQUAL => |
179 val num_ss = HOL_ss settermless numtermless; |
179 val num_ss = HOL_ss settermless numtermless; |
180 |
180 |
181 |
181 |
182 (** Utilities **) |
182 (** Utilities **) |
183 |
183 |
184 fun mk_numeral T n = HOLogic.number_of_const T $ HOLogic.mk_binum n; |
184 fun mk_number T n = HOLogic.number_of_const T $ HOLogic.mk_numeral n; |
185 |
185 |
186 (*Decodes a binary INTEGER*) |
186 (*Decodes a binary INTEGER*) |
187 fun dest_numeral (Const("HOL.zero", _)) = 0 |
187 fun dest_number (Const("HOL.zero", _)) = 0 |
188 | dest_numeral (Const("HOL.one", _)) = 1 |
188 | dest_number (Const("HOL.one", _)) = 1 |
189 | dest_numeral (Const("Numeral.number_of", _) $ w) = |
189 | dest_number (Const("Numeral.number_of", _) $ w) = |
190 (HOLogic.dest_binum w |
190 (HOLogic.dest_numeral w |
191 handle TERM _ => raise TERM("Int_Numeral_Simprocs.dest_numeral:1", [w])) |
191 handle TERM _ => raise TERM("Int_Numeral_Simprocs.dest_number:1", [w])) |
192 | dest_numeral t = raise TERM("Int_Numeral_Simprocs.dest_numeral:2", [t]); |
192 | dest_number t = raise TERM("Int_Numeral_Simprocs.dest_number:2", [t]); |
193 |
193 |
194 fun find_first_numeral past (t::terms) = |
194 fun find_first_numeral past (t::terms) = |
195 ((dest_numeral t, rev past @ terms) |
195 ((dest_number t, rev past @ terms) |
196 handle TERM _ => find_first_numeral (t::past) terms) |
196 handle TERM _ => find_first_numeral (t::past) terms) |
197 | find_first_numeral past [] = raise TERM("find_first_numeral", []); |
197 | find_first_numeral past [] = raise TERM("find_first_numeral", []); |
198 |
198 |
199 val mk_plus = HOLogic.mk_binop "HOL.plus"; |
199 val mk_plus = HOLogic.mk_binop "HOL.plus"; |
200 |
200 |
202 let val T = Term.fastype_of t |
202 let val T = Term.fastype_of t |
203 in Const ("HOL.uminus", T --> T) $ t |
203 in Const ("HOL.uminus", T --> T) $ t |
204 end; |
204 end; |
205 |
205 |
206 (*Thus mk_sum[t] yields t+0; longer sums don't have a trailing zero*) |
206 (*Thus mk_sum[t] yields t+0; longer sums don't have a trailing zero*) |
207 fun mk_sum T [] = mk_numeral T 0 |
207 fun mk_sum T [] = mk_number T 0 |
208 | mk_sum T [t,u] = mk_plus (t, u) |
208 | mk_sum T [t,u] = mk_plus (t, u) |
209 | mk_sum T (t :: ts) = mk_plus (t, mk_sum T ts); |
209 | mk_sum T (t :: ts) = mk_plus (t, mk_sum T ts); |
210 |
210 |
211 (*this version ALWAYS includes a trailing zero*) |
211 (*this version ALWAYS includes a trailing zero*) |
212 fun long_mk_sum T [] = mk_numeral T 0 |
212 fun long_mk_sum T [] = mk_number T 0 |
213 | long_mk_sum T (t :: ts) = mk_plus (t, mk_sum T ts); |
213 | long_mk_sum T (t :: ts) = mk_plus (t, mk_sum T ts); |
214 |
214 |
215 val dest_plus = HOLogic.dest_bin "HOL.plus" Term.dummyT; |
215 val dest_plus = HOLogic.dest_bin "HOL.plus" Term.dummyT; |
216 |
216 |
217 (*decompose additions AND subtractions as a sum*) |
217 (*decompose additions AND subtractions as a sum*) |
228 val dest_diff = HOLogic.dest_bin "HOL.minus" Term.dummyT; |
228 val dest_diff = HOLogic.dest_bin "HOL.minus" Term.dummyT; |
229 |
229 |
230 val mk_times = HOLogic.mk_binop "HOL.times"; |
230 val mk_times = HOLogic.mk_binop "HOL.times"; |
231 |
231 |
232 fun mk_prod T = |
232 fun mk_prod T = |
233 let val one = mk_numeral T 1 |
233 let val one = mk_number T 1 |
234 fun mk [] = one |
234 fun mk [] = one |
235 | mk [t] = t |
235 | mk [t] = t |
236 | mk (t :: ts) = if t = one then mk ts else mk_times (t, mk ts) |
236 | mk (t :: ts) = if t = one then mk ts else mk_times (t, mk ts) |
237 in mk end; |
237 in mk end; |
238 |
238 |
239 (*This version ALWAYS includes a trailing one*) |
239 (*This version ALWAYS includes a trailing one*) |
240 fun long_mk_prod T [] = mk_numeral T 1 |
240 fun long_mk_prod T [] = mk_number T 1 |
241 | long_mk_prod T (t :: ts) = mk_times (t, mk_prod T ts); |
241 | long_mk_prod T (t :: ts) = mk_times (t, mk_prod T ts); |
242 |
242 |
243 val dest_times = HOLogic.dest_bin "HOL.times" Term.dummyT; |
243 val dest_times = HOLogic.dest_bin "HOL.times" Term.dummyT; |
244 |
244 |
245 fun dest_prod t = |
245 fun dest_prod t = |
246 let val (t,u) = dest_times t |
246 let val (t,u) = dest_times t |
247 in dest_prod t @ dest_prod u end |
247 in dest_prod t @ dest_prod u end |
248 handle TERM _ => [t]; |
248 handle TERM _ => [t]; |
249 |
249 |
250 (*DON'T do the obvious simplifications; that would create special cases*) |
250 (*DON'T do the obvious simplifications; that would create special cases*) |
251 fun mk_coeff (k, t) = mk_times (mk_numeral (Term.fastype_of t) k, t); |
251 fun mk_coeff (k, t) = mk_times (mk_number (Term.fastype_of t) k, t); |
252 |
252 |
253 (*Express t as a product of (possibly) a numeral with other sorted terms*) |
253 (*Express t as a product of (possibly) a numeral with other sorted terms*) |
254 fun dest_coeff sign (Const ("HOL.uminus", _) $ t) = dest_coeff (~sign) t |
254 fun dest_coeff sign (Const ("HOL.uminus", _) $ t) = dest_coeff (~sign) t |
255 | dest_coeff sign t = |
255 | dest_coeff sign t = |
256 let val ts = sort Term.term_ord (dest_prod t) |
256 let val ts = sort Term.term_ord (dest_prod t) |