237 by (asm_full_simp_tac (simpset() addsimps [real_add_assoc]) 1); |
237 by (asm_full_simp_tac (simpset() addsimps [real_add_assoc]) 1); |
238 by (asm_full_simp_tac (simpset() addsimps [real_add_commute, |
238 by (asm_full_simp_tac (simpset() addsimps [real_add_commute, |
239 real_add_zero_right,real_add_zero_left]) 1); |
239 real_add_zero_right,real_add_zero_left]) 1); |
240 qed "real_minus_left_ex1"; |
240 qed "real_minus_left_ex1"; |
241 |
241 |
242 Goal "!!y. x + y = 0r ==> x = %~y"; |
242 Goal "x + y = 0r ==> x = %~y"; |
243 by (cut_inst_tac [("z","y")] real_add_minus_left 1); |
243 by (cut_inst_tac [("z","y")] real_add_minus_left 1); |
244 by (res_inst_tac [("x1","y")] (real_minus_left_ex1 RS ex1E) 1); |
244 by (res_inst_tac [("x1","y")] (real_minus_left_ex1 RS ex1E) 1); |
245 by (Blast_tac 1); |
245 by (Blast_tac 1); |
246 qed "real_add_minus_eq_minus"; |
246 qed "real_add_minus_eq_minus"; |
247 |
247 |
449 Goal "!!(x::real). x ~= 0r ==> x*rinv(x) = 1r"; |
449 Goal "!!(x::real). x ~= 0r ==> x*rinv(x) = 1r"; |
450 by (auto_tac (claset() addIs [real_mult_commute RS subst], |
450 by (auto_tac (claset() addIs [real_mult_commute RS subst], |
451 simpset() addsimps [real_mult_inv_left])); |
451 simpset() addsimps [real_mult_inv_left])); |
452 qed "real_mult_inv_right"; |
452 qed "real_mult_inv_right"; |
453 |
453 |
454 Goal "!!a. (c::real) ~= 0r ==> (c*a=c*b) = (a=b)"; |
454 Goal "(c::real) ~= 0r ==> (c*a=c*b) = (a=b)"; |
455 by Auto_tac; |
455 by Auto_tac; |
456 by (dres_inst_tac [("f","%x. x*rinv c")] arg_cong 1); |
456 by (dres_inst_tac [("f","%x. x*rinv c")] arg_cong 1); |
457 by (asm_full_simp_tac (simpset() addsimps [real_mult_inv_right] @ real_mult_ac) 1); |
457 by (asm_full_simp_tac (simpset() addsimps [real_mult_inv_right] @ real_mult_ac) 1); |
458 qed "real_mult_left_cancel"; |
458 qed "real_mult_left_cancel"; |
459 |
459 |
460 Goal "!!a. (c::real) ~= 0r ==> (a*c=b*c) = (a=b)"; |
460 Goal "(c::real) ~= 0r ==> (a*c=b*c) = (a=b)"; |
461 by (Step_tac 1); |
461 by (Step_tac 1); |
462 by (dres_inst_tac [("f","%x. x*rinv c")] arg_cong 1); |
462 by (dres_inst_tac [("f","%x. x*rinv c")] arg_cong 1); |
463 by (asm_full_simp_tac (simpset() addsimps [real_mult_inv_right] @ real_mult_ac) 1); |
463 by (asm_full_simp_tac (simpset() addsimps [real_mult_inv_right] @ real_mult_ac) 1); |
464 qed "real_mult_right_cancel"; |
464 qed "real_mult_right_cancel"; |
465 |
465 |
466 Goalw [rinv_def] "!!x. x ~= 0r ==> rinv(x) ~= 0r"; |
466 Goalw [rinv_def] "x ~= 0r ==> rinv(x) ~= 0r"; |
467 by (forward_tac [real_mult_inv_left_ex] 1); |
467 by (forward_tac [real_mult_inv_left_ex] 1); |
468 by (etac exE 1); |
468 by (etac exE 1); |
469 by (rtac selectI2 1); |
469 by (rtac selectI2 1); |
470 by (auto_tac (claset(),simpset() addsimps [real_mult_0, |
470 by (auto_tac (claset(),simpset() addsimps [real_mult_0, |
471 real_zero_not_eq_one])); |
471 real_zero_not_eq_one])); |
472 qed "rinv_not_zero"; |
472 qed "rinv_not_zero"; |
473 |
473 |
474 Addsimps [real_mult_inv_left,real_mult_inv_right]; |
474 Addsimps [real_mult_inv_left,real_mult_inv_right]; |
475 |
475 |
476 Goal "!!x. x ~= 0r ==> rinv(rinv x) = x"; |
476 Goal "x ~= 0r ==> rinv(rinv x) = x"; |
477 by (res_inst_tac [("c1","rinv x")] (real_mult_right_cancel RS iffD1) 1); |
477 by (res_inst_tac [("c1","rinv x")] (real_mult_right_cancel RS iffD1) 1); |
478 by (etac rinv_not_zero 1); |
478 by (etac rinv_not_zero 1); |
479 by (auto_tac (claset() addDs [rinv_not_zero],simpset())); |
479 by (auto_tac (claset() addDs [rinv_not_zero],simpset())); |
480 qed "real_rinv_rinv"; |
480 qed "real_rinv_rinv"; |
481 |
481 |
486 by (rtac selectI2 1); |
486 by (rtac selectI2 1); |
487 by (auto_tac (claset(),simpset() addsimps |
487 by (auto_tac (claset(),simpset() addsimps |
488 [real_zero_not_eq_one RS not_sym])); |
488 [real_zero_not_eq_one RS not_sym])); |
489 qed "real_rinv_1"; |
489 qed "real_rinv_1"; |
490 |
490 |
491 Goal "!!x. x ~= 0r ==> rinv(%~x) = %~rinv(x)"; |
491 Goal "x ~= 0r ==> rinv(%~x) = %~rinv(x)"; |
492 by (res_inst_tac [("c1","%~x")] (real_mult_right_cancel RS iffD1) 1); |
492 by (res_inst_tac [("c1","%~x")] (real_mult_right_cancel RS iffD1) 1); |
493 by Auto_tac; |
493 by Auto_tac; |
494 qed "real_minus_rinv"; |
494 qed "real_minus_rinv"; |
495 |
495 |
496 (*** theorems for ordering ***) |
496 (*** theorems for ordering ***) |
635 simpset() addsimps [preal_add_assoc RS sym])); |
635 simpset() addsimps [preal_add_assoc RS sym])); |
636 by (auto_tac (claset(),simpset() addsimps [preal_add_commute])); |
636 by (auto_tac (claset(),simpset() addsimps [preal_add_commute])); |
637 qed "real_preal_trichotomy"; |
637 qed "real_preal_trichotomy"; |
638 |
638 |
639 Goal "!!x. [| !!m. x = %#m ==> P; \ |
639 Goal "!!x. [| !!m. x = %#m ==> P; \ |
640 \ x = 0r ==> P; \ |
640 \ x = 0r ==> P; \ |
641 \ !!m. x = %~(%#m) ==> P |] ==> P"; |
641 \ !!m. x = %~(%#m) ==> P |] ==> P"; |
642 by (cut_inst_tac [("x","x")] real_preal_trichotomy 1); |
642 by (cut_inst_tac [("x","x")] real_preal_trichotomy 1); |
643 by Auto_tac; |
643 by Auto_tac; |
644 qed "real_preal_trichotomyE"; |
644 qed "real_preal_trichotomyE"; |
645 |
645 |
646 Goalw [real_preal_def] "!!m1 m2. %#m1 < %#m2 ==> m1 < m2"; |
646 Goalw [real_preal_def] "%#m1 < %#m2 ==> m1 < m2"; |
647 by (auto_tac (claset(),simpset() addsimps [real_less_def] @ preal_add_ac)); |
647 by (auto_tac (claset(),simpset() addsimps [real_less_def] @ preal_add_ac)); |
648 by (auto_tac (claset(),simpset() addsimps [preal_add_assoc RS sym])); |
648 by (auto_tac (claset(),simpset() addsimps [preal_add_assoc RS sym])); |
649 by (auto_tac (claset(),simpset() addsimps preal_add_ac)); |
649 by (auto_tac (claset(),simpset() addsimps preal_add_ac)); |
650 qed "real_preal_lessD"; |
650 qed "real_preal_lessD"; |
651 |
651 |
652 Goal "!!m1 m2. m1 < m2 ==> %#m1 < %#m2"; |
652 Goal "m1 < m2 ==> %#m1 < %#m2"; |
653 by (dtac preal_less_add_left_Ex 1); |
653 by (dtac preal_less_add_left_Ex 1); |
654 by (auto_tac (claset(),simpset() addsimps [real_preal_add, |
654 by (auto_tac (claset(),simpset() addsimps [real_preal_add, |
655 real_preal_def,real_less_def])); |
655 real_preal_def,real_less_def])); |
656 by (REPEAT(rtac exI 1)); |
656 by (REPEAT(rtac exI 1)); |
657 by (EVERY[rtac conjI 1, rtac conjI 2]); |
657 by (EVERY[rtac conjI 1, rtac conjI 2]); |
741 by (cut_facts_tac [real_preal_minus_less_all] 1); |
741 by (cut_facts_tac [real_preal_minus_less_all] 1); |
742 by (fast_tac (claset() addDs [real_less_trans] |
742 by (fast_tac (claset() addDs [real_less_trans] |
743 addEs [real_less_irrefl]) 1); |
743 addEs [real_less_irrefl]) 1); |
744 qed "real_preal_not_minus_gt_all"; |
744 qed "real_preal_not_minus_gt_all"; |
745 |
745 |
746 Goal "!!m1 m2. %~ %#m1 < %~ %#m2 ==> %#m2 < %#m1"; |
746 Goal "%~ %#m1 < %~ %#m2 ==> %#m2 < %#m1"; |
747 by (auto_tac (claset(),simpset() addsimps |
747 by (auto_tac (claset(),simpset() addsimps |
748 [real_preal_def,real_less_def,real_minus])); |
748 [real_preal_def,real_less_def,real_minus])); |
749 by (REPEAT(rtac exI 1)); |
749 by (REPEAT(rtac exI 1)); |
750 by (EVERY[rtac conjI 1, rtac conjI 2]); |
750 by (EVERY[rtac conjI 1, rtac conjI 2]); |
751 by (REPEAT(Fast_tac 2)); |
751 by (REPEAT(Fast_tac 2)); |
752 by (auto_tac (claset(),simpset() addsimps preal_add_ac)); |
752 by (auto_tac (claset(),simpset() addsimps preal_add_ac)); |
753 by (asm_full_simp_tac (simpset() addsimps [preal_add_assoc RS sym]) 1); |
753 by (asm_full_simp_tac (simpset() addsimps [preal_add_assoc RS sym]) 1); |
754 by (auto_tac (claset(),simpset() addsimps preal_add_ac)); |
754 by (auto_tac (claset(),simpset() addsimps preal_add_ac)); |
755 qed "real_preal_minus_less_rev1"; |
755 qed "real_preal_minus_less_rev1"; |
756 |
756 |
757 Goal "!!m1 m2. %#m1 < %#m2 ==> %~ %#m2 < %~ %#m1"; |
757 Goal "%#m1 < %#m2 ==> %~ %#m2 < %~ %#m1"; |
758 by (auto_tac (claset(),simpset() addsimps |
758 by (auto_tac (claset(),simpset() addsimps |
759 [real_preal_def,real_less_def,real_minus])); |
759 [real_preal_def,real_less_def,real_minus])); |
760 by (REPEAT(rtac exI 1)); |
760 by (REPEAT(rtac exI 1)); |
761 by (EVERY[rtac conjI 1, rtac conjI 2]); |
761 by (EVERY[rtac conjI 1, rtac conjI 2]); |
762 by (REPEAT(Fast_tac 2)); |
762 by (REPEAT(Fast_tac 2)); |
788 by Auto_tac; |
788 by Auto_tac; |
789 qed "real_linear_less2"; |
789 qed "real_linear_less2"; |
790 |
790 |
791 (*** Properties of <= ***) |
791 (*** Properties of <= ***) |
792 |
792 |
793 Goalw [real_le_def] "!!w. ~(w < z) ==> z <= (w::real)"; |
793 Goalw [real_le_def] "~(w < z) ==> z <= (w::real)"; |
794 by (assume_tac 1); |
794 by (assume_tac 1); |
795 qed "real_leI"; |
795 qed "real_leI"; |
796 |
796 |
797 Goalw [real_le_def] "!!w. z<=w ==> ~(w<(z::real))"; |
797 Goalw [real_le_def] "z<=w ==> ~(w<(z::real))"; |
798 by (assume_tac 1); |
798 by (assume_tac 1); |
799 qed "real_leD"; |
799 qed "real_leD"; |
800 |
800 |
801 val real_leE = make_elim real_leD; |
801 val real_leE = make_elim real_leD; |
802 |
802 |
803 Goal "!!w. (~(w < z)) = (z <= (w::real))"; |
803 Goal "(~(w < z)) = (z <= (w::real))"; |
804 by (fast_tac (claset() addSIs [real_leI,real_leD]) 1); |
804 by (fast_tac (claset() addSIs [real_leI,real_leD]) 1); |
805 qed "real_less_le_iff"; |
805 qed "real_less_le_iff"; |
806 |
806 |
807 Goalw [real_le_def] "!!z. ~ z <= w ==> w<(z::real)"; |
807 Goalw [real_le_def] "~ z <= w ==> w<(z::real)"; |
808 by (Fast_tac 1); |
808 by (Fast_tac 1); |
809 qed "not_real_leE"; |
809 qed "not_real_leE"; |
810 |
810 |
811 Goalw [real_le_def] "!!z. z < w ==> z <= (w::real)"; |
811 Goalw [real_le_def] "z < w ==> z <= (w::real)"; |
812 by (fast_tac (claset() addEs [real_less_asym]) 1); |
812 by (fast_tac (claset() addEs [real_less_asym]) 1); |
813 qed "real_less_imp_le"; |
813 qed "real_less_imp_le"; |
814 |
814 |
815 Goalw [real_le_def] "!!(x::real). x <= y ==> x < y | x = y"; |
815 Goalw [real_le_def] "!!(x::real). x <= y ==> x < y | x = y"; |
816 by (cut_facts_tac [real_linear] 1); |
816 by (cut_facts_tac [real_linear] 1); |
817 by (fast_tac (claset() addEs [real_less_irrefl,real_less_asym]) 1); |
817 by (fast_tac (claset() addEs [real_less_irrefl,real_less_asym]) 1); |
818 qed "real_le_imp_less_or_eq"; |
818 qed "real_le_imp_less_or_eq"; |
819 |
819 |
820 Goalw [real_le_def] "!!z. z<w | z=w ==> z <=(w::real)"; |
820 Goalw [real_le_def] "z<w | z=w ==> z <=(w::real)"; |
821 by (cut_facts_tac [real_linear] 1); |
821 by (cut_facts_tac [real_linear] 1); |
822 by (fast_tac (claset() addEs [real_less_irrefl,real_less_asym]) 1); |
822 by (fast_tac (claset() addEs [real_less_irrefl,real_less_asym]) 1); |
823 qed "real_less_or_eq_imp_le"; |
823 qed "real_less_or_eq_imp_le"; |
824 |
824 |
825 Goal "(x <= (y::real)) = (x < y | x=y)"; |
825 Goal "(x <= (y::real)) = (x < y | x=y)"; |
838 Goal "!! (i::real). [| i < j; j <= k |] ==> i < k"; |
838 Goal "!! (i::real). [| i < j; j <= k |] ==> i < k"; |
839 by (dtac real_le_imp_less_or_eq 1); |
839 by (dtac real_le_imp_less_or_eq 1); |
840 by (fast_tac (claset() addIs [real_less_trans]) 1); |
840 by (fast_tac (claset() addIs [real_less_trans]) 1); |
841 qed "real_less_le_trans"; |
841 qed "real_less_le_trans"; |
842 |
842 |
843 Goal "!!i. [| i <= j; j <= k |] ==> i <= (k::real)"; |
843 Goal "[| i <= j; j <= k |] ==> i <= (k::real)"; |
844 by (EVERY1 [dtac real_le_imp_less_or_eq, dtac real_le_imp_less_or_eq, |
844 by (EVERY1 [dtac real_le_imp_less_or_eq, dtac real_le_imp_less_or_eq, |
845 rtac real_less_or_eq_imp_le, fast_tac (claset() addIs [real_less_trans])]); |
845 rtac real_less_or_eq_imp_le, fast_tac (claset() addIs [real_less_trans])]); |
846 qed "real_le_trans"; |
846 qed "real_le_trans"; |
847 |
847 |
848 Goal "!!z. [| z <= w; w <= z |] ==> z = (w::real)"; |
848 Goal "[| z <= w; w <= z |] ==> z = (w::real)"; |
849 by (EVERY1 [dtac real_le_imp_less_or_eq, dtac real_le_imp_less_or_eq, |
849 by (EVERY1 [dtac real_le_imp_less_or_eq, dtac real_le_imp_less_or_eq, |
850 fast_tac (claset() addEs [real_less_irrefl,real_less_asym])]); |
850 fast_tac (claset() addEs [real_less_irrefl,real_less_asym])]); |
851 qed "real_le_anti_sym"; |
851 qed "real_le_anti_sym"; |
852 |
852 |
853 Goal "!!x. [| ~ y < x; y ~= x |] ==> x < (y::real)"; |
853 Goal "[| ~ y < x; y ~= x |] ==> x < (y::real)"; |
854 by (rtac not_real_leE 1); |
854 by (rtac not_real_leE 1); |
855 by (fast_tac (claset() addDs [real_le_imp_less_or_eq]) 1); |
855 by (fast_tac (claset() addDs [real_le_imp_less_or_eq]) 1); |
856 qed "not_less_not_eq_real_less"; |
856 qed "not_less_not_eq_real_less"; |
857 |
857 |
858 Goal "(0r < %~R) = (R < 0r)"; |
858 Goal "(0r < %~R) = (R < 0r)"; |
877 by (cut_inst_tac [("x","x")] real_preal_trichotomy 1); |
877 by (cut_inst_tac [("x","x")] real_preal_trichotomy 1); |
878 by (blast_tac (claset() addSEs [real_less_irrefl, |
878 by (blast_tac (claset() addSEs [real_less_irrefl, |
879 real_preal_not_minus_gt_zero RS notE]) 1); |
879 real_preal_not_minus_gt_zero RS notE]) 1); |
880 qed "real_gt_zero_preal_Ex"; |
880 qed "real_gt_zero_preal_Ex"; |
881 |
881 |
882 Goal "!!x. %#z < x ==> ? y. x = %#y"; |
882 Goal "%#z < x ==> ? y. x = %#y"; |
883 by (blast_tac (claset() addSDs [real_preal_zero_less RS real_less_trans] |
883 by (blast_tac (claset() addSDs [real_preal_zero_less RS real_less_trans] |
884 addIs [real_gt_zero_preal_Ex RS iffD1]) 1); |
884 addIs [real_gt_zero_preal_Ex RS iffD1]) 1); |
885 qed "real_gt_preal_preal_Ex"; |
885 qed "real_gt_preal_preal_Ex"; |
886 |
886 |
887 Goal "!!x. %#z <= x ==> ? y. x = %#y"; |
887 Goal "%#z <= x ==> ? y. x = %#y"; |
888 by (blast_tac (claset() addDs [real_le_imp_less_or_eq, |
888 by (blast_tac (claset() addDs [real_le_imp_less_or_eq, |
889 real_gt_preal_preal_Ex]) 1); |
889 real_gt_preal_preal_Ex]) 1); |
890 qed "real_ge_preal_preal_Ex"; |
890 qed "real_ge_preal_preal_Ex"; |
891 |
891 |
892 Goal "!!y. y <= 0r ==> !x. y < %#x"; |
892 Goal "y <= 0r ==> !x. y < %#x"; |
893 by (auto_tac (claset() addEs [real_le_imp_less_or_eq RS disjE] |
893 by (auto_tac (claset() addEs [real_le_imp_less_or_eq RS disjE] |
894 addIs [real_preal_zero_less RSN(2,real_less_trans)], |
894 addIs [real_preal_zero_less RSN(2,real_less_trans)], |
895 simpset() addsimps [real_preal_zero_less])); |
895 simpset() addsimps [real_preal_zero_less])); |
896 qed "real_less_all_preal"; |
896 qed "real_less_all_preal"; |
897 |
897 |
898 Goal "!!y. ~ 0r < y ==> !x. y < %#x"; |
898 Goal "~ 0r < y ==> !x. y < %#x"; |
899 by (blast_tac (claset() addSIs [real_less_all_preal,real_leI]) 1); |
899 by (blast_tac (claset() addSIs [real_less_all_preal,real_leI]) 1); |
900 qed "real_less_all_real2"; |
900 qed "real_less_all_real2"; |
901 |
901 |
902 (**** Derive alternative definition for real_less ****) |
902 (**** Derive alternative definition for real_less ****) |
903 (** lemma **) |
903 (** lemma **) |
935 real_add_minus_left,real_add_zero_left]) 1); |
935 real_add_minus_left,real_add_zero_left]) 1); |
936 qed "real_less_add_positive_left_Ex"; |
936 qed "real_less_add_positive_left_Ex"; |
937 |
937 |
938 (* lemmas *) |
938 (* lemmas *) |
939 (** change naff name(s)! **) |
939 (** change naff name(s)! **) |
940 Goal "!!S. (W < S) ==> (0r < S + %~W)"; |
940 Goal "(W < S) ==> (0r < S + %~W)"; |
941 by (dtac real_less_add_positive_left_Ex 1); |
941 by (dtac real_less_add_positive_left_Ex 1); |
942 by (auto_tac (claset(),simpset() addsimps [real_add_minus, |
942 by (auto_tac (claset(),simpset() addsimps [real_add_minus, |
943 real_add_zero_right] @ real_add_ac)); |
943 real_add_zero_right] @ real_add_ac)); |
944 qed "real_less_sum_gt_zero"; |
944 qed "real_less_sum_gt_zero"; |
945 |
945 |
946 Goal "!!S. T = S + W ==> S = T + %~W"; |
946 Goal "!!S. T = S + W ==> S = T + %~W"; |
947 by (asm_simp_tac (simpset() addsimps [real_add_minus, |
947 by (asm_simp_tac (simpset() addsimps [real_add_minus, real_add_zero_right] |
948 real_add_zero_right] @ real_add_ac) 1); |
948 @ real_add_ac) 1); |
949 qed "real_lemma_change_eq_subj"; |
949 qed "real_lemma_change_eq_subj"; |
950 |
950 |
951 (* FIXME: long! *) |
951 (* FIXME: long! *) |
952 Goal "!!W. (0r < S + %~W) ==> (W < S)"; |
952 Goal "(0r < S + %~W) ==> (W < S)"; |
953 by (rtac ccontr 1); |
953 by (rtac ccontr 1); |
954 by (dtac (real_leI RS real_le_imp_less_or_eq) 1); |
954 by (dtac (real_leI RS real_le_imp_less_or_eq) 1); |
955 by (auto_tac (claset(), |
955 by (auto_tac (claset(), |
956 simpset() addsimps [real_less_not_refl,real_add_minus])); |
956 simpset() addsimps [real_less_not_refl,real_add_minus])); |
957 by (EVERY1[dtac real_less_add_positive_left_Ex, etac exE, etac conjE]); |
957 by (EVERY1[dtac real_less_add_positive_left_Ex, etac exE, etac conjE]); |
974 by (rtac (real_less_sum_gt_0_iff RS subst) 1); |
974 by (rtac (real_less_sum_gt_0_iff RS subst) 1); |
975 by (res_inst_tac [("W1","x")] (real_less_sum_gt_0_iff RS subst) 1); |
975 by (res_inst_tac [("W1","x")] (real_less_sum_gt_0_iff RS subst) 1); |
976 by (simp_tac (simpset() addsimps [real_add_commute]) 1); |
976 by (simp_tac (simpset() addsimps [real_add_commute]) 1); |
977 qed "real_less_swap_iff"; |
977 qed "real_less_swap_iff"; |
978 |
978 |
979 Goal "!!T. [| R + L = S; 0r < L |] ==> R < S"; |
979 Goal "[| R + L = S; 0r < L |] ==> R < S"; |
980 by (rtac (real_less_sum_gt_0_iff RS iffD1) 1); |
980 by (rtac (real_less_sum_gt_0_iff RS iffD1) 1); |
981 by (auto_tac (claset(),simpset() addsimps [ |
981 by (auto_tac (claset(),simpset() addsimps [ |
982 real_add_minus,real_add_zero_right] @ real_add_ac)); |
982 real_add_minus,real_add_zero_right] @ real_add_ac)); |
983 qed "real_lemma_add_positive_imp_less"; |
983 qed "real_lemma_add_positive_imp_less"; |
984 |
984 |
1073 qed "real_zero_less_one"; |
1073 qed "real_zero_less_one"; |
1074 |
1074 |
1075 (*** Completeness of reals ***) |
1075 (*** Completeness of reals ***) |
1076 (** use supremum property of preal and theorems about real_preal **) |
1076 (** use supremum property of preal and theorems about real_preal **) |
1077 (*** a few lemmas ***) |
1077 (*** a few lemmas ***) |
1078 Goal "!!P y. ! x:P. 0r < x ==> ((? x:P. y < x) = (? X. %#X : P & y < %#X))"; |
1078 Goal "! x:P. 0r < x ==> ((? x:P. y < x) = (? X. %#X : P & y < %#X))"; |
1079 by (blast_tac (claset() addSDs [bspec,real_gt_zero_preal_Ex RS iffD1]) 1); |
1079 by (blast_tac (claset() addSDs [bspec,real_gt_zero_preal_Ex RS iffD1]) 1); |
1080 qed "real_sup_lemma1"; |
1080 qed "real_sup_lemma1"; |
1081 |
1081 |
1082 Goal "!!P. [| ! x:P. 0r < x; ? x. x: P; ? y. !x: P. x < y |] \ |
1082 Goal "[| ! x:P. 0r < x; ? x. x: P; ? y. !x: P. x < y |] \ |
1083 \ ==> (? X. X: {w. %#w : P}) & (? Y. !X: {w. %#w : P}. X < Y)"; |
1083 \ ==> (? X. X: {w. %#w : P}) & (? Y. !X: {w. %#w : P}. X < Y)"; |
1084 by (rtac conjI 1); |
1084 by (rtac conjI 1); |
1085 by (blast_tac (claset() addDs [bspec,real_gt_zero_preal_Ex RS iffD1]) 1); |
1085 by (blast_tac (claset() addDs [bspec,real_gt_zero_preal_Ex RS iffD1]) 1); |
1086 by Auto_tac; |
1086 by Auto_tac; |
1087 by (dtac bspec 1 THEN assume_tac 1); |
1087 by (dtac bspec 1 THEN assume_tac 1); |
1099 -------------------------------------------------------------*) |
1099 -------------------------------------------------------------*) |
1100 |
1100 |
1101 (* Supremum property for the set of positive reals *) |
1101 (* Supremum property for the set of positive reals *) |
1102 (* FIXME: long proof - can be improved - need only have one case split *) |
1102 (* FIXME: long proof - can be improved - need only have one case split *) |
1103 (* will do for now *) |
1103 (* will do for now *) |
1104 Goal "!!P. [| ! x:P. 0r < x; ? x. x: P; ? y. !x: P. x < y |] \ |
1104 Goal "[| ! x:P. 0r < x; ? x. x: P; ? y. !x: P. x < y |] \ |
1105 \ ==> (? S. !y. (? x: P. y < x) = (y < S))"; |
1105 \ ==> (? S. !y. (? x: P. y < x) = (y < S))"; |
1106 by (res_inst_tac [("x","%#psup({w. %#w : P})")] exI 1); |
1106 by (res_inst_tac [("x","%#psup({w. %#w : P})")] exI 1); |
1107 by Auto_tac; |
1107 by Auto_tac; |
1108 by (forward_tac [real_sup_lemma2] 1 THEN Auto_tac); |
1108 by (forward_tac [real_sup_lemma2] 1 THEN Auto_tac); |
1109 by (case_tac "0r < ya" 1); |
1109 by (case_tac "0r < ya" 1); |
1154 by (dres_inst_tac [("C","%~C")] real_add_less_mono2 1); |
1154 by (dres_inst_tac [("C","%~C")] real_add_less_mono2 1); |
1155 by (asm_full_simp_tac (simpset() addsimps [real_add_assoc RS sym, |
1155 by (asm_full_simp_tac (simpset() addsimps [real_add_assoc RS sym, |
1156 real_add_minus_left,real_add_zero_left]) 1); |
1156 real_add_minus_left,real_add_zero_left]) 1); |
1157 qed "real_less_add_left_cancel"; |
1157 qed "real_less_add_left_cancel"; |
1158 |
1158 |
1159 Goal "!!x. [| 0r < x; 0r < y |] ==> 0r < x + y"; |
1159 Goal "[| 0r < x; 0r < y |] ==> 0r < x + y"; |
1160 by (REPEAT(dtac (real_gt_zero_preal_Ex RS iffD1) 1)); |
1160 by (REPEAT(dtac (real_gt_zero_preal_Ex RS iffD1) 1)); |
1161 by (rtac (real_gt_zero_preal_Ex RS iffD2) 1); |
1161 by (rtac (real_gt_zero_preal_Ex RS iffD2) 1); |
1162 by (Step_tac 1); |
1162 by (Step_tac 1); |
1163 by (res_inst_tac [("x","y + ya")] exI 1); |
1163 by (res_inst_tac [("x","y + ya")] exI 1); |
1164 by (full_simp_tac (simpset() addsimps [real_preal_add]) 1); |
1164 by (full_simp_tac (simpset() addsimps [real_preal_add]) 1); |
1265 Goalw [real_nat_def] "0r < %%#n"; |
1265 Goalw [real_nat_def] "0r < %%#n"; |
1266 by (rtac (real_gt_zero_preal_Ex RS iffD2) 1); |
1266 by (rtac (real_gt_zero_preal_Ex RS iffD2) 1); |
1267 by (Blast_tac 1); |
1267 by (Blast_tac 1); |
1268 qed "real_nat_less_zero"; |
1268 qed "real_nat_less_zero"; |
1269 |
1269 |
1270 Goal "!!n. 1r <= %%#n"; |
1270 Goal "1r <= %%#n"; |
1271 by (simp_tac (simpset() addsimps [real_nat_one RS sym]) 1); |
1271 by (simp_tac (simpset() addsimps [real_nat_one RS sym]) 1); |
1272 by (nat_ind_tac "n" 1); |
1272 by (nat_ind_tac "n" 1); |
1273 by (auto_tac (claset(),simpset () |
1273 by (auto_tac (claset(),simpset () |
1274 addsimps [real_nat_Suc,real_le_refl,real_nat_one])); |
1274 addsimps [real_nat_Suc,real_le_refl,real_nat_one])); |
1275 by (res_inst_tac [("t","1r")] (real_add_zero_left RS subst) 1); |
1275 by (res_inst_tac [("t","1r")] (real_add_zero_left RS subst) 1); |
1282 Goal "rinv(%%#n) ~= 0r"; |
1282 Goal "rinv(%%#n) ~= 0r"; |
1283 by (rtac ((real_nat_less_zero RS |
1283 by (rtac ((real_nat_less_zero RS |
1284 real_not_refl2 RS not_sym) RS rinv_not_zero) 1); |
1284 real_not_refl2 RS not_sym) RS rinv_not_zero) 1); |
1285 qed "real_nat_rinv_not_zero"; |
1285 qed "real_nat_rinv_not_zero"; |
1286 |
1286 |
1287 Goal "!!x. rinv(%%#x) = rinv(%%#y) ==> x = y"; |
1287 Goal "rinv(%%#x) = rinv(%%#y) ==> x = y"; |
1288 by (rtac (inj_real_nat RS injD) 1); |
1288 by (rtac (inj_real_nat RS injD) 1); |
1289 by (res_inst_tac [("n2","x")] |
1289 by (res_inst_tac [("n2","x")] |
1290 (real_nat_rinv_not_zero RS real_mult_left_cancel RS iffD1) 1); |
1290 (real_nat_rinv_not_zero RS real_mult_left_cancel RS iffD1) 1); |
1291 by (full_simp_tac (simpset() addsimps [(real_nat_less_zero RS |
1291 by (full_simp_tac (simpset() addsimps [(real_nat_less_zero RS |
1292 real_not_refl2 RS not_sym) RS real_mult_inv_left]) 1); |
1292 real_not_refl2 RS not_sym) RS real_mult_inv_left]) 1); |
1293 by (asm_full_simp_tac (simpset() addsimps [(real_nat_less_zero RS |
1293 by (asm_full_simp_tac (simpset() addsimps [(real_nat_less_zero RS |
1294 real_not_refl2 RS not_sym)]) 1); |
1294 real_not_refl2 RS not_sym)]) 1); |
1295 qed "real_nat_rinv_inj"; |
1295 qed "real_nat_rinv_inj"; |
1296 |
1296 |
1297 Goal "!!x. 0r < x ==> 0r < rinv x"; |
1297 Goal "0r < x ==> 0r < rinv x"; |
1298 by (EVERY1[rtac ccontr, dtac real_leI]); |
1298 by (EVERY1[rtac ccontr, dtac real_leI]); |
1299 by (forward_tac [real_minus_zero_less_iff2 RS iffD2] 1); |
1299 by (forward_tac [real_minus_zero_less_iff2 RS iffD2] 1); |
1300 by (forward_tac [real_not_refl2 RS not_sym] 1); |
1300 by (forward_tac [real_not_refl2 RS not_sym] 1); |
1301 by (dtac (real_not_refl2 RS not_sym RS rinv_not_zero) 1); |
1301 by (dtac (real_not_refl2 RS not_sym RS rinv_not_zero) 1); |
1302 by (EVERY1[dtac real_le_imp_less_or_eq, Step_tac]); |
1302 by (EVERY1[dtac real_le_imp_less_or_eq, Step_tac]); |
1303 by (dtac real_mult_less_zero1 1 THEN assume_tac 1); |
1303 by (dtac real_mult_less_zero1 1 THEN assume_tac 1); |
1304 by (auto_tac (claset() addIs [real_zero_less_one RS real_less_asym], |
1304 by (auto_tac (claset() addIs [real_zero_less_one RS real_less_asym], |
1305 simpset() addsimps [real_minus_mult_eq1 RS sym])); |
1305 simpset() addsimps [real_minus_mult_eq1 RS sym])); |
1306 qed "real_rinv_gt_zero"; |
1306 qed "real_rinv_gt_zero"; |
1307 |
1307 |
1308 Goal "!!x. x < 0r ==> rinv x < 0r"; |
1308 Goal "x < 0r ==> rinv x < 0r"; |
1309 by (forward_tac [real_not_refl2] 1); |
1309 by (forward_tac [real_not_refl2] 1); |
1310 by (dtac (real_minus_zero_less_iff RS iffD2) 1); |
1310 by (dtac (real_minus_zero_less_iff RS iffD2) 1); |
1311 by (rtac (real_minus_zero_less_iff RS iffD1) 1); |
1311 by (rtac (real_minus_zero_less_iff RS iffD1) 1); |
1312 by (dtac (real_minus_rinv RS sym) 1); |
1312 by (dtac (real_minus_rinv RS sym) 1); |
1313 by (auto_tac (claset() addIs [real_rinv_gt_zero], |
1313 by (auto_tac (claset() addIs [real_rinv_gt_zero], |
1368 Goal "!!(x::real). [| 0r<z; z*x<z*y |] ==> x<y"; |
1368 Goal "!!(x::real). [| 0r<z; z*x<z*y |] ==> x<y"; |
1369 by (etac real_mult_less_cancel1 1); |
1369 by (etac real_mult_less_cancel1 1); |
1370 by (asm_full_simp_tac (simpset() addsimps [real_mult_commute]) 1); |
1370 by (asm_full_simp_tac (simpset() addsimps [real_mult_commute]) 1); |
1371 qed "real_mult_less_cancel2"; |
1371 qed "real_mult_less_cancel2"; |
1372 |
1372 |
1373 Goal "!!z. 0r < z ==> (x*z < y*z) = (x < y)"; |
1373 Goal "0r < z ==> (x*z < y*z) = (x < y)"; |
1374 by (blast_tac (claset() addIs [real_mult_less_mono1, |
1374 by (blast_tac (claset() addIs [real_mult_less_mono1, |
1375 real_mult_less_cancel1]) 1); |
1375 real_mult_less_cancel1]) 1); |
1376 qed "real_mult_less_iff1"; |
1376 qed "real_mult_less_iff1"; |
1377 |
1377 |
1378 Goal "!!z. 0r < z ==> (z*x < z*y) = (x < y)"; |
1378 Goal "0r < z ==> (z*x < z*y) = (x < y)"; |
1379 by (blast_tac (claset() addIs [real_mult_less_mono2, |
1379 by (blast_tac (claset() addIs [real_mult_less_mono2, |
1380 real_mult_less_cancel2]) 1); |
1380 real_mult_less_cancel2]) 1); |
1381 qed "real_mult_less_iff2"; |
1381 qed "real_mult_less_iff2"; |
1382 |
1382 |
1383 Addsimps [real_mult_less_iff1,real_mult_less_iff2]; |
1383 Addsimps [real_mult_less_iff1,real_mult_less_iff2]; |
1430 by Auto_tac; |
1430 by Auto_tac; |
1431 qed "real_nat_less_iff"; |
1431 qed "real_nat_less_iff"; |
1432 |
1432 |
1433 Addsimps [real_nat_less_iff]; |
1433 Addsimps [real_nat_less_iff]; |
1434 |
1434 |
1435 Goal "!!u. 0r < u ==> (u < rinv (%%#n)) = (%%#n < rinv(u))"; |
1435 Goal "0r < u ==> (u < rinv (%%#n)) = (%%#n < rinv(u))"; |
1436 by (Step_tac 1); |
1436 by (Step_tac 1); |
1437 by (res_inst_tac [("n2","n")] (real_nat_less_zero RS |
1437 by (res_inst_tac [("n2","n")] (real_nat_less_zero RS |
1438 real_rinv_gt_zero RS real_mult_less_cancel1) 1); |
1438 real_rinv_gt_zero RS real_mult_less_cancel1) 1); |
1439 by (res_inst_tac [("x1","u")] ( real_rinv_gt_zero |
1439 by (res_inst_tac [("x1","u")] ( real_rinv_gt_zero |
1440 RS real_mult_less_cancel1) 2); |
1440 RS real_mult_less_cancel1) 2); |
1445 real_mult_less_cancel2) 3); |
1445 real_mult_less_cancel2) 3); |
1446 by (auto_tac (claset(),simpset() addsimps [real_nat_less_zero, |
1446 by (auto_tac (claset(),simpset() addsimps [real_nat_less_zero, |
1447 real_not_refl2 RS not_sym,real_mult_assoc RS sym])); |
1447 real_not_refl2 RS not_sym,real_mult_assoc RS sym])); |
1448 qed "real_nat_less_rinv_iff"; |
1448 qed "real_nat_less_rinv_iff"; |
1449 |
1449 |
1450 Goal "!!x. 0r < u ==> (u = rinv(%%#n)) = (%%#n = rinv u)"; |
1450 Goal "0r < u ==> (u = rinv(%%#n)) = (%%#n = rinv u)"; |
1451 by (auto_tac (claset(),simpset() addsimps [real_rinv_rinv, |
1451 by (auto_tac (claset(),simpset() addsimps [real_rinv_rinv, |
1452 real_nat_less_zero,real_not_refl2 RS not_sym])); |
1452 real_nat_less_zero,real_not_refl2 RS not_sym])); |
1453 qed "real_nat_rinv_eq_iff"; |
1453 qed "real_nat_rinv_eq_iff"; |
1454 |
1454 |
1455 (* |
1455 (* |