423 text \<open>Calculations with fractions\<close> |
423 text \<open>Calculations with fractions\<close> |
424 |
424 |
425 text\<open>There is a whole bunch of simp-rules just for class \<open>field\<close> but none for class \<open>field\<close> and \<open>nonzero_divides\<close> |
425 text\<open>There is a whole bunch of simp-rules just for class \<open>field\<close> but none for class \<open>field\<close> and \<open>nonzero_divides\<close> |
426 because the latter are covered by a simproc.\<close> |
426 because the latter are covered by a simproc.\<close> |
427 |
427 |
428 lemma mult_divide_mult_cancel_left: |
428 lemmas mult_divide_mult_cancel_left = nonzero_mult_divide_mult_cancel_left |
429 "c \<noteq> 0 \<Longrightarrow> (c * a) / (c * b) = a / b" |
429 |
430 apply (cases "b = 0") |
430 lemmas mult_divide_mult_cancel_right = nonzero_mult_divide_mult_cancel_right |
431 apply simp_all |
|
432 done |
|
433 |
|
434 lemma mult_divide_mult_cancel_right: |
|
435 "c \<noteq> 0 \<Longrightarrow> (a * c) / (b * c) = a / b" |
|
436 apply (cases "b = 0") |
|
437 apply simp_all |
|
438 done |
|
439 |
431 |
440 lemma divide_divide_eq_right [simp]: |
432 lemma divide_divide_eq_right [simp]: |
441 "a / (b / c) = (a * c) / b" |
433 "a / (b / c) = (a * c) / b" |
442 by (simp add: divide_inverse ac_simps) |
434 by (simp add: divide_inverse ac_simps) |
443 |
435 |
466 "a / - b = - (a / b)" |
458 "a / - b = - (a / b)" |
467 by (simp add: divide_inverse) |
459 by (simp add: divide_inverse) |
468 |
460 |
469 lemma minus_divide_divide: |
461 lemma minus_divide_divide: |
470 "(- a) / (- b) = a / b" |
462 "(- a) / (- b) = a / b" |
471 apply (cases "b=0", simp) |
463 by (cases "b=0") (simp_all add: nonzero_minus_divide_divide) |
472 apply (simp add: nonzero_minus_divide_divide) |
|
473 done |
|
474 |
464 |
475 lemma inverse_eq_1_iff [simp]: |
465 lemma inverse_eq_1_iff [simp]: |
476 "inverse x = 1 \<longleftrightarrow> x = 1" |
466 "inverse x = 1 \<longleftrightarrow> x = 1" |
477 by (insert inverse_eq_iff_eq [of x 1], simp) |
467 by (insert inverse_eq_iff_eq [of x 1], simp) |
478 |
468 |
480 "a / b = 0 \<longleftrightarrow> a = 0 \<or> b = 0" |
470 "a / b = 0 \<longleftrightarrow> a = 0 \<or> b = 0" |
481 by (simp add: divide_inverse) |
471 by (simp add: divide_inverse) |
482 |
472 |
483 lemma divide_cancel_right [simp]: |
473 lemma divide_cancel_right [simp]: |
484 "a / c = b / c \<longleftrightarrow> c = 0 \<or> a = b" |
474 "a / c = b / c \<longleftrightarrow> c = 0 \<or> a = b" |
485 apply (cases "c=0", simp) |
475 by (cases "c=0") (simp_all add: divide_inverse) |
486 apply (simp add: divide_inverse) |
|
487 done |
|
488 |
476 |
489 lemma divide_cancel_left [simp]: |
477 lemma divide_cancel_left [simp]: |
490 "c / a = c / b \<longleftrightarrow> c = 0 \<or> a = b" |
478 "c / a = c / b \<longleftrightarrow> c = 0 \<or> a = b" |
491 apply (cases "c=0", simp) |
479 by (cases "c=0") (simp_all add: divide_inverse) |
492 apply (simp add: divide_inverse) |
|
493 done |
|
494 |
480 |
495 lemma divide_eq_1_iff [simp]: |
481 lemma divide_eq_1_iff [simp]: |
496 "a / b = 1 \<longleftrightarrow> b \<noteq> 0 \<and> a = b" |
482 "a / b = 1 \<longleftrightarrow> b \<noteq> 0 \<and> a = b" |
497 apply (cases "b=0", simp) |
483 by (cases "b=0") (simp_all add: right_inverse_eq) |
498 apply (simp add: right_inverse_eq) |
|
499 done |
|
500 |
484 |
501 lemma one_eq_divide_iff [simp]: |
485 lemma one_eq_divide_iff [simp]: |
502 "1 = a / b \<longleftrightarrow> b \<noteq> 0 \<and> a = b" |
486 "1 = a / b \<longleftrightarrow> b \<noteq> 0 \<and> a = b" |
503 by (simp add: eq_commute [of 1]) |
487 by (simp add: eq_commute [of 1]) |
504 |
488 |
519 by (simp add: add_divide_distrib add.commute) |
503 by (simp add: add_divide_distrib add.commute) |
520 |
504 |
521 lemma dvd_field_iff: |
505 lemma dvd_field_iff: |
522 "a dvd b \<longleftrightarrow> (a = 0 \<longrightarrow> b = 0)" |
506 "a dvd b \<longleftrightarrow> (a = 0 \<longrightarrow> b = 0)" |
523 proof (cases "a = 0") |
507 proof (cases "a = 0") |
524 case True |
|
525 then show ?thesis |
|
526 by simp |
|
527 next |
|
528 case False |
508 case False |
529 then have "b = a * (b / a)" |
509 then have "b = a * (b / a)" |
530 by (simp add: field_simps) |
510 by (simp add: field_simps) |
531 then have "a dvd b" .. |
511 then have "a dvd b" .. |
532 with False show ?thesis |
512 with False show ?thesis |
533 by simp |
513 by simp |
534 qed |
514 qed simp |
535 |
515 |
536 end |
516 end |
537 |
517 |
538 class field_char_0 = field + ring_char_0 |
518 class field_char_0 = field + ring_char_0 |
539 |
519 |