src/HOL/Integ/IntDiv.thy
changeset 22948 8752ca7f849a
parent 22802 92026479179e
child 22993 838c66e760b5
equal deleted inserted replaced
22947:f53486e661a7 22948:8752ca7f849a
     7 
     7 
     8 header{*The Division Operators div and mod; the Divides Relation dvd*}
     8 header{*The Division Operators div and mod; the Divides Relation dvd*}
     9 
     9 
    10 theory IntDiv
    10 theory IntDiv
    11 imports IntArith "../Divides" "../FunDef"
    11 imports IntArith "../Divides" "../FunDef"
    12 uses ("IntDiv_setup.ML")
       
    13 begin
    12 begin
    14 
    13 
    15 declare zless_nat_conj [simp]
    14 declare zless_nat_conj [simp]
    16 
    15 
    17 constdefs
    16 constdefs
   243 by(simp add: zmod_zdiv_equality[symmetric])
   242 by(simp add: zmod_zdiv_equality[symmetric])
   244 
   243 
   245 lemma zdiv_zmod_equality2: "((a div b) * b + (a mod b)) + k = (a::int)+k"
   244 lemma zdiv_zmod_equality2: "((a div b) * b + (a mod b)) + k = (a::int)+k"
   246 by(simp add: mult_commute zmod_zdiv_equality[symmetric])
   245 by(simp add: mult_commute zmod_zdiv_equality[symmetric])
   247 
   246 
   248 use "IntDiv_setup.ML"
   247 text {* Tool setup *}
       
   248 
       
   249 ML_setup {*
       
   250 local 
       
   251 
       
   252 structure CancelDivMod = CancelDivModFun(
       
   253 struct
       
   254   val div_name = @{const_name "Divides.div"};
       
   255   val mod_name = @{const_name "Divides.mod"};
       
   256   val mk_binop = HOLogic.mk_binop;
       
   257   val mk_sum = Int_Numeral_Simprocs.mk_sum HOLogic.intT;
       
   258   val dest_sum = Int_Numeral_Simprocs.dest_sum;
       
   259   val div_mod_eqs =
       
   260     map mk_meta_eq [@{thm zdiv_zmod_equality},
       
   261       @{thm zdiv_zmod_equality2}];
       
   262   val trans = trans;
       
   263   val prove_eq_sums =
       
   264     let
       
   265       val simps = diff_int_def :: Int_Numeral_Simprocs.add_0s @ zadd_ac
       
   266     in NatArithUtils.prove_conv all_tac (NatArithUtils.simp_all_tac simps) end;
       
   267 end)
       
   268 
       
   269 in
       
   270 
       
   271 val cancel_zdiv_zmod_proc = NatArithUtils.prep_simproc
       
   272   ("cancel_zdiv_zmod", ["(m::int) + n"], K CancelDivMod.proc)
       
   273 
       
   274 end;
       
   275 
       
   276 Addsimprocs [cancel_zdiv_zmod_proc]
       
   277 *}
   249 
   278 
   250 lemma pos_mod_conj : "(0::int) < b ==> 0 \<le> a mod b & a mod b < b"
   279 lemma pos_mod_conj : "(0::int) < b ==> 0 \<le> a mod b & a mod b < b"
   251 apply (cut_tac a = a and b = b in divAlg_correct)
   280 apply (cut_tac a = a and b = b in divAlg_correct)
   252 apply (auto simp add: quorem_def mod_def)
   281 apply (auto simp add: quorem_def mod_def)
   253 done
   282 done