| author | blanchet | 
| Fri, 19 Sep 2014 13:27:04 +0200 | |
| changeset 58392 | 00f5b1efc741 | 
| parent 56225 | 00112abe9b25 | 
| child 58410 | 6d46ad54a2ab | 
| permissions | -rw-r--r-- | 
| 
28952
 
15a4b2cf8c34
made repository layout more coherent with logical distribution structure; stripped some $Id$s
 
haftmann 
parents: 
28562 
diff
changeset
 | 
1  | 
(* Title : HOL/NSA/HyperDef.thy  | 
| 27468 | 2  | 
Author : Jacques D. Fleuriot  | 
3  | 
Copyright : 1998 University of Cambridge  | 
|
4  | 
Conversion to Isar and new proofs by Lawrence C Paulson, 2004  | 
|
5  | 
*)  | 
|
6  | 
||
7  | 
header{*Construction of Hyperreals Using Ultrafilters*}
 | 
|
8  | 
||
9  | 
theory HyperDef  | 
|
| 51525 | 10  | 
imports Complex_Main HyperNat  | 
| 27468 | 11  | 
begin  | 
12  | 
||
| 42463 | 13  | 
type_synonym hypreal = "real star"  | 
| 27468 | 14  | 
|
15  | 
abbreviation  | 
|
16  | 
hypreal_of_real :: "real => real star" where  | 
|
17  | 
"hypreal_of_real == star_of"  | 
|
18  | 
||
19  | 
abbreviation  | 
|
20  | 
hypreal_of_hypnat :: "hypnat \<Rightarrow> hypreal" where  | 
|
21  | 
"hypreal_of_hypnat \<equiv> of_hypnat"  | 
|
22  | 
||
23  | 
definition  | 
|
24  | 
omega :: hypreal where  | 
|
25  | 
   -- {*an infinite number @{text "= [<1,2,3,...>]"} *}
 | 
|
26  | 
"omega = star_n (\<lambda>n. real (Suc n))"  | 
|
27  | 
||
28  | 
definition  | 
|
29  | 
epsilon :: hypreal where  | 
|
30  | 
   -- {*an infinitesimal number @{text "= [<1,1/2,1/3,...>]"} *}
 | 
|
31  | 
"epsilon = star_n (\<lambda>n. inverse (real (Suc n)))"  | 
|
32  | 
||
33  | 
notation (xsymbols)  | 
|
34  | 
  omega  ("\<omega>") and
 | 
|
35  | 
  epsilon  ("\<epsilon>")
 | 
|
36  | 
||
37  | 
notation (HTML output)  | 
|
38  | 
  omega  ("\<omega>") and
 | 
|
39  | 
  epsilon  ("\<epsilon>")
 | 
|
40  | 
||
41  | 
||
42  | 
subsection {* Real vector class instances *}
 | 
|
43  | 
||
44  | 
instantiation star :: (scaleR) scaleR  | 
|
45  | 
begin  | 
|
46  | 
||
47  | 
definition  | 
|
| 37765 | 48  | 
star_scaleR_def [transfer_unfold]: "scaleR r \<equiv> *f* (scaleR r)"  | 
| 27468 | 49  | 
|
50  | 
instance ..  | 
|
51  | 
||
52  | 
end  | 
|
53  | 
||
54  | 
lemma Standard_scaleR [simp]: "x \<in> Standard \<Longrightarrow> scaleR r x \<in> Standard"  | 
|
55  | 
by (simp add: star_scaleR_def)  | 
|
56  | 
||
57  | 
lemma star_of_scaleR [simp]: "star_of (scaleR r x) = scaleR r (star_of x)"  | 
|
58  | 
by transfer (rule refl)  | 
|
59  | 
||
60  | 
instance star :: (real_vector) real_vector  | 
|
61  | 
proof  | 
|
62  | 
fix a b :: real  | 
|
63  | 
show "\<And>x y::'a star. scaleR a (x + y) = scaleR a x + scaleR a y"  | 
|
64  | 
by transfer (rule scaleR_right_distrib)  | 
|
65  | 
show "\<And>x::'a star. scaleR (a + b) x = scaleR a x + scaleR b x"  | 
|
66  | 
by transfer (rule scaleR_left_distrib)  | 
|
67  | 
show "\<And>x::'a star. scaleR a (scaleR b x) = scaleR (a * b) x"  | 
|
68  | 
by transfer (rule scaleR_scaleR)  | 
|
69  | 
show "\<And>x::'a star. scaleR 1 x = x"  | 
|
70  | 
by transfer (rule scaleR_one)  | 
|
71  | 
qed  | 
|
72  | 
||
73  | 
instance star :: (real_algebra) real_algebra  | 
|
74  | 
proof  | 
|
75  | 
fix a :: real  | 
|
76  | 
show "\<And>x y::'a star. scaleR a x * y = scaleR a (x * y)"  | 
|
77  | 
by transfer (rule mult_scaleR_left)  | 
|
78  | 
show "\<And>x y::'a star. x * scaleR a y = scaleR a (x * y)"  | 
|
79  | 
by transfer (rule mult_scaleR_right)  | 
|
80  | 
qed  | 
|
81  | 
||
82  | 
instance star :: (real_algebra_1) real_algebra_1 ..  | 
|
83  | 
||
84  | 
instance star :: (real_div_algebra) real_div_algebra ..  | 
|
85  | 
||
| 27553 | 86  | 
instance star :: (field_char_0) field_char_0 ..  | 
87  | 
||
| 27468 | 88  | 
instance star :: (real_field) real_field ..  | 
89  | 
||
90  | 
lemma star_of_real_def [transfer_unfold]: "of_real r = star_of (of_real r)"  | 
|
91  | 
by (unfold of_real_def, transfer, rule refl)  | 
|
92  | 
||
93  | 
lemma Standard_of_real [simp]: "of_real r \<in> Standard"  | 
|
94  | 
by (simp add: star_of_real_def)  | 
|
95  | 
||
96  | 
lemma star_of_of_real [simp]: "star_of (of_real r) = of_real r"  | 
|
97  | 
by transfer (rule refl)  | 
|
98  | 
||
99  | 
lemma of_real_eq_star_of [simp]: "of_real = star_of"  | 
|
100  | 
proof  | 
|
101  | 
fix r :: real  | 
|
102  | 
show "of_real r = star_of r"  | 
|
103  | 
by transfer simp  | 
|
104  | 
qed  | 
|
105  | 
||
106  | 
lemma Reals_eq_Standard: "(Reals :: hypreal set) = Standard"  | 
|
107  | 
by (simp add: Reals_def Standard_def)  | 
|
108  | 
||
109  | 
||
110  | 
subsection {* Injection from @{typ hypreal} *}
 | 
|
111  | 
||
112  | 
definition  | 
|
113  | 
of_hypreal :: "hypreal \<Rightarrow> 'a::real_algebra_1 star" where  | 
|
| 37765 | 114  | 
[transfer_unfold]: "of_hypreal = *f* of_real"  | 
| 27468 | 115  | 
|
116  | 
lemma Standard_of_hypreal [simp]:  | 
|
117  | 
"r \<in> Standard \<Longrightarrow> of_hypreal r \<in> Standard"  | 
|
118  | 
by (simp add: of_hypreal_def)  | 
|
119  | 
||
120  | 
lemma of_hypreal_0 [simp]: "of_hypreal 0 = 0"  | 
|
121  | 
by transfer (rule of_real_0)  | 
|
122  | 
||
123  | 
lemma of_hypreal_1 [simp]: "of_hypreal 1 = 1"  | 
|
124  | 
by transfer (rule of_real_1)  | 
|
125  | 
||
126  | 
lemma of_hypreal_add [simp]:  | 
|
127  | 
"\<And>x y. of_hypreal (x + y) = of_hypreal x + of_hypreal y"  | 
|
128  | 
by transfer (rule of_real_add)  | 
|
129  | 
||
130  | 
lemma of_hypreal_minus [simp]: "\<And>x. of_hypreal (- x) = - of_hypreal x"  | 
|
131  | 
by transfer (rule of_real_minus)  | 
|
132  | 
||
133  | 
lemma of_hypreal_diff [simp]:  | 
|
134  | 
"\<And>x y. of_hypreal (x - y) = of_hypreal x - of_hypreal y"  | 
|
135  | 
by transfer (rule of_real_diff)  | 
|
136  | 
||
137  | 
lemma of_hypreal_mult [simp]:  | 
|
138  | 
"\<And>x y. of_hypreal (x * y) = of_hypreal x * of_hypreal y"  | 
|
139  | 
by transfer (rule of_real_mult)  | 
|
140  | 
||
141  | 
lemma of_hypreal_inverse [simp]:  | 
|
142  | 
"\<And>x. of_hypreal (inverse x) =  | 
|
| 36409 | 143  | 
   inverse (of_hypreal x :: 'a::{real_div_algebra, division_ring_inverse_zero} star)"
 | 
| 27468 | 144  | 
by transfer (rule of_real_inverse)  | 
145  | 
||
146  | 
lemma of_hypreal_divide [simp]:  | 
|
147  | 
"\<And>x y. of_hypreal (x / y) =  | 
|
| 36409 | 148  | 
   (of_hypreal x / of_hypreal y :: 'a::{real_field, field_inverse_zero} star)"
 | 
| 27468 | 149  | 
by transfer (rule of_real_divide)  | 
150  | 
||
151  | 
lemma of_hypreal_eq_iff [simp]:  | 
|
152  | 
"\<And>x y. (of_hypreal x = of_hypreal y) = (x = y)"  | 
|
153  | 
by transfer (rule of_real_eq_iff)  | 
|
154  | 
||
155  | 
lemma of_hypreal_eq_0_iff [simp]:  | 
|
156  | 
"\<And>x. (of_hypreal x = 0) = (x = 0)"  | 
|
157  | 
by transfer (rule of_real_eq_0_iff)  | 
|
158  | 
||
159  | 
||
160  | 
subsection{*Properties of @{term starrel}*}
 | 
|
161  | 
||
162  | 
lemma lemma_starrel_refl [simp]: "x \<in> starrel `` {x}"
 | 
|
163  | 
by (simp add: starrel_def)  | 
|
164  | 
||
165  | 
lemma starrel_in_hypreal [simp]: "starrel``{x}:star"
 | 
|
166  | 
by (simp add: star_def starrel_def quotient_def, blast)  | 
|
167  | 
||
168  | 
declare Abs_star_inject [simp] Abs_star_inverse [simp]  | 
|
169  | 
declare equiv_starrel [THEN eq_equiv_class_iff, simp]  | 
|
170  | 
||
| 
56217
 
dc429a5b13c4
Some rationalisation of basic lemmas
 
paulson <lp15@cam.ac.uk> 
parents: 
55911 
diff
changeset
 | 
171  | 
subsection{*@{term hypreal_of_real}:
 | 
| 27468 | 172  | 
            the Injection from @{typ real} to @{typ hypreal}*}
 | 
173  | 
||
174  | 
lemma inj_star_of: "inj star_of"  | 
|
175  | 
by (rule inj_onI, simp)  | 
|
176  | 
||
177  | 
lemma mem_Rep_star_iff: "(X \<in> Rep_star x) = (x = star_n X)"  | 
|
178  | 
by (cases x, simp add: star_n_def)  | 
|
179  | 
||
180  | 
lemma Rep_star_star_n_iff [simp]:  | 
|
181  | 
  "(X \<in> Rep_star (star_n Y)) = ({n. Y n = X n} \<in> \<U>)"
 | 
|
182  | 
by (simp add: star_n_def)  | 
|
183  | 
||
184  | 
lemma Rep_star_star_n: "X \<in> Rep_star (star_n X)"  | 
|
185  | 
by simp  | 
|
186  | 
||
187  | 
subsection{* Properties of @{term star_n} *}
 | 
|
188  | 
||
189  | 
lemma star_n_add:  | 
|
190  | 
"star_n X + star_n Y = star_n (%n. X n + Y n)"  | 
|
191  | 
by (simp only: star_add_def starfun2_star_n)  | 
|
192  | 
||
193  | 
lemma star_n_minus:  | 
|
194  | 
"- star_n X = star_n (%n. -(X n))"  | 
|
195  | 
by (simp only: star_minus_def starfun_star_n)  | 
|
196  | 
||
197  | 
lemma star_n_diff:  | 
|
198  | 
"star_n X - star_n Y = star_n (%n. X n - Y n)"  | 
|
199  | 
by (simp only: star_diff_def starfun2_star_n)  | 
|
200  | 
||
201  | 
lemma star_n_mult:  | 
|
202  | 
"star_n X * star_n Y = star_n (%n. X n * Y n)"  | 
|
203  | 
by (simp only: star_mult_def starfun2_star_n)  | 
|
204  | 
||
205  | 
lemma star_n_inverse:  | 
|
206  | 
"inverse (star_n X) = star_n (%n. inverse(X n))"  | 
|
207  | 
by (simp only: star_inverse_def starfun_star_n)  | 
|
208  | 
||
209  | 
lemma star_n_le:  | 
|
| 
56217
 
dc429a5b13c4
Some rationalisation of basic lemmas
 
paulson <lp15@cam.ac.uk> 
parents: 
55911 
diff
changeset
 | 
210  | 
"star_n X \<le> star_n Y =  | 
| 27468 | 211  | 
       ({n. X n \<le> Y n} \<in> FreeUltrafilterNat)"
 | 
212  | 
by (simp only: star_le_def starP2_star_n)  | 
|
213  | 
||
214  | 
lemma star_n_less:  | 
|
215  | 
      "star_n X < star_n Y = ({n. X n < Y n} \<in> FreeUltrafilterNat)"
 | 
|
216  | 
by (simp only: star_less_def starP2_star_n)  | 
|
217  | 
||
218  | 
lemma star_n_zero_num: "0 = star_n (%n. 0)"  | 
|
219  | 
by (simp only: star_zero_def star_of_def)  | 
|
220  | 
||
221  | 
lemma star_n_one_num: "1 = star_n (%n. 1)"  | 
|
222  | 
by (simp only: star_one_def star_of_def)  | 
|
223  | 
||
224  | 
lemma star_n_abs:  | 
|
225  | 
"abs (star_n X) = star_n (%n. abs (X n))"  | 
|
226  | 
by (simp only: star_abs_def starfun_star_n)  | 
|
227  | 
||
228  | 
lemma hypreal_omega_gt_zero [simp]: "0 < omega"  | 
|
229  | 
by (simp add: omega_def star_n_zero_num star_n_less)  | 
|
230  | 
||
231  | 
subsection{*Existence of Infinite Hyperreal Number*}
 | 
|
232  | 
||
233  | 
text{*Existence of infinite number not corresponding to any real number.
 | 
|
234  | 
Use assumption that member @{term FreeUltrafilterNat} is not finite.*}
 | 
|
235  | 
||
236  | 
||
237  | 
text{*A few lemmas first*}
 | 
|
238  | 
||
| 
56217
 
dc429a5b13c4
Some rationalisation of basic lemmas
 
paulson <lp15@cam.ac.uk> 
parents: 
55911 
diff
changeset
 | 
239  | 
lemma lemma_omega_empty_singleton_disj: "{n::nat. x = real n} = {} |
 | 
| 27468 | 240  | 
      (\<exists>y. {n::nat. x = real n} = {y})"
 | 
241  | 
by force  | 
|
242  | 
||
243  | 
lemma lemma_finite_omega_set: "finite {n::nat. x = real n}"
 | 
|
244  | 
by (cut_tac x = x in lemma_omega_empty_singleton_disj, auto)  | 
|
245  | 
||
| 
56217
 
dc429a5b13c4
Some rationalisation of basic lemmas
 
paulson <lp15@cam.ac.uk> 
parents: 
55911 
diff
changeset
 | 
246  | 
lemma not_ex_hypreal_of_real_eq_omega:  | 
| 27468 | 247  | 
"~ (\<exists>x. hypreal_of_real x = omega)"  | 
248  | 
apply (simp add: omega_def)  | 
|
249  | 
apply (simp add: star_of_def star_n_eq_iff)  | 
|
| 
56217
 
dc429a5b13c4
Some rationalisation of basic lemmas
 
paulson <lp15@cam.ac.uk> 
parents: 
55911 
diff
changeset
 | 
250  | 
apply (auto simp add: real_of_nat_Suc diff_eq_eq [symmetric]  | 
| 27468 | 251  | 
lemma_finite_omega_set [THEN FreeUltrafilterNat.finite])  | 
252  | 
done  | 
|
253  | 
||
254  | 
lemma hypreal_of_real_not_eq_omega: "hypreal_of_real x \<noteq> omega"  | 
|
255  | 
by (insert not_ex_hypreal_of_real_eq_omega, auto)  | 
|
256  | 
||
257  | 
text{*Existence of infinitesimal number also not corresponding to any
 | 
|
258  | 
real number*}  | 
|
259  | 
||
260  | 
lemma lemma_epsilon_empty_singleton_disj:  | 
|
| 
56217
 
dc429a5b13c4
Some rationalisation of basic lemmas
 
paulson <lp15@cam.ac.uk> 
parents: 
55911 
diff
changeset
 | 
261  | 
     "{n::nat. x = inverse(real(Suc n))} = {} |
 | 
| 27468 | 262  | 
      (\<exists>y. {n::nat. x = inverse(real(Suc n))} = {y})"
 | 
263  | 
by auto  | 
|
264  | 
||
265  | 
lemma lemma_finite_epsilon_set: "finite {n. x = inverse(real(Suc n))}"
 | 
|
266  | 
by (cut_tac x = x in lemma_epsilon_empty_singleton_disj, auto)  | 
|
267  | 
||
268  | 
lemma not_ex_hypreal_of_real_eq_epsilon: "~ (\<exists>x. hypreal_of_real x = epsilon)"  | 
|
269  | 
by (auto simp add: epsilon_def star_of_def star_n_eq_iff  | 
|
270  | 
lemma_finite_epsilon_set [THEN FreeUltrafilterNat.finite])  | 
|
271  | 
||
272  | 
lemma hypreal_of_real_not_eq_epsilon: "hypreal_of_real x \<noteq> epsilon"  | 
|
273  | 
by (insert not_ex_hypreal_of_real_eq_epsilon, auto)  | 
|
274  | 
||
275  | 
lemma hypreal_epsilon_not_zero: "epsilon \<noteq> 0"  | 
|
276  | 
by (simp add: epsilon_def star_zero_def star_of_def star_n_eq_iff  | 
|
277  | 
del: star_of_zero)  | 
|
278  | 
||
279  | 
lemma hypreal_epsilon_inverse_omega: "epsilon = inverse(omega)"  | 
|
280  | 
by (simp add: epsilon_def omega_def star_n_inverse)  | 
|
281  | 
||
282  | 
lemma hypreal_epsilon_gt_zero: "0 < epsilon"  | 
|
283  | 
by (simp add: hypreal_epsilon_inverse_omega)  | 
|
284  | 
||
285  | 
subsection{*Absolute Value Function for the Hyperreals*}
 | 
|
286  | 
||
287  | 
lemma hrabs_add_less:  | 
|
288  | 
"[| abs x < r; abs y < s |] ==> abs(x+y) < r + (s::hypreal)"  | 
|
289  | 
by (simp add: abs_if split: split_if_asm)  | 
|
290  | 
||
291  | 
lemma hrabs_less_gt_zero: "abs x < r ==> (0::hypreal) < r"  | 
|
292  | 
by (blast intro!: order_le_less_trans abs_ge_zero)  | 
|
293  | 
||
294  | 
lemma hrabs_disj: "abs x = (x::'a::abs_if) | abs x = -x"  | 
|
295  | 
by (simp add: abs_if)  | 
|
296  | 
||
297  | 
lemma hrabs_add_lemma_disj: "(y::hypreal) + - x + (y + - z) = abs (x + - z) ==> y = z | x = y"  | 
|
298  | 
by (simp add: abs_if split add: split_if_asm)  | 
|
299  | 
||
300  | 
||
301  | 
subsection{*Embedding the Naturals into the Hyperreals*}
 | 
|
302  | 
||
303  | 
abbreviation  | 
|
304  | 
hypreal_of_nat :: "nat => hypreal" where  | 
|
305  | 
"hypreal_of_nat == of_nat"  | 
|
306  | 
||
307  | 
lemma SNat_eq: "Nats = {n. \<exists>N. n = hypreal_of_nat N}"
 | 
|
308  | 
by (simp add: Nats_def image_def)  | 
|
309  | 
||
310  | 
(*------------------------------------------------------------*)  | 
|
311  | 
(* naturals embedded in hyperreals *)  | 
|
312  | 
(* is a hyperreal c.f. NS extension *)  | 
|
313  | 
(*------------------------------------------------------------*)  | 
|
314  | 
||
315  | 
lemma hypreal_of_nat_eq:  | 
|
316  | 
"hypreal_of_nat (n::nat) = hypreal_of_real (real n)"  | 
|
317  | 
by (simp add: real_of_nat_def)  | 
|
318  | 
||
319  | 
lemma hypreal_of_nat:  | 
|
320  | 
"hypreal_of_nat m = star_n (%n. real m)"  | 
|
321  | 
apply (fold star_of_def)  | 
|
322  | 
apply (simp add: real_of_nat_def)  | 
|
323  | 
done  | 
|
324  | 
||
325  | 
(*  | 
|
326  | 
FIXME: we should declare this, as for type int, but many proofs would break.  | 
|
327  | 
It replaces x+-y by x-y.  | 
|
328  | 
Addsimps [symmetric hypreal_diff_def]  | 
|
329  | 
*)  | 
|
330  | 
||
| 31100 | 331  | 
declaration {*
 | 
332  | 
  K (Lin_Arith.add_inj_thms [@{thm star_of_le} RS iffD2,
 | 
|
333  | 
    @{thm star_of_less} RS iffD2, @{thm star_of_eq} RS iffD2]
 | 
|
334  | 
  #> Lin_Arith.add_simps [@{thm star_of_zero}, @{thm star_of_one},
 | 
|
| 
55911
 
d00023bd3554
remove simp rules made redundant by the replacement of neg_numeral with negated numerals
 
huffman 
parents: 
54489 
diff
changeset
 | 
335  | 
      @{thm star_of_numeral}, @{thm star_of_add},
 | 
| 
47108
 
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
 
huffman 
parents: 
45605 
diff
changeset
 | 
336  | 
      @{thm star_of_minus}, @{thm star_of_diff}, @{thm star_of_mult}]
 | 
| 43595 | 337  | 
  #> Lin_Arith.add_inj_const (@{const_name "StarDef.star_of"}, @{typ "real \<Rightarrow> hypreal"}))
 | 
| 31100 | 338  | 
*}  | 
| 27468 | 339  | 
|
| 43595 | 340  | 
simproc_setup fast_arith_hypreal ("(m::hypreal) < n" | "(m::hypreal) <= n" | "(m::hypreal) = n") =
 | 
341  | 
  {* fn _ => fn ss => fn ct => Lin_Arith.simproc ss (term_of ct) *}
 | 
|
342  | 
||
| 27468 | 343  | 
|
344  | 
subsection {* Exponentials on the Hyperreals *}
 | 
|
345  | 
||
346  | 
lemma hpowr_0 [simp]: "r ^ 0 = (1::hypreal)"  | 
|
347  | 
by (rule power_0)  | 
|
348  | 
||
349  | 
lemma hpowr_Suc [simp]: "r ^ (Suc n) = (r::hypreal) * (r ^ n)"  | 
|
350  | 
by (rule power_Suc)  | 
|
351  | 
||
352  | 
lemma hrealpow_two: "(r::hypreal) ^ Suc (Suc 0) = r * r"  | 
|
353  | 
by simp  | 
|
354  | 
||
355  | 
lemma hrealpow_two_le [simp]: "(0::hypreal) \<le> r ^ Suc (Suc 0)"  | 
|
356  | 
by (auto simp add: zero_le_mult_iff)  | 
|
357  | 
||
358  | 
lemma hrealpow_two_le_add_order [simp]:  | 
|
359  | 
"(0::hypreal) \<le> u ^ Suc (Suc 0) + v ^ Suc (Suc 0)"  | 
|
360  | 
by (simp only: hrealpow_two_le add_nonneg_nonneg)  | 
|
361  | 
||
362  | 
lemma hrealpow_two_le_add_order2 [simp]:  | 
|
363  | 
"(0::hypreal) \<le> u ^ Suc (Suc 0) + v ^ Suc (Suc 0) + w ^ Suc (Suc 0)"  | 
|
364  | 
by (simp only: hrealpow_two_le add_nonneg_nonneg)  | 
|
365  | 
||
366  | 
lemma hypreal_add_nonneg_eq_0_iff:  | 
|
367  | 
"[| 0 \<le> x; 0 \<le> y |] ==> (x+y = 0) = (x = 0 & y = (0::hypreal))"  | 
|
368  | 
by arith  | 
|
369  | 
||
370  | 
||
371  | 
text{*FIXME: DELETE THESE*}
 | 
|
372  | 
lemma hypreal_three_squares_add_zero_iff:  | 
|
373  | 
"(x*x + y*y + z*z = 0) = (x = 0 & y = 0 & z = (0::hypreal))"  | 
|
374  | 
apply (simp only: zero_le_square add_nonneg_nonneg hypreal_add_nonneg_eq_0_iff, auto)  | 
|
375  | 
done  | 
|
376  | 
||
377  | 
lemma hrealpow_three_squares_add_zero_iff [simp]:  | 
|
| 
56217
 
dc429a5b13c4
Some rationalisation of basic lemmas
 
paulson <lp15@cam.ac.uk> 
parents: 
55911 
diff
changeset
 | 
378  | 
"(x ^ Suc (Suc 0) + y ^ Suc (Suc 0) + z ^ Suc (Suc 0) = (0::hypreal)) =  | 
| 27468 | 379  | 
(x = 0 & y = 0 & z = 0)"  | 
380  | 
by (simp only: hypreal_three_squares_add_zero_iff hrealpow_two)  | 
|
381  | 
||
382  | 
(*FIXME: This and RealPow.abs_realpow_two should be replaced by an abstract  | 
|
| 
35050
 
9f841f20dca6
renamed OrderedGroup to Groups; split theory Ring_and_Field into Rings Fields
 
haftmann 
parents: 
35043 
diff
changeset
 | 
383  | 
result proved in Rings or Fields*)  | 
| 27468 | 384  | 
lemma hrabs_hrealpow_two [simp]:  | 
385  | 
"abs(x ^ Suc (Suc 0)) = (x::hypreal) ^ Suc (Suc 0)"  | 
|
386  | 
by (simp add: abs_mult)  | 
|
387  | 
||
388  | 
lemma two_hrealpow_ge_one [simp]: "(1::hypreal) \<le> 2 ^ n"  | 
|
389  | 
by (insert power_increasing [of 0 n "2::hypreal"], simp)  | 
|
390  | 
||
391  | 
lemma two_hrealpow_gt [simp]: "hypreal_of_nat n < 2 ^ n"  | 
|
392  | 
apply (induct n)  | 
|
| 
49962
 
a8cc904a6820
Renamed {left,right}_distrib to distrib_{right,left}.
 
webertj 
parents: 
47195 
diff
changeset
 | 
393  | 
apply (auto simp add: distrib_right)  | 
| 27468 | 394  | 
apply (cut_tac n = n in two_hrealpow_ge_one, arith)  | 
395  | 
done  | 
|
396  | 
||
397  | 
lemma hrealpow:  | 
|
398  | 
"star_n X ^ m = star_n (%n. (X n::real) ^ m)"  | 
|
399  | 
apply (induct_tac "m")  | 
|
400  | 
apply (auto simp add: star_n_one_num star_n_mult power_0)  | 
|
401  | 
done  | 
|
402  | 
||
403  | 
lemma hrealpow_sum_square_expand:  | 
|
404  | 
"(x + (y::hypreal)) ^ Suc (Suc 0) =  | 
|
405  | 
x ^ Suc (Suc 0) + y ^ Suc (Suc 0) + (hypreal_of_nat (Suc (Suc 0)))*x*y"  | 
|
| 
49962
 
a8cc904a6820
Renamed {left,right}_distrib to distrib_{right,left}.
 
webertj 
parents: 
47195 
diff
changeset
 | 
406  | 
by (simp add: distrib_left distrib_right)  | 
| 27468 | 407  | 
|
| 
47108
 
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
 
huffman 
parents: 
45605 
diff
changeset
 | 
408  | 
lemma power_hypreal_of_real_numeral:  | 
| 
 
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
 
huffman 
parents: 
45605 
diff
changeset
 | 
409  | 
"(numeral v :: hypreal) ^ n = hypreal_of_real ((numeral v) ^ n)"  | 
| 27468 | 410  | 
by simp  | 
| 
47108
 
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
 
huffman 
parents: 
45605 
diff
changeset
 | 
411  | 
declare power_hypreal_of_real_numeral [of _ "numeral w", simp] for w  | 
| 
 
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
 
huffman 
parents: 
45605 
diff
changeset
 | 
412  | 
|
| 
 
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
 
huffman 
parents: 
45605 
diff
changeset
 | 
413  | 
lemma power_hypreal_of_real_neg_numeral:  | 
| 
54489
 
03ff4d1e6784
eliminiated neg_numeral in favour of - (numeral _)
 
haftmann 
parents: 
51525 
diff
changeset
 | 
414  | 
"(- numeral v :: hypreal) ^ n = hypreal_of_real ((- numeral v) ^ n)"  | 
| 
47108
 
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
 
huffman 
parents: 
45605 
diff
changeset
 | 
415  | 
by simp  | 
| 
 
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
 
huffman 
parents: 
45605 
diff
changeset
 | 
416  | 
declare power_hypreal_of_real_neg_numeral [of _ "numeral w", simp] for w  | 
| 27468 | 417  | 
(*  | 
418  | 
lemma hrealpow_HFinite:  | 
|
| 31017 | 419  | 
  fixes x :: "'a::{real_normed_algebra,power} star"
 | 
| 27468 | 420  | 
shows "x \<in> HFinite ==> x ^ n \<in> HFinite"  | 
421  | 
apply (induct_tac "n")  | 
|
422  | 
apply (auto simp add: power_Suc intro: HFinite_mult)  | 
|
423  | 
done  | 
|
424  | 
*)  | 
|
425  | 
||
426  | 
subsection{*Powers with Hypernatural Exponents*}
 | 
|
427  | 
||
| 31001 | 428  | 
definition pow :: "['a::power star, nat star] \<Rightarrow> 'a star" (infixr "pow" 80) where  | 
| 37765 | 429  | 
hyperpow_def [transfer_unfold]: "R pow N = ( *f2* op ^) R N"  | 
| 27468 | 430  | 
(* hypernatural powers of hyperreals *)  | 
431  | 
||
432  | 
lemma Standard_hyperpow [simp]:  | 
|
433  | 
"\<lbrakk>r \<in> Standard; n \<in> Standard\<rbrakk> \<Longrightarrow> r pow n \<in> Standard"  | 
|
434  | 
unfolding hyperpow_def by simp  | 
|
435  | 
||
436  | 
lemma hyperpow: "star_n X pow star_n Y = star_n (%n. X n ^ Y n)"  | 
|
437  | 
by (simp add: hyperpow_def starfun2_star_n)  | 
|
438  | 
||
439  | 
lemma hyperpow_zero [simp]:  | 
|
| 31017 | 440  | 
  "\<And>n. (0::'a::{power,semiring_0} star) pow (n + (1::hypnat)) = 0"
 | 
| 27468 | 441  | 
by transfer simp  | 
442  | 
||
443  | 
lemma hyperpow_not_zero:  | 
|
| 31017 | 444  | 
  "\<And>r n. r \<noteq> (0::'a::{field} star) ==> r pow n \<noteq> 0"
 | 
| 27468 | 445  | 
by transfer (rule field_power_not_zero)  | 
446  | 
||
447  | 
lemma hyperpow_inverse:  | 
|
| 36409 | 448  | 
"\<And>r n. r \<noteq> (0::'a::field_inverse_zero star)  | 
| 27468 | 449  | 
\<Longrightarrow> inverse (r pow n) = (inverse r) pow n"  | 
450  | 
by transfer (rule power_inverse)  | 
|
| 
56217
 
dc429a5b13c4
Some rationalisation of basic lemmas
 
paulson <lp15@cam.ac.uk> 
parents: 
55911 
diff
changeset
 | 
451  | 
|
| 27468 | 452  | 
lemma hyperpow_hrabs:  | 
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
31101 
diff
changeset
 | 
453  | 
  "\<And>r n. abs (r::'a::{linordered_idom} star) pow n = abs (r pow n)"
 | 
| 27468 | 454  | 
by transfer (rule power_abs [symmetric])  | 
455  | 
||
456  | 
lemma hyperpow_add:  | 
|
| 31017 | 457  | 
"\<And>r n m. (r::'a::monoid_mult star) pow (n + m) = (r pow n) * (r pow m)"  | 
| 27468 | 458  | 
by transfer (rule power_add)  | 
459  | 
||
460  | 
lemma hyperpow_one [simp]:  | 
|
| 31001 | 461  | 
"\<And>r. (r::'a::monoid_mult star) pow (1::hypnat) = r"  | 
| 27468 | 462  | 
by transfer (rule power_one_right)  | 
463  | 
||
464  | 
lemma hyperpow_two:  | 
|
| 
45542
 
4849dbe6e310
HOL-NSA: add number_semiring instance, reformulate several lemmas using '2' instead of '1+1'
 
huffman 
parents: 
43595 
diff
changeset
 | 
465  | 
"\<And>r. (r::'a::monoid_mult star) pow (2::hypnat) = r * r"  | 
| 
 
4849dbe6e310
HOL-NSA: add number_semiring instance, reformulate several lemmas using '2' instead of '1+1'
 
huffman 
parents: 
43595 
diff
changeset
 | 
466  | 
by transfer (rule power2_eq_square)  | 
| 27468 | 467  | 
|
468  | 
lemma hyperpow_gt_zero:  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
31101 
diff
changeset
 | 
469  | 
  "\<And>r n. (0::'a::{linordered_semidom} star) < r \<Longrightarrow> 0 < r pow n"
 | 
| 27468 | 470  | 
by transfer (rule zero_less_power)  | 
471  | 
||
472  | 
lemma hyperpow_ge_zero:  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
31101 
diff
changeset
 | 
473  | 
  "\<And>r n. (0::'a::{linordered_semidom} star) \<le> r \<Longrightarrow> 0 \<le> r pow n"
 | 
| 27468 | 474  | 
by transfer (rule zero_le_power)  | 
475  | 
||
476  | 
lemma hyperpow_le:  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
31101 
diff
changeset
 | 
477  | 
  "\<And>x y n. \<lbrakk>(0::'a::{linordered_semidom} star) < x; x \<le> y\<rbrakk>
 | 
| 27468 | 478  | 
\<Longrightarrow> x pow n \<le> y pow n"  | 
479  | 
by transfer (rule power_mono [OF _ order_less_imp_le])  | 
|
480  | 
||
481  | 
lemma hyperpow_eq_one [simp]:  | 
|
| 31017 | 482  | 
"\<And>n. 1 pow n = (1::'a::monoid_mult star)"  | 
| 27468 | 483  | 
by transfer (rule power_one)  | 
484  | 
||
| 
55911
 
d00023bd3554
remove simp rules made redundant by the replacement of neg_numeral with negated numerals
 
huffman 
parents: 
54489 
diff
changeset
 | 
485  | 
lemma hrabs_hyperpow_minus [simp]:  | 
| 
 
d00023bd3554
remove simp rules made redundant by the replacement of neg_numeral with negated numerals
 
huffman 
parents: 
54489 
diff
changeset
 | 
486  | 
  "\<And>(a::'a::{linordered_idom} star) n. abs((-a) pow n) = abs (a pow n)"
 | 
| 
 
d00023bd3554
remove simp rules made redundant by the replacement of neg_numeral with negated numerals
 
huffman 
parents: 
54489 
diff
changeset
 | 
487  | 
by transfer (rule abs_power_minus)  | 
| 27468 | 488  | 
|
489  | 
lemma hyperpow_mult:  | 
|
| 31017 | 490  | 
  "\<And>r s n. (r * s::'a::{comm_monoid_mult} star) pow n
 | 
| 27468 | 491  | 
= (r pow n) * (s pow n)"  | 
492  | 
by transfer (rule power_mult_distrib)  | 
|
493  | 
||
494  | 
lemma hyperpow_two_le [simp]:  | 
|
| 
45542
 
4849dbe6e310
HOL-NSA: add number_semiring instance, reformulate several lemmas using '2' instead of '1+1'
 
huffman 
parents: 
43595 
diff
changeset
 | 
495  | 
  "\<And>r. (0::'a::{monoid_mult,linordered_ring_strict} star) \<le> r pow 2"
 | 
| 27468 | 496  | 
by (auto simp add: hyperpow_two zero_le_mult_iff)  | 
497  | 
||
498  | 
lemma hrabs_hyperpow_two [simp]:  | 
|
| 
45542
 
4849dbe6e310
HOL-NSA: add number_semiring instance, reformulate several lemmas using '2' instead of '1+1'
 
huffman 
parents: 
43595 
diff
changeset
 | 
499  | 
"abs(x pow 2) =  | 
| 
 
4849dbe6e310
HOL-NSA: add number_semiring instance, reformulate several lemmas using '2' instead of '1+1'
 
huffman 
parents: 
43595 
diff
changeset
 | 
500  | 
   (x::'a::{monoid_mult,linordered_ring_strict} star) pow 2"
 | 
| 27468 | 501  | 
by (simp only: abs_of_nonneg hyperpow_two_le)  | 
502  | 
||
503  | 
lemma hyperpow_two_hrabs [simp]:  | 
|
| 
45542
 
4849dbe6e310
HOL-NSA: add number_semiring instance, reformulate several lemmas using '2' instead of '1+1'
 
huffman 
parents: 
43595 
diff
changeset
 | 
504  | 
  "abs(x::'a::{linordered_idom} star) pow 2 = x pow 2"
 | 
| 27468 | 505  | 
by (simp add: hyperpow_hrabs)  | 
506  | 
||
507  | 
text{*The precondition could be weakened to @{term "0\<le>x"}*}
 | 
|
508  | 
lemma hypreal_mult_less_mono:  | 
|
509  | 
"[| u<v; x<y; (0::hypreal) < v; 0 < x |] ==> u*x < v* y"  | 
|
| 
35050
 
9f841f20dca6
renamed OrderedGroup to Groups; split theory Ring_and_Field into Rings Fields
 
haftmann 
parents: 
35043 
diff
changeset
 | 
510  | 
by (simp add: mult_strict_mono order_less_imp_le)  | 
| 27468 | 511  | 
|
512  | 
lemma hyperpow_two_gt_one:  | 
|
| 
45542
 
4849dbe6e310
HOL-NSA: add number_semiring instance, reformulate several lemmas using '2' instead of '1+1'
 
huffman 
parents: 
43595 
diff
changeset
 | 
513  | 
  "\<And>r::'a::{linordered_semidom} star. 1 < r \<Longrightarrow> 1 < r pow 2"
 | 
| 
 
4849dbe6e310
HOL-NSA: add number_semiring instance, reformulate several lemmas using '2' instead of '1+1'
 
huffman 
parents: 
43595 
diff
changeset
 | 
514  | 
by transfer simp  | 
| 27468 | 515  | 
|
516  | 
lemma hyperpow_two_ge_one:  | 
|
| 
45542
 
4849dbe6e310
HOL-NSA: add number_semiring instance, reformulate several lemmas using '2' instead of '1+1'
 
huffman 
parents: 
43595 
diff
changeset
 | 
517  | 
  "\<And>r::'a::{linordered_semidom} star. 1 \<le> r \<Longrightarrow> 1 \<le> r pow 2"
 | 
| 
 
4849dbe6e310
HOL-NSA: add number_semiring instance, reformulate several lemmas using '2' instead of '1+1'
 
huffman 
parents: 
43595 
diff
changeset
 | 
518  | 
by transfer (rule one_le_power)  | 
| 27468 | 519  | 
|
520  | 
lemma two_hyperpow_ge_one [simp]: "(1::hypreal) \<le> 2 pow n"  | 
|
521  | 
apply (rule_tac y = "1 pow n" in order_trans)  | 
|
522  | 
apply (rule_tac [2] hyperpow_le, auto)  | 
|
523  | 
done  | 
|
524  | 
||
525  | 
lemma hyperpow_minus_one2 [simp]:  | 
|
| 
45542
 
4849dbe6e310
HOL-NSA: add number_semiring instance, reformulate several lemmas using '2' instead of '1+1'
 
huffman 
parents: 
43595 
diff
changeset
 | 
526  | 
"\<And>n. -1 pow (2*n) = (1::hypreal)"  | 
| 
47195
 
836bf25fb70f
remove duplicate lemmas power_m1_{even,odd} in favor of power_minus1_{even,odd}
 
huffman 
parents: 
47108 
diff
changeset
 | 
527  | 
by transfer (rule power_minus1_even)  | 
| 27468 | 528  | 
|
529  | 
lemma hyperpow_less_le:  | 
|
530  | 
"!!r n N. [|(0::hypreal) \<le> r; r \<le> 1; n < N|] ==> r pow N \<le> r pow n"  | 
|
531  | 
by transfer (rule power_decreasing [OF order_less_imp_le])  | 
|
532  | 
||
533  | 
lemma hyperpow_SHNat_le:  | 
|
534  | 
"[| 0 \<le> r; r \<le> (1::hypreal); N \<in> HNatInfinite |]  | 
|
535  | 
==> ALL n: Nats. r pow N \<le> r pow n"  | 
|
536  | 
by (auto intro!: hyperpow_less_le simp add: HNatInfinite_iff)  | 
|
537  | 
||
538  | 
lemma hyperpow_realpow:  | 
|
539  | 
"(hypreal_of_real r) pow (hypnat_of_nat n) = hypreal_of_real (r ^ n)"  | 
|
540  | 
by transfer (rule refl)  | 
|
541  | 
||
542  | 
lemma hyperpow_SReal [simp]:  | 
|
543  | 
"(hypreal_of_real r) pow (hypnat_of_nat n) \<in> Reals"  | 
|
544  | 
by (simp add: Reals_eq_Standard)  | 
|
545  | 
||
546  | 
lemma hyperpow_zero_HNatInfinite [simp]:  | 
|
547  | 
"N \<in> HNatInfinite ==> (0::hypreal) pow N = 0"  | 
|
548  | 
by (drule HNatInfinite_is_Suc, auto)  | 
|
549  | 
||
550  | 
lemma hyperpow_le_le:  | 
|
551  | 
"[| (0::hypreal) \<le> r; r \<le> 1; n \<le> N |] ==> r pow N \<le> r pow n"  | 
|
552  | 
apply (drule order_le_less [of n, THEN iffD1])  | 
|
553  | 
apply (auto intro: hyperpow_less_le)  | 
|
554  | 
done  | 
|
555  | 
||
556  | 
lemma hyperpow_Suc_le_self2:  | 
|
557  | 
"[| (0::hypreal) \<le> r; r < 1 |] ==> r pow (n + (1::hypnat)) \<le> r"  | 
|
558  | 
apply (drule_tac n = " (1::hypnat) " in hyperpow_le_le)  | 
|
559  | 
apply auto  | 
|
560  | 
done  | 
|
561  | 
||
562  | 
lemma hyperpow_hypnat_of_nat: "\<And>x. x pow hypnat_of_nat n = x ^ n"  | 
|
563  | 
by transfer (rule refl)  | 
|
564  | 
||
565  | 
lemma of_hypreal_hyperpow:  | 
|
566  | 
"\<And>x n. of_hypreal (x pow n) =  | 
|
| 31017 | 567  | 
   (of_hypreal x::'a::{real_algebra_1} star) pow n"
 | 
| 27468 | 568  | 
by transfer (rule of_real_power)  | 
569  | 
||
570  | 
end  |