438 case True then show ?thesis by auto |
438 case True then show ?thesis by auto |
439 qed |
439 qed |
440 |
440 |
441 end |
441 end |
442 |
442 |
443 class ring_no_zero_divisors = ring + semiring_no_zero_divisors |
443 class semiring_no_zero_divisors_cancel = semiring_no_zero_divisors + |
444 begin |
444 assumes mult_cancel_right [simp]: "a * c = b * c \<longleftrightarrow> c = 0 \<or> a = b" |
445 |
445 and mult_cancel_left [simp]: "c * a = c * b \<longleftrightarrow> c = 0 \<or> a = b" |
446 text{*Cancellation of equalities with a common factor*} |
446 begin |
447 lemma mult_cancel_right [simp]: |
|
448 "a * c = b * c \<longleftrightarrow> c = 0 \<or> a = b" |
|
449 proof - |
|
450 have "(a * c = b * c) = ((a - b) * c = 0)" |
|
451 by (simp add: algebra_simps) |
|
452 thus ?thesis by (simp add: disj_commute) |
|
453 qed |
|
454 |
|
455 lemma mult_cancel_left [simp]: |
|
456 "c * a = c * b \<longleftrightarrow> c = 0 \<or> a = b" |
|
457 proof - |
|
458 have "(c * a = c * b) = (c * (a - b) = 0)" |
|
459 by (simp add: algebra_simps) |
|
460 thus ?thesis by simp |
|
461 qed |
|
462 |
447 |
463 lemma mult_left_cancel: |
448 lemma mult_left_cancel: |
464 "c \<noteq> 0 \<Longrightarrow> c * a = c * b \<longleftrightarrow> a = b" |
449 "c \<noteq> 0 \<Longrightarrow> c * a = c * b \<longleftrightarrow> a = b" |
465 by simp |
450 by simp |
466 |
451 |
467 lemma mult_right_cancel: |
452 lemma mult_right_cancel: |
468 "c \<noteq> 0 \<Longrightarrow> a * c = b * c \<longleftrightarrow> a = b" |
453 "c \<noteq> 0 \<Longrightarrow> a * c = b * c \<longleftrightarrow> a = b" |
469 by simp |
454 by simp |
|
455 |
|
456 end |
|
457 |
|
458 class ring_no_zero_divisors = ring + semiring_no_zero_divisors |
|
459 begin |
|
460 |
|
461 subclass semiring_no_zero_divisors_cancel |
|
462 proof |
|
463 fix a b c |
|
464 have "a * c = b * c \<longleftrightarrow> (a - b) * c = 0" |
|
465 by (simp add: algebra_simps) |
|
466 also have "\<dots> \<longleftrightarrow> c = 0 \<or> a = b" |
|
467 by auto |
|
468 finally show "a * c = b * c \<longleftrightarrow> c = 0 \<or> a = b" . |
|
469 have "c * a = c * b \<longleftrightarrow> c * (a - b) = 0" |
|
470 by (simp add: algebra_simps) |
|
471 also have "\<dots> \<longleftrightarrow> c = 0 \<or> a = b" |
|
472 by auto |
|
473 finally show "c * a = c * b \<longleftrightarrow> c = 0 \<or> a = b" . |
|
474 qed |
470 |
475 |
471 end |
476 end |
472 |
477 |
473 class ring_1_no_zero_divisors = ring_1 + ring_no_zero_divisors |
478 class ring_1_no_zero_divisors = ring_1 + ring_no_zero_divisors |
474 begin |
479 begin |
529 also have "(\<exists>k. b * c = (a * k) * c) \<longleftrightarrow> c = 0 \<or> a dvd b" |
534 also have "(\<exists>k. b * c = (a * k) * c) \<longleftrightarrow> c = 0 \<or> a dvd b" |
530 unfolding dvd_def by simp |
535 unfolding dvd_def by simp |
531 finally show ?thesis . |
536 finally show ?thesis . |
532 qed |
537 qed |
533 |
538 |
534 lemma square_eq_iff: "a * a = b * b \<longleftrightarrow> (a = b \<or> a = - b)" |
539 lemma square_eq_iff: "a * a = b * b \<longleftrightarrow> a = b \<or> a = - b" |
535 proof |
540 proof |
536 assume "a * a = b * b" |
541 assume "a * a = b * b" |
537 then have "(a - b) * (a + b) = 0" |
542 then have "(a - b) * (a + b) = 0" |
538 by (simp add: algebra_simps) |
543 by (simp add: algebra_simps) |
539 then show "a = b \<or> a = - b" |
544 then show "a = b \<or> a = - b" |
591 begin |
596 begin |
592 |
597 |
593 lemma nonzero_mult_divide_cancel_left [simp]: |
598 lemma nonzero_mult_divide_cancel_left [simp]: |
594 "a \<noteq> 0 \<Longrightarrow> (a * b) div a = b" |
599 "a \<noteq> 0 \<Longrightarrow> (a * b) div a = b" |
595 using nonzero_mult_divide_cancel_right [of a b] by (simp add: ac_simps) |
600 using nonzero_mult_divide_cancel_right [of a b] by (simp add: ac_simps) |
|
601 |
|
602 subclass semiring_no_zero_divisors_cancel |
|
603 proof |
|
604 fix a b c |
|
605 { fix a b c |
|
606 show "a * c = b * c \<longleftrightarrow> c = 0 \<or> a = b" |
|
607 proof (cases "c = 0") |
|
608 case True then show ?thesis by simp |
|
609 next |
|
610 case False |
|
611 { assume "a * c = b * c" |
|
612 then have "a * c div c = b * c div c" |
|
613 by simp |
|
614 with False have "a = b" |
|
615 by simp |
|
616 } then show ?thesis by auto |
|
617 qed |
|
618 } |
|
619 from this [of a c b] |
|
620 show "c * a = c * b \<longleftrightarrow> c = 0 \<or> a = b" |
|
621 by (simp add: ac_simps) |
|
622 qed |
|
623 |
|
624 lemma div_self [simp]: |
|
625 assumes "a \<noteq> 0" |
|
626 shows "a div a = 1" |
|
627 using assms nonzero_mult_divide_cancel_left [of a 1] by simp |
596 |
628 |
597 end |
629 end |
598 |
630 |
599 class idom_divide = idom + semidom_divide |
631 class idom_divide = idom + semidom_divide |
600 |
632 |