src/HOL/Rings.thy
changeset 60353 838025c6e278
parent 60352 d46de31a50c4
child 60429 d3d1e185cd63
equal deleted inserted replaced
60352:d46de31a50c4 60353:838025c6e278
   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