src/HOL/Rings.thy
changeset 70817 dd675800469d
parent 70347 e5cd5471c18a
child 70902 cb161182ce7f
equal deleted inserted replaced
70816:5bc338cee4a0 70817:dd675800469d
    14 begin
    14 begin
    15 
    15 
    16 subsection \<open>Semirings and rings\<close>
    16 subsection \<open>Semirings and rings\<close>
    17 
    17 
    18 class semiring = ab_semigroup_add + semigroup_mult +
    18 class semiring = ab_semigroup_add + semigroup_mult +
    19   assumes distrib_right [algebra_simps]: "(a + b) * c = a * c + b * c"
    19   assumes distrib_right [algebra_simps, algebra_split_simps]: "(a + b) * c = a * c + b * c"
    20   assumes distrib_left [algebra_simps]: "a * (b + c) = a * b + a * c"
    20   assumes distrib_left [algebra_simps, algebra_split_simps]: "a * (b + c) = a * b + a * c"
    21 begin
    21 begin
    22 
    22 
    23 text \<open>For the \<open>combine_numerals\<close> simproc\<close>
    23 text \<open>For the \<open>combine_numerals\<close> simproc\<close>
    24 lemma combine_common_factor: "a * e + (b * e + c) = (a + b) * e + c"
    24 lemma combine_common_factor: "a * e + (b * e + c) = (a + b) * e + c"
    25   by (simp add: distrib_right ac_simps)
    25   by (simp add: distrib_right ac_simps)
   248 
   248 
   249 end
   249 end
   250 
   250 
   251 class comm_semiring_1_cancel =
   251 class comm_semiring_1_cancel =
   252   comm_semiring + cancel_comm_monoid_add + zero_neq_one + comm_monoid_mult +
   252   comm_semiring + cancel_comm_monoid_add + zero_neq_one + comm_monoid_mult +
   253   assumes right_diff_distrib' [algebra_simps]: "a * (b - c) = a * b - a * c"
   253   assumes right_diff_distrib' [algebra_simps, algebra_split_simps]:
       
   254     "a * (b - c) = a * b - a * c"
   254 begin
   255 begin
   255 
   256 
   256 subclass semiring_1_cancel ..
   257 subclass semiring_1_cancel ..
   257 subclass comm_semiring_0_cancel ..
   258 subclass comm_semiring_0_cancel ..
   258 subclass comm_semiring_1 ..
   259 subclass comm_semiring_1 ..
   259 
   260 
   260 lemma left_diff_distrib' [algebra_simps]: "(b - c) * a = b * a - c * a"
   261 lemma left_diff_distrib' [algebra_simps, algebra_split_simps]:
       
   262   "(b - c) * a = b * a - c * a"
   261   by (simp add: algebra_simps)
   263   by (simp add: algebra_simps)
   262 
   264 
   263 lemma dvd_add_times_triv_left_iff [simp]: "a dvd c * a + b \<longleftrightarrow> a dvd b"
   265 lemma dvd_add_times_triv_left_iff [simp]: "a dvd c * a + b \<longleftrightarrow> a dvd b"
   264 proof -
   266 proof -
   265   have "a dvd a * c + b \<longleftrightarrow> a dvd b" (is "?P \<longleftrightarrow> ?Q")
   267   have "a dvd a * c + b \<longleftrightarrow> a dvd b" (is "?P \<longleftrightarrow> ?Q")
   329   by simp
   331   by simp
   330 
   332 
   331 lemma minus_mult_commute: "- a * b = a * - b"
   333 lemma minus_mult_commute: "- a * b = a * - b"
   332   by simp
   334   by simp
   333 
   335 
   334 lemma right_diff_distrib [algebra_simps]: "a * (b - c) = a * b - a * c"
   336 lemma right_diff_distrib [algebra_simps, algebra_split_simps]:
       
   337   "a * (b - c) = a * b - a * c"
   335   using distrib_left [of a b "-c "] by simp
   338   using distrib_left [of a b "-c "] by simp
   336 
   339 
   337 lemma left_diff_distrib [algebra_simps]: "(a - b) * c = a * c - b * c"
   340 lemma left_diff_distrib [algebra_simps, algebra_split_simps]:
       
   341   "(a - b) * c = a * c - b * c"
   338   using distrib_right [of a "- b" c] by simp
   342   using distrib_right [of a "- b" c] by simp
   339 
   343 
   340 lemmas ring_distribs = distrib_left distrib_right left_diff_distrib right_diff_distrib
   344 lemmas ring_distribs = distrib_left distrib_right left_diff_distrib right_diff_distrib
   341 
   345 
   342 lemma eq_add_iff1: "a * e + c = b * e + d \<longleftrightarrow> (a - b) * e + c = d"
   346 lemma eq_add_iff1: "a * e + c = b * e + d \<longleftrightarrow> (a - b) * e + c = d"
   644 setup \<open>Sign.add_const_constraint (\<^const_name>\<open>divide\<close>, SOME \<^typ>\<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close>)\<close>
   648 setup \<open>Sign.add_const_constraint (\<^const_name>\<open>divide\<close>, SOME \<^typ>\<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close>)\<close>
   645 
   649 
   646 context semiring
   650 context semiring
   647 begin
   651 begin
   648 
   652 
   649 lemma [field_simps]:
   653 lemma [field_simps, field_split_simps]:
   650   shows distrib_left_NO_MATCH: "NO_MATCH (x div y) a \<Longrightarrow> a * (b + c) = a * b + a * c"
   654   shows distrib_left_NO_MATCH: "NO_MATCH (x div y) a \<Longrightarrow> a * (b + c) = a * b + a * c"
   651     and distrib_right_NO_MATCH: "NO_MATCH (x div y) c \<Longrightarrow> (a + b) * c = a * c + b * c"
   655     and distrib_right_NO_MATCH: "NO_MATCH (x div y) c \<Longrightarrow> (a + b) * c = a * c + b * c"
   652   by (rule distrib_left distrib_right)+
   656   by (rule distrib_left distrib_right)+
   653 
   657 
   654 end
   658 end
   655 
   659 
   656 context ring
   660 context ring
   657 begin
   661 begin
   658 
   662 
   659 lemma [field_simps]:
   663 lemma [field_simps, field_split_simps]:
   660   shows left_diff_distrib_NO_MATCH: "NO_MATCH (x div y) c \<Longrightarrow> (a - b) * c = a * c - b * c"
   664   shows left_diff_distrib_NO_MATCH: "NO_MATCH (x div y) c \<Longrightarrow> (a - b) * c = a * c - b * c"
   661     and right_diff_distrib_NO_MATCH: "NO_MATCH (x div y) a \<Longrightarrow> a * (b - c) = a * b - a * c"
   665     and right_diff_distrib_NO_MATCH: "NO_MATCH (x div y) a \<Longrightarrow> a * (b - c) = a * b - a * c"
   662   by (rule left_diff_distrib right_diff_distrib)+
   666   by (rule left_diff_distrib right_diff_distrib)+
   663 
   667 
   664 end
   668 end
  2174   qed
  2178   qed
  2175   then show "a * b \<noteq> 0"
  2179   then show "a * b \<noteq> 0"
  2176     by (simp add: neq_iff)
  2180     by (simp add: neq_iff)
  2177 qed
  2181 qed
  2178 
  2182 
  2179 lemma zero_less_mult_iff [sign_simps]: "0 < a * b \<longleftrightarrow> 0 < a \<and> 0 < b \<or> a < 0 \<and> b < 0"
  2183 lemma zero_less_mult_iff [algebra_split_simps, field_split_simps]:
       
  2184   "0 < a * b \<longleftrightarrow> 0 < a \<and> 0 < b \<or> a < 0 \<and> b < 0"
  2180   by (cases a 0 b 0 rule: linorder_cases[case_product linorder_cases])
  2185   by (cases a 0 b 0 rule: linorder_cases[case_product linorder_cases])
  2181      (auto simp add: mult_neg_neg not_less le_less dest: zero_less_mult_pos zero_less_mult_pos2)
  2186      (auto simp add: mult_neg_neg not_less le_less dest: zero_less_mult_pos zero_less_mult_pos2)
  2182 
  2187 
  2183 lemma zero_le_mult_iff [sign_simps]: "0 \<le> a * b \<longleftrightarrow> 0 \<le> a \<and> 0 \<le> b \<or> a \<le> 0 \<and> b \<le> 0"
  2188 lemma zero_le_mult_iff [algebra_split_simps, field_split_simps]:
       
  2189   "0 \<le> a * b \<longleftrightarrow> 0 \<le> a \<and> 0 \<le> b \<or> a \<le> 0 \<and> b \<le> 0"
  2184   by (auto simp add: eq_commute [of 0] le_less not_less zero_less_mult_iff)
  2190   by (auto simp add: eq_commute [of 0] le_less not_less zero_less_mult_iff)
  2185 
  2191 
  2186 lemma mult_less_0_iff [sign_simps]: "a * b < 0 \<longleftrightarrow> 0 < a \<and> b < 0 \<or> a < 0 \<and> 0 < b"
  2192 lemma mult_less_0_iff [algebra_split_simps, field_split_simps]:
       
  2193   "a * b < 0 \<longleftrightarrow> 0 < a \<and> b < 0 \<or> a < 0 \<and> 0 < b"
  2187   using zero_less_mult_iff [of "- a" b] by auto
  2194   using zero_less_mult_iff [of "- a" b] by auto
  2188 
  2195 
  2189 lemma mult_le_0_iff [sign_simps]: "a * b \<le> 0 \<longleftrightarrow> 0 \<le> a \<and> b \<le> 0 \<or> a \<le> 0 \<and> 0 \<le> b"
  2196 lemma mult_le_0_iff [algebra_split_simps, field_split_simps]:
       
  2197   "a * b \<le> 0 \<longleftrightarrow> 0 \<le> a \<and> b \<le> 0 \<or> a \<le> 0 \<and> 0 \<le> b"
  2190   using zero_le_mult_iff [of "- a" b] by auto
  2198   using zero_le_mult_iff [of "- a" b] by auto
  2191 
  2199 
  2192 text \<open>
  2200 text \<open>
  2193   Cancellation laws for \<^term>\<open>c * a < c * b\<close> and \<^term>\<open>a * c < b * c\<close>,
  2201   Cancellation laws for \<^term>\<open>c * a < c * b\<close> and \<^term>\<open>a * c < b * c\<close>,
  2194   also with the relations \<open>\<le>\<close> and equality.
  2202   also with the relations \<open>\<le>\<close> and equality.