| author | webertj | 
| Tue, 01 Aug 2006 14:58:43 +0200 | |
| changeset 20276 | d94dc40673b1 | 
| parent 19404 | 9bf2cdc9e8e8 | 
| child 20496 | 23eb6034c06d | 
| permissions | -rw-r--r-- | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 1 | (* Title: HOL/Ring_and_Field.thy | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 2 | ID: $Id$ | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 3 | Author: Gertrud Bauer, Steven Obua, Lawrence C Paulson, and Markus Wenzel, | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 4 | with contributions by Jeremy Avigad | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 5 | *) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 6 | |
| 14738 | 7 | header {* (Ordered) Rings and Fields *}
 | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 8 | |
| 15229 | 9 | theory Ring_and_Field | 
| 15140 | 10 | imports OrderedGroup | 
| 15131 | 11 | begin | 
| 14504 | 12 | |
| 14738 | 13 | text {*
 | 
| 14 | The theory of partially ordered rings is taken from the books: | |
| 15 |   \begin{itemize}
 | |
| 16 |   \item \emph{Lattice Theory} by Garret Birkhoff, American Mathematical Society 1979 
 | |
| 17 |   \item \emph{Partially Ordered Algebraic Systems}, Pergamon Press 1963
 | |
| 18 |   \end{itemize}
 | |
| 19 | Most of the used notions can also be looked up in | |
| 20 |   \begin{itemize}
 | |
| 14770 | 21 |   \item \url{http://www.mathworld.com} by Eric Weisstein et. al.
 | 
| 14738 | 22 |   \item \emph{Algebra I} by van der Waerden, Springer.
 | 
| 23 |   \end{itemize}
 | |
| 24 | *} | |
| 14504 | 25 | |
| 14738 | 26 | axclass semiring \<subseteq> ab_semigroup_add, semigroup_mult | 
| 27 | left_distrib: "(a + b) * c = a * c + b * c" | |
| 28 | right_distrib: "a * (b + c) = a * b + a * c" | |
| 14504 | 29 | |
| 14738 | 30 | axclass semiring_0 \<subseteq> semiring, comm_monoid_add | 
| 14504 | 31 | |
| 14940 | 32 | axclass semiring_0_cancel \<subseteq> semiring_0, cancel_ab_semigroup_add | 
| 33 | ||
| 14738 | 34 | axclass comm_semiring \<subseteq> ab_semigroup_add, ab_semigroup_mult | 
| 35 | distrib: "(a + b) * c = a * c + b * c" | |
| 14504 | 36 | |
| 14738 | 37 | instance comm_semiring \<subseteq> semiring | 
| 38 | proof | |
| 39 | fix a b c :: 'a | |
| 40 | show "(a + b) * c = a * c + b * c" by (simp add: distrib) | |
| 41 | have "a * (b + c) = (b + c) * a" by (simp add: mult_ac) | |
| 42 | also have "... = b * a + c * a" by (simp only: distrib) | |
| 43 | also have "... = a * b + a * c" by (simp add: mult_ac) | |
| 44 | finally show "a * (b + c) = a * b + a * c" by blast | |
| 14504 | 45 | qed | 
| 46 | ||
| 14738 | 47 | axclass comm_semiring_0 \<subseteq> comm_semiring, comm_monoid_add | 
| 14504 | 48 | |
| 14738 | 49 | instance comm_semiring_0 \<subseteq> semiring_0 .. | 
| 14504 | 50 | |
| 14940 | 51 | axclass comm_semiring_0_cancel \<subseteq> comm_semiring_0, cancel_ab_semigroup_add | 
| 52 | ||
| 53 | instance comm_semiring_0_cancel \<subseteq> semiring_0_cancel .. | |
| 54 | ||
| 14738 | 55 | axclass axclass_0_neq_1 \<subseteq> zero, one | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 56 | zero_neq_one [simp]: "0 \<noteq> 1" | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 57 | |
| 14738 | 58 | axclass semiring_1 \<subseteq> axclass_0_neq_1, semiring_0, monoid_mult | 
| 14504 | 59 | |
| 14738 | 60 | axclass comm_semiring_1 \<subseteq> axclass_0_neq_1, comm_semiring_0, comm_monoid_mult (* previously almost_semiring *) | 
| 61 | ||
| 62 | instance comm_semiring_1 \<subseteq> semiring_1 .. | |
| 14421 
ee97b6463cb4
new Ring_and_Field hierarchy, eliminating redundant axioms
 paulson parents: 
14398diff
changeset | 63 | |
| 14738 | 64 | axclass axclass_no_zero_divisors \<subseteq> zero, times | 
| 65 | no_zero_divisors: "a \<noteq> 0 \<Longrightarrow> b \<noteq> 0 \<Longrightarrow> a * b \<noteq> 0" | |
| 14504 | 66 | |
| 14940 | 67 | axclass semiring_1_cancel \<subseteq> semiring_1, cancel_ab_semigroup_add | 
| 68 | ||
| 69 | instance semiring_1_cancel \<subseteq> semiring_0_cancel .. | |
| 70 | ||
| 14738 | 71 | axclass comm_semiring_1_cancel \<subseteq> comm_semiring_1, cancel_ab_semigroup_add (* previously semiring *) | 
| 72 | ||
| 14940 | 73 | instance comm_semiring_1_cancel \<subseteq> semiring_1_cancel .. | 
| 74 | ||
| 75 | instance comm_semiring_1_cancel \<subseteq> comm_semiring_0_cancel .. | |
| 76 | ||
| 14738 | 77 | axclass ring \<subseteq> semiring, ab_group_add | 
| 78 | ||
| 14940 | 79 | instance ring \<subseteq> semiring_0_cancel .. | 
| 14504 | 80 | |
| 14738 | 81 | axclass comm_ring \<subseteq> comm_semiring_0, ab_group_add | 
| 82 | ||
| 83 | instance comm_ring \<subseteq> ring .. | |
| 14504 | 84 | |
| 14940 | 85 | instance comm_ring \<subseteq> comm_semiring_0_cancel .. | 
| 14738 | 86 | |
| 87 | axclass ring_1 \<subseteq> ring, semiring_1 | |
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 88 | |
| 14940 | 89 | instance ring_1 \<subseteq> semiring_1_cancel .. | 
| 90 | ||
| 14738 | 91 | axclass comm_ring_1 \<subseteq> comm_ring, comm_semiring_1 (* previously ring *) | 
| 92 | ||
| 93 | instance comm_ring_1 \<subseteq> ring_1 .. | |
| 14421 
ee97b6463cb4
new Ring_and_Field hierarchy, eliminating redundant axioms
 paulson parents: 
14398diff
changeset | 94 | |
| 14738 | 95 | instance comm_ring_1 \<subseteq> comm_semiring_1_cancel .. | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 96 | |
| 14738 | 97 | axclass idom \<subseteq> comm_ring_1, axclass_no_zero_divisors | 
| 14421 
ee97b6463cb4
new Ring_and_Field hierarchy, eliminating redundant axioms
 paulson parents: 
14398diff
changeset | 98 | |
| 14738 | 99 | axclass field \<subseteq> comm_ring_1, inverse | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 100 | left_inverse [simp]: "a \<noteq> 0 ==> inverse a * a = 1" | 
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 101 | divide_inverse: "a / b = a * inverse b" | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 102 | |
| 14940 | 103 | lemma mult_zero_left [simp]: "0 * a = (0::'a::semiring_0_cancel)" | 
| 14738 | 104 | proof - | 
| 105 | have "0*a + 0*a = 0*a + 0" | |
| 106 | by (simp add: left_distrib [symmetric]) | |
| 107 | thus ?thesis | |
| 108 | by (simp only: add_left_cancel) | |
| 109 | qed | |
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 110 | |
| 14940 | 111 | lemma mult_zero_right [simp]: "a * 0 = (0::'a::semiring_0_cancel)" | 
| 14738 | 112 | proof - | 
| 113 | have "a*0 + a*0 = a*0 + 0" | |
| 114 | by (simp add: right_distrib [symmetric]) | |
| 115 | thus ?thesis | |
| 116 | by (simp only: add_left_cancel) | |
| 117 | qed | |
| 118 | ||
| 119 | lemma field_mult_eq_0_iff [simp]: "(a*b = (0::'a::field)) = (a = 0 | b = 0)" | |
| 120 | proof cases | |
| 121 | assume "a=0" thus ?thesis by simp | |
| 122 | next | |
| 123 | assume anz [simp]: "a\<noteq>0" | |
| 124 |   { assume "a * b = 0"
 | |
| 125 | hence "inverse a * (a * b) = 0" by simp | |
| 126 | hence "b = 0" by (simp (no_asm_use) add: mult_assoc [symmetric])} | |
| 127 | thus ?thesis by force | |
| 128 | qed | |
| 129 | ||
| 130 | instance field \<subseteq> idom | |
| 131 | by (intro_classes, simp) | |
| 132 | ||
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 133 | axclass division_by_zero \<subseteq> zero, inverse | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 134 | inverse_zero [simp]: "inverse 0 = 0" | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 135 | |
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 136 | subsection {* Distribution rules *}
 | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 137 | |
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 138 | theorems ring_distrib = right_distrib left_distrib | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 139 | |
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 140 | text{*For the @{text combine_numerals} simproc*}
 | 
| 14421 
ee97b6463cb4
new Ring_and_Field hierarchy, eliminating redundant axioms
 paulson parents: 
14398diff
changeset | 141 | lemma combine_common_factor: | 
| 14738 | 142 | "a*e + (b*e + c) = (a+b)*e + (c::'a::semiring)" | 
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 143 | by (simp add: left_distrib add_ac) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 144 | |
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 145 | lemma minus_mult_left: "- (a * b) = (-a) * (b::'a::ring)" | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 146 | apply (rule equals_zero_I) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 147 | apply (simp add: left_distrib [symmetric]) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 148 | done | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 149 | |
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 150 | lemma minus_mult_right: "- (a * b) = a * -(b::'a::ring)" | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 151 | apply (rule equals_zero_I) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 152 | apply (simp add: right_distrib [symmetric]) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 153 | done | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 154 | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 155 | lemma minus_mult_minus [simp]: "(- a) * (- b) = a * (b::'a::ring)" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 156 | by (simp add: minus_mult_left [symmetric] minus_mult_right [symmetric]) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 157 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 158 | lemma minus_mult_commute: "(- a) * b = a * (- b::'a::ring)" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 159 | by (simp add: minus_mult_left [symmetric] minus_mult_right [symmetric]) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 160 | |
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 161 | lemma right_diff_distrib: "a * (b - c) = a * b - a * (c::'a::ring)" | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 162 | by (simp add: right_distrib diff_minus | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 163 | minus_mult_left [symmetric] minus_mult_right [symmetric]) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 164 | |
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 165 | lemma left_diff_distrib: "(a - b) * c = a * c - b * (c::'a::ring)" | 
| 14738 | 166 | by (simp add: left_distrib diff_minus | 
| 167 | minus_mult_left [symmetric] minus_mult_right [symmetric]) | |
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 168 | |
| 14738 | 169 | axclass pordered_semiring \<subseteq> semiring_0, pordered_ab_semigroup_add | 
| 170 | mult_left_mono: "a <= b \<Longrightarrow> 0 <= c \<Longrightarrow> c * a <= c * b" | |
| 171 | mult_right_mono: "a <= b \<Longrightarrow> 0 <= c \<Longrightarrow> a * c <= b * c" | |
| 14267 
b963e9cee2a0
More refinements to Ring_and_Field and numerics. Conversion of Divides_lemmas
 paulson parents: 
14266diff
changeset | 172 | |
| 14738 | 173 | axclass pordered_cancel_semiring \<subseteq> pordered_semiring, cancel_ab_semigroup_add | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 174 | |
| 14940 | 175 | instance pordered_cancel_semiring \<subseteq> semiring_0_cancel .. | 
| 176 | ||
| 14738 | 177 | axclass ordered_semiring_strict \<subseteq> semiring_0, ordered_cancel_ab_semigroup_add | 
| 178 | mult_strict_left_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> c * a < c * b" | |
| 179 | mult_strict_right_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> a * c < b * c" | |
| 14341 
a09441bd4f1e
Ring_and_Field now requires axiom add_left_imp_eq for semirings.
 paulson parents: 
14334diff
changeset | 180 | |
| 14940 | 181 | instance ordered_semiring_strict \<subseteq> semiring_0_cancel .. | 
| 182 | ||
| 14738 | 183 | instance ordered_semiring_strict \<subseteq> pordered_cancel_semiring | 
| 184 | apply intro_classes | |
| 185 | apply (case_tac "a < b & 0 < c") | |
| 186 | apply (auto simp add: mult_strict_left_mono order_less_le) | |
| 187 | apply (auto simp add: mult_strict_left_mono order_le_less) | |
| 188 | apply (simp add: mult_strict_right_mono) | |
| 14270 | 189 | done | 
| 190 | ||
| 14738 | 191 | axclass pordered_comm_semiring \<subseteq> comm_semiring_0, pordered_ab_semigroup_add | 
| 192 | mult_mono: "a <= b \<Longrightarrow> 0 <= c \<Longrightarrow> c * a <= c * b" | |
| 14270 | 193 | |
| 14738 | 194 | axclass pordered_cancel_comm_semiring \<subseteq> pordered_comm_semiring, cancel_ab_semigroup_add | 
| 14270 | 195 | |
| 14738 | 196 | instance pordered_cancel_comm_semiring \<subseteq> pordered_comm_semiring .. | 
| 14270 | 197 | |
| 14738 | 198 | axclass ordered_comm_semiring_strict \<subseteq> comm_semiring_0, ordered_cancel_ab_semigroup_add | 
| 199 | mult_strict_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> c * a < c * b" | |
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 200 | |
| 14738 | 201 | instance pordered_comm_semiring \<subseteq> pordered_semiring | 
| 202 | by (intro_classes, insert mult_mono, simp_all add: mult_commute, blast+) | |
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 203 | |
| 14738 | 204 | instance pordered_cancel_comm_semiring \<subseteq> pordered_cancel_semiring .. | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 205 | |
| 14738 | 206 | instance ordered_comm_semiring_strict \<subseteq> ordered_semiring_strict | 
| 207 | by (intro_classes, insert mult_strict_mono, simp_all add: mult_commute, blast+) | |
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 208 | |
| 14738 | 209 | instance ordered_comm_semiring_strict \<subseteq> pordered_cancel_comm_semiring | 
| 210 | apply (intro_classes) | |
| 211 | apply (case_tac "a < b & 0 < c") | |
| 212 | apply (auto simp add: mult_strict_left_mono order_less_le) | |
| 213 | apply (auto simp add: mult_strict_left_mono order_le_less) | |
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 214 | done | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 215 | |
| 14738 | 216 | axclass pordered_ring \<subseteq> ring, pordered_semiring | 
| 14270 | 217 | |
| 14738 | 218 | instance pordered_ring \<subseteq> pordered_ab_group_add .. | 
| 14270 | 219 | |
| 14738 | 220 | instance pordered_ring \<subseteq> pordered_cancel_semiring .. | 
| 14270 | 221 | |
| 14738 | 222 | axclass lordered_ring \<subseteq> pordered_ring, lordered_ab_group_abs | 
| 14270 | 223 | |
| 14940 | 224 | instance lordered_ring \<subseteq> lordered_ab_group_meet .. | 
| 225 | ||
| 226 | instance lordered_ring \<subseteq> lordered_ab_group_join .. | |
| 227 | ||
| 14738 | 228 | axclass axclass_abs_if \<subseteq> minus, ord, zero | 
| 229 | abs_if: "abs a = (if (a < 0) then (-a) else a)" | |
| 14270 | 230 | |
| 14738 | 231 | axclass ordered_ring_strict \<subseteq> ring, ordered_semiring_strict, axclass_abs_if | 
| 14270 | 232 | |
| 14738 | 233 | instance ordered_ring_strict \<subseteq> lordered_ab_group .. | 
| 14270 | 234 | |
| 14738 | 235 | instance ordered_ring_strict \<subseteq> lordered_ring | 
| 236 | by (intro_classes, simp add: abs_if join_eq_if) | |
| 14270 | 237 | |
| 14738 | 238 | axclass pordered_comm_ring \<subseteq> comm_ring, pordered_comm_semiring | 
| 14270 | 239 | |
| 14738 | 240 | axclass ordered_semidom \<subseteq> comm_semiring_1_cancel, ordered_comm_semiring_strict (* previously ordered_semiring *) | 
| 241 | zero_less_one [simp]: "0 < 1" | |
| 14270 | 242 | |
| 14738 | 243 | axclass ordered_idom \<subseteq> comm_ring_1, ordered_comm_semiring_strict, axclass_abs_if (* previously ordered_ring *) | 
| 14270 | 244 | |
| 14738 | 245 | instance ordered_idom \<subseteq> ordered_ring_strict .. | 
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 246 | |
| 14738 | 247 | axclass ordered_field \<subseteq> field, ordered_idom | 
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 248 | |
| 15923 | 249 | lemmas linorder_neqE_ordered_idom = | 
| 250 | linorder_neqE[where 'a = "?'b::ordered_idom"] | |
| 251 | ||
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 252 | lemma eq_add_iff1: | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 253 | "(a*e + c = b*e + d) = ((a-b)*e + c = (d::'a::ring))" | 
| 14738 | 254 | apply (simp add: diff_minus left_distrib) | 
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 255 | apply (simp add: diff_minus left_distrib add_ac) | 
| 14738 | 256 | apply (simp add: compare_rls minus_mult_left [symmetric]) | 
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 257 | done | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 258 | |
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 259 | lemma eq_add_iff2: | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 260 | "(a*e + c = b*e + d) = (c = (b-a)*e + (d::'a::ring))" | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 261 | apply (simp add: diff_minus left_distrib add_ac) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 262 | apply (simp add: compare_rls minus_mult_left [symmetric]) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 263 | done | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 264 | |
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 265 | lemma less_add_iff1: | 
| 14738 | 266 | "(a*e + c < b*e + d) = ((a-b)*e + c < (d::'a::pordered_ring))" | 
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 267 | apply (simp add: diff_minus left_distrib add_ac) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 268 | apply (simp add: compare_rls minus_mult_left [symmetric]) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 269 | done | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 270 | |
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 271 | lemma less_add_iff2: | 
| 14738 | 272 | "(a*e + c < b*e + d) = (c < (b-a)*e + (d::'a::pordered_ring))" | 
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 273 | apply (simp add: diff_minus left_distrib add_ac) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 274 | apply (simp add: compare_rls minus_mult_left [symmetric]) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 275 | done | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 276 | |
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 277 | lemma le_add_iff1: | 
| 14738 | 278 | "(a*e + c \<le> b*e + d) = ((a-b)*e + c \<le> (d::'a::pordered_ring))" | 
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 279 | apply (simp add: diff_minus left_distrib add_ac) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 280 | apply (simp add: compare_rls minus_mult_left [symmetric]) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 281 | done | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 282 | |
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 283 | lemma le_add_iff2: | 
| 14738 | 284 | "(a*e + c \<le> b*e + d) = (c \<le> (b-a)*e + (d::'a::pordered_ring))" | 
| 14272 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 285 | apply (simp add: diff_minus left_distrib add_ac) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 286 | apply (simp add: compare_rls minus_mult_left [symmetric]) | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 287 | done | 
| 
5efbb548107d
Tidying of the integer development; towards removing the
 paulson parents: 
14270diff
changeset | 288 | |
| 14270 | 289 | subsection {* Ordering Rules for Multiplication *}
 | 
| 290 | ||
| 14348 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 291 | lemma mult_left_le_imp_le: | 
| 14738 | 292 | "[|c*a \<le> c*b; 0 < c|] ==> a \<le> (b::'a::ordered_semiring_strict)" | 
| 14348 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 293 | by (force simp add: mult_strict_left_mono linorder_not_less [symmetric]) | 
| 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 294 | |
| 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 295 | lemma mult_right_le_imp_le: | 
| 14738 | 296 | "[|a*c \<le> b*c; 0 < c|] ==> a \<le> (b::'a::ordered_semiring_strict)" | 
| 14348 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 297 | by (force simp add: mult_strict_right_mono linorder_not_less [symmetric]) | 
| 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 298 | |
| 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 299 | lemma mult_left_less_imp_less: | 
| 14738 | 300 | "[|c*a < c*b; 0 \<le> c|] ==> a < (b::'a::ordered_semiring_strict)" | 
| 14348 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 301 | by (force simp add: mult_left_mono linorder_not_le [symmetric]) | 
| 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 302 | |
| 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 303 | lemma mult_right_less_imp_less: | 
| 14738 | 304 | "[|a*c < b*c; 0 \<le> c|] ==> a < (b::'a::ordered_semiring_strict)" | 
| 14348 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 305 | by (force simp add: mult_right_mono linorder_not_le [symmetric]) | 
| 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 306 | |
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 307 | lemma mult_strict_left_mono_neg: | 
| 14738 | 308 | "[|b < a; c < 0|] ==> c * a < c * (b::'a::ordered_ring_strict)" | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 309 | apply (drule mult_strict_left_mono [of _ _ "-c"]) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 310 | apply (simp_all add: minus_mult_left [symmetric]) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 311 | done | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 312 | |
| 14738 | 313 | lemma mult_left_mono_neg: | 
| 314 | "[|b \<le> a; c \<le> 0|] ==> c * a \<le> c * (b::'a::pordered_ring)" | |
| 315 | apply (drule mult_left_mono [of _ _ "-c"]) | |
| 316 | apply (simp_all add: minus_mult_left [symmetric]) | |
| 317 | done | |
| 318 | ||
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 319 | lemma mult_strict_right_mono_neg: | 
| 14738 | 320 | "[|b < a; c < 0|] ==> a * c < b * (c::'a::ordered_ring_strict)" | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 321 | apply (drule mult_strict_right_mono [of _ _ "-c"]) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 322 | apply (simp_all add: minus_mult_right [symmetric]) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 323 | done | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 324 | |
| 14738 | 325 | lemma mult_right_mono_neg: | 
| 326 | "[|b \<le> a; c \<le> 0|] ==> a * c \<le> (b::'a::pordered_ring) * c" | |
| 327 | apply (drule mult_right_mono [of _ _ "-c"]) | |
| 328 | apply (simp) | |
| 329 | apply (simp_all add: minus_mult_right [symmetric]) | |
| 330 | done | |
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 331 | |
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 332 | subsection{* Products of Signs *}
 | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 333 | |
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 334 | lemma mult_pos_pos: "[| (0::'a::ordered_semiring_strict) < a; 0 < b |] ==> 0 < a*b" | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 335 | by (drule mult_strict_left_mono [of 0 b], auto) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 336 | |
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 337 | lemma mult_nonneg_nonneg: "[| (0::'a::pordered_cancel_semiring) \<le> a; 0 \<le> b |] ==> 0 \<le> a*b" | 
| 14738 | 338 | by (drule mult_left_mono [of 0 b], auto) | 
| 339 | ||
| 340 | lemma mult_pos_neg: "[| (0::'a::ordered_semiring_strict) < a; b < 0 |] ==> a*b < 0" | |
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 341 | by (drule mult_strict_left_mono [of b 0], auto) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 342 | |
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 343 | lemma mult_nonneg_nonpos: "[| (0::'a::pordered_cancel_semiring) \<le> a; b \<le> 0 |] ==> a*b \<le> 0" | 
| 14738 | 344 | by (drule mult_left_mono [of b 0], auto) | 
| 345 | ||
| 346 | lemma mult_pos_neg2: "[| (0::'a::ordered_semiring_strict) < a; b < 0 |] ==> b*a < 0" | |
| 347 | by (drule mult_strict_right_mono[of b 0], auto) | |
| 348 | ||
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 349 | lemma mult_nonneg_nonpos2: "[| (0::'a::pordered_cancel_semiring) \<le> a; b \<le> 0 |] ==> b*a \<le> 0" | 
| 14738 | 350 | by (drule mult_right_mono[of b 0], auto) | 
| 351 | ||
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 352 | lemma mult_neg_neg: "[| a < (0::'a::ordered_ring_strict); b < 0 |] ==> 0 < a*b" | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 353 | by (drule mult_strict_right_mono_neg, auto) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 354 | |
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 355 | lemma mult_nonpos_nonpos: "[| a \<le> (0::'a::pordered_ring); b \<le> 0 |] ==> 0 \<le> a*b" | 
| 14738 | 356 | by (drule mult_right_mono_neg[of a 0 b ], auto) | 
| 357 | ||
| 14341 
a09441bd4f1e
Ring_and_Field now requires axiom add_left_imp_eq for semirings.
 paulson parents: 
14334diff
changeset | 358 | lemma zero_less_mult_pos: | 
| 14738 | 359 | "[| 0 < a*b; 0 < a|] ==> 0 < (b::'a::ordered_semiring_strict)" | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 360 | apply (case_tac "b\<le>0") | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 361 | apply (auto simp add: order_le_less linorder_not_less) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 362 | apply (drule_tac mult_pos_neg [of a b]) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 363 | apply (auto dest: order_less_not_sym) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 364 | done | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 365 | |
| 14738 | 366 | lemma zero_less_mult_pos2: | 
| 367 | "[| 0 < b*a; 0 < a|] ==> 0 < (b::'a::ordered_semiring_strict)" | |
| 368 | apply (case_tac "b\<le>0") | |
| 369 | apply (auto simp add: order_le_less linorder_not_less) | |
| 370 | apply (drule_tac mult_pos_neg2 [of a b]) | |
| 371 | apply (auto dest: order_less_not_sym) | |
| 372 | done | |
| 373 | ||
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 374 | lemma zero_less_mult_iff: | 
| 14738 | 375 | "((0::'a::ordered_ring_strict) < a*b) = (0 < a & 0 < b | a < 0 & b < 0)" | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 376 | apply (auto simp add: order_le_less linorder_not_less mult_pos_pos | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 377 | mult_neg_neg) | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 378 | apply (blast dest: zero_less_mult_pos) | 
| 14738 | 379 | apply (blast dest: zero_less_mult_pos2) | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 380 | done | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 381 | |
| 14341 
a09441bd4f1e
Ring_and_Field now requires axiom add_left_imp_eq for semirings.
 paulson parents: 
14334diff
changeset | 382 | text{*A field has no "zero divisors", and this theorem holds without the
 | 
| 14277 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 383 |       assumption of an ordering.  See @{text field_mult_eq_0_iff} below.*}
 | 
| 14738 | 384 | lemma mult_eq_0_iff [simp]: "(a*b = (0::'a::ordered_ring_strict)) = (a = 0 | b = 0)" | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 385 | apply (case_tac "a < 0") | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 386 | apply (auto simp add: linorder_not_less order_le_less linorder_neq_iff) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 387 | apply (force dest: mult_strict_right_mono_neg mult_strict_right_mono)+ | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 388 | done | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 389 | |
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 390 | lemma zero_le_mult_iff: | 
| 14738 | 391 | "((0::'a::ordered_ring_strict) \<le> a*b) = (0 \<le> a & 0 \<le> b | a \<le> 0 & b \<le> 0)" | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 392 | by (auto simp add: eq_commute [of 0] order_le_less linorder_not_less | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 393 | zero_less_mult_iff) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 394 | |
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 395 | lemma mult_less_0_iff: | 
| 14738 | 396 | "(a*b < (0::'a::ordered_ring_strict)) = (0 < a & b < 0 | a < 0 & 0 < b)" | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 397 | apply (insert zero_less_mult_iff [of "-a" b]) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 398 | apply (force simp add: minus_mult_left[symmetric]) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 399 | done | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 400 | |
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 401 | lemma mult_le_0_iff: | 
| 14738 | 402 | "(a*b \<le> (0::'a::ordered_ring_strict)) = (0 \<le> a & b \<le> 0 | a \<le> 0 & 0 \<le> b)" | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 403 | apply (insert zero_le_mult_iff [of "-a" b]) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 404 | apply (force simp add: minus_mult_left[symmetric]) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 405 | done | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 406 | |
| 14738 | 407 | lemma split_mult_pos_le: "(0 \<le> a & 0 \<le> b) | (a \<le> 0 & b \<le> 0) \<Longrightarrow> 0 \<le> a * (b::_::pordered_ring)" | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 408 | by (auto simp add: mult_nonneg_nonneg mult_nonpos_nonpos) | 
| 14738 | 409 | |
| 410 | lemma split_mult_neg_le: "(0 \<le> a & b \<le> 0) | (a \<le> 0 & 0 \<le> b) \<Longrightarrow> a * b \<le> (0::_::pordered_cancel_semiring)" | |
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 411 | by (auto simp add: mult_nonneg_nonpos mult_nonneg_nonpos2) | 
| 14738 | 412 | |
| 413 | lemma zero_le_square: "(0::'a::ordered_ring_strict) \<le> a*a" | |
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 414 | by (simp add: zero_le_mult_iff linorder_linear) | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 415 | |
| 14738 | 416 | text{*Proving axiom @{text zero_less_one} makes all @{text ordered_semidom}
 | 
| 417 |       theorems available to members of @{term ordered_idom} *}
 | |
| 418 | ||
| 419 | instance ordered_idom \<subseteq> ordered_semidom | |
| 14421 
ee97b6463cb4
new Ring_and_Field hierarchy, eliminating redundant axioms
 paulson parents: 
14398diff
changeset | 420 | proof | 
| 
ee97b6463cb4
new Ring_and_Field hierarchy, eliminating redundant axioms
 paulson parents: 
14398diff
changeset | 421 | have "(0::'a) \<le> 1*1" by (rule zero_le_square) | 
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 422 | thus "(0::'a) < 1" by (simp add: order_le_less) | 
| 14421 
ee97b6463cb4
new Ring_and_Field hierarchy, eliminating redundant axioms
 paulson parents: 
14398diff
changeset | 423 | qed | 
| 
ee97b6463cb4
new Ring_and_Field hierarchy, eliminating redundant axioms
 paulson parents: 
14398diff
changeset | 424 | |
| 14738 | 425 | instance ordered_ring_strict \<subseteq> axclass_no_zero_divisors | 
| 426 | by (intro_classes, simp) | |
| 427 | ||
| 428 | instance ordered_idom \<subseteq> idom .. | |
| 429 | ||
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14377diff
changeset | 430 | text{*All three types of comparision involving 0 and 1 are covered.*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14377diff
changeset | 431 | |
| 17085 | 432 | lemmas one_neq_zero = zero_neq_one [THEN not_sym] | 
| 433 | declare one_neq_zero [simp] | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14377diff
changeset | 434 | |
| 14738 | 435 | lemma zero_le_one [simp]: "(0::'a::ordered_semidom) \<le> 1" | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 436 | by (rule zero_less_one [THEN order_less_imp_le]) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 437 | |
| 14738 | 438 | lemma not_one_le_zero [simp]: "~ (1::'a::ordered_semidom) \<le> 0" | 
| 439 | by (simp add: linorder_not_le) | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14377diff
changeset | 440 | |
| 14738 | 441 | lemma not_one_less_zero [simp]: "~ (1::'a::ordered_semidom) < 0" | 
| 442 | by (simp add: linorder_not_less) | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 443 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 444 | subsection{*More Monotonicity*}
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 445 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 446 | text{*Strict monotonicity in both arguments*}
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 447 | lemma mult_strict_mono: | 
| 14738 | 448 | "[|a<b; c<d; 0<b; 0\<le>c|] ==> a * c < b * (d::'a::ordered_semiring_strict)" | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 449 | apply (case_tac "c=0") | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 450 | apply (simp add: mult_pos_pos) | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 451 | apply (erule mult_strict_right_mono [THEN order_less_trans]) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 452 | apply (force simp add: order_le_less) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 453 | apply (erule mult_strict_left_mono, assumption) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 454 | done | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 455 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 456 | text{*This weaker variant has more natural premises*}
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 457 | lemma mult_strict_mono': | 
| 14738 | 458 | "[| a<b; c<d; 0 \<le> a; 0 \<le> c|] ==> a * c < b * (d::'a::ordered_semiring_strict)" | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 459 | apply (rule mult_strict_mono) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 460 | apply (blast intro: order_le_less_trans)+ | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 461 | done | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 462 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 463 | lemma mult_mono: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 464 | "[|a \<le> b; c \<le> d; 0 \<le> b; 0 \<le> c|] | 
| 14738 | 465 | ==> a * c \<le> b * (d::'a::pordered_semiring)" | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 466 | apply (erule mult_right_mono [THEN order_trans], assumption) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 467 | apply (erule mult_left_mono, assumption) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 468 | done | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 469 | |
| 14738 | 470 | lemma less_1_mult: "[| 1 < m; 1 < n |] ==> 1 < m*(n::'a::ordered_semidom)" | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14377diff
changeset | 471 | apply (insert mult_strict_mono [of 1 m 1 n]) | 
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 472 | apply (simp add: order_less_trans [OF zero_less_one]) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14377diff
changeset | 473 | done | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14377diff
changeset | 474 | |
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 475 | lemma mult_less_le_imp_less: "(a::'a::ordered_semiring_strict) < b ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 476 | c <= d ==> 0 <= a ==> 0 < c ==> a * c < b * d" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 477 | apply (subgoal_tac "a * c < b * c") | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 478 | apply (erule order_less_le_trans) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 479 | apply (erule mult_left_mono) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 480 | apply simp | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 481 | apply (erule mult_strict_right_mono) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 482 | apply assumption | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 483 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 484 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 485 | lemma mult_le_less_imp_less: "(a::'a::ordered_semiring_strict) <= b ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 486 | c < d ==> 0 < a ==> 0 <= c ==> a * c < b * d" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 487 | apply (subgoal_tac "a * c <= b * c") | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 488 | apply (erule order_le_less_trans) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 489 | apply (erule mult_strict_left_mono) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 490 | apply simp | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 491 | apply (erule mult_right_mono) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 492 | apply simp | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 493 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 494 | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 495 | subsection{*Cancellation Laws for Relationships With a Common Factor*}
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 496 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 497 | text{*Cancellation laws for @{term "c*a < c*b"} and @{term "a*c < b*c"},
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 498 |    also with the relations @{text "\<le>"} and equality.*}
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 499 | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 500 | text{*These ``disjunction'' versions produce two cases when the comparison is
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 501 | an assumption, but effectively four when the comparison is a goal.*} | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 502 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 503 | lemma mult_less_cancel_right_disj: | 
| 14738 | 504 | "(a*c < b*c) = ((0 < c & a < b) | (c < 0 & b < (a::'a::ordered_ring_strict)))" | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 505 | apply (case_tac "c = 0") | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 506 | apply (auto simp add: linorder_neq_iff mult_strict_right_mono | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 507 | mult_strict_right_mono_neg) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 508 | apply (auto simp add: linorder_not_less | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 509 | linorder_not_le [symmetric, of "a*c"] | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 510 | linorder_not_le [symmetric, of a]) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 511 | apply (erule_tac [!] notE) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 512 | apply (auto simp add: order_less_imp_le mult_right_mono | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 513 | mult_right_mono_neg) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 514 | done | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 515 | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 516 | lemma mult_less_cancel_left_disj: | 
| 14738 | 517 | "(c*a < c*b) = ((0 < c & a < b) | (c < 0 & b < (a::'a::ordered_ring_strict)))" | 
| 518 | apply (case_tac "c = 0") | |
| 519 | apply (auto simp add: linorder_neq_iff mult_strict_left_mono | |
| 520 | mult_strict_left_mono_neg) | |
| 521 | apply (auto simp add: linorder_not_less | |
| 522 | linorder_not_le [symmetric, of "c*a"] | |
| 523 | linorder_not_le [symmetric, of a]) | |
| 524 | apply (erule_tac [!] notE) | |
| 525 | apply (auto simp add: order_less_imp_le mult_left_mono | |
| 526 | mult_left_mono_neg) | |
| 527 | done | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 528 | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 529 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 530 | text{*The ``conjunction of implication'' lemmas produce two cases when the
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 531 | comparison is a goal, but give four when the comparison is an assumption.*} | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 532 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 533 | lemma mult_less_cancel_right: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 534 | fixes c :: "'a :: ordered_ring_strict" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 535 | shows "(a*c < b*c) = ((0 \<le> c --> a < b) & (c \<le> 0 --> b < a))" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 536 | by (insert mult_less_cancel_right_disj [of a c b], auto) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 537 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 538 | lemma mult_less_cancel_left: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 539 | fixes c :: "'a :: ordered_ring_strict" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 540 | shows "(c*a < c*b) = ((0 \<le> c --> a < b) & (c \<le> 0 --> b < a))" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 541 | by (insert mult_less_cancel_left_disj [of c a b], auto) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 542 | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 543 | lemma mult_le_cancel_right: | 
| 14738 | 544 | "(a*c \<le> b*c) = ((0<c --> a\<le>b) & (c<0 --> b \<le> (a::'a::ordered_ring_strict)))" | 
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 545 | by (simp add: linorder_not_less [symmetric] mult_less_cancel_right_disj) | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 546 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 547 | lemma mult_le_cancel_left: | 
| 14738 | 548 | "(c*a \<le> c*b) = ((0<c --> a\<le>b) & (c<0 --> b \<le> (a::'a::ordered_ring_strict)))" | 
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 549 | by (simp add: linorder_not_less [symmetric] mult_less_cancel_left_disj) | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 550 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 551 | lemma mult_less_imp_less_left: | 
| 14341 
a09441bd4f1e
Ring_and_Field now requires axiom add_left_imp_eq for semirings.
 paulson parents: 
14334diff
changeset | 552 | assumes less: "c*a < c*b" and nonneg: "0 \<le> c" | 
| 14738 | 553 | shows "a < (b::'a::ordered_semiring_strict)" | 
| 14377 | 554 | proof (rule ccontr) | 
| 555 | assume "~ a < b" | |
| 556 | hence "b \<le> a" by (simp add: linorder_not_less) | |
| 557 | hence "c*b \<le> c*a" by (rule mult_left_mono) | |
| 558 | with this and less show False | |
| 559 | by (simp add: linorder_not_less [symmetric]) | |
| 560 | qed | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 561 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 562 | lemma mult_less_imp_less_right: | 
| 14738 | 563 | assumes less: "a*c < b*c" and nonneg: "0 <= c" | 
| 564 | shows "a < (b::'a::ordered_semiring_strict)" | |
| 565 | proof (rule ccontr) | |
| 566 | assume "~ a < b" | |
| 567 | hence "b \<le> a" by (simp add: linorder_not_less) | |
| 568 | hence "b*c \<le> a*c" by (rule mult_right_mono) | |
| 569 | with this and less show False | |
| 570 | by (simp add: linorder_not_less [symmetric]) | |
| 571 | qed | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 572 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 573 | text{*Cancellation of equalities with a common factor*}
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 574 | lemma mult_cancel_right [simp]: | 
| 14738 | 575 | "(a*c = b*c) = (c = (0::'a::ordered_ring_strict) | a=b)" | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 576 | apply (cut_tac linorder_less_linear [of 0 c]) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 577 | apply (force dest: mult_strict_right_mono_neg mult_strict_right_mono | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 578 | simp add: linorder_neq_iff) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 579 | done | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 580 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 581 | text{*These cancellation theorems require an ordering. Versions are proved
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 582 | below that work for fields without an ordering.*} | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 583 | lemma mult_cancel_left [simp]: | 
| 14738 | 584 | "(c*a = c*b) = (c = (0::'a::ordered_ring_strict) | a=b)" | 
| 585 | apply (cut_tac linorder_less_linear [of 0 c]) | |
| 586 | apply (force dest: mult_strict_left_mono_neg mult_strict_left_mono | |
| 587 | simp add: linorder_neq_iff) | |
| 588 | done | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 589 | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 590 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 591 | subsubsection{*Special Cancellation Simprules for Multiplication*}
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 592 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 593 | text{*These also produce two cases when the comparison is a goal.*}
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 594 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 595 | lemma mult_le_cancel_right1: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 596 | fixes c :: "'a :: ordered_idom" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 597 | shows "(c \<le> b*c) = ((0<c --> 1\<le>b) & (c<0 --> b \<le> 1))" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 598 | by (insert mult_le_cancel_right [of 1 c b], simp) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 599 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 600 | lemma mult_le_cancel_right2: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 601 | fixes c :: "'a :: ordered_idom" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 602 | shows "(a*c \<le> c) = ((0<c --> a\<le>1) & (c<0 --> 1 \<le> a))" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 603 | by (insert mult_le_cancel_right [of a c 1], simp) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 604 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 605 | lemma mult_le_cancel_left1: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 606 | fixes c :: "'a :: ordered_idom" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 607 | shows "(c \<le> c*b) = ((0<c --> 1\<le>b) & (c<0 --> b \<le> 1))" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 608 | by (insert mult_le_cancel_left [of c 1 b], simp) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 609 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 610 | lemma mult_le_cancel_left2: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 611 | fixes c :: "'a :: ordered_idom" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 612 | shows "(c*a \<le> c) = ((0<c --> a\<le>1) & (c<0 --> 1 \<le> a))" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 613 | by (insert mult_le_cancel_left [of c a 1], simp) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 614 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 615 | lemma mult_less_cancel_right1: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 616 | fixes c :: "'a :: ordered_idom" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 617 | shows "(c < b*c) = ((0 \<le> c --> 1<b) & (c \<le> 0 --> b < 1))" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 618 | by (insert mult_less_cancel_right [of 1 c b], simp) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 619 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 620 | lemma mult_less_cancel_right2: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 621 | fixes c :: "'a :: ordered_idom" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 622 | shows "(a*c < c) = ((0 \<le> c --> a<1) & (c \<le> 0 --> 1 < a))" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 623 | by (insert mult_less_cancel_right [of a c 1], simp) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 624 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 625 | lemma mult_less_cancel_left1: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 626 | fixes c :: "'a :: ordered_idom" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 627 | shows "(c < c*b) = ((0 \<le> c --> 1<b) & (c \<le> 0 --> b < 1))" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 628 | by (insert mult_less_cancel_left [of c 1 b], simp) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 629 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 630 | lemma mult_less_cancel_left2: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 631 | fixes c :: "'a :: ordered_idom" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 632 | shows "(c*a < c) = ((0 \<le> c --> a<1) & (c \<le> 0 --> 1 < a))" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 633 | by (insert mult_less_cancel_left [of c a 1], simp) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 634 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 635 | lemma mult_cancel_right1 [simp]: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 636 | fixes c :: "'a :: ordered_idom" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 637 | shows "(c = b*c) = (c = 0 | b=1)" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 638 | by (insert mult_cancel_right [of 1 c b], force) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 639 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 640 | lemma mult_cancel_right2 [simp]: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 641 | fixes c :: "'a :: ordered_idom" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 642 | shows "(a*c = c) = (c = 0 | a=1)" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 643 | by (insert mult_cancel_right [of a c 1], simp) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 644 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 645 | lemma mult_cancel_left1 [simp]: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 646 | fixes c :: "'a :: ordered_idom" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 647 | shows "(c = c*b) = (c = 0 | b=1)" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 648 | by (insert mult_cancel_left [of c 1 b], force) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 649 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 650 | lemma mult_cancel_left2 [simp]: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 651 | fixes c :: "'a :: ordered_idom" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 652 | shows "(c*a = c) = (c = 0 | a=1)" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 653 | by (insert mult_cancel_left [of c a 1], simp) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 654 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 655 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 656 | text{*Simprules for comparisons where common factors can be cancelled.*}
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 657 | lemmas mult_compare_simps = | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 658 | mult_le_cancel_right mult_le_cancel_left | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 659 | mult_le_cancel_right1 mult_le_cancel_right2 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 660 | mult_le_cancel_left1 mult_le_cancel_left2 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 661 | mult_less_cancel_right mult_less_cancel_left | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 662 | mult_less_cancel_right1 mult_less_cancel_right2 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 663 | mult_less_cancel_left1 mult_less_cancel_left2 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 664 | mult_cancel_right mult_cancel_left | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 665 | mult_cancel_right1 mult_cancel_right2 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 666 | mult_cancel_left1 mult_cancel_left2 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 667 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 668 | |
| 14738 | 669 | text{*This list of rewrites decides ring equalities by ordered rewriting.*}
 | 
| 15178 | 670 | lemmas ring_eq_simps = | 
| 671 | (* mult_ac*) | |
| 14738 | 672 | left_distrib right_distrib left_diff_distrib right_diff_distrib | 
| 15178 | 673 | group_eq_simps | 
| 674 | (* add_ac | |
| 14738 | 675 | add_diff_eq diff_add_eq diff_diff_eq diff_diff_eq2 | 
| 15178 | 676 | diff_eq_eq eq_diff_eq *) | 
| 14738 | 677 | |
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 678 | subsection {* Fields *}
 | 
| 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 679 | |
| 14288 | 680 | lemma right_inverse [simp]: | 
| 681 | assumes not0: "a \<noteq> 0" shows "a * inverse (a::'a::field) = 1" | |
| 682 | proof - | |
| 683 | have "a * inverse a = inverse a * a" by (simp add: mult_ac) | |
| 684 | also have "... = 1" using not0 by simp | |
| 685 | finally show ?thesis . | |
| 686 | qed | |
| 687 | ||
| 688 | lemma right_inverse_eq: "b \<noteq> 0 ==> (a / b = 1) = (a = (b::'a::field))" | |
| 689 | proof | |
| 690 | assume neq: "b \<noteq> 0" | |
| 691 |   {
 | |
| 692 | hence "a = (a / b) * b" by (simp add: divide_inverse mult_ac) | |
| 693 | also assume "a / b = 1" | |
| 694 | finally show "a = b" by simp | |
| 695 | next | |
| 696 | assume "a = b" | |
| 697 | with neq show "a / b = 1" by (simp add: divide_inverse) | |
| 698 | } | |
| 699 | qed | |
| 700 | ||
| 701 | lemma nonzero_inverse_eq_divide: "a \<noteq> 0 ==> inverse (a::'a::field) = 1/a" | |
| 702 | by (simp add: divide_inverse) | |
| 703 | ||
| 15228 | 704 | lemma divide_self: "a \<noteq> 0 ==> a / (a::'a::field) = 1" | 
| 14288 | 705 | by (simp add: divide_inverse) | 
| 706 | ||
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 707 | lemma divide_zero [simp]: "a / 0 = (0::'a::{field,division_by_zero})"
 | 
| 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 708 | by (simp add: divide_inverse) | 
| 14277 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 709 | |
| 15228 | 710 | lemma divide_self_if [simp]: | 
| 711 |      "a / (a::'a::{field,division_by_zero}) = (if a=0 then 0 else 1)"
 | |
| 712 | by (simp add: divide_self) | |
| 713 | ||
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 714 | lemma divide_zero_left [simp]: "0/a = (0::'a::field)" | 
| 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 715 | by (simp add: divide_inverse) | 
| 14277 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 716 | |
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 717 | lemma inverse_eq_divide: "inverse (a::'a::field) = 1/a" | 
| 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 718 | by (simp add: divide_inverse) | 
| 14277 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 719 | |
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 720 | lemma add_divide_distrib: "(a+b)/(c::'a::field) = a/c + b/c" | 
| 14293 | 721 | by (simp add: divide_inverse left_distrib) | 
| 722 | ||
| 723 | ||
| 14270 | 724 | text{*Compared with @{text mult_eq_0_iff}, this version removes the requirement
 | 
| 725 | of an ordering.*} | |
| 14348 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 726 | lemma field_mult_eq_0_iff [simp]: "(a*b = (0::'a::field)) = (a = 0 | b = 0)" | 
| 14377 | 727 | proof cases | 
| 728 | assume "a=0" thus ?thesis by simp | |
| 729 | next | |
| 730 | assume anz [simp]: "a\<noteq>0" | |
| 731 |   { assume "a * b = 0"
 | |
| 732 | hence "inverse a * (a * b) = 0" by simp | |
| 733 | hence "b = 0" by (simp (no_asm_use) add: mult_assoc [symmetric])} | |
| 734 | thus ?thesis by force | |
| 735 | qed | |
| 14270 | 736 | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 737 | text{*Cancellation of equalities with a common factor*}
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 738 | lemma field_mult_cancel_right_lemma: | 
| 14269 | 739 | assumes cnz: "c \<noteq> (0::'a::field)" | 
| 740 | and eq: "a*c = b*c" | |
| 741 | shows "a=b" | |
| 14377 | 742 | proof - | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 743 | have "(a * c) * inverse c = (b * c) * inverse c" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 744 | by (simp add: eq) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 745 | thus "a=b" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 746 | by (simp add: mult_assoc cnz) | 
| 14377 | 747 | qed | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 748 | |
| 14348 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 749 | lemma field_mult_cancel_right [simp]: | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 750 | "(a*c = b*c) = (c = (0::'a::field) | a=b)" | 
| 14377 | 751 | proof cases | 
| 752 | assume "c=0" thus ?thesis by simp | |
| 753 | next | |
| 754 | assume "c\<noteq>0" | |
| 755 | thus ?thesis by (force dest: field_mult_cancel_right_lemma) | |
| 756 | qed | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 757 | |
| 14348 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 paulson parents: 
14341diff
changeset | 758 | lemma field_mult_cancel_left [simp]: | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 759 | "(c*a = c*b) = (c = (0::'a::field) | a=b)" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 760 | by (simp add: mult_commute [of c] field_mult_cancel_right) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 761 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 762 | lemma nonzero_imp_inverse_nonzero: "a \<noteq> 0 ==> inverse a \<noteq> (0::'a::field)" | 
| 14377 | 763 | proof | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 764 | assume ianz: "inverse a = 0" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 765 | assume "a \<noteq> 0" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 766 | hence "1 = a * inverse a" by simp | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 767 | also have "... = 0" by (simp add: ianz) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 768 | finally have "1 = (0::'a::field)" . | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 769 | thus False by (simp add: eq_commute) | 
| 14377 | 770 | qed | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 771 | |
| 14277 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 772 | |
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 773 | subsection{*Basic Properties of @{term inverse}*}
 | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 774 | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 775 | lemma inverse_zero_imp_zero: "inverse a = 0 ==> a = (0::'a::field)" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 776 | apply (rule ccontr) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 777 | apply (blast dest: nonzero_imp_inverse_nonzero) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 778 | done | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 779 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 780 | lemma inverse_nonzero_imp_nonzero: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 781 | "inverse a = 0 ==> a = (0::'a::field)" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 782 | apply (rule ccontr) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 783 | apply (blast dest: nonzero_imp_inverse_nonzero) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 784 | done | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 785 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 786 | lemma inverse_nonzero_iff_nonzero [simp]: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 787 |    "(inverse a = 0) = (a = (0::'a::{field,division_by_zero}))"
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 788 | by (force dest: inverse_nonzero_imp_nonzero) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 789 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 790 | lemma nonzero_inverse_minus_eq: | 
| 14269 | 791 | assumes [simp]: "a\<noteq>0" shows "inverse(-a) = -inverse(a::'a::field)" | 
| 14377 | 792 | proof - | 
| 793 | have "-a * inverse (- a) = -a * - inverse a" | |
| 794 | by simp | |
| 795 | thus ?thesis | |
| 796 | by (simp only: field_mult_cancel_left, simp) | |
| 797 | qed | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 798 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 799 | lemma inverse_minus_eq [simp]: | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 800 |    "inverse(-a) = -inverse(a::'a::{field,division_by_zero})"
 | 
| 14377 | 801 | proof cases | 
| 802 | assume "a=0" thus ?thesis by (simp add: inverse_zero) | |
| 803 | next | |
| 804 | assume "a\<noteq>0" | |
| 805 | thus ?thesis by (simp add: nonzero_inverse_minus_eq) | |
| 806 | qed | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 807 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 808 | lemma nonzero_inverse_eq_imp_eq: | 
| 14269 | 809 | assumes inveq: "inverse a = inverse b" | 
| 810 | and anz: "a \<noteq> 0" | |
| 811 | and bnz: "b \<noteq> 0" | |
| 812 | shows "a = (b::'a::field)" | |
| 14377 | 813 | proof - | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 814 | have "a * inverse b = a * inverse a" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 815 | by (simp add: inveq) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 816 | hence "(a * inverse b) * b = (a * inverse a) * b" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 817 | by simp | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 818 | thus "a = b" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 819 | by (simp add: mult_assoc anz bnz) | 
| 14377 | 820 | qed | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 821 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 822 | lemma inverse_eq_imp_eq: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 823 |      "inverse a = inverse b ==> a = (b::'a::{field,division_by_zero})"
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 824 | apply (case_tac "a=0 | b=0") | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 825 | apply (force dest!: inverse_zero_imp_zero | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 826 | simp add: eq_commute [of "0::'a"]) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 827 | apply (force dest!: nonzero_inverse_eq_imp_eq) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 828 | done | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 829 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 830 | lemma inverse_eq_iff_eq [simp]: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 831 |      "(inverse a = inverse b) = (a = (b::'a::{field,division_by_zero}))"
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 832 | by (force dest!: inverse_eq_imp_eq) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 833 | |
| 14270 | 834 | lemma nonzero_inverse_inverse_eq: | 
| 835 | assumes [simp]: "a \<noteq> 0" shows "inverse(inverse (a::'a::field)) = a" | |
| 836 | proof - | |
| 837 | have "(inverse (inverse a) * inverse a) * a = a" | |
| 838 | by (simp add: nonzero_imp_inverse_nonzero) | |
| 839 | thus ?thesis | |
| 840 | by (simp add: mult_assoc) | |
| 841 | qed | |
| 842 | ||
| 843 | lemma inverse_inverse_eq [simp]: | |
| 844 |      "inverse(inverse (a::'a::{field,division_by_zero})) = a"
 | |
| 845 | proof cases | |
| 846 | assume "a=0" thus ?thesis by simp | |
| 847 | next | |
| 848 | assume "a\<noteq>0" | |
| 849 | thus ?thesis by (simp add: nonzero_inverse_inverse_eq) | |
| 850 | qed | |
| 851 | ||
| 852 | lemma inverse_1 [simp]: "inverse 1 = (1::'a::field)" | |
| 853 | proof - | |
| 854 | have "inverse 1 * 1 = (1::'a::field)" | |
| 855 | by (rule left_inverse [OF zero_neq_one [symmetric]]) | |
| 856 | thus ?thesis by simp | |
| 857 | qed | |
| 858 | ||
| 15077 
89840837108e
converting Hyperreal/Transcendental to Isar script
 paulson parents: 
15010diff
changeset | 859 | lemma inverse_unique: | 
| 
89840837108e
converting Hyperreal/Transcendental to Isar script
 paulson parents: 
15010diff
changeset | 860 | assumes ab: "a*b = 1" | 
| 
89840837108e
converting Hyperreal/Transcendental to Isar script
 paulson parents: 
15010diff
changeset | 861 | shows "inverse a = (b::'a::field)" | 
| 
89840837108e
converting Hyperreal/Transcendental to Isar script
 paulson parents: 
15010diff
changeset | 862 | proof - | 
| 
89840837108e
converting Hyperreal/Transcendental to Isar script
 paulson parents: 
15010diff
changeset | 863 | have "a \<noteq> 0" using ab by auto | 
| 
89840837108e
converting Hyperreal/Transcendental to Isar script
 paulson parents: 
15010diff
changeset | 864 | moreover have "inverse a * (a * b) = inverse a" by (simp add: ab) | 
| 
89840837108e
converting Hyperreal/Transcendental to Isar script
 paulson parents: 
15010diff
changeset | 865 | ultimately show ?thesis by (simp add: mult_assoc [symmetric]) | 
| 
89840837108e
converting Hyperreal/Transcendental to Isar script
 paulson parents: 
15010diff
changeset | 866 | qed | 
| 
89840837108e
converting Hyperreal/Transcendental to Isar script
 paulson parents: 
15010diff
changeset | 867 | |
| 14270 | 868 | lemma nonzero_inverse_mult_distrib: | 
| 869 | assumes anz: "a \<noteq> 0" | |
| 870 | and bnz: "b \<noteq> 0" | |
| 871 | shows "inverse(a*b) = inverse(b) * inverse(a::'a::field)" | |
| 872 | proof - | |
| 873 | have "inverse(a*b) * (a * b) * inverse(b) = inverse(b)" | |
| 874 | by (simp add: field_mult_eq_0_iff anz bnz) | |
| 875 | hence "inverse(a*b) * a = inverse(b)" | |
| 876 | by (simp add: mult_assoc bnz) | |
| 877 | hence "inverse(a*b) * a * inverse(a) = inverse(b) * inverse(a)" | |
| 878 | by simp | |
| 879 | thus ?thesis | |
| 880 | by (simp add: mult_assoc anz) | |
| 881 | qed | |
| 882 | ||
| 883 | text{*This version builds in division by zero while also re-orienting
 | |
| 884 | the right-hand side.*} | |
| 885 | lemma inverse_mult_distrib [simp]: | |
| 886 |      "inverse(a*b) = inverse(a) * inverse(b::'a::{field,division_by_zero})"
 | |
| 887 | proof cases | |
| 888 | assume "a \<noteq> 0 & b \<noteq> 0" | |
| 889 | thus ?thesis by (simp add: nonzero_inverse_mult_distrib mult_commute) | |
| 890 | next | |
| 891 | assume "~ (a \<noteq> 0 & b \<noteq> 0)" | |
| 892 | thus ?thesis by force | |
| 893 | qed | |
| 894 | ||
| 895 | text{*There is no slick version using division by zero.*}
 | |
| 896 | lemma inverse_add: | |
| 897 | "[|a \<noteq> 0; b \<noteq> 0|] | |
| 898 | ==> inverse a + inverse b = (a+b) * inverse a * inverse (b::'a::field)" | |
| 899 | apply (simp add: left_distrib mult_assoc) | |
| 900 | apply (simp add: mult_commute [of "inverse a"]) | |
| 901 | apply (simp add: mult_assoc [symmetric] add_commute) | |
| 902 | done | |
| 903 | ||
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 904 | lemma inverse_divide [simp]: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 905 |       "inverse (a/b) = b / (a::'a::{field,division_by_zero})"
 | 
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 906 | by (simp add: divide_inverse mult_commute) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 907 | |
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 908 | subsection {* Calculations with fractions *}
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 909 | |
| 14277 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 910 | lemma nonzero_mult_divide_cancel_left: | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 911 | assumes [simp]: "b\<noteq>0" and [simp]: "c\<noteq>0" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 912 | shows "(c*a)/(c*b) = a/(b::'a::field)" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 913 | proof - | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 914 | have "(c*a)/(c*b) = c * a * (inverse b * inverse c)" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 915 | by (simp add: field_mult_eq_0_iff divide_inverse | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 916 | nonzero_inverse_mult_distrib) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 917 | also have "... = a * inverse b * (inverse c * c)" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 918 | by (simp only: mult_ac) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 919 | also have "... = a * inverse b" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 920 | by simp | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 921 | finally show ?thesis | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 922 | by (simp add: divide_inverse) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 923 | qed | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 924 | |
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 925 | lemma mult_divide_cancel_left: | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 926 |      "c\<noteq>0 ==> (c*a) / (c*b) = a / (b::'a::{field,division_by_zero})"
 | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 927 | apply (case_tac "b = 0") | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 928 | apply (simp_all add: nonzero_mult_divide_cancel_left) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 929 | done | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 930 | |
| 14321 | 931 | lemma nonzero_mult_divide_cancel_right: | 
| 932 | "[|b\<noteq>0; c\<noteq>0|] ==> (a*c) / (b*c) = a/(b::'a::field)" | |
| 933 | by (simp add: mult_commute [of _ c] nonzero_mult_divide_cancel_left) | |
| 934 | ||
| 935 | lemma mult_divide_cancel_right: | |
| 936 |      "c\<noteq>0 ==> (a*c) / (b*c) = a / (b::'a::{field,division_by_zero})"
 | |
| 937 | apply (case_tac "b = 0") | |
| 938 | apply (simp_all add: nonzero_mult_divide_cancel_right) | |
| 939 | done | |
| 940 | ||
| 14277 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 941 | (*For ExtractCommonTerm*) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 942 | lemma mult_divide_cancel_eq_if: | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 943 | "(c*a) / (c*b) = | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 944 |       (if c=0 then 0 else a / (b::'a::{field,division_by_zero}))"
 | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 945 | by (simp add: mult_divide_cancel_left) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 946 | |
| 14284 
f1abe67c448a
re-organisation of Real/RealArith0.ML; more `Isar scripts
 paulson parents: 
14277diff
changeset | 947 | lemma divide_1 [simp]: "a/1 = (a::'a::field)" | 
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 948 | by (simp add: divide_inverse) | 
| 14284 
f1abe67c448a
re-organisation of Real/RealArith0.ML; more `Isar scripts
 paulson parents: 
14277diff
changeset | 949 | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 950 | lemma times_divide_eq_right: "a * (b/c) = (a*b) / (c::'a::field)" | 
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 951 | by (simp add: divide_inverse mult_assoc) | 
| 14288 | 952 | |
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 953 | lemma times_divide_eq_left: "(b/c) * a = (b*a) / (c::'a::field)" | 
| 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 954 | by (simp add: divide_inverse mult_ac) | 
| 14288 | 955 | |
| 956 | lemma divide_divide_eq_right [simp]: | |
| 957 |      "a / (b/c) = (a*c) / (b::'a::{field,division_by_zero})"
 | |
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 958 | by (simp add: divide_inverse mult_ac) | 
| 14288 | 959 | |
| 960 | lemma divide_divide_eq_left [simp]: | |
| 961 |      "(a / b) / (c::'a::{field,division_by_zero}) = a / (b*c)"
 | |
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 962 | by (simp add: divide_inverse mult_assoc) | 
| 14288 | 963 | |
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 964 | lemma add_frac_eq: "(y::'a::field) ~= 0 ==> z ~= 0 ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 965 | x / y + w / z = (x * z + w * y) / (y * z)" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 966 | apply (subgoal_tac "x / y = (x * z) / (y * z)") | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 967 | apply (erule ssubst) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 968 | apply (subgoal_tac "w / z = (w * y) / (y * z)") | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 969 | apply (erule ssubst) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 970 | apply (rule add_divide_distrib [THEN sym]) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 971 | apply (subst mult_commute) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 972 | apply (erule nonzero_mult_divide_cancel_left [THEN sym]) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 973 | apply assumption | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 974 | apply (erule nonzero_mult_divide_cancel_right [THEN sym]) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 975 | apply assumption | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 976 | done | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 977 | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 978 | subsubsection{*Special Cancellation Simprules for Division*}
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 979 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 980 | lemma mult_divide_cancel_left_if [simp]: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 981 |   fixes c :: "'a :: {field,division_by_zero}"
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 982 | shows "(c*a) / (c*b) = (if c=0 then 0 else a/b)" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 983 | by (simp add: mult_divide_cancel_left) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 984 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 985 | lemma mult_divide_cancel_right_if [simp]: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 986 |   fixes c :: "'a :: {field,division_by_zero}"
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 987 | shows "(a*c) / (b*c) = (if c=0 then 0 else a/b)" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 988 | by (simp add: mult_divide_cancel_right) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 989 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 990 | lemma mult_divide_cancel_left_if1 [simp]: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 991 |   fixes c :: "'a :: {field,division_by_zero}"
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 992 | shows "c / (c*b) = (if c=0 then 0 else 1/b)" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 993 | apply (insert mult_divide_cancel_left_if [of c 1 b]) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 994 | apply (simp del: mult_divide_cancel_left_if) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 995 | done | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 996 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 997 | lemma mult_divide_cancel_left_if2 [simp]: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 998 |   fixes c :: "'a :: {field,division_by_zero}"
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 999 | shows "(c*a) / c = (if c=0 then 0 else a)" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1000 | apply (insert mult_divide_cancel_left_if [of c a 1]) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1001 | apply (simp del: mult_divide_cancel_left_if) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1002 | done | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1003 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1004 | lemma mult_divide_cancel_right_if1 [simp]: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1005 |   fixes c :: "'a :: {field,division_by_zero}"
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1006 | shows "c / (b*c) = (if c=0 then 0 else 1/b)" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1007 | apply (insert mult_divide_cancel_right_if [of 1 c b]) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1008 | apply (simp del: mult_divide_cancel_right_if) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1009 | done | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1010 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1011 | lemma mult_divide_cancel_right_if2 [simp]: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1012 |   fixes c :: "'a :: {field,division_by_zero}"
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1013 | shows "(a*c) / c = (if c=0 then 0 else a)" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1014 | apply (insert mult_divide_cancel_right_if [of a c 1]) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1015 | apply (simp del: mult_divide_cancel_right_if) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1016 | done | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1017 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1018 | text{*Two lemmas for cancelling the denominator*}
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1019 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1020 | lemma times_divide_self_right [simp]: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1021 |   fixes a :: "'a :: {field,division_by_zero}"
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1022 | shows "a * (b/a) = (if a=0 then 0 else b)" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1023 | by (simp add: times_divide_eq_right) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1024 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1025 | lemma times_divide_self_left [simp]: | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1026 |   fixes a :: "'a :: {field,division_by_zero}"
 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1027 | shows "(b/a) * a = (if a=0 then 0 else b)" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1028 | by (simp add: times_divide_eq_left) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1029 | |
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1030 | |
| 14293 | 1031 | subsection {* Division and Unary Minus *}
 | 
| 1032 | ||
| 1033 | lemma nonzero_minus_divide_left: "b \<noteq> 0 ==> - (a/b) = (-a) / (b::'a::field)" | |
| 1034 | by (simp add: divide_inverse minus_mult_left) | |
| 1035 | ||
| 1036 | lemma nonzero_minus_divide_right: "b \<noteq> 0 ==> - (a/b) = a / -(b::'a::field)" | |
| 1037 | by (simp add: divide_inverse nonzero_inverse_minus_eq minus_mult_right) | |
| 1038 | ||
| 1039 | lemma nonzero_minus_divide_divide: "b \<noteq> 0 ==> (-a)/(-b) = a / (b::'a::field)" | |
| 1040 | by (simp add: divide_inverse nonzero_inverse_minus_eq) | |
| 1041 | ||
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 1042 | lemma minus_divide_left: "- (a/b) = (-a) / (b::'a::field)" | 
| 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 1043 | by (simp add: divide_inverse minus_mult_left [symmetric]) | 
| 14293 | 1044 | |
| 1045 | lemma minus_divide_right: "- (a/b) = a / -(b::'a::{field,division_by_zero})"
 | |
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 1046 | by (simp add: divide_inverse minus_mult_right [symmetric]) | 
| 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 1047 | |
| 14293 | 1048 | |
| 1049 | text{*The effect is to extract signs from divisions*}
 | |
| 17085 | 1050 | lemmas divide_minus_left = minus_divide_left [symmetric] | 
| 1051 | lemmas divide_minus_right = minus_divide_right [symmetric] | |
| 1052 | declare divide_minus_left [simp] divide_minus_right [simp] | |
| 14293 | 1053 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14377diff
changeset | 1054 | text{*Also, extract signs from products*}
 | 
| 17085 | 1055 | lemmas mult_minus_left = minus_mult_left [symmetric] | 
| 1056 | lemmas mult_minus_right = minus_mult_right [symmetric] | |
| 1057 | declare mult_minus_left [simp] mult_minus_right [simp] | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14377diff
changeset | 1058 | |
| 14293 | 1059 | lemma minus_divide_divide [simp]: | 
| 1060 |      "(-a)/(-b) = a / (b::'a::{field,division_by_zero})"
 | |
| 1061 | apply (case_tac "b=0", simp) | |
| 1062 | apply (simp add: nonzero_minus_divide_divide) | |
| 1063 | done | |
| 1064 | ||
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 1065 | lemma diff_divide_distrib: "(a-b)/(c::'a::field) = a/c - b/c" | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14377diff
changeset | 1066 | by (simp add: diff_minus add_divide_distrib) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14377diff
changeset | 1067 | |
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1068 | lemma diff_frac_eq: "(y::'a::field) ~= 0 ==> z ~= 0 ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1069 | x / y - w / z = (x * z - w * y) / (y * z)" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1070 | apply (subst diff_def)+ | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1071 | apply (subst minus_divide_left) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1072 | apply (subst add_frac_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1073 | apply simp_all | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1074 | done | 
| 14293 | 1075 | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1076 | subsection {* Ordered Fields *}
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1077 | |
| 14277 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1078 | lemma positive_imp_inverse_positive: | 
| 14269 | 1079 | assumes a_gt_0: "0 < a" shows "0 < inverse (a::'a::ordered_field)" | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1080 | proof - | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1081 | have "0 < a * inverse a" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1082 | by (simp add: a_gt_0 [THEN order_less_imp_not_eq2] zero_less_one) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1083 | thus "0 < inverse a" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1084 | by (simp add: a_gt_0 [THEN order_less_not_sym] zero_less_mult_iff) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1085 | qed | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1086 | |
| 14277 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1087 | lemma negative_imp_inverse_negative: | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1088 | "a < 0 ==> inverse a < (0::'a::ordered_field)" | 
| 14277 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1089 | by (insert positive_imp_inverse_positive [of "-a"], | 
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1090 | simp add: nonzero_inverse_minus_eq order_less_imp_not_eq) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1091 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1092 | lemma inverse_le_imp_le: | 
| 14269 | 1093 | assumes invle: "inverse a \<le> inverse b" | 
| 1094 | and apos: "0 < a" | |
| 1095 | shows "b \<le> (a::'a::ordered_field)" | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1096 | proof (rule classical) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1097 | assume "~ b \<le> a" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1098 | hence "a < b" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1099 | by (simp add: linorder_not_le) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1100 | hence bpos: "0 < b" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1101 | by (blast intro: apos order_less_trans) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1102 | hence "a * inverse a \<le> a * inverse b" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1103 | by (simp add: apos invle order_less_imp_le mult_left_mono) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1104 | hence "(a * inverse a) * b \<le> (a * inverse b) * b" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1105 | by (simp add: bpos order_less_imp_le mult_right_mono) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1106 | thus "b \<le> a" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1107 | by (simp add: mult_assoc apos bpos order_less_imp_not_eq2) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1108 | qed | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1109 | |
| 14277 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1110 | lemma inverse_positive_imp_positive: | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1111 | assumes inv_gt_0: "0 < inverse a" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1112 | and [simp]: "a \<noteq> 0" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1113 | shows "0 < (a::'a::ordered_field)" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1114 | proof - | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1115 | have "0 < inverse (inverse a)" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1116 | by (rule positive_imp_inverse_positive) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1117 | thus "0 < a" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1118 | by (simp add: nonzero_inverse_inverse_eq) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1119 | qed | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1120 | |
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1121 | lemma inverse_positive_iff_positive [simp]: | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1122 |       "(0 < inverse a) = (0 < (a::'a::{ordered_field,division_by_zero}))"
 | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1123 | apply (case_tac "a = 0", simp) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1124 | apply (blast intro: inverse_positive_imp_positive positive_imp_inverse_positive) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1125 | done | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1126 | |
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1127 | lemma inverse_negative_imp_negative: | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1128 | assumes inv_less_0: "inverse a < 0" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1129 | and [simp]: "a \<noteq> 0" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1130 | shows "a < (0::'a::ordered_field)" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1131 | proof - | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1132 | have "inverse (inverse a) < 0" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1133 | by (rule negative_imp_inverse_negative) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1134 | thus "a < 0" | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1135 | by (simp add: nonzero_inverse_inverse_eq) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1136 | qed | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1137 | |
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1138 | lemma inverse_negative_iff_negative [simp]: | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1139 |       "(inverse a < 0) = (a < (0::'a::{ordered_field,division_by_zero}))"
 | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1140 | apply (case_tac "a = 0", simp) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1141 | apply (blast intro: inverse_negative_imp_negative negative_imp_inverse_negative) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1142 | done | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1143 | |
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1144 | lemma inverse_nonnegative_iff_nonnegative [simp]: | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1145 |       "(0 \<le> inverse a) = (0 \<le> (a::'a::{ordered_field,division_by_zero}))"
 | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1146 | by (simp add: linorder_not_less [symmetric]) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1147 | |
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1148 | lemma inverse_nonpositive_iff_nonpositive [simp]: | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1149 |       "(inverse a \<le> 0) = (a \<le> (0::'a::{ordered_field,division_by_zero}))"
 | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1150 | by (simp add: linorder_not_less [symmetric]) | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1151 | |
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1152 | |
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1153 | subsection{*Anti-Monotonicity of @{term inverse}*}
 | 
| 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1154 | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1155 | lemma less_imp_inverse_less: | 
| 14269 | 1156 | assumes less: "a < b" | 
| 1157 | and apos: "0 < a" | |
| 1158 | shows "inverse b < inverse (a::'a::ordered_field)" | |
| 14268 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1159 | proof (rule ccontr) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1160 | assume "~ inverse b < inverse a" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1161 | hence "inverse a \<le> inverse b" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1162 | by (simp add: linorder_not_less) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1163 | hence "~ (a < b)" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1164 | by (simp add: linorder_not_less inverse_le_imp_le [OF _ apos]) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1165 | thus False | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1166 | by (rule notE [OF _ less]) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1167 | qed | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1168 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1169 | lemma inverse_less_imp_less: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1170 | "[|inverse a < inverse b; 0 < a|] ==> b < (a::'a::ordered_field)" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1171 | apply (simp add: order_less_le [of "inverse a"] order_less_le [of "b"]) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1172 | apply (force dest!: inverse_le_imp_le nonzero_inverse_eq_imp_eq) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1173 | done | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1174 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1175 | text{*Both premises are essential. Consider -1 and 1.*}
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1176 | lemma inverse_less_iff_less [simp]: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1177 | "[|0 < a; 0 < b|] | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1178 | ==> (inverse a < inverse b) = (b < (a::'a::ordered_field))" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1179 | by (blast intro: less_imp_inverse_less dest: inverse_less_imp_less) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1180 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1181 | lemma le_imp_inverse_le: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1182 | "[|a \<le> b; 0 < a|] ==> inverse b \<le> inverse (a::'a::ordered_field)" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1183 | by (force simp add: order_le_less less_imp_inverse_less) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1184 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1185 | lemma inverse_le_iff_le [simp]: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1186 | "[|0 < a; 0 < b|] | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1187 | ==> (inverse a \<le> inverse b) = (b \<le> (a::'a::ordered_field))" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1188 | by (blast intro: le_imp_inverse_le dest: inverse_le_imp_le) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1189 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1190 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1191 | text{*These results refer to both operands being negative.  The opposite-sign
 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1192 | case is trivial, since inverse preserves signs.*} | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1193 | lemma inverse_le_imp_le_neg: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1194 | "[|inverse a \<le> inverse b; b < 0|] ==> b \<le> (a::'a::ordered_field)" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1195 | apply (rule classical) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1196 | apply (subgoal_tac "a < 0") | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1197 | prefer 2 apply (force simp add: linorder_not_le intro: order_less_trans) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1198 | apply (insert inverse_le_imp_le [of "-b" "-a"]) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1199 | apply (simp add: order_less_imp_not_eq nonzero_inverse_minus_eq) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1200 | done | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1201 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1202 | lemma less_imp_inverse_less_neg: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1203 | "[|a < b; b < 0|] ==> inverse b < inverse (a::'a::ordered_field)" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1204 | apply (subgoal_tac "a < 0") | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1205 | prefer 2 apply (blast intro: order_less_trans) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1206 | apply (insert less_imp_inverse_less [of "-b" "-a"]) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1207 | apply (simp add: order_less_imp_not_eq nonzero_inverse_minus_eq) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1208 | done | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1209 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1210 | lemma inverse_less_imp_less_neg: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1211 | "[|inverse a < inverse b; b < 0|] ==> b < (a::'a::ordered_field)" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1212 | apply (rule classical) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1213 | apply (subgoal_tac "a < 0") | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1214 | prefer 2 | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1215 | apply (force simp add: linorder_not_less intro: order_le_less_trans) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1216 | apply (insert inverse_less_imp_less [of "-b" "-a"]) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1217 | apply (simp add: order_less_imp_not_eq nonzero_inverse_minus_eq) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1218 | done | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1219 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1220 | lemma inverse_less_iff_less_neg [simp]: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1221 | "[|a < 0; b < 0|] | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1222 | ==> (inverse a < inverse b) = (b < (a::'a::ordered_field))" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1223 | apply (insert inverse_less_iff_less [of "-b" "-a"]) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1224 | apply (simp del: inverse_less_iff_less | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1225 | add: order_less_imp_not_eq nonzero_inverse_minus_eq) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1226 | done | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1227 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1228 | lemma le_imp_inverse_le_neg: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1229 | "[|a \<le> b; b < 0|] ==> inverse b \<le> inverse (a::'a::ordered_field)" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1230 | by (force simp add: order_le_less less_imp_inverse_less_neg) | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1231 | |
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1232 | lemma inverse_le_iff_le_neg [simp]: | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1233 | "[|a < 0; b < 0|] | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1234 | ==> (inverse a \<le> inverse b) = (b \<le> (a::'a::ordered_field))" | 
| 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 paulson parents: 
14267diff
changeset | 1235 | by (blast intro: le_imp_inverse_le_neg dest: inverse_le_imp_le_neg) | 
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 1236 | |
| 14277 
ad66687ece6e
more field division lemmas transferred from Real to Ring_and_Field
 paulson parents: 
14272diff
changeset | 1237 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1238 | subsection{*Inverses and the Number One*}
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1239 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1240 | lemma one_less_inverse_iff: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1241 |     "(1 < inverse x) = (0 < x & x < (1::'a::{ordered_field,division_by_zero}))"proof cases
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1242 | assume "0 < x" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1243 | with inverse_less_iff_less [OF zero_less_one, of x] | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1244 | show ?thesis by simp | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1245 | next | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1246 | assume notless: "~ (0 < x)" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1247 | have "~ (1 < inverse x)" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1248 | proof | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1249 | assume "1 < inverse x" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1250 | also with notless have "... \<le> 0" by (simp add: linorder_not_less) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1251 | also have "... < 1" by (rule zero_less_one) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1252 | finally show False by auto | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1253 | qed | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1254 | with notless show ?thesis by simp | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1255 | qed | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1256 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1257 | lemma inverse_eq_1_iff [simp]: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1258 |     "(inverse x = 1) = (x = (1::'a::{field,division_by_zero}))"
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1259 | by (insert inverse_eq_iff_eq [of x 1], simp) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1260 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1261 | lemma one_le_inverse_iff: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1262 |    "(1 \<le> inverse x) = (0 < x & x \<le> (1::'a::{ordered_field,division_by_zero}))"
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1263 | by (force simp add: order_le_less one_less_inverse_iff zero_less_one | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1264 | eq_commute [of 1]) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1265 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1266 | lemma inverse_less_1_iff: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1267 |    "(inverse x < 1) = (x \<le> 0 | 1 < (x::'a::{ordered_field,division_by_zero}))"
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1268 | by (simp add: linorder_not_le [symmetric] one_le_inverse_iff) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1269 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1270 | lemma inverse_le_1_iff: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1271 |    "(inverse x \<le> 1) = (x \<le> 0 | 1 \<le> (x::'a::{ordered_field,division_by_zero}))"
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1272 | by (simp add: linorder_not_less [symmetric] one_less_inverse_iff) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1273 | |
| 14288 | 1274 | subsection{*Simplification of Inequalities Involving Literal Divisors*}
 | 
| 1275 | ||
| 1276 | lemma pos_le_divide_eq: "0 < (c::'a::ordered_field) ==> (a \<le> b/c) = (a*c \<le> b)" | |
| 1277 | proof - | |
| 1278 | assume less: "0<c" | |
| 1279 | hence "(a \<le> b/c) = (a*c \<le> (b/c)*c)" | |
| 1280 | by (simp add: mult_le_cancel_right order_less_not_sym [OF less]) | |
| 1281 | also have "... = (a*c \<le> b)" | |
| 1282 | by (simp add: order_less_imp_not_eq2 [OF less] divide_inverse mult_assoc) | |
| 1283 | finally show ?thesis . | |
| 1284 | qed | |
| 1285 | ||
| 1286 | lemma neg_le_divide_eq: "c < (0::'a::ordered_field) ==> (a \<le> b/c) = (b \<le> a*c)" | |
| 1287 | proof - | |
| 1288 | assume less: "c<0" | |
| 1289 | hence "(a \<le> b/c) = ((b/c)*c \<le> a*c)" | |
| 1290 | by (simp add: mult_le_cancel_right order_less_not_sym [OF less]) | |
| 1291 | also have "... = (b \<le> a*c)" | |
| 1292 | by (simp add: order_less_imp_not_eq [OF less] divide_inverse mult_assoc) | |
| 1293 | finally show ?thesis . | |
| 1294 | qed | |
| 1295 | ||
| 1296 | lemma le_divide_eq: | |
| 1297 | "(a \<le> b/c) = | |
| 1298 | (if 0 < c then a*c \<le> b | |
| 1299 | else if c < 0 then b \<le> a*c | |
| 1300 |              else  a \<le> (0::'a::{ordered_field,division_by_zero}))"
 | |
| 1301 | apply (case_tac "c=0", simp) | |
| 1302 | apply (force simp add: pos_le_divide_eq neg_le_divide_eq linorder_neq_iff) | |
| 1303 | done | |
| 1304 | ||
| 1305 | lemma pos_divide_le_eq: "0 < (c::'a::ordered_field) ==> (b/c \<le> a) = (b \<le> a*c)" | |
| 1306 | proof - | |
| 1307 | assume less: "0<c" | |
| 1308 | hence "(b/c \<le> a) = ((b/c)*c \<le> a*c)" | |
| 1309 | by (simp add: mult_le_cancel_right order_less_not_sym [OF less]) | |
| 1310 | also have "... = (b \<le> a*c)" | |
| 1311 | by (simp add: order_less_imp_not_eq2 [OF less] divide_inverse mult_assoc) | |
| 1312 | finally show ?thesis . | |
| 1313 | qed | |
| 1314 | ||
| 1315 | lemma neg_divide_le_eq: "c < (0::'a::ordered_field) ==> (b/c \<le> a) = (a*c \<le> b)" | |
| 1316 | proof - | |
| 1317 | assume less: "c<0" | |
| 1318 | hence "(b/c \<le> a) = (a*c \<le> (b/c)*c)" | |
| 1319 | by (simp add: mult_le_cancel_right order_less_not_sym [OF less]) | |
| 1320 | also have "... = (a*c \<le> b)" | |
| 1321 | by (simp add: order_less_imp_not_eq [OF less] divide_inverse mult_assoc) | |
| 1322 | finally show ?thesis . | |
| 1323 | qed | |
| 1324 | ||
| 1325 | lemma divide_le_eq: | |
| 1326 | "(b/c \<le> a) = | |
| 1327 | (if 0 < c then b \<le> a*c | |
| 1328 | else if c < 0 then a*c \<le> b | |
| 1329 |              else 0 \<le> (a::'a::{ordered_field,division_by_zero}))"
 | |
| 1330 | apply (case_tac "c=0", simp) | |
| 1331 | apply (force simp add: pos_divide_le_eq neg_divide_le_eq linorder_neq_iff) | |
| 1332 | done | |
| 1333 | ||
| 1334 | lemma pos_less_divide_eq: | |
| 1335 | "0 < (c::'a::ordered_field) ==> (a < b/c) = (a*c < b)" | |
| 1336 | proof - | |
| 1337 | assume less: "0<c" | |
| 1338 | hence "(a < b/c) = (a*c < (b/c)*c)" | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1339 | by (simp add: mult_less_cancel_right_disj order_less_not_sym [OF less]) | 
| 14288 | 1340 | also have "... = (a*c < b)" | 
| 1341 | by (simp add: order_less_imp_not_eq2 [OF less] divide_inverse mult_assoc) | |
| 1342 | finally show ?thesis . | |
| 1343 | qed | |
| 1344 | ||
| 1345 | lemma neg_less_divide_eq: | |
| 1346 | "c < (0::'a::ordered_field) ==> (a < b/c) = (b < a*c)" | |
| 1347 | proof - | |
| 1348 | assume less: "c<0" | |
| 1349 | hence "(a < b/c) = ((b/c)*c < a*c)" | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1350 | by (simp add: mult_less_cancel_right_disj order_less_not_sym [OF less]) | 
| 14288 | 1351 | also have "... = (b < a*c)" | 
| 1352 | by (simp add: order_less_imp_not_eq [OF less] divide_inverse mult_assoc) | |
| 1353 | finally show ?thesis . | |
| 1354 | qed | |
| 1355 | ||
| 1356 | lemma less_divide_eq: | |
| 1357 | "(a < b/c) = | |
| 1358 | (if 0 < c then a*c < b | |
| 1359 | else if c < 0 then b < a*c | |
| 1360 |              else  a < (0::'a::{ordered_field,division_by_zero}))"
 | |
| 1361 | apply (case_tac "c=0", simp) | |
| 1362 | apply (force simp add: pos_less_divide_eq neg_less_divide_eq linorder_neq_iff) | |
| 1363 | done | |
| 1364 | ||
| 1365 | lemma pos_divide_less_eq: | |
| 1366 | "0 < (c::'a::ordered_field) ==> (b/c < a) = (b < a*c)" | |
| 1367 | proof - | |
| 1368 | assume less: "0<c" | |
| 1369 | hence "(b/c < a) = ((b/c)*c < a*c)" | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1370 | by (simp add: mult_less_cancel_right_disj order_less_not_sym [OF less]) | 
| 14288 | 1371 | also have "... = (b < a*c)" | 
| 1372 | by (simp add: order_less_imp_not_eq2 [OF less] divide_inverse mult_assoc) | |
| 1373 | finally show ?thesis . | |
| 1374 | qed | |
| 1375 | ||
| 1376 | lemma neg_divide_less_eq: | |
| 1377 | "c < (0::'a::ordered_field) ==> (b/c < a) = (a*c < b)" | |
| 1378 | proof - | |
| 1379 | assume less: "c<0" | |
| 1380 | hence "(b/c < a) = (a*c < (b/c)*c)" | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1381 | by (simp add: mult_less_cancel_right_disj order_less_not_sym [OF less]) | 
| 14288 | 1382 | also have "... = (a*c < b)" | 
| 1383 | by (simp add: order_less_imp_not_eq [OF less] divide_inverse mult_assoc) | |
| 1384 | finally show ?thesis . | |
| 1385 | qed | |
| 1386 | ||
| 1387 | lemma divide_less_eq: | |
| 1388 | "(b/c < a) = | |
| 1389 | (if 0 < c then b < a*c | |
| 1390 | else if c < 0 then a*c < b | |
| 1391 |              else 0 < (a::'a::{ordered_field,division_by_zero}))"
 | |
| 1392 | apply (case_tac "c=0", simp) | |
| 1393 | apply (force simp add: pos_divide_less_eq neg_divide_less_eq linorder_neq_iff) | |
| 1394 | done | |
| 1395 | ||
| 1396 | lemma nonzero_eq_divide_eq: "c\<noteq>0 ==> ((a::'a::field) = b/c) = (a*c = b)" | |
| 1397 | proof - | |
| 1398 | assume [simp]: "c\<noteq>0" | |
| 1399 | have "(a = b/c) = (a*c = (b/c)*c)" | |
| 1400 | by (simp add: field_mult_cancel_right) | |
| 1401 | also have "... = (a*c = b)" | |
| 1402 | by (simp add: divide_inverse mult_assoc) | |
| 1403 | finally show ?thesis . | |
| 1404 | qed | |
| 1405 | ||
| 1406 | lemma eq_divide_eq: | |
| 1407 |   "((a::'a::{field,division_by_zero}) = b/c) = (if c\<noteq>0 then a*c = b else a=0)"
 | |
| 1408 | by (simp add: nonzero_eq_divide_eq) | |
| 1409 | ||
| 1410 | lemma nonzero_divide_eq_eq: "c\<noteq>0 ==> (b/c = (a::'a::field)) = (b = a*c)" | |
| 1411 | proof - | |
| 1412 | assume [simp]: "c\<noteq>0" | |
| 1413 | have "(b/c = a) = ((b/c)*c = a*c)" | |
| 1414 | by (simp add: field_mult_cancel_right) | |
| 1415 | also have "... = (b = a*c)" | |
| 1416 | by (simp add: divide_inverse mult_assoc) | |
| 1417 | finally show ?thesis . | |
| 1418 | qed | |
| 1419 | ||
| 1420 | lemma divide_eq_eq: | |
| 1421 |   "(b/c = (a::'a::{field,division_by_zero})) = (if c\<noteq>0 then b = a*c else a=0)"
 | |
| 1422 | by (force simp add: nonzero_divide_eq_eq) | |
| 1423 | ||
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1424 | lemma divide_eq_imp: "(c::'a::{division_by_zero,field}) ~= 0 ==>
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1425 | b = a * c ==> b / c = a" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1426 | by (subst divide_eq_eq, simp) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1427 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1428 | lemma eq_divide_imp: "(c::'a::{division_by_zero,field}) ~= 0 ==>
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1429 | a * c = b ==> a = b / c" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1430 | by (subst eq_divide_eq, simp) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1431 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1432 | lemma frac_eq_eq: "(y::'a::field) ~= 0 ==> z ~= 0 ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1433 | (x / y = w / z) = (x * z = w * y)" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1434 | apply (subst nonzero_eq_divide_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1435 | apply assumption | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1436 | apply (subst times_divide_eq_left) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1437 | apply (erule nonzero_divide_eq_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1438 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1439 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1440 | subsection{*Division and Signs*}
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1441 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1442 | lemma zero_less_divide_iff: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1443 |      "((0::'a::{ordered_field,division_by_zero}) < a/b) = (0 < a & 0 < b | a < 0 & b < 0)"
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1444 | by (simp add: divide_inverse zero_less_mult_iff) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1445 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1446 | lemma divide_less_0_iff: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1447 |      "(a/b < (0::'a::{ordered_field,division_by_zero})) = 
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1448 | (0 < a & b < 0 | a < 0 & 0 < b)" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1449 | by (simp add: divide_inverse mult_less_0_iff) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1450 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1451 | lemma zero_le_divide_iff: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1452 |      "((0::'a::{ordered_field,division_by_zero}) \<le> a/b) =
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1453 | (0 \<le> a & 0 \<le> b | a \<le> 0 & b \<le> 0)" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1454 | by (simp add: divide_inverse zero_le_mult_iff) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1455 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1456 | lemma divide_le_0_iff: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1457 |      "(a/b \<le> (0::'a::{ordered_field,division_by_zero})) =
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1458 | (0 \<le> a & b \<le> 0 | a \<le> 0 & 0 \<le> b)" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1459 | by (simp add: divide_inverse mult_le_0_iff) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1460 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1461 | lemma divide_eq_0_iff [simp]: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1462 |      "(a/b = 0) = (a=0 | b=(0::'a::{field,division_by_zero}))"
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1463 | by (simp add: divide_inverse field_mult_eq_0_iff) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1464 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1465 | lemma divide_pos_pos: "0 < (x::'a::ordered_field) ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1466 | 0 < y ==> 0 < x / y" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1467 | apply (subst pos_less_divide_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1468 | apply assumption | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1469 | apply simp | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1470 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1471 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1472 | lemma divide_nonneg_pos: "0 <= (x::'a::ordered_field) ==> 0 < y ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1473 | 0 <= x / y" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1474 | apply (subst pos_le_divide_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1475 | apply assumption | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1476 | apply simp | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1477 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1478 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1479 | lemma divide_neg_pos: "(x::'a::ordered_field) < 0 ==> 0 < y ==> x / y < 0" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1480 | apply (subst pos_divide_less_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1481 | apply assumption | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1482 | apply simp | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1483 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1484 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1485 | lemma divide_nonpos_pos: "(x::'a::ordered_field) <= 0 ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1486 | 0 < y ==> x / y <= 0" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1487 | apply (subst pos_divide_le_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1488 | apply assumption | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1489 | apply simp | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1490 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1491 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1492 | lemma divide_pos_neg: "0 < (x::'a::ordered_field) ==> y < 0 ==> x / y < 0" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1493 | apply (subst neg_divide_less_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1494 | apply assumption | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1495 | apply simp | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1496 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1497 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1498 | lemma divide_nonneg_neg: "0 <= (x::'a::ordered_field) ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1499 | y < 0 ==> x / y <= 0" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1500 | apply (subst neg_divide_le_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1501 | apply assumption | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1502 | apply simp | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1503 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1504 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1505 | lemma divide_neg_neg: "(x::'a::ordered_field) < 0 ==> y < 0 ==> 0 < x / y" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1506 | apply (subst neg_less_divide_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1507 | apply assumption | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1508 | apply simp | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1509 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1510 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1511 | lemma divide_nonpos_neg: "(x::'a::ordered_field) <= 0 ==> y < 0 ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1512 | 0 <= x / y" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1513 | apply (subst neg_le_divide_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1514 | apply assumption | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1515 | apply simp | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1516 | done | 
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1517 | |
| 14288 | 1518 | subsection{*Cancellation Laws for Division*}
 | 
| 1519 | ||
| 1520 | lemma divide_cancel_right [simp]: | |
| 1521 |      "(a/c = b/c) = (c = 0 | a = (b::'a::{field,division_by_zero}))"
 | |
| 1522 | apply (case_tac "c=0", simp) | |
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 1523 | apply (simp add: divide_inverse field_mult_cancel_right) | 
| 14288 | 1524 | done | 
| 1525 | ||
| 1526 | lemma divide_cancel_left [simp]: | |
| 1527 |      "(c/a = c/b) = (c = 0 | a = (b::'a::{field,division_by_zero}))" 
 | |
| 1528 | apply (case_tac "c=0", simp) | |
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14421diff
changeset | 1529 | apply (simp add: divide_inverse field_mult_cancel_left) | 
| 14288 | 1530 | done | 
| 1531 | ||
| 14353 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1532 | subsection {* Division and the Number One *}
 | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1533 | |
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1534 | text{*Simplify expressions equated with 1*}
 | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1535 | lemma divide_eq_1_iff [simp]: | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1536 |      "(a/b = 1) = (b \<noteq> 0 & a = (b::'a::{field,division_by_zero}))"
 | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1537 | apply (case_tac "b=0", simp) | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1538 | apply (simp add: right_inverse_eq) | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1539 | done | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1540 | |
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1541 | lemma one_eq_divide_iff [simp]: | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1542 |      "(1 = a/b) = (b \<noteq> 0 & a = (b::'a::{field,division_by_zero}))"
 | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1543 | by (simp add: eq_commute [of 1]) | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1544 | |
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1545 | lemma zero_eq_1_divide_iff [simp]: | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1546 |      "((0::'a::{ordered_field,division_by_zero}) = 1/a) = (a = 0)"
 | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1547 | apply (case_tac "a=0", simp) | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1548 | apply (auto simp add: nonzero_eq_divide_eq) | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1549 | done | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1550 | |
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1551 | lemma one_divide_eq_0_iff [simp]: | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1552 |      "(1/a = (0::'a::{ordered_field,division_by_zero})) = (a = 0)"
 | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1553 | apply (case_tac "a=0", simp) | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1554 | apply (insert zero_neq_one [THEN not_sym]) | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1555 | apply (auto simp add: nonzero_divide_eq_eq) | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1556 | done | 
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1557 | |
| 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1558 | text{*Simplify expressions such as @{text "0 < 1/x"} to @{text "0 < x"}*}
 | 
| 18623 | 1559 | lemmas zero_less_divide_1_iff = zero_less_divide_iff [of 1, simplified] | 
| 1560 | lemmas divide_less_0_1_iff = divide_less_0_iff [of 1, simplified] | |
| 1561 | lemmas zero_le_divide_1_iff = zero_le_divide_iff [of 1, simplified] | |
| 1562 | lemmas divide_le_0_1_iff = divide_le_0_iff [of 1, simplified] | |
| 17085 | 1563 | |
| 1564 | declare zero_less_divide_1_iff [simp] | |
| 1565 | declare divide_less_0_1_iff [simp] | |
| 1566 | declare zero_le_divide_1_iff [simp] | |
| 1567 | declare divide_le_0_1_iff [simp] | |
| 14353 
79f9fbef9106
Added lemmas to Ring_and_Field with slightly modified simplification rules
 paulson parents: 
14348diff
changeset | 1568 | |
| 14293 | 1569 | subsection {* Ordering Rules for Division *}
 | 
| 1570 | ||
| 1571 | lemma divide_strict_right_mono: | |
| 1572 | "[|a < b; 0 < c|] ==> a / c < b / (c::'a::ordered_field)" | |
| 1573 | by (simp add: order_less_imp_not_eq2 divide_inverse mult_strict_right_mono | |
| 1574 | positive_imp_inverse_positive) | |
| 1575 | ||
| 1576 | lemma divide_right_mono: | |
| 1577 |      "[|a \<le> b; 0 \<le> c|] ==> a/c \<le> b/(c::'a::{ordered_field,division_by_zero})"
 | |
| 1578 | by (force simp add: divide_strict_right_mono order_le_less) | |
| 1579 | ||
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1580 | lemma divide_right_mono_neg: "(a::'a::{division_by_zero,ordered_field}) <= b 
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1581 | ==> c <= 0 ==> b / c <= a / c" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1582 | apply (drule divide_right_mono [of _ _ "- c"]) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1583 | apply auto | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1584 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1585 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1586 | lemma divide_strict_right_mono_neg: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1587 | "[|b < a; c < 0|] ==> a / c < b / (c::'a::ordered_field)" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1588 | apply (drule divide_strict_right_mono [of _ _ "-c"], simp) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1589 | apply (simp add: order_less_imp_not_eq nonzero_minus_divide_right [symmetric]) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1590 | done | 
| 14293 | 1591 | |
| 1592 | text{*The last premise ensures that @{term a} and @{term b} 
 | |
| 1593 | have the same sign*} | |
| 1594 | lemma divide_strict_left_mono: | |
| 1595 | "[|b < a; 0 < c; 0 < a*b|] ==> c / a < c / (b::'a::ordered_field)" | |
| 1596 | by (force simp add: zero_less_mult_iff divide_inverse mult_strict_left_mono | |
| 1597 | order_less_imp_not_eq order_less_imp_not_eq2 | |
| 1598 | less_imp_inverse_less less_imp_inverse_less_neg) | |
| 1599 | ||
| 1600 | lemma divide_left_mono: | |
| 1601 | "[|b \<le> a; 0 \<le> c; 0 < a*b|] ==> c / a \<le> c / (b::'a::ordered_field)" | |
| 1602 | apply (subgoal_tac "a \<noteq> 0 & b \<noteq> 0") | |
| 1603 | prefer 2 | |
| 1604 | apply (force simp add: zero_less_mult_iff order_less_imp_not_eq) | |
| 1605 | apply (case_tac "c=0", simp add: divide_inverse) | |
| 1606 | apply (force simp add: divide_strict_left_mono order_le_less) | |
| 1607 | done | |
| 1608 | ||
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1609 | lemma divide_left_mono_neg: "(a::'a::{division_by_zero,ordered_field}) <= b 
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1610 | ==> c <= 0 ==> 0 < a * b ==> c / a <= c / b" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1611 | apply (drule divide_left_mono [of _ _ "- c"]) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1612 | apply (auto simp add: mult_commute) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1613 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1614 | |
| 14293 | 1615 | lemma divide_strict_left_mono_neg: | 
| 1616 | "[|a < b; c < 0; 0 < a*b|] ==> c / a < c / (b::'a::ordered_field)" | |
| 1617 | apply (subgoal_tac "a \<noteq> 0 & b \<noteq> 0") | |
| 1618 | prefer 2 | |
| 1619 | apply (force simp add: zero_less_mult_iff order_less_imp_not_eq) | |
| 1620 | apply (drule divide_strict_left_mono [of _ _ "-c"]) | |
| 1621 | apply (simp_all add: mult_commute nonzero_minus_divide_left [symmetric]) | |
| 1622 | done | |
| 1623 | ||
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1624 | text{*Simplify quotients that are compared with the value 1.*}
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1625 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1626 | lemma le_divide_eq_1: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1627 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1628 | shows "(1 \<le> b / a) = ((0 < a & a \<le> b) | (a < 0 & b \<le> a))" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1629 | by (auto simp add: le_divide_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1630 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1631 | lemma divide_le_eq_1: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1632 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1633 | shows "(b / a \<le> 1) = ((0 < a & b \<le> a) | (a < 0 & a \<le> b) | a=0)" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1634 | by (auto simp add: divide_le_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1635 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1636 | lemma less_divide_eq_1: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1637 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1638 | shows "(1 < b / a) = ((0 < a & a < b) | (a < 0 & b < a))" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1639 | by (auto simp add: less_divide_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1640 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1641 | lemma divide_less_eq_1: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1642 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1643 | shows "(b / a < 1) = ((0 < a & b < a) | (a < 0 & a < b) | a=0)" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1644 | by (auto simp add: divide_less_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1645 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1646 | subsection{*Conditional Simplification Rules: No Case Splits*}
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1647 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1648 | lemma le_divide_eq_1_pos [simp]: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1649 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 18649 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1650 | shows "0 < a \<Longrightarrow> (1 \<le> b/a) = (a \<le> b)" | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1651 | by (auto simp add: le_divide_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1652 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1653 | lemma le_divide_eq_1_neg [simp]: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1654 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 18649 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1655 | shows "a < 0 \<Longrightarrow> (1 \<le> b/a) = (b \<le> a)" | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1656 | by (auto simp add: le_divide_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1657 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1658 | lemma divide_le_eq_1_pos [simp]: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1659 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 18649 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1660 | shows "0 < a \<Longrightarrow> (b/a \<le> 1) = (b \<le> a)" | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1661 | by (auto simp add: divide_le_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1662 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1663 | lemma divide_le_eq_1_neg [simp]: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1664 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 18649 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1665 | shows "a < 0 \<Longrightarrow> (b/a \<le> 1) = (a \<le> b)" | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1666 | by (auto simp add: divide_le_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1667 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1668 | lemma less_divide_eq_1_pos [simp]: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1669 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 18649 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1670 | shows "0 < a \<Longrightarrow> (1 < b/a) = (a < b)" | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1671 | by (auto simp add: less_divide_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1672 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1673 | lemma less_divide_eq_1_neg [simp]: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1674 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 18649 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1675 | shows "a < 0 \<Longrightarrow> (1 < b/a) = (b < a)" | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1676 | by (auto simp add: less_divide_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1677 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1678 | lemma divide_less_eq_1_pos [simp]: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1679 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 18649 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1680 | shows "0 < a \<Longrightarrow> (b/a < 1) = (b < a)" | 
| 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1681 | by (auto simp add: divide_less_eq) | 
| 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1682 | |
| 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1683 | lemma divide_less_eq_1_neg [simp]: | 
| 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1684 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1685 | shows "a < 0 \<Longrightarrow> b/a < 1 <-> a < b" | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1686 | by (auto simp add: divide_less_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1687 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1688 | lemma eq_divide_eq_1 [simp]: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1689 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 18649 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1690 | shows "(1 = b/a) = ((a \<noteq> 0 & a = b))" | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1691 | by (auto simp add: eq_divide_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1692 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1693 | lemma divide_eq_eq_1 [simp]: | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1694 |   fixes a :: "'a :: {ordered_field,division_by_zero}"
 | 
| 18649 
bb99c2e705ca
tidied, and added missing thm divide_less_eq_1_neg
 paulson parents: 
18623diff
changeset | 1695 | shows "(b/a = 1) = ((a \<noteq> 0 & a = b))" | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1696 | by (auto simp add: divide_eq_eq) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1697 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1698 | subsection {* Reasoning about inequalities with division *}
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1699 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1700 | lemma mult_right_le_one_le: "0 <= (x::'a::ordered_idom) ==> 0 <= y ==> y <= 1 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1701 | ==> x * y <= x" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1702 | by (auto simp add: mult_compare_simps); | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1703 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1704 | lemma mult_left_le_one_le: "0 <= (x::'a::ordered_idom) ==> 0 <= y ==> y <= 1 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1705 | ==> y * x <= x" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1706 | by (auto simp add: mult_compare_simps); | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1707 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1708 | lemma mult_imp_div_pos_le: "0 < (y::'a::ordered_field) ==> x <= z * y ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1709 | x / y <= z"; | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1710 | by (subst pos_divide_le_eq, assumption+); | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1711 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1712 | lemma mult_imp_le_div_pos: "0 < (y::'a::ordered_field) ==> z * y <= x ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1713 | z <= x / y"; | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1714 | by (subst pos_le_divide_eq, assumption+) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1715 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1716 | lemma mult_imp_div_pos_less: "0 < (y::'a::ordered_field) ==> x < z * y ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1717 | x / y < z" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1718 | by (subst pos_divide_less_eq, assumption+) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1719 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1720 | lemma mult_imp_less_div_pos: "0 < (y::'a::ordered_field) ==> z * y < x ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1721 | z < x / y" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1722 | by (subst pos_less_divide_eq, assumption+) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1723 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1724 | lemma frac_le: "(0::'a::ordered_field) <= x ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1725 | x <= y ==> 0 < w ==> w <= z ==> x / z <= y / w" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1726 | apply (rule mult_imp_div_pos_le) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1727 | apply simp; | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1728 | apply (subst times_divide_eq_left); | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1729 | apply (rule mult_imp_le_div_pos, assumption) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1730 | apply (rule mult_mono) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1731 | apply simp_all | 
| 14293 | 1732 | done | 
| 1733 | ||
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1734 | lemma frac_less: "(0::'a::ordered_field) <= x ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1735 | x < y ==> 0 < w ==> w <= z ==> x / z < y / w" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1736 | apply (rule mult_imp_div_pos_less) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1737 | apply simp; | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1738 | apply (subst times_divide_eq_left); | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1739 | apply (rule mult_imp_less_div_pos, assumption) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1740 | apply (erule mult_less_le_imp_less) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1741 | apply simp_all | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1742 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1743 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1744 | lemma frac_less2: "(0::'a::ordered_field) < x ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1745 | x <= y ==> 0 < w ==> w < z ==> x / z < y / w" | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1746 | apply (rule mult_imp_div_pos_less) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1747 | apply simp_all | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1748 | apply (subst times_divide_eq_left); | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1749 | apply (rule mult_imp_less_div_pos, assumption) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1750 | apply (erule mult_le_less_imp_less) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1751 | apply simp_all | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1752 | done | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1753 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1754 | lemmas times_divide_eq = times_divide_eq_right times_divide_eq_left | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1755 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1756 | text{*It's not obvious whether these should be simprules or not. 
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1757 | Their effect is to gather terms into one big fraction, like | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1758 | a*b*c / x*y*z. The rationale for that is unclear, but many proofs | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1759 | seem to need them.*} | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1760 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1761 | declare times_divide_eq [simp] | 
| 14293 | 1762 | |
| 1763 | subsection {* Ordered Fields are Dense *}
 | |
| 1764 | ||
| 14738 | 1765 | lemma less_add_one: "a < (a+1::'a::ordered_semidom)" | 
| 14293 | 1766 | proof - | 
| 14738 | 1767 | have "a+0 < (a+1::'a::ordered_semidom)" | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1768 | by (blast intro: zero_less_one add_strict_left_mono) | 
| 14293 | 1769 | thus ?thesis by simp | 
| 1770 | qed | |
| 1771 | ||
| 14738 | 1772 | lemma zero_less_two: "0 < (1+1::'a::ordered_semidom)" | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1773 | by (blast intro: order_less_trans zero_less_one less_add_one) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14353diff
changeset | 1774 | |
| 14293 | 1775 | lemma less_half_sum: "a < b ==> a < (a+b) / (1+1::'a::ordered_field)" | 
| 1776 | by (simp add: zero_less_two pos_less_divide_eq right_distrib) | |
| 1777 | ||
| 1778 | lemma gt_half_sum: "a < b ==> (a+b)/(1+1::'a::ordered_field) < b" | |
| 1779 | by (simp add: zero_less_two pos_divide_less_eq right_distrib) | |
| 1780 | ||
| 1781 | lemma dense: "a < b ==> \<exists>r::'a::ordered_field. a < r & r < b" | |
| 1782 | by (blast intro!: less_half_sum gt_half_sum) | |
| 1783 | ||
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1784 | |
| 14293 | 1785 | subsection {* Absolute Value *}
 | 
| 1786 | ||
| 14738 | 1787 | lemma abs_one [simp]: "abs 1 = (1::'a::ordered_idom)" | 
| 14294 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1788 | by (simp add: abs_if zero_less_one [THEN order_less_not_sym]) | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1789 | |
| 14738 | 1790 | lemma abs_le_mult: "abs (a * b) \<le> (abs a) * (abs (b::'a::lordered_ring))" | 
| 1791 | proof - | |
| 1792 | let ?x = "pprt a * pprt b - pprt a * nprt b - nprt a * pprt b + nprt a * nprt b" | |
| 1793 | let ?y = "pprt a * pprt b + pprt a * nprt b + nprt a * pprt b + nprt a * nprt b" | |
| 1794 | have a: "(abs a) * (abs b) = ?x" | |
| 1795 | by (simp only: abs_prts[of a] abs_prts[of b] ring_eq_simps) | |
| 1796 |   {
 | |
| 1797 | fix u v :: 'a | |
| 15481 | 1798 | have bh: "\<lbrakk>u = a; v = b\<rbrakk> \<Longrightarrow> | 
| 1799 | u * v = pprt a * pprt b + pprt a * nprt b + | |
| 1800 | nprt a * pprt b + nprt a * nprt b" | |
| 14738 | 1801 | apply (subst prts[of u], subst prts[of v]) | 
| 1802 | apply (simp add: left_distrib right_distrib add_ac) | |
| 1803 | done | |
| 1804 | } | |
| 1805 | note b = this[OF refl[of a] refl[of b]] | |
| 1806 | note addm = add_mono[of "0::'a" _ "0::'a", simplified] | |
| 1807 | note addm2 = add_mono[of _ "0::'a" _ "0::'a", simplified] | |
| 1808 | have xy: "- ?x <= ?y" | |
| 14754 
a080eeeaec14
Modification / Installation of Provers/Arith/abel_cancel.ML for OrderedGroup.thy
 obua parents: 
14738diff
changeset | 1809 | apply (simp) | 
| 
a080eeeaec14
Modification / Installation of Provers/Arith/abel_cancel.ML for OrderedGroup.thy
 obua parents: 
14738diff
changeset | 1810 | apply (rule_tac y="0::'a" in order_trans) | 
| 16568 | 1811 | apply (rule addm2) | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1812 | apply (simp_all add: mult_nonneg_nonneg mult_nonpos_nonpos) | 
| 16568 | 1813 | apply (rule addm) | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1814 | apply (simp_all add: mult_nonneg_nonneg mult_nonpos_nonpos) | 
| 14754 
a080eeeaec14
Modification / Installation of Provers/Arith/abel_cancel.ML for OrderedGroup.thy
 obua parents: 
14738diff
changeset | 1815 | done | 
| 14738 | 1816 | have yx: "?y <= ?x" | 
| 16568 | 1817 | apply (simp add:diff_def) | 
| 14754 
a080eeeaec14
Modification / Installation of Provers/Arith/abel_cancel.ML for OrderedGroup.thy
 obua parents: 
14738diff
changeset | 1818 | apply (rule_tac y=0 in order_trans) | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1819 | apply (rule addm2, (simp add: mult_nonneg_nonpos mult_nonneg_nonpos2)+) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1820 | apply (rule addm, (simp add: mult_nonneg_nonpos mult_nonneg_nonpos2)+) | 
| 14738 | 1821 | done | 
| 1822 | have i1: "a*b <= abs a * abs b" by (simp only: a b yx) | |
| 1823 | have i2: "- (abs a * abs b) <= a*b" by (simp only: a b xy) | |
| 1824 | show ?thesis | |
| 1825 | apply (rule abs_leI) | |
| 1826 | apply (simp add: i1) | |
| 1827 | apply (simp add: i2[simplified minus_le_iff]) | |
| 1828 | done | |
| 1829 | qed | |
| 14294 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1830 | |
| 14738 | 1831 | lemma abs_eq_mult: | 
| 1832 | assumes "(0 \<le> a \<or> a \<le> 0) \<and> (0 \<le> b \<or> b \<le> 0)" | |
| 1833 | shows "abs (a*b) = abs a * abs (b::'a::lordered_ring)" | |
| 1834 | proof - | |
| 1835 | have s: "(0 <= a*b) | (a*b <= 0)" | |
| 1836 | apply (auto) | |
| 1837 | apply (rule_tac split_mult_pos_le) | |
| 1838 | apply (rule_tac contrapos_np[of "a*b <= 0"]) | |
| 1839 | apply (simp) | |
| 1840 | apply (rule_tac split_mult_neg_le) | |
| 1841 | apply (insert prems) | |
| 1842 | apply (blast) | |
| 1843 | done | |
| 1844 | have mulprts: "a * b = (pprt a + nprt a) * (pprt b + nprt b)" | |
| 1845 | by (simp add: prts[symmetric]) | |
| 1846 | show ?thesis | |
| 1847 | proof cases | |
| 1848 | assume "0 <= a * b" | |
| 1849 | then show ?thesis | |
| 1850 | apply (simp_all add: mulprts abs_prts) | |
| 1851 | apply (insert prems) | |
| 14754 
a080eeeaec14
Modification / Installation of Provers/Arith/abel_cancel.ML for OrderedGroup.thy
 obua parents: 
14738diff
changeset | 1852 | apply (auto simp add: | 
| 
a080eeeaec14
Modification / Installation of Provers/Arith/abel_cancel.ML for OrderedGroup.thy
 obua parents: 
14738diff
changeset | 1853 | ring_eq_simps | 
| 
a080eeeaec14
Modification / Installation of Provers/Arith/abel_cancel.ML for OrderedGroup.thy
 obua parents: 
14738diff
changeset | 1854 | iff2imp[OF zero_le_iff_zero_nprt] iff2imp[OF le_zero_iff_zero_pprt] | 
| 15197 | 1855 | iff2imp[OF le_zero_iff_pprt_id] iff2imp[OF zero_le_iff_nprt_id]) | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1856 | apply(drule (1) mult_nonneg_nonpos[of a b], simp) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1857 | apply(drule (1) mult_nonneg_nonpos2[of b a], simp) | 
| 14738 | 1858 | done | 
| 1859 | next | |
| 1860 | assume "~(0 <= a*b)" | |
| 1861 | with s have "a*b <= 0" by simp | |
| 1862 | then show ?thesis | |
| 1863 | apply (simp_all add: mulprts abs_prts) | |
| 1864 | apply (insert prems) | |
| 15580 | 1865 | apply (auto simp add: ring_eq_simps) | 
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1866 | apply(drule (1) mult_nonneg_nonneg[of a b],simp) | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1867 | apply(drule (1) mult_nonpos_nonpos[of a b],simp) | 
| 14738 | 1868 | done | 
| 1869 | qed | |
| 1870 | qed | |
| 14294 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1871 | |
| 14738 | 1872 | lemma abs_mult: "abs (a * b) = abs a * abs (b::'a::ordered_idom)" | 
| 1873 | by (simp add: abs_eq_mult linorder_linear) | |
| 14293 | 1874 | |
| 14738 | 1875 | lemma abs_mult_self: "abs a * abs a = a * (a::'a::ordered_idom)" | 
| 1876 | by (simp add: abs_if) | |
| 14294 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1877 | |
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1878 | lemma nonzero_abs_inverse: | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1879 | "a \<noteq> 0 ==> abs (inverse (a::'a::ordered_field)) = inverse (abs a)" | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1880 | apply (auto simp add: linorder_neq_iff abs_if nonzero_inverse_minus_eq | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1881 | negative_imp_inverse_negative) | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1882 | apply (blast intro: positive_imp_inverse_positive elim: order_less_asym) | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1883 | done | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1884 | |
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1885 | lemma abs_inverse [simp]: | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1886 |      "abs (inverse (a::'a::{ordered_field,division_by_zero})) = 
 | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1887 | inverse (abs a)" | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1888 | apply (case_tac "a=0", simp) | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1889 | apply (simp add: nonzero_abs_inverse) | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1890 | done | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1891 | |
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1892 | lemma nonzero_abs_divide: | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1893 | "b \<noteq> 0 ==> abs (a / (b::'a::ordered_field)) = abs a / abs b" | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1894 | by (simp add: divide_inverse abs_mult nonzero_abs_inverse) | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1895 | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 1896 | lemma abs_divide [simp]: | 
| 14294 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1897 |      "abs (a / (b::'a::{ordered_field,division_by_zero})) = abs a / abs b"
 | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1898 | apply (case_tac "b=0", simp) | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1899 | apply (simp add: nonzero_abs_divide) | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1900 | done | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1901 | |
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1902 | lemma abs_mult_less: | 
| 14738 | 1903 | "[| abs a < c; abs b < d |] ==> abs a * abs b < c*(d::'a::ordered_idom)" | 
| 14294 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1904 | proof - | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1905 | assume ac: "abs a < c" | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1906 | hence cpos: "0<c" by (blast intro: order_le_less_trans abs_ge_zero) | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1907 | assume "abs b < d" | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1908 | thus ?thesis by (simp add: ac cpos mult_strict_mono) | 
| 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 paulson parents: 
14293diff
changeset | 1909 | qed | 
| 14293 | 1910 | |
| 14738 | 1911 | lemma eq_minus_self_iff: "(a = -a) = (a = (0::'a::ordered_idom))" | 
| 1912 | by (force simp add: order_eq_iff le_minus_self_iff minus_le_self_iff) | |
| 1913 | ||
| 1914 | lemma less_minus_self_iff: "(a < -a) = (a < (0::'a::ordered_idom))" | |
| 1915 | by (simp add: order_less_le le_minus_self_iff eq_minus_self_iff) | |
| 1916 | ||
| 1917 | lemma abs_less_iff: "(abs a < b) = (a < b & -a < (b::'a::ordered_idom))" | |
| 1918 | apply (simp add: order_less_le abs_le_iff) | |
| 1919 | apply (auto simp add: abs_if minus_le_self_iff eq_minus_self_iff) | |
| 1920 | apply (simp add: le_minus_self_iff linorder_neq_iff) | |
| 1921 | done | |
| 1922 | ||
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1923 | lemma abs_mult_pos: "(0::'a::ordered_idom) <= x ==> | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1924 | (abs y) * x = abs (y * x)"; | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1925 | apply (subst abs_mult); | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1926 | apply simp; | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1927 | done; | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1928 | |
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1929 | lemma abs_div_pos: "(0::'a::{division_by_zero,ordered_field}) < y ==> 
 | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1930 | abs x / y = abs (x / y)"; | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1931 | apply (subst abs_divide); | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1932 | apply (simp add: order_less_imp_le); | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1933 | done; | 
| 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 1934 | |
| 19404 | 1935 | subsection {* Bounds of products via negative and positive Part *}
 | 
| 15178 | 1936 | |
| 15580 | 1937 | lemma mult_le_prts: | 
| 1938 | assumes | |
| 1939 | "a1 <= (a::'a::lordered_ring)" | |
| 1940 | "a <= a2" | |
| 1941 | "b1 <= b" | |
| 1942 | "b <= b2" | |
| 1943 | shows | |
| 1944 | "a * b <= pprt a2 * pprt b2 + pprt a1 * nprt b2 + nprt a2 * pprt b1 + nprt a1 * nprt b1" | |
| 1945 | proof - | |
| 1946 | have "a * b = (pprt a + nprt a) * (pprt b + nprt b)" | |
| 1947 | apply (subst prts[symmetric])+ | |
| 1948 | apply simp | |
| 1949 | done | |
| 1950 | then have "a * b = pprt a * pprt b + pprt a * nprt b + nprt a * pprt b + nprt a * nprt b" | |
| 1951 | by (simp add: ring_eq_simps) | |
| 1952 | moreover have "pprt a * pprt b <= pprt a2 * pprt b2" | |
| 1953 | by (simp_all add: prems mult_mono) | |
| 1954 | moreover have "pprt a * nprt b <= pprt a1 * nprt b2" | |
| 1955 | proof - | |
| 1956 | have "pprt a * nprt b <= pprt a * nprt b2" | |
| 1957 | by (simp add: mult_left_mono prems) | |
| 1958 | moreover have "pprt a * nprt b2 <= pprt a1 * nprt b2" | |
| 1959 | by (simp add: mult_right_mono_neg prems) | |
| 1960 | ultimately show ?thesis | |
| 1961 | by simp | |
| 1962 | qed | |
| 1963 | moreover have "nprt a * pprt b <= nprt a2 * pprt b1" | |
| 1964 | proof - | |
| 1965 | have "nprt a * pprt b <= nprt a2 * pprt b" | |
| 1966 | by (simp add: mult_right_mono prems) | |
| 1967 | moreover have "nprt a2 * pprt b <= nprt a2 * pprt b1" | |
| 1968 | by (simp add: mult_left_mono_neg prems) | |
| 1969 | ultimately show ?thesis | |
| 1970 | by simp | |
| 1971 | qed | |
| 1972 | moreover have "nprt a * nprt b <= nprt a1 * nprt b1" | |
| 1973 | proof - | |
| 1974 | have "nprt a * nprt b <= nprt a * nprt b1" | |
| 1975 | by (simp add: mult_left_mono_neg prems) | |
| 1976 | moreover have "nprt a * nprt b1 <= nprt a1 * nprt b1" | |
| 1977 | by (simp add: mult_right_mono_neg prems) | |
| 1978 | ultimately show ?thesis | |
| 1979 | by simp | |
| 1980 | qed | |
| 1981 | ultimately show ?thesis | |
| 1982 | by - (rule add_mono | simp)+ | |
| 1983 | qed | |
| 19404 | 1984 | |
| 1985 | lemma mult_ge_prts: | |
| 15178 | 1986 | assumes | 
| 19404 | 1987 | "a1 <= (a::'a::lordered_ring)" | 
| 1988 | "a <= a2" | |
| 1989 | "b1 <= b" | |
| 1990 | "b <= b2" | |
| 15178 | 1991 | shows | 
| 19404 | 1992 | "a * b >= nprt a1 * pprt b2 + nprt a2 * nprt b2 + pprt a1 * pprt b1 + pprt a2 * nprt b1" | 
| 1993 | proof - | |
| 1994 | from prems have a1:"- a2 <= -a" by auto | |
| 1995 | from prems have a2: "-a <= -a1" by auto | |
| 1996 | from mult_le_prts[of "-a2" "-a" "-a1" "b1" b "b2", OF a1 a2 prems(3) prems(4), simplified nprt_neg pprt_neg] | |
| 1997 | have le: "- (a * b) <= - nprt a1 * pprt b2 + - nprt a2 * nprt b2 + - pprt a1 * pprt b1 + - pprt a2 * nprt b1" by simp | |
| 1998 | then have "-(- nprt a1 * pprt b2 + - nprt a2 * nprt b2 + - pprt a1 * pprt b1 + - pprt a2 * nprt b1) <= a * b" | |
| 1999 | by (simp only: minus_le_iff) | |
| 2000 | then show ?thesis by simp | |
| 15178 | 2001 | qed | 
| 2002 | ||
| 14738 | 2003 | ML {*
 | 
| 14334 | 2004 | val left_distrib = thm "left_distrib"; | 
| 14738 | 2005 | val right_distrib = thm "right_distrib"; | 
| 2006 | val mult_commute = thm "mult_commute"; | |
| 2007 | val distrib = thm "distrib"; | |
| 2008 | val zero_neq_one = thm "zero_neq_one"; | |
| 2009 | val no_zero_divisors = thm "no_zero_divisors"; | |
| 14331 | 2010 | val left_inverse = thm "left_inverse"; | 
| 14738 | 2011 | val divide_inverse = thm "divide_inverse"; | 
| 2012 | val mult_zero_left = thm "mult_zero_left"; | |
| 2013 | val mult_zero_right = thm "mult_zero_right"; | |
| 2014 | val field_mult_eq_0_iff = thm "field_mult_eq_0_iff"; | |
| 2015 | val inverse_zero = thm "inverse_zero"; | |
| 2016 | val ring_distrib = thms "ring_distrib"; | |
| 2017 | val combine_common_factor = thm "combine_common_factor"; | |
| 2018 | val minus_mult_left = thm "minus_mult_left"; | |
| 2019 | val minus_mult_right = thm "minus_mult_right"; | |
| 2020 | val minus_mult_minus = thm "minus_mult_minus"; | |
| 2021 | val minus_mult_commute = thm "minus_mult_commute"; | |
| 2022 | val right_diff_distrib = thm "right_diff_distrib"; | |
| 2023 | val left_diff_distrib = thm "left_diff_distrib"; | |
| 2024 | val mult_left_mono = thm "mult_left_mono"; | |
| 2025 | val mult_right_mono = thm "mult_right_mono"; | |
| 2026 | val mult_strict_left_mono = thm "mult_strict_left_mono"; | |
| 2027 | val mult_strict_right_mono = thm "mult_strict_right_mono"; | |
| 2028 | val mult_mono = thm "mult_mono"; | |
| 2029 | val mult_strict_mono = thm "mult_strict_mono"; | |
| 2030 | val abs_if = thm "abs_if"; | |
| 2031 | val zero_less_one = thm "zero_less_one"; | |
| 2032 | val eq_add_iff1 = thm "eq_add_iff1"; | |
| 2033 | val eq_add_iff2 = thm "eq_add_iff2"; | |
| 2034 | val less_add_iff1 = thm "less_add_iff1"; | |
| 2035 | val less_add_iff2 = thm "less_add_iff2"; | |
| 2036 | val le_add_iff1 = thm "le_add_iff1"; | |
| 2037 | val le_add_iff2 = thm "le_add_iff2"; | |
| 2038 | val mult_left_le_imp_le = thm "mult_left_le_imp_le"; | |
| 2039 | val mult_right_le_imp_le = thm "mult_right_le_imp_le"; | |
| 2040 | val mult_left_less_imp_less = thm "mult_left_less_imp_less"; | |
| 2041 | val mult_right_less_imp_less = thm "mult_right_less_imp_less"; | |
| 2042 | val mult_strict_left_mono_neg = thm "mult_strict_left_mono_neg"; | |
| 2043 | val mult_left_mono_neg = thm "mult_left_mono_neg"; | |
| 2044 | val mult_strict_right_mono_neg = thm "mult_strict_right_mono_neg"; | |
| 2045 | val mult_right_mono_neg = thm "mult_right_mono_neg"; | |
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 2046 | (* | 
| 14738 | 2047 | val mult_pos = thm "mult_pos"; | 
| 2048 | val mult_pos_le = thm "mult_pos_le"; | |
| 2049 | val mult_pos_neg = thm "mult_pos_neg"; | |
| 2050 | val mult_pos_neg_le = thm "mult_pos_neg_le"; | |
| 2051 | val mult_pos_neg2 = thm "mult_pos_neg2"; | |
| 2052 | val mult_pos_neg2_le = thm "mult_pos_neg2_le"; | |
| 2053 | val mult_neg = thm "mult_neg"; | |
| 2054 | val mult_neg_le = thm "mult_neg_le"; | |
| 16775 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 avigad parents: 
16568diff
changeset | 2055 | *) | 
| 14738 | 2056 | val zero_less_mult_pos = thm "zero_less_mult_pos"; | 
| 2057 | val zero_less_mult_pos2 = thm "zero_less_mult_pos2"; | |
| 2058 | val zero_less_mult_iff = thm "zero_less_mult_iff"; | |
| 2059 | val mult_eq_0_iff = thm "mult_eq_0_iff"; | |
| 2060 | val zero_le_mult_iff = thm "zero_le_mult_iff"; | |
| 2061 | val mult_less_0_iff = thm "mult_less_0_iff"; | |
| 2062 | val mult_le_0_iff = thm "mult_le_0_iff"; | |
| 2063 | val split_mult_pos_le = thm "split_mult_pos_le"; | |
| 2064 | val split_mult_neg_le = thm "split_mult_neg_le"; | |
| 2065 | val zero_le_square = thm "zero_le_square"; | |
| 2066 | val zero_le_one = thm "zero_le_one"; | |
| 2067 | val not_one_le_zero = thm "not_one_le_zero"; | |
| 2068 | val not_one_less_zero = thm "not_one_less_zero"; | |
| 2069 | val mult_left_mono_neg = thm "mult_left_mono_neg"; | |
| 2070 | val mult_right_mono_neg = thm "mult_right_mono_neg"; | |
| 2071 | val mult_strict_mono = thm "mult_strict_mono"; | |
| 2072 | val mult_strict_mono' = thm "mult_strict_mono'"; | |
| 2073 | val mult_mono = thm "mult_mono"; | |
| 2074 | val less_1_mult = thm "less_1_mult"; | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 2075 | val mult_less_cancel_right_disj = thm "mult_less_cancel_right_disj"; | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 2076 | val mult_less_cancel_left_disj = thm "mult_less_cancel_left_disj"; | 
| 14738 | 2077 | val mult_less_cancel_right = thm "mult_less_cancel_right"; | 
| 2078 | val mult_less_cancel_left = thm "mult_less_cancel_left"; | |
| 2079 | val mult_le_cancel_right = thm "mult_le_cancel_right"; | |
| 2080 | val mult_le_cancel_left = thm "mult_le_cancel_left"; | |
| 2081 | val mult_less_imp_less_left = thm "mult_less_imp_less_left"; | |
| 2082 | val mult_less_imp_less_right = thm "mult_less_imp_less_right"; | |
| 2083 | val mult_cancel_right = thm "mult_cancel_right"; | |
| 2084 | val mult_cancel_left = thm "mult_cancel_left"; | |
| 2085 | val ring_eq_simps = thms "ring_eq_simps"; | |
| 2086 | val right_inverse = thm "right_inverse"; | |
| 2087 | val right_inverse_eq = thm "right_inverse_eq"; | |
| 2088 | val nonzero_inverse_eq_divide = thm "nonzero_inverse_eq_divide"; | |
| 2089 | val divide_self = thm "divide_self"; | |
| 2090 | val divide_zero = thm "divide_zero"; | |
| 2091 | val divide_zero_left = thm "divide_zero_left"; | |
| 2092 | val inverse_eq_divide = thm "inverse_eq_divide"; | |
| 2093 | val add_divide_distrib = thm "add_divide_distrib"; | |
| 2094 | val field_mult_eq_0_iff = thm "field_mult_eq_0_iff"; | |
| 2095 | val field_mult_cancel_right_lemma = thm "field_mult_cancel_right_lemma"; | |
| 2096 | val field_mult_cancel_right = thm "field_mult_cancel_right"; | |
| 2097 | val field_mult_cancel_left = thm "field_mult_cancel_left"; | |
| 2098 | val nonzero_imp_inverse_nonzero = thm "nonzero_imp_inverse_nonzero"; | |
| 2099 | val inverse_zero_imp_zero = thm "inverse_zero_imp_zero"; | |
| 2100 | val inverse_nonzero_imp_nonzero = thm "inverse_nonzero_imp_nonzero"; | |
| 2101 | val inverse_nonzero_iff_nonzero = thm "inverse_nonzero_iff_nonzero"; | |
| 2102 | val nonzero_inverse_minus_eq = thm "nonzero_inverse_minus_eq"; | |
| 2103 | val inverse_minus_eq = thm "inverse_minus_eq"; | |
| 2104 | val nonzero_inverse_eq_imp_eq = thm "nonzero_inverse_eq_imp_eq"; | |
| 2105 | val inverse_eq_imp_eq = thm "inverse_eq_imp_eq"; | |
| 2106 | val inverse_eq_iff_eq = thm "inverse_eq_iff_eq"; | |
| 2107 | val nonzero_inverse_inverse_eq = thm "nonzero_inverse_inverse_eq"; | |
| 2108 | val inverse_inverse_eq = thm "inverse_inverse_eq"; | |
| 2109 | val inverse_1 = thm "inverse_1"; | |
| 2110 | val nonzero_inverse_mult_distrib = thm "nonzero_inverse_mult_distrib"; | |
| 2111 | val inverse_mult_distrib = thm "inverse_mult_distrib"; | |
| 2112 | val inverse_add = thm "inverse_add"; | |
| 2113 | val inverse_divide = thm "inverse_divide"; | |
| 2114 | val nonzero_mult_divide_cancel_left = thm "nonzero_mult_divide_cancel_left"; | |
| 2115 | val mult_divide_cancel_left = thm "mult_divide_cancel_left"; | |
| 2116 | val nonzero_mult_divide_cancel_right = thm "nonzero_mult_divide_cancel_right"; | |
| 2117 | val mult_divide_cancel_right = thm "mult_divide_cancel_right"; | |
| 2118 | val mult_divide_cancel_eq_if = thm "mult_divide_cancel_eq_if"; | |
| 2119 | val divide_1 = thm "divide_1"; | |
| 2120 | val times_divide_eq_right = thm "times_divide_eq_right"; | |
| 2121 | val times_divide_eq_left = thm "times_divide_eq_left"; | |
| 2122 | val divide_divide_eq_right = thm "divide_divide_eq_right"; | |
| 2123 | val divide_divide_eq_left = thm "divide_divide_eq_left"; | |
| 2124 | val nonzero_minus_divide_left = thm "nonzero_minus_divide_left"; | |
| 2125 | val nonzero_minus_divide_right = thm "nonzero_minus_divide_right"; | |
| 2126 | val nonzero_minus_divide_divide = thm "nonzero_minus_divide_divide"; | |
| 2127 | val minus_divide_left = thm "minus_divide_left"; | |
| 2128 | val minus_divide_right = thm "minus_divide_right"; | |
| 2129 | val minus_divide_divide = thm "minus_divide_divide"; | |
| 2130 | val diff_divide_distrib = thm "diff_divide_distrib"; | |
| 2131 | val positive_imp_inverse_positive = thm "positive_imp_inverse_positive"; | |
| 2132 | val negative_imp_inverse_negative = thm "negative_imp_inverse_negative"; | |
| 2133 | val inverse_le_imp_le = thm "inverse_le_imp_le"; | |
| 2134 | val inverse_positive_imp_positive = thm "inverse_positive_imp_positive"; | |
| 2135 | val inverse_positive_iff_positive = thm "inverse_positive_iff_positive"; | |
| 2136 | val inverse_negative_imp_negative = thm "inverse_negative_imp_negative"; | |
| 2137 | val inverse_negative_iff_negative = thm "inverse_negative_iff_negative"; | |
| 2138 | val inverse_nonnegative_iff_nonnegative = thm "inverse_nonnegative_iff_nonnegative"; | |
| 2139 | val inverse_nonpositive_iff_nonpositive = thm "inverse_nonpositive_iff_nonpositive"; | |
| 2140 | val less_imp_inverse_less = thm "less_imp_inverse_less"; | |
| 2141 | val inverse_less_imp_less = thm "inverse_less_imp_less"; | |
| 2142 | val inverse_less_iff_less = thm "inverse_less_iff_less"; | |
| 2143 | val le_imp_inverse_le = thm "le_imp_inverse_le"; | |
| 2144 | val inverse_le_iff_le = thm "inverse_le_iff_le"; | |
| 2145 | val inverse_le_imp_le_neg = thm "inverse_le_imp_le_neg"; | |
| 2146 | val less_imp_inverse_less_neg = thm "less_imp_inverse_less_neg"; | |
| 2147 | val inverse_less_imp_less_neg = thm "inverse_less_imp_less_neg"; | |
| 2148 | val inverse_less_iff_less_neg = thm "inverse_less_iff_less_neg"; | |
| 2149 | val le_imp_inverse_le_neg = thm "le_imp_inverse_le_neg"; | |
| 2150 | val inverse_le_iff_le_neg = thm "inverse_le_iff_le_neg"; | |
| 2151 | val one_less_inverse_iff = thm "one_less_inverse_iff"; | |
| 2152 | val inverse_eq_1_iff = thm "inverse_eq_1_iff"; | |
| 2153 | val one_le_inverse_iff = thm "one_le_inverse_iff"; | |
| 2154 | val inverse_less_1_iff = thm "inverse_less_1_iff"; | |
| 2155 | val inverse_le_1_iff = thm "inverse_le_1_iff"; | |
| 2156 | val zero_less_divide_iff = thm "zero_less_divide_iff"; | |
| 2157 | val divide_less_0_iff = thm "divide_less_0_iff"; | |
| 2158 | val zero_le_divide_iff = thm "zero_le_divide_iff"; | |
| 2159 | val divide_le_0_iff = thm "divide_le_0_iff"; | |
| 2160 | val divide_eq_0_iff = thm "divide_eq_0_iff"; | |
| 2161 | val pos_le_divide_eq = thm "pos_le_divide_eq"; | |
| 2162 | val neg_le_divide_eq = thm "neg_le_divide_eq"; | |
| 2163 | val le_divide_eq = thm "le_divide_eq"; | |
| 2164 | val pos_divide_le_eq = thm "pos_divide_le_eq"; | |
| 2165 | val neg_divide_le_eq = thm "neg_divide_le_eq"; | |
| 2166 | val divide_le_eq = thm "divide_le_eq"; | |
| 2167 | val pos_less_divide_eq = thm "pos_less_divide_eq"; | |
| 2168 | val neg_less_divide_eq = thm "neg_less_divide_eq"; | |
| 2169 | val less_divide_eq = thm "less_divide_eq"; | |
| 2170 | val pos_divide_less_eq = thm "pos_divide_less_eq"; | |
| 2171 | val neg_divide_less_eq = thm "neg_divide_less_eq"; | |
| 2172 | val divide_less_eq = thm "divide_less_eq"; | |
| 2173 | val nonzero_eq_divide_eq = thm "nonzero_eq_divide_eq"; | |
| 2174 | val eq_divide_eq = thm "eq_divide_eq"; | |
| 2175 | val nonzero_divide_eq_eq = thm "nonzero_divide_eq_eq"; | |
| 2176 | val divide_eq_eq = thm "divide_eq_eq"; | |
| 2177 | val divide_cancel_right = thm "divide_cancel_right"; | |
| 2178 | val divide_cancel_left = thm "divide_cancel_left"; | |
| 2179 | val divide_eq_1_iff = thm "divide_eq_1_iff"; | |
| 2180 | val one_eq_divide_iff = thm "one_eq_divide_iff"; | |
| 2181 | val zero_eq_1_divide_iff = thm "zero_eq_1_divide_iff"; | |
| 2182 | val one_divide_eq_0_iff = thm "one_divide_eq_0_iff"; | |
| 2183 | val divide_strict_right_mono = thm "divide_strict_right_mono"; | |
| 2184 | val divide_right_mono = thm "divide_right_mono"; | |
| 2185 | val divide_strict_left_mono = thm "divide_strict_left_mono"; | |
| 2186 | val divide_left_mono = thm "divide_left_mono"; | |
| 2187 | val divide_strict_left_mono_neg = thm "divide_strict_left_mono_neg"; | |
| 2188 | val divide_strict_right_mono_neg = thm "divide_strict_right_mono_neg"; | |
| 2189 | val less_add_one = thm "less_add_one"; | |
| 2190 | val zero_less_two = thm "zero_less_two"; | |
| 2191 | val less_half_sum = thm "less_half_sum"; | |
| 2192 | val gt_half_sum = thm "gt_half_sum"; | |
| 2193 | val dense = thm "dense"; | |
| 2194 | val abs_one = thm "abs_one"; | |
| 2195 | val abs_le_mult = thm "abs_le_mult"; | |
| 2196 | val abs_eq_mult = thm "abs_eq_mult"; | |
| 2197 | val abs_mult = thm "abs_mult"; | |
| 2198 | val abs_mult_self = thm "abs_mult_self"; | |
| 2199 | val nonzero_abs_inverse = thm "nonzero_abs_inverse"; | |
| 2200 | val abs_inverse = thm "abs_inverse"; | |
| 2201 | val nonzero_abs_divide = thm "nonzero_abs_divide"; | |
| 2202 | val abs_divide = thm "abs_divide"; | |
| 2203 | val abs_mult_less = thm "abs_mult_less"; | |
| 2204 | val eq_minus_self_iff = thm "eq_minus_self_iff"; | |
| 2205 | val less_minus_self_iff = thm "less_minus_self_iff"; | |
| 2206 | val abs_less_iff = thm "abs_less_iff"; | |
| 14331 | 2207 | *} | 
| 2208 | ||
| 14265 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 paulson parents: diff
changeset | 2209 | end |