61 |
61 |
62 text{*Proving that @{term hypnatrel} is an equivalence relation*} |
62 text{*Proving that @{term hypnatrel} is an equivalence relation*} |
63 |
63 |
64 lemma hypnatrel_iff: |
64 lemma hypnatrel_iff: |
65 "((X,Y) \<in> hypnatrel) = ({n. X n = Y n}: FreeUltrafilterNat)" |
65 "((X,Y) \<in> hypnatrel) = ({n. X n = Y n}: FreeUltrafilterNat)" |
66 apply (unfold hypnatrel_def, fast) |
66 apply (simp add: hypnatrel_def) |
67 done |
67 done |
68 |
68 |
69 lemma hypnatrel_refl: "(x,x) \<in> hypnatrel" |
69 lemma hypnatrel_refl: "(x,x) \<in> hypnatrel" |
70 by (unfold hypnatrel_def, auto) |
70 by (simp add: hypnatrel_def) |
71 |
71 |
72 lemma hypnatrel_sym: "(x,y) \<in> hypnatrel ==> (y,x) \<in> hypnatrel" |
72 lemma hypnatrel_sym: "(x,y) \<in> hypnatrel ==> (y,x) \<in> hypnatrel" |
73 by (auto simp add: hypnatrel_def eq_commute) |
73 by (auto simp add: hypnatrel_def eq_commute) |
74 |
74 |
75 lemma hypnatrel_trans [rule_format (no_asm)]: |
75 lemma hypnatrel_trans [rule_format (no_asm)]: |
76 "(x,y) \<in> hypnatrel --> (y,z) \<in> hypnatrel --> (x,z) \<in> hypnatrel" |
76 "(x,y) \<in> hypnatrel --> (y,z) \<in> hypnatrel --> (x,z) \<in> hypnatrel" |
77 apply (unfold hypnatrel_def, auto, ultra) |
77 by (auto simp add: hypnatrel_def, ultra) |
78 done |
|
79 |
78 |
80 lemma equiv_hypnatrel: |
79 lemma equiv_hypnatrel: |
81 "equiv UNIV hypnatrel" |
80 "equiv UNIV hypnatrel" |
82 apply (simp add: equiv_def refl_def sym_def trans_def hypnatrel_refl) |
81 apply (simp add: equiv_def refl_def sym_def trans_def hypnatrel_refl) |
83 apply (blast intro: hypnatrel_sym hypnatrel_trans) |
82 apply (blast intro: hypnatrel_sym hypnatrel_trans) |
131 apply (rule_tac x1=z in Rep_hypnat [unfolded hypnat_def, THEN quotientE]) |
130 apply (rule_tac x1=z in Rep_hypnat [unfolded hypnat_def, THEN quotientE]) |
132 apply (drule_tac f = Abs_hypnat in arg_cong) |
131 apply (drule_tac f = Abs_hypnat in arg_cong) |
133 apply (force simp add: Rep_hypnat_inverse) |
132 apply (force simp add: Rep_hypnat_inverse) |
134 done |
133 done |
135 |
134 |
|
135 theorem hypnat_cases [case_names Abs_hypnat, cases type: hypnat]: |
|
136 "(!!x. z = Abs_hypnat(hypnatrel``{x}) ==> P) ==> P" |
|
137 by (rule eq_Abs_hypnat [of z], blast) |
|
138 |
136 subsection{*Hypernat Addition*} |
139 subsection{*Hypernat Addition*} |
137 |
140 |
138 lemma hypnat_add_congruent2: |
141 lemma hypnat_add_congruent2: |
139 "congruent2 hypnatrel (%X Y. hypnatrel``{%n. X n + Y n})" |
142 "congruent2 hypnatrel (%X Y. hypnatrel``{%n. X n + Y n})" |
140 apply (unfold congruent2_def, auto, ultra) |
143 apply (simp add: congruent2_def, auto, ultra) |
141 done |
144 done |
142 |
145 |
143 lemma hypnat_add: |
146 lemma hypnat_add: |
144 "Abs_hypnat(hypnatrel``{%n. X n}) + Abs_hypnat(hypnatrel``{%n. Y n}) = |
147 "Abs_hypnat(hypnatrel``{%n. X n}) + Abs_hypnat(hypnatrel``{%n. Y n}) = |
145 Abs_hypnat(hypnatrel``{%n. X n + Y n})" |
148 Abs_hypnat(hypnatrel``{%n. X n + Y n})" |
146 by (simp add: hypnat_add_def UN_equiv_class2 [OF equiv_hypnatrel hypnat_add_congruent2]) |
149 by (simp add: hypnat_add_def UN_equiv_class2 [OF equiv_hypnatrel hypnat_add_congruent2]) |
147 |
150 |
148 lemma hypnat_add_commute: "(z::hypnat) + w = w + z" |
151 lemma hypnat_add_commute: "(z::hypnat) + w = w + z" |
149 apply (rule eq_Abs_hypnat [of z]) |
152 apply (cases z, cases w) |
150 apply (rule eq_Abs_hypnat [of w]) |
|
151 apply (simp add: add_ac hypnat_add) |
153 apply (simp add: add_ac hypnat_add) |
152 done |
154 done |
153 |
155 |
154 lemma hypnat_add_assoc: "((z1::hypnat) + z2) + z3 = z1 + (z2 + z3)" |
156 lemma hypnat_add_assoc: "((z1::hypnat) + z2) + z3 = z1 + (z2 + z3)" |
155 apply (rule eq_Abs_hypnat [of z1]) |
157 apply (cases z1, cases z2, cases z3) |
156 apply (rule eq_Abs_hypnat [of z2]) |
|
157 apply (rule eq_Abs_hypnat [of z3]) |
|
158 apply (simp add: hypnat_add nat_add_assoc) |
158 apply (simp add: hypnat_add nat_add_assoc) |
159 done |
159 done |
160 |
160 |
161 lemma hypnat_add_zero_left: "(0::hypnat) + z = z" |
161 lemma hypnat_add_zero_left: "(0::hypnat) + z = z" |
162 apply (rule eq_Abs_hypnat [of z]) |
162 apply (cases z) |
163 apply (simp add: hypnat_zero_def hypnat_add) |
163 apply (simp add: hypnat_zero_def hypnat_add) |
164 done |
164 done |
165 |
165 |
166 instance hypnat :: plus_ac0 |
166 instance hypnat :: plus_ac0 |
167 by (intro_classes, |
167 by (intro_classes, |
172 subsection{*Subtraction inverse on @{typ hypreal}*} |
172 subsection{*Subtraction inverse on @{typ hypreal}*} |
173 |
173 |
174 |
174 |
175 lemma hypnat_minus_congruent2: |
175 lemma hypnat_minus_congruent2: |
176 "congruent2 hypnatrel (%X Y. hypnatrel``{%n. X n - Y n})" |
176 "congruent2 hypnatrel (%X Y. hypnatrel``{%n. X n - Y n})" |
177 apply (unfold congruent2_def, auto, ultra) |
177 apply (simp add: congruent2_def, auto, ultra) |
178 done |
178 done |
179 |
179 |
180 lemma hypnat_minus: |
180 lemma hypnat_minus: |
181 "Abs_hypnat(hypnatrel``{%n. X n}) - Abs_hypnat(hypnatrel``{%n. Y n}) = |
181 "Abs_hypnat(hypnatrel``{%n. X n}) - Abs_hypnat(hypnatrel``{%n. Y n}) = |
182 Abs_hypnat(hypnatrel``{%n. X n - Y n})" |
182 Abs_hypnat(hypnatrel``{%n. X n - Y n})" |
183 by (simp add: hypnat_minus_def UN_equiv_class2 [OF equiv_hypnatrel hypnat_minus_congruent2]) |
183 by (simp add: hypnat_minus_def UN_equiv_class2 [OF equiv_hypnatrel hypnat_minus_congruent2]) |
184 |
184 |
185 lemma hypnat_minus_zero: "z - z = (0::hypnat)" |
185 lemma hypnat_minus_zero: "z - z = (0::hypnat)" |
186 apply (rule eq_Abs_hypnat [of z]) |
186 apply (cases z) |
187 apply (simp add: hypnat_zero_def hypnat_minus) |
187 apply (simp add: hypnat_zero_def hypnat_minus) |
188 done |
188 done |
189 |
189 |
190 lemma hypnat_diff_0_eq_0: "(0::hypnat) - n = 0" |
190 lemma hypnat_diff_0_eq_0: "(0::hypnat) - n = 0" |
191 apply (rule eq_Abs_hypnat [of n]) |
191 apply (cases n) |
192 apply (simp add: hypnat_minus hypnat_zero_def) |
192 apply (simp add: hypnat_minus hypnat_zero_def) |
193 done |
193 done |
194 |
194 |
195 declare hypnat_minus_zero [simp] hypnat_diff_0_eq_0 [simp] |
195 declare hypnat_minus_zero [simp] hypnat_diff_0_eq_0 [simp] |
196 |
196 |
197 lemma hypnat_add_is_0: "(m+n = (0::hypnat)) = (m=0 & n=0)" |
197 lemma hypnat_add_is_0: "(m+n = (0::hypnat)) = (m=0 & n=0)" |
198 apply (rule eq_Abs_hypnat [of m]) |
198 apply (cases m, cases n) |
199 apply (rule eq_Abs_hypnat [of n]) |
|
200 apply (auto intro: FreeUltrafilterNat_subset dest: FreeUltrafilterNat_Int simp add: hypnat_zero_def hypnat_add) |
199 apply (auto intro: FreeUltrafilterNat_subset dest: FreeUltrafilterNat_Int simp add: hypnat_zero_def hypnat_add) |
201 done |
200 done |
202 |
201 |
203 declare hypnat_add_is_0 [iff] |
202 declare hypnat_add_is_0 [iff] |
204 |
203 |
205 lemma hypnat_diff_diff_left: "(i::hypnat) - j - k = i - (j+k)" |
204 lemma hypnat_diff_diff_left: "(i::hypnat) - j - k = i - (j+k)" |
206 apply (rule eq_Abs_hypnat [of i]) |
205 apply (cases i, cases j, cases k) |
207 apply (rule eq_Abs_hypnat [of j]) |
|
208 apply (rule eq_Abs_hypnat [of k]) |
|
209 apply (simp add: hypnat_minus hypnat_add diff_diff_left) |
206 apply (simp add: hypnat_minus hypnat_add diff_diff_left) |
210 done |
207 done |
211 |
208 |
212 lemma hypnat_diff_commute: "(i::hypnat) - j - k = i-k-j" |
209 lemma hypnat_diff_commute: "(i::hypnat) - j - k = i-k-j" |
213 by (simp add: hypnat_diff_diff_left hypnat_add_commute) |
210 by (simp add: hypnat_diff_diff_left hypnat_add_commute) |
214 |
211 |
215 lemma hypnat_diff_add_inverse: "((n::hypnat) + m) - n = m" |
212 lemma hypnat_diff_add_inverse: "((n::hypnat) + m) - n = m" |
216 apply (rule eq_Abs_hypnat [of m]) |
213 apply (cases m, cases n) |
217 apply (rule eq_Abs_hypnat [of n]) |
|
218 apply (simp add: hypnat_minus hypnat_add) |
214 apply (simp add: hypnat_minus hypnat_add) |
219 done |
215 done |
220 declare hypnat_diff_add_inverse [simp] |
216 declare hypnat_diff_add_inverse [simp] |
221 |
217 |
222 lemma hypnat_diff_add_inverse2: "((m::hypnat) + n) - n = m" |
218 lemma hypnat_diff_add_inverse2: "((m::hypnat) + n) - n = m" |
223 apply (rule eq_Abs_hypnat [of m]) |
219 apply (cases m, cases n) |
224 apply (rule eq_Abs_hypnat [of n]) |
|
225 apply (simp add: hypnat_minus hypnat_add) |
220 apply (simp add: hypnat_minus hypnat_add) |
226 done |
221 done |
227 declare hypnat_diff_add_inverse2 [simp] |
222 declare hypnat_diff_add_inverse2 [simp] |
228 |
223 |
229 lemma hypnat_diff_cancel: "((k::hypnat) + m) - (k+n) = m - n" |
224 lemma hypnat_diff_cancel: "((k::hypnat) + m) - (k+n) = m - n" |
230 apply (rule eq_Abs_hypnat [of k]) |
225 apply (cases k, cases m, cases n) |
231 apply (rule eq_Abs_hypnat [of m]) |
|
232 apply (rule eq_Abs_hypnat [of n]) |
|
233 apply (simp add: hypnat_minus hypnat_add) |
226 apply (simp add: hypnat_minus hypnat_add) |
234 done |
227 done |
235 declare hypnat_diff_cancel [simp] |
228 declare hypnat_diff_cancel [simp] |
236 |
229 |
237 lemma hypnat_diff_cancel2: "((m::hypnat) + k) - (n+k) = m - n" |
230 lemma hypnat_diff_cancel2: "((m::hypnat) + k) - (n+k) = m - n" |
238 by (simp add: hypnat_add_commute [of _ k]) |
231 by (simp add: hypnat_add_commute [of _ k]) |
239 declare hypnat_diff_cancel2 [simp] |
232 declare hypnat_diff_cancel2 [simp] |
240 |
233 |
241 lemma hypnat_diff_add_0: "(n::hypnat) - (n+m) = (0::hypnat)" |
234 lemma hypnat_diff_add_0: "(n::hypnat) - (n+m) = (0::hypnat)" |
242 apply (rule eq_Abs_hypnat [of m]) |
235 apply (cases m, cases n) |
243 apply (rule eq_Abs_hypnat [of n]) |
|
244 apply (simp add: hypnat_zero_def hypnat_minus hypnat_add) |
236 apply (simp add: hypnat_zero_def hypnat_minus hypnat_add) |
245 done |
237 done |
246 declare hypnat_diff_add_0 [simp] |
238 declare hypnat_diff_add_0 [simp] |
247 |
239 |
248 |
240 |
249 subsection{*Hyperreal Multiplication*} |
241 subsection{*Hyperreal Multiplication*} |
250 |
242 |
251 lemma hypnat_mult_congruent2: |
243 lemma hypnat_mult_congruent2: |
252 "congruent2 hypnatrel (%X Y. hypnatrel``{%n. X n * Y n})" |
244 "congruent2 hypnatrel (%X Y. hypnatrel``{%n. X n * Y n})" |
253 by (unfold congruent2_def, auto, ultra) |
245 by (simp add: congruent2_def, auto, ultra) |
254 |
246 |
255 lemma hypnat_mult: |
247 lemma hypnat_mult: |
256 "Abs_hypnat(hypnatrel``{%n. X n}) * Abs_hypnat(hypnatrel``{%n. Y n}) = |
248 "Abs_hypnat(hypnatrel``{%n. X n}) * Abs_hypnat(hypnatrel``{%n. Y n}) = |
257 Abs_hypnat(hypnatrel``{%n. X n * Y n})" |
249 Abs_hypnat(hypnatrel``{%n. X n * Y n})" |
258 by (simp add: hypnat_mult_def UN_equiv_class2 [OF equiv_hypnatrel hypnat_mult_congruent2]) |
250 by (simp add: hypnat_mult_def UN_equiv_class2 [OF equiv_hypnatrel hypnat_mult_congruent2]) |
259 |
251 |
260 lemma hypnat_mult_commute: "(z::hypnat) * w = w * z" |
252 lemma hypnat_mult_commute: "(z::hypnat) * w = w * z" |
261 apply (rule eq_Abs_hypnat [of z]) |
253 apply (cases z, cases w) |
262 apply (rule eq_Abs_hypnat [of w]) |
|
263 apply (simp add: hypnat_mult mult_ac) |
254 apply (simp add: hypnat_mult mult_ac) |
264 done |
255 done |
265 |
256 |
266 lemma hypnat_mult_assoc: "((z1::hypnat) * z2) * z3 = z1 * (z2 * z3)" |
257 lemma hypnat_mult_assoc: "((z1::hypnat) * z2) * z3 = z1 * (z2 * z3)" |
267 apply (rule eq_Abs_hypnat [of z1]) |
258 apply (cases z1, cases z2, cases z3) |
268 apply (rule eq_Abs_hypnat [of z2]) |
|
269 apply (rule eq_Abs_hypnat [of z3]) |
|
270 apply (simp add: hypnat_mult mult_assoc) |
259 apply (simp add: hypnat_mult mult_assoc) |
271 done |
260 done |
272 |
261 |
273 lemma hypnat_mult_1: "(1::hypnat) * z = z" |
262 lemma hypnat_mult_1: "(1::hypnat) * z = z" |
274 apply (rule eq_Abs_hypnat [of z]) |
263 apply (cases z) |
275 apply (simp add: hypnat_mult hypnat_one_def) |
264 apply (simp add: hypnat_mult hypnat_one_def) |
276 done |
265 done |
277 |
266 |
278 lemma hypnat_diff_mult_distrib: "((m::hypnat) - n) * k = (m * k) - (n * k)" |
267 lemma hypnat_diff_mult_distrib: "((m::hypnat) - n) * k = (m * k) - (n * k)" |
279 apply (rule eq_Abs_hypnat [of k]) |
268 apply (cases k, cases m, cases n) |
280 apply (rule eq_Abs_hypnat [of m]) |
|
281 apply (rule eq_Abs_hypnat [of n]) |
|
282 apply (simp add: hypnat_mult hypnat_minus diff_mult_distrib) |
269 apply (simp add: hypnat_mult hypnat_minus diff_mult_distrib) |
283 done |
270 done |
284 |
271 |
285 lemma hypnat_diff_mult_distrib2: "(k::hypnat) * (m - n) = (k * m) - (k * n)" |
272 lemma hypnat_diff_mult_distrib2: "(k::hypnat) * (m - n) = (k * m) - (k * n)" |
286 by (simp add: hypnat_diff_mult_distrib hypnat_mult_commute [of k]) |
273 by (simp add: hypnat_diff_mult_distrib hypnat_mult_commute [of k]) |
287 |
274 |
288 lemma hypnat_add_mult_distrib: "((z1::hypnat) + z2) * w = (z1 * w) + (z2 * w)" |
275 lemma hypnat_add_mult_distrib: "((z1::hypnat) + z2) * w = (z1 * w) + (z2 * w)" |
289 apply (rule eq_Abs_hypnat [of z1]) |
276 apply (cases z1, cases z2, cases w) |
290 apply (rule eq_Abs_hypnat [of z2]) |
|
291 apply (rule eq_Abs_hypnat [of w]) |
|
292 apply (simp add: hypnat_mult hypnat_add add_mult_distrib) |
277 apply (simp add: hypnat_mult hypnat_add add_mult_distrib) |
293 done |
278 done |
294 |
279 |
295 lemma hypnat_add_mult_distrib2: "(w::hypnat) * (z1 + z2) = (w * z1) + (w * z2)" |
280 lemma hypnat_add_mult_distrib2: "(w::hypnat) * (z1 + z2) = (w * z1) + (w * z2)" |
296 by (simp add: hypnat_mult_commute [of w] hypnat_add_mult_distrib) |
281 by (simp add: hypnat_mult_commute [of w] hypnat_add_mult_distrib) |
322 subsection{*Properties of The @{text "\<le>"} Relation*} |
307 subsection{*Properties of The @{text "\<le>"} Relation*} |
323 |
308 |
324 lemma hypnat_le: |
309 lemma hypnat_le: |
325 "(Abs_hypnat(hypnatrel``{%n. X n}) \<le> Abs_hypnat(hypnatrel``{%n. Y n})) = |
310 "(Abs_hypnat(hypnatrel``{%n. X n}) \<le> Abs_hypnat(hypnatrel``{%n. Y n})) = |
326 ({n. X n \<le> Y n} \<in> FreeUltrafilterNat)" |
311 ({n. X n \<le> Y n} \<in> FreeUltrafilterNat)" |
327 apply (unfold hypnat_le_def) |
312 apply (simp add: hypnat_le_def) |
328 apply (auto intro!: lemma_hypnatrel_refl, ultra) |
313 apply (auto intro!: lemma_hypnatrel_refl, ultra) |
329 done |
314 done |
330 |
315 |
331 lemma hypnat_le_refl: "w \<le> (w::hypnat)" |
316 lemma hypnat_le_refl: "w \<le> (w::hypnat)" |
332 apply (rule eq_Abs_hypnat [of w]) |
317 apply (cases w) |
333 apply (simp add: hypnat_le) |
318 apply (simp add: hypnat_le) |
334 done |
319 done |
335 |
320 |
336 lemma hypnat_le_trans: "[| i \<le> j; j \<le> k |] ==> i \<le> (k::hypnat)" |
321 lemma hypnat_le_trans: "[| i \<le> j; j \<le> k |] ==> i \<le> (k::hypnat)" |
337 apply (rule eq_Abs_hypnat [of i]) |
322 apply (cases i, cases j, cases k) |
338 apply (rule eq_Abs_hypnat [of j]) |
|
339 apply (rule eq_Abs_hypnat [of k]) |
|
340 apply (simp add: hypnat_le, ultra) |
323 apply (simp add: hypnat_le, ultra) |
341 done |
324 done |
342 |
325 |
343 lemma hypnat_le_anti_sym: "[| z \<le> w; w \<le> z |] ==> z = (w::hypnat)" |
326 lemma hypnat_le_anti_sym: "[| z \<le> w; w \<le> z |] ==> z = (w::hypnat)" |
344 apply (rule eq_Abs_hypnat [of z]) |
327 apply (cases z, cases w) |
345 apply (rule eq_Abs_hypnat [of w]) |
|
346 apply (simp add: hypnat_le, ultra) |
328 apply (simp add: hypnat_le, ultra) |
347 done |
329 done |
348 |
330 |
349 (* Axiom 'order_less_le' of class 'order': *) |
331 (* Axiom 'order_less_le' of class 'order': *) |
350 lemma hypnat_less_le: "((w::hypnat) < z) = (w \<le> z & w \<noteq> z)" |
332 lemma hypnat_less_le: "((w::hypnat) < z) = (w \<le> z & w \<noteq> z)" |
355 (assumption | |
337 (assumption | |
356 rule hypnat_le_refl hypnat_le_trans hypnat_le_anti_sym hypnat_less_le)+ |
338 rule hypnat_le_refl hypnat_le_trans hypnat_le_anti_sym hypnat_less_le)+ |
357 |
339 |
358 (* Axiom 'linorder_linear' of class 'linorder': *) |
340 (* Axiom 'linorder_linear' of class 'linorder': *) |
359 lemma hypnat_le_linear: "(z::hypnat) \<le> w | w \<le> z" |
341 lemma hypnat_le_linear: "(z::hypnat) \<le> w | w \<le> z" |
360 apply (rule eq_Abs_hypnat [of z]) |
342 apply (cases z, cases w) |
361 apply (rule eq_Abs_hypnat [of w]) |
|
362 apply (auto simp add: hypnat_le, ultra) |
343 apply (auto simp add: hypnat_le, ultra) |
363 done |
344 done |
364 |
345 |
365 instance hypnat :: linorder |
346 instance hypnat :: linorder |
366 by (intro_classes, rule hypnat_le_linear) |
347 by (intro_classes, rule hypnat_le_linear) |
367 |
348 |
368 lemma hypnat_add_left_mono: "x \<le> y ==> z + x \<le> z + (y::hypnat)" |
349 lemma hypnat_add_left_mono: "x \<le> y ==> z + x \<le> z + (y::hypnat)" |
369 apply (rule eq_Abs_hypnat [of x]) |
350 apply (cases x, cases y, cases z) |
370 apply (rule eq_Abs_hypnat [of y]) |
|
371 apply (rule eq_Abs_hypnat [of z]) |
|
372 apply (auto simp add: hypnat_le hypnat_add) |
351 apply (auto simp add: hypnat_le hypnat_add) |
373 done |
352 done |
374 |
353 |
375 lemma hypnat_mult_less_mono2: "[| (0::hypnat)<z; x<y |] ==> z*x<z*y" |
354 lemma hypnat_mult_less_mono2: "[| (0::hypnat)<z; x<y |] ==> z*x<z*y" |
376 apply (rule eq_Abs_hypnat [of x]) |
355 apply (cases x, cases y, cases z) |
377 apply (rule eq_Abs_hypnat [of y]) |
|
378 apply (rule eq_Abs_hypnat [of z]) |
|
379 apply (simp add: hypnat_zero_def hypnat_mult linorder_not_le [symmetric]) |
356 apply (simp add: hypnat_zero_def hypnat_mult linorder_not_le [symmetric]) |
380 apply (auto simp add: hypnat_le, ultra) |
357 apply (auto simp add: hypnat_le, ultra) |
381 done |
358 done |
382 |
359 |
383 |
360 |
775 lemma hypreal_of_hypnat_one: "hypreal_of_hypnat (1::hypnat) = 1" |
744 lemma hypreal_of_hypnat_one: "hypreal_of_hypnat (1::hypnat) = 1" |
776 by (simp add: hypnat_one_def hypreal_one_def hypreal_of_hypnat) |
745 by (simp add: hypnat_one_def hypreal_one_def hypreal_of_hypnat) |
777 |
746 |
778 lemma hypreal_of_hypnat_add [simp]: |
747 lemma hypreal_of_hypnat_add [simp]: |
779 "hypreal_of_hypnat (m + n) = hypreal_of_hypnat m + hypreal_of_hypnat n" |
748 "hypreal_of_hypnat (m + n) = hypreal_of_hypnat m + hypreal_of_hypnat n" |
780 apply (rule eq_Abs_hypnat [of m]) |
749 apply (cases m, cases n) |
781 apply (rule eq_Abs_hypnat [of n]) |
|
782 apply (simp add: hypreal_of_hypnat hypreal_add hypnat_add real_of_nat_add) |
750 apply (simp add: hypreal_of_hypnat hypreal_add hypnat_add real_of_nat_add) |
783 done |
751 done |
784 |
752 |
785 lemma hypreal_of_hypnat_mult [simp]: |
753 lemma hypreal_of_hypnat_mult [simp]: |
786 "hypreal_of_hypnat (m * n) = hypreal_of_hypnat m * hypreal_of_hypnat n" |
754 "hypreal_of_hypnat (m * n) = hypreal_of_hypnat m * hypreal_of_hypnat n" |
787 apply (rule eq_Abs_hypnat [of m]) |
755 apply (cases m, cases n) |
788 apply (rule eq_Abs_hypnat [of n]) |
|
789 apply (simp add: hypreal_of_hypnat hypreal_mult hypnat_mult real_of_nat_mult) |
756 apply (simp add: hypreal_of_hypnat hypreal_mult hypnat_mult real_of_nat_mult) |
790 done |
757 done |
791 |
758 |
792 lemma hypreal_of_hypnat_less_iff [simp]: |
759 lemma hypreal_of_hypnat_less_iff [simp]: |
793 "(hypreal_of_hypnat n < hypreal_of_hypnat m) = (n < m)" |
760 "(hypreal_of_hypnat n < hypreal_of_hypnat m) = (n < m)" |
794 apply (rule eq_Abs_hypnat [of m]) |
761 apply (cases m, cases n) |
795 apply (rule eq_Abs_hypnat [of n]) |
|
796 apply (simp add: hypreal_of_hypnat hypreal_less hypnat_less) |
762 apply (simp add: hypreal_of_hypnat hypreal_less hypnat_less) |
797 done |
763 done |
798 |
764 |
799 lemma hypreal_of_hypnat_eq_zero_iff: "(hypreal_of_hypnat N = 0) = (N = 0)" |
765 lemma hypreal_of_hypnat_eq_zero_iff: "(hypreal_of_hypnat N = 0) = (N = 0)" |
800 by (simp add: hypreal_of_hypnat_zero [symmetric]) |
766 by (simp add: hypreal_of_hypnat_zero [symmetric]) |
801 declare hypreal_of_hypnat_eq_zero_iff [simp] |
767 declare hypreal_of_hypnat_eq_zero_iff [simp] |
802 |
768 |
803 lemma hypreal_of_hypnat_ge_zero [simp]: "0 \<le> hypreal_of_hypnat n" |
769 lemma hypreal_of_hypnat_ge_zero [simp]: "0 \<le> hypreal_of_hypnat n" |
804 apply (rule eq_Abs_hypnat [of n]) |
770 apply (cases n) |
805 apply (simp add: hypreal_of_hypnat hypreal_zero_num hypreal_le) |
771 apply (simp add: hypreal_of_hypnat hypreal_zero_num hypreal_le) |
806 done |
772 done |
807 |
773 |
808 lemma HNatInfinite_inverse_Infinitesimal [simp]: |
774 lemma HNatInfinite_inverse_Infinitesimal [simp]: |
809 "n \<in> HNatInfinite ==> inverse (hypreal_of_hypnat n) \<in> Infinitesimal" |
775 "n \<in> HNatInfinite ==> inverse (hypreal_of_hypnat n) \<in> Infinitesimal" |
810 apply (rule eq_Abs_hypnat [of n]) |
776 apply (cases n) |
811 apply (auto simp add: hypreal_of_hypnat hypreal_inverse |
777 apply (auto simp add: hypreal_of_hypnat hypreal_inverse |
812 HNatInfinite_FreeUltrafilterNat_iff Infinitesimal_FreeUltrafilterNat_iff2) |
778 HNatInfinite_FreeUltrafilterNat_iff Infinitesimal_FreeUltrafilterNat_iff2) |
813 apply (rule bexI, rule_tac [2] lemma_hyprel_refl, auto) |
779 apply (rule bexI, rule_tac [2] lemma_hyprel_refl, auto) |
814 apply (drule_tac x = "m + 1" in spec, ultra) |
780 apply (drule_tac x = "m + 1" in spec, ultra) |
815 done |
781 done |