src/HOL/Real/Real.ML
changeset 5143 b94cd208f073
parent 5078 7b5ea59c0275
child 5148 74919e8f221c
equal deleted inserted replaced
5142:c56aa8b59dc0 5143:b94cd208f073
   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 (*