413 "x dvd y \<Longrightarrow> x dvd z \<Longrightarrow> x dvd (y - z)" |
413 "x dvd y \<Longrightarrow> x dvd z \<Longrightarrow> x dvd (y - z)" |
414 using dvd_add [of x y "- z"] by simp |
414 using dvd_add [of x y "- z"] by simp |
415 |
415 |
416 end |
416 end |
417 |
417 |
418 class divide = |
|
419 fixes divide :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" |
|
420 |
|
421 setup {* Sign.add_const_constraint (@{const_name "divide"}, SOME @{typ "'a \<Rightarrow> 'a \<Rightarrow> 'a"}) *} |
|
422 |
|
423 context semiring |
|
424 begin |
|
425 |
|
426 lemma [field_simps]: |
|
427 shows distrib_left_NO_MATCH: "NO_MATCH (divide x y) a \<Longrightarrow> a * (b + c) = a * b + a * c" |
|
428 and distrib_right_NO_MATCH: "NO_MATCH (divide x y) c \<Longrightarrow> (a + b) * c = a * c + b * c" |
|
429 by (rule distrib_left distrib_right)+ |
|
430 |
|
431 end |
|
432 |
|
433 context ring |
|
434 begin |
|
435 |
|
436 lemma [field_simps]: |
|
437 shows left_diff_distrib_NO_MATCH: "NO_MATCH (divide x y) c \<Longrightarrow> (a - b) * c = a * c - b * c" |
|
438 and right_diff_distrib_NO_MATCH: "NO_MATCH (divide x y) a \<Longrightarrow> a * (b - c) = a * b - a * c" |
|
439 by (rule left_diff_distrib right_diff_distrib)+ |
|
440 |
|
441 end |
|
442 |
|
443 setup {* Sign.add_const_constraint (@{const_name "divide"}, SOME @{typ "'a::divide \<Rightarrow> 'a \<Rightarrow> 'a"}) *} |
|
444 |
|
445 class semiring_no_zero_divisors = semiring_0 + |
418 class semiring_no_zero_divisors = semiring_0 + |
446 assumes no_zero_divisors: "a \<noteq> 0 \<Longrightarrow> b \<noteq> 0 \<Longrightarrow> a * b \<noteq> 0" |
419 assumes no_zero_divisors: "a \<noteq> 0 \<Longrightarrow> b \<noteq> 0 \<Longrightarrow> a * b \<noteq> 0" |
447 begin |
420 begin |
448 |
421 |
449 lemma divisors_zero: |
422 lemma divisors_zero: |
582 \begin{itemize} |
555 \begin{itemize} |
583 \item @{url "http://www.mathworld.com"} by Eric Weisstein et. al. |
556 \item @{url "http://www.mathworld.com"} by Eric Weisstein et. al. |
584 \item \emph{Algebra I} by van der Waerden, Springer. |
557 \item \emph{Algebra I} by van der Waerden, Springer. |
585 \end{itemize} |
558 \end{itemize} |
586 *} |
559 *} |
|
560 |
|
561 class divide = |
|
562 fixes divide :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" |
|
563 |
|
564 setup {* Sign.add_const_constraint (@{const_name "divide"}, SOME @{typ "'a \<Rightarrow> 'a \<Rightarrow> 'a"}) *} |
|
565 |
|
566 context semiring |
|
567 begin |
|
568 |
|
569 lemma [field_simps]: |
|
570 shows distrib_left_NO_MATCH: "NO_MATCH (divide x y) a \<Longrightarrow> a * (b + c) = a * b + a * c" |
|
571 and distrib_right_NO_MATCH: "NO_MATCH (divide x y) c \<Longrightarrow> (a + b) * c = a * c + b * c" |
|
572 by (rule distrib_left distrib_right)+ |
|
573 |
|
574 end |
|
575 |
|
576 context ring |
|
577 begin |
|
578 |
|
579 lemma [field_simps]: |
|
580 shows left_diff_distrib_NO_MATCH: "NO_MATCH (divide x y) c \<Longrightarrow> (a - b) * c = a * c - b * c" |
|
581 and right_diff_distrib_NO_MATCH: "NO_MATCH (divide x y) a \<Longrightarrow> a * (b - c) = a * b - a * c" |
|
582 by (rule left_diff_distrib right_diff_distrib)+ |
|
583 |
|
584 end |
|
585 |
|
586 setup {* Sign.add_const_constraint (@{const_name "divide"}, SOME @{typ "'a::divide \<Rightarrow> 'a \<Rightarrow> 'a"}) *} |
|
587 |
|
588 class semidom_divide = semidom + divide + |
|
589 assumes nonzero_mult_divide_cancel_right [simp]: "b \<noteq> 0 \<Longrightarrow> divide (a * b) b = a" |
|
590 assumes divide_zero [simp]: "divide a 0 = 0" |
|
591 begin |
|
592 |
|
593 lemma nonzero_mult_divide_cancel_left [simp]: |
|
594 "a \<noteq> 0 \<Longrightarrow> divide (a * b) a = b" |
|
595 using nonzero_mult_divide_cancel_right [of a b] by (simp add: ac_simps) |
|
596 |
|
597 end |
|
598 |
|
599 class idom_divide = idom + semidom_divide |
587 |
600 |
588 class ordered_semiring = semiring + comm_monoid_add + ordered_ab_semigroup_add + |
601 class ordered_semiring = semiring + comm_monoid_add + ordered_ab_semigroup_add + |
589 assumes mult_left_mono: "a \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> c * a \<le> c * b" |
602 assumes mult_left_mono: "a \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> c * a \<le> c * b" |
590 assumes mult_right_mono: "a \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> a * c \<le> b * c" |
603 assumes mult_right_mono: "a \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> a * c \<le> b * c" |
591 begin |
604 begin |