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 |