src/HOL/Real/RealOrd.thy
changeset 14293 22542982bffd
parent 14290 84fda1b39947
child 14304 cc0b4bbfbc43
equal deleted inserted replaced
14292:5b57cc196b12 14293:22542982bffd
    14 
    14 
    15 
    15 
    16 subsection{*Properties of Less-Than Or Equals*}
    16 subsection{*Properties of Less-Than Or Equals*}
    17 
    17 
    18 lemma real_leI: "~(w < z) ==> z \<le> (w::real)"
    18 lemma real_leI: "~(w < z) ==> z \<le> (w::real)"
    19 apply (unfold real_le_def, assumption)
    19 by (unfold real_le_def, assumption)
    20 done
       
    21 
    20 
    22 lemma real_leD: "z\<le>w ==> ~(w<(z::real))"
    21 lemma real_leD: "z\<le>w ==> ~(w<(z::real))"
    23 by (unfold real_le_def, assumption)
    22 by (unfold real_le_def, assumption)
    24 
       
    25 lemmas real_leE = real_leD [elim_format]
       
    26 
       
    27 lemma real_less_le_iff: "(~(w < z)) = (z \<le> (w::real))"
       
    28 by (blast intro!: real_leI real_leD)
       
    29 
    23 
    30 lemma not_real_leE: "~ z \<le> w ==> w<(z::real)"
    24 lemma not_real_leE: "~ z \<le> w ==> w<(z::real)"
    31 by (unfold real_le_def, blast)
    25 by (unfold real_le_def, blast)
    32 
    26 
    33 lemma real_le_imp_less_or_eq: "!!(x::real). x \<le> y ==> x < y | x = y"
    27 lemma real_le_imp_less_or_eq: "!!(x::real). x \<le> y ==> x < y | x = y"
   104 
    98 
   105 lemma real_less_all_real2: "~ 0 < y ==> \<forall>x. y < real_of_preal x"
    99 lemma real_less_all_real2: "~ 0 < y ==> \<forall>x. y < real_of_preal x"
   106 by (blast intro!: real_less_all_preal real_leI)
   100 by (blast intro!: real_less_all_preal real_leI)
   107 
   101 
   108 lemma real_of_preal_le_iff: "(real_of_preal m1 \<le> real_of_preal m2) = (m1 \<le> m2)"
   102 lemma real_of_preal_le_iff: "(real_of_preal m1 \<le> real_of_preal m2) = (m1 \<le> m2)"
   109 apply (auto intro!: preal_leI simp add: real_less_le_iff [symmetric])
   103 apply (auto intro!: preal_leI simp add: linorder_not_less [symmetric])
   110 apply (drule order_le_less_trans, assumption)
       
   111 apply (erule preal_less_irrefl)
       
   112 done
   104 done
   113 
   105 
   114 
   106 
   115 subsection{*Monotonicity of Addition*}
   107 subsection{*Monotonicity of Addition*}
   116 
   108 
   193 apply (simp add: real_le_def)
   185 apply (simp add: real_le_def)
   194 done
   186 done
   195 
   187 
   196 lemma real_add_left_mono: "x \<le> y ==> z + x \<le> z + (y::real)"
   188 lemma real_add_left_mono: "x \<le> y ==> z + x \<le> z + (y::real)"
   197 apply (rule real_le_eqI [THEN iffD1]) 
   189 apply (rule real_le_eqI [THEN iffD1]) 
   198  prefer 2 apply assumption; 
   190  prefer 2 apply assumption
   199 apply (simp add: real_diff_def real_add_ac);
   191 apply (simp add: real_diff_def real_add_ac)
   200 done
   192 done
   201 
   193 
   202 
   194 
   203 subsection{*The Reals Form an Ordered Field*}
   195 subsection{*The Reals Form an Ordered Field*}
   204 
   196 
   293   by (rule Ring_and_Field.inverse_minus_eq)
   285   by (rule Ring_and_Field.inverse_minus_eq)
   294 
   286 
   295 lemma real_inverse_distrib: "inverse(x*y) = inverse(x)*inverse(y::real)"
   287 lemma real_inverse_distrib: "inverse(x*y) = inverse(x)*inverse(y::real)"
   296   by (rule Ring_and_Field.inverse_mult_distrib)
   288   by (rule Ring_and_Field.inverse_mult_distrib)
   297 
   289 
   298 (** As with multiplication, pull minus signs OUT of the / operator **)
       
   299 
       
   300 lemma real_minus_divide_eq: "(-x) / (y::real) = - (x/y)"
       
   301 by (simp add: real_divide_def)
       
   302 declare real_minus_divide_eq [simp]
       
   303 
       
   304 lemma real_divide_minus_eq: "(x / -(y::real)) = - (x/y)"
       
   305 by (simp add: real_divide_def real_minus_inverse)
       
   306 declare real_divide_minus_eq [simp]
       
   307 
       
   308 lemma real_add_divide_distrib: "(x+y)/(z::real) = x/z + y/z"
   290 lemma real_add_divide_distrib: "(x+y)/(z::real) = x/z + y/z"
   309 by (simp add: real_divide_def real_add_mult_distrib)
   291   by (rule Ring_and_Field.add_divide_distrib)
   310 
       
   311 (*The following would e.g. convert (x+y)/2 to x/2 + y/2.  Sometimes that
       
   312   leads to cancellations in x or y, but is also prevents "multiplying out"
       
   313   the 2 in e.g. (x+y)/2 = 5.
       
   314 
       
   315 Addsimps [inst "z" "number_of ?w" real_add_divide_distrib]
       
   316 **)
       
   317 
       
   318 
   292 
   319 
   293 
   320 subsection{*More Lemmas*}
   294 subsection{*More Lemmas*}
   321 
   295 
   322 lemma real_add_right_cancel: "(y + (x::real)= z + x) = (y = z)"
   296 lemma real_add_right_cancel: "(y + (x::real)= z + x) = (y = z)"
   391   by (rule Ring_and_Field.mult_divide_cancel_left) 
   365   by (rule Ring_and_Field.mult_divide_cancel_left) 
   392 
   366 
   393 lemma real_mult_div_cancel_disj:
   367 lemma real_mult_div_cancel_disj:
   394      "(k*m) / (k*n) = (if k = (0::real) then 0 else m/n)"
   368      "(k*m) / (k*n) = (if k = (0::real) then 0 else m/n)"
   395   by (rule Ring_and_Field.mult_divide_cancel_eq_if) 
   369   by (rule Ring_and_Field.mult_divide_cancel_eq_if) 
   396 
       
   397 
       
   398 subsection{*For the @{text abel_cancel} Simproc (DELETE)*}
       
   399 
       
   400 lemma real_eq_eqI: "(x::real) - y = x' - y' ==> (x=y) = (x'=y')"
       
   401 apply safe
       
   402 apply (simp_all add: eq_diff_eq diff_eq_eq)
       
   403 done
       
   404 
       
   405 lemma real_add_minus_cancel: "z + ((- z) + w) = (w::real)"
       
   406 by (simp add: real_add_assoc [symmetric])
       
   407 
       
   408 lemma real_minus_add_cancel: "(-z) + (z + w) = (w::real)"
       
   409 by (simp add: real_add_assoc [symmetric])
       
   410 
       
   411 (*Deletion of other terms in the formula, seeking the -x at the front of z*)
       
   412 lemma real_add_cancel_21: "((x::real) + (y + z) = y + u) = ((x + z) = u)"
       
   413 apply (subst real_add_left_commute)
       
   414 apply (rule real_add_left_cancel)
       
   415 done
       
   416 
       
   417 (*A further rule to deal with the case that
       
   418   everything gets cancelled on the right.*)
       
   419 lemma real_add_cancel_end: "((x::real) + (y + z) = y) = (x = -z)"
       
   420 apply (subst real_add_left_commute)
       
   421 apply (rule_tac t = y in real_add_zero_right [THEN subst], subst real_add_left_cancel)
       
   422 apply (simp add: real_diff_def eq_diff_eq [symmetric])
       
   423 done
       
   424 
   370 
   425 
   371 
   426 subsection{*Inverse and Division*}
   372 subsection{*Inverse and Division*}
   427 
   373 
   428 lemma real_inverse_gt_0: "0 < x ==> 0 < inverse (x::real)"
   374 lemma real_inverse_gt_0: "0 < x ==> 0 < inverse (x::real)"
   604 lemma real_of_nat_inject [iff]: "(real (n::nat) = real m) = (n = m)"
   550 lemma real_of_nat_inject [iff]: "(real (n::nat) = real m) = (n = m)"
   605 by (auto dest: inj_real_of_nat [THEN injD])
   551 by (auto dest: inj_real_of_nat [THEN injD])
   606 
   552 
   607 lemma real_of_nat_diff [rule_format]:
   553 lemma real_of_nat_diff [rule_format]:
   608      "n \<le> m --> real (m - n) = real (m::nat) - real n"
   554      "n \<le> m --> real (m - n) = real (m::nat) - real n"
   609 apply (induct_tac "m")
   555 apply (induct_tac "m", simp)
   610 apply (simp add: );
       
   611 apply (simp add: real_diff_def Suc_diff_le le_Suc_eq real_of_nat_Suc add_ac)
   556 apply (simp add: real_diff_def Suc_diff_le le_Suc_eq real_of_nat_Suc add_ac)
   612 apply (simp add: add_left_commute [of _ "- 1"]) 
   557 apply (simp add: add_left_commute [of _ "- 1"]) 
   613 done
   558 done
   614 
   559 
   615 lemma real_of_nat_zero_iff: "(real (n::nat) = 0) = (n = 0)"
   560 lemma real_of_nat_zero_iff: "(real (n::nat) = 0) = (n = 0)"
   647 declare real_of_posnat_not_eq_zero [THEN real_mult_inv_left, simp]
   592 declare real_of_posnat_not_eq_zero [THEN real_mult_inv_left, simp]
   648 declare real_of_posnat_not_eq_zero [THEN real_mult_inv_right, simp]
   593 declare real_of_posnat_not_eq_zero [THEN real_mult_inv_right, simp]
   649 
   594 
   650 lemma real_of_posnat_ge_one: "1 <= real_of_posnat n"
   595 lemma real_of_posnat_ge_one: "1 <= real_of_posnat n"
   651 apply (simp (no_asm) add: real_of_posnat_one [symmetric])
   596 apply (simp (no_asm) add: real_of_posnat_one [symmetric])
   652 apply (induct_tac "n")
   597 apply (induct_tac "n", simp) 
   653 apply (simp add: ); 
       
   654 apply (simp add: real_of_posnat_Suc real_of_posnat_one order_less_imp_le)
   598 apply (simp add: real_of_posnat_Suc real_of_posnat_one order_less_imp_le)
   655 apply (rule add_le_cancel_right [THEN iffD1, of _ "- 1"]) 
   599 apply (rule add_le_cancel_right [THEN iffD1, of _ "- 1"]) 
   656 apply (simp add: add_assoc); 
   600 apply (simp add: add_assoc) 
   657 done
   601 done
   658 declare real_of_posnat_ge_one [simp]
   602 declare real_of_posnat_ge_one [simp]
   659 
   603 
   660 lemma real_of_posnat_real_inv_not_zero: "inverse(real_of_posnat n) ~= 0"
   604 lemma real_of_posnat_real_inv_not_zero: "inverse(real_of_posnat n) ~= 0"
   661 apply (rule real_inverse_not_zero) 
   605 apply (rule real_inverse_not_zero) 
   778 apply (simp (no_asm))
   722 apply (simp (no_asm))
   779 done
   723 done
   780 declare real_of_nat_ge_zero_cancel_iff [simp]
   724 declare real_of_nat_ge_zero_cancel_iff [simp]
   781 
   725 
   782 lemma real_of_nat_num_if: "real n = (if n=0 then 0 else 1 + real ((n::nat) - 1))"
   726 lemma real_of_nat_num_if: "real n = (if n=0 then 0 else 1 + real ((n::nat) - 1))"
   783 apply (case_tac "n")
   727 apply (case_tac "n", simp) 
   784 apply (simp add: ); 
       
   785 apply (simp add: real_of_nat_Suc add_commute)
   728 apply (simp add: real_of_nat_Suc add_commute)
   786 done
   729 done
   787 
   730 
   788 
   731 
   789 ML
   732 ML
   858 val real_linear = thm"real_linear";
   801 val real_linear = thm"real_linear";
   859 val real_neq_iff = thm"real_neq_iff";
   802 val real_neq_iff = thm"real_neq_iff";
   860 val real_linear_less2 = thm"real_linear_less2";
   803 val real_linear_less2 = thm"real_linear_less2";
   861 val real_leI = thm"real_leI";
   804 val real_leI = thm"real_leI";
   862 val real_leD = thm"real_leD";
   805 val real_leD = thm"real_leD";
   863 val real_leE = thm"real_leE";
       
   864 val real_less_le_iff = thm"real_less_le_iff";
       
   865 val not_real_leE = thm"not_real_leE";
   806 val not_real_leE = thm"not_real_leE";
   866 val real_le_imp_less_or_eq = thm"real_le_imp_less_or_eq";
   807 val real_le_imp_less_or_eq = thm"real_le_imp_less_or_eq";
   867 val real_less_or_eq_imp_le = thm"real_less_or_eq_imp_le";
   808 val real_less_or_eq_imp_le = thm"real_less_or_eq_imp_le";
   868 val real_le_less = thm"real_le_less";
   809 val real_le_less = thm"real_le_less";
   869 val real_le_refl = thm"real_le_refl";
   810 val real_le_refl = thm"real_le_refl";
   935 val real_mult_not_zero = thm"real_mult_not_zero";
   876 val real_mult_not_zero = thm"real_mult_not_zero";
   936 val real_inverse_inverse = thm"real_inverse_inverse";
   877 val real_inverse_inverse = thm"real_inverse_inverse";
   937 val real_inverse_1 = thm"real_inverse_1";
   878 val real_inverse_1 = thm"real_inverse_1";
   938 val real_minus_inverse = thm"real_minus_inverse";
   879 val real_minus_inverse = thm"real_minus_inverse";
   939 val real_inverse_distrib = thm"real_inverse_distrib";
   880 val real_inverse_distrib = thm"real_inverse_distrib";
   940 val real_minus_divide_eq = thm"real_minus_divide_eq";
       
   941 val real_divide_minus_eq = thm"real_divide_minus_eq";
       
   942 val real_add_divide_distrib = thm"real_add_divide_distrib";
   881 val real_add_divide_distrib = thm"real_add_divide_distrib";
   943 
   882 
   944 val real_of_posnat_one = thm "real_of_posnat_one";
   883 val real_of_posnat_one = thm "real_of_posnat_one";
   945 val real_of_posnat_two = thm "real_of_posnat_two";
   884 val real_of_posnat_two = thm "real_of_posnat_two";
   946 val real_of_posnat_add = thm "real_of_posnat_add";
   885 val real_of_posnat_add = thm "real_of_posnat_add";
   988 val real_of_nat_ge_zero_cancel_iff = thm "real_of_nat_ge_zero_cancel_iff";
   927 val real_of_nat_ge_zero_cancel_iff = thm "real_of_nat_ge_zero_cancel_iff";
   989 val real_of_nat_num_if = thm "real_of_nat_num_if";
   928 val real_of_nat_num_if = thm "real_of_nat_num_if";
   990 
   929 
   991 val real_minus_add_distrib = thm"real_minus_add_distrib";
   930 val real_minus_add_distrib = thm"real_minus_add_distrib";
   992 val real_add_left_cancel = thm"real_add_left_cancel";
   931 val real_add_left_cancel = thm"real_add_left_cancel";
   993 val real_add_minus_cancel = thm"real_add_minus_cancel";
       
   994 val real_minus_add_cancel = thm"real_minus_add_cancel";
       
   995 *}
   932 *}
   996 
   933 
   997 end
   934 end