src/HOL/Real/RealArith0.thy
author paulson
Sun, 07 Dec 2003 16:30:06 +0100
changeset 14284 f1abe67c448a
parent 14277 ad66687ece6e
child 14288 d149e3cbdb39
permissions -rw-r--r--
re-organisation of Real/RealArith0.ML; more `Isar scripts
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10722
55c8367bab05 rational linear arithmetic
nipkow
parents:
diff changeset
     1
theory RealArith0 = RealBin
55c8367bab05 rational linear arithmetic
nipkow
parents:
diff changeset
     2
files "real_arith0.ML":
55c8367bab05 rational linear arithmetic
nipkow
parents:
diff changeset
     3
14284
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
     4
(*FIXME: move results further down to Ring_and_Field*)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
     5
10722
55c8367bab05 rational linear arithmetic
nipkow
parents:
diff changeset
     6
setup real_arith_setup
55c8367bab05 rational linear arithmetic
nipkow
parents:
diff changeset
     7
14277
ad66687ece6e more field division lemmas transferred from Real to Ring_and_Field
paulson
parents: 14275
diff changeset
     8
subsection{*Facts that need the Arithmetic Decision Procedure*}
14275
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
     9
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    10
lemma real_diff_minus_eq: "x - - y = x + (y::real)"
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    11
by simp
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    12
declare real_diff_minus_eq [simp]
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    13
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    14
(** Division and inverse **)
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    15
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    16
lemma real_inverse_eq_divide: "inverse (x::real) = 1/x"
14277
ad66687ece6e more field division lemmas transferred from Real to Ring_and_Field
paulson
parents: 14275
diff changeset
    17
  by (rule Ring_and_Field.inverse_eq_divide) 
14275
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    18
14277
ad66687ece6e more field division lemmas transferred from Real to Ring_and_Field
paulson
parents: 14275
diff changeset
    19
text{*Needed in this non-standard form by Hyperreal/Transcendental*}
ad66687ece6e more field division lemmas transferred from Real to Ring_and_Field
paulson
parents: 14275
diff changeset
    20
lemma real_0_le_divide_iff:
ad66687ece6e more field division lemmas transferred from Real to Ring_and_Field
paulson
parents: 14275
diff changeset
    21
     "((0::real) <= x/y) = ((x <= 0 | 0 <= y) & (0 <= x | y <= 0))"
14275
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    22
by (simp add: real_divide_def real_0_le_mult_iff, auto)
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    23
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    24
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    25
(**** Factor cancellation theorems for "real" ****)
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    26
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    27
(** Cancellation laws for k*m < k*n and m*k < n*k, also for <= and =,
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    28
    but not (yet?) for k*m < n*k. **)
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    29
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    30
lemma real_mult_less_cancel2:
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    31
     "(m*k < n*k) = (((0::real) < k & m<n) | (k < 0 & n<m))"
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    32
  by (rule Ring_and_Field.mult_less_cancel_right) 
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    33
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    34
lemma real_mult_le_cancel2:
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    35
     "(m*k <= n*k) = (((0::real) < k --> m<=n) & (k < 0 --> n<=m))"
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    36
  by (rule Ring_and_Field.mult_le_cancel_right) 
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    37
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    38
lemma real_mult_less_cancel1:
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    39
     "(k*m < k*n) = (((0::real) < k & m<n) | (k < 0 & n<m))"
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    40
  by (rule Ring_and_Field.mult_less_cancel_left) 
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    41
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    42
lemma real_mult_le_cancel1:
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    43
     "!!k::real. (k*m <= k*n) = ((0 < k --> m<=n) & (k < 0 --> n<=m))"
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    44
  by (rule Ring_and_Field.mult_le_cancel_left) 
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    45
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    46
lemma real_mult_eq_cancel1: "!!k::real. (k*m = k*n) = (k = 0 | m=n)"
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    47
  by (rule Ring_and_Field.mult_cancel_left) 
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    48
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    49
lemma real_mult_eq_cancel2: "!!k::real. (m*k = n*k) = (k = 0 | m=n)"
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    50
  by (rule Ring_and_Field.mult_cancel_right) 
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    51
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    52
lemma real_mult_div_cancel1: "!!k::real. k~=0 ==> (k*m) / (k*n) = (m/n)"
14277
ad66687ece6e more field division lemmas transferred from Real to Ring_and_Field
paulson
parents: 14275
diff changeset
    53
  by (rule Ring_and_Field.mult_divide_cancel_left) 
14275
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    54
14277
ad66687ece6e more field division lemmas transferred from Real to Ring_and_Field
paulson
parents: 14275
diff changeset
    55
lemma real_mult_div_cancel_disj:
ad66687ece6e more field division lemmas transferred from Real to Ring_and_Field
paulson
parents: 14275
diff changeset
    56
     "(k*m) / (k*n) = (if k = (0::real) then 0 else m/n)"
ad66687ece6e more field division lemmas transferred from Real to Ring_and_Field
paulson
parents: 14275
diff changeset
    57
  by (rule Ring_and_Field.mult_divide_cancel_eq_if) 
14275
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
    58
14284
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    59
subsection{* Simprules combining x+y and 0: ARE THEY NEEDED?*}
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    60
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    61
lemma real_add_minus_iff [simp]: "(x + - a = (0::real)) = (x=a)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    62
by arith
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    63
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    64
lemma real_add_eq_0_iff [iff]: "(x+y = (0::real)) = (y = -x)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    65
by auto
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    66
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    67
lemma real_add_less_0_iff [iff]: "(x+y < (0::real)) = (y < -x)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    68
by auto
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    69
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    70
lemma real_0_less_add_iff [iff]: "((0::real) < x+y) = (-x < y)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    71
by auto
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    72
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    73
lemma real_add_le_0_iff [iff]: "(x+y \<le> (0::real)) = (y \<le> -x)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    74
by auto
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    75
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    76
lemma real_0_le_add_iff [iff]: "((0::real) \<le> x+y) = (-x \<le> y)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    77
by auto
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    78
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    79
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    80
(** Simprules combining x-y and 0; see also real_less_iff_diff_less_0, etc.,
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    81
    in RealBin
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    82
**)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    83
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    84
lemma real_0_less_diff_iff [iff]: "((0::real) < x-y) = (y < x)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    85
by auto
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    86
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    87
lemma real_0_le_diff_iff [iff]: "((0::real) \<le> x-y) = (y \<le> x)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    88
by auto
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    89
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    90
(*
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    91
FIXME: we should have this, as for type int, but many proofs would break.
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    92
It replaces x+-y by x-y.
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    93
Addsimps [symmetric real_diff_def]
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    94
*)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    95
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    96
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    97
(*FIXME: move most of these to Ring_and_Field*)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    98
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
    99
subsection{*Simplification of Inequalities Involving Literal Divisors*}
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   100
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   101
lemma pos_real_le_divide_eq: "0<z ==> ((x::real) \<le> y/z) = (x*z \<le> y)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   102
apply (subgoal_tac " (x*z \<le> y) = (x*z \<le> (y/z) *z) ")
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   103
 prefer 2 apply (simp add: real_divide_def real_mult_assoc) 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   104
apply (erule ssubst)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   105
apply (subst real_mult_le_cancel2, simp)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   106
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   107
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   108
lemma neg_real_le_divide_eq: "z<0 ==> ((x::real) \<le> y/z) = (y \<le> x*z)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   109
apply (subgoal_tac " (y \<le> x*z) = ((y/z) *z \<le> x*z) ")
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   110
 prefer 2 apply (simp add: real_divide_def real_mult_assoc)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   111
apply (erule ssubst)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   112
apply (subst real_mult_le_cancel2, simp)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   113
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   114
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   115
lemma real_le_divide_eq:
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   116
  "((x::real) \<le> y/z) = (if 0<z then x*z \<le> y
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   117
                        else if z<0 then y \<le> x*z
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   118
                        else x\<le>0)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   119
apply (case_tac "z=0", simp) 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   120
apply (simp add: pos_real_le_divide_eq neg_real_le_divide_eq) 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   121
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   122
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   123
declare real_le_divide_eq [of _ _ "number_of w", standard, simp]
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   124
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   125
lemma pos_real_divide_le_eq: "0<z ==> (y/z \<le> (x::real)) = (y \<le> x*z)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   126
apply (subgoal_tac " (y \<le> x*z) = ((y/z) *z \<le> x*z) ")
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   127
 prefer 2 apply (simp add: real_divide_def real_mult_assoc)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   128
apply (erule ssubst)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   129
apply (subst real_mult_le_cancel2, simp)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   130
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   131
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   132
lemma neg_real_divide_le_eq: "z<0 ==> (y/z \<le> (x::real)) = (x*z \<le> y)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   133
apply (subgoal_tac " (x*z \<le> y) = (x*z \<le> (y/z) *z) ")
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   134
 prefer 2 apply (simp add: real_divide_def real_mult_assoc)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   135
apply (erule ssubst)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   136
apply (subst real_mult_le_cancel2, simp)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   137
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   138
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   139
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   140
lemma real_divide_le_eq:
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   141
  "(y/z \<le> (x::real)) = (if 0<z then y \<le> x*z
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   142
                        else if z<0 then x*z \<le> y
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   143
                        else 0 \<le> x)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   144
apply (case_tac "z=0", simp) 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   145
apply (simp add: pos_real_divide_le_eq neg_real_divide_le_eq) 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   146
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   147
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   148
declare real_divide_le_eq [of _ "number_of w", standard, simp]
14275
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
   149
031a5a051bb4 Converting more of the "real" development to Isar scripts
paulson
parents: 10722
diff changeset
   150
14284
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   151
lemma pos_real_less_divide_eq: "0<z ==> ((x::real) < y/z) = (x*z < y)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   152
apply (subgoal_tac " (x*z < y) = (x*z < (y/z) *z) ")
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   153
 prefer 2 apply (simp add: real_divide_def real_mult_assoc)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   154
apply (erule ssubst)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   155
apply (subst real_mult_less_cancel2, simp)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   156
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   157
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   158
lemma neg_real_less_divide_eq: "z<0 ==> ((x::real) < y/z) = (y < x*z)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   159
apply (subgoal_tac " (y < x*z) = ((y/z) *z < x*z) ")
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   160
 prefer 2 apply (simp add: real_divide_def real_mult_assoc)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   161
apply (erule ssubst)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   162
apply (subst real_mult_less_cancel2, simp)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   163
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   164
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   165
lemma real_less_divide_eq:
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   166
  "((x::real) < y/z) = (if 0<z then x*z < y
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   167
                        else if z<0 then y < x*z
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   168
                        else x<0)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   169
apply (case_tac "z=0", simp) 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   170
apply (simp add: pos_real_less_divide_eq neg_real_less_divide_eq) 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   171
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   172
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   173
declare real_less_divide_eq [of _ _ "number_of w", standard, simp]
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   174
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   175
lemma pos_real_divide_less_eq: "0<z ==> (y/z < (x::real)) = (y < x*z)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   176
apply (subgoal_tac " (y < x*z) = ((y/z) *z < x*z) ")
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   177
 prefer 2 apply (simp add: real_divide_def real_mult_assoc)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   178
apply (erule ssubst)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   179
apply (subst real_mult_less_cancel2, simp)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   180
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   181
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   182
lemma neg_real_divide_less_eq: "z<0 ==> (y/z < (x::real)) = (x*z < y)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   183
apply (subgoal_tac " (x*z < y) = (x*z < (y/z) *z) ")
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   184
 prefer 2 apply (simp add: real_divide_def real_mult_assoc)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   185
apply (erule ssubst)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   186
apply (subst real_mult_less_cancel2, simp)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   187
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   188
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   189
lemma real_divide_less_eq:
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   190
  "(y/z < (x::real)) = (if 0<z then y < x*z
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   191
                        else if z<0 then x*z < y
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   192
                        else 0 < x)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   193
apply (case_tac "z=0", simp) 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   194
apply (simp add: pos_real_divide_less_eq neg_real_divide_less_eq) 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   195
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   196
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   197
declare real_divide_less_eq [of _ "number_of w", standard, simp]
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   198
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   199
lemma nonzero_real_eq_divide_eq: "z\<noteq>0 ==> ((x::real) = y/z) = (x*z = y)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   200
apply (subgoal_tac " (x*z = y) = (x*z = (y/z) *z) ")
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   201
 prefer 2 apply (simp add: real_divide_def real_mult_assoc)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   202
apply (erule ssubst)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   203
apply (subst real_mult_eq_cancel2, simp)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   204
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   205
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   206
lemma real_eq_divide_eq:
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   207
  "((x::real) = y/z) = (if z\<noteq>0 then x*z = y else x=0)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   208
by (simp add: nonzero_real_eq_divide_eq) 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   209
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   210
declare real_eq_divide_eq [of _ _ "number_of w", standard, simp]
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   211
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   212
lemma nonzero_real_divide_eq_eq: "z\<noteq>0 ==> (y/z = (x::real)) = (y = x*z)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   213
apply (subgoal_tac " (y = x*z) = ((y/z) *z = x*z) ")
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   214
 prefer 2 apply (simp add: real_divide_def real_mult_assoc)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   215
apply (erule ssubst)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   216
apply (subst real_mult_eq_cancel2, simp)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   217
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   218
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   219
lemma real_divide_eq_eq:
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   220
  "(y/z = (x::real)) = (if z\<noteq>0 then y = x*z else x=0)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   221
by (simp add: nonzero_real_divide_eq_eq) 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   222
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   223
declare real_divide_eq_eq [of _ "number_of w", standard, simp]
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   224
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   225
lemma real_divide_eq_cancel2: "(m/k = n/k) = (k = 0 | m = (n::real))"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   226
apply (case_tac "k=0", simp) 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   227
apply (simp add:divide_inverse) 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   228
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   229
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   230
lemma real_divide_eq_cancel1: "(k/m = k/n) = (k = 0 | m = (n::real))" 
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   231
by (force simp add: real_divide_eq_eq real_eq_divide_eq)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   232
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   233
lemma real_inverse_less_iff:
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   234
     "[| 0 < r; 0 < x|] ==> (inverse x < inverse (r::real)) = (r < x)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   235
by (rule Ring_and_Field.inverse_less_iff_less)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   236
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   237
lemma real_inverse_le_iff:
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   238
     "[| 0 < r; 0 < x|] ==> (inverse x \<le> inverse r) = (r \<le> (x::real))"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   239
by (rule Ring_and_Field.inverse_le_iff_le)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   240
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   241
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   242
(** Division by 1, -1 **)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   243
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   244
lemma real_divide_1: "(x::real)/1 = x"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   245
by (simp add: real_divide_def)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   246
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   247
lemma real_divide_minus1 [simp]: "x/-1 = -(x::real)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   248
by simp
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   249
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   250
lemma real_minus1_divide [simp]: "-1/(x::real) = - (1/x)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   251
by (simp add: real_divide_def real_minus_inverse)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   252
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   253
lemma real_lbound_gt_zero:
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   254
     "[| (0::real) < d1; 0 < d2 |] ==> \<exists>e. 0 < e & e < d1 & e < d2"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   255
apply (rule_tac x = " (min d1 d2) /2" in exI)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   256
apply (simp add: min_def)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   257
done
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   258
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   259
(*** Density of the Reals ***)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   260
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   261
lemma real_less_half_sum: "x < y ==> x < (x+y) / (2::real)"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   262
by auto
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   263
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   264
lemma real_gt_half_sum: "x < y ==> (x+y)/(2::real) < y"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   265
by auto
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   266
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   267
lemma real_dense: "x < y ==> \<exists>r::real. x < r & r < y"
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   268
by (blast intro!: real_less_half_sum real_gt_half_sum)
f1abe67c448a re-organisation of Real/RealArith0.ML; more `Isar scripts
paulson
parents: 14277
diff changeset
   269
10722
55c8367bab05 rational linear arithmetic
nipkow
parents:
diff changeset
   270
end