equal
deleted
inserted
replaced
1193 by (blast intro: divmod_nat_rel_add1_eq [THEN div_nat_unique] divmod_nat_rel) |
1193 by (blast intro: divmod_nat_rel_add1_eq [THEN div_nat_unique] divmod_nat_rel) |
1194 |
1194 |
1195 lemma mod_lemma: "[| (0::nat) < c; r < b |] ==> b * (q mod c) + r < b * c" |
1195 lemma mod_lemma: "[| (0::nat) < c; r < b |] ==> b * (q mod c) + r < b * c" |
1196 apply (cut_tac m = q and n = c in mod_less_divisor) |
1196 apply (cut_tac m = q and n = c in mod_less_divisor) |
1197 apply (drule_tac [2] m = "q mod c" in less_imp_Suc_add, auto) |
1197 apply (drule_tac [2] m = "q mod c" in less_imp_Suc_add, auto) |
1198 apply (erule_tac P = "%x. ?lhs < ?rhs x" in ssubst) |
1198 apply (erule_tac P = "%x. lhs < rhs x" for lhs rhs in ssubst) |
1199 apply (simp add: add_mult_distrib2) |
1199 apply (simp add: add_mult_distrib2) |
1200 done |
1200 done |
1201 |
1201 |
1202 lemma divmod_nat_rel_mult2_eq: |
1202 lemma divmod_nat_rel_mult2_eq: |
1203 "divmod_nat_rel a b (q, r) |
1203 "divmod_nat_rel a b (q, r) |
2406 |
2406 |
2407 lemma split_pos_lemma: |
2407 lemma split_pos_lemma: |
2408 "0<k ==> |
2408 "0<k ==> |
2409 P(n div k :: int)(n mod k) = (\<forall>i j. 0\<le>j & j<k & n = k*i + j --> P i j)" |
2409 P(n div k :: int)(n mod k) = (\<forall>i j. 0\<le>j & j<k & n = k*i + j --> P i j)" |
2410 apply (rule iffI, clarify) |
2410 apply (rule iffI, clarify) |
2411 apply (erule_tac P="P ?x ?y" in rev_mp) |
2411 apply (erule_tac P="P x y" for x y in rev_mp) |
2412 apply (subst mod_add_eq) |
2412 apply (subst mod_add_eq) |
2413 apply (subst zdiv_zadd1_eq) |
2413 apply (subst zdiv_zadd1_eq) |
2414 apply (simp add: div_pos_pos_trivial mod_pos_pos_trivial) |
2414 apply (simp add: div_pos_pos_trivial mod_pos_pos_trivial) |
2415 txt{*converse direction*} |
2415 txt{*converse direction*} |
2416 apply (drule_tac x = "n div k" in spec) |
2416 apply (drule_tac x = "n div k" in spec) |
2419 |
2419 |
2420 lemma split_neg_lemma: |
2420 lemma split_neg_lemma: |
2421 "k<0 ==> |
2421 "k<0 ==> |
2422 P(n div k :: int)(n mod k) = (\<forall>i j. k<j & j\<le>0 & n = k*i + j --> P i j)" |
2422 P(n div k :: int)(n mod k) = (\<forall>i j. k<j & j\<le>0 & n = k*i + j --> P i j)" |
2423 apply (rule iffI, clarify) |
2423 apply (rule iffI, clarify) |
2424 apply (erule_tac P="P ?x ?y" in rev_mp) |
2424 apply (erule_tac P="P x y" for x y in rev_mp) |
2425 apply (subst mod_add_eq) |
2425 apply (subst mod_add_eq) |
2426 apply (subst zdiv_zadd1_eq) |
2426 apply (subst zdiv_zadd1_eq) |
2427 apply (simp add: div_neg_neg_trivial mod_neg_neg_trivial) |
2427 apply (simp add: div_neg_neg_trivial mod_neg_neg_trivial) |
2428 txt{*converse direction*} |
2428 txt{*converse direction*} |
2429 apply (drule_tac x = "n div k" in spec) |
2429 apply (drule_tac x = "n div k" in spec) |