| author | wenzelm | 
| Sun, 08 Jun 2008 14:29:09 +0200 | |
| changeset 27090 | 2f45c1b1b05d | 
| parent 26732 | 6ea9de67e576 | 
| child 27106 | ff27dc6e7d05 | 
| 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 | 
| 19765 | 18 |   "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 | 
| 23288 | 26 |   "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 | ||
| 349 | (* Axiom 'order_less_le' of class 'order': *) | |
| 350 | lemma real_less_le: "((w::real) < z) = (w \<le> z & w \<noteq> z)" | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 351 | by (simp add: real_less_def) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 352 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 353 | instance real :: order | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 354 | proof qed | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 355 | (assumption | | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 356 | rule real_le_refl real_le_trans real_le_anti_sym real_less_le)+ | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 357 | |
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 358 | (* Axiom 'linorder_linear' of class 'linorder': *) | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 359 | lemma real_le_linear: "(z::real) \<le> w | w \<le> z" | 
| 23288 | 360 | apply (cases z, cases w) | 
| 361 | apply (auto simp add: real_le real_zero_def add_ac) | |
| 14334 | 362 | done | 
| 363 | ||
| 364 | ||
| 365 | instance real :: linorder | |
| 366 | by (intro_classes, rule real_le_linear) | |
| 367 | ||
| 368 | ||
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 369 | lemma real_le_eq_diff: "(x \<le> y) = (x-y \<le> (0::real))" | 
| 14484 | 370 | apply (cases x, cases y) | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 371 | apply (auto simp add: real_le real_zero_def real_diff_def real_add real_minus | 
| 23288 | 372 | add_ac) | 
| 373 | apply (simp_all add: add_assoc [symmetric]) | |
| 15542 | 374 | done | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 375 | |
| 14484 | 376 | lemma real_add_left_mono: | 
| 377 | assumes le: "x \<le> y" shows "z + x \<le> z + (y::real)" | |
| 378 | proof - | |
| 379 | have "z + x - (z + y) = (z + -z) + (x - y)" | |
| 380 | by (simp add: diff_minus add_ac) | |
| 381 | with le show ?thesis | |
| 14754 
a080eeeaec14
Modification / Installation of Provers/Arith/abel_cancel.ML for OrderedGroup.thy
 obua parents: 
14738diff
changeset | 382 | by (simp add: real_le_eq_diff[of x] real_le_eq_diff[of "z+x"] diff_minus) | 
| 14484 | 383 | qed | 
| 14334 | 384 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 385 | 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 | 386 | 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 | 387 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 388 | 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 | 389 | by (simp add: linorder_not_le [symmetric] real_le_eq_diff [of S] diff_minus) | 
| 14334 | 390 | |
| 391 | lemma real_mult_order: "[| 0 < x; 0 < y |] ==> (0::real) < x * y" | |
| 14484 | 392 | apply (cases x, cases y) | 
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 393 | 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 | 394 | linorder_not_le [where 'a = preal] | 
| 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 395 | real_zero_def real_le real_mult) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 396 |   --{*Reduce to the (simpler) @{text "\<le>"} relation *}
 | 
| 16973 | 397 | apply (auto dest!: less_add_left_Ex | 
| 23288 | 398 | simp add: add_ac mult_ac | 
| 399 | right_distrib preal_self_less_add_left) | |
| 14334 | 400 | done | 
| 401 | ||
| 402 | lemma real_mult_less_mono2: "[| (0::real) < z; x < y |] ==> z * x < z * y" | |
| 403 | apply (rule real_sum_gt_zero_less) | |
| 404 | apply (drule real_less_sum_gt_zero [of x y]) | |
| 405 | apply (drule real_mult_order, assumption) | |
| 406 | apply (simp add: right_distrib) | |
| 407 | done | |
| 408 | ||
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 409 | instantiation real :: distrib_lattice | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 410 | begin | 
| 
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 | "(inf \<Colon> real \<Rightarrow> real \<Rightarrow> real) = min" | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 414 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 415 | definition | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 416 | "(sup \<Colon> real \<Rightarrow> real \<Rightarrow> real) = max" | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 417 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 418 | instance | 
| 22456 | 419 | by default (auto simp add: inf_real_def sup_real_def min_max.sup_inf_distrib1) | 
| 420 | ||
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 421 | end | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 422 | |
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 423 | |
| 14334 | 424 | subsection{*The Reals Form an Ordered Field*}
 | 
| 425 | ||
| 426 | instance real :: ordered_field | |
| 427 | proof | |
| 428 | fix x y z :: real | |
| 429 | show "x \<le> y ==> z + x \<le> z + y" by (rule real_add_left_mono) | |
| 22962 | 430 | show "x < y ==> 0 < z ==> z * x < z * y" by (rule real_mult_less_mono2) | 
| 431 | show "\<bar>x\<bar> = (if x < 0 then -x else x)" by (simp only: real_abs_def) | |
| 24506 | 432 | show "sgn x = (if x=0 then 0 else if 0<x then 1 else - 1)" | 
| 433 | by (simp only: real_sgn_def) | |
| 14334 | 434 | qed | 
| 435 | ||
| 25303 
0699e20feabd
renamed lordered_*_* to lordered_*_add_*; further localization
 haftmann parents: 
25162diff
changeset | 436 | instance real :: lordered_ab_group_add .. | 
| 
0699e20feabd
renamed lordered_*_* to lordered_*_add_*; further localization
 haftmann parents: 
25162diff
changeset | 437 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 438 | 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 | 439 | 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 | 440 | positive reals.*} | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 441 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 442 | lemma real_of_preal_add: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 443 | "real_of_preal ((x::preal) + y) = real_of_preal x + real_of_preal y" | 
| 23288 | 444 | 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 | 445 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 446 | lemma real_of_preal_mult: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 447 | "real_of_preal ((x::preal) * y) = real_of_preal x* real_of_preal y" | 
| 23288 | 448 | 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 | 449 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 450 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 451 | text{*Gleason prop 9-4.4 p 127*}
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 452 | lemma real_of_preal_trichotomy: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 453 | "\<exists>m. (x::real) = real_of_preal m | x = 0 | x = -(real_of_preal m)" | 
| 14484 | 454 | apply (simp add: real_of_preal_def real_zero_def, cases x) | 
| 23288 | 455 | apply (auto simp add: real_minus add_ac) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 456 | apply (cut_tac x = x and y = y in linorder_less_linear) | 
| 23288 | 457 | 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 | 458 | done | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 459 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 460 | lemma real_of_preal_leD: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 461 | "real_of_preal m1 \<le> real_of_preal m2 ==> m1 \<le> m2" | 
| 23288 | 462 | 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 | 463 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 464 | 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 | 465 | 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 | 466 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 467 | lemma real_of_preal_lessD: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 468 | "real_of_preal m1 < real_of_preal m2 ==> m1 < m2" | 
| 23288 | 469 | 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 | 470 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 471 | lemma real_of_preal_less_iff [simp]: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 472 | "(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 | 473 | 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 | 474 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 475 | lemma real_of_preal_le_iff: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 476 | "(real_of_preal m1 \<le> real_of_preal m2) = (m1 \<le> m2)" | 
| 23288 | 477 | by (simp add: linorder_not_less [symmetric]) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 478 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 479 | lemma real_of_preal_zero_less: "0 < real_of_preal m" | 
| 23288 | 480 | apply (insert preal_self_less_add_left [of 1 m]) | 
| 481 | apply (auto simp add: real_zero_def real_of_preal_def | |
| 482 | real_less_def real_le_def add_ac) | |
| 483 | apply (rule_tac x="m + 1" in exI, rule_tac x="1" in exI) | |
| 484 | apply (simp add: add_ac) | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 485 | done | 
| 
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_minus_less_zero: "- real_of_preal m < 0" | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 488 | by (simp add: real_of_preal_zero_less) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 489 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 490 | lemma real_of_preal_not_minus_gt_zero: "~ 0 < - real_of_preal m" | 
| 14484 | 491 | proof - | 
| 492 | from real_of_preal_minus_less_zero | |
| 493 | show ?thesis by (blast dest: order_less_trans) | |
| 494 | qed | |
| 14365 
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 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 497 | subsection{*Theorems About the Ordering*}
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 498 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 499 | 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 | 500 | apply (auto simp add: real_of_preal_zero_less) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 501 | 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 | 502 | 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 | 503 | done | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 504 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 505 | lemma real_gt_preal_preal_Ex: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 506 | "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 | 507 | 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 | 508 | intro: real_gt_zero_preal_Ex [THEN iffD1]) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 509 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 510 | lemma real_ge_preal_preal_Ex: | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 511 | "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 | 512 | 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 | 513 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 514 | 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 | 515 | 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 | 516 | 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 | 517 | simp add: real_of_preal_zero_less) | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 518 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 519 | 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 | 520 | 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 | 521 | |
| 14334 | 522 | |
| 523 | subsection{*More Lemmas*}
 | |
| 524 | ||
| 525 | lemma real_mult_left_cancel: "(c::real) \<noteq> 0 ==> (c*a=c*b) = (a=b)" | |
| 526 | by auto | |
| 527 | ||
| 528 | lemma real_mult_right_cancel: "(c::real) \<noteq> 0 ==> (a*c=b*c) = (a=b)" | |
| 529 | by auto | |
| 530 | ||
| 531 | lemma real_mult_less_iff1 [simp]: "(0::real) < z ==> (x*z < y*z) = (x < y)" | |
| 532 | by (force elim: order_less_asym | |
| 533 | simp add: Ring_and_Field.mult_less_cancel_right) | |
| 534 | ||
| 535 | 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 | 536 | apply (simp add: mult_le_cancel_right) | 
| 23289 | 537 | apply (blast intro: elim: order_less_asym) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 538 | done | 
| 14334 | 539 | |
| 540 | lemma real_mult_le_cancel_iff2 [simp]: "(0::real) < z ==> (z*x \<le> z*y) = (x\<le>y)" | |
| 15923 | 541 | by(simp add:mult_commute) | 
| 14334 | 542 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 543 | lemma real_inverse_gt_one: "[| (0::real) < x; x < 1 |] ==> 1 < inverse x" | 
| 23289 | 544 | by (simp add: one_less_inverse_iff) (* TODO: generalize/move *) | 
| 14334 | 545 | |
| 546 | ||
| 24198 | 547 | subsection {* Embedding numbers into the Reals *}
 | 
| 548 | ||
| 549 | abbreviation | |
| 550 | real_of_nat :: "nat \<Rightarrow> real" | |
| 551 | where | |
| 552 | "real_of_nat \<equiv> of_nat" | |
| 553 | ||
| 554 | abbreviation | |
| 555 | real_of_int :: "int \<Rightarrow> real" | |
| 556 | where | |
| 557 | "real_of_int \<equiv> of_int" | |
| 558 | ||
| 559 | abbreviation | |
| 560 | real_of_rat :: "rat \<Rightarrow> real" | |
| 561 | where | |
| 562 | "real_of_rat \<equiv> of_rat" | |
| 563 | ||
| 564 | consts | |
| 565 | (*overloaded constant for injecting other types into "real"*) | |
| 566 | real :: "'a => real" | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 567 | |
| 14378 
69c4d5997669
generic of_nat and of_int functions, and generalization of iszero
 paulson parents: 
14369diff
changeset | 568 | defs (overloaded) | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 569 | 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 | 570 | 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 | 571 | |
| 16819 | 572 | lemma real_eq_of_nat: "real = of_nat" | 
| 24198 | 573 | unfolding real_of_nat_def .. | 
| 16819 | 574 | |
| 575 | lemma real_eq_of_int: "real = of_int" | |
| 24198 | 576 | unfolding real_of_int_def .. | 
| 16819 | 577 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 578 | 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 | 579 | by (simp add: real_of_int_def) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 580 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 581 | 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 | 582 | by (simp add: real_of_int_def) | 
| 14334 | 583 | |
| 16819 | 584 | 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 | 585 | by (simp add: real_of_int_def) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 586 | |
| 16819 | 587 | 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 | 588 | by (simp add: real_of_int_def) | 
| 16819 | 589 | |
| 590 | lemma real_of_int_diff [simp]: "real(x - y) = real (x::int) - real y" | |
| 591 | by (simp add: real_of_int_def) | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 592 | |
| 16819 | 593 | 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 | 594 | by (simp add: real_of_int_def) | 
| 14334 | 595 | |
| 16819 | 596 | lemma real_of_int_setsum [simp]: "real ((SUM x:A. f x)::int) = (SUM x:A. real(f x))" | 
| 597 | apply (subst real_eq_of_int)+ | |
| 598 | apply (rule of_int_setsum) | |
| 599 | done | |
| 600 | ||
| 601 | lemma real_of_int_setprod [simp]: "real ((PROD x:A. f x)::int) = | |
| 602 | (PROD x:A. real(f x))" | |
| 603 | apply (subst real_eq_of_int)+ | |
| 604 | apply (rule of_int_setprod) | |
| 605 | done | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 606 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 607 | lemma real_of_int_zero_cancel [simp]: "(real x = 0) = (x = (0::int))" | 
| 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 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 610 | lemma real_of_int_inject [iff]: "(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 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 613 | lemma real_of_int_less_iff [iff]: "(real (x::int) < real y) = (x < 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 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 616 | lemma real_of_int_le_iff [simp]: "(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 | 617 | by (simp add: real_of_int_def) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 618 | |
| 16819 | 619 | lemma real_of_int_gt_zero_cancel_iff [simp]: "(0 < real (n::int)) = (0 < n)" | 
| 620 | by (simp add: real_of_int_def) | |
| 621 | ||
| 622 | lemma real_of_int_ge_zero_cancel_iff [simp]: "(0 <= real (n::int)) = (0 <= n)" | |
| 623 | by (simp add: real_of_int_def) | |
| 624 | ||
| 625 | lemma real_of_int_lt_zero_cancel_iff [simp]: "(real (n::int) < 0) = (n < 0)" | |
| 626 | by (simp add: real_of_int_def) | |
| 627 | ||
| 628 | lemma real_of_int_le_zero_cancel_iff [simp]: "(real (n::int) <= 0) = (n <= 0)" | |
| 629 | by (simp add: real_of_int_def) | |
| 630 | ||
| 16888 | 631 | lemma real_of_int_abs [simp]: "real (abs x) = abs(real (x::int))" | 
| 632 | by (auto simp add: abs_if) | |
| 633 | ||
| 16819 | 634 | lemma int_less_real_le: "((n::int) < m) = (real n + 1 <= real m)" | 
| 635 | apply (subgoal_tac "real n + 1 = real (n + 1)") | |
| 636 | apply (simp del: real_of_int_add) | |
| 637 | apply auto | |
| 638 | done | |
| 639 | ||
| 640 | lemma int_le_real_less: "((n::int) <= m) = (real n < real m + 1)" | |
| 641 | apply (subgoal_tac "real m + 1 = real (m + 1)") | |
| 642 | apply (simp del: real_of_int_add) | |
| 643 | apply simp | |
| 644 | done | |
| 645 | ||
| 646 | lemma real_of_int_div_aux: "d ~= 0 ==> (real (x::int)) / (real d) = | |
| 647 | real (x div d) + (real (x mod d)) / (real d)" | |
| 648 | proof - | |
| 649 | assume "d ~= 0" | |
| 650 | have "x = (x div d) * d + x mod d" | |
| 651 | by auto | |
| 652 | then have "real x = real (x div d) * real d + real(x mod d)" | |
| 653 | by (simp only: real_of_int_mult [THEN sym] real_of_int_add [THEN sym]) | |
| 654 | then have "real x / real d = ... / real d" | |
| 655 | by simp | |
| 656 | then show ?thesis | |
| 23477 
f4b83f03cac9
tuned and renamed group_eq_simps and ring_eq_simps
 nipkow parents: 
23438diff
changeset | 657 | by (auto simp add: add_divide_distrib ring_simps prems) | 
| 16819 | 658 | qed | 
| 659 | ||
| 660 | lemma real_of_int_div: "(d::int) ~= 0 ==> d dvd n ==> | |
| 661 | real(n div d) = real n / real d" | |
| 662 | apply (frule real_of_int_div_aux [of d n]) | |
| 663 | apply simp | |
| 664 | apply (simp add: zdvd_iff_zmod_eq_0) | |
| 665 | done | |
| 666 | ||
| 667 | lemma real_of_int_div2: | |
| 668 | "0 <= real (n::int) / real (x) - real (n div x)" | |
| 669 | apply (case_tac "x = 0") | |
| 670 | apply simp | |
| 671 | apply (case_tac "0 < x") | |
| 672 | apply (simp add: compare_rls) | |
| 673 | apply (subst real_of_int_div_aux) | |
| 674 | apply simp | |
| 675 | apply simp | |
| 676 | apply (subst zero_le_divide_iff) | |
| 677 | apply auto | |
| 678 | apply (simp add: compare_rls) | |
| 679 | apply (subst real_of_int_div_aux) | |
| 680 | apply simp | |
| 681 | apply simp | |
| 682 | apply (subst zero_le_divide_iff) | |
| 683 | apply auto | |
| 684 | done | |
| 685 | ||
| 686 | lemma real_of_int_div3: | |
| 687 | "real (n::int) / real (x) - real (n div x) <= 1" | |
| 688 | apply(case_tac "x = 0") | |
| 689 | apply simp | |
| 690 | apply (simp add: compare_rls) | |
| 691 | apply (subst real_of_int_div_aux) | |
| 692 | apply assumption | |
| 693 | apply simp | |
| 694 | apply (subst divide_le_eq) | |
| 695 | apply clarsimp | |
| 696 | apply (rule conjI) | |
| 697 | apply (rule impI) | |
| 698 | apply (rule order_less_imp_le) | |
| 699 | apply simp | |
| 700 | apply (rule impI) | |
| 701 | apply (rule order_less_imp_le) | |
| 702 | apply simp | |
| 703 | done | |
| 704 | ||
| 705 | lemma real_of_int_div4: "real (n div x) <= real (n::int) / real x" | |
| 706 | 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 | 707 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 708 | subsection{*Embedding the Naturals into the Reals*}
 | 
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 709 | |
| 14334 | 710 | 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 | 711 | by (simp add: real_of_nat_def) | 
| 14334 | 712 | |
| 713 | 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 | 714 | by (simp add: real_of_nat_def) | 
| 14334 | 715 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 716 | 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 | 717 | by (simp add: real_of_nat_def) | 
| 14334 | 718 | |
| 719 | (*Not for addsimps: often the LHS is used to represent a positive natural*) | |
| 720 | 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 | 721 | by (simp add: real_of_nat_def) | 
| 14334 | 722 | |
| 723 | lemma real_of_nat_less_iff [iff]: | |
| 724 | "(real (n::nat) < real m) = (n < m)" | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 725 | by (simp add: real_of_nat_def) | 
| 14334 | 726 | |
| 727 | 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 | 728 | by (simp add: real_of_nat_def) | 
| 14334 | 729 | |
| 730 | 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 | 731 | by (simp add: real_of_nat_def zero_le_imp_of_nat) | 
| 14334 | 732 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 733 | 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 | 734 | 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 | 735 | |
| 14334 | 736 | 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 | 737 | by (simp add: real_of_nat_def of_nat_mult) | 
| 14334 | 738 | |
| 16819 | 739 | lemma real_of_nat_setsum [simp]: "real ((SUM x:A. f x)::nat) = | 
| 740 | (SUM x:A. real(f x))" | |
| 741 | apply (subst real_eq_of_nat)+ | |
| 742 | apply (rule of_nat_setsum) | |
| 743 | done | |
| 744 | ||
| 745 | lemma real_of_nat_setprod [simp]: "real ((PROD x:A. f x)::nat) = | |
| 746 | (PROD x:A. real(f x))" | |
| 747 | apply (subst real_eq_of_nat)+ | |
| 748 | apply (rule of_nat_setprod) | |
| 749 | done | |
| 750 | ||
| 751 | lemma real_of_card: "real (card A) = setsum (%x.1) A" | |
| 752 | apply (subst card_eq_setsum) | |
| 753 | apply (subst real_of_nat_setsum) | |
| 754 | apply simp | |
| 755 | done | |
| 756 | ||
| 14334 | 757 | 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 | 758 | by (simp add: real_of_nat_def) | 
| 14334 | 759 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 760 | 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 | 761 | by (simp add: real_of_nat_def) | 
| 14334 | 762 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 763 | 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 | 764 | by (simp add: add: real_of_nat_def of_nat_diff) | 
| 14334 | 765 | |
| 25162 | 766 | lemma real_of_nat_gt_zero_cancel_iff [simp]: "(0 < real (n::nat)) = (0 < n)" | 
| 25140 | 767 | by (auto simp: real_of_nat_def) | 
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 768 | |
| 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 769 | 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 | 770 | by (simp add: add: real_of_nat_def) | 
| 14334 | 771 | |
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 772 | 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 | 773 | by (simp add: add: real_of_nat_def) | 
| 14334 | 774 | |
| 25140 | 775 | 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 | 776 | by (simp add: add: real_of_nat_def) | 
| 14334 | 777 | |
| 16819 | 778 | lemma nat_less_real_le: "((n::nat) < m) = (real n + 1 <= real m)" | 
| 779 | apply (subgoal_tac "real n + 1 = real (Suc n)") | |
| 780 | apply simp | |
| 781 | apply (auto simp add: real_of_nat_Suc) | |
| 782 | done | |
| 783 | ||
| 784 | lemma nat_le_real_less: "((n::nat) <= m) = (real n < real m + 1)" | |
| 785 | apply (subgoal_tac "real m + 1 = real (Suc m)") | |
| 786 | apply (simp add: less_Suc_eq_le) | |
| 787 | apply (simp add: real_of_nat_Suc) | |
| 788 | done | |
| 789 | ||
| 790 | lemma real_of_nat_div_aux: "0 < d ==> (real (x::nat)) / (real d) = | |
| 791 | real (x div d) + (real (x mod d)) / (real d)" | |
| 792 | proof - | |
| 793 | assume "0 < d" | |
| 794 | have "x = (x div d) * d + x mod d" | |
| 795 | by auto | |
| 796 | then have "real x = real (x div d) * real d + real(x mod d)" | |
| 797 | by (simp only: real_of_nat_mult [THEN sym] real_of_nat_add [THEN sym]) | |
| 798 | then have "real x / real d = \<dots> / real d" | |
| 799 | by simp | |
| 800 | then show ?thesis | |
| 23477 
f4b83f03cac9
tuned and renamed group_eq_simps and ring_eq_simps
 nipkow parents: 
23438diff
changeset | 801 | by (auto simp add: add_divide_distrib ring_simps prems) | 
| 16819 | 802 | qed | 
| 803 | ||
| 804 | lemma real_of_nat_div: "0 < (d::nat) ==> d dvd n ==> | |
| 805 | real(n div d) = real n / real d" | |
| 806 | apply (frule real_of_nat_div_aux [of d n]) | |
| 807 | apply simp | |
| 808 | apply (subst dvd_eq_mod_eq_0 [THEN sym]) | |
| 809 | apply assumption | |
| 810 | done | |
| 811 | ||
| 812 | lemma real_of_nat_div2: | |
| 813 | "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 | 814 | apply(case_tac "x = 0") | 
| 
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 add: compare_rls) | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 817 | apply (subst real_of_nat_div_aux) | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 818 | apply simp | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 819 | apply simp | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 820 | apply (subst zero_le_divide_iff) | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 821 | apply simp | 
| 16819 | 822 | done | 
| 823 | ||
| 824 | lemma real_of_nat_div3: | |
| 825 | "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 | 826 | apply(case_tac "x = 0") | 
| 
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 add: compare_rls) | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 829 | apply (subst real_of_nat_div_aux) | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 830 | apply simp | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 831 | apply simp | 
| 16819 | 832 | done | 
| 833 | ||
| 834 | lemma real_of_nat_div4: "real (n div x) <= real (n::nat) / real x" | |
| 835 | by (insert real_of_nat_div2 [of n x], simp) | |
| 836 | ||
| 14365 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 paulson parents: 
14348diff
changeset | 837 | 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 | 838 | 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 | 839 | |
| 14426 | 840 | lemma real_of_int_of_nat_eq [simp]: "real (of_nat n :: int) = real n" | 
| 841 | by (simp add: real_of_int_def real_of_nat_def) | |
| 14334 | 842 | |
| 16819 | 843 | lemma real_nat_eq_real [simp]: "0 <= x ==> real(nat x) = real x" | 
| 844 | apply (subgoal_tac "real(int(nat x)) = real(nat x)") | |
| 845 | apply force | |
| 846 | apply (simp only: real_of_int_real_of_nat) | |
| 847 | done | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 848 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 849 | subsection{*Numerals and Arithmetic*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 850 | |
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 851 | instantiation real :: number_ring | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 852 | begin | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 853 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 854 | definition | 
| 25965 | 855 | 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 | 856 | |
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 857 | instance | 
| 24198 | 858 | by intro_classes (simp add: real_number_of_def) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 859 | |
| 25571 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 860 | end | 
| 
c9e39eafc7a0
instantiation target rather than legacy instance
 haftmann parents: 
25546diff
changeset | 861 | |
| 25965 | 862 | lemma [code unfold, symmetric, code post]: | 
| 24198 | 863 | "number_of k = real_of_int (number_of k)" | 
| 864 | unfolding number_of_is_id real_number_of_def .. | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 865 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 866 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 867 | text{*Collapse applications of @{term real} to @{term number_of}*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 868 | 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 | 869 | by (simp add: real_of_int_def of_int_number_of_eq) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 870 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 871 | lemma real_of_nat_number_of [simp]: | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 872 | "real (number_of v :: nat) = | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 873 | (if neg (number_of v :: int) then 0 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 874 | else (number_of v :: real))" | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 875 | 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 | 876 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 877 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 878 | use "real_arith.ML" | 
| 24075 | 879 | declaration {* K real_arith_setup *}
 | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 880 | |
| 19023 
5652a536b7e8
* include generalised MVT in HyperReal (contributed by Benjamin Porter)
 kleing parents: 
16973diff
changeset | 881 | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 882 | subsection{* Simprules combining x+y and 0: ARE THEY NEEDED?*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 883 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 884 | text{*Needed in this non-standard form by Hyperreal/Transcendental*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 885 | lemma real_0_le_divide_iff: | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 886 | "((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 | 887 | by (simp add: real_divide_def zero_le_mult_iff, auto) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 888 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 889 | lemma real_add_minus_iff [simp]: "(x + - a = (0::real)) = (x=a)" | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 890 | by arith | 
| 
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_eq_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_add_less_0_iff: "(x+y < (0::real)) = (y < -x)" | 
| 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_0_less_add_iff: "((0::real) < x+y) = (-x < y)" | 
| 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_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 | 902 | by auto | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 903 | |
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15077diff
changeset | 904 | 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 | 905 | by auto | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 906 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 907 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 908 | (* | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 909 | 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 | 910 | It replaces x+-y by x-y. | 
| 15086 | 911 | declare real_diff_def [symmetric, simp] | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 912 | *) | 
| 
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 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 915 | subsubsection{*Density of the Reals*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 916 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 917 | lemma real_lbound_gt_zero: | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 918 | "[| (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 | 919 | apply (rule_tac x = " (min d1 d2) /2" in exI) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 920 | apply (simp add: min_def) | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 921 | done | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 922 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 923 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 924 | text{*Similar results are proved in @{text Ring_and_Field}*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 925 | lemma real_less_half_sum: "x < y ==> x < (x+y) / (2::real)" | 
| 
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 | lemma real_gt_half_sum: "x < y ==> (x+y)/(2::real) < y" | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 929 | by auto | 
| 
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 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 932 | subsection{*Absolute Value Function for the Reals*}
 | 
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 933 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 934 | lemma abs_minus_add_cancel: "abs(x + (-y)) = abs (y + (-(x::real)))" | 
| 15003 | 935 | by (simp add: abs_if) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 936 | |
| 23289 | 937 | (* FIXME: redundant, but used by Integration/RealRandVar.thy in AFP *) | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 938 | lemma abs_le_interval_iff: "(abs x \<le> r) = (-r\<le>x & x\<le>(r::real))" | 
| 14738 | 939 | by (force simp add: OrderedGroup.abs_le_iff) | 
| 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_add_one_gt_zero [simp]: "(0::real) < 1 + abs(x)" | 
| 15003 | 942 | by (simp add: abs_if) | 
| 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_real_of_nat_cancel [simp]: "abs (real x) = real (x::nat)" | 
| 22958 | 945 | by (rule abs_of_nonneg [OF real_of_nat_ge_zero]) | 
| 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_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 | 948 | by simp | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 949 | |
| 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 950 | 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 | 951 | by simp | 
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14378diff
changeset | 952 | |
| 26732 | 953 | instance real :: lordered_ring | 
| 954 | proof | |
| 955 | fix a::real | |
| 956 | show "abs a = sup a (-a)" | |
| 957 | by (auto simp add: real_abs_def sup_real_def) | |
| 958 | qed | |
| 959 | ||
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 960 | |
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 961 | subsection {* Implementation of rational real numbers as pairs of integers *}
 | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 962 | |
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 963 | definition | 
| 24623 | 964 | Ratreal :: "int \<times> int \<Rightarrow> real" | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 965 | where | 
| 24623 | 966 | "Ratreal = INum" | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 967 | |
| 24623 | 968 | code_datatype Ratreal | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 969 | |
| 24623 | 970 | lemma Ratreal_simp: | 
| 971 | "Ratreal (k, l) = real_of_int k / real_of_int l" | |
| 972 | unfolding Ratreal_def INum_def by simp | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 973 | |
| 24623 | 974 | lemma Ratreal_zero [simp]: "Ratreal 0\<^sub>N = 0" | 
| 975 | by (simp add: Ratreal_simp) | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 976 | |
| 24623 | 977 | lemma Ratreal_lit [simp]: "Ratreal i\<^sub>N = real_of_int i" | 
| 978 | by (simp add: Ratreal_simp) | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 979 | |
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 980 | lemma zero_real_code [code, code unfold]: | 
| 24623 | 981 | "0 = Ratreal 0\<^sub>N" by simp | 
| 25965 | 982 | declare zero_real_code [symmetric, code post] | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 983 | |
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 984 | lemma one_real_code [code, code unfold]: | 
| 24623 | 985 | "1 = Ratreal 1\<^sub>N" by simp | 
| 25965 | 986 | declare one_real_code [symmetric, code post] | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 987 | |
| 26513 | 988 | instantiation real :: eq | 
| 989 | begin | |
| 990 | ||
| 26732 | 991 | definition "eq_class.eq (x\<Colon>real) y \<longleftrightarrow> x = y" | 
| 26513 | 992 | |
| 993 | instance by default (simp add: eq_real_def) | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 994 | |
| 26732 | 995 | lemma real_eq_code [code]: "eq_class.eq (Ratreal x) (Ratreal y) \<longleftrightarrow> eq_class.eq (normNum x) (normNum y)" | 
| 26513 | 996 | unfolding Ratreal_def INum_normNum_iff eq .. | 
| 997 | ||
| 998 | end | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 999 | |
| 24623 | 1000 | lemma real_less_eq_code [code]: "Ratreal x \<le> Ratreal y \<longleftrightarrow> normNum x \<le>\<^sub>N normNum y" | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1001 | proof - | 
| 24623 | 1002 | have "normNum x \<le>\<^sub>N normNum y \<longleftrightarrow> Ratreal (normNum x) \<le> Ratreal (normNum y)" | 
| 1003 | by (simp add: Ratreal_def del: normNum) | |
| 1004 | also have "\<dots> = (Ratreal x \<le> Ratreal y)" by (simp add: Ratreal_def) | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1005 | finally show ?thesis by simp | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1006 | qed | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1007 | |
| 24623 | 1008 | lemma real_less_code [code]: "Ratreal x < Ratreal y \<longleftrightarrow> normNum x <\<^sub>N normNum y" | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1009 | proof - | 
| 24623 | 1010 | have "normNum x <\<^sub>N normNum y \<longleftrightarrow> Ratreal (normNum x) < Ratreal (normNum y)" | 
| 1011 | by (simp add: Ratreal_def del: normNum) | |
| 1012 | also have "\<dots> = (Ratreal x < Ratreal y)" by (simp add: Ratreal_def) | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1013 | finally show ?thesis by simp | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1014 | qed | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1015 | |
| 24623 | 1016 | lemma real_add_code [code]: "Ratreal x + Ratreal y = Ratreal (x +\<^sub>N y)" | 
| 1017 | unfolding Ratreal_def by simp | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1018 | |
| 24623 | 1019 | lemma real_mul_code [code]: "Ratreal x * Ratreal y = Ratreal (x *\<^sub>N y)" | 
| 1020 | unfolding Ratreal_def by simp | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1021 | |
| 24623 | 1022 | lemma real_neg_code [code]: "- Ratreal x = Ratreal (~\<^sub>N x)" | 
| 1023 | unfolding Ratreal_def by simp | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1024 | |
| 24623 | 1025 | lemma real_sub_code [code]: "Ratreal x - Ratreal y = Ratreal (x -\<^sub>N y)" | 
| 1026 | unfolding Ratreal_def by simp | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1027 | |
| 24623 | 1028 | lemma real_inv_code [code]: "inverse (Ratreal x) = Ratreal (Ninv x)" | 
| 1029 | unfolding Ratreal_def Ninv real_divide_def by simp | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1030 | |
| 24623 | 1031 | lemma real_div_code [code]: "Ratreal x / Ratreal y = Ratreal (x \<div>\<^sub>N y)" | 
| 1032 | unfolding Ratreal_def by simp | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1033 | |
| 24623 | 1034 | text {* Setup for SML code generator *}
 | 
| 23031 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1035 | |
| 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1036 | types_code | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1037 |   real ("(int */ int)")
 | 
| 23031 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1038 | attach (term_of) {*
 | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1039 | fun term_of_real (p, q) = | 
| 24623 | 1040 | let | 
| 1041 | val rT = HOLogic.realT | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1042 | in | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1043 | if q = 1 orelse p = 0 then HOLogic.mk_number rT p | 
| 24623 | 1044 |     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 | 1045 | 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 | 1046 | end; | 
| 23031 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1047 | *} | 
| 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1048 | attach (test) {*
 | 
| 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1049 | fun gen_real i = | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1050 | let | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1051 | val p = random_range 0 i; | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1052 | val q = random_range 1 (i + 1); | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1053 | val g = Integer.gcd p q; | 
| 24630 
351a308ab58d
simplified type int (eliminated IntInf.int, integer);
 wenzelm parents: 
24623diff
changeset | 1054 | val p' = p div g; | 
| 
351a308ab58d
simplified type int (eliminated IntInf.int, integer);
 wenzelm parents: 
24623diff
changeset | 1055 | val q' = q div g; | 
| 25885 | 1056 | val r = (if one_of [true, false] then p' else ~ p', | 
| 1057 | if p' = 0 then 0 else q') | |
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1058 | in | 
| 25885 | 1059 | (r, fn () => term_of_real r) | 
| 24534 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1060 | end; | 
| 23031 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1061 | *} | 
| 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1062 | |
| 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1063 | consts_code | 
| 24623 | 1064 |   Ratreal ("(_)")
 | 
| 24534 
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 | consts_code | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1067 |   "of_int :: int \<Rightarrow> real" ("\<module>real'_of'_int")
 | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1068 | attach {*
 | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1069 | fun real_of_int 0 = (0, 0) | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1070 | | real_of_int i = (i, 1); | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1071 | *} | 
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1072 | |
| 
09b9a47904b7
New code generator setup (taken from Library/Executable_Real.thy,
 berghofe parents: 
24506diff
changeset | 1073 | declare real_of_int_of_nat_eq [symmetric, code] | 
| 23031 
9da9585c816e
added code generation based on Isabelle's rat type.
 nipkow parents: 
22970diff
changeset | 1074 | |
| 5588 | 1075 | end |