src/HOL/Real/Hyperreal/NSA.ML
changeset 10715 c838477b5c18
parent 10712 351ba950d4d9
child 10720 1ce5a189f672
equal deleted inserted replaced
10714:07f75bf77a33 10715:c838477b5c18
    30 Goalw [SReal_def] "x: SReal ==> inverse x : SReal";
    30 Goalw [SReal_def] "x: SReal ==> inverse x : SReal";
    31 by (auto_tac (claset(), simpset() addsimps [hypreal_of_real_inverse]));
    31 by (auto_tac (claset(), simpset() addsimps [hypreal_of_real_inverse]));
    32 qed "SReal_inverse";
    32 qed "SReal_inverse";
    33 
    33 
    34 Goalw [SReal_def] "x: SReal ==> -x : SReal";
    34 Goalw [SReal_def] "x: SReal ==> -x : SReal";
    35 by (auto_tac (claset(), simpset() addsimps [hypreal_of_real_minus RS sym]));
    35 by (blast_tac (claset() addIs [hypreal_of_real_minus RS sym]) 1); 
    36 qed "SReal_minus";
    36 qed "SReal_minus";
    37 
    37 
    38 Goal "[| x + y : SReal; y: SReal |] ==> x: SReal";
    38 Goal "[| x + y : SReal; y: SReal |] ==> x: SReal";
    39 by (dres_inst_tac [("x","y")] SReal_minus 1);
    39 by (dres_inst_tac [("x","y")] SReal_minus 1);
    40 by (dtac SReal_add 1);
    40 by (dtac SReal_add 1);
   218 Goalw [HFinite_def] "[|x : HFinite;y : HFinite|] ==> (x*y) : HFinite";
   218 Goalw [HFinite_def] "[|x : HFinite;y : HFinite|] ==> (x*y) : HFinite";
   219 by (blast_tac (claset() addSIs [SReal_mult,hrabs_mult_less]) 1);
   219 by (blast_tac (claset() addSIs [SReal_mult,hrabs_mult_less]) 1);
   220 qed "HFinite_mult";
   220 qed "HFinite_mult";
   221 
   221 
   222 Goalw [HFinite_def] "(x:HFinite)=(-x:HFinite)";
   222 Goalw [HFinite_def] "(x:HFinite)=(-x:HFinite)";
   223 by (simp_tac (simpset() addsimps [hrabs_minus_cancel]) 1);
   223 by (Simp_tac 1);
   224 qed "HFinite_minus_iff";
   224 qed "HFinite_minus_iff";
   225 
   225 
   226 Goal "[| x: HFinite; y: HFinite|] ==> (x + -y): HFinite";
   226 Goal "[| x: HFinite; y: HFinite|] ==> (x + -y): HFinite";
   227 by (blast_tac (claset() addDs [HFinite_minus_iff RS iffD1] addIs [HFinite_add]) 1);
   227 by (blast_tac (claset() addDs [HFinite_minus_iff RS iffD1] addIs [HFinite_add]) 1);
   228 qed "HFinite_add_minus";
   228 qed "HFinite_add_minus";
   296 by (auto_tac (claset() addSDs [bspec] addIs [hrabs_add_less], simpset()));
   296 by (auto_tac (claset() addSDs [bspec] addIs [hrabs_add_less], simpset()));
   297 qed "Infinitesimal_add";
   297 qed "Infinitesimal_add";
   298 
   298 
   299 Goalw [Infinitesimal_def] 
   299 Goalw [Infinitesimal_def] 
   300      "(x:Infinitesimal) = (-x:Infinitesimal)";
   300      "(x:Infinitesimal) = (-x:Infinitesimal)";
   301 by (full_simp_tac (simpset() addsimps [hrabs_minus_cancel]) 1);
   301 by (Full_simp_tac 1);
   302 qed "Infinitesimal_minus_iff";
   302 qed "Infinitesimal_minus_iff";
   303 
   303 
   304 Goal "x ~:Infinitesimal = (-x ~:Infinitesimal)";
   304 Goal "x ~:Infinitesimal = (-x ~:Infinitesimal)";
   305 by (full_simp_tac (simpset() addsimps [Infinitesimal_minus_iff RS sym]) 1);
   305 by (full_simp_tac (simpset() addsimps [Infinitesimal_minus_iff RS sym]) 1);
   306 qed "not_Infinitesimal_minus_iff";
   306 qed "not_Infinitesimal_minus_iff";
   387 by (blast_tac (claset() addIs [HInfinite_add_ge_zero,
   387 by (blast_tac (claset() addIs [HInfinite_add_ge_zero,
   388     hypreal_less_imp_le]) 1);
   388     hypreal_less_imp_le]) 1);
   389 qed "HInfinite_add_gt_zero";
   389 qed "HInfinite_add_gt_zero";
   390 
   390 
   391 Goalw [HInfinite_def] "(-x: HInfinite) = (x: HInfinite)";
   391 Goalw [HInfinite_def] "(-x: HInfinite) = (x: HInfinite)";
   392 by (auto_tac (claset(),simpset() addsimps 
   392 by Auto_tac;
   393     [hrabs_minus_cancel]));
       
   394 qed "HInfinite_minus_iff";
   393 qed "HInfinite_minus_iff";
   395 
   394 
   396 Goal "[|x: HInfinite; y <= 0; x <= 0|] ==> (x + y): HInfinite";
   395 Goal "[|x: HInfinite; y <= 0; x <= 0|] ==> (x + y): HInfinite";
   397 by (dtac (HInfinite_minus_iff RS iffD2) 1);
   396 by (dtac (HInfinite_minus_iff RS iffD2) 1);
   398 by (rtac (HInfinite_minus_iff RS iffD1) 1);
   397 by (rtac (HInfinite_minus_iff RS iffD1) 1);
   590 by (dtac (inf_close_minus_iff RS iffD1) 1);
   589 by (dtac (inf_close_minus_iff RS iffD1) 1);
   591 by (simp_tac (simpset() addsimps [hypreal_add_commute]) 1);
   590 by (simp_tac (simpset() addsimps [hypreal_add_commute]) 1);
   592 qed "inf_close_minus";
   591 qed "inf_close_minus";
   593 
   592 
   594 Goal "-a @= -b ==> a @= b";
   593 Goal "-a @= -b ==> a @= b";
   595 by (auto_tac (claset() addDs [inf_close_minus],simpset()));
   594 by (auto_tac (claset() addDs [inf_close_minus], simpset()));
   596 qed "inf_close_minus2";
   595 qed "inf_close_minus2";
   597 
   596 
   598 Goal "(-a @= -b) = (a @= b)";
   597 Goal "(-a @= -b) = (a @= b)";
   599 by (blast_tac (claset() addIs [inf_close_minus,inf_close_minus2]) 1);
   598 by (blast_tac (claset() addIs [inf_close_minus,inf_close_minus2]) 1);
   600 qed "inf_close_minus_cancel";
   599 qed "inf_close_minus_cancel";
   612 qed "inf_close_mult1";
   611 qed "inf_close_mult1";
   613 
   612 
   614 Goal "[|a @= b; c: HFinite|] ==> c*a @= c*b"; 
   613 Goal "[|a @= b; c: HFinite|] ==> c*a @= c*b"; 
   615 by (asm_simp_tac (simpset() addsimps [inf_close_mult1,hypreal_mult_commute]) 1);
   614 by (asm_simp_tac (simpset() addsimps [inf_close_mult1,hypreal_mult_commute]) 1);
   616 qed "inf_close_mult2";
   615 qed "inf_close_mult2";
   617 
       
   618 val [prem1,prem2,prem3,prem4] = 
       
   619 goal thy "[|a @= b; c @= d; b: HFinite; c: HFinite|] ==> a*c @= b*d";
       
   620 by (fast_tac (claset() addIs [([prem1,prem4] MRS inf_close_mult1), 
       
   621     ([prem2,prem3] MRS inf_close_mult2),inf_close_trans]) 1);
       
   622 qed "inf_close_mult_HFinite";
       
   623 
   616 
   624 Goal "[|u @= v*x; x @= y; v: HFinite|] ==> u @= v*y";
   617 Goal "[|u @= v*x; x @= y; v: HFinite|] ==> u @= v*y";
   625 by (fast_tac (claset() addIs [inf_close_mult2,inf_close_trans]) 1);
   618 by (fast_tac (claset() addIs [inf_close_mult2,inf_close_trans]) 1);
   626 qed "inf_close_mult_subst";
   619 qed "inf_close_mult_subst";
   627 
   620 
   728 
   721 
   729 Goal "[| x: HFinite; x @= y |] ==> y: HFinite";
   722 Goal "[| x: HFinite; x @= y |] ==> y: HFinite";
   730 by (dtac (bex_Infinitesimal_iff2 RS iffD2) 1);
   723 by (dtac (bex_Infinitesimal_iff2 RS iffD2) 1);
   731 by (Step_tac 1);
   724 by (Step_tac 1);
   732 by (dtac (Infinitesimal_subset_HFinite RS subsetD 
   725 by (dtac (Infinitesimal_subset_HFinite RS subsetD 
   733            RS (HFinite_minus_iff RS iffD1)) 1);
   726           RS (HFinite_minus_iff RS iffD1)) 1);
   734 by (dtac HFinite_add 1);
   727 by (dtac HFinite_add 1);
   735 by (auto_tac (claset(),simpset() addsimps [hypreal_add_assoc]));
   728 by (auto_tac (claset(),simpset() addsimps [hypreal_add_assoc]));
   736 qed "inf_close_HFinite";
   729 qed "inf_close_HFinite";
   737 
   730 
   738 Goal "x @= hypreal_of_real D ==> x: HFinite";
   731 Goal "x @= hypreal_of_real D ==> x: HFinite";
   739 by (rtac (inf_close_sym RSN (2,inf_close_HFinite)) 1);
   732 by (rtac (inf_close_sym RSN (2,inf_close_HFinite)) 1);
   740 by Auto_tac;
   733 by Auto_tac;
   741 qed "inf_close_hypreal_of_real_HFinite";
   734 qed "inf_close_hypreal_of_real_HFinite";
   742 
   735 
       
   736 Goal "[|a @= b; c @= d; b: HFinite; d: HFinite|] ==> a*c @= b*d";
       
   737 by (rtac inf_close_trans 1); 
       
   738 by (rtac inf_close_mult2 2); 
       
   739 by (rtac inf_close_mult1 1);
       
   740 by (blast_tac (claset() addIs [inf_close_HFinite, inf_close_sym]) 2);  
       
   741 by Auto_tac;  
       
   742 qed "inf_close_mult_HFinite";
       
   743 
   743 Goal "[|a @= hypreal_of_real b; c @= hypreal_of_real d |] \
   744 Goal "[|a @= hypreal_of_real b; c @= hypreal_of_real d |] \
   744 \     ==> a*c @= hypreal_of_real b*hypreal_of_real d";
   745 \     ==> a*c @= hypreal_of_real b*hypreal_of_real d";
   745 by (blast_tac (claset() addSIs [inf_close_mult_HFinite,
   746 by (blast_tac (claset() addSIs [inf_close_mult_HFinite,
   746      inf_close_hypreal_of_real_HFinite,HFinite_hypreal_of_real]) 1);
   747             inf_close_hypreal_of_real_HFinite,HFinite_hypreal_of_real]) 1);
   747 qed "inf_close_mult_hypreal_of_real";
   748 qed "inf_close_mult_hypreal_of_real";
   748 
   749 
   749 Goal "[| a: SReal; a ~= 0; a*x @= 0 |] ==> x @= 0";
   750 Goal "[| a: SReal; a ~= 0; a*x @= 0 |] ==> x @= 0";
   750 by (dtac (SReal_inverse RS (SReal_subset_HFinite RS subsetD)) 1);
   751 by (dtac (SReal_inverse RS (SReal_subset_HFinite RS subsetD)) 1);
   751 by (auto_tac (claset() addDs [inf_close_mult2],
   752 by (auto_tac (claset() addDs [inf_close_mult2],
   884 qed "inf_close_hypreal_of_real_not_zero";
   885 qed "inf_close_hypreal_of_real_not_zero";
   885 
   886 
   886 Goal "[| x @= y; y : HFinite - Infinitesimal |] \
   887 Goal "[| x @= y; y : HFinite - Infinitesimal |] \
   887 \     ==> x : HFinite - Infinitesimal";
   888 \     ==> x : HFinite - Infinitesimal";
   888 by (auto_tac (claset() addIs [inf_close_sym RSN (2,inf_close_HFinite)],
   889 by (auto_tac (claset() addIs [inf_close_sym RSN (2,inf_close_HFinite)],
   889     simpset() addsimps [mem_infmal_iff]));
   890               simpset() addsimps [mem_infmal_iff]));
   890 by (dtac inf_close_trans3 1 THEN assume_tac 1);
   891 by (dtac inf_close_trans3 1 THEN assume_tac 1);
   891 by (blast_tac (claset() addDs [inf_close_sym]) 1);
   892 by (blast_tac (claset() addDs [inf_close_sym]) 1);
   892 qed "HFinite_diff_Infinitesimal_inf_close";
   893 qed "HFinite_diff_Infinitesimal_inf_close";
   893 
   894 
   894 (*The premise y~=0 is essential; otherwise x/y =0 and we lose the 
   895 (*The premise y~=0 is essential; otherwise x/y =0 and we lose the 
  1455       "[| xa: Infinitesimal; hypreal_of_real x < hypreal_of_real y |] \
  1456       "[| xa: Infinitesimal; hypreal_of_real x < hypreal_of_real y |] \
  1456 \      ==> hypreal_of_real x + xa < hypreal_of_real y";
  1457 \      ==> hypreal_of_real x + xa < hypreal_of_real y";
  1457 by (dtac (hypreal_less_minus_iff RS iffD1) 1 THEN Step_tac 1);
  1458 by (dtac (hypreal_less_minus_iff RS iffD1) 1 THEN Step_tac 1);
  1458 by (rtac (hypreal_less_minus_iff RS iffD2) 1);
  1459 by (rtac (hypreal_less_minus_iff RS iffD2) 1);
  1459 by (dres_inst_tac [("x","hypreal_of_real y + -hypreal_of_real x")] bspec 1);
  1460 by (dres_inst_tac [("x","hypreal_of_real y + -hypreal_of_real x")] bspec 1);
  1460 by (auto_tac (claset(),simpset() addsimps [hypreal_add_commute,
  1461 by (auto_tac (claset(),
  1461     hypreal_of_real_minus RS sym, hypreal_of_real_add RS sym,
  1462               simpset() addsimps [hypreal_add_commute, 
  1462     hrabs_interval_iff]));
  1463                                   hypreal_of_real_add, hrabs_interval_iff,
       
  1464                                   SReal_add, SReal_minus]));
  1463 by (dres_inst_tac [("x1","xa")] (hypreal_less_minus_iff RS iffD1) 1);
  1465 by (dres_inst_tac [("x1","xa")] (hypreal_less_minus_iff RS iffD1) 1);
  1464 by (auto_tac (claset(),simpset() addsimps [hypreal_of_real_minus,
  1466 by (auto_tac (claset(),
  1465     hypreal_minus_add_distrib,hypreal_of_real_add] @ hypreal_add_ac));
  1467         simpset() addsimps [hypreal_minus_add_distrib,hypreal_of_real_add] @ 
       
  1468                            hypreal_add_ac));
  1466 qed "Infinitesimal_add_hypreal_of_real_less";
  1469 qed "Infinitesimal_add_hypreal_of_real_less";
  1467 
  1470 
  1468 Goal "[| x: Infinitesimal; abs(hypreal_of_real r) < hypreal_of_real y |] \
  1471 Goal "[| x: Infinitesimal; abs(hypreal_of_real r) < hypreal_of_real y |] \
  1469 \     ==> abs (hypreal_of_real r + x) < hypreal_of_real y";
  1472 \     ==> abs (hypreal_of_real r + x) < hypreal_of_real y";
  1470 by (dres_inst_tac [("x","hypreal_of_real r")] 
  1473 by (dres_inst_tac [("x","hypreal_of_real r")] 
  2239 (*-----------------------------------------------------
  2242 (*-----------------------------------------------------
  2240     |X(n) - x| < 1/n ==> [<X n>] - hypreal_of_real x|: Infinitesimal 
  2243     |X(n) - x| < 1/n ==> [<X n>] - hypreal_of_real x|: Infinitesimal 
  2241  -----------------------------------------------------*)
  2244  -----------------------------------------------------*)
  2242 Goal "ALL n. abs(X n + -x) < inverse(real_of_posnat n) \ 
  2245 Goal "ALL n. abs(X n + -x) < inverse(real_of_posnat n) \ 
  2243 \    ==> Abs_hypreal(hyprel^^{X}) + -hypreal_of_real x : Infinitesimal";
  2246 \    ==> Abs_hypreal(hyprel^^{X}) + -hypreal_of_real x : Infinitesimal";
  2244 by (auto_tac (claset() addSIs [bexI] addDs [rename_numerals 
  2247 by (auto_tac (claset() addSIs [bexI] 
  2245     FreeUltrafilterNat_inverse_real_of_posnat,
  2248            addDs [rename_numerals FreeUltrafilterNat_inverse_real_of_posnat,
  2246     FreeUltrafilterNat_all,FreeUltrafilterNat_Int] addIs [order_less_trans,
  2249                   FreeUltrafilterNat_all,FreeUltrafilterNat_Int] 
  2247     FreeUltrafilterNat_subset],simpset() addsimps [hypreal_minus,
  2250            addIs [order_less_trans, FreeUltrafilterNat_subset],
  2248     hypreal_of_real_minus RS sym,hypreal_of_real_def,hypreal_add,
  2251       simpset() addsimps [hypreal_minus, 
  2249     Infinitesimal_FreeUltrafilterNat_iff,hypreal_inverse,hypreal_of_real_of_posnat]));
  2252                           hypreal_of_real_def,hypreal_add,
       
  2253                           Infinitesimal_FreeUltrafilterNat_iff,hypreal_inverse,
       
  2254                           hypreal_of_real_of_posnat]));
  2250 qed "real_seq_to_hypreal_Infinitesimal";
  2255 qed "real_seq_to_hypreal_Infinitesimal";
  2251 
  2256 
  2252 Goal "ALL n. abs(X n + -x) < inverse(real_of_posnat n) \ 
  2257 Goal "ALL n. abs(X n + -x) < inverse(real_of_posnat n) \ 
  2253 \     ==> Abs_hypreal(hyprel^^{X}) @= hypreal_of_real x";
  2258 \     ==> Abs_hypreal(hyprel^^{X}) @= hypreal_of_real x";
  2254 by (rtac (inf_close_minus_iff RS ssubst) 1);
  2259 by (rtac (inf_close_minus_iff RS ssubst) 1);
  2272         addIs [order_less_trans, FreeUltrafilterNat_subset],
  2277         addIs [order_less_trans, FreeUltrafilterNat_subset],
  2273      simpset() addsimps 
  2278      simpset() addsimps 
  2274             [Infinitesimal_FreeUltrafilterNat_iff,hypreal_minus,hypreal_add, 
  2279             [Infinitesimal_FreeUltrafilterNat_iff,hypreal_minus,hypreal_add, 
  2275              hypreal_inverse,hypreal_of_real_of_posnat]));
  2280              hypreal_inverse,hypreal_of_real_of_posnat]));
  2276 qed "real_seq_to_hypreal_Infinitesimal2";
  2281 qed "real_seq_to_hypreal_Infinitesimal2";
  2277