src/HOL/Rings.thy
changeset 35828 46cfc4b8112e
parent 35631 0b8a5fd339ab
child 36301 72f4d079ebf8
equal deleted inserted replaced
35827:f552152d7747 35828:46cfc4b8112e
   125   moreover from assms obtain w where "c = b * w" by (auto elim!: dvdE)
   125   moreover from assms obtain w where "c = b * w" by (auto elim!: dvdE)
   126   ultimately have "c = a * (v * w)" by (simp add: mult_assoc)
   126   ultimately have "c = a * (v * w)" by (simp add: mult_assoc)
   127   then show ?thesis ..
   127   then show ?thesis ..
   128 qed
   128 qed
   129 
   129 
   130 lemma dvd_0_left_iff [noatp, simp]: "0 dvd a \<longleftrightarrow> a = 0"
   130 lemma dvd_0_left_iff [no_atp, simp]: "0 dvd a \<longleftrightarrow> a = 0"
   131 by (auto intro: dvd_refl elim!: dvdE)
   131 by (auto intro: dvd_refl elim!: dvdE)
   132 
   132 
   133 lemma dvd_0_right [iff]: "a dvd 0"
   133 lemma dvd_0_right [iff]: "a dvd 0"
   134 proof
   134 proof
   135   show "0 = a * 0" by simp
   135   show "0 = a * 0" by simp
   219 
   219 
   220 lemma minus_mult_right: "- (a * b) = a * - b"
   220 lemma minus_mult_right: "- (a * b) = a * - b"
   221 by (rule minus_unique) (simp add: right_distrib [symmetric]) 
   221 by (rule minus_unique) (simp add: right_distrib [symmetric]) 
   222 
   222 
   223 text{*Extract signs from products*}
   223 text{*Extract signs from products*}
   224 lemmas mult_minus_left [simp, noatp] = minus_mult_left [symmetric]
   224 lemmas mult_minus_left [simp, no_atp] = minus_mult_left [symmetric]
   225 lemmas mult_minus_right [simp,noatp] = minus_mult_right [symmetric]
   225 lemmas mult_minus_right [simp,no_atp] = minus_mult_right [symmetric]
   226 
   226 
   227 lemma minus_mult_minus [simp]: "- a * - b = a * b"
   227 lemma minus_mult_minus [simp]: "- a * - b = a * b"
   228 by simp
   228 by simp
   229 
   229 
   230 lemma minus_mult_commute: "- a * b = a * - b"
   230 lemma minus_mult_commute: "- a * b = a * - b"
   234 by (simp add: right_distrib diff_minus)
   234 by (simp add: right_distrib diff_minus)
   235 
   235 
   236 lemma left_diff_distrib[algebra_simps]: "(a - b) * c = a * c - b * c"
   236 lemma left_diff_distrib[algebra_simps]: "(a - b) * c = a * c - b * c"
   237 by (simp add: left_distrib diff_minus)
   237 by (simp add: left_distrib diff_minus)
   238 
   238 
   239 lemmas ring_distribs[noatp] =
   239 lemmas ring_distribs[no_atp] =
   240   right_distrib left_distrib left_diff_distrib right_diff_distrib
   240   right_distrib left_distrib left_diff_distrib right_diff_distrib
   241 
   241 
   242 text{*Legacy - use @{text algebra_simps} *}
   242 text{*Legacy - use @{text algebra_simps} *}
   243 lemmas ring_simps[noatp] = algebra_simps
   243 lemmas ring_simps[no_atp] = algebra_simps
   244 
   244 
   245 lemma eq_add_iff1:
   245 lemma eq_add_iff1:
   246   "a * e + c = b * e + d \<longleftrightarrow> (a - b) * e + c = d"
   246   "a * e + c = b * e + d \<longleftrightarrow> (a - b) * e + c = d"
   247 by (simp add: algebra_simps)
   247 by (simp add: algebra_simps)
   248 
   248 
   250   "a * e + c = b * e + d \<longleftrightarrow> c = (b - a) * e + d"
   250   "a * e + c = b * e + d \<longleftrightarrow> c = (b - a) * e + d"
   251 by (simp add: algebra_simps)
   251 by (simp add: algebra_simps)
   252 
   252 
   253 end
   253 end
   254 
   254 
   255 lemmas ring_distribs[noatp] =
   255 lemmas ring_distribs[no_atp] =
   256   right_distrib left_distrib left_diff_distrib right_diff_distrib
   256   right_distrib left_distrib left_diff_distrib right_diff_distrib
   257 
   257 
   258 class comm_ring = comm_semiring + ab_group_add
   258 class comm_ring = comm_semiring + ab_group_add
   259 begin
   259 begin
   260 
   260 
   317 next
   317 next
   318   case True then show ?thesis by auto
   318   case True then show ?thesis by auto
   319 qed
   319 qed
   320 
   320 
   321 text{*Cancellation of equalities with a common factor*}
   321 text{*Cancellation of equalities with a common factor*}
   322 lemma mult_cancel_right [simp, noatp]:
   322 lemma mult_cancel_right [simp, no_atp]:
   323   "a * c = b * c \<longleftrightarrow> c = 0 \<or> a = b"
   323   "a * c = b * c \<longleftrightarrow> c = 0 \<or> a = b"
   324 proof -
   324 proof -
   325   have "(a * c = b * c) = ((a - b) * c = 0)"
   325   have "(a * c = b * c) = ((a - b) * c = 0)"
   326     by (simp add: algebra_simps)
   326     by (simp add: algebra_simps)
   327   thus ?thesis by (simp add: disj_commute)
   327   thus ?thesis by (simp add: disj_commute)
   328 qed
   328 qed
   329 
   329 
   330 lemma mult_cancel_left [simp, noatp]:
   330 lemma mult_cancel_left [simp, no_atp]:
   331   "c * a = c * b \<longleftrightarrow> c = 0 \<or> a = b"
   331   "c * a = c * b \<longleftrightarrow> c = 0 \<or> a = b"
   332 proof -
   332 proof -
   333   have "(c * a = c * b) = (c * (a - b) = 0)"
   333   have "(c * a = c * b) = (c * (a - b) = 0)"
   334     by (simp add: algebra_simps)
   334     by (simp add: algebra_simps)
   335   thus ?thesis by simp
   335   thus ?thesis by simp
   741 begin
   741 begin
   742 
   742 
   743 subclass ordered_ab_group_add ..
   743 subclass ordered_ab_group_add ..
   744 
   744 
   745 text{*Legacy - use @{text algebra_simps} *}
   745 text{*Legacy - use @{text algebra_simps} *}
   746 lemmas ring_simps[noatp] = algebra_simps
   746 lemmas ring_simps[no_atp] = algebra_simps
   747 
   747 
   748 lemma less_add_iff1:
   748 lemma less_add_iff1:
   749   "a * e + c < b * e + d \<longleftrightarrow> (a - b) * e + c < d"
   749   "a * e + c < b * e + d \<longleftrightarrow> (a - b) * e + c < d"
   750 by (simp add: algebra_simps)
   750 by (simp add: algebra_simps)
   751 
   751 
   948 by (auto simp: mult_less_cancel_left)
   948 by (auto simp: mult_less_cancel_left)
   949 
   949 
   950 end
   950 end
   951 
   951 
   952 text{*Legacy - use @{text algebra_simps} *}
   952 text{*Legacy - use @{text algebra_simps} *}
   953 lemmas ring_simps[noatp] = algebra_simps
   953 lemmas ring_simps[no_atp] = algebra_simps
   954 
   954 
   955 lemmas mult_sign_intros =
   955 lemmas mult_sign_intros =
   956   mult_nonneg_nonneg mult_nonneg_nonpos
   956   mult_nonneg_nonneg mult_nonneg_nonpos
   957   mult_nonpos_nonneg mult_nonpos_nonpos
   957   mult_nonpos_nonneg mult_nonpos_nonpos
   958   mult_pos_pos mult_pos_neg
   958   mult_pos_pos mult_pos_neg
  1097 
  1097 
  1098 end
  1098 end
  1099 
  1099 
  1100 text {* Simprules for comparisons where common factors can be cancelled. *}
  1100 text {* Simprules for comparisons where common factors can be cancelled. *}
  1101 
  1101 
  1102 lemmas mult_compare_simps[noatp] =
  1102 lemmas mult_compare_simps[no_atp] =
  1103     mult_le_cancel_right mult_le_cancel_left
  1103     mult_le_cancel_right mult_le_cancel_left
  1104     mult_le_cancel_right1 mult_le_cancel_right2
  1104     mult_le_cancel_right1 mult_le_cancel_right2
  1105     mult_le_cancel_left1 mult_le_cancel_left2
  1105     mult_le_cancel_left1 mult_le_cancel_left2
  1106     mult_less_cancel_right mult_less_cancel_left
  1106     mult_less_cancel_right mult_less_cancel_left
  1107     mult_less_cancel_right1 mult_less_cancel_right2
  1107     mult_less_cancel_right1 mult_less_cancel_right2
  1178   hence cpos: "0<c" by (blast intro: order_le_less_trans abs_ge_zero)
  1178   hence cpos: "0<c" by (blast intro: order_le_less_trans abs_ge_zero)
  1179   assume "abs b < d"
  1179   assume "abs b < d"
  1180   thus ?thesis by (simp add: ac cpos mult_strict_mono) 
  1180   thus ?thesis by (simp add: ac cpos mult_strict_mono) 
  1181 qed
  1181 qed
  1182 
  1182 
  1183 lemmas eq_minus_self_iff[noatp] = equal_neg_zero
  1183 lemmas eq_minus_self_iff[no_atp] = equal_neg_zero
  1184 
  1184 
  1185 lemma less_minus_self_iff: "(a < -a) = (a < (0::'a::linordered_idom))"
  1185 lemma less_minus_self_iff: "(a < -a) = (a < (0::'a::linordered_idom))"
  1186   unfolding order_less_le less_eq_neg_nonpos equal_neg_zero ..
  1186   unfolding order_less_le less_eq_neg_nonpos equal_neg_zero ..
  1187 
  1187 
  1188 lemma abs_less_iff: "(abs a < b) = (a < b & -a < (b::'a::linordered_idom))" 
  1188 lemma abs_less_iff: "(abs a < b) = (a < b & -a < (b::'a::linordered_idom))"