src/HOL/Hyperreal/HyperOrd.thy
changeset 14303 995212a00a50
parent 14299 0b5c0b0a3eba
child 14305 f17ca9f6dc8c
equal deleted inserted replaced
14302:6c24235e8d5d 14303:995212a00a50
   132 apply (rule_tac z = y in eq_Abs_hypreal)
   132 apply (rule_tac z = y in eq_Abs_hypreal)
   133 apply (auto simp add: hypreal_less_def hypreal_add)
   133 apply (auto simp add: hypreal_less_def hypreal_add)
   134 apply (auto intro!: exI simp add: hypreal_less_def hypreal_add, ultra)
   134 apply (auto intro!: exI simp add: hypreal_less_def hypreal_add, ultra)
   135 done
   135 done
   136 
   136 
   137 lemma hypreal_add_order_le: "[| 0 < x; 0 <= y |] ==> (0::hypreal) < x + y"
   137 lemma hypreal_add_order_le: "[| 0 < x; 0 \<le> y |] ==> (0::hypreal) < x + y"
   138 by (auto dest: sym order_le_imp_less_or_eq intro: hypreal_add_order)
   138 by (auto dest: sym order_le_imp_less_or_eq intro: hypreal_add_order)
   139 
   139 
   140 lemma hypreal_mult_order: "[| 0 < x; 0 < y |] ==> (0::hypreal) < x * y"
   140 lemma hypreal_mult_order: "[| 0 < x; 0 < y |] ==> (0::hypreal) < x * y"
   141 apply (unfold hypreal_zero_def)
   141 apply (unfold hypreal_zero_def)
   142 apply (rule_tac z = x in eq_Abs_hypreal)
   142 apply (rule_tac z = x in eq_Abs_hypreal)
   161 apply (rule_tac x = "%n. 0" in exI)
   161 apply (rule_tac x = "%n. 0" in exI)
   162 apply (rule_tac x = "%n. 1" in exI)
   162 apply (rule_tac x = "%n. 1" in exI)
   163 apply (auto simp add: real_zero_less_one FreeUltrafilterNat_Nat_set)
   163 apply (auto simp add: real_zero_less_one FreeUltrafilterNat_Nat_set)
   164 done
   164 done
   165 
   165 
   166 lemma hypreal_le_add_order: "[| 0 <= x; 0 <= y |] ==> (0::hypreal) <= x + y"
   166 lemma hypreal_le_add_order: "[| 0 \<le> x; 0 \<le> y |] ==> (0::hypreal) \<le> x + y"
   167 apply (drule order_le_imp_less_or_eq)+
   167 apply (drule order_le_imp_less_or_eq)+
   168 apply (auto intro: hypreal_add_order order_less_imp_le)
   168 apply (auto intro: hypreal_add_order order_less_imp_le)
   169 done
   169 done
   170 
   170 
   171 (*** Monotonicity results ***)
   171 (*** Monotonicity results ***)
   179 done
   179 done
   180 
   180 
   181 declare hypreal_add_right_cancel_less [simp] 
   181 declare hypreal_add_right_cancel_less [simp] 
   182         hypreal_add_left_cancel_less [simp]
   182         hypreal_add_left_cancel_less [simp]
   183 
   183 
   184 lemma hypreal_add_right_cancel_le: "(v+z <= w+z) = (v <= (w::hypreal))"
   184 lemma hypreal_add_right_cancel_le: "(v+z \<le> w+z) = (v \<le> (w::hypreal))"
   185 apply (simp (no_asm))
   185 apply (simp (no_asm))
   186 done
   186 done
   187 
   187 
   188 lemma hypreal_add_left_cancel_le: "(z+v <= z+w) = (v <= (w::hypreal))"
   188 lemma hypreal_add_left_cancel_le: "(z+v \<le> z+w) = (v \<le> (w::hypreal))"
   189 apply (simp (no_asm))
   189 apply (simp (no_asm))
   190 done
   190 done
   191 
   191 
   192 declare hypreal_add_right_cancel_le [simp] hypreal_add_left_cancel_le [simp]
   192 declare hypreal_add_right_cancel_le [simp] hypreal_add_left_cancel_le [simp]
   193 
   193 
   199 apply (drule_tac C = "z1 + z2" in hypreal_add_less_mono1)
   199 apply (drule_tac C = "z1 + z2" in hypreal_add_less_mono1)
   200 apply (auto simp add: hypreal_minus_add_distrib [symmetric]
   200 apply (auto simp add: hypreal_minus_add_distrib [symmetric]
   201               hypreal_add_ac simp del: hypreal_minus_add_distrib)
   201               hypreal_add_ac simp del: hypreal_minus_add_distrib)
   202 done
   202 done
   203 
   203 
   204 lemma hypreal_add_left_le_mono1: "(q1::hypreal) <= q2  ==> x + q1 <= x + q2"
   204 lemma hypreal_add_left_le_mono1: "(q1::hypreal) \<le> q2  ==> x + q1 \<le> x + q2"
   205 apply (drule order_le_imp_less_or_eq)
   205 apply (drule order_le_imp_less_or_eq)
   206 apply (auto intro: order_less_imp_le hypreal_add_less_mono1 simp add: hypreal_add_commute)
   206 apply (auto intro: order_less_imp_le hypreal_add_less_mono1 simp add: hypreal_add_commute)
   207 done
   207 done
   208 
   208 
   209 lemma hypreal_add_le_mono1: "(q1::hypreal) <= q2  ==> q1 + x <= q2 + x"
   209 lemma hypreal_add_le_mono1: "(q1::hypreal) \<le> q2  ==> q1 + x \<le> q2 + x"
   210 by (auto dest: hypreal_add_left_le_mono1 simp add: hypreal_add_commute)
   210 by (auto dest: hypreal_add_left_le_mono1 simp add: hypreal_add_commute)
   211 
   211 
   212 lemma hypreal_add_le_mono: "[|(i::hypreal)<=j;  k<=l |] ==> i + k <= j + l"
   212 lemma hypreal_add_le_mono: "[|(i::hypreal)\<le>j;  k\<le>l |] ==> i + k \<le> j + l"
   213 apply (erule hypreal_add_le_mono1 [THEN order_trans])
   213 apply (erule hypreal_add_le_mono1 [THEN order_trans])
   214 apply (simp (no_asm))
   214 apply (simp (no_asm))
   215 done
   215 done
   216 
   216 
   217 lemma hypreal_add_less_le_mono: "[|(i::hypreal)<j;  k<=l |] ==> i + k < j + l"
   217 lemma hypreal_add_less_le_mono: "[|(i::hypreal)<j;  k\<le>l |] ==> i + k < j + l"
   218 by (auto dest!: order_le_imp_less_or_eq intro: hypreal_add_less_mono1 hypreal_add_less_mono)
   218 by (auto dest!: order_le_imp_less_or_eq intro: hypreal_add_less_mono1 hypreal_add_less_mono)
   219 
   219 
   220 lemma hypreal_add_le_less_mono: "[|(i::hypreal)<=j;  k<l |] ==> i + k < j + l"
   220 lemma hypreal_add_le_less_mono: "[|(i::hypreal)\<le>j;  k<l |] ==> i + k < j + l"
   221 by (auto dest!: order_le_imp_less_or_eq intro: hypreal_add_less_mono2 hypreal_add_less_mono)
   221 by (auto dest!: order_le_imp_less_or_eq intro: hypreal_add_less_mono2 hypreal_add_less_mono)
   222 
   222 
   223 lemma hypreal_less_add_right_cancel: "(A::hypreal) + C < B + C ==> A < B"
   223 lemma hypreal_less_add_right_cancel: "(A::hypreal) + C < B + C ==> A < B"
   224 apply (simp (no_asm_use))
   224 apply (simp (no_asm_use))
   225 done
   225 done
   226 
   226 
   227 lemma hypreal_less_add_left_cancel: "(C::hypreal) + A < C + B ==> A < B"
   227 lemma hypreal_less_add_left_cancel: "(C::hypreal) + A < C + B ==> A < B"
   228 apply (simp (no_asm_use))
   228 apply (simp (no_asm_use))
   229 done
   229 done
   230 
   230 
   231 lemma hypreal_add_zero_less_le_mono: "[|r < x; (0::hypreal) <= y|] ==> r < x + y"
   231 lemma hypreal_add_zero_less_le_mono: "[|r < x; (0::hypreal) \<le> y|] ==> r < x + y"
   232 by (auto dest: hypreal_add_less_le_mono)
   232 by (auto dest: hypreal_add_less_le_mono)
   233 
   233 
   234 lemma hypreal_le_add_right_cancel: "!!(A::hypreal). A + C <= B + C ==> A <= B"
   234 lemma hypreal_le_add_right_cancel: "!!(A::hypreal). A + C \<le> B + C ==> A \<le> B"
   235 apply (drule_tac x = "-C" in hypreal_add_le_mono1)
   235 apply (drule_tac x = "-C" in hypreal_add_le_mono1)
   236 apply (simp add: hypreal_add_assoc)
   236 apply (simp add: hypreal_add_assoc)
   237 done
   237 done
   238 
   238 
   239 lemma hypreal_le_add_left_cancel: "!!(A::hypreal). C + A <= C + B ==> A <= B"
   239 lemma hypreal_le_add_left_cancel: "!!(A::hypreal). C + A \<le> C + B ==> A \<le> B"
   240 apply (drule_tac x = "-C" in hypreal_add_left_le_mono1)
   240 apply (drule_tac x = "-C" in hypreal_add_left_le_mono1)
   241 apply (simp add: hypreal_add_assoc [symmetric])
   241 apply (simp add: hypreal_add_assoc [symmetric])
   242 done
   242 done
   243 
   243 
   244 lemma hypreal_le_square: "(0::hypreal) <= x*x"
   244 lemma hypreal_le_square: "(0::hypreal) \<le> x*x"
   245 apply (rule_tac x = 0 and y = x in hypreal_linear_less2)
   245 apply (rule_tac x = 0 and y = x in hypreal_linear_less2)
   246 apply (auto intro: hypreal_mult_order hypreal_mult_less_zero1 order_less_imp_le)
   246 apply (auto intro: hypreal_mult_order hypreal_mult_less_zero1 order_less_imp_le)
   247 done
   247 done
   248 declare hypreal_le_square [simp]
   248 declare hypreal_le_square [simp]
   249 
   249 
   250 lemma hypreal_less_minus_square: "- (x*x) <= (0::hypreal)"
   250 lemma hypreal_less_minus_square: "- (x*x) \<le> (0::hypreal)"
   251 apply (unfold hypreal_le_def)
   251 apply (unfold hypreal_le_def)
   252 apply (auto dest!: hypreal_le_square [THEN order_le_less_trans] 
   252 apply (auto dest!: hypreal_le_square [THEN order_le_less_trans] 
   253             simp add: hypreal_minus_zero_less_iff)
   253             simp add: hypreal_minus_zero_less_iff)
   254 done
   254 done
   255 declare hypreal_less_minus_square [simp]
   255 declare hypreal_less_minus_square [simp]
   268 
   268 
   269 lemma hypreal_mult_less_mono2: "[| (0::hypreal)<z; x<y |] ==> z*x<z*y"
   269 lemma hypreal_mult_less_mono2: "[| (0::hypreal)<z; x<y |] ==> z*x<z*y"
   270 apply (simp (no_asm_simp) add: hypreal_mult_commute hypreal_mult_less_mono1)
   270 apply (simp (no_asm_simp) add: hypreal_mult_commute hypreal_mult_less_mono1)
   271 done
   271 done
   272 
   272 
   273 lemma hypreal_mult_le_less_mono1: "[| (0::hypreal)<=z; x<y |] ==> x*z<=y*z"
   273 subsection{*The Hyperreals Form an Ordered Field*}
   274 apply (rule hypreal_less_or_eq_imp_le)
   274 
   275 apply (drule order_le_imp_less_or_eq)
   275 instance hypreal :: inverse ..
   276 apply (auto intro: hypreal_mult_less_mono1)
   276 
   277 done
   277 instance hypreal :: ordered_field
   278 
   278 proof
   279 lemma hypreal_mult_le_less_mono2: "[| (0::hypreal)<=z; x<y |] ==> z*x<=z*y"
   279   fix x y z :: hypreal
   280 apply (simp (no_asm_simp) add: hypreal_mult_commute hypreal_mult_le_less_mono1)
   280   show "(x + y) + z = x + (y + z)" by (rule hypreal_add_assoc)
   281 done
   281   show "x + y = y + x" by (rule hypreal_add_commute)
   282 
   282   show "0 + x = x" by simp
   283 lemma hypreal_mult_less_mono: "[| u<v;  x<y;  (0::hypreal) < v;  0 < x |] ==> u*x < v* y"
   283   show "- x + x = 0" by simp
   284 apply (erule hypreal_mult_less_mono1 [THEN order_less_trans], assumption)
   284   show "x - y = x + (-y)" by (simp add: hypreal_diff_def)
   285 apply (erule hypreal_mult_less_mono2, assumption)
   285   show "(x * y) * z = x * (y * z)" by (rule hypreal_mult_assoc)
   286 done
   286   show "x * y = y * x" by (rule hypreal_mult_commute)
   287 
   287   show "1 * x = x" by simp
   288 (*UNUSED at present but possibly more useful than hypreal_mult_less_mono*)
   288   show "(x + y) * z = x * z + y * z" by (simp add: hypreal_add_mult_distrib)
   289 lemma hypreal_mult_less_mono': "[| x < y;  r1 < r2;  (0::hypreal) <= r1;  0 <= x|] ==> r1 * x < r2 * y"
   289   show "0 \<noteq> (1::hypreal)" by (rule hypreal_zero_not_eq_one)
   290 apply (subgoal_tac "0<r2")
   290   show "x \<le> y ==> z + x \<le> z + y" by (rule hypreal_add_left_le_mono1)
   291 prefer 2 apply (blast intro: order_le_less_trans)
   291   show "x < y ==> 0 < z ==> z * x < z * y" by (simp add: hypreal_mult_less_mono2)
   292 apply (case_tac "x=0")
   292   show "\<bar>x\<bar> = (if x < 0 then -x else x)"
   293 apply (auto dest!: order_le_imp_less_or_eq intro: hypreal_mult_less_mono hypreal_mult_order)
   293     by (auto dest: order_le_less_trans simp add: hrabs_def linorder_not_le)
   294 done
   294   show "x \<noteq> 0 ==> inverse x * x = 1" by simp
       
   295   show "y \<noteq> 0 ==> x / y = x * inverse y" by (simp add: hypreal_divide_def)
       
   296 qed
       
   297 
       
   298 text{*The precondition could be weakened to @{term "0\<le>x"}*}
       
   299 lemma hypreal_mult_less_mono:
       
   300      "[| u<v;  x<y;  (0::hypreal) < v;  0 < x |] ==> u*x < v* y"
       
   301  by (simp add: Ring_and_Field.mult_strict_mono order_less_imp_le)
   295 
   302 
   296 lemma hypreal_inverse_gt_0: "0 < x ==> 0 < inverse (x::hypreal)"
   303 lemma hypreal_inverse_gt_0: "0 < x ==> 0 < inverse (x::hypreal)"
   297 apply (rule ccontr) 
   304   by (rule Ring_and_Field.positive_imp_inverse_positive)
   298 apply (drule hypreal_leI) 
       
   299 apply (frule hypreal_minus_zero_less_iff2 [THEN iffD2])
       
   300 apply (frule hypreal_not_refl2 [THEN not_sym])
       
   301 apply (drule hypreal_not_refl2 [THEN not_sym, THEN hypreal_inverse_not_zero])
       
   302 apply (drule order_le_imp_less_or_eq, safe) 
       
   303 apply (drule hypreal_mult_less_zero1, assumption)
       
   304 apply (auto intro: hypreal_zero_less_one [THEN hypreal_less_asym]
       
   305             simp add: hypreal_minus_zero_less_iff)
       
   306 done
       
   307 
   305 
   308 lemma hypreal_inverse_less_0: "x < 0 ==> inverse (x::hypreal) < 0"
   306 lemma hypreal_inverse_less_0: "x < 0 ==> inverse (x::hypreal) < 0"
   309 apply (frule hypreal_not_refl2)
   307   by (rule Ring_and_Field.negative_imp_inverse_negative)
   310 apply (drule hypreal_minus_zero_less_iff [THEN iffD2])
       
   311 apply (rule hypreal_minus_zero_less_iff [THEN iffD1])
       
   312 apply (subst hypreal_minus_inverse [symmetric])
       
   313 apply (auto intro: hypreal_inverse_gt_0)
       
   314 done
       
   315 
       
   316 lemma hypreal_self_le_add_pos: "(x::hypreal)*x <= x*x + y*y"
       
   317 apply (rule_tac z = x in eq_Abs_hypreal)
       
   318 apply (rule_tac z = y in eq_Abs_hypreal)
       
   319 apply (auto simp add: hypreal_mult hypreal_add hypreal_le)
       
   320 done
       
   321 declare hypreal_self_le_add_pos [simp]
       
   322 
       
   323 (*lcp: new lemma unfortunately needed...*)
       
   324 lemma minus_square_le_square: "-(x*x) <= (y*y::real)"
       
   325 apply (rule order_trans)
       
   326 apply (rule_tac [2] real_le_square, auto)
       
   327 done
       
   328 
       
   329 lemma hypreal_self_le_add_pos2: "(x::hypreal)*x <= x*x + y*y + z*z"
       
   330 apply (rule_tac z = x in eq_Abs_hypreal)
       
   331 apply (rule_tac z = y in eq_Abs_hypreal)
       
   332 apply (rule_tac z = z in eq_Abs_hypreal)
       
   333 apply (auto simp add: hypreal_mult hypreal_add hypreal_le minus_square_le_square)
       
   334 done
       
   335 declare hypreal_self_le_add_pos2 [simp]
       
   336 
   308 
   337 
   309 
   338 (*----------------------------------------------------------------------------
   310 (*----------------------------------------------------------------------------
   339                Existence of infinite hyperreal number
   311                Existence of infinite hyperreal number
   340  ----------------------------------------------------------------------------*)
   312  ----------------------------------------------------------------------------*)
   392 
   364 
   393 lemma hypreal_epsilon_inverse_omega: "epsilon = inverse(omega)"
   365 lemma hypreal_epsilon_inverse_omega: "epsilon = inverse(omega)"
   394 by (simp add: hypreal_inverse omega_def epsilon_def)
   366 by (simp add: hypreal_inverse omega_def epsilon_def)
   395 
   367 
   396 
   368 
       
   369 subsection{*Routine Properties*}
       
   370 
   397 (* this proof is so much simpler than one for reals!! *)
   371 (* this proof is so much simpler than one for reals!! *)
   398 lemma hypreal_inverse_less_swap: "[| 0 < r; r < x |] ==> inverse x < inverse (r::hypreal)"
   372 lemma hypreal_inverse_less_swap:
   399 apply (rule_tac z = x in eq_Abs_hypreal)
   373      "[| 0 < r; r < x |] ==> inverse x < inverse (r::hypreal)"
   400 apply (rule_tac z = r in eq_Abs_hypreal)
   374   by (rule Ring_and_Field.less_imp_inverse_less)
   401 apply (auto simp add: hypreal_inverse hypreal_less hypreal_zero_def, ultra)
   375 
   402 done
   376 lemma hypreal_inverse_less_iff:
   403 
   377      "[| 0 < r; 0 < x|] ==> (inverse x < inverse (r::hypreal)) = (r < x)"
   404 lemma hypreal_inverse_less_iff: "[| 0 < r; 0 < x|] ==> (r < x) = (inverse x < inverse (r::hypreal))"
   378 by (rule Ring_and_Field.inverse_less_iff_less)
   405 apply (auto intro: hypreal_inverse_less_swap)
   379 
   406 apply (rule_tac t = r in hypreal_inverse_inverse [THEN subst])
   380 lemma hypreal_inverse_le_iff:
   407 apply (rule_tac t = x in hypreal_inverse_inverse [THEN subst])
   381      "[| 0 < r; 0 < x|] ==> (inverse x \<le> inverse r) = (r \<le> (x::hypreal))"
   408 apply (rule hypreal_inverse_less_swap)
   382 by (rule Ring_and_Field.inverse_le_iff_le)
   409 apply (auto simp add: hypreal_inverse_gt_0)
   383 
   410 done
   384 
   411 
   385 subsection{*Convenient Biconditionals for Products of Signs*}
   412 lemma hypreal_mult_inverse_less_mono1: "[| 0 < z; x < y |] ==> x * inverse z < y * inverse (z::hypreal)"
   386 
   413 by (blast intro!: hypreal_mult_less_mono1 hypreal_inverse_gt_0)
   387 lemma hypreal_0_less_mult_iff:
   414 
   388      "((0::hypreal) < x*y) = (0 < x & 0 < y | x < 0 & y < 0)"
   415 lemma hypreal_mult_inverse_less_mono2: "[| 0 < z; x < y |] ==> inverse z * x < inverse (z::hypreal) * y"
   389   by (rule Ring_and_Field.zero_less_mult_iff) 
   416 by (blast intro!: hypreal_mult_less_mono2 hypreal_inverse_gt_0)
   390 
   417 
   391 lemma hypreal_0_le_mult_iff: "((0::hypreal) \<le> x*y) = (0 \<le> x & 0 \<le> y | x \<le> 0 & y \<le> 0)"
   418 lemma hypreal_less_mult_right_cancel: "[| (0::hypreal) < z; x*z < y*z |] ==> x < y"
   392   by (rule Ring_and_Field.zero_le_mult_iff) 
   419 apply (frule_tac x = "x*z" in hypreal_mult_inverse_less_mono1)
       
   420 apply (drule_tac [2] hypreal_not_refl2 [THEN not_sym])
       
   421 apply (auto dest!: hypreal_mult_inverse simp add: hypreal_mult_ac)
       
   422 done
       
   423 
       
   424 lemma hypreal_less_mult_left_cancel: "[| (0::hypreal) < z; z*x < z*y |] ==> x < y"
       
   425 by (auto intro: hypreal_less_mult_right_cancel simp add: hypreal_mult_commute)
       
   426 
       
   427 lemma hypreal_mult_less_gt_zero: "[| 0 < r; (0::hypreal) < ra; r < x; ra < y |] ==> r*ra < x*y"
       
   428 apply (frule_tac y = r in order_less_trans)
       
   429 apply (drule_tac [2] z = ra and x = r in hypreal_mult_less_mono1)
       
   430 apply (drule_tac [3] z = x and x = ra in hypreal_mult_less_mono2)
       
   431 apply (auto intro: order_less_trans)
       
   432 done
       
   433 
       
   434 lemma hypreal_mult_le_ge_zero: "[| 0 < r; (0::hypreal) < ra; r <= x; ra <= y |] ==> r*ra <= x*y"
       
   435 apply (drule order_le_imp_less_or_eq)+
       
   436 apply (rule hypreal_less_or_eq_imp_le)
       
   437 apply (auto intro: hypreal_mult_less_mono1 hypreal_mult_less_mono2 hypreal_mult_less_gt_zero)
       
   438 done
       
   439 
       
   440 (*----------------------------------------------------------------------------
       
   441      Some convenient biconditionals for products of signs 
       
   442  ----------------------------------------------------------------------------*)
       
   443 
       
   444 lemma hypreal_0_less_mult_iff: "((0::hypreal) < x*y) = (0 < x & 0 < y | x < 0 & y < 0)"
       
   445  apply (auto simp add: order_le_less linorder_not_less hypreal_mult_order hypreal_mult_less_zero1)
       
   446 apply (rule_tac [!] ccontr)
       
   447 apply (auto simp add: order_le_less linorder_not_less)
       
   448 apply (erule_tac [!] rev_mp)
       
   449 apply (drule_tac [!] hypreal_mult_less_zero) 
       
   450 apply (auto dest: order_less_not_sym simp add: hypreal_mult_commute)
       
   451 done
       
   452 
       
   453 lemma hypreal_0_le_mult_iff: "((0::hypreal) <= x*y) = (0 <= x & 0 <= y | x <= 0 & y <= 0)"
       
   454 by (auto dest: hypreal_mult_zero_disj simp add: order_le_less linorder_not_less hypreal_0_less_mult_iff)
       
   455 
   393 
   456 lemma hypreal_mult_less_0_iff: "(x*y < (0::hypreal)) = (0 < x & y < 0 | x < 0 & 0 < y)"
   394 lemma hypreal_mult_less_0_iff: "(x*y < (0::hypreal)) = (0 < x & y < 0 | x < 0 & 0 < y)"
   457 apply (auto simp add: hypreal_0_le_mult_iff linorder_not_le [symmetric])
   395   by (rule Ring_and_Field.mult_less_0_iff) 
   458 apply (auto dest: order_less_not_sym simp add: linorder_not_le)
   396 
   459 done
   397 lemma hypreal_mult_le_0_iff: "(x*y \<le> (0::hypreal)) = (0 \<le> x & y \<le> 0 | x \<le> 0 & 0 \<le> y)"
   460 
   398   by (rule Ring_and_Field.mult_le_0_iff) 
   461 lemma hypreal_mult_le_0_iff: "(x*y <= (0::hypreal)) = (0 <= x & y <= 0 | x <= 0 & 0 <= y)"
   399 
   462 by (auto dest: order_less_not_sym simp add: hypreal_0_less_mult_iff linorder_not_less [symmetric])
   400 
   463 
   401 lemma hypreal_mult_self_sum_ge_zero: "(0::hypreal) \<le> x*x + y*y"
   464 lemma hypreal_mult_less_zero2: "[| (0::hypreal) < x; y < 0 |] ==> y*x < 0"
   402 proof -
   465 by (auto simp add: hypreal_mult_commute hypreal_mult_less_zero)
   403   have "0 + 0 \<le> x*x + y*y" by (blast intro: add_mono zero_le_square)
       
   404   thus ?thesis by simp
       
   405 qed
   466 
   406 
   467 (*TO BE DELETED*)
   407 (*TO BE DELETED*)
   468 ML
   408 ML
   469 {*
   409 {*
   470 val hypreal_add_ac = thms"hypreal_add_ac";
   410 val hypreal_add_ac = thms"hypreal_add_ac";
   511 val hypreal_le_square = thm"hypreal_le_square";
   451 val hypreal_le_square = thm"hypreal_le_square";
   512 val hypreal_less_minus_square = thm"hypreal_less_minus_square";
   452 val hypreal_less_minus_square = thm"hypreal_less_minus_square";
   513 val hypreal_mult_0_less = thm"hypreal_mult_0_less";
   453 val hypreal_mult_0_less = thm"hypreal_mult_0_less";
   514 val hypreal_mult_less_mono1 = thm"hypreal_mult_less_mono1";
   454 val hypreal_mult_less_mono1 = thm"hypreal_mult_less_mono1";
   515 val hypreal_mult_less_mono2 = thm"hypreal_mult_less_mono2";
   455 val hypreal_mult_less_mono2 = thm"hypreal_mult_less_mono2";
   516 val hypreal_mult_le_less_mono1 = thm"hypreal_mult_le_less_mono1";
       
   517 val hypreal_mult_le_less_mono2 = thm"hypreal_mult_le_less_mono2";
       
   518 val hypreal_mult_less_mono = thm"hypreal_mult_less_mono";
   456 val hypreal_mult_less_mono = thm"hypreal_mult_less_mono";
   519 val hypreal_mult_less_mono' = thm"hypreal_mult_less_mono'";
       
   520 val hypreal_inverse_gt_0 = thm"hypreal_inverse_gt_0";
   457 val hypreal_inverse_gt_0 = thm"hypreal_inverse_gt_0";
   521 val hypreal_inverse_less_0 = thm"hypreal_inverse_less_0";
   458 val hypreal_inverse_less_0 = thm"hypreal_inverse_less_0";
   522 val hypreal_self_le_add_pos = thm"hypreal_self_le_add_pos";
       
   523 val minus_square_le_square = thm"minus_square_le_square";
       
   524 val hypreal_self_le_add_pos2 = thm"hypreal_self_le_add_pos2";
       
   525 val Rep_hypreal_omega = thm"Rep_hypreal_omega";
   459 val Rep_hypreal_omega = thm"Rep_hypreal_omega";
   526 val lemma_omega_empty_singleton_disj = thm"lemma_omega_empty_singleton_disj";
   460 val lemma_omega_empty_singleton_disj = thm"lemma_omega_empty_singleton_disj";
   527 val lemma_finite_omega_set = thm"lemma_finite_omega_set";
   461 val lemma_finite_omega_set = thm"lemma_finite_omega_set";
   528 val not_ex_hypreal_of_real_eq_omega = thm"not_ex_hypreal_of_real_eq_omega";
   462 val not_ex_hypreal_of_real_eq_omega = thm"not_ex_hypreal_of_real_eq_omega";
   529 val hypreal_of_real_not_eq_omega = thm"hypreal_of_real_not_eq_omega";
   463 val hypreal_of_real_not_eq_omega = thm"hypreal_of_real_not_eq_omega";
   534 val hypreal_of_real_not_eq_epsilon = thm"hypreal_of_real_not_eq_epsilon";
   468 val hypreal_of_real_not_eq_epsilon = thm"hypreal_of_real_not_eq_epsilon";
   535 val hypreal_epsilon_not_zero = thm"hypreal_epsilon_not_zero";
   469 val hypreal_epsilon_not_zero = thm"hypreal_epsilon_not_zero";
   536 val hypreal_epsilon_inverse_omega = thm"hypreal_epsilon_inverse_omega";
   470 val hypreal_epsilon_inverse_omega = thm"hypreal_epsilon_inverse_omega";
   537 val hypreal_inverse_less_swap = thm"hypreal_inverse_less_swap";
   471 val hypreal_inverse_less_swap = thm"hypreal_inverse_less_swap";
   538 val hypreal_inverse_less_iff = thm"hypreal_inverse_less_iff";
   472 val hypreal_inverse_less_iff = thm"hypreal_inverse_less_iff";
   539 val hypreal_mult_inverse_less_mono1 = thm"hypreal_mult_inverse_less_mono1";
   473 val hypreal_inverse_le_iff = thm"hypreal_inverse_le_iff";
   540 val hypreal_mult_inverse_less_mono2 = thm"hypreal_mult_inverse_less_mono2";
       
   541 val hypreal_less_mult_right_cancel = thm"hypreal_less_mult_right_cancel";
       
   542 val hypreal_less_mult_left_cancel = thm"hypreal_less_mult_left_cancel";
       
   543 val hypreal_mult_less_gt_zero = thm"hypreal_mult_less_gt_zero";
       
   544 val hypreal_mult_le_ge_zero = thm"hypreal_mult_le_ge_zero";
       
   545 val hypreal_0_less_mult_iff = thm"hypreal_0_less_mult_iff";
   474 val hypreal_0_less_mult_iff = thm"hypreal_0_less_mult_iff";
   546 val hypreal_0_le_mult_iff = thm"hypreal_0_le_mult_iff";
   475 val hypreal_0_le_mult_iff = thm"hypreal_0_le_mult_iff";
   547 val hypreal_mult_less_0_iff = thm"hypreal_mult_less_0_iff";
   476 val hypreal_mult_less_0_iff = thm"hypreal_mult_less_0_iff";
   548 val hypreal_mult_le_0_iff = thm"hypreal_mult_le_0_iff";
   477 val hypreal_mult_le_0_iff = thm"hypreal_mult_le_0_iff";
   549 val hypreal_mult_less_zero2 = thm"hypreal_mult_less_zero2";
   478 val hypreal_mult_self_sum_ge_zero = thm "hypreal_mult_self_sum_ge_zero";
   550 *}
   479 *}
   551 
   480 
   552 end
   481 end