src/HOL/Fields.thy
changeset 67091 1393c2340eec
parent 65057 799bbbb3a395
child 67969 83c8cafdebe8
equal deleted inserted replaced
67090:0ec94bb9cec4 67091:1393c2340eec
   398 text\<open>This version builds in division by zero while also re-orienting
   398 text\<open>This version builds in division by zero while also re-orienting
   399       the right-hand side.\<close>
   399       the right-hand side.\<close>
   400 lemma inverse_mult_distrib [simp]:
   400 lemma inverse_mult_distrib [simp]:
   401   "inverse (a * b) = inverse a * inverse b"
   401   "inverse (a * b) = inverse a * inverse b"
   402 proof cases
   402 proof cases
   403   assume "a \<noteq> 0 & b \<noteq> 0"
   403   assume "a \<noteq> 0 \<and> b \<noteq> 0"
   404   thus ?thesis by (simp add: nonzero_inverse_mult_distrib ac_simps)
   404   thus ?thesis by (simp add: nonzero_inverse_mult_distrib ac_simps)
   405 next
   405 next
   406   assume "~ (a \<noteq> 0 & b \<noteq> 0)"
   406   assume "\<not> (a \<noteq> 0 \<and> b \<noteq> 0)"
   407   thus ?thesis by force
   407   thus ?thesis by force
   408 qed
   408 qed
   409 
   409 
   410 lemma inverse_divide [simp]:
   410 lemma inverse_divide [simp]:
   411   "inverse (a / b) = b / a"
   411   "inverse (a / b) = b / a"
   594 
   594 
   595 lemma inverse_le_imp_le:
   595 lemma inverse_le_imp_le:
   596   assumes invle: "inverse a \<le> inverse b" and apos: "0 < a"
   596   assumes invle: "inverse a \<le> inverse b" and apos: "0 < a"
   597   shows "b \<le> a"
   597   shows "b \<le> a"
   598 proof (rule classical)
   598 proof (rule classical)
   599   assume "~ b \<le> a"
   599   assume "\<not> b \<le> a"
   600   hence "a < b"  by (simp add: linorder_not_le)
   600   hence "a < b"  by (simp add: linorder_not_le)
   601   hence bpos: "0 < b"  by (blast intro: apos less_trans)
   601   hence bpos: "0 < b"  by (blast intro: apos less_trans)
   602   hence "a * inverse a \<le> a * inverse b"
   602   hence "a * inverse a \<le> a * inverse b"
   603     by (simp add: apos invle less_imp_le mult_left_mono)
   603     by (simp add: apos invle less_imp_le mult_left_mono)
   604   hence "(a * inverse a) * b \<le> (a * inverse b) * b"
   604   hence "(a * inverse a) * b \<le> (a * inverse b) * b"
   647 
   647 
   648 lemma less_imp_inverse_less:
   648 lemma less_imp_inverse_less:
   649   assumes less: "a < b" and apos:  "0 < a"
   649   assumes less: "a < b" and apos:  "0 < a"
   650   shows "inverse b < inverse a"
   650   shows "inverse b < inverse a"
   651 proof (rule ccontr)
   651 proof (rule ccontr)
   652   assume "~ inverse b < inverse a"
   652   assume "\<not> inverse b < inverse a"
   653   hence "inverse a \<le> inverse b" by simp
   653   hence "inverse a \<le> inverse b" by simp
   654   hence "~ (a < b)"
   654   hence "\<not> (a < b)"
   655     by (simp add: not_less inverse_le_imp_le [OF _ apos])
   655     by (simp add: not_less inverse_le_imp_le [OF _ apos])
   656   thus False by (rule notE [OF _ less])
   656   thus False by (rule notE [OF _ less])
   657 qed
   657 qed
   658 
   658 
   659 lemma inverse_less_imp_less:
   659 lemma inverse_less_imp_less:
  1140   by (auto simp add: divide_inverse mult_less_cancel_right)
  1140   by (auto simp add: divide_inverse mult_less_cancel_right)
  1141 
  1141 
  1142 text\<open>Simplify quotients that are compared with the value 1.\<close>
  1142 text\<open>Simplify quotients that are compared with the value 1.\<close>
  1143 
  1143 
  1144 lemma le_divide_eq_1:
  1144 lemma le_divide_eq_1:
  1145   "(1 \<le> b / a) = ((0 < a & a \<le> b) | (a < 0 & b \<le> a))"
  1145   "(1 \<le> b / a) = ((0 < a \<and> a \<le> b) \<or> (a < 0 \<and> b \<le> a))"
  1146 by (auto simp add: le_divide_eq)
  1146 by (auto simp add: le_divide_eq)
  1147 
  1147 
  1148 lemma divide_le_eq_1:
  1148 lemma divide_le_eq_1:
  1149   "(b / a \<le> 1) = ((0 < a & b \<le> a) | (a < 0 & a \<le> b) | a=0)"
  1149   "(b / a \<le> 1) = ((0 < a \<and> b \<le> a) \<or> (a < 0 \<and> a \<le> b) \<or> a=0)"
  1150 by (auto simp add: divide_le_eq)
  1150 by (auto simp add: divide_le_eq)
  1151 
  1151 
  1152 lemma less_divide_eq_1:
  1152 lemma less_divide_eq_1:
  1153   "(1 < b / a) = ((0 < a & a < b) | (a < 0 & b < a))"
  1153   "(1 < b / a) = ((0 < a \<and> a < b) \<or> (a < 0 \<and> b < a))"
  1154 by (auto simp add: less_divide_eq)
  1154 by (auto simp add: less_divide_eq)
  1155 
  1155 
  1156 lemma divide_less_eq_1:
  1156 lemma divide_less_eq_1:
  1157   "(b / a < 1) = ((0 < a & b < a) | (a < 0 & a < b) | a=0)"
  1157   "(b / a < 1) = ((0 < a \<and> b < a) \<or> (a < 0 \<and> a < b) \<or> a=0)"
  1158 by (auto simp add: divide_less_eq)
  1158 by (auto simp add: divide_less_eq)
  1159 
  1159 
  1160 lemma divide_nonneg_nonneg [simp]:
  1160 lemma divide_nonneg_nonneg [simp]:
  1161   "0 \<le> x \<Longrightarrow> 0 \<le> y \<Longrightarrow> 0 \<le> x / y"
  1161   "0 \<le> x \<Longrightarrow> 0 \<le> y \<Longrightarrow> 0 \<le> x / y"
  1162   by (auto simp add: divide_simps)
  1162   by (auto simp add: divide_simps)
  1206 lemma divide_less_eq_1_neg [simp]:
  1206 lemma divide_less_eq_1_neg [simp]:
  1207   "a < 0 \<Longrightarrow> b/a < 1 \<longleftrightarrow> a < b"
  1207   "a < 0 \<Longrightarrow> b/a < 1 \<longleftrightarrow> a < b"
  1208 by (auto simp add: divide_less_eq)
  1208 by (auto simp add: divide_less_eq)
  1209 
  1209 
  1210 lemma eq_divide_eq_1 [simp]:
  1210 lemma eq_divide_eq_1 [simp]:
  1211   "(1 = b/a) = ((a \<noteq> 0 & a = b))"
  1211   "(1 = b/a) = ((a \<noteq> 0 \<and> a = b))"
  1212 by (auto simp add: eq_divide_eq)
  1212 by (auto simp add: eq_divide_eq)
  1213 
  1213 
  1214 lemma divide_eq_eq_1 [simp]:
  1214 lemma divide_eq_eq_1 [simp]:
  1215   "(b/a = 1) = ((a \<noteq> 0 & a = b))"
  1215   "(b/a = 1) = ((a \<noteq> 0 \<and> a = b))"
  1216 by (auto simp add: divide_eq_eq)
  1216 by (auto simp add: divide_eq_eq)
  1217 
  1217 
  1218 lemma abs_div_pos: "0 < y ==>
  1218 lemma abs_div_pos: "0 < y ==>
  1219     \<bar>x\<bar> / y = \<bar>x / y\<bar>"
  1219     \<bar>x\<bar> / y = \<bar>x / y\<bar>"
  1220   apply (subst abs_divide)
  1220   apply (subst abs_divide)
  1221   apply (simp add: order_less_imp_le)
  1221   apply (simp add: order_less_imp_le)
  1222 done
  1222 done
  1223 
  1223 
  1224 lemma zero_le_divide_abs_iff [simp]: "(0 \<le> a / \<bar>b\<bar>) = (0 \<le> a | b = 0)"
  1224 lemma zero_le_divide_abs_iff [simp]: "(0 \<le> a / \<bar>b\<bar>) = (0 \<le> a \<or> b = 0)"
  1225 by (auto simp: zero_le_divide_iff)
  1225 by (auto simp: zero_le_divide_iff)
  1226 
  1226 
  1227 lemma divide_le_0_abs_iff [simp]: "(a / \<bar>b\<bar> \<le> 0) = (a \<le> 0 | b = 0)"
  1227 lemma divide_le_0_abs_iff [simp]: "(a / \<bar>b\<bar> \<le> 0) = (a \<le> 0 \<or> b = 0)"
  1228 by (auto simp: divide_le_0_iff)
  1228 by (auto simp: divide_le_0_iff)
  1229 
  1229 
  1230 lemma field_le_mult_one_interval:
  1230 lemma field_le_mult_one_interval:
  1231   assumes *: "\<And>z. \<lbrakk> 0 < z ; z < 1 \<rbrakk> \<Longrightarrow> z * x \<le> y"
  1231   assumes *: "\<And>z. \<lbrakk> 0 < z ; z < 1 \<rbrakk> \<Longrightarrow> z * x \<le> y"
  1232   shows "x \<le> y"
  1232   shows "x \<le> y"