src/HOL/Hyperreal/HyperNat.thy
changeset 14468 6be497cacab5
parent 14420 4e72cd222e0b
child 14658 b1293d0f8d5f
equal deleted inserted replaced
14467:bbfa6b01a55f 14468:6be497cacab5
    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)
    86 (* (hypnatrel `` {x} = hypnatrel `` {y}) = ((x,y) \<in> hypnatrel) *)
    85 (* (hypnatrel `` {x} = hypnatrel `` {y}) = ((x,y) \<in> hypnatrel) *)
    87 lemmas equiv_hypnatrel_iff =
    86 lemmas equiv_hypnatrel_iff =
    88     eq_equiv_class_iff [OF equiv_hypnatrel UNIV_I UNIV_I, simp]
    87     eq_equiv_class_iff [OF equiv_hypnatrel UNIV_I UNIV_I, simp]
    89 
    88 
    90 lemma hypnatrel_in_hypnat [simp]: "hypnatrel``{x}:hypnat"
    89 lemma hypnatrel_in_hypnat [simp]: "hypnatrel``{x}:hypnat"
    91 by (unfold hypnat_def hypnatrel_def quotient_def, blast)
    90 by (simp add: hypnat_def hypnatrel_def quotient_def, blast)
    92 
    91 
    93 lemma inj_on_Abs_hypnat: "inj_on Abs_hypnat hypnat"
    92 lemma inj_on_Abs_hypnat: "inj_on Abs_hypnat hypnat"
    94 apply (rule inj_on_inverseI)
    93 apply (rule inj_on_inverseI)
    95 apply (erule Abs_hypnat_inverse)
    94 apply (erule Abs_hypnat_inverse)
    96 done
    95 done
   112 by (simp add: hypnatrel_def)
   111 by (simp add: hypnatrel_def)
   113 
   112 
   114 declare lemma_hypnatrel_refl [simp]
   113 declare lemma_hypnatrel_refl [simp]
   115 
   114 
   116 lemma hypnat_empty_not_mem: "{} \<notin> hypnat"
   115 lemma hypnat_empty_not_mem: "{} \<notin> hypnat"
   117 apply (unfold hypnat_def)
   116 apply (simp add: hypnat_def)
   118 apply (auto elim!: quotientE equalityCE)
   117 apply (auto elim!: quotientE equalityCE)
   119 done
   118 done
   120 
   119 
   121 declare hypnat_empty_not_mem [simp]
   120 declare hypnat_empty_not_mem [simp]
   122 
   121 
   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 
   394   show "x < y ==> 0 < z ==> z * x < z * y"
   371   show "x < y ==> 0 < z ==> z * x < z * y"
   395     by (simp add: hypnat_mult_less_mono2)
   372     by (simp add: hypnat_mult_less_mono2)
   396 qed
   373 qed
   397 
   374 
   398 lemma hypnat_le_zero_cancel [iff]: "(n \<le> (0::hypnat)) = (n = 0)"
   375 lemma hypnat_le_zero_cancel [iff]: "(n \<le> (0::hypnat)) = (n = 0)"
   399 apply (rule eq_Abs_hypnat [of n])
   376 apply (cases n)
   400 apply (simp add: hypnat_zero_def hypnat_le)
   377 apply (simp add: hypnat_zero_def hypnat_le)
   401 done
   378 done
   402 
   379 
   403 lemma hypnat_mult_is_0 [simp]: "(m*n = (0::hypnat)) = (m=0 | n=0)"
   380 lemma hypnat_mult_is_0 [simp]: "(m*n = (0::hypnat)) = (m=0 | n=0)"
   404 apply (rule eq_Abs_hypnat [of m])
   381 apply (cases m, cases n)
   405 apply (rule eq_Abs_hypnat [of n])
       
   406 apply (auto simp add: hypnat_zero_def hypnat_mult, ultra+)
   382 apply (auto simp add: hypnat_zero_def hypnat_mult, ultra+)
   407 done
   383 done
   408 
   384 
   409 lemma hypnat_diff_is_0_eq [simp]: "((m::hypnat) - n = 0) = (m \<le> n)"
   385 lemma hypnat_diff_is_0_eq [simp]: "((m::hypnat) - n = 0) = (m \<le> n)"
   410 apply (rule eq_Abs_hypnat [of m])
   386 apply (cases m, cases n)
   411 apply (rule eq_Abs_hypnat [of n])
       
   412 apply (simp add: hypnat_le hypnat_minus hypnat_zero_def)
   387 apply (simp add: hypnat_le hypnat_minus hypnat_zero_def)
   413 done
   388 done
   414 
   389 
   415 
   390 
   416 
   391 
   422 apply (auto simp add: hypnat_le  linorder_not_le [symmetric])
   397 apply (auto simp add: hypnat_le  linorder_not_le [symmetric])
   423 apply (ultra+)
   398 apply (ultra+)
   424 done
   399 done
   425 
   400 
   426 lemma hypnat_not_less0 [iff]: "~ n < (0::hypnat)"
   401 lemma hypnat_not_less0 [iff]: "~ n < (0::hypnat)"
   427 apply (rule eq_Abs_hypnat [of n])
   402 apply (cases n)
   428 apply (auto simp add: hypnat_zero_def hypnat_less)
   403 apply (auto simp add: hypnat_zero_def hypnat_less)
   429 done
   404 done
   430 
   405 
   431 lemma hypnat_less_one [iff]:
   406 lemma hypnat_less_one [iff]:
   432       "(n < (1::hypnat)) = (n=0)"
   407       "(n < (1::hypnat)) = (n=0)"
   433 apply (rule eq_Abs_hypnat [of n])
   408 apply (cases n)
   434 apply (auto simp add: hypnat_zero_def hypnat_one_def hypnat_less)
   409 apply (auto simp add: hypnat_zero_def hypnat_one_def hypnat_less)
   435 done
   410 done
   436 
   411 
   437 lemma hypnat_add_diff_inverse: "~ m<n ==> n+(m-n) = (m::hypnat)"
   412 lemma hypnat_add_diff_inverse: "~ m<n ==> n+(m-n) = (m::hypnat)"
   438 apply (rule eq_Abs_hypnat [of m])
   413 apply (cases m, cases n)
   439 apply (rule eq_Abs_hypnat [of n])
       
   440 apply (simp add: hypnat_minus hypnat_add hypnat_less split: nat_diff_split, ultra)
   414 apply (simp add: hypnat_minus hypnat_add hypnat_less split: nat_diff_split, ultra)
   441 done
   415 done
   442 
   416 
   443 lemma hypnat_le_add_diff_inverse [simp]: "n \<le> m ==> n+(m-n) = (m::hypnat)"
   417 lemma hypnat_le_add_diff_inverse [simp]: "n \<le> m ==> n+(m-n) = (m::hypnat)"
   444 by (simp add: hypnat_add_diff_inverse linorder_not_less [symmetric])
   418 by (simp add: hypnat_add_diff_inverse linorder_not_less [symmetric])
   482       by (auto simp add: hypnat_add_self_not_less order_less_imp_le 
   456       by (auto simp add: hypnat_add_self_not_less order_less_imp_le 
   483                          hypnat_diff_is_0_eq [THEN iffD2])
   457                          hypnat_diff_is_0_eq [THEN iffD2])
   484 next
   458 next
   485   case False
   459   case False
   486     thus ?thesis
   460     thus ?thesis
   487       by (auto simp add: linorder_not_less dest: order_le_less_trans); 
   461       by (auto simp add: linorder_not_less dest: order_le_less_trans) 
   488 qed
   462 qed
   489 
   463 
   490 
   464 
   491 subsection{*The Embedding @{term hypnat_of_nat} Preserves Ring and 
   465 subsection{*The Embedding @{term hypnat_of_nat} Preserves Ring and 
   492       Order Properties*}
   466       Order Properties*}
   561 apply (case_tac x) 
   535 apply (case_tac x) 
   562 apply (auto simp add: add_commute [of 1]) 
   536 apply (auto simp add: add_commute [of 1]) 
   563 done
   537 done
   564 
   538 
   565 lemma Nats_diff [simp]: "[|a \<in> Nats; b \<in> Nats|] ==> (a-b :: hypnat) \<in> Nats"
   539 lemma Nats_diff [simp]: "[|a \<in> Nats; b \<in> Nats|] ==> (a-b :: hypnat) \<in> Nats"
   566 apply (auto simp add: of_nat_eq_add Nats_def split: hypnat_diff_split)
   540 by (auto simp add: of_nat_eq_add Nats_def split: hypnat_diff_split)
   567 done
       
   568 
   541 
   569 lemma lemma_unbounded_set [simp]: "{n::nat. m < n} \<in> FreeUltrafilterNat"
   542 lemma lemma_unbounded_set [simp]: "{n::nat. m < n} \<in> FreeUltrafilterNat"
   570 apply (insert finite_atMost [of m]) 
   543 apply (insert finite_atMost [of m]) 
   571 apply (simp add: atMost_def) 
   544 apply (simp add: atMost_def) 
   572 apply (drule FreeUltrafilterNat_finite) 
   545 apply (drule FreeUltrafilterNat_finite) 
   573 apply (drule FreeUltrafilterNat_Compl_mem) 
   546 apply (drule FreeUltrafilterNat_Compl_mem, ultra)
   574 apply ultra
       
   575 done
   547 done
   576 
   548 
   577 lemma Compl_Collect_le: "- {n::nat. N \<le> n} = {n. n < N}"
   549 lemma Compl_Collect_le: "- {n::nat. N \<le> n} = {n. n < N}"
   578 by (simp add: Collect_neg_eq [symmetric] linorder_not_le) 
   550 by (simp add: Collect_neg_eq [symmetric] linorder_not_le) 
   579 
   551 
   580 
   552 
   581 lemma hypnat_of_nat_eq:
   553 lemma hypnat_of_nat_eq:
   582      "hypnat_of_nat m  = Abs_hypnat(hypnatrel``{%n::nat. m})"
   554      "hypnat_of_nat m  = Abs_hypnat(hypnatrel``{%n::nat. m})"
   583 apply (induct m) 
   555 apply (induct m) 
   584 apply (simp_all add: hypnat_zero_def hypnat_one_def hypnat_add); 
   556 apply (simp_all add: hypnat_zero_def hypnat_one_def hypnat_add) 
   585 done
   557 done
   586 
   558 
   587 lemma SHNat_eq: "Nats = {n. \<exists>N. n = hypnat_of_nat N}"
   559 lemma SHNat_eq: "Nats = {n. \<exists>N. n = hypnat_of_nat N}"
   588 by (force simp add: hypnat_of_nat_def Nats_def) 
   560 by (force simp add: hypnat_of_nat_def Nats_def) 
   589 
   561 
   597 apply (simp add: Compl_Collect_le finite_nat_segment) 
   569 apply (simp add: Compl_Collect_le finite_nat_segment) 
   598 done
   570 done
   599 
   571 
   600 (* Infinite hypernatural not in embedded Nats *)
   572 (* Infinite hypernatural not in embedded Nats *)
   601 lemma SHNAT_omega_not_mem [simp]: "whn \<notin> Nats"
   573 lemma SHNAT_omega_not_mem [simp]: "whn \<notin> Nats"
   602 apply (blast dest: hypnat_omega_gt_SHNat) 
   574 by (blast dest: hypnat_omega_gt_SHNat)
   603 done
       
   604 
   575 
   605 lemma hypnat_of_nat_less_whn [simp]: "hypnat_of_nat n < whn"
   576 lemma hypnat_of_nat_less_whn [simp]: "hypnat_of_nat n < whn"
   606 apply (insert hypnat_omega_gt_SHNat [of "hypnat_of_nat n"])
   577 apply (insert hypnat_omega_gt_SHNat [of "hypnat_of_nat n"])
   607 apply (simp add: hypnat_of_nat_def) 
   578 apply (simp add: hypnat_of_nat_def) 
   608 done
   579 done
   655 Free Ultrafilter*}
   626 Free Ultrafilter*}
   656 
   627 
   657 lemma HNatInfinite_FreeUltrafilterNat:
   628 lemma HNatInfinite_FreeUltrafilterNat:
   658      "x \<in> HNatInfinite 
   629      "x \<in> HNatInfinite 
   659       ==> \<exists>X \<in> Rep_hypnat x. \<forall>u. {n. u < X n}:  FreeUltrafilterNat"
   630       ==> \<exists>X \<in> Rep_hypnat x. \<forall>u. {n. u < X n}:  FreeUltrafilterNat"
   660 apply (rule eq_Abs_hypnat [of x])
   631 apply (cases x)
   661 apply (auto simp add: HNatInfinite_iff SHNat_eq hypnat_of_nat_eq)
   632 apply (auto simp add: HNatInfinite_iff SHNat_eq hypnat_of_nat_eq)
   662 apply (rule bexI [OF _ lemma_hypnatrel_refl], clarify) 
   633 apply (rule bexI [OF _ lemma_hypnatrel_refl], clarify) 
   663 apply (auto simp add: hypnat_of_nat_def hypnat_less)
   634 apply (auto simp add: hypnat_of_nat_def hypnat_less)
   664 done
   635 done
   665 
   636 
   666 lemma FreeUltrafilterNat_HNatInfinite:
   637 lemma FreeUltrafilterNat_HNatInfinite:
   667      "\<exists>X \<in> Rep_hypnat x. \<forall>u. {n. u < X n}:  FreeUltrafilterNat
   638      "\<exists>X \<in> Rep_hypnat x. \<forall>u. {n. u < X n}:  FreeUltrafilterNat
   668       ==> x \<in> HNatInfinite"
   639       ==> x \<in> HNatInfinite"
   669 apply (rule eq_Abs_hypnat [of x])
   640 apply (cases x)
   670 apply (auto simp add: hypnat_less HNatInfinite_iff SHNat_eq hypnat_of_nat_eq)
   641 apply (auto simp add: hypnat_less HNatInfinite_iff SHNat_eq hypnat_of_nat_eq)
   671 apply (drule spec, ultra, auto) 
   642 apply (drule spec, ultra, auto) 
   672 done
   643 done
   673 
   644 
   674 lemma HNatInfinite_FreeUltrafilterNat_iff:
   645 lemma HNatInfinite_FreeUltrafilterNat_iff:
   706 done
   677 done
   707 
   678 
   708 lemma HNatInfinite_SHNat_add:
   679 lemma HNatInfinite_SHNat_add:
   709      "[| x \<in> HNatInfinite; y \<in> Nats |] ==> x + y \<in> HNatInfinite"
   680      "[| x \<in> HNatInfinite; y \<in> Nats |] ==> x + y \<in> HNatInfinite"
   710 apply (auto simp add: HNatInfinite_not_Nats_iff) 
   681 apply (auto simp add: HNatInfinite_not_Nats_iff) 
   711 apply (drule_tac a = "x + y" in Nats_diff)
   682 apply (drule_tac a = "x + y" in Nats_diff, auto) 
   712 apply (auto ); 
       
   713 done
   683 done
   714 
   684 
   715 lemma HNatInfinite_Nats_imp_less: "[| x \<in> HNatInfinite; y \<in> Nats |] ==> y < x"
   685 lemma HNatInfinite_Nats_imp_less: "[| x \<in> HNatInfinite; y \<in> Nats |] ==> y < x"
   716 by (simp add: HNatInfinite_iff) 
   686 by (simp add: HNatInfinite_iff) 
   717 
   687 
   762        simp add: lemma_hyprel_FUFN)
   732        simp add: lemma_hyprel_FUFN)
   763 done
   733 done
   764 
   734 
   765 lemma hypreal_of_hypnat_inject [simp]:
   735 lemma hypreal_of_hypnat_inject [simp]:
   766      "(hypreal_of_hypnat m = hypreal_of_hypnat n) = (m=n)"
   736      "(hypreal_of_hypnat m = hypreal_of_hypnat n) = (m=n)"
   767 apply (rule eq_Abs_hypnat [of m])
   737 apply (cases m, cases n)
   768 apply (rule eq_Abs_hypnat [of n])
       
   769 apply (auto simp add: hypreal_of_hypnat)
   738 apply (auto simp add: hypreal_of_hypnat)
   770 done
   739 done
   771 
   740 
   772 lemma hypreal_of_hypnat_zero: "hypreal_of_hypnat 0 = 0"
   741 lemma hypreal_of_hypnat_zero: "hypreal_of_hypnat 0 = 0"
   773 by (simp add: hypnat_zero_def hypreal_zero_def hypreal_of_hypnat)
   742 by (simp add: hypnat_zero_def hypreal_zero_def hypreal_of_hypnat)
   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