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. |