src/HOL/Hyperreal/HyperOrd.thy
author paulson
Mon, 22 Dec 2003 14:12:54 +0100
changeset 14310 1dd7439477dd
parent 14309 f508492af9b4
child 14312 2f048db93d08
permissions -rw-r--r--
simplifying
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     1
(*  Title:	 Real/Hyperreal/HyperOrd.thy
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     2
    Author:      Jacques D. Fleuriot
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     3
    Copyright:   2000 University of Edinburgh
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     4
    Description: Type "hypreal" is a linear order and also 
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     5
                 satisfies plus_ac0: + is an AC-operator with zero
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     6
*)
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     7
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
     8
theory HyperOrd = HyperDef:
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
     9
14305
f17ca9f6dc8c tidying first part of HyperArith0.ML, using generic lemmas
paulson
parents: 14303
diff changeset
    10
instance hypreal :: division_by_zero
f17ca9f6dc8c tidying first part of HyperArith0.ML, using generic lemmas
paulson
parents: 14303
diff changeset
    11
proof
f17ca9f6dc8c tidying first part of HyperArith0.ML, using generic lemmas
paulson
parents: 14303
diff changeset
    12
  fix x :: hypreal
f17ca9f6dc8c tidying first part of HyperArith0.ML, using generic lemmas
paulson
parents: 14303
diff changeset
    13
  show "inverse 0 = (0::hypreal)" by (rule HYPREAL_INVERSE_ZERO)
f17ca9f6dc8c tidying first part of HyperArith0.ML, using generic lemmas
paulson
parents: 14303
diff changeset
    14
  show "x/0 = 0" by (rule HYPREAL_DIVISION_BY_ZERO) 
f17ca9f6dc8c tidying first part of HyperArith0.ML, using generic lemmas
paulson
parents: 14303
diff changeset
    15
qed
f17ca9f6dc8c tidying first part of HyperArith0.ML, using generic lemmas
paulson
parents: 14303
diff changeset
    16
f17ca9f6dc8c tidying first part of HyperArith0.ML, using generic lemmas
paulson
parents: 14303
diff changeset
    17
14299
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
    18
defs (overloaded)
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
    19
  hrabs_def:  "abs (r::hypreal) == (if 0 \<le> r then r else -r)"
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    20
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    21
14299
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
    22
lemma hypreal_hrabs:
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
    23
     "abs (Abs_hypreal (hyprel `` {X})) = 
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
    24
      Abs_hypreal(hyprel `` {%n. abs (X n)})"
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
    25
apply (auto simp add: hrabs_def hypreal_zero_def hypreal_le hypreal_minus)
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
    26
apply (ultra, arith)+
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
    27
done
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    28
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    29
instance hypreal :: order
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    30
  by (intro_classes,
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    31
      (assumption | 
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    32
       rule hypreal_le_refl hypreal_le_trans hypreal_le_anti_sym
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    33
            hypreal_less_le)+)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    34
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    35
instance hypreal :: linorder 
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    36
  by (intro_classes, rule hypreal_le_linear)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    37
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    38
instance hypreal :: plus_ac0
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    39
  by (intro_classes,
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    40
      (assumption | 
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    41
       rule hypreal_add_commute hypreal_add_assoc hypreal_add_zero_left)+)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
    42
14310
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    43
lemma hypreal_add_less_mono1: "(A::hypreal) < B ==> A + C < B + C"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    44
apply (rule_tac z = A in eq_Abs_hypreal)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    45
apply (rule_tac z = B in eq_Abs_hypreal)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    46
apply (rule_tac z = C in eq_Abs_hypreal)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    47
apply (auto intro!: exI simp add: hypreal_less_def hypreal_add, ultra)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    48
done
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    49
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    50
lemma hypreal_mult_order: "[| 0 < x; 0 < y |] ==> (0::hypreal) < x * y"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    51
apply (unfold hypreal_zero_def)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    52
apply (rule_tac z = x in eq_Abs_hypreal)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    53
apply (rule_tac z = y in eq_Abs_hypreal)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    54
apply (auto intro!: exI simp add: hypreal_less_def hypreal_mult, ultra)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    55
apply (auto intro: real_mult_order)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    56
done
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    57
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    58
lemma hypreal_add_left_le_mono1: "(q1::hypreal) \<le> q2  ==> x + q1 \<le> x + q2"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    59
apply (drule order_le_imp_less_or_eq)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    60
apply (auto intro: order_less_imp_le hypreal_add_less_mono1 simp add: hypreal_add_commute)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    61
done
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    62
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    63
lemma hypreal_mult_less_mono1: "[| (0::hypreal) < z; x < y |] ==> x*z < y*z"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    64
apply (rotate_tac 1)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    65
apply (drule hypreal_less_minus_iff [THEN iffD1])
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    66
apply (rule hypreal_less_minus_iff [THEN iffD2])
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    67
apply (drule hypreal_mult_order, assumption)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    68
apply (simp add: hypreal_add_mult_distrib2 hypreal_mult_commute)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    69
done
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    70
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    71
lemma hypreal_mult_less_mono2: "[| (0::hypreal)<z; x<y |] ==> z*x<z*y"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    72
apply (simp (no_asm_simp) add: hypreal_mult_commute hypreal_mult_less_mono1)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    73
done
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    74
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    75
subsection{*The Hyperreals Form an Ordered Field*}
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    76
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    77
instance hypreal :: inverse ..
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    78
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    79
instance hypreal :: ordered_field
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    80
proof
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    81
  fix x y z :: hypreal
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    82
  show "(x + y) + z = x + (y + z)" by (rule hypreal_add_assoc)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    83
  show "x + y = y + x" by (rule hypreal_add_commute)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    84
  show "0 + x = x" by simp
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    85
  show "- x + x = 0" by simp
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    86
  show "x - y = x + (-y)" by (simp add: hypreal_diff_def)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    87
  show "(x * y) * z = x * (y * z)" by (rule hypreal_mult_assoc)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    88
  show "x * y = y * x" by (rule hypreal_mult_commute)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    89
  show "1 * x = x" by simp
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    90
  show "(x + y) * z = x * z + y * z" by (simp add: hypreal_add_mult_distrib)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    91
  show "0 \<noteq> (1::hypreal)" by (rule hypreal_zero_not_eq_one)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    92
  show "x \<le> y ==> z + x \<le> z + y" by (rule hypreal_add_left_le_mono1)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    93
  show "x < y ==> 0 < z ==> z * x < z * y" by (simp add: hypreal_mult_less_mono2)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    94
  show "\<bar>x\<bar> = (if x < 0 then -x else x)"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    95
    by (auto dest: order_le_less_trans simp add: hrabs_def linorder_not_le)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    96
  show "x \<noteq> 0 ==> inverse x * x = 1" by simp
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    97
  show "y \<noteq> 0 ==> x / y = x * inverse y" by (simp add: hypreal_divide_def)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    98
qed
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
    99
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   100
(*** Monotonicity results ***)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   101
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   102
lemma hypreal_add_right_cancel_less: "(v+z < w+z) = (v < (w::hypreal))"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   103
  by (rule Ring_and_Field.add_less_cancel_right)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   104
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   105
lemma hypreal_add_left_cancel_less: "(z+v < z+w) = (v < (w::hypreal))"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   106
  by (rule Ring_and_Field.add_less_cancel_left)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   107
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   108
lemma hypreal_add_right_cancel_le: "(v+z \<le> w+z) = (v \<le> (w::hypreal))"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   109
  by (rule Ring_and_Field.add_le_cancel_right)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   110
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   111
lemma hypreal_add_left_cancel_le: "(z+v \<le> z+w) = (v \<le> (w::hypreal))"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   112
  by (rule Ring_and_Field.add_le_cancel_left)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   113
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   114
lemma hypreal_add_less_mono: "[| (z1::hypreal) < y1; z2 < y2 |] ==> z1 + z2 < y1 + y2"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   115
 by (rule Ring_and_Field.add_strict_mono)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   116
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   117
lemma hypreal_add_le_mono1: "(q1::hypreal) \<le> q2  ==> q1 + x \<le> q2 + x"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   118
  by (rule Ring_and_Field.add_right_mono)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   119
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   120
lemma hypreal_add_le_mono: "[|(i::hypreal)\<le>j;  k\<le>l |] ==> i + k \<le> j + l"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   121
 by (rule Ring_and_Field.add_mono)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   122
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   123
lemma hypreal_add_less_le_mono: "[|(i::hypreal)<j;  k\<le>l |] ==> i + k < j + l"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   124
by (auto dest!: order_le_imp_less_or_eq intro: hypreal_add_less_mono1 hypreal_add_less_mono)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   125
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   126
lemma hypreal_add_less_mono2: "!!(A::hypreal). A < B ==> C + A < C + B"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   127
by (auto intro: hypreal_add_less_mono1 simp add: hypreal_add_commute)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   128
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   129
lemma hypreal_add_le_less_mono: "[|(i::hypreal)\<le>j;  k<l |] ==> i + k < j + l"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   130
apply (erule add_right_mono [THEN order_le_less_trans])
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   131
apply (erule add_strict_left_mono) 
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   132
done
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   133
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   134
lemma hypreal_less_add_right_cancel: "(A::hypreal) + C < B + C ==> A < B"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   135
apply (simp (no_asm_use))
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   136
done
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   137
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   138
lemma hypreal_less_add_left_cancel: "(C::hypreal) + A < C + B ==> A < B"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   139
apply (simp (no_asm_use))
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   140
done
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   141
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   142
lemma hypreal_add_zero_less_le_mono: "[|r < x; (0::hypreal) \<le> y|] ==> r < x + y"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   143
by (auto dest: hypreal_add_less_le_mono)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   144
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   145
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   146
(**** The simproc abel_cancel ****)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   147
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   148
(*** Two lemmas needed for the simprocs ***)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   149
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   150
(*Deletion of other terms in the formula, seeking the -x at the front of z*)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   151
lemma hypreal_add_cancel_21: "((x::hypreal) + (y + z) = y + u) = ((x + z) = u)"
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   152
apply (subst hypreal_add_left_commute)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   153
apply (rule hypreal_add_left_cancel)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   154
done
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   155
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   156
(*A further rule to deal with the case that
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   157
  everything gets cancelled on the right.*)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   158
lemma hypreal_add_cancel_end: "((x::hypreal) + (y + z) = y) = (x = -z)"
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   159
apply (subst hypreal_add_left_commute)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   160
apply (rule_tac t = y in hypreal_add_zero_right [THEN subst], subst hypreal_add_left_cancel)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   161
apply (simp (no_asm) add: hypreal_eq_diff_eq [symmetric])
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   162
done
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   163
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   164
ML{*
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   165
val hypreal_add_cancel_21 = thm "hypreal_add_cancel_21";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   166
val hypreal_add_cancel_end = thm "hypreal_add_cancel_end";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   167
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   168
structure Hyperreal_Cancel_Data =
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   169
struct
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   170
  val ss		= HOL_ss
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   171
  val eq_reflection	= eq_reflection
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   172
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   173
  val sg_ref		= Sign.self_ref (Theory.sign_of (the_context ()))
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   174
  val T			= Type("HyperDef.hypreal",[])
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   175
  val zero		= Const ("0", T)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   176
  val restrict_to_left  = restrict_to_left
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   177
  val add_cancel_21	= hypreal_add_cancel_21
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   178
  val add_cancel_end	= hypreal_add_cancel_end
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   179
  val add_left_cancel	= hypreal_add_left_cancel
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   180
  val add_assoc		= hypreal_add_assoc
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   181
  val add_commute	= hypreal_add_commute
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   182
  val add_left_commute	= hypreal_add_left_commute
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   183
  val add_0		= hypreal_add_zero_left
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   184
  val add_0_right	= hypreal_add_zero_right
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   185
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   186
  val eq_diff_eq	= hypreal_eq_diff_eq
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   187
  val eqI_rules		= [hypreal_less_eqI, hypreal_eq_eqI, hypreal_le_eqI]
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   188
  fun dest_eqI th = 
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   189
      #1 (HOLogic.dest_bin "op =" HOLogic.boolT
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   190
	      (HOLogic.dest_Trueprop (concl_of th)))
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   191
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   192
  val diff_def		= hypreal_diff_def
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   193
  val minus_add_distrib	= hypreal_minus_add_distrib
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   194
  val minus_minus	= hypreal_minus_minus
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   195
  val minus_0		= hypreal_minus_zero
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   196
  val add_inverses	= [hypreal_add_minus, hypreal_add_minus_left]
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   197
  val cancel_simps	= [hypreal_add_minus_cancelA, hypreal_minus_add_cancelA]
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   198
end;
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   199
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   200
structure Hyperreal_Cancel = Abel_Cancel (Hyperreal_Cancel_Data);
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   201
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   202
Addsimprocs [Hyperreal_Cancel.sum_conv, Hyperreal_Cancel.rel_conv];
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   203
*}
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   204
14310
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   205
lemma hypreal_le_add_right_cancel: "!!(A::hypreal). A + C \<le> B + C ==> A \<le> B"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   206
apply (drule_tac x = "-C" in hypreal_add_le_mono1)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   207
apply (simp add: hypreal_add_assoc)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   208
done
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   209
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   210
lemma hypreal_le_add_left_cancel: "!!(A::hypreal). C + A \<le> C + B ==> A \<le> B"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   211
apply (drule_tac x = "-C" in hypreal_add_left_le_mono1)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   212
apply (simp add: hypreal_add_assoc [symmetric])
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   213
done
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   214
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   215
lemma hypreal_mult_less_zero: "[| 0 < x; y < 0 |] ==> x*y < (0::hypreal)"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   216
apply (drule hypreal_minus_zero_less_iff [THEN iffD2])
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   217
apply (drule hypreal_mult_order, assumption)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   218
apply (rule hypreal_minus_zero_less_iff [THEN iffD1], simp)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   219
done
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   220
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   221
lemma hypreal_mult_less_zero1: "[| x < 0; y < 0 |] ==> (0::hypreal) < x * y"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   222
apply (drule hypreal_minus_zero_less_iff [THEN iffD2])+
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   223
apply (drule hypreal_mult_order, assumption, simp)
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   224
done
14310
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   225
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   226
lemma hypreal_le_square: "(0::hypreal) \<le> x*x"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   227
apply (rule_tac x = 0 and y = x in hypreal_linear_less2)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   228
apply (auto intro: hypreal_mult_order hypreal_mult_less_zero1 order_less_imp_le)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   229
done
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   230
declare hypreal_le_square [simp]
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   231
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   232
lemma hypreal_add_order: "[| 0 < x; 0 < y |] ==> (0::hypreal) < x + y"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   233
apply (erule order_less_trans)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   234
apply (drule hypreal_add_less_mono2, simp)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   235
done
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   236
14310
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   237
lemma hypreal_le_add_order: "[| 0 \<le> x; 0 \<le> y |] ==> (0::hypreal) \<le> x + y"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   238
apply (drule order_le_imp_less_or_eq)+
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   239
apply (auto intro: hypreal_add_order order_less_imp_le)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   240
done
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   241
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   242
text{*The precondition could be weakened to @{term "0\<le>x"}*}
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   243
lemma hypreal_mult_less_mono:
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   244
     "[| u<v;  x<y;  (0::hypreal) < v;  0 < x |] ==> u*x < v* y"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   245
 by (simp add: Ring_and_Field.mult_strict_mono order_less_imp_le)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   246
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   247
lemma hypreal_inverse_gt_0: "0 < x ==> 0 < inverse (x::hypreal)"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   248
  by (rule Ring_and_Field.positive_imp_inverse_positive)
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   249
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   250
lemma hypreal_inverse_less_0: "x < 0 ==> inverse (x::hypreal) < 0"
1dd7439477dd simplifying
paulson
parents: 14309
diff changeset
   251
  by (rule Ring_and_Field.negative_imp_inverse_negative)
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   252
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   253
lemma hypreal_less_swap_iff: "((x::hypreal) < y) = (-y < -x)"
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   254
apply (subst hypreal_less_minus_iff)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   255
apply (rule_tac x1 = x in hypreal_less_minus_iff [THEN ssubst])
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   256
apply (simp (no_asm) add: hypreal_add_commute)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   257
done
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   258
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   259
lemma hypreal_gt_zero_iff: 
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   260
      "((0::hypreal) < x) = (-x < x)"
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   261
apply (unfold hypreal_zero_def)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   262
apply (rule_tac z = x in eq_Abs_hypreal)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   263
apply (auto simp add: hypreal_less hypreal_minus, ultra+)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   264
done
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   265
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   266
lemma hypreal_lt_zero_iff: "(x < (0::hypreal)) = (x < -x)"
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   267
apply (rule hypreal_minus_zero_less_iff [THEN subst])
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   268
apply (subst hypreal_gt_zero_iff)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   269
apply (simp (no_asm_use))
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   270
done
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   271
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   272
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   273
(*----------------------------------------------------------------------------
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   274
               Existence of infinite hyperreal number
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   275
 ----------------------------------------------------------------------------*)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   276
14299
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   277
lemma Rep_hypreal_omega: "Rep_hypreal(omega) \<in> hypreal"
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   278
apply (unfold omega_def)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   279
apply (rule Rep_hypreal)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   280
done
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   281
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   282
(* existence of infinite number not corresponding to any real number *)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   283
(* use assumption that member FreeUltrafilterNat is not finite       *)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   284
(* a few lemmas first *)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   285
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   286
lemma lemma_omega_empty_singleton_disj: "{n::nat. x = real n} = {} |  
14299
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   287
      (\<exists>y. {n::nat. x = real n} = {y})"
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   288
by (force dest: inj_real_of_nat [THEN injD])
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   289
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   290
lemma lemma_finite_omega_set: "finite {n::nat. x = real n}"
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   291
by (cut_tac x = x in lemma_omega_empty_singleton_disj, auto)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   292
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   293
lemma not_ex_hypreal_of_real_eq_omega: 
14299
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   294
      "~ (\<exists>x. hypreal_of_real x = omega)"
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   295
apply (unfold omega_def hypreal_of_real_def)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   296
apply (auto simp add: real_of_nat_Suc diff_eq_eq [symmetric] lemma_finite_omega_set [THEN FreeUltrafilterNat_finite])
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   297
done
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   298
14299
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   299
lemma hypreal_of_real_not_eq_omega: "hypreal_of_real x \<noteq> omega"
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   300
by (cut_tac not_ex_hypreal_of_real_eq_omega, auto)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   301
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   302
(* existence of infinitesimal number also not *)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   303
(* corresponding to any real number *)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   304
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   305
lemma real_of_nat_inverse_inj: "inverse (real (x::nat)) = inverse (real y) ==> x = y"
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   306
by (rule inj_real_of_nat [THEN injD], simp)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   307
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   308
lemma lemma_epsilon_empty_singleton_disj: "{n::nat. x = inverse(real(Suc n))} = {} |  
14299
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   309
      (\<exists>y. {n::nat. x = inverse(real(Suc n))} = {y})"
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   310
apply (auto simp add: inj_real_of_nat [THEN inj_eq])
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   311
done
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   312
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   313
lemma lemma_finite_epsilon_set: "finite {n. x = inverse(real(Suc n))}"
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   314
by (cut_tac x = x in lemma_epsilon_empty_singleton_disj, auto)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   315
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   316
lemma not_ex_hypreal_of_real_eq_epsilon: 
14299
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   317
      "~ (\<exists>x. hypreal_of_real x = epsilon)"
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   318
apply (unfold epsilon_def hypreal_of_real_def)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   319
apply (auto simp add: lemma_finite_epsilon_set [THEN FreeUltrafilterNat_finite])
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   320
done
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   321
14299
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   322
lemma hypreal_of_real_not_eq_epsilon: "hypreal_of_real x \<noteq> epsilon"
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   323
by (cut_tac not_ex_hypreal_of_real_eq_epsilon, auto)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   324
14299
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   325
lemma hypreal_epsilon_not_zero: "epsilon \<noteq> 0"
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   326
by (unfold epsilon_def hypreal_zero_def, auto)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   327
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   328
lemma hypreal_epsilon_inverse_omega: "epsilon = inverse(omega)"
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   329
by (simp add: hypreal_inverse omega_def epsilon_def)
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   330
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   331
14303
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   332
subsection{*Routine Properties*}
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
   333
14303
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   334
(* this proof is so much simpler than one for reals!! *)
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   335
lemma hypreal_inverse_less_swap:
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   336
     "[| 0 < r; r < x |] ==> inverse x < inverse (r::hypreal)"
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   337
  by (rule Ring_and_Field.less_imp_inverse_less)
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   338
14303
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   339
lemma hypreal_inverse_less_iff:
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   340
     "[| 0 < r; 0 < x|] ==> (inverse x < inverse (r::hypreal)) = (r < x)"
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   341
by (rule Ring_and_Field.inverse_less_iff_less)
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   342
14303
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   343
lemma hypreal_inverse_le_iff:
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   344
     "[| 0 < r; 0 < x|] ==> (inverse x \<le> inverse r) = (r \<le> (x::hypreal))"
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   345
by (rule Ring_and_Field.inverse_le_iff_le)
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   346
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   347
14303
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   348
subsection{*Convenient Biconditionals for Products of Signs*}
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   349
14303
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   350
lemma hypreal_0_less_mult_iff:
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   351
     "((0::hypreal) < x*y) = (0 < x & 0 < y | x < 0 & y < 0)"
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   352
  by (rule Ring_and_Field.zero_less_mult_iff) 
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   353
14303
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   354
lemma hypreal_0_le_mult_iff: "((0::hypreal) \<le> x*y) = (0 \<le> x & 0 \<le> y | x \<le> 0 & y \<le> 0)"
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   355
  by (rule Ring_and_Field.zero_le_mult_iff) 
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   356
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   357
lemma hypreal_mult_less_0_iff: "(x*y < (0::hypreal)) = (0 < x & y < 0 | x < 0 & 0 < y)"
14303
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   358
  by (rule Ring_and_Field.mult_less_0_iff) 
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   359
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   360
lemma hypreal_mult_le_0_iff: "(x*y \<le> (0::hypreal)) = (0 \<le> x & y \<le> 0 | x \<le> 0 & 0 \<le> y)"
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   361
  by (rule Ring_and_Field.mult_le_0_iff) 
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   362
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   363
14303
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   364
lemma hypreal_mult_self_sum_ge_zero: "(0::hypreal) \<le> x*x + y*y"
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   365
proof -
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   366
  have "0 + 0 \<le> x*x + y*y" by (blast intro: add_mono zero_le_square)
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   367
  thus ?thesis by simp
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   368
qed
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   369
14299
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   370
(*TO BE DELETED*)
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   371
ML
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   372
{*
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   373
val hypreal_add_ac = thms"hypreal_add_ac";
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   374
val hypreal_mult_ac = thms"hypreal_mult_ac";
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   375
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   376
val hypreal_less_irrefl = thm"hypreal_less_irrefl";
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   377
*}
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   378
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   379
ML
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   380
{*
14299
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   381
val hrabs_def = thm "hrabs_def";
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   382
val hypreal_hrabs = thm "hypreal_hrabs";
0b5c0b0a3eba converted Hyperreal/HyperDef to Isar script
paulson
parents: 14297
diff changeset
   383
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   384
val hypreal_less_swap_iff = thm"hypreal_less_swap_iff";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   385
val hypreal_gt_zero_iff = thm"hypreal_gt_zero_iff";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   386
val hypreal_add_less_mono1 = thm"hypreal_add_less_mono1";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   387
val hypreal_add_less_mono2 = thm"hypreal_add_less_mono2";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   388
val hypreal_lt_zero_iff = thm"hypreal_lt_zero_iff";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   389
val hypreal_mult_order = thm"hypreal_mult_order";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   390
val hypreal_mult_less_zero1 = thm"hypreal_mult_less_zero1";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   391
val hypreal_mult_less_zero = thm"hypreal_mult_less_zero";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   392
val hypreal_le_add_order = thm"hypreal_le_add_order";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   393
val hypreal_add_right_cancel_less = thm"hypreal_add_right_cancel_less";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   394
val hypreal_add_left_cancel_less = thm"hypreal_add_left_cancel_less";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   395
val hypreal_add_right_cancel_le = thm"hypreal_add_right_cancel_le";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   396
val hypreal_add_left_cancel_le = thm"hypreal_add_left_cancel_le";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   397
val hypreal_add_less_mono = thm"hypreal_add_less_mono";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   398
val hypreal_add_left_le_mono1 = thm"hypreal_add_left_le_mono1";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   399
val hypreal_add_le_mono1 = thm"hypreal_add_le_mono1";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   400
val hypreal_add_le_mono = thm"hypreal_add_le_mono";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   401
val hypreal_add_less_le_mono = thm"hypreal_add_less_le_mono";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   402
val hypreal_add_le_less_mono = thm"hypreal_add_le_less_mono";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   403
val hypreal_less_add_right_cancel = thm"hypreal_less_add_right_cancel";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   404
val hypreal_less_add_left_cancel = thm"hypreal_less_add_left_cancel";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   405
val hypreal_add_zero_less_le_mono = thm"hypreal_add_zero_less_le_mono";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   406
val hypreal_le_add_right_cancel = thm"hypreal_le_add_right_cancel";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   407
val hypreal_le_add_left_cancel = thm"hypreal_le_add_left_cancel";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   408
val hypreal_le_square = thm"hypreal_le_square";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   409
val hypreal_mult_less_mono1 = thm"hypreal_mult_less_mono1";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   410
val hypreal_mult_less_mono2 = thm"hypreal_mult_less_mono2";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   411
val hypreal_mult_less_mono = thm"hypreal_mult_less_mono";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   412
val hypreal_inverse_gt_0 = thm"hypreal_inverse_gt_0";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   413
val hypreal_inverse_less_0 = thm"hypreal_inverse_less_0";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   414
val Rep_hypreal_omega = thm"Rep_hypreal_omega";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   415
val lemma_omega_empty_singleton_disj = thm"lemma_omega_empty_singleton_disj";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   416
val lemma_finite_omega_set = thm"lemma_finite_omega_set";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   417
val not_ex_hypreal_of_real_eq_omega = thm"not_ex_hypreal_of_real_eq_omega";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   418
val hypreal_of_real_not_eq_omega = thm"hypreal_of_real_not_eq_omega";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   419
val real_of_nat_inverse_inj = thm"real_of_nat_inverse_inj";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   420
val lemma_epsilon_empty_singleton_disj = thm"lemma_epsilon_empty_singleton_disj";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   421
val lemma_finite_epsilon_set = thm"lemma_finite_epsilon_set";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   422
val not_ex_hypreal_of_real_eq_epsilon = thm"not_ex_hypreal_of_real_eq_epsilon";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   423
val hypreal_of_real_not_eq_epsilon = thm"hypreal_of_real_not_eq_epsilon";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   424
val hypreal_epsilon_not_zero = thm"hypreal_epsilon_not_zero";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   425
val hypreal_epsilon_inverse_omega = thm"hypreal_epsilon_inverse_omega";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   426
val hypreal_inverse_less_swap = thm"hypreal_inverse_less_swap";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   427
val hypreal_inverse_less_iff = thm"hypreal_inverse_less_iff";
14303
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   428
val hypreal_inverse_le_iff = thm"hypreal_inverse_le_iff";
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   429
val hypreal_0_less_mult_iff = thm"hypreal_0_less_mult_iff";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   430
val hypreal_0_le_mult_iff = thm"hypreal_0_le_mult_iff";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   431
val hypreal_mult_less_0_iff = thm"hypreal_mult_less_0_iff";
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   432
val hypreal_mult_le_0_iff = thm"hypreal_mult_le_0_iff";
14303
995212a00a50 type hypreal is an ordered field
paulson
parents: 14299
diff changeset
   433
val hypreal_mult_self_sum_ge_zero = thm "hypreal_mult_self_sum_ge_zero";
14297
7c84fd26add1 converted Hyperreal/HyperOrd to new-style theory
paulson
parents: 10751
diff changeset
   434
*}
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
   435
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
   436
end