| author | wenzelm | 
| Sat, 23 Aug 2008 17:22:53 +0200 | |
| changeset 27952 | 0576c91a6803 | 
| parent 27833 | 29151fa7c58e | 
| child 27964 | 1e0303048c0b | 
| permissions | -rw-r--r-- | 
| 5588 | 1 | (* Title : Real/RealDef.thy | 
| 7219 | 2 | ID : $Id$ | 
| 5588 | 3 | Author : Jacques D. Fleuriot | 
| 4 | Copyright : 1998 University of Cambridge | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 5 | Conversion to Isar and new proofs by Lawrence C Paulson, 2003/4 | 
| 16819 | 6 | Additional contributions by Jeremy Avigad | 
| 14269 | 7 | *) | 
| 8 | ||
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 9 | header{*Defining the Reals from the Positive Reals*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 10 | |
| 15131 | 11 | theory RealDef | 
| 15140 | 12 | imports PReal | 
| 16417 | 13 | uses ("real_arith.ML")
 | 
| 15131 | 14 | begin | 
| 5588 | 15 | |
| 19765 | 16 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
20554diff
changeset | 17 | realrel :: "((preal * preal) * (preal * preal)) set" where | 
| 27106 | 18 |   [code func del]: "realrel = {p. \<exists>x1 y1 x2 y2. p = ((x1,y1),(x2,y2)) & x1+y2 = x2+y1}"
 | 
| 14269 | 19 | |
| 14484 | 20 | typedef (Real) real = "UNIV//realrel" | 
| 14269 | 21 | by (auto simp add: quotient_def) | 
| 5588 | 22 | |
| 19765 | 23 | definition | 
| 14484 | 24 | (** these don't use the overloaded "real" function: users don't see them **) | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
20554diff
changeset | 25 | real_of_preal :: "preal => real" where | 
| 27833 | 26 |   [code func del]: "real_of_preal m = Abs_Real (realrel `` {(m + 1, 1)})"
 | 
| 14484 | 27 | |
| 25762 | 28 | instantiation real :: "{zero, one, plus, minus, uminus, times, inverse, ord, abs, sgn}"
 | 
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 29 | begin | 
| 5588 | 30 | |
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 31 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 32 |   real_zero_def [code func del]: "0 = Abs_Real(realrel``{(1, 1)})"
 | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 33 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 34 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 35 |   real_one_def [code func del]: "1 = Abs_Real(realrel``{(1 + 1, 1)})"
 | 
| 5588 | 36 | |
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 37 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 38 | real_add_def [code func del]: "z + w = | 
| 14484 | 39 | contents (\<Union>(x,y) \<in> Rep_Real(z). \<Union>(u,v) \<in> Rep_Real(w). | 
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 40 | 		 { Abs_Real(realrel``{(x+u, y+v)}) })"
 | 
| 10606 | 41 | |
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 42 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 43 |   real_minus_def [code func del]: "- r =  contents (\<Union>(x,y) \<in> Rep_Real(r). { Abs_Real(realrel``{(y,x)}) })"
 | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 44 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 45 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 46 | real_diff_def [code func del]: "r - (s::real) = r + - s" | 
| 14484 | 47 | |
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 48 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 49 | real_mult_def [code func del]: | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 50 | "z * w = | 
| 14484 | 51 | contents (\<Union>(x,y) \<in> Rep_Real(z). \<Union>(u,v) \<in> Rep_Real(w). | 
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 52 | 		 { Abs_Real(realrel``{(x*u + y*v, x*v + y*u)}) })"
 | 
| 5588 | 53 | |
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 54 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 55 | real_inverse_def [code func del]: "inverse (R::real) = (THE S. (R = 0 & S = 0) | S * R = 1)" | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 56 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 57 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 58 | real_divide_def [code func del]: "R / (S::real) = R * inverse S" | 
| 14269 | 59 | |
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 60 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 61 | real_le_def [code func del]: "z \<le> (w::real) \<longleftrightarrow> | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 62 | (\<exists>x y u v. x+v \<le> u+y & (x,y) \<in> Rep_Real z & (u,v) \<in> Rep_Real w)" | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 63 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 64 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 65 | real_less_def [code func del]: "x < (y\<Colon>real) \<longleftrightarrow> x \<le> y \<and> x \<noteq> y" | 
| 5588 | 66 | |
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 67 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 68 | real_abs_def: "abs (r::real) = (if r < 0 then - r else r)" | 
| 14334 | 69 | |
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 70 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 71 | real_sgn_def: "sgn (x::real) = (if x=0 then 0 else if 0<x then 1 else - 1)" | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 72 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 73 | instance .. | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 74 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 75 | end | 
| 14334 | 76 | |
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 77 | subsection {* Equivalence relation over positive reals *}
 | 
| 14269 | 78 | |
| 14270 | 79 | lemma preal_trans_lemma: | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 80 | assumes "x + y1 = x1 + y" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 81 | and "x + y2 = x2 + y" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 82 | shows "x1 + y2 = x2 + (y1::preal)" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 83 | proof - | 
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 84 | have "(x1 + y2) + x = (x + y2) + x1" by (simp add: add_ac) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 85 | also have "... = (x2 + y) + x1" by (simp add: prems) | 
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 86 | also have "... = x2 + (x1 + y)" by (simp add: add_ac) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 87 | also have "... = x2 + (x + y1)" by (simp add: prems) | 
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 88 | also have "... = (x2 + y1) + x" by (simp add: add_ac) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 89 | finally have "(x1 + y2) + x = (x2 + y1) + x" . | 
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 90 | thus ?thesis by (rule add_right_imp_eq) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 91 | qed | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 92 | |
| 14269 | 93 | |
| 14484 | 94 | lemma realrel_iff [simp]: "(((x1,y1),(x2,y2)) \<in> realrel) = (x1 + y2 = x2 + y1)" | 
| 95 | by (simp add: realrel_def) | |
| 14269 | 96 | |
| 97 | lemma equiv_realrel: "equiv UNIV realrel" | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 98 | apply (auto simp add: equiv_def refl_def sym_def trans_def realrel_def) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 99 | apply (blast dest: preal_trans_lemma) | 
| 14269 | 100 | done | 
| 101 | ||
| 14497 | 102 | text{*Reduces equality of equivalence classes to the @{term realrel} relation:
 | 
| 103 |   @{term "(realrel `` {x} = realrel `` {y}) = ((x,y) \<in> realrel)"} *}
 | |
| 14269 | 104 | lemmas equiv_realrel_iff = | 
| 105 | eq_equiv_class_iff [OF equiv_realrel UNIV_I UNIV_I] | |
| 106 | ||
| 107 | declare equiv_realrel_iff [simp] | |
| 108 | ||
| 14497 | 109 | |
| 14484 | 110 | lemma realrel_in_real [simp]: "realrel``{(x,y)}: Real"
 | 
| 111 | by (simp add: Real_def realrel_def quotient_def, blast) | |
| 14269 | 112 | |
| 22958 | 113 | declare Abs_Real_inject [simp] | 
| 14484 | 114 | declare Abs_Real_inverse [simp] | 
| 14269 | 115 | |
| 116 | ||
| 14484 | 117 | text{*Case analysis on the representation of a real number as an equivalence
 | 
| 118 | class of pairs of positive reals.*} | |
| 119 | lemma eq_Abs_Real [case_names Abs_Real, cases type: real]: | |
| 120 |      "(!!x y. z = Abs_Real(realrel``{(x,y)}) ==> P) ==> P"
 | |
| 121 | apply (rule Rep_Real [of z, unfolded Real_def, THEN quotientE]) | |
| 122 | apply (drule arg_cong [where f=Abs_Real]) | |
| 123 | apply (auto simp add: Rep_Real_inverse) | |
| 14269 | 124 | done | 
| 125 | ||
| 126 | ||
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 127 | subsection {* Addition and Subtraction *}
 | 
| 14269 | 128 | |
| 129 | lemma real_add_congruent2_lemma: | |
| 130 | "[|a + ba = aa + b; ab + bc = ac + bb|] | |
| 131 | ==> a + ab + (ba + bc) = aa + ac + (b + (bb::preal))" | |
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 132 | apply (simp add: add_assoc) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 133 | apply (rule add_left_commute [of ab, THEN ssubst]) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 134 | apply (simp add: add_assoc [symmetric]) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 135 | apply (simp add: add_ac) | 
| 14269 | 136 | done | 
| 137 | ||
| 138 | lemma real_add: | |
| 14497 | 139 |      "Abs_Real (realrel``{(x,y)}) + Abs_Real (realrel``{(u,v)}) =
 | 
| 140 |       Abs_Real (realrel``{(x+u, y+v)})"
 | |
| 141 | proof - | |
| 15169 | 142 |   have "(\<lambda>z w. (\<lambda>(x,y). (\<lambda>(u,v). {Abs_Real (realrel `` {(x+u, y+v)})}) w) z)
 | 
| 143 | respects2 realrel" | |
| 14497 | 144 | by (simp add: congruent2_def, blast intro: real_add_congruent2_lemma) | 
| 145 | thus ?thesis | |
| 146 | by (simp add: real_add_def UN_UN_split_split_eq | |
| 14658 | 147 | UN_equiv_class2 [OF equiv_realrel equiv_realrel]) | 
| 14497 | 148 | qed | 
| 14269 | 149 | |
| 14484 | 150 | lemma real_minus: "- Abs_Real(realrel``{(x,y)}) = Abs_Real(realrel `` {(y,x)})"
 | 
| 151 | proof - | |
| 15169 | 152 |   have "(\<lambda>(x,y). {Abs_Real (realrel``{(y,x)})}) respects realrel"
 | 
| 23288 | 153 | by (simp add: congruent_def add_commute) | 
| 14484 | 154 | thus ?thesis | 
| 155 | by (simp add: real_minus_def UN_equiv_class [OF equiv_realrel]) | |
| 156 | qed | |
| 14334 | 157 | |
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 158 | instance real :: ab_group_add | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 159 | proof | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 160 | fix x y z :: real | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 161 | show "(x + y) + z = x + (y + z)" | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 162 | by (cases x, cases y, cases z, simp add: real_add add_assoc) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 163 | show "x + y = y + x" | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 164 | by (cases x, cases y, simp add: real_add add_commute) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 165 | show "0 + x = x" | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 166 | by (cases x, simp add: real_add real_zero_def add_ac) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 167 | show "- x + x = 0" | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 168 | by (cases x, simp add: real_minus real_add real_zero_def add_commute) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 169 | show "x - y = x + - y" | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 170 | by (simp add: real_diff_def) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 171 | qed | 
| 14269 | 172 | |
| 173 | ||
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 174 | subsection {* Multiplication *}
 | 
| 14269 | 175 | |
| 14329 | 176 | lemma real_mult_congruent2_lemma: | 
| 177 | "!!(x1::preal). [| x1 + y2 = x2 + y1 |] ==> | |
| 14484 | 178 | x * x1 + y * y1 + (x * y2 + y * x2) = | 
| 179 | x * x2 + y * y2 + (x * y1 + y * x1)" | |
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 180 | apply (simp add: add_left_commute add_assoc [symmetric]) | 
| 23288 | 181 | apply (simp add: add_assoc right_distrib [symmetric]) | 
| 182 | apply (simp add: add_commute) | |
| 14269 | 183 | done | 
| 184 | ||
| 185 | lemma real_mult_congruent2: | |
| 15169 | 186 | "(%p1 p2. | 
| 14484 | 187 | (%(x1,y1). (%(x2,y2). | 
| 15169 | 188 |           { Abs_Real (realrel``{(x1*x2 + y1*y2, x1*y2+y1*x2)}) }) p2) p1)
 | 
| 189 | respects2 realrel" | |
| 14658 | 190 | apply (rule congruent2_commuteI [OF equiv_realrel], clarify) | 
| 23288 | 191 | apply (simp add: mult_commute add_commute) | 
| 14269 | 192 | apply (auto simp add: real_mult_congruent2_lemma) | 
| 193 | done | |
| 194 | ||
| 195 | lemma real_mult: | |
| 14484 | 196 |       "Abs_Real((realrel``{(x1,y1)})) * Abs_Real((realrel``{(x2,y2)})) =
 | 
| 197 |        Abs_Real(realrel `` {(x1*x2+y1*y2,x1*y2+y1*x2)})"
 | |
| 198 | by (simp add: real_mult_def UN_UN_split_split_eq | |
| 14658 | 199 | UN_equiv_class2 [OF equiv_realrel equiv_realrel real_mult_congruent2]) | 
| 14269 | 200 | |
| 201 | lemma real_mult_commute: "(z::real) * w = w * z" | |
| 23288 | 202 | by (cases z, cases w, simp add: real_mult add_ac mult_ac) | 
| 14269 | 203 | |
| 204 | lemma real_mult_assoc: "((z1::real) * z2) * z3 = z1 * (z2 * z3)" | |
| 14484 | 205 | apply (cases z1, cases z2, cases z3) | 
| 23288 | 206 | apply (simp add: real_mult right_distrib add_ac mult_ac) | 
| 14269 | 207 | done | 
| 208 | ||
| 209 | lemma real_mult_1: "(1::real) * z = z" | |
| 14484 | 210 | apply (cases z) | 
| 23288 | 211 | apply (simp add: real_mult real_one_def right_distrib | 
| 212 | mult_1_right mult_ac add_ac) | |
| 14269 | 213 | done | 
| 214 | ||
| 215 | lemma real_add_mult_distrib: "((z1::real) + z2) * w = (z1 * w) + (z2 * w)" | |
| 14484 | 216 | apply (cases z1, cases z2, cases w) | 
| 23288 | 217 | apply (simp add: real_add real_mult right_distrib add_ac mult_ac) | 
| 14269 | 218 | done | 
| 219 | ||
| 14329 | 220 | text{*one and zero are distinct*}
 | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 221 | lemma real_zero_not_eq_one: "0 \<noteq> (1::real)" | 
| 14484 | 222 | proof - | 
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 223 | have "(1::preal) < 1 + 1" | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 224 | by (simp add: preal_self_less_add_left) | 
| 14484 | 225 | thus ?thesis | 
| 23288 | 226 | by (simp add: real_zero_def real_one_def) | 
| 14484 | 227 | qed | 
| 14269 | 228 | |
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 229 | instance real :: comm_ring_1 | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 230 | proof | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 231 | fix x y z :: real | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 232 | show "(x * y) * z = x * (y * z)" by (rule real_mult_assoc) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 233 | show "x * y = y * x" by (rule real_mult_commute) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 234 | show "1 * x = x" by (rule real_mult_1) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 235 | show "(x + y) * z = x * z + y * z" by (rule real_add_mult_distrib) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 236 | show "0 \<noteq> (1::real)" by (rule real_zero_not_eq_one) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 237 | qed | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 238 | |
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 239 | subsection {* Inverse and Division *}
 | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 240 | |
| 14484 | 241 | lemma real_zero_iff: "Abs_Real (realrel `` {(x, x)}) = 0"
 | 
| 23288 | 242 | by (simp add: real_zero_def add_commute) | 
| 14269 | 243 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 244 | text{*Instead of using an existential quantifier and constructing the inverse
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 245 | within the proof, we could define the inverse explicitly.*} | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 246 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 247 | lemma real_mult_inverse_left_ex: "x \<noteq> 0 ==> \<exists>y. y*x = (1::real)" | 
| 14484 | 248 | apply (simp add: real_zero_def real_one_def, cases x) | 
| 14269 | 249 | apply (cut_tac x = xa and y = y in linorder_less_linear) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 250 | apply (auto dest!: less_add_left_Ex simp add: real_zero_iff) | 
| 14334 | 251 | apply (rule_tac | 
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 252 |         x = "Abs_Real (realrel``{(1, inverse (D) + 1)})"
 | 
| 14334 | 253 | in exI) | 
| 254 | apply (rule_tac [2] | |
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 255 |         x = "Abs_Real (realrel``{(inverse (D) + 1, 1)})" 
 | 
| 14334 | 256 | in exI) | 
| 23477 
f4b83f03cac9
tuned and renamed group_eq_simps and ring_eq_simps
 nipkow parents: 
23438diff
changeset | 257 | apply (auto simp add: real_mult preal_mult_inverse_right ring_simps) | 
| 14269 | 258 | done | 
| 259 | ||
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 260 | lemma real_mult_inverse_left: "x \<noteq> 0 ==> inverse(x)*x = (1::real)" | 
| 14484 | 261 | apply (simp add: real_inverse_def) | 
| 23287 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 262 | apply (drule real_mult_inverse_left_ex, safe) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 263 | apply (rule theI, assumption, rename_tac z) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 264 | apply (subgoal_tac "(z * x) * y = z * (x * y)") | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 265 | apply (simp add: mult_commute) | 
| 
063039db59dd
define (1::preal); clean up instance declarations
 huffman parents: 
23031diff
changeset | 266 | apply (rule mult_assoc) | 
| 14269 | 267 | done | 
| 14334 | 268 | |
| 14341 
a09441bd4f1e
Ring_and_Field now requires axiom add_left_imp_eq for semirings.
 paulson parents: 
14335diff
changeset | 269 | |
| 
a09441bd4f1e
Ring_and_Field now requires axiom add_left_imp_eq for semirings.
 paulson parents: 
14335diff
changeset | 270 | subsection{*The Real Numbers form a Field*}
 | 
| 
a09441bd4f1e
Ring_and_Field now requires axiom add_left_imp_eq for semirings.
 paulson parents: 
14335diff
changeset | 271 | |
| 14334 | 272 | instance real :: field | 
| 273 | proof | |
| 274 | fix x y z :: real | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 275 | show "x \<noteq> 0 ==> inverse x * x = 1" by (rule real_mult_inverse_left) | 
| 14430 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 paulson parents: 
14426diff
changeset | 276 | show "x / y = x * inverse y" by (simp add: real_divide_def) | 
| 14334 | 277 | qed | 
| 278 | ||
| 279 | ||
| 14341 
a09441bd4f1e
Ring_and_Field now requires axiom add_left_imp_eq for semirings.
 paulson parents: 
14335diff
changeset | 280 | text{*Inverse of zero!  Useful to simplify certain equations*}
 | 
| 14269 | 281 | |
| 14334 | 282 | lemma INVERSE_ZERO: "inverse 0 = (0::real)" | 
| 14484 | 283 | by (simp add: real_inverse_def) | 
| 14334 | 284 | |
| 285 | instance real :: division_by_zero | |
| 286 | proof | |
| 287 | show "inverse 0 = (0::real)" by (rule INVERSE_ZERO) | |
| 288 | qed | |
| 289 | ||
| 14269 | 290 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 291 | subsection{*The @{text "\<le>"} Ordering*}
 | 
| 14269 | 292 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 293 | lemma real_le_refl: "w \<le> (w::real)" | 
| 14484 | 294 | by (cases w, force simp add: real_le_def) | 
| 14269 | 295 | |
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 296 | text{*The arithmetic decision procedure is not set up for type preal.
 | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 297 | This lemma is currently unused, but it could simplify the proofs of the | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 298 | following two lemmas.*} | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 299 | lemma preal_eq_le_imp_le: | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 300 | assumes eq: "a+b = c+d" and le: "c \<le> a" | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 301 | shows "b \<le> (d::preal)" | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 302 | proof - | 
| 23288 | 303 | have "c+d \<le> a+d" by (simp add: prems) | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 304 | hence "a+b \<le> a+d" by (simp add: prems) | 
| 23288 | 305 | thus "b \<le> d" by simp | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 306 | qed | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 307 | |
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 308 | lemma real_le_lemma: | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 309 | assumes l: "u1 + v2 \<le> u2 + v1" | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 310 | and "x1 + v1 = u1 + y1" | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 311 | and "x2 + v2 = u2 + y2" | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 312 | shows "x1 + y2 \<le> x2 + (y1::preal)" | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 313 | proof - | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 314 | have "(x1+v1) + (u2+y2) = (u1+y1) + (x2+v2)" by (simp add: prems) | 
| 23288 | 315 | hence "(x1+y2) + (u2+v1) = (x2+y1) + (u1+v2)" by (simp add: add_ac) | 
| 316 | also have "... \<le> (x2+y1) + (u2+v1)" by (simp add: prems) | |
| 317 | finally show ?thesis by simp | |
| 318 | qed | |
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 319 | |
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 320 | lemma real_le: | 
| 14484 | 321 |      "(Abs_Real(realrel``{(x1,y1)}) \<le> Abs_Real(realrel``{(x2,y2)})) =  
 | 
| 322 | (x1 + y2 \<le> x2 + y1)" | |
| 23288 | 323 | apply (simp add: real_le_def) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 324 | apply (auto intro: real_le_lemma) | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 325 | done | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 326 | |
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 327 | lemma real_le_anti_sym: "[| z \<le> w; w \<le> z |] ==> z = (w::real)" | 
| 15542 | 328 | by (cases z, cases w, simp add: real_le) | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 329 | |
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 330 | lemma real_trans_lemma: | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 331 | assumes "x + v \<le> u + y" | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 332 | and "u + v' \<le> u' + v" | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 333 | and "x2 + v2 = u2 + y2" | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 334 | shows "x + v' \<le> u' + (y::preal)" | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 335 | proof - | 
| 23288 | 336 | have "(x+v') + (u+v) = (x+v) + (u+v')" by (simp add: add_ac) | 
| 337 | also have "... \<le> (u+y) + (u+v')" by (simp add: prems) | |
| 338 | also have "... \<le> (u+y) + (u'+v)" by (simp add: prems) | |
| 339 | also have "... = (u'+y) + (u+v)" by (simp add: add_ac) | |
| 340 | finally show ?thesis by simp | |
| 15542 | 341 | qed | 
| 14269 | 342 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 343 | lemma real_le_trans: "[| i \<le> j; j \<le> k |] ==> i \<le> (k::real)" | 
| 14484 | 344 | apply (cases i, cases j, cases k) | 
| 345 | apply (simp add: real_le) | |
| 23288 | 346 | apply (blast intro: real_trans_lemma) | 
| 14334 | 347 | done | 
| 348 | ||
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 349 | instance real :: order | 
| 27682 | 350 | proof | 
| 351 | fix u v :: real | |
| 352 | show "u < v \<longleftrightarrow> u \<le> v \<and> \<not> v \<le> u" | |
| 353 | by (auto simp add: real_less_def intro: real_le_anti_sym) | |
| 354 | qed (assumption | rule real_le_refl real_le_trans real_le_anti_sym)+ | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 355 | |
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 356 | (* Axiom 'linorder_linear' of class 'linorder': *) | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 357 | lemma real_le_linear: "(z::real) \<le> w | w \<le> z" | 
| 23288 | 358 | apply (cases z, cases w) | 
| 359 | apply (auto simp add: real_le real_zero_def add_ac) | |
| 14334 | 360 | done | 
| 361 | ||
| 362 | instance real :: linorder | |
| 363 | by (intro_classes, rule real_le_linear) | |
| 364 | ||
| 365 | ||
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 366 | lemma real_le_eq_diff: "(x \<le> y) = (x-y \<le> (0::real))" | 
| 14484 | 367 | apply (cases x, cases y) | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 368 | apply (auto simp add: real_le real_zero_def real_diff_def real_add real_minus | 
| 23288 | 369 | add_ac) | 
| 370 | apply (simp_all add: add_assoc [symmetric]) | |
| 15542 | 371 | done | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 372 | |
| 14484 | 373 | lemma real_add_left_mono: | 
| 374 | assumes le: "x \<le> y" shows "z + x \<le> z + (y::real)" | |
| 375 | proof - | |
| 27668 | 376 | have "z + x - (z + y) = (z + -z) + (x - y)" | 
| 14484 | 377 | by (simp add: diff_minus add_ac) | 
| 378 | with le show ?thesis | |
| 14754 
a080eeeaec14
Modification / Installation of Provers/Arith/abel_cancel.ML for OrderedGroup.thy
 obua parents: 
14738diff
changeset | 379 | by (simp add: real_le_eq_diff[of x] real_le_eq_diff[of "z+x"] diff_minus) | 
| 14484 | 380 | qed | 
| 14334 | 381 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 382 | lemma real_sum_gt_zero_less: "(0 < S + (-W::real)) ==> (W < S)" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 383 | by (simp add: linorder_not_le [symmetric] real_le_eq_diff [of S] diff_minus) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 384 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 385 | lemma real_less_sum_gt_zero: "(W < S) ==> (0 < S + (-W::real))" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 386 | by (simp add: linorder_not_le [symmetric] real_le_eq_diff [of S] diff_minus) | 
| 14334 | 387 | |
| 388 | lemma real_mult_order: "[| 0 < x; 0 < y |] ==> (0::real) < x * y" | |
| 14484 | 389 | apply (cases x, cases y) | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 390 | apply (simp add: linorder_not_le [where 'a = real, symmetric] | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 391 | linorder_not_le [where 'a = preal] | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 392 | real_zero_def real_le real_mult) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 393 |   --{*Reduce to the (simpler) @{text "\<le>"} relation *}
 | 
| 16973 | 394 | apply (auto dest!: less_add_left_Ex | 
| 23288 | 395 | simp add: add_ac mult_ac | 
| 396 | right_distrib preal_self_less_add_left) | |
| 14334 | 397 | done | 
| 398 | ||
| 399 | lemma real_mult_less_mono2: "[| (0::real) < z; x < y |] ==> z * x < z * y" | |
| 400 | apply (rule real_sum_gt_zero_less) | |
| 401 | apply (drule real_less_sum_gt_zero [of x y]) | |
| 402 | apply (drule real_mult_order, assumption) | |
| 403 | apply (simp add: right_distrib) | |
| 404 | done | |
| 405 | ||
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 406 | instantiation real :: distrib_lattice | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 407 | begin | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 408 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 409 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 410 | "(inf \<Colon> real \<Rightarrow> real \<Rightarrow> real) = min" | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 411 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 412 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 413 | "(sup \<Colon> real \<Rightarrow> real \<Rightarrow> real) = max" | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 414 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 415 | instance | 
| 22456 | 416 | by default (auto simp add: inf_real_def sup_real_def min_max.sup_inf_distrib1) | 
| 417 | ||
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 418 | end | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 419 | |
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 420 | |
| 14334 | 421 | subsection{*The Reals Form an Ordered Field*}
 | 
| 422 | ||
| 423 | instance real :: ordered_field | |
| 424 | proof | |
| 425 | fix x y z :: real | |
| 426 | show "x \<le> y ==> z + x \<le> z + y" by (rule real_add_left_mono) | |
| 22962 | 427 | show "x < y ==> 0 < z ==> z * x < z * y" by (rule real_mult_less_mono2) | 
| 428 | show "\<bar>x\<bar> = (if x < 0 then -x else x)" by (simp only: real_abs_def) | |
| 24506 | 429 | show "sgn x = (if x=0 then 0 else if 0<x then 1 else - 1)" | 
| 430 | by (simp only: real_sgn_def) | |
| 14334 | 431 | qed | 
| 432 | ||
| 25303 
0699e20feabd
renamed lordered_*_* to lordered_*_add_*; further localization
 haftmann parents: 
25162diff
changeset | 433 | instance real :: lordered_ab_group_add .. | 
| 
0699e20feabd
renamed lordered_*_* to lordered_*_add_*; further localization
 haftmann parents: 
25162diff
changeset | 434 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 435 | text{*The function @{term real_of_preal} requires many proofs, but it seems
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 436 | to be essential for proving completeness of the reals from that of the | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 437 | positive reals.*} | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 438 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 439 | lemma real_of_preal_add: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 440 | "real_of_preal ((x::preal) + y) = real_of_preal x + real_of_preal y" | 
| 23288 | 441 | by (simp add: real_of_preal_def real_add left_distrib add_ac) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 442 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 443 | lemma real_of_preal_mult: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 444 | "real_of_preal ((x::preal) * y) = real_of_preal x* real_of_preal y" | 
| 23288 | 445 | by (simp add: real_of_preal_def real_mult right_distrib add_ac mult_ac) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 446 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 447 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 448 | text{*Gleason prop 9-4.4 p 127*}
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 449 | lemma real_of_preal_trichotomy: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 450 | "\<exists>m. (x::real) = real_of_preal m | x = 0 | x = -(real_of_preal m)" | 
| 14484 | 451 | apply (simp add: real_of_preal_def real_zero_def, cases x) | 
| 23288 | 452 | apply (auto simp add: real_minus add_ac) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 453 | apply (cut_tac x = x and y = y in linorder_less_linear) | 
| 23288 | 454 | apply (auto dest!: less_add_left_Ex simp add: add_assoc [symmetric]) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 455 | done | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 456 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 457 | lemma real_of_preal_leD: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 458 | "real_of_preal m1 \<le> real_of_preal m2 ==> m1 \<le> m2" | 
| 23288 | 459 | by (simp add: real_of_preal_def real_le) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 460 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 461 | lemma real_of_preal_lessI: "m1 < m2 ==> real_of_preal m1 < real_of_preal m2" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 462 | by (auto simp add: real_of_preal_leD linorder_not_le [symmetric]) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 463 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 464 | lemma real_of_preal_lessD: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 465 | "real_of_preal m1 < real_of_preal m2 ==> m1 < m2" | 
| 23288 | 466 | by (simp add: real_of_preal_def real_le linorder_not_le [symmetric]) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 467 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 468 | lemma real_of_preal_less_iff [simp]: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 469 | "(real_of_preal m1 < real_of_preal m2) = (m1 < m2)" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 470 | by (blast intro: real_of_preal_lessI real_of_preal_lessD) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 471 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 472 | lemma real_of_preal_le_iff: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 473 | "(real_of_preal m1 \<le> real_of_preal m2) = (m1 \<le> m2)" | 
| 23288 | 474 | by (simp add: linorder_not_less [symmetric]) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 475 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 476 | lemma real_of_preal_zero_less: "0 < real_of_preal m" | 
| 23288 | 477 | apply (insert preal_self_less_add_left [of 1 m]) | 
| 478 | apply (auto simp add: real_zero_def real_of_preal_def | |
| 479 | real_less_def real_le_def add_ac) | |
| 480 | apply (rule_tac x="m + 1" in exI, rule_tac x="1" in exI) | |
| 481 | apply (simp add: add_ac) | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 482 | done | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 483 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 484 | lemma real_of_preal_minus_less_zero: "- real_of_preal m < 0" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 485 | by (simp add: real_of_preal_zero_less) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 486 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 487 | lemma real_of_preal_not_minus_gt_zero: "~ 0 < - real_of_preal m" | 
| 14484 | 488 | proof - | 
| 489 | from real_of_preal_minus_less_zero | |
| 490 | show ?thesis by (blast dest: order_less_trans) | |
| 491 | qed | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 492 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 493 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 494 | subsection{*Theorems About the Ordering*}
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 495 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 496 | lemma real_gt_zero_preal_Ex: "(0 < x) = (\<exists>y. x = real_of_preal y)" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 497 | apply (auto simp add: real_of_preal_zero_less) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 498 | apply (cut_tac x = x in real_of_preal_trichotomy) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 499 | apply (blast elim!: real_of_preal_not_minus_gt_zero [THEN notE]) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 500 | done | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 501 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 502 | lemma real_gt_preal_preal_Ex: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 503 | "real_of_preal z < x ==> \<exists>y. x = real_of_preal y" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 504 | by (blast dest!: real_of_preal_zero_less [THEN order_less_trans] | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 505 | intro: real_gt_zero_preal_Ex [THEN iffD1]) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 506 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 507 | lemma real_ge_preal_preal_Ex: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 508 | "real_of_preal z \<le> x ==> \<exists>y. x = real_of_preal y" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 509 | by (blast dest: order_le_imp_less_or_eq real_gt_preal_preal_Ex) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 510 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 511 | lemma real_less_all_preal: "y \<le> 0 ==> \<forall>x. y < real_of_preal x" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 512 | by (auto elim: order_le_imp_less_or_eq [THEN disjE] | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 513 | intro: real_of_preal_zero_less [THEN [2] order_less_trans] | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 514 | simp add: real_of_preal_zero_less) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 515 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 516 | lemma real_less_all_real2: "~ 0 < y ==> \<forall>x. y < real_of_preal x" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 517 | by (blast intro!: real_less_all_preal linorder_not_less [THEN iffD1]) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 518 | |
| 14334 | 519 | |
| 520 | subsection{*More Lemmas*}
 | |
| 521 | ||
| 522 | lemma real_mult_left_cancel: "(c::real) \<noteq> 0 ==> (c*a=c*b) = (a=b)" | |
| 523 | by auto | |
| 524 | ||
| 525 | lemma real_mult_right_cancel: "(c::real) \<noteq> 0 ==> (a*c=b*c) = (a=b)" | |
| 526 | by auto | |
| 527 | ||
| 528 | lemma real_mult_less_iff1 [simp]: "(0::real) < z ==> (x*z < y*z) = (x < y)" | |
| 529 | by (force elim: order_less_asym | |
| 530 | simp add: Ring_and_Field.mult_less_cancel_right) | |
| 531 | ||
| 532 | lemma real_mult_le_cancel_iff1 [simp]: "(0::real) < z ==> (x*z \<le> y*z) = (x\<le>y)" | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 533 | apply (simp add: mult_le_cancel_right) | 
| 23289 | 534 | apply (blast intro: elim: order_less_asym) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 535 | done | 
| 14334 | 536 | |
| 537 | lemma real_mult_le_cancel_iff2 [simp]: "(0::real) < z ==> (z*x \<le> z*y) = (x\<le>y)" | |
| 15923 | 538 | by(simp add:mult_commute) | 
| 14334 | 539 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 540 | lemma real_inverse_gt_one: "[| (0::real) < x; x < 1 |] ==> 1 < inverse x" | 
| 23289 | 541 | by (simp add: one_less_inverse_iff) (* TODO: generalize/move *) | 
| 14334 | 542 | |
| 543 | ||
| 24198 | 544 | subsection {* Embedding numbers into the Reals *}
 | 
| 545 | ||
| 546 | abbreviation | |
| 547 | real_of_nat :: "nat \<Rightarrow> real" | |
| 548 | where | |
| 549 | "real_of_nat \<equiv> of_nat" | |
| 550 | ||
| 551 | abbreviation | |
| 552 | real_of_int :: "int \<Rightarrow> real" | |
| 553 | where | |
| 554 | "real_of_int \<equiv> of_int" | |
| 555 | ||
| 556 | abbreviation | |
| 557 | real_of_rat :: "rat \<Rightarrow> real" | |
| 558 | where | |
| 559 | "real_of_rat \<equiv> of_rat" | |
| 560 | ||
| 561 | consts | |
| 562 | (*overloaded constant for injecting other types into "real"*) | |
| 563 | real :: "'a => real" | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 564 | |
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 565 | defs (overloaded) | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 566 | real_of_nat_def [code inline]: "real == real_of_nat" | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 567 | real_of_int_def [code inline]: "real == real_of_int" | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 568 | |
| 16819 | 569 | lemma real_eq_of_nat: "real = of_nat" | 
| 24198 | 570 | unfolding real_of_nat_def .. | 
| 16819 | 571 | |
| 572 | lemma real_eq_of_int: "real = of_int" | |
| 24198 | 573 | unfolding real_of_int_def .. | 
| 16819 | 574 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 575 | lemma real_of_int_zero [simp]: "real (0::int) = 0" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 576 | by (simp add: real_of_int_def) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 577 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 578 | lemma real_of_one [simp]: "real (1::int) = (1::real)" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 579 | by (simp add: real_of_int_def) | 
| 14334 | 580 | |
| 16819 | 581 | lemma real_of_int_add [simp]: "real(x + y) = real (x::int) + real y" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 582 | by (simp add: real_of_int_def) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 583 | |
| 16819 | 584 | lemma real_of_int_minus [simp]: "real(-x) = -real (x::int)" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 585 | by (simp add: real_of_int_def) | 
| 16819 | 586 | |
| 587 | lemma real_of_int_diff [simp]: "real(x - y) = real (x::int) - real y" | |
| 588 | by (simp add: real_of_int_def) | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 589 | |
| 16819 | 590 | lemma real_of_int_mult [simp]: "real(x * y) = real (x::int) * real y" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 591 | by (simp add: real_of_int_def) | 
| 14334 | 592 | |
| 16819 | 593 | lemma real_of_int_setsum [simp]: "real ((SUM x:A. f x)::int) = (SUM x:A. real(f x))" | 
| 594 | apply (subst real_eq_of_int)+ | |
| 595 | apply (rule of_int_setsum) | |
| 596 | done | |
| 597 | ||
| 598 | lemma real_of_int_setprod [simp]: "real ((PROD x:A. f x)::int) = | |
| 599 | (PROD x:A. real(f x))" | |
| 600 | apply (subst real_eq_of_int)+ | |
| 601 | apply (rule of_int_setprod) | |
| 602 | done | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 603 | |
| 27668 | 604 | lemma real_of_int_zero_cancel [simp, algebra, presburger]: "(real x = 0) = (x = (0::int))" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 605 | by (simp add: real_of_int_def) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 606 | |
| 27668 | 607 | lemma real_of_int_inject [iff, algebra, presburger]: "(real (x::int) = real y) = (x = y)" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 608 | by (simp add: real_of_int_def) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 609 | |
| 27668 | 610 | lemma real_of_int_less_iff [iff, presburger]: "(real (x::int) < real y) = (x < y)" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 611 | by (simp add: real_of_int_def) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 612 | |
| 27668 | 613 | lemma real_of_int_le_iff [simp, presburger]: "(real (x::int) \<le> real y) = (x \<le> y)" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 614 | by (simp add: real_of_int_def) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 615 | |
| 27668 | 616 | lemma real_of_int_gt_zero_cancel_iff [simp, presburger]: "(0 < real (n::int)) = (0 < n)" | 
| 16819 | 617 | by (simp add: real_of_int_def) | 
| 618 | ||
| 27668 | 619 | lemma real_of_int_ge_zero_cancel_iff [simp, presburger]: "(0 <= real (n::int)) = (0 <= n)" | 
| 16819 | 620 | by (simp add: real_of_int_def) | 
| 621 | ||
| 27668 | 622 | lemma real_of_int_lt_zero_cancel_iff [simp, presburger]: "(real (n::int) < 0) = (n < 0)" | 
| 16819 | 623 | by (simp add: real_of_int_def) | 
| 624 | ||
| 27668 | 625 | lemma real_of_int_le_zero_cancel_iff [simp, presburger]: "(real (n::int) <= 0) = (n <= 0)" | 
| 16819 | 626 | by (simp add: real_of_int_def) | 
| 627 | ||
| 16888 | 628 | lemma real_of_int_abs [simp]: "real (abs x) = abs(real (x::int))" | 
| 629 | by (auto simp add: abs_if) | |
| 630 | ||
| 16819 | 631 | lemma int_less_real_le: "((n::int) < m) = (real n + 1 <= real m)" | 
| 632 | apply (subgoal_tac "real n + 1 = real (n + 1)") | |
| 633 | apply (simp del: real_of_int_add) | |
| 634 | apply auto | |
| 635 | done | |
| 636 | ||
| 637 | lemma int_le_real_less: "((n::int) <= m) = (real n < real m + 1)" | |
| 638 | apply (subgoal_tac "real m + 1 = real (m + 1)") | |
| 639 | apply (simp del: real_of_int_add) | |
| 640 | apply simp | |
| 641 | done | |
| 642 | ||
| 643 | lemma real_of_int_div_aux: "d ~= 0 ==> (real (x::int)) / (real d) = | |
| 644 | real (x div d) + (real (x mod d)) / (real d)" | |
| 645 | proof - | |
| 646 | assume "d ~= 0" | |
| 647 | have "x = (x div d) * d + x mod d" | |
| 648 | by auto | |
| 649 | then have "real x = real (x div d) * real d + real(x mod d)" | |
| 650 | by (simp only: real_of_int_mult [THEN sym] real_of_int_add [THEN sym]) | |
| 651 | then have "real x / real d = ... / real d" | |
| 652 | by simp | |
| 653 | then show ?thesis | |
| 23477 
f4b83f03cac9
tuned and renamed group_eq_simps and ring_eq_simps
 nipkow parents: 
23438diff
changeset | 654 | by (auto simp add: add_divide_distrib ring_simps prems) | 
| 16819 | 655 | qed | 
| 656 | ||
| 657 | lemma real_of_int_div: "(d::int) ~= 0 ==> d dvd n ==> | |
| 658 | real(n div d) = real n / real d" | |
| 659 | apply (frule real_of_int_div_aux [of d n]) | |
| 660 | apply simp | |
| 661 | apply (simp add: zdvd_iff_zmod_eq_0) | |
| 662 | done | |
| 663 | ||
| 664 | lemma real_of_int_div2: | |
| 665 | "0 <= real (n::int) / real (x) - real (n div x)" | |
| 666 | apply (case_tac "x = 0") | |
| 667 | apply simp | |
| 668 | apply (case_tac "0 < x") | |
| 669 | apply (simp add: compare_rls) | |
| 670 | apply (subst real_of_int_div_aux) | |
| 671 | apply simp | |
| 672 | apply simp | |
| 673 | apply (subst zero_le_divide_iff) | |
| 674 | apply auto | |
| 675 | apply (simp add: compare_rls) | |
| 676 | apply (subst real_of_int_div_aux) | |
| 677 | apply simp | |
| 678 | apply simp | |
| 679 | apply (subst zero_le_divide_iff) | |
| 680 | apply auto | |
| 681 | done | |
| 682 | ||
| 683 | lemma real_of_int_div3: | |
| 684 | "real (n::int) / real (x) - real (n div x) <= 1" | |
| 685 | apply(case_tac "x = 0") | |
| 686 | apply simp | |
| 687 | apply (simp add: compare_rls) | |
| 688 | apply (subst real_of_int_div_aux) | |
| 689 | apply assumption | |
| 690 | apply simp | |
| 691 | apply (subst divide_le_eq) | |
| 692 | apply clarsimp | |
| 693 | apply (rule conjI) | |
| 694 | apply (rule impI) | |
| 695 | apply (rule order_less_imp_le) | |
| 696 | apply simp | |
| 697 | apply (rule impI) | |
| 698 | apply (rule order_less_imp_le) | |
| 699 | apply simp | |
| 700 | done | |
| 701 | ||
| 702 | lemma real_of_int_div4: "real (n div x) <= real (n::int) / real x" | |
| 703 | by (insert real_of_int_div2 [of n x], simp) | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 704 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 705 | subsection{*Embedding the Naturals into the Reals*}
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 706 | |
| 14334 | 707 | lemma real_of_nat_zero [simp]: "real (0::nat) = 0" | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 708 | by (simp add: real_of_nat_def) | 
| 14334 | 709 | |
| 710 | lemma real_of_nat_one [simp]: "real (Suc 0) = (1::real)" | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 711 | by (simp add: real_of_nat_def) | 
| 14334 | 712 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 713 | lemma real_of_nat_add [simp]: "real (m + n) = real (m::nat) + real n" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 714 | by (simp add: real_of_nat_def) | 
| 14334 | 715 | |
| 716 | (*Not for addsimps: often the LHS is used to represent a positive natural*) | |
| 717 | lemma real_of_nat_Suc: "real (Suc n) = real n + (1::real)" | |
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 718 | by (simp add: real_of_nat_def) | 
| 14334 | 719 | |
| 720 | lemma real_of_nat_less_iff [iff]: | |
| 721 | "(real (n::nat) < real m) = (n < m)" | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 722 | by (simp add: real_of_nat_def) | 
| 14334 | 723 | |
| 724 | lemma real_of_nat_le_iff [iff]: "(real (n::nat) \<le> real m) = (n \<le> m)" | |
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 725 | by (simp add: real_of_nat_def) | 
| 14334 | 726 | |
| 727 | lemma real_of_nat_ge_zero [iff]: "0 \<le> real (n::nat)" | |
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 728 | by (simp add: real_of_nat_def zero_le_imp_of_nat) | 
| 14334 | 729 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 730 | lemma real_of_nat_Suc_gt_zero: "0 < real (Suc n)" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 731 | by (simp add: real_of_nat_def del: of_nat_Suc) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 732 | |
| 14334 | 733 | lemma real_of_nat_mult [simp]: "real (m * n) = real (m::nat) * real n" | 
| 23431 
25ca91279a9b
change simp rules for of_nat to work like int did previously (reorient of_nat_Suc, remove of_nat_mult [simp]); preserve original variable names in legacy int theorems
 huffman parents: 
23289diff
changeset | 734 | by (simp add: real_of_nat_def of_nat_mult) | 
| 14334 | 735 | |
| 16819 | 736 | lemma real_of_nat_setsum [simp]: "real ((SUM x:A. f x)::nat) = | 
| 737 | (SUM x:A. real(f x))" | |
| 738 | apply (subst real_eq_of_nat)+ | |
| 739 | apply (rule of_nat_setsum) | |
| 740 | done | |
| 741 | ||
| 742 | lemma real_of_nat_setprod [simp]: "real ((PROD x:A. f x)::nat) = | |
| 743 | (PROD x:A. real(f x))" | |
| 744 | apply (subst real_eq_of_nat)+ | |
| 745 | apply (rule of_nat_setprod) | |
| 746 | done | |
| 747 | ||
| 748 | lemma real_of_card: "real (card A) = setsum (%x.1) A" | |
| 749 | apply (subst card_eq_setsum) | |
| 750 | apply (subst real_of_nat_setsum) | |
| 751 | apply simp | |
| 752 | done | |
| 753 | ||
| 14334 | 754 | lemma real_of_nat_inject [iff]: "(real (n::nat) = real m) = (n = m)" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 755 | by (simp add: real_of_nat_def) | 
| 14334 | 756 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 757 | lemma real_of_nat_zero_iff [iff]: "(real (n::nat) = 0) = (n = 0)" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 758 | by (simp add: real_of_nat_def) | 
| 14334 | 759 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 760 | lemma real_of_nat_diff: "n \<le> m ==> real (m - n) = real (m::nat) - real n" | 
| 23438 
dd824e86fa8a
remove simp attribute from of_nat_diff, for backward compatibility with zdiff_int
 huffman parents: 
23431diff
changeset | 761 | by (simp add: add: real_of_nat_def of_nat_diff) | 
| 14334 | 762 | |
| 25162 | 763 | lemma real_of_nat_gt_zero_cancel_iff [simp]: "(0 < real (n::nat)) = (0 < n)" | 
| 25140 | 764 | by (auto simp: real_of_nat_def) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 765 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 766 | lemma real_of_nat_le_zero_cancel_iff [simp]: "(real (n::nat) \<le> 0) = (n = 0)" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 767 | by (simp add: add: real_of_nat_def) | 
| 14334 | 768 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 769 | lemma not_real_of_nat_less_zero [simp]: "~ real (n::nat) < 0" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 770 | by (simp add: add: real_of_nat_def) | 
| 14334 | 771 | |
| 25140 | 772 | lemma real_of_nat_ge_zero_cancel_iff [simp]: "(0 \<le> real (n::nat))" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 773 | by (simp add: add: real_of_nat_def) | 
| 14334 | 774 | |
| 16819 | 775 | lemma nat_less_real_le: "((n::nat) < m) = (real n + 1 <= real m)" | 
| 776 | apply (subgoal_tac "real n + 1 = real (Suc n)") | |
| 777 | apply simp | |
| 778 | apply (auto simp add: real_of_nat_Suc) | |
| 779 | done | |
| 780 | ||
| 781 | lemma nat_le_real_less: "((n::nat) <= m) = (real n < real m + 1)" | |
| 782 | apply (subgoal_tac "real m + 1 = real (Suc m)") | |
| 783 | apply (simp add: less_Suc_eq_le) | |
| 784 | apply (simp add: real_of_nat_Suc) | |
| 785 | done | |
| 786 | ||
| 787 | lemma real_of_nat_div_aux: "0 < d ==> (real (x::nat)) / (real d) = | |
| 788 | real (x div d) + (real (x mod d)) / (real d)" | |
| 789 | proof - | |
| 790 | assume "0 < d" | |
| 791 | have "x = (x div d) * d + x mod d" | |
| 792 | by auto | |
| 793 | then have "real x = real (x div d) * real d + real(x mod d)" | |
| 794 | by (simp only: real_of_nat_mult [THEN sym] real_of_nat_add [THEN sym]) | |
| 795 | then have "real x / real d = \<dots> / real d" | |
| 796 | by simp | |
| 797 | then show ?thesis | |
| 23477 
f4b83f03cac9
tuned and renamed group_eq_simps and ring_eq_simps
 nipkow parents: 
23438diff
changeset | 798 | by (auto simp add: add_divide_distrib ring_simps prems) | 
| 16819 | 799 | qed | 
| 800 | ||
| 801 | lemma real_of_nat_div: "0 < (d::nat) ==> d dvd n ==> | |
| 802 | real(n div d) = real n / real d" | |
| 803 | apply (frule real_of_nat_div_aux [of d n]) | |
| 804 | apply simp | |
| 805 | apply (subst dvd_eq_mod_eq_0 [THEN sym]) | |
| 806 | apply assumption | |
| 807 | done | |
| 808 | ||
| 809 | lemma real_of_nat_div2: | |
| 810 | "0 <= real (n::nat) / real (x) - real (n div x)" | |
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 811 | apply(case_tac "x = 0") | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 812 | apply (simp) | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 813 | apply (simp add: compare_rls) | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 814 | apply (subst real_of_nat_div_aux) | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 815 | apply simp | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 816 | apply simp | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 817 | apply (subst zero_le_divide_iff) | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 818 | apply simp | 
| 16819 | 819 | done | 
| 820 | ||
| 821 | lemma real_of_nat_div3: | |
| 822 | "real (n::nat) / real (x) - real (n div x) <= 1" | |
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 823 | apply(case_tac "x = 0") | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 824 | apply (simp) | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 825 | apply (simp add: compare_rls) | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 826 | apply (subst real_of_nat_div_aux) | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 827 | apply simp | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 828 | apply simp | 
| 16819 | 829 | done | 
| 830 | ||
| 831 | lemma real_of_nat_div4: "real (n div x) <= real (n::nat) / real x" | |
| 832 | by (insert real_of_nat_div2 [of n x], simp) | |
| 833 | ||
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 834 | lemma real_of_int_real_of_nat: "real (int n) = real n" | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 835 | by (simp add: real_of_nat_def real_of_int_def int_eq_of_nat) | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 836 | |
| 14426 | 837 | lemma real_of_int_of_nat_eq [simp]: "real (of_nat n :: int) = real n" | 
| 838 | by (simp add: real_of_int_def real_of_nat_def) | |
| 14334 | 839 | |
| 16819 | 840 | lemma real_nat_eq_real [simp]: "0 <= x ==> real(nat x) = real x" | 
| 841 | apply (subgoal_tac "real(int(nat x)) = real(nat x)") | |
| 842 | apply force | |
| 843 | apply (simp only: real_of_int_real_of_nat) | |
| 844 | done | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 845 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 846 | subsection{*Numerals and Arithmetic*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 847 | |
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 848 | instantiation real :: number_ring | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 849 | begin | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 850 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 851 | definition | 
| 25965 | 852 | real_number_of_def [code func del]: "number_of w = real_of_int w" | 
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 853 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 854 | instance | 
| 24198 | 855 | by intro_classes (simp add: real_number_of_def) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 856 | |
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 857 | end | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 858 | |
| 25965 | 859 | lemma [code unfold, symmetric, code post]: | 
| 24198 | 860 | "number_of k = real_of_int (number_of k)" | 
| 861 | unfolding number_of_is_id real_number_of_def .. | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 862 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 863 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 864 | text{*Collapse applications of @{term real} to @{term number_of}*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 865 | lemma real_number_of [simp]: "real (number_of v :: int) = number_of v" | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 866 | by (simp add: real_of_int_def of_int_number_of_eq) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 867 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 868 | lemma real_of_nat_number_of [simp]: | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 869 | "real (number_of v :: nat) = | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 870 | (if neg (number_of v :: int) then 0 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 871 | else (number_of v :: real))" | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 872 | by (simp add: real_of_int_real_of_nat [symmetric] int_nat_number_of) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 873 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 874 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 875 | use "real_arith.ML" | 
| 24075 | 876 | declaration {* K real_arith_setup *}
 | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 877 | |
| 19023 
5652a536b7e8
* include generalised MVT in HyperReal (contributed by Benjamin Porter)
 kleing parents: 
16973diff
changeset | 878 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 879 | subsection{* Simprules combining x+y and 0: ARE THEY NEEDED?*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 880 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 881 | text{*Needed in this non-standard form by Hyperreal/Transcendental*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 882 | lemma real_0_le_divide_iff: | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 883 | "((0::real) \<le> x/y) = ((x \<le> 0 | 0 \<le> y) & (0 \<le> x | y \<le> 0))" | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 884 | by (simp add: real_divide_def zero_le_mult_iff, auto) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 885 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 886 | lemma real_add_minus_iff [simp]: "(x + - a = (0::real)) = (x=a)" | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 887 | by arith | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 888 | |
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15077diff
changeset | 889 | lemma real_add_eq_0_iff: "(x+y = (0::real)) = (y = -x)" | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 890 | by auto | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 891 | |
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15077diff
changeset | 892 | lemma real_add_less_0_iff: "(x+y < (0::real)) = (y < -x)" | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 893 | by auto | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 894 | |
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15077diff
changeset | 895 | lemma real_0_less_add_iff: "((0::real) < x+y) = (-x < y)" | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 896 | by auto | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 897 | |
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15077diff
changeset | 898 | lemma real_add_le_0_iff: "(x+y \<le> (0::real)) = (y \<le> -x)" | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 899 | by auto | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 900 | |
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15077diff
changeset | 901 | lemma real_0_le_add_iff: "((0::real) \<le> x+y) = (-x \<le> y)" | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 902 | by auto | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 903 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 904 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 905 | (* | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 906 | FIXME: we should have this, as for type int, but many proofs would break. | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 907 | It replaces x+-y by x-y. | 
| 15086 | 908 | declare real_diff_def [symmetric, simp] | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 909 | *) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 910 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 911 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 912 | subsubsection{*Density of the Reals*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 913 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 914 | lemma real_lbound_gt_zero: | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 915 | "[| (0::real) < d1; 0 < d2 |] ==> \<exists>e. 0 < e & e < d1 & e < d2" | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 916 | apply (rule_tac x = " (min d1 d2) /2" in exI) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 917 | apply (simp add: min_def) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 918 | done | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 919 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 920 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 921 | text{*Similar results are proved in @{text Ring_and_Field}*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 922 | lemma real_less_half_sum: "x < y ==> x < (x+y) / (2::real)" | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 923 | by auto | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 924 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 925 | lemma real_gt_half_sum: "x < y ==> (x+y)/(2::real) < y" | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 926 | by auto | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 927 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 928 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 929 | subsection{*Absolute Value Function for the Reals*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 930 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 931 | lemma abs_minus_add_cancel: "abs(x + (-y)) = abs (y + (-(x::real)))" | 
| 15003 | 932 | by (simp add: abs_if) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 933 | |
| 23289 | 934 | (* FIXME: redundant, but used by Integration/RealRandVar.thy in AFP *) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 935 | lemma abs_le_interval_iff: "(abs x \<le> r) = (-r\<le>x & x\<le>(r::real))" | 
| 14738 | 936 | by (force simp add: OrderedGroup.abs_le_iff) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 937 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 938 | lemma abs_add_one_gt_zero [simp]: "(0::real) < 1 + abs(x)" | 
| 15003 | 939 | by (simp add: abs_if) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 940 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 941 | lemma abs_real_of_nat_cancel [simp]: "abs (real x) = real (x::nat)" | 
| 22958 | 942 | by (rule abs_of_nonneg [OF real_of_nat_ge_zero]) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 943 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 944 | lemma abs_add_one_not_less_self [simp]: "~ abs(x) + (1::real) < x" | 
| 20217 
25b068a99d2b
linear arithmetic splits certain operators (e.g. min, max, abs)
 webertj parents: 
19765diff
changeset | 945 | by simp | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 946 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 947 | lemma abs_sum_triangle_ineq: "abs ((x::real) + y + (-l + -m)) \<le> abs(x + -l) + abs(y + -m)" | 
| 20217 
25b068a99d2b
linear arithmetic splits certain operators (e.g. min, max, abs)
 webertj parents: 
19765diff
changeset | 948 | by simp | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 949 | |
| 26732 | 950 | instance real :: lordered_ring | 
| 951 | proof | |
| 952 | fix a::real | |
| 953 | show "abs a = sup a (-a)" | |
| 954 | by (auto simp add: real_abs_def sup_real_def) | |
| 955 | qed | |
| 956 | ||
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 957 | |
| 27544 | 958 | subsection {* Implementation of rational real numbers *}
 | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 959 | |
| 27544 | 960 | definition Ratreal :: "rat \<Rightarrow> real" where | 
| 961 | [simp]: "Ratreal = of_rat" | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 962 | |
| 24623 | 963 | code_datatype Ratreal | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 964 | |
| 27544 | 965 | lemma Ratreal_number_collapse [code post]: | 
| 966 | "Ratreal 0 = 0" | |
| 967 | "Ratreal 1 = 1" | |
| 968 | "Ratreal (number_of k) = number_of k" | |
| 969 | by simp_all | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 970 | |
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 971 | lemma zero_real_code [code, code unfold]: | 
| 27544 | 972 | "0 = Ratreal 0" | 
| 973 | by simp | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 974 | |
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 975 | lemma one_real_code [code, code unfold]: | 
| 27544 | 976 | "1 = Ratreal 1" | 
| 977 | by simp | |
| 978 | ||
| 979 | lemma number_of_real_code [code unfold]: | |
| 980 | "number_of k = Ratreal (number_of k)" | |
| 981 | by simp | |
| 982 | ||
| 983 | lemma Ratreal_number_of_quotient [code post]: | |
| 984 | "Ratreal (number_of r) / Ratreal (number_of s) = number_of r / number_of s" | |
| 985 | by simp | |
| 986 | ||
| 987 | lemma Ratreal_number_of_quotient2 [code post]: | |
| 988 | "Ratreal (number_of r / number_of s) = number_of r / number_of s" | |
| 989 | unfolding Ratreal_number_of_quotient [symmetric] Ratreal_def of_rat_divide .. | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 990 | |
| 26513 | 991 | instantiation real :: eq | 
| 992 | begin | |
| 993 | ||
| 27544 | 994 | definition "eq_class.eq (x\<Colon>real) y \<longleftrightarrow> x - y = 0" | 
| 26513 | 995 | |
| 996 | instance by default (simp add: eq_real_def) | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 997 | |
| 27544 | 998 | lemma real_eq_code [code]: "eq_class.eq (Ratreal x) (Ratreal y) \<longleftrightarrow> eq_class.eq x y" | 
| 999 | by (simp add: eq_real_def eq) | |
| 26513 | 1000 | |
| 1001 | end | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1002 | |
| 27544 | 1003 | lemma real_less_eq_code [code]: "Ratreal x \<le> Ratreal y \<longleftrightarrow> x \<le> y" | 
| 27652 
818666de6c24
refined code generator setup for rational numbers; more simplification rules for rational numbers
 haftmann parents: 
27544diff
changeset | 1004 | by (simp add: of_rat_less_eq) | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1005 | |
| 27544 | 1006 | lemma real_less_code [code]: "Ratreal x < Ratreal y \<longleftrightarrow> x < y" | 
| 27652 
818666de6c24
refined code generator setup for rational numbers; more simplification rules for rational numbers
 haftmann parents: 
27544diff
changeset | 1007 | by (simp add: of_rat_less) | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1008 | |
| 27544 | 1009 | lemma real_plus_code [code]: "Ratreal x + Ratreal y = Ratreal (x + y)" | 
| 1010 | by (simp add: of_rat_add) | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1011 | |
| 27544 | 1012 | lemma real_times_code [code]: "Ratreal x * Ratreal y = Ratreal (x * y)" | 
| 1013 | by (simp add: of_rat_mult) | |
| 1014 | ||
| 1015 | lemma real_uminus_code [code]: "- Ratreal x = Ratreal (- x)" | |
| 1016 | by (simp add: of_rat_minus) | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1017 | |
| 27544 | 1018 | lemma real_minus_code [code]: "Ratreal x - Ratreal y = Ratreal (x - y)" | 
| 1019 | by (simp add: of_rat_diff) | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1020 | |
| 27544 | 1021 | lemma real_inverse_code [code]: "inverse (Ratreal x) = Ratreal (inverse x)" | 
| 1022 | by (simp add: of_rat_inverse) | |
| 1023 | ||
| 1024 | lemma real_divide_code [code]: "Ratreal x / Ratreal y = Ratreal (x / y)" | |
| 1025 | by (simp add: of_rat_divide) | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1026 | |
| 24623 | 1027 | text {* Setup for SML code generator *}
 | 
| 23031 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1028 | |
| 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1029 | types_code | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1030 |   real ("(int */ int)")
 | 
| 23031 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1031 | attach (term_of) {*
 | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1032 | fun term_of_real (p, q) = | 
| 24623 | 1033 | let | 
| 1034 | val rT = HOLogic.realT | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1035 | in | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1036 | if q = 1 orelse p = 0 then HOLogic.mk_number rT p | 
| 24623 | 1037 |     else @{term "op / \<Colon> real \<Rightarrow> real \<Rightarrow> real"} $
 | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1038 | HOLogic.mk_number rT p $ HOLogic.mk_number rT q | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1039 | end; | 
| 23031 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1040 | *} | 
| 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1041 | attach (test) {*
 | 
| 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1042 | fun gen_real i = | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1043 | let | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1044 | val p = random_range 0 i; | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1045 | val q = random_range 1 (i + 1); | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1046 | val g = Integer.gcd p q; | 
| 24630 
351a308ab58d
simplified type int (eliminated IntInf.int, integer);
 wenzelm parents: 
24623diff
changeset | 1047 | val p' = p div g; | 
| 
351a308ab58d
simplified type int (eliminated IntInf.int, integer);
 wenzelm parents: 
24623diff
changeset | 1048 | val q' = q div g; | 
| 25885 | 1049 | val r = (if one_of [true, false] then p' else ~ p', | 
| 1050 | if p' = 0 then 0 else q') | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1051 | in | 
| 25885 | 1052 | (r, fn () => term_of_real r) | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1053 | end; | 
| 23031 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1054 | *} | 
| 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1055 | |
| 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1056 | consts_code | 
| 24623 | 1057 |   Ratreal ("(_)")
 | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1058 | |
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1059 | consts_code | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1060 |   "of_int :: int \<Rightarrow> real" ("\<module>real'_of'_int")
 | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1061 | attach {*
 | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1062 | fun real_of_int 0 = (0, 0) | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1063 | | real_of_int i = (i, 1); | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1064 | *} | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1065 | |
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1066 | declare real_of_int_of_nat_eq [symmetric, code] | 
| 23031 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1067 | |
| 5588 | 1068 | end |