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