265 their coefficients |
265 their coefficients |
266 *) |
266 *) |
267 |
267 |
268 fun demult inj_consts = |
268 fun demult inj_consts = |
269 let |
269 let |
270 fun demult((mC as Const("op *",_)) $ s $ t,m) = ((case s of |
270 fun demult((mC as Const("HOL.times",_)) $ s $ t,m) = ((case s of |
271 Const("Numeral.number_of",_)$n |
271 Const("Numeral.number_of",_)$n |
272 => demult(t,Rat.mult(m,Rat.rat_of_intinf(HOLogic.dest_binum n))) |
272 => demult(t,Rat.mult(m,Rat.rat_of_intinf(HOLogic.dest_binum n))) |
273 | Const("uminus",_)$(Const("Numeral.number_of",_)$n) |
273 | Const("HOL.uminus",_)$(Const("Numeral.number_of",_)$n) |
274 => demult(t,Rat.mult(m,Rat.rat_of_intinf(~(HOLogic.dest_binum n)))) |
274 => demult(t,Rat.mult(m,Rat.rat_of_intinf(~(HOLogic.dest_binum n)))) |
275 | Const("Suc",_) $ _ |
275 | Const("Suc",_) $ _ |
276 => demult(t,Rat.mult(m,Rat.rat_of_int(number_of_Sucs s))) |
276 => demult(t,Rat.mult(m,Rat.rat_of_int(number_of_Sucs s))) |
277 | Const("op *",_) $ s1 $ s2 => demult(mC $ s1 $ (mC $ s2 $ t),m) |
277 | Const("HOL.times",_) $ s1 $ s2 => demult(mC $ s1 $ (mC $ s2 $ t),m) |
278 | Const("HOL.divide",_) $ numt $ (Const("Numeral.number_of",_)$dent) => |
278 | Const("HOL.divide",_) $ numt $ (Const("Numeral.number_of",_)$dent) => |
279 let val den = HOLogic.dest_binum dent |
279 let val den = HOLogic.dest_binum dent |
280 in if den = 0 then raise Zero |
280 in if den = 0 then raise Zero |
281 else demult(mC $ numt $ t,Rat.mult(m, Rat.inv(Rat.rat_of_intinf den))) |
281 else demult(mC $ numt $ t,Rat.mult(m, Rat.inv(Rat.rat_of_intinf den))) |
282 end |
282 end |
289 | demult(Const("0",_),m) = (NONE, Rat.rat_of_int 0) |
289 | demult(Const("0",_),m) = (NONE, Rat.rat_of_int 0) |
290 | demult(Const("1",_),m) = (NONE, m) |
290 | demult(Const("1",_),m) = (NONE, m) |
291 | demult(t as Const("Numeral.number_of",_)$n,m) = |
291 | demult(t as Const("Numeral.number_of",_)$n,m) = |
292 ((NONE,Rat.mult(m,Rat.rat_of_intinf(HOLogic.dest_binum n))) |
292 ((NONE,Rat.mult(m,Rat.rat_of_intinf(HOLogic.dest_binum n))) |
293 handle TERM _ => (SOME t,m)) |
293 handle TERM _ => (SOME t,m)) |
294 | demult(Const("uminus",_)$t, m) = demult(t,Rat.mult(m,Rat.rat_of_int(~1))) |
294 | demult(Const("HOL.uminus",_)$t, m) = demult(t,Rat.mult(m,Rat.rat_of_int(~1))) |
295 | demult(t as Const f $ x, m) = |
295 | demult(t as Const f $ x, m) = |
296 (if f mem inj_consts then SOME x else SOME t,m) |
296 (if f mem inj_consts then SOME x else SOME t,m) |
297 | demult(atom,m) = (SOME atom,m) |
297 | demult(atom,m) = (SOME atom,m) |
298 |
298 |
299 and atomult(mC,atom,t,m) = (case demult(t,m) of (NONE,m') => (SOME atom,m') |
299 and atomult(mC,atom,t,m) = (case demult(t,m) of (NONE,m') => (SOME atom,m') |
301 in demult end; |
301 in demult end; |
302 |
302 |
303 fun decomp2 inj_consts (rel,lhs,rhs) = |
303 fun decomp2 inj_consts (rel,lhs,rhs) = |
304 let |
304 let |
305 (* Turn term into list of summand * multiplicity plus a constant *) |
305 (* Turn term into list of summand * multiplicity plus a constant *) |
306 fun poly(Const("op +",_) $ s $ t, m, pi) = poly(s,m,poly(t,m,pi)) |
306 fun poly(Const("HOL.plus",_) $ s $ t, m, pi) = poly(s,m,poly(t,m,pi)) |
307 | poly(all as Const("op -",T) $ s $ t, m, pi) = |
307 | poly(all as Const("HOL.minus",T) $ s $ t, m, pi) = |
308 if nT T then add_atom(all,m,pi) else poly(s,m,poly(t,Rat.neg m,pi)) |
308 if nT T then add_atom(all,m,pi) else poly(s,m,poly(t,Rat.neg m,pi)) |
309 | poly(all as Const("uminus",T) $ t, m, pi) = |
309 | poly(all as Const("HOL.uminus",T) $ t, m, pi) = |
310 if nT T then add_atom(all,m,pi) else poly(t,Rat.neg m,pi) |
310 if nT T then add_atom(all,m,pi) else poly(t,Rat.neg m,pi) |
311 | poly(Const("0",_), _, pi) = pi |
311 | poly(Const("0",_), _, pi) = pi |
312 | poly(Const("1",_), m, (p,i)) = (p,Rat.add(i,m)) |
312 | poly(Const("1",_), m, (p,i)) = (p,Rat.add(i,m)) |
313 | poly(Const("Suc",_)$t, m, (p,i)) = poly(t, m, (p,Rat.add(i,m))) |
313 | poly(Const("Suc",_)$t, m, (p,i)) = poly(t, m, (p,Rat.add(i,m))) |
314 | poly(t as Const("op *",_) $ _ $ _, m, pi as (p,i)) = |
314 | poly(t as Const("HOL.times",_) $ _ $ _, m, pi as (p,i)) = |
315 (case demult inj_consts (t,m) of |
315 (case demult inj_consts (t,m) of |
316 (NONE,m') => (p,Rat.add(i,m)) |
316 (NONE,m') => (p,Rat.add(i,m)) |
317 | (SOME u,m') => add_atom(u,m',pi)) |
317 | (SOME u,m') => add_atom(u,m',pi)) |
318 | poly(t as Const("HOL.divide",_) $ _ $ _, m, pi as (p,i)) = |
318 | poly(t as Const("HOL.divide",_) $ _ $ _, m, pi as (p,i)) = |
319 (case demult inj_consts (t,m) of |
319 (case demult inj_consts (t,m) of |