| author | paulson | 
| Wed, 17 Dec 2003 16:23:52 +0100 | |
| changeset 14299 | 0b5c0b0a3eba | 
| parent 13487 | 1291c6375c29 | 
| child 14301 | 48dc606749bd | 
| permissions | -rw-r--r-- | 
| 10751 | 1  | 
(* Title : HOL/Real/Hyperreal/HyperDef.thy  | 
2  | 
ID : $Id$  | 
|
3  | 
Author : Jacques D. Fleuriot  | 
|
4  | 
Copyright : 1998 University of Cambridge  | 
|
5  | 
Description : Construction of hyperreals using ultrafilters  | 
|
| 13487 | 6  | 
*)  | 
| 10751 | 7  | 
|
| 14299 | 8  | 
theory HyperDef = Filter + Real  | 
9  | 
files ("fuf.ML"):  (*Warning: file fuf.ML refers to the name Hyperdef!*)
 | 
|
| 10751 | 10  | 
|
11  | 
||
12  | 
constdefs  | 
|
| 14299 | 13  | 
|
14  | 
  FreeUltrafilterNat   :: "nat set set"    ("\\<U>")
 | 
|
15  | 
"FreeUltrafilterNat == (SOME U. U \<in> FreeUltrafilter (UNIV:: nat set))"  | 
|
16  | 
||
17  | 
hyprel :: "((nat=>real)*(nat=>real)) set"  | 
|
18  | 
    "hyprel == {p. \<exists>X Y. p = ((X::nat=>real),Y) &
 | 
|
| 10751 | 19  | 
                   {n::nat. X(n) = Y(n)}: FreeUltrafilterNat}"
 | 
20  | 
||
| 14299 | 21  | 
typedef hypreal = "UNIV//hyprel"  | 
22  | 
by (auto simp add: quotient_def)  | 
|
| 10751 | 23  | 
|
| 14299 | 24  | 
instance hypreal :: ord ..  | 
25  | 
instance hypreal :: zero ..  | 
|
26  | 
instance hypreal :: one ..  | 
|
27  | 
instance hypreal :: plus ..  | 
|
28  | 
instance hypreal :: times ..  | 
|
29  | 
instance hypreal :: minus ..  | 
|
30  | 
instance hypreal :: inverse ..  | 
|
| 10751 | 31  | 
|
32  | 
||
| 14299 | 33  | 
defs (overloaded)  | 
34  | 
||
35  | 
hypreal_zero_def:  | 
|
| 
12018
 
ec054019c910
Numerals and simprocs for types real and hypreal.  The abstract
 
paulson 
parents: 
11713 
diff
changeset
 | 
36  | 
  "0 == Abs_hypreal(hyprel``{%n::nat. (0::real)})"
 | 
| 10751 | 37  | 
|
| 14299 | 38  | 
hypreal_one_def:  | 
| 
12018
 
ec054019c910
Numerals and simprocs for types real and hypreal.  The abstract
 
paulson 
parents: 
11713 
diff
changeset
 | 
39  | 
  "1 == Abs_hypreal(hyprel``{%n::nat. (1::real)})"
 | 
| 10751 | 40  | 
|
| 14299 | 41  | 
hypreal_minus_def:  | 
42  | 
  "- P == Abs_hypreal(\<Union>X \<in> Rep_hypreal(P). hyprel``{%n::nat. - (X n)})"
 | 
|
| 10751 | 43  | 
|
| 14299 | 44  | 
hypreal_diff_def:  | 
| 10751 | 45  | 
"x - y == x + -(y::hypreal)"  | 
46  | 
||
| 14299 | 47  | 
hypreal_inverse_def:  | 
48  | 
"inverse P == Abs_hypreal(\<Union>X \<in> Rep_hypreal(P).  | 
|
| 
12018
 
ec054019c910
Numerals and simprocs for types real and hypreal.  The abstract
 
paulson 
parents: 
11713 
diff
changeset
 | 
49  | 
                    hyprel``{%n. if X n = 0 then 0 else inverse (X n)})"
 | 
| 10751 | 50  | 
|
| 14299 | 51  | 
hypreal_divide_def:  | 
| 10751 | 52  | 
"P / Q::hypreal == P * inverse Q"  | 
| 13487 | 53  | 
|
| 10751 | 54  | 
constdefs  | 
55  | 
||
| 14299 | 56  | 
hypreal_of_real :: "real => hypreal"  | 
| 10834 | 57  | 
  "hypreal_of_real r         == Abs_hypreal(hyprel``{%n::nat. r})"
 | 
| 10751 | 58  | 
|
| 
10919
 
144ede948e58
renamings: real_of_nat, real_of_int -> (overloaded) real
 
paulson 
parents: 
10834 
diff
changeset
 | 
59  | 
omega :: hypreal (*an infinite number = [<1,2,3,...>] *)  | 
| 
 
144ede948e58
renamings: real_of_nat, real_of_int -> (overloaded) real
 
paulson 
parents: 
10834 
diff
changeset
 | 
60  | 
  "omega == Abs_hypreal(hyprel``{%n::nat. real (Suc n)})"
 | 
| 13487 | 61  | 
|
| 
10919
 
144ede948e58
renamings: real_of_nat, real_of_int -> (overloaded) real
 
paulson 
parents: 
10834 
diff
changeset
 | 
62  | 
epsilon :: hypreal (*an infinitesimal number = [<1,1/2,1/3,...>] *)  | 
| 
 
144ede948e58
renamings: real_of_nat, real_of_int -> (overloaded) real
 
paulson 
parents: 
10834 
diff
changeset
 | 
63  | 
  "epsilon == Abs_hypreal(hyprel``{%n::nat. inverse (real (Suc n))})"
 | 
| 
 
144ede948e58
renamings: real_of_nat, real_of_int -> (overloaded) real
 
paulson 
parents: 
10834 
diff
changeset
 | 
64  | 
|
| 
 
144ede948e58
renamings: real_of_nat, real_of_int -> (overloaded) real
 
paulson 
parents: 
10834 
diff
changeset
 | 
65  | 
syntax (xsymbols)  | 
| 14299 | 66  | 
  omega   :: hypreal   ("\<omega>")
 | 
67  | 
  epsilon :: hypreal   ("\<epsilon>")
 | 
|
| 
10919
 
144ede948e58
renamings: real_of_nat, real_of_int -> (overloaded) real
 
paulson 
parents: 
10834 
diff
changeset
 | 
68  | 
|
| 10751 | 69  | 
|
| 13487 | 70  | 
defs  | 
71  | 
||
| 14299 | 72  | 
hypreal_add_def:  | 
73  | 
"P + Q == Abs_hypreal(\<Union>X \<in> Rep_hypreal(P). \<Union>Y \<in> Rep_hypreal(Q).  | 
|
| 10834 | 74  | 
                hyprel``{%n::nat. X n + Y n})"
 | 
| 10751 | 75  | 
|
| 14299 | 76  | 
hypreal_mult_def:  | 
77  | 
"P * Q == Abs_hypreal(\<Union>X \<in> Rep_hypreal(P). \<Union>Y \<in> Rep_hypreal(Q).  | 
|
| 10834 | 78  | 
                hyprel``{%n::nat. X n * Y n})"
 | 
| 10751 | 79  | 
|
| 14299 | 80  | 
hypreal_less_def:  | 
81  | 
"P < (Q::hypreal) == \<exists>X Y. X \<in> Rep_hypreal(P) &  | 
|
82  | 
Y \<in> Rep_hypreal(Q) &  | 
|
83  | 
                               {n::nat. X n < Y n} \<in> FreeUltrafilterNat"
 | 
|
84  | 
hypreal_le_def:  | 
|
| 13487 | 85  | 
"P <= (Q::hypreal) == ~(Q < P)"  | 
| 10751 | 86  | 
|
| 14299 | 87  | 
(*------------------------------------------------------------------------  | 
88  | 
Proof that the set of naturals is not finite  | 
|
89  | 
------------------------------------------------------------------------*)  | 
|
90  | 
||
91  | 
(*** based on James' proof that the set of naturals is not finite ***)  | 
|
92  | 
lemma finite_exhausts [rule_format (no_asm)]: "finite (A::nat set) --> (\<exists>n. \<forall>m. Suc (n + m) \<notin> A)"  | 
|
93  | 
apply (rule impI)  | 
|
94  | 
apply (erule_tac F = "A" in finite_induct)  | 
|
95  | 
apply (blast , erule exE)  | 
|
96  | 
apply (rule_tac x = "n + x" in exI)  | 
|
97  | 
apply (rule allI , erule_tac x = "x + m" in allE)  | 
|
98  | 
apply (auto simp add: add_ac)  | 
|
99  | 
done  | 
|
100  | 
||
101  | 
lemma finite_not_covers [rule_format (no_asm)]: "finite (A :: nat set) --> (\<exists>n. n \<notin>A)"  | 
|
102  | 
apply (rule impI , drule finite_exhausts)  | 
|
103  | 
apply blast  | 
|
104  | 
done  | 
|
105  | 
||
106  | 
lemma not_finite_nat: "~ finite(UNIV:: nat set)"  | 
|
107  | 
apply (fast dest!: finite_exhausts)  | 
|
108  | 
done  | 
|
109  | 
||
110  | 
(*------------------------------------------------------------------------  | 
|
111  | 
Existence of free ultrafilter over the naturals and proof of various  | 
|
112  | 
properties of the FreeUltrafilterNat- an arbitrary free ultrafilter  | 
|
113  | 
------------------------------------------------------------------------*)  | 
|
114  | 
||
115  | 
lemma FreeUltrafilterNat_Ex: "\<exists>U. U: FreeUltrafilter (UNIV::nat set)"  | 
|
116  | 
apply (rule not_finite_nat [THEN FreeUltrafilter_Ex])  | 
|
117  | 
done  | 
|
118  | 
||
119  | 
lemma FreeUltrafilterNat_mem:  | 
|
120  | 
"FreeUltrafilterNat: FreeUltrafilter(UNIV:: nat set)"  | 
|
121  | 
apply (unfold FreeUltrafilterNat_def)  | 
|
122  | 
apply (rule FreeUltrafilterNat_Ex [THEN exE])  | 
|
123  | 
apply (rule someI2)  | 
|
124  | 
apply assumption+  | 
|
125  | 
done  | 
|
126  | 
declare FreeUltrafilterNat_mem [simp]  | 
|
127  | 
||
128  | 
lemma FreeUltrafilterNat_finite: "finite x ==> x \<notin> FreeUltrafilterNat"  | 
|
129  | 
apply (unfold FreeUltrafilterNat_def)  | 
|
130  | 
apply (rule FreeUltrafilterNat_Ex [THEN exE])  | 
|
131  | 
apply (rule someI2 , assumption)  | 
|
132  | 
apply (blast dest: mem_FreeUltrafiltersetD1)  | 
|
133  | 
done  | 
|
134  | 
||
135  | 
lemma FreeUltrafilterNat_not_finite: "x: FreeUltrafilterNat ==> ~ finite x"  | 
|
136  | 
apply (blast dest: FreeUltrafilterNat_finite)  | 
|
137  | 
done  | 
|
138  | 
||
139  | 
lemma FreeUltrafilterNat_empty: "{} \<notin> FreeUltrafilterNat"
 | 
|
140  | 
apply (unfold FreeUltrafilterNat_def)  | 
|
141  | 
apply (rule FreeUltrafilterNat_Ex [THEN exE])  | 
|
142  | 
apply (rule someI2 , assumption)  | 
|
143  | 
apply (blast dest: FreeUltrafilter_Ultrafilter Ultrafilter_Filter Filter_empty_not_mem)  | 
|
144  | 
done  | 
|
145  | 
declare FreeUltrafilterNat_empty [simp]  | 
|
146  | 
||
147  | 
lemma FreeUltrafilterNat_Int: "[| X: FreeUltrafilterNat; Y: FreeUltrafilterNat |]  | 
|
148  | 
==> X Int Y \<in> FreeUltrafilterNat"  | 
|
149  | 
apply (cut_tac FreeUltrafilterNat_mem)  | 
|
150  | 
apply (blast dest: FreeUltrafilter_Ultrafilter Ultrafilter_Filter mem_FiltersetD1)  | 
|
151  | 
done  | 
|
152  | 
||
153  | 
lemma FreeUltrafilterNat_subset: "[| X: FreeUltrafilterNat; X <= Y |]  | 
|
154  | 
==> Y \<in> FreeUltrafilterNat"  | 
|
155  | 
apply (cut_tac FreeUltrafilterNat_mem)  | 
|
156  | 
apply (blast dest: FreeUltrafilter_Ultrafilter Ultrafilter_Filter mem_FiltersetD2)  | 
|
157  | 
done  | 
|
158  | 
||
159  | 
lemma FreeUltrafilterNat_Compl: "X: FreeUltrafilterNat ==> -X \<notin> FreeUltrafilterNat"  | 
|
160  | 
apply (safe)  | 
|
161  | 
apply (drule FreeUltrafilterNat_Int , assumption)  | 
|
162  | 
apply auto  | 
|
163  | 
done  | 
|
164  | 
||
165  | 
lemma FreeUltrafilterNat_Compl_mem: "X\<notin> FreeUltrafilterNat ==> -X \<in> FreeUltrafilterNat"  | 
|
166  | 
apply (cut_tac FreeUltrafilterNat_mem [THEN FreeUltrafilter_iff [THEN iffD1]])  | 
|
167  | 
apply (safe , drule_tac x = "X" in bspec)  | 
|
168  | 
apply (auto simp add: UNIV_diff_Compl)  | 
|
169  | 
done  | 
|
170  | 
||
171  | 
lemma FreeUltrafilterNat_Compl_iff1: "(X \<notin> FreeUltrafilterNat) = (-X: FreeUltrafilterNat)"  | 
|
172  | 
apply (blast dest: FreeUltrafilterNat_Compl FreeUltrafilterNat_Compl_mem)  | 
|
173  | 
done  | 
|
174  | 
||
175  | 
lemma FreeUltrafilterNat_Compl_iff2: "(X: FreeUltrafilterNat) = (-X \<notin> FreeUltrafilterNat)"  | 
|
176  | 
apply (auto simp add: FreeUltrafilterNat_Compl_iff1 [symmetric])  | 
|
177  | 
done  | 
|
178  | 
||
179  | 
lemma FreeUltrafilterNat_UNIV: "(UNIV::nat set) \<in> FreeUltrafilterNat"  | 
|
180  | 
apply (rule FreeUltrafilterNat_mem [THEN FreeUltrafilter_Ultrafilter, THEN Ultrafilter_Filter, THEN mem_FiltersetD4])  | 
|
181  | 
done  | 
|
182  | 
declare FreeUltrafilterNat_UNIV [simp]  | 
|
183  | 
||
184  | 
lemma FreeUltrafilterNat_Nat_set: "UNIV \<in> FreeUltrafilterNat"  | 
|
185  | 
apply auto  | 
|
186  | 
done  | 
|
187  | 
declare FreeUltrafilterNat_Nat_set [simp]  | 
|
188  | 
||
189  | 
lemma FreeUltrafilterNat_Nat_set_refl: "{n. P(n) = P(n)} \<in> FreeUltrafilterNat"
 | 
|
190  | 
apply (simp (no_asm))  | 
|
191  | 
done  | 
|
192  | 
declare FreeUltrafilterNat_Nat_set_refl [intro]  | 
|
193  | 
||
194  | 
lemma FreeUltrafilterNat_P: "{n::nat. P} \<in> FreeUltrafilterNat ==> P"
 | 
|
195  | 
apply (rule ccontr)  | 
|
196  | 
apply simp  | 
|
197  | 
done  | 
|
198  | 
||
199  | 
lemma FreeUltrafilterNat_Ex_P: "{n. P(n)} \<in> FreeUltrafilterNat ==> \<exists>n. P(n)"
 | 
|
200  | 
apply (rule ccontr)  | 
|
201  | 
apply simp  | 
|
202  | 
done  | 
|
203  | 
||
204  | 
lemma FreeUltrafilterNat_all: "\<forall>n. P(n) ==> {n. P(n)} \<in> FreeUltrafilterNat"
 | 
|
205  | 
apply (auto intro: FreeUltrafilterNat_Nat_set)  | 
|
206  | 
done  | 
|
207  | 
||
208  | 
(*-------------------------------------------------------  | 
|
209  | 
Define and use Ultrafilter tactics  | 
|
210  | 
-------------------------------------------------------*)  | 
|
211  | 
use "fuf.ML"  | 
|
212  | 
||
213  | 
method_setup fuf = {*
 | 
|
214  | 
Method.ctxt_args (fn ctxt =>  | 
|
215  | 
Method.METHOD (fn facts =>  | 
|
216  | 
fuf_tac (Classical.get_local_claset ctxt,  | 
|
217  | 
Simplifier.get_local_simpset ctxt) 1)) *}  | 
|
218  | 
"free ultrafilter tactic"  | 
|
219  | 
||
220  | 
method_setup ultra = {*
 | 
|
221  | 
Method.ctxt_args (fn ctxt =>  | 
|
222  | 
Method.METHOD (fn facts =>  | 
|
223  | 
ultra_tac (Classical.get_local_claset ctxt,  | 
|
224  | 
Simplifier.get_local_simpset ctxt) 1)) *}  | 
|
225  | 
"ultrafilter tactic"  | 
|
226  | 
||
227  | 
||
228  | 
(*-------------------------------------------------------  | 
|
229  | 
Now prove one further property of our free ultrafilter  | 
|
230  | 
-------------------------------------------------------*)  | 
|
231  | 
lemma FreeUltrafilterNat_Un: "X Un Y: FreeUltrafilterNat  | 
|
232  | 
==> X: FreeUltrafilterNat | Y: FreeUltrafilterNat"  | 
|
233  | 
apply auto  | 
|
234  | 
apply (ultra)  | 
|
235  | 
done  | 
|
236  | 
||
237  | 
(*-------------------------------------------------------  | 
|
238  | 
Properties of hyprel  | 
|
239  | 
-------------------------------------------------------*)  | 
|
240  | 
||
241  | 
(** Proving that hyprel is an equivalence relation **)  | 
|
242  | 
(** Natural deduction for hyprel **)  | 
|
243  | 
||
244  | 
lemma hyprel_iff: "((X,Y): hyprel) = ({n. X n = Y n}: FreeUltrafilterNat)"
 | 
|
245  | 
apply (unfold hyprel_def)  | 
|
246  | 
apply fast  | 
|
247  | 
done  | 
|
248  | 
||
249  | 
lemma hyprel_refl: "(x,x): hyprel"  | 
|
250  | 
apply (unfold hyprel_def)  | 
|
251  | 
apply (auto simp add: FreeUltrafilterNat_Nat_set)  | 
|
252  | 
done  | 
|
253  | 
||
254  | 
lemma hyprel_sym [rule_format (no_asm)]: "(x,y): hyprel --> (y,x):hyprel"  | 
|
255  | 
apply (simp add: hyprel_def eq_commute)  | 
|
256  | 
done  | 
|
257  | 
||
258  | 
lemma hyprel_trans:  | 
|
259  | 
"[|(x,y): hyprel; (y,z):hyprel|] ==> (x,z):hyprel"  | 
|
260  | 
apply (unfold hyprel_def)  | 
|
261  | 
apply auto  | 
|
262  | 
apply (ultra)  | 
|
263  | 
done  | 
|
264  | 
||
265  | 
lemma equiv_hyprel: "equiv UNIV hyprel"  | 
|
266  | 
apply (simp add: equiv_def refl_def sym_def trans_def hyprel_refl)  | 
|
267  | 
apply (blast intro: hyprel_sym hyprel_trans)  | 
|
268  | 
done  | 
|
269  | 
||
270  | 
(* (hyprel `` {x} = hyprel `` {y}) = ((x,y) \<in> hyprel) *)
 | 
|
271  | 
lemmas equiv_hyprel_iff =  | 
|
272  | 
eq_equiv_class_iff [OF equiv_hyprel UNIV_I UNIV_I, simp]  | 
|
273  | 
||
274  | 
lemma hyprel_in_hypreal: "hyprel``{x}:hypreal"
 | 
|
275  | 
apply (unfold hypreal_def hyprel_def quotient_def)  | 
|
276  | 
apply blast  | 
|
277  | 
done  | 
|
278  | 
||
279  | 
lemma inj_on_Abs_hypreal: "inj_on Abs_hypreal hypreal"  | 
|
280  | 
apply (rule inj_on_inverseI)  | 
|
281  | 
apply (erule Abs_hypreal_inverse)  | 
|
282  | 
done  | 
|
283  | 
||
284  | 
declare inj_on_Abs_hypreal [THEN inj_on_iff, simp]  | 
|
285  | 
hyprel_in_hypreal [simp] Abs_hypreal_inverse [simp]  | 
|
286  | 
||
287  | 
declare equiv_hyprel [THEN eq_equiv_class_iff, simp]  | 
|
288  | 
||
289  | 
declare hyprel_iff [iff]  | 
|
290  | 
||
291  | 
lemmas eq_hyprelD = eq_equiv_class [OF _ equiv_hyprel]  | 
|
292  | 
||
293  | 
lemma inj_Rep_hypreal: "inj(Rep_hypreal)"  | 
|
294  | 
apply (rule inj_on_inverseI)  | 
|
295  | 
apply (rule Rep_hypreal_inverse)  | 
|
296  | 
done  | 
|
297  | 
||
298  | 
lemma lemma_hyprel_refl: "x \<in> hyprel `` {x}"
 | 
|
299  | 
apply (unfold hyprel_def)  | 
|
300  | 
apply (safe)  | 
|
301  | 
apply (auto intro!: FreeUltrafilterNat_Nat_set)  | 
|
302  | 
done  | 
|
303  | 
||
304  | 
declare lemma_hyprel_refl [simp]  | 
|
305  | 
||
306  | 
lemma hypreal_empty_not_mem: "{} \<notin> hypreal"
 | 
|
307  | 
apply (unfold hypreal_def)  | 
|
308  | 
apply (auto elim!: quotientE equalityCE)  | 
|
309  | 
done  | 
|
310  | 
||
311  | 
declare hypreal_empty_not_mem [simp]  | 
|
312  | 
||
313  | 
lemma Rep_hypreal_nonempty: "Rep_hypreal x \<noteq> {}"
 | 
|
314  | 
apply (cut_tac x = "x" in Rep_hypreal)  | 
|
315  | 
apply auto  | 
|
316  | 
done  | 
|
317  | 
||
318  | 
declare Rep_hypreal_nonempty [simp]  | 
|
319  | 
||
320  | 
(*------------------------------------------------------------------------  | 
|
321  | 
hypreal_of_real: the injection from real to hypreal  | 
|
322  | 
------------------------------------------------------------------------*)  | 
|
323  | 
||
324  | 
lemma inj_hypreal_of_real: "inj(hypreal_of_real)"  | 
|
325  | 
apply (rule inj_onI)  | 
|
326  | 
apply (unfold hypreal_of_real_def)  | 
|
327  | 
apply (drule inj_on_Abs_hypreal [THEN inj_onD])  | 
|
328  | 
apply (rule hyprel_in_hypreal)+  | 
|
329  | 
apply (drule eq_equiv_class)  | 
|
330  | 
apply (rule equiv_hyprel)  | 
|
331  | 
apply (simp_all add: split: split_if_asm)  | 
|
332  | 
done  | 
|
333  | 
||
334  | 
lemma eq_Abs_hypreal:  | 
|
335  | 
    "(!!x y. z = Abs_hypreal(hyprel``{x}) ==> P) ==> P"
 | 
|
336  | 
apply (rule_tac x1=z in Rep_hypreal [unfolded hypreal_def, THEN quotientE])  | 
|
337  | 
apply (drule_tac f = "Abs_hypreal" in arg_cong)  | 
|
338  | 
apply (force simp add: Rep_hypreal_inverse)  | 
|
339  | 
done  | 
|
340  | 
||
341  | 
(**** hypreal_minus: additive inverse on hypreal ****)  | 
|
342  | 
||
343  | 
lemma hypreal_minus_congruent:  | 
|
344  | 
  "congruent hyprel (%X. hyprel``{%n. - (X n)})"
 | 
|
345  | 
by (force simp add: congruent_def)  | 
|
346  | 
||
347  | 
lemma hypreal_minus:  | 
|
348  | 
   "- (Abs_hypreal(hyprel``{%n. X n})) = Abs_hypreal(hyprel `` {%n. -(X n)})"
 | 
|
349  | 
apply (unfold hypreal_minus_def)  | 
|
350  | 
apply (rule_tac f = "Abs_hypreal" in arg_cong)  | 
|
351  | 
apply (simp (no_asm) add: hyprel_in_hypreal [THEN Abs_hypreal_inverse]  | 
|
352  | 
UN_equiv_class [OF equiv_hyprel hypreal_minus_congruent])  | 
|
353  | 
done  | 
|
354  | 
||
355  | 
lemma hypreal_minus_minus: "- (- z) = (z::hypreal)"  | 
|
356  | 
apply (rule_tac z = "z" in eq_Abs_hypreal)  | 
|
357  | 
apply (simp (no_asm_simp) add: hypreal_minus)  | 
|
358  | 
done  | 
|
359  | 
||
360  | 
declare hypreal_minus_minus [simp]  | 
|
361  | 
||
362  | 
lemma inj_hypreal_minus: "inj(%r::hypreal. -r)"  | 
|
363  | 
apply (rule inj_onI)  | 
|
364  | 
apply (drule_tac f = "uminus" in arg_cong)  | 
|
365  | 
apply (simp add: hypreal_minus_minus)  | 
|
366  | 
done  | 
|
367  | 
||
368  | 
lemma hypreal_minus_zero: "- 0 = (0::hypreal)"  | 
|
369  | 
apply (unfold hypreal_zero_def)  | 
|
370  | 
apply (simp (no_asm) add: hypreal_minus)  | 
|
371  | 
done  | 
|
372  | 
declare hypreal_minus_zero [simp]  | 
|
373  | 
||
374  | 
lemma hypreal_minus_zero_iff: "(-x = 0) = (x = (0::hypreal))"  | 
|
375  | 
apply (rule_tac z = "x" in eq_Abs_hypreal)  | 
|
376  | 
apply (auto simp add: hypreal_zero_def hypreal_minus)  | 
|
377  | 
done  | 
|
378  | 
declare hypreal_minus_zero_iff [simp]  | 
|
379  | 
||
380  | 
||
381  | 
(**** hyperreal addition: hypreal_add ****)  | 
|
382  | 
||
383  | 
lemma hypreal_add_congruent2:  | 
|
384  | 
    "congruent2 hyprel (%X Y. hyprel``{%n. X n + Y n})"
 | 
|
385  | 
apply (unfold congruent2_def)  | 
|
386  | 
apply (auto );  | 
|
387  | 
apply ultra  | 
|
388  | 
done  | 
|
389  | 
||
390  | 
lemma hypreal_add:  | 
|
391  | 
  "Abs_hypreal(hyprel``{%n. X n}) + Abs_hypreal(hyprel``{%n. Y n}) =  
 | 
|
392  | 
   Abs_hypreal(hyprel``{%n. X n + Y n})"
 | 
|
393  | 
apply (unfold hypreal_add_def)  | 
|
394  | 
apply (simp add: UN_equiv_class2 [OF equiv_hyprel hypreal_add_congruent2])  | 
|
395  | 
done  | 
|
396  | 
||
397  | 
lemma hypreal_diff: "Abs_hypreal(hyprel``{%n. X n}) - Abs_hypreal(hyprel``{%n. Y n}) =  
 | 
|
398  | 
      Abs_hypreal(hyprel``{%n. X n - Y n})"
 | 
|
399  | 
apply (simp (no_asm) add: hypreal_diff_def hypreal_minus hypreal_add)  | 
|
400  | 
done  | 
|
401  | 
||
402  | 
lemma hypreal_add_commute: "(z::hypreal) + w = w + z"  | 
|
403  | 
apply (rule_tac z = "z" in eq_Abs_hypreal)  | 
|
404  | 
apply (rule_tac z = "w" in eq_Abs_hypreal)  | 
|
405  | 
apply (simp (no_asm_simp) add: real_add_ac hypreal_add)  | 
|
406  | 
done  | 
|
407  | 
||
408  | 
lemma hypreal_add_assoc: "((z1::hypreal) + z2) + z3 = z1 + (z2 + z3)"  | 
|
409  | 
apply (rule_tac z = "z1" in eq_Abs_hypreal)  | 
|
410  | 
apply (rule_tac z = "z2" in eq_Abs_hypreal)  | 
|
411  | 
apply (rule_tac z = "z3" in eq_Abs_hypreal)  | 
|
412  | 
apply (simp (no_asm_simp) add: hypreal_add real_add_assoc)  | 
|
413  | 
done  | 
|
414  | 
||
415  | 
(*For AC rewriting*)  | 
|
416  | 
lemma hypreal_add_left_commute: "(x::hypreal)+(y+z)=y+(x+z)"  | 
|
417  | 
apply (rule mk_left_commute [of "op +"])  | 
|
418  | 
apply (rule hypreal_add_assoc)  | 
|
419  | 
apply (rule hypreal_add_commute)  | 
|
420  | 
done  | 
|
421  | 
||
422  | 
(* hypreal addition is an AC operator *)  | 
|
423  | 
lemmas hypreal_add_ac =  | 
|
424  | 
hypreal_add_assoc hypreal_add_commute hypreal_add_left_commute  | 
|
425  | 
||
426  | 
lemma hypreal_add_zero_left: "(0::hypreal) + z = z"  | 
|
427  | 
apply (unfold hypreal_zero_def)  | 
|
428  | 
apply (rule_tac z = "z" in eq_Abs_hypreal)  | 
|
429  | 
apply (simp add: hypreal_add)  | 
|
430  | 
done  | 
|
431  | 
||
432  | 
lemma hypreal_add_zero_right: "z + (0::hypreal) = z"  | 
|
433  | 
apply (simp (no_asm) add: hypreal_add_zero_left hypreal_add_commute)  | 
|
434  | 
done  | 
|
435  | 
||
436  | 
lemma hypreal_add_minus: "z + -z = (0::hypreal)"  | 
|
437  | 
apply (unfold hypreal_zero_def)  | 
|
438  | 
apply (rule_tac z = "z" in eq_Abs_hypreal)  | 
|
439  | 
apply (simp add: hypreal_minus hypreal_add)  | 
|
440  | 
done  | 
|
441  | 
||
442  | 
lemma hypreal_add_minus_left: "-z + z = (0::hypreal)"  | 
|
443  | 
apply (simp (no_asm) add: hypreal_add_commute hypreal_add_minus)  | 
|
444  | 
done  | 
|
445  | 
||
446  | 
declare hypreal_add_minus [simp] hypreal_add_minus_left [simp]  | 
|
447  | 
hypreal_add_zero_left [simp] hypreal_add_zero_right [simp]  | 
|
448  | 
||
449  | 
lemma hypreal_minus_ex: "\<exists>y. (x::hypreal) + y = 0"  | 
|
450  | 
apply (fast intro: hypreal_add_minus)  | 
|
451  | 
done  | 
|
452  | 
||
453  | 
lemma hypreal_minus_ex1: "EX! y. (x::hypreal) + y = 0"  | 
|
454  | 
apply (auto intro: hypreal_add_minus)  | 
|
455  | 
apply (drule_tac f = "%x. ya+x" in arg_cong)  | 
|
456  | 
apply (simp add: hypreal_add_assoc [symmetric])  | 
|
457  | 
apply (simp add: hypreal_add_commute)  | 
|
458  | 
done  | 
|
459  | 
||
460  | 
lemma hypreal_minus_left_ex1: "EX! y. y + (x::hypreal) = 0"  | 
|
461  | 
apply (auto intro: hypreal_add_minus_left)  | 
|
462  | 
apply (drule_tac f = "%x. x+ya" in arg_cong)  | 
|
463  | 
apply (simp add: hypreal_add_assoc)  | 
|
464  | 
apply (simp add: hypreal_add_commute)  | 
|
465  | 
done  | 
|
466  | 
||
467  | 
lemma hypreal_add_minus_eq_minus: "x + y = (0::hypreal) ==> x = -y"  | 
|
468  | 
apply (cut_tac z = "y" in hypreal_add_minus_left)  | 
|
469  | 
apply (rule_tac x1 = "y" in hypreal_minus_left_ex1 [THEN ex1E])  | 
|
470  | 
apply blast  | 
|
471  | 
done  | 
|
472  | 
||
473  | 
lemma hypreal_as_add_inverse_ex: "\<exists>y::hypreal. x = -y"  | 
|
474  | 
apply (cut_tac x = "x" in hypreal_minus_ex)  | 
|
475  | 
apply (erule exE , drule hypreal_add_minus_eq_minus)  | 
|
476  | 
apply fast  | 
|
477  | 
done  | 
|
478  | 
||
479  | 
lemma hypreal_minus_add_distrib: "-(x + (y::hypreal)) = -x + -y"  | 
|
480  | 
apply (rule_tac z = "x" in eq_Abs_hypreal)  | 
|
481  | 
apply (rule_tac z = "y" in eq_Abs_hypreal)  | 
|
482  | 
apply (auto simp add: hypreal_minus hypreal_add real_minus_add_distrib)  | 
|
483  | 
done  | 
|
484  | 
declare hypreal_minus_add_distrib [simp]  | 
|
485  | 
||
486  | 
lemma hypreal_minus_distrib1: "-(y + -(x::hypreal)) = x + -y"  | 
|
487  | 
apply (simp (no_asm) add: hypreal_add_commute)  | 
|
488  | 
done  | 
|
489  | 
||
490  | 
lemma hypreal_add_left_cancel: "((x::hypreal) + y = x + z) = (y = z)"  | 
|
491  | 
apply (safe)  | 
|
492  | 
apply (drule_tac f = "%t.-x + t" in arg_cong)  | 
|
493  | 
apply (simp add: hypreal_add_assoc [symmetric])  | 
|
494  | 
done  | 
|
495  | 
||
496  | 
lemma hypreal_add_right_cancel: "(y + (x::hypreal)= z + x) = (y = z)"  | 
|
497  | 
apply (simp (no_asm) add: hypreal_add_commute hypreal_add_left_cancel)  | 
|
498  | 
done  | 
|
499  | 
||
500  | 
lemma hypreal_add_minus_cancelA: "z + ((- z) + w) = (w::hypreal)"  | 
|
501  | 
apply (simp (no_asm) add: hypreal_add_assoc [symmetric])  | 
|
502  | 
done  | 
|
503  | 
||
504  | 
lemma hypreal_minus_add_cancelA: "(-z) + (z + w) = (w::hypreal)"  | 
|
505  | 
apply (simp (no_asm) add: hypreal_add_assoc [symmetric])  | 
|
506  | 
done  | 
|
507  | 
||
508  | 
declare hypreal_add_minus_cancelA [simp] hypreal_minus_add_cancelA [simp]  | 
|
509  | 
||
510  | 
(**** hyperreal multiplication: hypreal_mult ****)  | 
|
511  | 
||
512  | 
lemma hypreal_mult_congruent2:  | 
|
513  | 
    "congruent2 hyprel (%X Y. hyprel``{%n. X n * Y n})"
 | 
|
514  | 
apply (unfold congruent2_def)  | 
|
515  | 
apply auto  | 
|
516  | 
apply (ultra)  | 
|
517  | 
done  | 
|
518  | 
||
519  | 
lemma hypreal_mult:  | 
|
520  | 
  "Abs_hypreal(hyprel``{%n. X n}) * Abs_hypreal(hyprel``{%n. Y n}) =  
 | 
|
521  | 
   Abs_hypreal(hyprel``{%n. X n * Y n})"
 | 
|
522  | 
apply (unfold hypreal_mult_def)  | 
|
523  | 
apply (simp add: UN_equiv_class2 [OF equiv_hyprel hypreal_mult_congruent2])  | 
|
524  | 
done  | 
|
525  | 
||
526  | 
lemma hypreal_mult_commute: "(z::hypreal) * w = w * z"  | 
|
527  | 
apply (rule_tac z = "z" in eq_Abs_hypreal)  | 
|
528  | 
apply (rule_tac z = "w" in eq_Abs_hypreal)  | 
|
529  | 
apply (simp (no_asm_simp) add: hypreal_mult real_mult_ac)  | 
|
530  | 
done  | 
|
531  | 
||
532  | 
lemma hypreal_mult_assoc: "((z1::hypreal) * z2) * z3 = z1 * (z2 * z3)"  | 
|
533  | 
apply (rule_tac z = "z1" in eq_Abs_hypreal)  | 
|
534  | 
apply (rule_tac z = "z2" in eq_Abs_hypreal)  | 
|
535  | 
apply (rule_tac z = "z3" in eq_Abs_hypreal)  | 
|
536  | 
apply (simp (no_asm_simp) add: hypreal_mult real_mult_assoc)  | 
|
537  | 
done  | 
|
538  | 
||
539  | 
lemma hypreal_mult_left_commute: "(z1::hypreal) * (z2 * z3) = z2 * (z1 * z3)"  | 
|
540  | 
apply (rule mk_left_commute [of "op *"])  | 
|
541  | 
apply (rule hypreal_mult_assoc)  | 
|
542  | 
apply (rule hypreal_mult_commute)  | 
|
543  | 
done  | 
|
544  | 
||
545  | 
(* hypreal multiplication is an AC operator *)  | 
|
546  | 
lemmas hypreal_mult_ac =  | 
|
547  | 
hypreal_mult_assoc hypreal_mult_commute hypreal_mult_left_commute  | 
|
548  | 
||
549  | 
lemma hypreal_mult_1: "(1::hypreal) * z = z"  | 
|
550  | 
apply (unfold hypreal_one_def)  | 
|
551  | 
apply (rule_tac z = "z" in eq_Abs_hypreal)  | 
|
552  | 
apply (simp add: hypreal_mult)  | 
|
553  | 
done  | 
|
554  | 
declare hypreal_mult_1 [simp]  | 
|
555  | 
||
556  | 
lemma hypreal_mult_1_right: "z * (1::hypreal) = z"  | 
|
557  | 
apply (simp (no_asm) add: hypreal_mult_commute hypreal_mult_1)  | 
|
558  | 
done  | 
|
559  | 
declare hypreal_mult_1_right [simp]  | 
|
560  | 
||
561  | 
lemma hypreal_mult_0: "0 * z = (0::hypreal)"  | 
|
562  | 
apply (unfold hypreal_zero_def)  | 
|
563  | 
apply (rule_tac z = "z" in eq_Abs_hypreal)  | 
|
564  | 
apply (simp add: hypreal_mult)  | 
|
565  | 
done  | 
|
566  | 
declare hypreal_mult_0 [simp]  | 
|
567  | 
||
568  | 
lemma hypreal_mult_0_right: "z * 0 = (0::hypreal)"  | 
|
569  | 
apply (simp (no_asm) add: hypreal_mult_commute)  | 
|
570  | 
done  | 
|
571  | 
declare hypreal_mult_0_right [simp]  | 
|
572  | 
||
573  | 
lemma hypreal_minus_mult_eq1: "-(x * y) = -x * (y::hypreal)"  | 
|
574  | 
apply (rule_tac z = "x" in eq_Abs_hypreal)  | 
|
575  | 
apply (rule_tac z = "y" in eq_Abs_hypreal)  | 
|
576  | 
apply (auto simp add: hypreal_minus hypreal_mult real_mult_ac real_add_ac)  | 
|
577  | 
done  | 
|
578  | 
||
579  | 
lemma hypreal_minus_mult_eq2: "-(x * y) = (x::hypreal) * -y"  | 
|
580  | 
apply (rule_tac z = "x" in eq_Abs_hypreal)  | 
|
581  | 
apply (rule_tac z = "y" in eq_Abs_hypreal)  | 
|
582  | 
apply (auto simp add: hypreal_minus hypreal_mult real_mult_ac real_add_ac)  | 
|
583  | 
done  | 
|
584  | 
||
585  | 
(*Pull negations out*)  | 
|
586  | 
declare hypreal_minus_mult_eq2 [symmetric, simp] hypreal_minus_mult_eq1 [symmetric, simp]  | 
|
587  | 
||
588  | 
lemma hypreal_mult_minus_1: "(- (1::hypreal)) * z = -z"  | 
|
589  | 
apply (simp (no_asm))  | 
|
590  | 
done  | 
|
591  | 
declare hypreal_mult_minus_1 [simp]  | 
|
592  | 
||
593  | 
lemma hypreal_mult_minus_1_right: "z * (- (1::hypreal)) = -z"  | 
|
594  | 
apply (subst hypreal_mult_commute)  | 
|
595  | 
apply (simp (no_asm))  | 
|
596  | 
done  | 
|
597  | 
declare hypreal_mult_minus_1_right [simp]  | 
|
598  | 
||
599  | 
lemma hypreal_minus_mult_commute: "(-x) * y = (x::hypreal) * -y"  | 
|
600  | 
apply auto  | 
|
601  | 
done  | 
|
602  | 
||
603  | 
(*-----------------------------------------------------------------------------  | 
|
604  | 
A few more theorems  | 
|
605  | 
----------------------------------------------------------------------------*)  | 
|
606  | 
lemma hypreal_add_assoc_cong: "(z::hypreal) + v = z' + v' ==> z + (v + w) = z' + (v' + w)"  | 
|
607  | 
apply (simp (no_asm_simp) add: hypreal_add_assoc [symmetric])  | 
|
608  | 
done  | 
|
609  | 
||
610  | 
lemma hypreal_add_mult_distrib: "((z1::hypreal) + z2) * w = (z1 * w) + (z2 * w)"  | 
|
611  | 
apply (rule_tac z = "z1" in eq_Abs_hypreal)  | 
|
612  | 
apply (rule_tac z = "z2" in eq_Abs_hypreal)  | 
|
613  | 
apply (rule_tac z = "w" in eq_Abs_hypreal)  | 
|
614  | 
apply (simp (no_asm_simp) add: hypreal_mult hypreal_add real_add_mult_distrib)  | 
|
615  | 
done  | 
|
616  | 
||
617  | 
lemma hypreal_add_mult_distrib2: "(w::hypreal) * (z1 + z2) = (w * z1) + (w * z2)"  | 
|
618  | 
apply (simp add: hypreal_mult_commute [of w] hypreal_add_mult_distrib)  | 
|
619  | 
done  | 
|
620  | 
||
621  | 
||
622  | 
lemma hypreal_diff_mult_distrib: "((z1::hypreal) - z2) * w = (z1 * w) - (z2 * w)"  | 
|
623  | 
||
624  | 
apply (unfold hypreal_diff_def)  | 
|
625  | 
apply (simp (no_asm) add: hypreal_add_mult_distrib)  | 
|
626  | 
done  | 
|
627  | 
||
628  | 
lemma hypreal_diff_mult_distrib2: "(w::hypreal) * (z1 - z2) = (w * z1) - (w * z2)"  | 
|
629  | 
apply (simp add: hypreal_mult_commute [of w] hypreal_diff_mult_distrib)  | 
|
630  | 
done  | 
|
631  | 
||
632  | 
(*** one and zero are distinct ***)  | 
|
633  | 
lemma hypreal_zero_not_eq_one: "0 \<noteq> (1::hypreal)"  | 
|
634  | 
apply (unfold hypreal_zero_def hypreal_one_def)  | 
|
635  | 
apply (auto simp add: real_zero_not_eq_one)  | 
|
636  | 
done  | 
|
637  | 
||
638  | 
||
639  | 
(**** multiplicative inverse on hypreal ****)  | 
|
640  | 
||
641  | 
lemma hypreal_inverse_congruent:  | 
|
642  | 
  "congruent hyprel (%X. hyprel``{%n. if X n = 0 then 0 else inverse(X n)})"
 | 
|
643  | 
apply (unfold congruent_def)  | 
|
644  | 
apply (auto , ultra)  | 
|
645  | 
done  | 
|
646  | 
||
647  | 
lemma hypreal_inverse:  | 
|
648  | 
      "inverse (Abs_hypreal(hyprel``{%n. X n})) =  
 | 
|
649  | 
       Abs_hypreal(hyprel `` {%n. if X n = 0 then 0 else inverse(X n)})"
 | 
|
650  | 
apply (unfold hypreal_inverse_def)  | 
|
651  | 
apply (rule_tac f = "Abs_hypreal" in arg_cong)  | 
|
652  | 
apply (simp (no_asm) add: hyprel_in_hypreal [THEN Abs_hypreal_inverse]  | 
|
653  | 
UN_equiv_class [OF equiv_hyprel hypreal_inverse_congruent])  | 
|
654  | 
done  | 
|
655  | 
||
656  | 
lemma HYPREAL_INVERSE_ZERO: "inverse 0 = (0::hypreal)"  | 
|
657  | 
apply (simp (no_asm) add: hypreal_inverse hypreal_zero_def)  | 
|
658  | 
done  | 
|
659  | 
||
660  | 
lemma HYPREAL_DIVISION_BY_ZERO: "a / (0::hypreal) = 0"  | 
|
661  | 
apply (simp (no_asm) add: hypreal_divide_def HYPREAL_INVERSE_ZERO)  | 
|
662  | 
done  | 
|
663  | 
||
664  | 
lemma hypreal_inverse_inverse: "inverse (inverse (z::hypreal)) = z"  | 
|
665  | 
apply (case_tac "z=0", simp add: HYPREAL_INVERSE_ZERO)  | 
|
666  | 
apply (rule_tac z = "z" in eq_Abs_hypreal)  | 
|
667  | 
apply (simp add: hypreal_inverse hypreal_zero_def)  | 
|
668  | 
done  | 
|
669  | 
declare hypreal_inverse_inverse [simp]  | 
|
670  | 
||
671  | 
lemma hypreal_inverse_1: "inverse((1::hypreal)) = (1::hypreal)"  | 
|
672  | 
apply (unfold hypreal_one_def)  | 
|
673  | 
apply (simp (no_asm_use) add: hypreal_inverse real_zero_not_eq_one [THEN not_sym])  | 
|
674  | 
done  | 
|
675  | 
declare hypreal_inverse_1 [simp]  | 
|
676  | 
||
677  | 
||
678  | 
(*** existence of inverse ***)  | 
|
679  | 
||
680  | 
lemma hypreal_mult_inverse:  | 
|
681  | 
"x \<noteq> 0 ==> x*inverse(x) = (1::hypreal)"  | 
|
682  | 
||
683  | 
apply (unfold hypreal_one_def hypreal_zero_def)  | 
|
684  | 
apply (rule_tac z = "x" in eq_Abs_hypreal)  | 
|
685  | 
apply (simp add: hypreal_inverse hypreal_mult)  | 
|
686  | 
apply (drule FreeUltrafilterNat_Compl_mem)  | 
|
687  | 
apply (blast intro!: real_mult_inv_right FreeUltrafilterNat_subset)  | 
|
688  | 
done  | 
|
689  | 
||
690  | 
lemma hypreal_mult_inverse_left: "x \<noteq> 0 ==> inverse(x)*x = (1::hypreal)"  | 
|
691  | 
apply (simp (no_asm_simp) add: hypreal_mult_inverse hypreal_mult_commute)  | 
|
692  | 
done  | 
|
693  | 
||
694  | 
lemma hypreal_mult_left_cancel: "(c::hypreal) \<noteq> 0 ==> (c*a=c*b) = (a=b)"  | 
|
695  | 
apply auto  | 
|
696  | 
apply (drule_tac f = "%x. x*inverse c" in arg_cong)  | 
|
697  | 
apply (simp add: hypreal_mult_inverse hypreal_mult_ac)  | 
|
698  | 
done  | 
|
699  | 
||
700  | 
lemma hypreal_mult_right_cancel: "(c::hypreal) \<noteq> 0 ==> (a*c=b*c) = (a=b)"  | 
|
701  | 
apply (safe)  | 
|
702  | 
apply (drule_tac f = "%x. x*inverse c" in arg_cong)  | 
|
703  | 
apply (simp add: hypreal_mult_inverse hypreal_mult_ac)  | 
|
704  | 
done  | 
|
705  | 
||
706  | 
lemma hypreal_inverse_not_zero: "x \<noteq> 0 ==> inverse (x::hypreal) \<noteq> 0"  | 
|
707  | 
apply (unfold hypreal_zero_def)  | 
|
708  | 
apply (rule_tac z = "x" in eq_Abs_hypreal)  | 
|
709  | 
apply (simp add: hypreal_inverse hypreal_mult)  | 
|
710  | 
done  | 
|
711  | 
||
712  | 
declare hypreal_mult_inverse [simp] hypreal_mult_inverse_left [simp]  | 
|
713  | 
||
714  | 
lemma hypreal_mult_not_0: "[| x \<noteq> 0; y \<noteq> 0 |] ==> x * y \<noteq> (0::hypreal)"  | 
|
715  | 
apply (safe)  | 
|
716  | 
apply (drule_tac f = "%z. inverse x*z" in arg_cong)  | 
|
717  | 
apply (simp add: hypreal_mult_assoc [symmetric])  | 
|
718  | 
done  | 
|
719  | 
||
720  | 
lemma hypreal_mult_zero_disj: "x*y = (0::hypreal) ==> x = 0 | y = 0"  | 
|
721  | 
apply (auto intro: ccontr dest: hypreal_mult_not_0)  | 
|
722  | 
done  | 
|
723  | 
||
724  | 
lemma hypreal_minus_inverse: "inverse(-x) = -inverse(x::hypreal)"  | 
|
725  | 
apply (case_tac "x=0", simp add: HYPREAL_INVERSE_ZERO)  | 
|
726  | 
apply (rule hypreal_mult_right_cancel [of "-x", THEN iffD1])  | 
|
727  | 
apply (simp add: );  | 
|
728  | 
apply (subst hypreal_mult_inverse_left)  | 
|
729  | 
apply auto  | 
|
730  | 
done  | 
|
731  | 
||
732  | 
lemma hypreal_inverse_distrib: "inverse(x*y) = inverse(x)*inverse(y::hypreal)"  | 
|
733  | 
apply (case_tac "x=0", simp add: HYPREAL_INVERSE_ZERO)  | 
|
734  | 
apply (case_tac "y=0", simp add: HYPREAL_INVERSE_ZERO)  | 
|
735  | 
apply (frule_tac y = "y" in hypreal_mult_not_0 , assumption)  | 
|
736  | 
apply (rule_tac c1 = "x" in hypreal_mult_left_cancel [THEN iffD1])  | 
|
737  | 
apply (auto simp add: hypreal_mult_assoc [symmetric])  | 
|
738  | 
apply (rule_tac c1 = "y" in hypreal_mult_left_cancel [THEN iffD1])  | 
|
739  | 
apply (auto simp add: hypreal_mult_left_commute)  | 
|
740  | 
apply (simp (no_asm_simp) add: hypreal_mult_assoc [symmetric])  | 
|
741  | 
done  | 
|
742  | 
||
743  | 
(*------------------------------------------------------------------  | 
|
744  | 
Theorems for ordering  | 
|
745  | 
------------------------------------------------------------------*)  | 
|
746  | 
||
747  | 
(* prove introduction and elimination rules for hypreal_less *)  | 
|
748  | 
||
749  | 
lemma hypreal_less_iff:  | 
|
750  | 
"(P < (Q::hypreal)) = (\<exists>X Y. X \<in> Rep_hypreal(P) &  | 
|
751  | 
Y \<in> Rep_hypreal(Q) &  | 
|
752  | 
                              {n. X n < Y n} \<in> FreeUltrafilterNat)"
 | 
|
753  | 
||
754  | 
apply (unfold hypreal_less_def)  | 
|
755  | 
apply fast  | 
|
756  | 
done  | 
|
757  | 
||
758  | 
lemma hypreal_lessI:  | 
|
759  | 
 "[| {n. X n < Y n} \<in> FreeUltrafilterNat;  
 | 
|
760  | 
X \<in> Rep_hypreal(P);  | 
|
761  | 
Y \<in> Rep_hypreal(Q) |] ==> P < (Q::hypreal)"  | 
|
762  | 
apply (unfold hypreal_less_def)  | 
|
763  | 
apply fast  | 
|
764  | 
done  | 
|
765  | 
||
766  | 
||
767  | 
lemma hypreal_lessE:  | 
|
768  | 
"!! R1. [| R1 < (R2::hypreal);  | 
|
769  | 
          !!X Y. {n. X n < Y n} \<in> FreeUltrafilterNat ==> P;  
 | 
|
770  | 
!!X. X \<in> Rep_hypreal(R1) ==> P;  | 
|
771  | 
!!Y. Y \<in> Rep_hypreal(R2) ==> P |]  | 
|
772  | 
==> P"  | 
|
773  | 
||
774  | 
apply (unfold hypreal_less_def)  | 
|
775  | 
apply auto  | 
|
776  | 
done  | 
|
777  | 
||
778  | 
lemma hypreal_lessD:  | 
|
779  | 
 "R1 < (R2::hypreal) ==> (\<exists>X Y. {n. X n < Y n} \<in> FreeUltrafilterNat &  
 | 
|
780  | 
X \<in> Rep_hypreal(R1) &  | 
|
781  | 
Y \<in> Rep_hypreal(R2))"  | 
|
782  | 
apply (unfold hypreal_less_def)  | 
|
783  | 
apply fast  | 
|
784  | 
done  | 
|
785  | 
||
786  | 
lemma hypreal_less_not_refl: "~ (R::hypreal) < R"  | 
|
787  | 
apply (rule_tac z = "R" in eq_Abs_hypreal)  | 
|
788  | 
apply (auto simp add: hypreal_less_def)  | 
|
789  | 
apply (ultra)  | 
|
790  | 
done  | 
|
791  | 
||
792  | 
(*** y < y ==> P ***)  | 
|
793  | 
lemmas hypreal_less_irrefl = hypreal_less_not_refl [THEN notE, standard]  | 
|
794  | 
declare hypreal_less_irrefl [elim!]  | 
|
795  | 
||
796  | 
lemma hypreal_not_refl2: "!!(x::hypreal). x < y ==> x \<noteq> y"  | 
|
797  | 
apply (auto simp add: hypreal_less_not_refl)  | 
|
798  | 
done  | 
|
799  | 
||
800  | 
lemma hypreal_less_trans: "!!(R1::hypreal). [| R1 < R2; R2 < R3 |] ==> R1 < R3"  | 
|
801  | 
apply (rule_tac z = "R1" in eq_Abs_hypreal)  | 
|
802  | 
apply (rule_tac z = "R2" in eq_Abs_hypreal)  | 
|
803  | 
apply (rule_tac z = "R3" in eq_Abs_hypreal)  | 
|
804  | 
apply (auto intro!: exI simp add: hypreal_less_def)  | 
|
805  | 
apply ultra  | 
|
806  | 
done  | 
|
807  | 
||
808  | 
lemma hypreal_less_asym: "!! (R1::hypreal). [| R1 < R2; R2 < R1 |] ==> P"  | 
|
809  | 
apply (drule hypreal_less_trans , assumption)  | 
|
810  | 
apply (simp add: hypreal_less_not_refl)  | 
|
811  | 
done  | 
|
812  | 
||
813  | 
(*-------------------------------------------------------  | 
|
814  | 
TODO: The following theorem should have been proved  | 
|
815  | 
first and then used througout the proofs as it probably  | 
|
816  | 
makes many of them more straightforward.  | 
|
817  | 
-------------------------------------------------------*)  | 
|
818  | 
lemma hypreal_less:  | 
|
819  | 
      "(Abs_hypreal(hyprel``{%n. X n}) <  
 | 
|
820  | 
            Abs_hypreal(hyprel``{%n. Y n})) =  
 | 
|
821  | 
       ({n. X n < Y n} \<in> FreeUltrafilterNat)"
 | 
|
822  | 
apply (unfold hypreal_less_def)  | 
|
823  | 
apply (auto intro!: lemma_hyprel_refl)  | 
|
824  | 
apply (ultra)  | 
|
825  | 
done  | 
|
826  | 
||
827  | 
(*----------------------------------------------------------------------------  | 
|
828  | 
Trichotomy: the hyperreals are linearly ordered  | 
|
829  | 
---------------------------------------------------------------------------*)  | 
|
830  | 
||
831  | 
lemma lemma_hyprel_0_mem: "\<exists>x. x: hyprel `` {%n. 0}"
 | 
|
832  | 
||
833  | 
apply (unfold hyprel_def)  | 
|
834  | 
apply (rule_tac x = "%n. 0" in exI)  | 
|
835  | 
apply (safe)  | 
|
836  | 
apply (auto intro!: FreeUltrafilterNat_Nat_set)  | 
|
837  | 
done  | 
|
838  | 
||
839  | 
lemma hypreal_trichotomy: "0 < x | x = 0 | x < (0::hypreal)"  | 
|
840  | 
apply (unfold hypreal_zero_def)  | 
|
841  | 
apply (rule_tac z = "x" in eq_Abs_hypreal)  | 
|
842  | 
apply (auto simp add: hypreal_less_def)  | 
|
843  | 
apply (cut_tac lemma_hyprel_0_mem , erule exE)  | 
|
844  | 
apply (drule_tac x = "xa" in spec)  | 
|
845  | 
apply (drule_tac x = "x" in spec)  | 
|
846  | 
apply (cut_tac x = "x" in lemma_hyprel_refl)  | 
|
847  | 
apply auto  | 
|
848  | 
apply (drule_tac x = "x" in spec)  | 
|
849  | 
apply (drule_tac x = "xa" in spec)  | 
|
850  | 
apply auto  | 
|
851  | 
apply (ultra)  | 
|
852  | 
done  | 
|
853  | 
||
854  | 
lemma hypreal_trichotomyE:  | 
|
855  | 
"[| (0::hypreal) < x ==> P;  | 
|
856  | 
x = 0 ==> P;  | 
|
857  | 
x < 0 ==> P |] ==> P"  | 
|
858  | 
apply (insert hypreal_trichotomy [of x])  | 
|
859  | 
apply (blast intro: elim:);  | 
|
860  | 
done  | 
|
861  | 
||
862  | 
(*----------------------------------------------------------------------------  | 
|
863  | 
More properties of <  | 
|
864  | 
----------------------------------------------------------------------------*)  | 
|
865  | 
||
866  | 
lemma hypreal_less_minus_iff: "((x::hypreal) < y) = (0 < y + -x)"  | 
|
867  | 
apply (rule_tac z = "x" in eq_Abs_hypreal)  | 
|
868  | 
apply (rule_tac z = "y" in eq_Abs_hypreal)  | 
|
869  | 
apply (auto simp add: hypreal_add hypreal_zero_def hypreal_minus hypreal_less)  | 
|
870  | 
done  | 
|
871  | 
||
872  | 
lemma hypreal_less_minus_iff2: "((x::hypreal) < y) = (x + -y < 0)"  | 
|
873  | 
apply (rule_tac z = "x" in eq_Abs_hypreal)  | 
|
874  | 
apply (rule_tac z = "y" in eq_Abs_hypreal)  | 
|
875  | 
apply (auto simp add: hypreal_add hypreal_zero_def hypreal_minus hypreal_less)  | 
|
876  | 
done  | 
|
877  | 
||
878  | 
lemma hypreal_eq_minus_iff: "((x::hypreal) = y) = (x + - y = 0)"  | 
|
879  | 
apply auto  | 
|
880  | 
apply (rule_tac x1 = "-y" in hypreal_add_right_cancel [THEN iffD1])  | 
|
881  | 
apply auto  | 
|
882  | 
done  | 
|
883  | 
||
884  | 
lemma hypreal_eq_minus_iff2: "((x::hypreal) = y) = (0 = y + - x)"  | 
|
885  | 
apply auto  | 
|
886  | 
apply (rule_tac x1 = "-x" in hypreal_add_right_cancel [THEN iffD1])  | 
|
887  | 
apply auto  | 
|
888  | 
done  | 
|
889  | 
||
890  | 
(* 07/00 *)  | 
|
891  | 
lemma hypreal_diff_zero: "(0::hypreal) - x = -x"  | 
|
892  | 
apply (simp (no_asm) add: hypreal_diff_def)  | 
|
893  | 
done  | 
|
894  | 
||
895  | 
lemma hypreal_diff_zero_right: "x - (0::hypreal) = x"  | 
|
896  | 
apply (simp (no_asm) add: hypreal_diff_def)  | 
|
897  | 
done  | 
|
898  | 
||
899  | 
lemma hypreal_diff_self: "x - x = (0::hypreal)"  | 
|
900  | 
apply (simp (no_asm) add: hypreal_diff_def)  | 
|
901  | 
done  | 
|
902  | 
||
903  | 
declare hypreal_diff_zero [simp] hypreal_diff_zero_right [simp] hypreal_diff_self [simp]  | 
|
904  | 
||
905  | 
lemma hypreal_eq_minus_iff3: "(x = y + z) = (x + -z = (y::hypreal))"  | 
|
906  | 
apply (auto simp add: hypreal_add_assoc)  | 
|
907  | 
done  | 
|
908  | 
||
909  | 
lemma hypreal_not_eq_minus_iff: "(x \<noteq> a) = (x + -a \<noteq> (0::hypreal))"  | 
|
910  | 
apply (auto dest: hypreal_eq_minus_iff [THEN iffD2])  | 
|
911  | 
done  | 
|
912  | 
||
913  | 
||
914  | 
(*** linearity ***)  | 
|
915  | 
||
916  | 
lemma hypreal_linear: "(x::hypreal) < y | x = y | y < x"  | 
|
917  | 
apply (subst hypreal_eq_minus_iff2)  | 
|
918  | 
apply (rule_tac x1 = "x" in hypreal_less_minus_iff [THEN ssubst])  | 
|
919  | 
apply (rule_tac x1 = "y" in hypreal_less_minus_iff2 [THEN ssubst])  | 
|
920  | 
apply (rule hypreal_trichotomyE)  | 
|
921  | 
apply auto  | 
|
922  | 
done  | 
|
923  | 
||
924  | 
lemma hypreal_neq_iff: "((w::hypreal) \<noteq> z) = (w<z | z<w)"  | 
|
925  | 
apply (cut_tac hypreal_linear)  | 
|
926  | 
apply blast  | 
|
927  | 
done  | 
|
928  | 
||
929  | 
lemma hypreal_linear_less2: "!!(x::hypreal). [| x < y ==> P; x = y ==> P;  | 
|
930  | 
y < x ==> P |] ==> P"  | 
|
931  | 
apply (cut_tac x = "x" and y = "y" in hypreal_linear)  | 
|
932  | 
apply auto  | 
|
933  | 
done  | 
|
934  | 
||
935  | 
(*------------------------------------------------------------------------------  | 
|
936  | 
Properties of <=  | 
|
937  | 
------------------------------------------------------------------------------*)  | 
|
938  | 
(*------ hypreal le iff reals le a.e ------*)  | 
|
939  | 
||
940  | 
lemma hypreal_le:  | 
|
941  | 
      "(Abs_hypreal(hyprel``{%n. X n}) <=  
 | 
|
942  | 
            Abs_hypreal(hyprel``{%n. Y n})) =  
 | 
|
943  | 
       ({n. X n <= Y n} \<in> FreeUltrafilterNat)"
 | 
|
944  | 
apply (unfold hypreal_le_def real_le_def)  | 
|
945  | 
apply (auto simp add: hypreal_less)  | 
|
946  | 
apply (ultra+)  | 
|
947  | 
done  | 
|
948  | 
||
949  | 
(*---------------------------------------------------------*)  | 
|
950  | 
(*---------------------------------------------------------*)  | 
|
951  | 
lemma hypreal_leI:  | 
|
952  | 
"~(w < z) ==> z <= (w::hypreal)"  | 
|
953  | 
apply (unfold hypreal_le_def)  | 
|
954  | 
apply assumption  | 
|
955  | 
done  | 
|
956  | 
||
957  | 
lemma hypreal_leD:  | 
|
958  | 
"z<=w ==> ~(w<(z::hypreal))"  | 
|
959  | 
apply (unfold hypreal_le_def)  | 
|
960  | 
apply assumption  | 
|
961  | 
done  | 
|
962  | 
||
963  | 
lemma hypreal_less_le_iff: "(~(w < z)) = (z <= (w::hypreal))"  | 
|
964  | 
apply (fast intro!: hypreal_leI hypreal_leD)  | 
|
965  | 
done  | 
|
966  | 
||
967  | 
lemma not_hypreal_leE: "~ z <= w ==> w<(z::hypreal)"  | 
|
968  | 
apply (unfold hypreal_le_def)  | 
|
969  | 
apply fast  | 
|
970  | 
done  | 
|
971  | 
||
972  | 
lemma hypreal_le_imp_less_or_eq: "!!(x::hypreal). x <= y ==> x < y | x = y"  | 
|
973  | 
apply (unfold hypreal_le_def)  | 
|
974  | 
apply (cut_tac hypreal_linear)  | 
|
975  | 
apply (fast elim: hypreal_less_irrefl hypreal_less_asym)  | 
|
976  | 
done  | 
|
977  | 
||
978  | 
lemma hypreal_less_or_eq_imp_le: "z<w | z=w ==> z <=(w::hypreal)"  | 
|
979  | 
apply (unfold hypreal_le_def)  | 
|
980  | 
apply (cut_tac hypreal_linear)  | 
|
981  | 
apply (fast elim: hypreal_less_irrefl hypreal_less_asym)  | 
|
982  | 
done  | 
|
983  | 
||
984  | 
lemma hypreal_le_eq_less_or_eq: "(x <= (y::hypreal)) = (x < y | x=y)"  | 
|
985  | 
by (blast intro!: hypreal_less_or_eq_imp_le dest: hypreal_le_imp_less_or_eq)  | 
|
986  | 
||
987  | 
lemmas hypreal_le_less = hypreal_le_eq_less_or_eq  | 
|
988  | 
||
989  | 
lemma hypreal_le_refl: "w <= (w::hypreal)"  | 
|
990  | 
apply (simp (no_asm) add: hypreal_le_eq_less_or_eq)  | 
|
991  | 
done  | 
|
992  | 
||
993  | 
(* Axiom 'linorder_linear' of class 'linorder': *)  | 
|
994  | 
lemma hypreal_le_linear: "(z::hypreal) <= w | w <= z"  | 
|
995  | 
apply (simp (no_asm) add: hypreal_le_less)  | 
|
996  | 
apply (cut_tac hypreal_linear)  | 
|
997  | 
apply blast  | 
|
998  | 
done  | 
|
999  | 
||
1000  | 
lemma hypreal_le_trans: "[| i <= j; j <= k |] ==> i <= (k::hypreal)"  | 
|
1001  | 
apply (drule hypreal_le_imp_less_or_eq)  | 
|
1002  | 
apply (drule hypreal_le_imp_less_or_eq)  | 
|
1003  | 
apply (rule hypreal_less_or_eq_imp_le)  | 
|
1004  | 
apply (blast intro: hypreal_less_trans)  | 
|
1005  | 
done  | 
|
1006  | 
||
1007  | 
lemma hypreal_le_anti_sym: "[| z <= w; w <= z |] ==> z = (w::hypreal)"  | 
|
1008  | 
apply (drule hypreal_le_imp_less_or_eq)  | 
|
1009  | 
apply (drule hypreal_le_imp_less_or_eq)  | 
|
1010  | 
apply (fast elim: hypreal_less_irrefl hypreal_less_asym)  | 
|
1011  | 
done  | 
|
1012  | 
||
1013  | 
lemma not_less_not_eq_hypreal_less: "[| ~ y < x; y \<noteq> x |] ==> x < (y::hypreal)"  | 
|
1014  | 
apply (rule not_hypreal_leE)  | 
|
1015  | 
apply (fast dest: hypreal_le_imp_less_or_eq)  | 
|
1016  | 
done  | 
|
1017  | 
||
1018  | 
(* Axiom 'order_less_le' of class 'order': *)  | 
|
1019  | 
lemma hypreal_less_le: "((w::hypreal) < z) = (w <= z & w \<noteq> z)"  | 
|
1020  | 
apply (simp (no_asm) add: hypreal_le_def hypreal_neq_iff)  | 
|
1021  | 
apply (blast intro: hypreal_less_asym)  | 
|
1022  | 
done  | 
|
1023  | 
||
1024  | 
lemma hypreal_minus_zero_less_iff: "(0 < -R) = (R < (0::hypreal))"  | 
|
1025  | 
apply (rule_tac z = "R" in eq_Abs_hypreal)  | 
|
1026  | 
apply (auto simp add: hypreal_zero_def hypreal_less hypreal_minus)  | 
|
1027  | 
done  | 
|
1028  | 
declare hypreal_minus_zero_less_iff [simp]  | 
|
1029  | 
||
1030  | 
lemma hypreal_minus_zero_less_iff2: "(-R < 0) = ((0::hypreal) < R)"  | 
|
1031  | 
apply (rule_tac z = "R" in eq_Abs_hypreal)  | 
|
1032  | 
apply (auto simp add: hypreal_zero_def hypreal_less hypreal_minus)  | 
|
1033  | 
done  | 
|
1034  | 
declare hypreal_minus_zero_less_iff2 [simp]  | 
|
1035  | 
||
1036  | 
lemma hypreal_minus_zero_le_iff: "((0::hypreal) <= -r) = (r <= 0)"  | 
|
1037  | 
apply (unfold hypreal_le_def)  | 
|
1038  | 
apply (simp (no_asm) add: hypreal_minus_zero_less_iff2)  | 
|
1039  | 
done  | 
|
1040  | 
declare hypreal_minus_zero_le_iff [simp]  | 
|
1041  | 
||
1042  | 
lemma hypreal_minus_zero_le_iff2: "(-r <= (0::hypreal)) = (0 <= r)"  | 
|
1043  | 
apply (unfold hypreal_le_def)  | 
|
1044  | 
apply (simp (no_asm) add: hypreal_minus_zero_less_iff2)  | 
|
1045  | 
done  | 
|
1046  | 
declare hypreal_minus_zero_le_iff2 [simp]  | 
|
1047  | 
||
1048  | 
(*----------------------------------------------------------  | 
|
1049  | 
hypreal_of_real preserves field and order properties  | 
|
1050  | 
-----------------------------------------------------------*)  | 
|
1051  | 
lemma hypreal_of_real_add:  | 
|
1052  | 
"hypreal_of_real (z1 + z2) = hypreal_of_real z1 + hypreal_of_real z2"  | 
|
1053  | 
apply (unfold hypreal_of_real_def)  | 
|
1054  | 
apply (simp (no_asm) add: hypreal_add hypreal_add_mult_distrib)  | 
|
1055  | 
done  | 
|
1056  | 
declare hypreal_of_real_add [simp]  | 
|
1057  | 
||
1058  | 
lemma hypreal_of_real_mult:  | 
|
1059  | 
"hypreal_of_real (z1 * z2) = hypreal_of_real z1 * hypreal_of_real z2"  | 
|
1060  | 
apply (unfold hypreal_of_real_def)  | 
|
1061  | 
apply (simp (no_asm) add: hypreal_mult hypreal_add_mult_distrib2)  | 
|
1062  | 
done  | 
|
1063  | 
declare hypreal_of_real_mult [simp]  | 
|
1064  | 
||
1065  | 
lemma hypreal_of_real_less_iff:  | 
|
1066  | 
"(hypreal_of_real z1 < hypreal_of_real z2) = (z1 < z2)"  | 
|
1067  | 
apply (unfold hypreal_less_def hypreal_of_real_def)  | 
|
1068  | 
apply auto  | 
|
1069  | 
apply (rule_tac [2] x = "%n. z1" in exI)  | 
|
1070  | 
apply (safe)  | 
|
1071  | 
apply (rule_tac [3] x = "%n. z2" in exI)  | 
|
1072  | 
apply auto  | 
|
1073  | 
apply (rule FreeUltrafilterNat_P)  | 
|
1074  | 
apply (ultra)  | 
|
1075  | 
done  | 
|
1076  | 
declare hypreal_of_real_less_iff [simp]  | 
|
1077  | 
||
1078  | 
lemma hypreal_of_real_le_iff:  | 
|
1079  | 
"(hypreal_of_real z1 <= hypreal_of_real z2) = (z1 <= z2)"  | 
|
1080  | 
apply (unfold hypreal_le_def real_le_def)  | 
|
1081  | 
apply auto  | 
|
1082  | 
done  | 
|
1083  | 
declare hypreal_of_real_le_iff [simp]  | 
|
1084  | 
||
1085  | 
lemma hypreal_of_real_eq_iff: "(hypreal_of_real z1 = hypreal_of_real z2) = (z1 = z2)"  | 
|
1086  | 
apply (force intro: order_antisym hypreal_of_real_le_iff [THEN iffD1])  | 
|
1087  | 
done  | 
|
1088  | 
declare hypreal_of_real_eq_iff [simp]  | 
|
1089  | 
||
1090  | 
lemma hypreal_of_real_minus: "hypreal_of_real (-r) = - hypreal_of_real r"  | 
|
1091  | 
apply (unfold hypreal_of_real_def)  | 
|
1092  | 
apply (auto simp add: hypreal_minus)  | 
|
1093  | 
done  | 
|
1094  | 
declare hypreal_of_real_minus [simp]  | 
|
1095  | 
||
1096  | 
lemma hypreal_of_real_one: "hypreal_of_real 1 = (1::hypreal)"  | 
|
1097  | 
apply (unfold hypreal_of_real_def hypreal_one_def)  | 
|
1098  | 
apply (simp (no_asm))  | 
|
1099  | 
done  | 
|
1100  | 
declare hypreal_of_real_one [simp]  | 
|
1101  | 
||
1102  | 
lemma hypreal_of_real_zero: "hypreal_of_real 0 = 0"  | 
|
1103  | 
apply (unfold hypreal_of_real_def hypreal_zero_def)  | 
|
1104  | 
apply (simp (no_asm))  | 
|
1105  | 
done  | 
|
1106  | 
declare hypreal_of_real_zero [simp]  | 
|
1107  | 
||
1108  | 
lemma hypreal_of_real_zero_iff: "(hypreal_of_real r = 0) = (r = 0)"  | 
|
1109  | 
apply (auto intro: FreeUltrafilterNat_P simp add: hypreal_of_real_def hypreal_zero_def FreeUltrafilterNat_Nat_set)  | 
|
1110  | 
done  | 
|
1111  | 
||
1112  | 
lemma hypreal_of_real_inverse: "hypreal_of_real (inverse r) = inverse (hypreal_of_real r)"  | 
|
1113  | 
apply (case_tac "r=0")  | 
|
1114  | 
apply (simp (no_asm_simp) add: DIVISION_BY_ZERO INVERSE_ZERO HYPREAL_INVERSE_ZERO)  | 
|
1115  | 
apply (rule_tac c1 = "hypreal_of_real r" in hypreal_mult_left_cancel [THEN iffD1])  | 
|
1116  | 
apply (auto simp add: hypreal_of_real_zero_iff hypreal_of_real_mult [symmetric])  | 
|
1117  | 
done  | 
|
1118  | 
declare hypreal_of_real_inverse [simp]  | 
|
1119  | 
||
1120  | 
lemma hypreal_of_real_divide: "hypreal_of_real (z1 / z2) = hypreal_of_real z1 / hypreal_of_real z2"  | 
|
1121  | 
apply (simp (no_asm) add: hypreal_divide_def real_divide_def)  | 
|
1122  | 
done  | 
|
1123  | 
declare hypreal_of_real_divide [simp]  | 
|
1124  | 
||
1125  | 
||
1126  | 
(*** Division lemmas ***)  | 
|
1127  | 
||
1128  | 
lemma hypreal_zero_divide: "(0::hypreal)/x = 0"  | 
|
1129  | 
apply (simp (no_asm) add: hypreal_divide_def)  | 
|
1130  | 
done  | 
|
1131  | 
||
1132  | 
lemma hypreal_divide_one: "x/(1::hypreal) = x"  | 
|
1133  | 
apply (simp (no_asm) add: hypreal_divide_def)  | 
|
1134  | 
done  | 
|
1135  | 
declare hypreal_zero_divide [simp] hypreal_divide_one [simp]  | 
|
1136  | 
||
1137  | 
lemma hypreal_times_divide1_eq: "(x::hypreal) * (y/z) = (x*y)/z"  | 
|
1138  | 
apply (simp (no_asm) add: hypreal_divide_def hypreal_mult_assoc)  | 
|
1139  | 
done  | 
|
1140  | 
||
1141  | 
lemma hypreal_times_divide2_eq: "(y/z) * (x::hypreal) = (y*x)/z"  | 
|
1142  | 
apply (simp (no_asm) add: hypreal_divide_def hypreal_mult_ac)  | 
|
1143  | 
done  | 
|
1144  | 
||
1145  | 
declare hypreal_times_divide1_eq [simp] hypreal_times_divide2_eq [simp]  | 
|
1146  | 
||
1147  | 
lemma hypreal_divide_divide1_eq: "(x::hypreal) / (y/z) = (x*z)/y"  | 
|
1148  | 
apply (simp (no_asm) add: hypreal_divide_def hypreal_inverse_distrib hypreal_mult_ac)  | 
|
1149  | 
done  | 
|
1150  | 
||
1151  | 
lemma hypreal_divide_divide2_eq: "((x::hypreal) / y) / z = x/(y*z)"  | 
|
1152  | 
apply (simp (no_asm) add: hypreal_divide_def hypreal_inverse_distrib hypreal_mult_assoc)  | 
|
1153  | 
done  | 
|
1154  | 
||
1155  | 
declare hypreal_divide_divide1_eq [simp] hypreal_divide_divide2_eq [simp]  | 
|
1156  | 
||
1157  | 
(** As with multiplication, pull minus signs OUT of the / operator **)  | 
|
1158  | 
||
1159  | 
lemma hypreal_minus_divide_eq: "(-x) / (y::hypreal) = - (x/y)"  | 
|
1160  | 
apply (simp (no_asm) add: hypreal_divide_def)  | 
|
1161  | 
done  | 
|
1162  | 
declare hypreal_minus_divide_eq [simp]  | 
|
1163  | 
||
1164  | 
lemma hypreal_divide_minus_eq: "(x / -(y::hypreal)) = - (x/y)"  | 
|
1165  | 
apply (simp (no_asm) add: hypreal_divide_def hypreal_minus_inverse)  | 
|
1166  | 
done  | 
|
1167  | 
declare hypreal_divide_minus_eq [simp]  | 
|
1168  | 
||
1169  | 
lemma hypreal_add_divide_distrib: "(x+y)/(z::hypreal) = x/z + y/z"  | 
|
1170  | 
apply (simp (no_asm) add: hypreal_divide_def hypreal_add_mult_distrib)  | 
|
1171  | 
done  | 
|
1172  | 
||
1173  | 
lemma hypreal_inverse_add: "[|(x::hypreal) \<noteq> 0; y \<noteq> 0 |]  | 
|
1174  | 
==> inverse(x) + inverse(y) = (x + y)*inverse(x*y)"  | 
|
1175  | 
apply (simp add: hypreal_inverse_distrib hypreal_add_mult_distrib hypreal_mult_assoc [symmetric])  | 
|
1176  | 
apply (subst hypreal_mult_assoc)  | 
|
1177  | 
apply (rule hypreal_mult_left_commute [THEN subst])  | 
|
1178  | 
apply (simp add: hypreal_add_commute)  | 
|
1179  | 
done  | 
|
1180  | 
||
1181  | 
lemma hypreal_self_eq_minus_self_zero: "x = -x ==> x = (0::hypreal)"  | 
|
1182  | 
apply (rule_tac z = "x" in eq_Abs_hypreal)  | 
|
1183  | 
apply (auto simp add: hypreal_minus hypreal_zero_def)  | 
|
1184  | 
apply (ultra)  | 
|
1185  | 
done  | 
|
1186  | 
||
1187  | 
lemma hypreal_add_self_zero_cancel: "(x + x = 0) = (x = (0::hypreal))"  | 
|
1188  | 
apply (rule_tac z = "x" in eq_Abs_hypreal)  | 
|
1189  | 
apply (auto simp add: hypreal_add hypreal_zero_def)  | 
|
1190  | 
done  | 
|
1191  | 
declare hypreal_add_self_zero_cancel [simp]  | 
|
1192  | 
||
1193  | 
lemma hypreal_add_self_zero_cancel2: "(x + x + y = y) = (x = (0::hypreal))"  | 
|
1194  | 
apply auto  | 
|
1195  | 
apply (drule hypreal_eq_minus_iff [THEN iffD1])  | 
|
1196  | 
apply (auto simp add: hypreal_add_assoc hypreal_self_eq_minus_self_zero)  | 
|
1197  | 
done  | 
|
1198  | 
declare hypreal_add_self_zero_cancel2 [simp]  | 
|
1199  | 
||
1200  | 
lemma hypreal_add_self_zero_cancel2a: "(x + (x + y) = y) = (x = (0::hypreal))"  | 
|
1201  | 
apply (simp (no_asm) add: hypreal_add_assoc [symmetric])  | 
|
1202  | 
done  | 
|
1203  | 
declare hypreal_add_self_zero_cancel2a [simp]  | 
|
1204  | 
||
1205  | 
lemma hypreal_minus_eq_swap: "(b = -a) = (-b = (a::hypreal))"  | 
|
1206  | 
apply auto  | 
|
1207  | 
done  | 
|
1208  | 
||
1209  | 
lemma hypreal_minus_eq_cancel: "(-b = -a) = (b = (a::hypreal))"  | 
|
1210  | 
apply (simp add: hypreal_minus_eq_swap)  | 
|
1211  | 
done  | 
|
1212  | 
declare hypreal_minus_eq_cancel [simp]  | 
|
1213  | 
||
1214  | 
lemma hypreal_less_eq_diff: "(x<y) = (x-y < (0::hypreal))"  | 
|
1215  | 
apply (unfold hypreal_diff_def)  | 
|
1216  | 
apply (rule hypreal_less_minus_iff2)  | 
|
1217  | 
done  | 
|
1218  | 
||
1219  | 
(*** Subtraction laws ***)  | 
|
1220  | 
||
1221  | 
lemma hypreal_add_diff_eq: "x + (y - z) = (x + y) - (z::hypreal)"  | 
|
1222  | 
apply (simp (no_asm) add: hypreal_diff_def hypreal_add_ac)  | 
|
1223  | 
done  | 
|
1224  | 
||
1225  | 
lemma hypreal_diff_add_eq: "(x - y) + z = (x + z) - (y::hypreal)"  | 
|
1226  | 
apply (simp (no_asm) add: hypreal_diff_def hypreal_add_ac)  | 
|
1227  | 
done  | 
|
1228  | 
||
1229  | 
lemma hypreal_diff_diff_eq: "(x - y) - z = x - (y + (z::hypreal))"  | 
|
1230  | 
apply (simp (no_asm) add: hypreal_diff_def hypreal_add_ac)  | 
|
1231  | 
done  | 
|
1232  | 
||
1233  | 
lemma hypreal_diff_diff_eq2: "x - (y - z) = (x + z) - (y::hypreal)"  | 
|
1234  | 
apply (simp (no_asm) add: hypreal_diff_def hypreal_add_ac)  | 
|
1235  | 
done  | 
|
1236  | 
||
1237  | 
lemma hypreal_diff_less_eq: "(x-y < z) = (x < z + (y::hypreal))"  | 
|
1238  | 
apply (subst hypreal_less_eq_diff)  | 
|
1239  | 
apply (rule_tac y1 = "z" in hypreal_less_eq_diff [THEN ssubst])  | 
|
1240  | 
apply (simp (no_asm) add: hypreal_diff_def hypreal_add_ac)  | 
|
1241  | 
done  | 
|
1242  | 
||
1243  | 
lemma hypreal_less_diff_eq: "(x < z-y) = (x + (y::hypreal) < z)"  | 
|
1244  | 
apply (subst hypreal_less_eq_diff)  | 
|
1245  | 
apply (rule_tac y1 = "z-y" in hypreal_less_eq_diff [THEN ssubst])  | 
|
1246  | 
apply (simp (no_asm) add: hypreal_diff_def hypreal_add_ac)  | 
|
1247  | 
done  | 
|
1248  | 
||
1249  | 
lemma hypreal_diff_le_eq: "(x-y <= z) = (x <= z + (y::hypreal))"  | 
|
1250  | 
apply (unfold hypreal_le_def)  | 
|
1251  | 
apply (simp (no_asm) add: hypreal_less_diff_eq)  | 
|
1252  | 
done  | 
|
1253  | 
||
1254  | 
lemma hypreal_le_diff_eq: "(x <= z-y) = (x + (y::hypreal) <= z)"  | 
|
1255  | 
apply (unfold hypreal_le_def)  | 
|
1256  | 
apply (simp (no_asm) add: hypreal_diff_less_eq)  | 
|
1257  | 
done  | 
|
1258  | 
||
1259  | 
lemma hypreal_diff_eq_eq: "(x-y = z) = (x = z + (y::hypreal))"  | 
|
1260  | 
apply (unfold hypreal_diff_def)  | 
|
1261  | 
apply (auto simp add: hypreal_add_assoc)  | 
|
1262  | 
done  | 
|
1263  | 
||
1264  | 
lemma hypreal_eq_diff_eq: "(x = z-y) = (x + (y::hypreal) = z)"  | 
|
1265  | 
apply (unfold hypreal_diff_def)  | 
|
1266  | 
apply (auto simp add: hypreal_add_assoc)  | 
|
1267  | 
done  | 
|
1268  | 
||
1269  | 
||
1270  | 
(** For the cancellation simproc.  | 
|
1271  | 
The idea is to cancel like terms on opposite sides by subtraction **)  | 
|
1272  | 
||
1273  | 
lemma hypreal_less_eqI: "(x::hypreal) - y = x' - y' ==> (x<y) = (x'<y')"  | 
|
1274  | 
apply (subst hypreal_less_eq_diff)  | 
|
1275  | 
apply (rule_tac y1 = "y" in hypreal_less_eq_diff [THEN ssubst])  | 
|
1276  | 
apply (simp (no_asm_simp))  | 
|
1277  | 
done  | 
|
1278  | 
||
1279  | 
lemma hypreal_le_eqI: "(x::hypreal) - y = x' - y' ==> (y<=x) = (y'<=x')"  | 
|
1280  | 
apply (drule hypreal_less_eqI)  | 
|
1281  | 
apply (simp (no_asm_simp) add: hypreal_le_def)  | 
|
1282  | 
done  | 
|
1283  | 
||
1284  | 
lemma hypreal_eq_eqI: "(x::hypreal) - y = x' - y' ==> (x=y) = (x'=y')"  | 
|
1285  | 
apply safe  | 
|
1286  | 
apply (simp_all add: hypreal_eq_diff_eq hypreal_diff_eq_eq)  | 
|
1287  | 
done  | 
|
1288  | 
||
1289  | 
lemma hypreal_zero_num: "0 = Abs_hypreal (hyprel `` {%n. 0})"
 | 
|
1290  | 
apply (simp (no_asm) add: hypreal_zero_def [THEN meta_eq_to_obj_eq, symmetric])  | 
|
1291  | 
done  | 
|
1292  | 
||
1293  | 
lemma hypreal_one_num: "1 = Abs_hypreal (hyprel `` {%n. 1})"
 | 
|
1294  | 
apply (simp (no_asm) add: hypreal_one_def [THEN meta_eq_to_obj_eq, symmetric])  | 
|
1295  | 
done  | 
|
1296  | 
||
1297  | 
lemma hypreal_omega_gt_zero: "0 < omega"  | 
|
1298  | 
apply (unfold omega_def)  | 
|
1299  | 
apply (auto simp add: hypreal_less hypreal_zero_num)  | 
|
1300  | 
done  | 
|
1301  | 
declare hypreal_omega_gt_zero [simp]  | 
|
1302  | 
||
1303  | 
ML  | 
|
1304  | 
{*
 | 
|
1305  | 
val hypreal_zero_def = thm "hypreal_zero_def";  | 
|
1306  | 
val hypreal_one_def = thm "hypreal_one_def";  | 
|
1307  | 
val hypreal_minus_def = thm "hypreal_minus_def";  | 
|
1308  | 
val hypreal_diff_def = thm "hypreal_diff_def";  | 
|
1309  | 
val hypreal_inverse_def = thm "hypreal_inverse_def";  | 
|
1310  | 
val hypreal_divide_def = thm "hypreal_divide_def";  | 
|
1311  | 
val hypreal_of_real_def = thm "hypreal_of_real_def";  | 
|
1312  | 
val omega_def = thm "omega_def";  | 
|
1313  | 
val epsilon_def = thm "epsilon_def";  | 
|
1314  | 
val hypreal_add_def = thm "hypreal_add_def";  | 
|
1315  | 
val hypreal_mult_def = thm "hypreal_mult_def";  | 
|
1316  | 
val hypreal_less_def = thm "hypreal_less_def";  | 
|
1317  | 
val hypreal_le_def = thm "hypreal_le_def";  | 
|
1318  | 
||
1319  | 
val finite_exhausts = thm "finite_exhausts";  | 
|
1320  | 
val finite_not_covers = thm "finite_not_covers";  | 
|
1321  | 
val not_finite_nat = thm "not_finite_nat";  | 
|
1322  | 
val FreeUltrafilterNat_Ex = thm "FreeUltrafilterNat_Ex";  | 
|
1323  | 
val FreeUltrafilterNat_mem = thm "FreeUltrafilterNat_mem";  | 
|
1324  | 
val FreeUltrafilterNat_finite = thm "FreeUltrafilterNat_finite";  | 
|
1325  | 
val FreeUltrafilterNat_not_finite = thm "FreeUltrafilterNat_not_finite";  | 
|
1326  | 
val FreeUltrafilterNat_empty = thm "FreeUltrafilterNat_empty";  | 
|
1327  | 
val FreeUltrafilterNat_Int = thm "FreeUltrafilterNat_Int";  | 
|
1328  | 
val FreeUltrafilterNat_subset = thm "FreeUltrafilterNat_subset";  | 
|
1329  | 
val FreeUltrafilterNat_Compl = thm "FreeUltrafilterNat_Compl";  | 
|
1330  | 
val FreeUltrafilterNat_Compl_mem = thm "FreeUltrafilterNat_Compl_mem";  | 
|
1331  | 
val FreeUltrafilterNat_Compl_iff1 = thm "FreeUltrafilterNat_Compl_iff1";  | 
|
1332  | 
val FreeUltrafilterNat_Compl_iff2 = thm "FreeUltrafilterNat_Compl_iff2";  | 
|
1333  | 
val FreeUltrafilterNat_UNIV = thm "FreeUltrafilterNat_UNIV";  | 
|
1334  | 
val FreeUltrafilterNat_Nat_set = thm "FreeUltrafilterNat_Nat_set";  | 
|
1335  | 
val FreeUltrafilterNat_Nat_set_refl = thm "FreeUltrafilterNat_Nat_set_refl";  | 
|
1336  | 
val FreeUltrafilterNat_P = thm "FreeUltrafilterNat_P";  | 
|
1337  | 
val FreeUltrafilterNat_Ex_P = thm "FreeUltrafilterNat_Ex_P";  | 
|
1338  | 
val FreeUltrafilterNat_all = thm "FreeUltrafilterNat_all";  | 
|
1339  | 
val FreeUltrafilterNat_Un = thm "FreeUltrafilterNat_Un";  | 
|
1340  | 
val hyprel_iff = thm "hyprel_iff";  | 
|
1341  | 
val hyprel_refl = thm "hyprel_refl";  | 
|
1342  | 
val hyprel_sym = thm "hyprel_sym";  | 
|
1343  | 
val hyprel_trans = thm "hyprel_trans";  | 
|
1344  | 
val equiv_hyprel = thm "equiv_hyprel";  | 
|
1345  | 
val hyprel_in_hypreal = thm "hyprel_in_hypreal";  | 
|
1346  | 
val Abs_hypreal_inverse = thm "Abs_hypreal_inverse";  | 
|
1347  | 
val inj_on_Abs_hypreal = thm "inj_on_Abs_hypreal";  | 
|
1348  | 
val inj_Rep_hypreal = thm "inj_Rep_hypreal";  | 
|
1349  | 
val lemma_hyprel_refl = thm "lemma_hyprel_refl";  | 
|
1350  | 
val hypreal_empty_not_mem = thm "hypreal_empty_not_mem";  | 
|
1351  | 
val Rep_hypreal_nonempty = thm "Rep_hypreal_nonempty";  | 
|
1352  | 
val inj_hypreal_of_real = thm "inj_hypreal_of_real";  | 
|
1353  | 
val eq_Abs_hypreal = thm "eq_Abs_hypreal";  | 
|
1354  | 
val hypreal_minus_congruent = thm "hypreal_minus_congruent";  | 
|
1355  | 
val hypreal_minus = thm "hypreal_minus";  | 
|
1356  | 
val hypreal_minus_minus = thm "hypreal_minus_minus";  | 
|
1357  | 
val inj_hypreal_minus = thm "inj_hypreal_minus";  | 
|
1358  | 
val hypreal_minus_zero = thm "hypreal_minus_zero";  | 
|
1359  | 
val hypreal_minus_zero_iff = thm "hypreal_minus_zero_iff";  | 
|
1360  | 
val hypreal_add_congruent2 = thm "hypreal_add_congruent2";  | 
|
1361  | 
val hypreal_add = thm "hypreal_add";  | 
|
1362  | 
val hypreal_diff = thm "hypreal_diff";  | 
|
1363  | 
val hypreal_add_commute = thm "hypreal_add_commute";  | 
|
1364  | 
val hypreal_add_assoc = thm "hypreal_add_assoc";  | 
|
1365  | 
val hypreal_add_left_commute = thm "hypreal_add_left_commute";  | 
|
1366  | 
val hypreal_add_zero_left = thm "hypreal_add_zero_left";  | 
|
1367  | 
val hypreal_add_zero_right = thm "hypreal_add_zero_right";  | 
|
1368  | 
val hypreal_add_minus = thm "hypreal_add_minus";  | 
|
1369  | 
val hypreal_add_minus_left = thm "hypreal_add_minus_left";  | 
|
1370  | 
val hypreal_minus_ex = thm "hypreal_minus_ex";  | 
|
1371  | 
val hypreal_minus_ex1 = thm "hypreal_minus_ex1";  | 
|
1372  | 
val hypreal_minus_left_ex1 = thm "hypreal_minus_left_ex1";  | 
|
1373  | 
val hypreal_add_minus_eq_minus = thm "hypreal_add_minus_eq_minus";  | 
|
1374  | 
val hypreal_as_add_inverse_ex = thm "hypreal_as_add_inverse_ex";  | 
|
1375  | 
val hypreal_minus_add_distrib = thm "hypreal_minus_add_distrib";  | 
|
1376  | 
val hypreal_minus_distrib1 = thm "hypreal_minus_distrib1";  | 
|
1377  | 
val hypreal_add_left_cancel = thm "hypreal_add_left_cancel";  | 
|
1378  | 
val hypreal_add_right_cancel = thm "hypreal_add_right_cancel";  | 
|
1379  | 
val hypreal_add_minus_cancelA = thm "hypreal_add_minus_cancelA";  | 
|
1380  | 
val hypreal_minus_add_cancelA = thm "hypreal_minus_add_cancelA";  | 
|
1381  | 
val hypreal_mult_congruent2 = thm "hypreal_mult_congruent2";  | 
|
1382  | 
val hypreal_mult = thm "hypreal_mult";  | 
|
1383  | 
val hypreal_mult_commute = thm "hypreal_mult_commute";  | 
|
1384  | 
val hypreal_mult_assoc = thm "hypreal_mult_assoc";  | 
|
1385  | 
val hypreal_mult_left_commute = thm "hypreal_mult_left_commute";  | 
|
1386  | 
val hypreal_mult_1 = thm "hypreal_mult_1";  | 
|
1387  | 
val hypreal_mult_1_right = thm "hypreal_mult_1_right";  | 
|
1388  | 
val hypreal_mult_0 = thm "hypreal_mult_0";  | 
|
1389  | 
val hypreal_mult_0_right = thm "hypreal_mult_0_right";  | 
|
1390  | 
val hypreal_minus_mult_eq1 = thm "hypreal_minus_mult_eq1";  | 
|
1391  | 
val hypreal_minus_mult_eq2 = thm "hypreal_minus_mult_eq2";  | 
|
1392  | 
val hypreal_mult_minus_1 = thm "hypreal_mult_minus_1";  | 
|
1393  | 
val hypreal_mult_minus_1_right = thm "hypreal_mult_minus_1_right";  | 
|
1394  | 
val hypreal_minus_mult_commute = thm "hypreal_minus_mult_commute";  | 
|
1395  | 
val hypreal_add_assoc_cong = thm "hypreal_add_assoc_cong";  | 
|
1396  | 
val hypreal_add_mult_distrib = thm "hypreal_add_mult_distrib";  | 
|
1397  | 
val hypreal_add_mult_distrib2 = thm "hypreal_add_mult_distrib2";  | 
|
1398  | 
val hypreal_diff_mult_distrib = thm "hypreal_diff_mult_distrib";  | 
|
1399  | 
val hypreal_diff_mult_distrib2 = thm "hypreal_diff_mult_distrib2";  | 
|
1400  | 
val hypreal_zero_not_eq_one = thm "hypreal_zero_not_eq_one";  | 
|
1401  | 
val hypreal_inverse_congruent = thm "hypreal_inverse_congruent";  | 
|
1402  | 
val hypreal_inverse = thm "hypreal_inverse";  | 
|
1403  | 
val HYPREAL_INVERSE_ZERO = thm "HYPREAL_INVERSE_ZERO";  | 
|
1404  | 
val HYPREAL_DIVISION_BY_ZERO = thm "HYPREAL_DIVISION_BY_ZERO";  | 
|
1405  | 
val hypreal_inverse_inverse = thm "hypreal_inverse_inverse";  | 
|
1406  | 
val hypreal_inverse_1 = thm "hypreal_inverse_1";  | 
|
1407  | 
val hypreal_mult_inverse = thm "hypreal_mult_inverse";  | 
|
1408  | 
val hypreal_mult_inverse_left = thm "hypreal_mult_inverse_left";  | 
|
1409  | 
val hypreal_mult_left_cancel = thm "hypreal_mult_left_cancel";  | 
|
1410  | 
val hypreal_mult_right_cancel = thm "hypreal_mult_right_cancel";  | 
|
1411  | 
val hypreal_inverse_not_zero = thm "hypreal_inverse_not_zero";  | 
|
1412  | 
val hypreal_mult_not_0 = thm "hypreal_mult_not_0";  | 
|
1413  | 
val hypreal_mult_zero_disj = thm "hypreal_mult_zero_disj";  | 
|
1414  | 
val hypreal_minus_inverse = thm "hypreal_minus_inverse";  | 
|
1415  | 
val hypreal_inverse_distrib = thm "hypreal_inverse_distrib";  | 
|
1416  | 
val hypreal_less_iff = thm "hypreal_less_iff";  | 
|
1417  | 
val hypreal_lessI = thm "hypreal_lessI";  | 
|
1418  | 
val hypreal_lessE = thm "hypreal_lessE";  | 
|
1419  | 
val hypreal_lessD = thm "hypreal_lessD";  | 
|
1420  | 
val hypreal_less_not_refl = thm "hypreal_less_not_refl";  | 
|
1421  | 
val hypreal_not_refl2 = thm "hypreal_not_refl2";  | 
|
1422  | 
val hypreal_less_trans = thm "hypreal_less_trans";  | 
|
1423  | 
val hypreal_less_asym = thm "hypreal_less_asym";  | 
|
1424  | 
val hypreal_less = thm "hypreal_less";  | 
|
1425  | 
val hypreal_trichotomy = thm "hypreal_trichotomy";  | 
|
1426  | 
val hypreal_trichotomyE = thm "hypreal_trichotomyE";  | 
|
1427  | 
val hypreal_less_minus_iff = thm "hypreal_less_minus_iff";  | 
|
1428  | 
val hypreal_less_minus_iff2 = thm "hypreal_less_minus_iff2";  | 
|
1429  | 
val hypreal_eq_minus_iff = thm "hypreal_eq_minus_iff";  | 
|
1430  | 
val hypreal_eq_minus_iff2 = thm "hypreal_eq_minus_iff2";  | 
|
1431  | 
val hypreal_diff_zero = thm "hypreal_diff_zero";  | 
|
1432  | 
val hypreal_diff_zero_right = thm "hypreal_diff_zero_right";  | 
|
1433  | 
val hypreal_diff_self = thm "hypreal_diff_self";  | 
|
1434  | 
val hypreal_eq_minus_iff3 = thm "hypreal_eq_minus_iff3";  | 
|
1435  | 
val hypreal_not_eq_minus_iff = thm "hypreal_not_eq_minus_iff";  | 
|
1436  | 
val hypreal_linear = thm "hypreal_linear";  | 
|
1437  | 
val hypreal_neq_iff = thm "hypreal_neq_iff";  | 
|
1438  | 
val hypreal_linear_less2 = thm "hypreal_linear_less2";  | 
|
1439  | 
val hypreal_le = thm "hypreal_le";  | 
|
1440  | 
val hypreal_leI = thm "hypreal_leI";  | 
|
1441  | 
val hypreal_leD = thm "hypreal_leD";  | 
|
1442  | 
val hypreal_less_le_iff = thm "hypreal_less_le_iff";  | 
|
1443  | 
val not_hypreal_leE = thm "not_hypreal_leE";  | 
|
1444  | 
val hypreal_le_imp_less_or_eq = thm "hypreal_le_imp_less_or_eq";  | 
|
1445  | 
val hypreal_less_or_eq_imp_le = thm "hypreal_less_or_eq_imp_le";  | 
|
1446  | 
val hypreal_le_eq_less_or_eq = thm "hypreal_le_eq_less_or_eq";  | 
|
1447  | 
val hypreal_le_refl = thm "hypreal_le_refl";  | 
|
1448  | 
val hypreal_le_linear = thm "hypreal_le_linear";  | 
|
1449  | 
val hypreal_le_trans = thm "hypreal_le_trans";  | 
|
1450  | 
val hypreal_le_anti_sym = thm "hypreal_le_anti_sym";  | 
|
1451  | 
val not_less_not_eq_hypreal_less = thm "not_less_not_eq_hypreal_less";  | 
|
1452  | 
val hypreal_less_le = thm "hypreal_less_le";  | 
|
1453  | 
val hypreal_minus_zero_less_iff = thm "hypreal_minus_zero_less_iff";  | 
|
1454  | 
val hypreal_minus_zero_less_iff2 = thm "hypreal_minus_zero_less_iff2";  | 
|
1455  | 
val hypreal_minus_zero_le_iff = thm "hypreal_minus_zero_le_iff";  | 
|
1456  | 
val hypreal_minus_zero_le_iff2 = thm "hypreal_minus_zero_le_iff2";  | 
|
1457  | 
val hypreal_of_real_add = thm "hypreal_of_real_add";  | 
|
1458  | 
val hypreal_of_real_mult = thm "hypreal_of_real_mult";  | 
|
1459  | 
val hypreal_of_real_less_iff = thm "hypreal_of_real_less_iff";  | 
|
1460  | 
val hypreal_of_real_le_iff = thm "hypreal_of_real_le_iff";  | 
|
1461  | 
val hypreal_of_real_eq_iff = thm "hypreal_of_real_eq_iff";  | 
|
1462  | 
val hypreal_of_real_minus = thm "hypreal_of_real_minus";  | 
|
1463  | 
val hypreal_of_real_one = thm "hypreal_of_real_one";  | 
|
1464  | 
val hypreal_of_real_zero = thm "hypreal_of_real_zero";  | 
|
1465  | 
val hypreal_of_real_zero_iff = thm "hypreal_of_real_zero_iff";  | 
|
1466  | 
val hypreal_of_real_inverse = thm "hypreal_of_real_inverse";  | 
|
1467  | 
val hypreal_of_real_divide = thm "hypreal_of_real_divide";  | 
|
1468  | 
val hypreal_zero_divide = thm "hypreal_zero_divide";  | 
|
1469  | 
val hypreal_divide_one = thm "hypreal_divide_one";  | 
|
1470  | 
val hypreal_times_divide1_eq = thm "hypreal_times_divide1_eq";  | 
|
1471  | 
val hypreal_times_divide2_eq = thm "hypreal_times_divide2_eq";  | 
|
1472  | 
val hypreal_divide_divide1_eq = thm "hypreal_divide_divide1_eq";  | 
|
1473  | 
val hypreal_divide_divide2_eq = thm "hypreal_divide_divide2_eq";  | 
|
1474  | 
val hypreal_minus_divide_eq = thm "hypreal_minus_divide_eq";  | 
|
1475  | 
val hypreal_divide_minus_eq = thm "hypreal_divide_minus_eq";  | 
|
1476  | 
val hypreal_add_divide_distrib = thm "hypreal_add_divide_distrib";  | 
|
1477  | 
val hypreal_inverse_add = thm "hypreal_inverse_add";  | 
|
1478  | 
val hypreal_self_eq_minus_self_zero = thm "hypreal_self_eq_minus_self_zero";  | 
|
1479  | 
val hypreal_add_self_zero_cancel = thm "hypreal_add_self_zero_cancel";  | 
|
1480  | 
val hypreal_add_self_zero_cancel2 = thm "hypreal_add_self_zero_cancel2";  | 
|
1481  | 
val hypreal_add_self_zero_cancel2a = thm "hypreal_add_self_zero_cancel2a";  | 
|
1482  | 
val hypreal_minus_eq_swap = thm "hypreal_minus_eq_swap";  | 
|
1483  | 
val hypreal_minus_eq_cancel = thm "hypreal_minus_eq_cancel";  | 
|
1484  | 
val hypreal_less_eq_diff = thm "hypreal_less_eq_diff";  | 
|
1485  | 
val hypreal_add_diff_eq = thm "hypreal_add_diff_eq";  | 
|
1486  | 
val hypreal_diff_add_eq = thm "hypreal_diff_add_eq";  | 
|
1487  | 
val hypreal_diff_diff_eq = thm "hypreal_diff_diff_eq";  | 
|
1488  | 
val hypreal_diff_diff_eq2 = thm "hypreal_diff_diff_eq2";  | 
|
1489  | 
val hypreal_diff_less_eq = thm "hypreal_diff_less_eq";  | 
|
1490  | 
val hypreal_less_diff_eq = thm "hypreal_less_diff_eq";  | 
|
1491  | 
val hypreal_diff_le_eq = thm "hypreal_diff_le_eq";  | 
|
1492  | 
val hypreal_le_diff_eq = thm "hypreal_le_diff_eq";  | 
|
1493  | 
val hypreal_diff_eq_eq = thm "hypreal_diff_eq_eq";  | 
|
1494  | 
val hypreal_eq_diff_eq = thm "hypreal_eq_diff_eq";  | 
|
1495  | 
val hypreal_less_eqI = thm "hypreal_less_eqI";  | 
|
1496  | 
val hypreal_le_eqI = thm "hypreal_le_eqI";  | 
|
1497  | 
val hypreal_eq_eqI = thm "hypreal_eq_eqI";  | 
|
1498  | 
val hypreal_zero_num = thm "hypreal_zero_num";  | 
|
1499  | 
val hypreal_one_num = thm "hypreal_one_num";  | 
|
1500  | 
val hypreal_omega_gt_zero = thm "hypreal_omega_gt_zero";  | 
|
1501  | 
*}  | 
|
1502  | 
||
1503  | 
||
| 10751 | 1504  | 
end  |