src/HOL/Real/RealArith0.thy
changeset 14277 ad66687ece6e
parent 14275 031a5a051bb4
child 14284 f1abe67c448a
equal deleted inserted replaced
14276:950c12139016 14277:ad66687ece6e
     1 theory RealArith0 = RealBin
     1 theory RealArith0 = RealBin
     2 files "real_arith0.ML":
     2 files "real_arith0.ML":
     3 
     3 
     4 setup real_arith_setup
     4 setup real_arith_setup
     5 
     5 
     6 subsection{*Assorted facts that need binary literals and the arithmetic decision procedure*}
     6 subsection{*Facts that need the Arithmetic Decision Procedure*}
     7 
     7 
     8 lemma real_diff_minus_eq: "x - - y = x + (y::real)"
     8 lemma real_diff_minus_eq: "x - - y = x + (y::real)"
     9 by simp
     9 by simp
    10 declare real_diff_minus_eq [simp]
    10 declare real_diff_minus_eq [simp]
    11 
    11 
    12 (** Division and inverse **)
    12 (** Division and inverse **)
    13 
    13 
    14 lemma real_0_divide: "0/x = (0::real)"
    14 lemma real_inverse_eq_divide: "inverse (x::real) = 1/x"
    15 by (simp add: real_divide_def)
    15   by (rule Ring_and_Field.inverse_eq_divide) 
    16 declare real_0_divide [simp]
       
    17 
    16 
    18 lemma real_0_less_inverse_iff: "((0::real) < inverse x) = (0 < x)"
    17 text{*Needed in this non-standard form by Hyperreal/Transcendental*}
    19 apply (case_tac "x=0") 
    18 lemma real_0_le_divide_iff:
    20 apply (auto dest: real_inverse_less_0 simp add: linorder_neq_iff real_inverse_gt_0)
    19      "((0::real) <= x/y) = ((x <= 0 | 0 <= y) & (0 <= x | y <= 0))"
    21 done
       
    22 declare real_0_less_inverse_iff [simp]
       
    23 
       
    24 lemma real_inverse_less_0_iff: "(inverse x < (0::real)) = (x < 0)"
       
    25 apply (case_tac "x=0")
       
    26 apply (auto dest: real_inverse_less_0 simp add: linorder_neq_iff real_inverse_gt_0)
       
    27 done
       
    28 declare real_inverse_less_0_iff [simp]
       
    29 
       
    30 lemma real_0_le_inverse_iff: "((0::real) <= inverse x) = (0 <= x)"
       
    31 by (simp add: linorder_not_less [symmetric])
       
    32 declare real_0_le_inverse_iff [simp]
       
    33 
       
    34 lemma real_inverse_le_0_iff: "(inverse x <= (0::real)) = (x <= 0)"
       
    35 by (simp add: linorder_not_less [symmetric])
       
    36 declare real_inverse_le_0_iff [simp]
       
    37 
       
    38 lemma real_inverse_eq_divide: "inverse (x::real) = 1/x"
       
    39 by (simp add: real_divide_def)
       
    40 
       
    41 lemma real_0_less_divide_iff: "((0::real) < x/y) = (0 < x & 0 < y | x < 0 & y < 0)"
       
    42 by (simp add: real_divide_def real_0_less_mult_iff)
       
    43 declare real_0_less_divide_iff [of "number_of w", standard, simp]
       
    44 
       
    45 lemma real_divide_less_0_iff: "(x/y < (0::real)) = (0 < x & y < 0 | x < 0 & 0 < y)"
       
    46 by (simp add: real_divide_def real_mult_less_0_iff)
       
    47 declare real_divide_less_0_iff [of "number_of w", standard, simp]
       
    48 
       
    49 lemma real_0_le_divide_iff: "((0::real) <= x/y) = ((x <= 0 | 0 <= y) & (0 <= x | y <= 0))"
       
    50 by (simp add: real_divide_def real_0_le_mult_iff, auto)
    20 by (simp add: real_divide_def real_0_le_mult_iff, auto)
    51 declare real_0_le_divide_iff [of "number_of w", standard, simp]
       
    52 
       
    53 lemma real_divide_le_0_iff: "(x/y <= (0::real)) = ((x <= 0 | y <= 0) & (0 <= x | 0 <= y))"
       
    54 by (simp add: real_divide_def real_mult_le_0_iff, auto)
       
    55 declare real_divide_le_0_iff [of "number_of w", standard, simp]
       
    56 
       
    57 lemma real_inverse_zero_iff: "(inverse(x::real) = 0) = (x = 0)"
       
    58   by (rule Ring_and_Field.inverse_nonzero_iff_nonzero)
       
    59 
       
    60 lemma real_divide_eq_0_iff: "(x/y = 0) = (x=0 | y=(0::real))"
       
    61 by (auto simp add: real_divide_def)
       
    62 declare real_divide_eq_0_iff [simp]
       
    63 
       
    64 lemma real_divide_self_eq: "h ~= (0::real) ==> h/h = 1"
       
    65   by (rule Ring_and_Field.divide_self)
       
    66 
       
    67 
    21 
    68 
    22 
    69 (**** Factor cancellation theorems for "real" ****)
    23 (**** Factor cancellation theorems for "real" ****)
    70 
    24 
    71 (** Cancellation laws for k*m < k*n and m*k < n*k, also for <= and =,
    25 (** Cancellation laws for k*m < k*n and m*k < n*k, also for <= and =,
    72     but not (yet?) for k*m < n*k. **)
    26     but not (yet?) for k*m < n*k. **)
    73 
       
    74 lemma real_minus_less_minus: "(-y < -x) = ((x::real) < y)"
       
    75   by (rule Ring_and_Field.neg_less_iff_less)
       
    76 
       
    77 lemma real_mult_less_mono1_neg: "[| i<j;  k < (0::real) |] ==> j*k < i*k"
       
    78   by (rule Ring_and_Field.mult_strict_right_mono_neg)
       
    79 
       
    80 lemma real_mult_less_mono2_neg: "[| i<j;  k < (0::real) |] ==> k*j < k*i"
       
    81   by (rule Ring_and_Field.mult_strict_left_mono_neg)
       
    82 
       
    83 lemma real_mult_le_mono1_neg: "[| i <= j;  k <= (0::real) |] ==> j*k <= i*k"
       
    84   by (rule Ring_and_Field.mult_right_mono_neg)
       
    85 
       
    86 lemma real_mult_le_mono2_neg: "[| i <= j;  k <= (0::real) |] ==> k*j <= k*i"
       
    87   by (rule Ring_and_Field.mult_left_mono_neg)
       
    88 
    27 
    89 lemma real_mult_less_cancel2:
    28 lemma real_mult_less_cancel2:
    90      "(m*k < n*k) = (((0::real) < k & m<n) | (k < 0 & n<m))"
    29      "(m*k < n*k) = (((0::real) < k & m<n) | (k < 0 & n<m))"
    91   by (rule Ring_and_Field.mult_less_cancel_right) 
    30   by (rule Ring_and_Field.mult_less_cancel_right) 
    92 
    31 
   107 
    46 
   108 lemma real_mult_eq_cancel2: "!!k::real. (m*k = n*k) = (k = 0 | m=n)"
    47 lemma real_mult_eq_cancel2: "!!k::real. (m*k = n*k) = (k = 0 | m=n)"
   109   by (rule Ring_and_Field.mult_cancel_right) 
    48   by (rule Ring_and_Field.mult_cancel_right) 
   110 
    49 
   111 lemma real_mult_div_cancel1: "!!k::real. k~=0 ==> (k*m) / (k*n) = (m/n)"
    50 lemma real_mult_div_cancel1: "!!k::real. k~=0 ==> (k*m) / (k*n) = (m/n)"
   112 apply (simp add: real_divide_def real_inverse_distrib)
    51   by (rule Ring_and_Field.mult_divide_cancel_left) 
   113 apply (subgoal_tac "k * m * (inverse k * inverse n) = (k * inverse k) * (m * inverse n) ")
       
   114 apply simp
       
   115 apply (simp only: mult_ac)
       
   116 done
       
   117 
    52 
   118 (*For ExtractCommonTerm*)
    53 lemma real_mult_div_cancel_disj:
   119 lemma real_mult_div_cancel_disj: "(k*m) / (k*n) = (if k = (0::real) then 0 else m/n)"
    54      "(k*m) / (k*n) = (if k = (0::real) then 0 else m/n)"
   120 by (simp add: real_mult_div_cancel1)
    55   by (rule Ring_and_Field.mult_divide_cancel_eq_if) 
   121 
    56 
   122 
    57 
   123 
    58 
   124 end
    59 end