src/HOL/Tools/numeral_simprocs.ML
changeset 36409 d323e7773aa8
parent 36349 39be26d1bc28
child 36751 7f1da69cacb3
equal deleted inserted replaced
36350:bc7982c54e37 36409:d323e7773aa8
   330      K CombineNumerals.proc);
   330      K CombineNumerals.proc);
   331 
   331 
   332 val field_combine_numerals =
   332 val field_combine_numerals =
   333   Arith_Data.prep_simproc @{theory}
   333   Arith_Data.prep_simproc @{theory}
   334     ("field_combine_numerals", 
   334     ("field_combine_numerals", 
   335      ["(i::'a::{number_ring,field,division_ring_inverse_zero}) + j",
   335      ["(i::'a::{field_inverse_zero, number_ring}) + j",
   336       "(i::'a::{number_ring,field,division_ring_inverse_zero}) - j"], 
   336       "(i::'a::{field_inverse_zero, number_ring}) - j"], 
   337      K FieldCombineNumerals.proc);
   337      K FieldCombineNumerals.proc);
   338 
   338 
   339 (** Constant folding for multiplication in semirings **)
   339 (** Constant folding for multiplication in semirings **)
   340 
   340 
   341 (*We do not need folding for addition: combine_numerals does the same thing*)
   341 (*We do not need folding for addition: combine_numerals does the same thing*)
   440     ("int_div_cancel_numeral_factors",
   440     ("int_div_cancel_numeral_factors",
   441      ["((l::'a::{semiring_div,number_ring}) * m) div n",
   441      ["((l::'a::{semiring_div,number_ring}) * m) div n",
   442       "(l::'a::{semiring_div,number_ring}) div (m * n)"],
   442       "(l::'a::{semiring_div,number_ring}) div (m * n)"],
   443      K DivCancelNumeralFactor.proc),
   443      K DivCancelNumeralFactor.proc),
   444     ("divide_cancel_numeral_factor",
   444     ("divide_cancel_numeral_factor",
   445      ["((l::'a::{division_ring_inverse_zero,field,number_ring}) * m) / n",
   445      ["((l::'a::{field_inverse_zero,number_ring}) * m) / n",
   446       "(l::'a::{division_ring_inverse_zero,field,number_ring}) / (m * n)",
   446       "(l::'a::{field_inverse_zero,number_ring}) / (m * n)",
   447       "((number_of v)::'a::{division_ring_inverse_zero,field,number_ring}) / (number_of w)"],
   447       "((number_of v)::'a::{field_inverse_zero,number_ring}) / (number_of w)"],
   448      K DivideCancelNumeralFactor.proc)];
   448      K DivideCancelNumeralFactor.proc)];
   449 
   449 
   450 val field_cancel_numeral_factors =
   450 val field_cancel_numeral_factors =
   451   map (Arith_Data.prep_simproc @{theory})
   451   map (Arith_Data.prep_simproc @{theory})
   452    [("field_eq_cancel_numeral_factor",
   452    [("field_eq_cancel_numeral_factor",
   453      ["(l::'a::{field,number_ring}) * m = n",
   453      ["(l::'a::{field,number_ring}) * m = n",
   454       "(l::'a::{field,number_ring}) = m * n"],
   454       "(l::'a::{field,number_ring}) = m * n"],
   455      K EqCancelNumeralFactor.proc),
   455      K EqCancelNumeralFactor.proc),
   456     ("field_cancel_numeral_factor",
   456     ("field_cancel_numeral_factor",
   457      ["((l::'a::{division_ring_inverse_zero,field,number_ring}) * m) / n",
   457      ["((l::'a::{field_inverse_zero,number_ring}) * m) / n",
   458       "(l::'a::{division_ring_inverse_zero,field,number_ring}) / (m * n)",
   458       "(l::'a::{field_inverse_zero,number_ring}) / (m * n)",
   459       "((number_of v)::'a::{division_ring_inverse_zero,field,number_ring}) / (number_of w)"],
   459       "((number_of v)::'a::{field_inverse_zero,number_ring}) / (number_of w)"],
   460      K DivideCancelNumeralFactor.proc)]
   460      K DivideCancelNumeralFactor.proc)]
   461 
   461 
   462 
   462 
   463 (** Declarations for ExtractCommonTerm **)
   463 (** Declarations for ExtractCommonTerm **)
   464 
   464 
   596      K ModCancelFactor.proc),
   596      K ModCancelFactor.proc),
   597     ("dvd_cancel_factor",
   597     ("dvd_cancel_factor",
   598      ["((l::'a::idom) * m) dvd n", "(l::'a::idom) dvd (m * n)"],
   598      ["((l::'a::idom) * m) dvd n", "(l::'a::idom) dvd (m * n)"],
   599      K DvdCancelFactor.proc),
   599      K DvdCancelFactor.proc),
   600     ("divide_cancel_factor",
   600     ("divide_cancel_factor",
   601      ["((l::'a::{division_ring_inverse_zero,field}) * m) / n",
   601      ["((l::'a::field_inverse_zero) * m) / n",
   602       "(l::'a::{division_ring_inverse_zero,field}) / (m * n)"],
   602       "(l::'a::field_inverse_zero) / (m * n)"],
   603      K DivideCancelFactor.proc)];
   603      K DivideCancelFactor.proc)];
   604 
   604 
   605 end;
   605 end;
   606 
   606 
   607 Addsimprocs Numeral_Simprocs.cancel_numerals;
   607 Addsimprocs Numeral_Simprocs.cancel_numerals;