src/HOL/Hyperreal/NSA.ML
changeset 14336 8f731d3cd65b
parent 14334 6137d24eef79
child 14365 3d4df8c166ae
equal deleted inserted replaced
14335:9c0b5e081037 14336:8f731d3cd65b
   214 by (blast_tac (claset() addSIs [SReal_add,hrabs_add_less]) 1);
   214 by (blast_tac (claset() addSIs [SReal_add,hrabs_add_less]) 1);
   215 qed "HFinite_add";
   215 qed "HFinite_add";
   216 
   216 
   217 Goalw [HFinite_def] "[|x : HFinite; y : HFinite|] ==> x*y : HFinite";
   217 Goalw [HFinite_def] "[|x : HFinite; y : HFinite|] ==> x*y : HFinite";
   218 by (Asm_full_simp_tac 1);
   218 by (Asm_full_simp_tac 1);
   219 by (blast_tac (claset() addSIs [SReal_mult,hrabs_mult_less]) 1);
   219 by (blast_tac (claset() addSIs [SReal_mult,abs_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 1);
   223 by (Simp_tac 1);
   224 qed "HFinite_minus_iff";
   224 qed "HFinite_minus_iff";
   241 Goalw [HFinite_def] "x : HFinite ==> EX t: Reals. abs x < t";
   241 Goalw [HFinite_def] "x : HFinite ==> EX t: Reals. abs x < t";
   242 by Auto_tac;
   242 by Auto_tac;
   243 qed "HFiniteD";
   243 qed "HFiniteD";
   244 
   244 
   245 Goalw [HFinite_def] "(abs x : HFinite) = (x : HFinite)";
   245 Goalw [HFinite_def] "(abs x : HFinite) = (x : HFinite)";
   246 by (auto_tac (claset(), simpset() addsimps [hrabs_idempotent]));
   246 by Auto_tac;
   247 qed "HFinite_hrabs_iff";
   247 qed "HFinite_hrabs_iff";
   248 AddIffs [HFinite_hrabs_iff];
   248 AddIffs [HFinite_hrabs_iff];
   249 
   249 
   250 Goal "number_of w : HFinite";
   250 Goal "number_of w : HFinite";
   251 by (rtac (SReal_number_of RS (SReal_subset_HFinite RS subsetD)) 1);
   251 by (rtac (SReal_number_of RS (SReal_subset_HFinite RS subsetD)) 1);
   282       "x : Infinitesimal ==> ALL r: Reals. 0 < r --> abs x < r";
   282       "x : Infinitesimal ==> ALL r: Reals. 0 < r --> abs x < r";
   283 by Auto_tac;
   283 by Auto_tac;
   284 qed "InfinitesimalD";
   284 qed "InfinitesimalD";
   285 
   285 
   286 Goalw [Infinitesimal_def] "0 : Infinitesimal";
   286 Goalw [Infinitesimal_def] "0 : Infinitesimal";
   287 by (simp_tac (simpset() addsimps [hrabs_zero]) 1);
   287 by (Simp_tac 1);
   288 qed "Infinitesimal_zero";
   288 qed "Infinitesimal_zero";
   289 AddIffs [Infinitesimal_zero];
   289 AddIffs [Infinitesimal_zero];
   290 
   290 
   291 Goal "x/(2::hypreal) + x/(2::hypreal) = x";
   291 Goal "x/(2::hypreal) + x/(2::hypreal) = x";
   292 by Auto_tac;
   292 by Auto_tac;
   422 by (Blast_tac 1);
   422 by (Blast_tac 1);
   423 qed "HFinite_diff_Infinitesimal_hrabs";
   423 qed "HFinite_diff_Infinitesimal_hrabs";
   424 
   424 
   425 Goalw [Infinitesimal_def]
   425 Goalw [Infinitesimal_def]
   426       "[| e : Infinitesimal; abs x < e |] ==> x : Infinitesimal";
   426       "[| e : Infinitesimal; abs x < e |] ==> x : Infinitesimal";
   427 by (auto_tac (claset() addSDs [bspec], simpset()));
   427 by (auto_tac (claset(), simpset() addsimps [abs_less_iff]));
   428 by (dres_inst_tac [("x","e")] (hrabs_ge_self RS order_le_less_trans) 1);
       
   429 by (fast_tac (claset() addIs [order_less_trans]) 1);
       
   430 qed "hrabs_less_Infinitesimal";
   428 qed "hrabs_less_Infinitesimal";
   431 
   429 
   432 Goal "[| e : Infinitesimal; abs x <= e |] ==> x : Infinitesimal";
   430 Goal "[| e : Infinitesimal; abs x <= e |] ==> x : Infinitesimal";
   433 by (blast_tac (claset() addDs [order_le_imp_less_or_eq]
   431 by (blast_tac (claset() addDs [order_le_imp_less_or_eq]
   434                         addIs [hrabs_less_Infinitesimal]) 1);
   432                         addIs [hrabs_less_Infinitesimal]) 1);
   436 
   434 
   437 Goalw [Infinitesimal_def]
   435 Goalw [Infinitesimal_def]
   438       "[| e : Infinitesimal; \
   436       "[| e : Infinitesimal; \
   439 \         e' : Infinitesimal; \
   437 \         e' : Infinitesimal; \
   440 \         e' < x ; x < e |] ==> x : Infinitesimal";
   438 \         e' < x ; x < e |] ==> x : Infinitesimal";
   441 by (auto_tac (claset() addSDs [bspec], simpset()));
   439 by (auto_tac (claset(), simpset() addsimps [abs_less_iff]));
   442 by (dres_inst_tac [("x","e")] (hrabs_ge_self RS order_le_less_trans) 1);
       
   443 by (dtac (hrabs_interval_iff RS iffD1) 1);
       
   444 by (fast_tac(claset() addIs [order_less_trans,hrabs_interval_iff RS iffD2]) 1);
       
   445 qed "Infinitesimal_interval";
   440 qed "Infinitesimal_interval";
   446 
   441 
   447 Goal "[| e : Infinitesimal; e' : Infinitesimal; \
   442 Goal "[| e : Infinitesimal; e' : Infinitesimal; \
   448 \        e' <= x ; x <= e |] ==> x : Infinitesimal";
   443 \        e' <= x ; x <= e |] ==> x : Infinitesimal";
   449 by (auto_tac (claset() addIs [Infinitesimal_interval],
   444 by (auto_tac (claset() addIs [Infinitesimal_interval],
   817     Zero is the only infinitesimal that is also a real
   812     Zero is the only infinitesimal that is also a real
   818  -----------------------------------------------------------------*)
   813  -----------------------------------------------------------------*)
   819 
   814 
   820 Goalw [Infinitesimal_def]
   815 Goalw [Infinitesimal_def]
   821      "[| x: Reals; y: Infinitesimal; 0 < x |] ==> y < x";
   816      "[| x: Reals; y: Infinitesimal; 0 < x |] ==> y < x";
   822 by (rtac (hrabs_ge_self RS order_le_less_trans) 1);
   817 by (rtac (abs_ge_self RS order_le_less_trans) 1);
   823 by Auto_tac;
   818 by Auto_tac;
   824 qed "Infinitesimal_less_SReal";
   819 qed "Infinitesimal_less_SReal";
   825 
   820 
   826 Goal "y: Infinitesimal ==> ALL r: Reals. 0 < r --> y < r";
   821 Goal "y: Infinitesimal ==> ALL r: Reals. 0 < r --> y < r";
   827 by (blast_tac (claset() addIs [Infinitesimal_less_SReal]) 1);
   822 by (blast_tac (claset() addIs [Infinitesimal_less_SReal]) 1);
   989 qed "hypreal_isLub_unique";
   984 qed "hypreal_isLub_unique";
   990 
   985 
   991 Goal "x: HFinite ==> EX u. isUb Reals {s. s: Reals & s < x} u";
   986 Goal "x: HFinite ==> EX u. isUb Reals {s. s: Reals & s < x} u";
   992 by (dtac HFiniteD 1 THEN Step_tac 1);
   987 by (dtac HFiniteD 1 THEN Step_tac 1);
   993 by (rtac exI 1 THEN rtac isUbI 1 THEN assume_tac 2);
   988 by (rtac exI 1 THEN rtac isUbI 1 THEN assume_tac 2);
   994 by (auto_tac (claset() addIs [order_less_imp_le,setleI,isUbI,
   989 by (auto_tac (claset() addIs [setleI,isUbI], simpset() addsimps [abs_less_iff]));
   995     order_less_trans], simpset() addsimps [hrabs_interval_iff]));
       
   996 qed "lemma_st_part_ub";
   990 qed "lemma_st_part_ub";
   997 
   991 
   998 Goal "x: HFinite ==> EX y. y: {s. s: Reals & s < x}";
   992 Goal "x: HFinite ==> EX y. y: {s. s: Reals & s < x}";
   999 by (dtac HFiniteD 1 THEN Step_tac 1);
   993 by (dtac HFiniteD 1 THEN Step_tac 1);
  1000 by (dtac SReal_minus 1);
   994 by (dtac SReal_minus 1);
  1001 by (res_inst_tac [("x","-t")] exI 1);
   995 by (res_inst_tac [("x","-t")] exI 1);
  1002 by (auto_tac (claset(), simpset() addsimps [hrabs_interval_iff]));
   996 by (auto_tac (claset(), simpset() addsimps [abs_less_iff]));
  1003 qed "lemma_st_part_nonempty";
   997 qed "lemma_st_part_nonempty";
  1004 
   998 
  1005 Goal "{s. s: Reals & s < x} <= Reals";
   999 Goal "{s. s: Reals & s < x} <= Reals";
  1006 by Auto_tac;
  1000 by Auto_tac;
  1007 qed "lemma_st_part_subset";
  1001 qed "lemma_st_part_subset";
  1133 \     ==> abs (x + -t) < r";
  1127 \     ==> abs (x + -t) < r";
  1134 by (ftac lemma_st_part1a 1);
  1128 by (ftac lemma_st_part1a 1);
  1135 by (ftac lemma_st_part2a 4);
  1129 by (ftac lemma_st_part2a 4);
  1136 by Auto_tac;
  1130 by Auto_tac;
  1137 by (REPEAT(dtac order_le_imp_less_or_eq 1));
  1131 by (REPEAT(dtac order_le_imp_less_or_eq 1));
  1138 by (auto_tac (claset() addDs [lemma_st_part_not_eq1,
  1132 by (auto_tac (claset() addDs [lemma_st_part_not_eq1, lemma_st_part_not_eq2],
  1139     lemma_st_part_not_eq2], simpset() addsimps [hrabs_interval_iff2]));
  1133          simpset() addsimps [abs_less_iff]));
  1140 qed "lemma_st_part_major";
  1134 qed "lemma_st_part_major";
  1141 
  1135 
  1142 Goal "[| x: HFinite; \
  1136 Goal "[| x: HFinite; \
  1143 \        isLub Reals {s. s: Reals & s < x} t |] \
  1137 \        isLub Reals {s. s: Reals & s < x} t |] \
  1144 \     ==> ALL r: Reals. 0 < r --> abs (x + -t) < r";
  1138 \     ==> ALL r: Reals. 0 < r --> abs (x + -t) < r";
  1488 by (dtac (hypreal_less_minus_iff RS iffD1) 1 THEN Step_tac 1);
  1482 by (dtac (hypreal_less_minus_iff RS iffD1) 1 THEN Step_tac 1);
  1489 by (rtac (hypreal_less_minus_iff RS iffD2) 1);
  1483 by (rtac (hypreal_less_minus_iff RS iffD2) 1);
  1490 by (dres_inst_tac [("x","hypreal_of_real y + -hypreal_of_real x")] bspec 1);
  1484 by (dres_inst_tac [("x","hypreal_of_real y + -hypreal_of_real x")] bspec 1);
  1491 by (auto_tac (claset(),
  1485 by (auto_tac (claset(),
  1492               simpset() addsimps [hypreal_add_commute,
  1486               simpset() addsimps [hypreal_add_commute,
  1493                                   hrabs_interval_iff,
  1487                                   abs_less_iff,
  1494                                   SReal_add, SReal_minus]));
  1488                                   SReal_add, SReal_minus]));
  1495 qed "Infinitesimal_add_hypreal_of_real_less";
  1489 qed "Infinitesimal_add_hypreal_of_real_less";
  1496 
  1490 
  1497 Goal "[| x: Infinitesimal; abs(hypreal_of_real r) < hypreal_of_real y |] \
  1491 Goal "[| x: Infinitesimal; abs(hypreal_of_real r) < hypreal_of_real y |] \
  1498 \     ==> abs (hypreal_of_real r + x) < hypreal_of_real y";
  1492 \     ==> abs (hypreal_of_real r + x) < hypreal_of_real y";
  1898 qed "lemma_free2";
  1892 qed "lemma_free2";
  1899 
  1893 
  1900 Goalw [HFinite_def]
  1894 Goalw [HFinite_def]
  1901     "x : HFinite ==> EX X: Rep_hypreal x. \
  1895     "x : HFinite ==> EX X: Rep_hypreal x. \
  1902 \    EX u. {n. abs (X n) < u}:  FreeUltrafilterNat";
  1896 \    EX u. {n. abs (X n) < u}:  FreeUltrafilterNat";
  1903 by (auto_tac (claset(), simpset() addsimps
  1897 by (auto_tac (claset(), simpset() addsimps [abs_less_iff, inst "a" "x" minus_less_iff]));
  1904     [hrabs_interval_iff]));
       
  1905 by (auto_tac (claset(), simpset() addsimps
  1898 by (auto_tac (claset(), simpset() addsimps
  1906     [hypreal_less_def,SReal_iff,hypreal_minus,
  1899     [hypreal_less_def,SReal_iff,hypreal_minus,
  1907      hypreal_of_real_def]));
  1900      hypreal_of_real_def]));
  1908 by (dtac FreeUltrafilterNat_Rep_hypreal 1 THEN assume_tac 1);
  1901 by (dtac FreeUltrafilterNat_Rep_hypreal 1 THEN assume_tac 1);
  1909 by (res_inst_tac [("x","Y")] bexI 1 THEN assume_tac 2);
  1902 by (rename_tac "Z" 1);
       
  1903 by (res_inst_tac [("x","Z")] bexI 1 THEN assume_tac 2);
  1910 by (res_inst_tac [("x","y")] exI 1);
  1904 by (res_inst_tac [("x","y")] exI 1);
  1911 by (Ultra_tac 1 THEN arith_tac 1);
  1905 by (Ultra_tac 1);
  1912 qed "HFinite_FreeUltrafilterNat";
  1906 qed "HFinite_FreeUltrafilterNat";
  1913 
  1907 
  1914 Goalw [HFinite_def]
  1908 Goalw [HFinite_def]
  1915      "EX X: Rep_hypreal x. \
  1909      "EX X: Rep_hypreal x. \
  1916 \      EX u. {n. abs (X n) < u}: FreeUltrafilterNat\
  1910 \      EX u. {n. abs (X n) < u}: FreeUltrafilterNat\
  1917 \      ==>  x : HFinite";
  1911 \      ==>  x : HFinite";
  1918 by (auto_tac (claset(), simpset() addsimps
  1912 by (auto_tac (claset(), simpset() addsimps [abs_less_iff, inst "a" "x" minus_less_iff]));
  1919     [hrabs_interval_iff]));
       
  1920 by (res_inst_tac [("x","hypreal_of_real u")] bexI 1);
  1913 by (res_inst_tac [("x","hypreal_of_real u")] bexI 1);
  1921 by (auto_tac (claset() addSIs [exI], simpset() addsimps
  1914 by (auto_tac (claset() addSIs [exI], 
  1922     [hypreal_less_def,SReal_iff,hypreal_minus,
  1915    simpset() addsimps
  1923      hypreal_of_real_def]));
  1916     [hypreal_less_def,SReal_iff,hypreal_minus, hypreal_of_real_def]));
  1924 by (ALLGOALS(Ultra_tac THEN' arith_tac));
  1917 by (ALLGOALS Ultra_tac);
  1925 qed "FreeUltrafilterNat_HFinite";
  1918 qed "FreeUltrafilterNat_HFinite";
  1926 
  1919 
  1927 Goal "(x : HFinite) = (EX X: Rep_hypreal x. \
  1920 Goal "(x : HFinite) = (EX X: Rep_hypreal x. \
  1928 \          EX u. {n. abs (X n) < u}:  FreeUltrafilterNat)";
  1921 \          EX u. {n. abs (X n) < u}:  FreeUltrafilterNat)";
  1929 by (blast_tac (claset() addSIs [HFinite_FreeUltrafilterNat,
  1922 by (blast_tac (claset() addSIs [HFinite_FreeUltrafilterNat,
  2024 qed "lemma_free5";
  2017 qed "lemma_free5";
  2025 
  2018 
  2026 Goalw [Infinitesimal_def]
  2019 Goalw [Infinitesimal_def]
  2027           "x : Infinitesimal ==> EX X: Rep_hypreal x. \
  2020           "x : Infinitesimal ==> EX X: Rep_hypreal x. \
  2028 \          ALL u. 0 < u --> {n. abs (X n) < u}:  FreeUltrafilterNat";
  2021 \          ALL u. 0 < u --> {n. abs (X n) < u}:  FreeUltrafilterNat";
  2029 by (auto_tac (claset(), simpset() addsimps [hrabs_interval_iff]));
  2022 by (auto_tac (claset(), simpset() addsimps [abs_less_iff, inst "a" "x" minus_less_iff]));
  2030 by (res_inst_tac [("z","x")] eq_Abs_hypreal 1);
  2023 by (res_inst_tac [("z","x")] eq_Abs_hypreal 1);
  2031 by (EVERY[Auto_tac, rtac bexI 1, rtac lemma_hyprel_refl 2, Step_tac 1]);
  2024 by (EVERY[Auto_tac, rtac bexI 1, rtac lemma_hyprel_refl 2, Step_tac 1]);
  2032 by (dtac (hypreal_of_real_less_iff RS iffD2) 1);
  2025 by (dtac (hypreal_of_real_less_iff RS iffD2) 1);
  2033 by (dres_inst_tac [("x","hypreal_of_real u")] bspec 1);
  2026 by (dres_inst_tac [("x","hypreal_of_real u")] bspec 1);
  2034 by Auto_tac;
  2027 by Auto_tac;
  2035 by (auto_tac (claset(),
  2028 by (auto_tac (claset(),
  2036               simpset() addsimps [hypreal_less_def, hypreal_minus,
  2029               simpset() addsimps [hypreal_less_def, hypreal_minus,
  2037                                   hypreal_of_real_def]));
  2030                                   hypreal_of_real_def]));
  2038 by (Ultra_tac 1 THEN arith_tac 1);
  2031 by (Ultra_tac 1);
  2039 qed "Infinitesimal_FreeUltrafilterNat";
  2032 qed "Infinitesimal_FreeUltrafilterNat";
  2040 
  2033 
  2041 Goalw [Infinitesimal_def]
  2034 Goalw [Infinitesimal_def]
  2042      "EX X: Rep_hypreal x. \
  2035      "EX X: Rep_hypreal x. \
  2043 \           ALL u. 0 < u --> {n. abs (X n) < u} : FreeUltrafilterNat \
  2036 \           ALL u. 0 < u --> {n. abs (X n) < u} : FreeUltrafilterNat \
  2044 \     ==> x : Infinitesimal";
  2037 \     ==> x : Infinitesimal";
  2045 by (auto_tac (claset(),
  2038 by (auto_tac (claset(),
  2046               simpset() addsimps [hrabs_interval_iff,abs_interval_iff]));
  2039               simpset() addsimps [abs_less_iff,abs_interval_iff, inst "a" "x" minus_less_iff]));
  2047 by (auto_tac (claset(),
  2040 by (auto_tac (claset(),
  2048               simpset() addsimps [SReal_iff]));
  2041               simpset() addsimps [SReal_iff]));
  2049 by (auto_tac (claset() addSIs [exI]
  2042 by (auto_tac (claset() addSIs [exI]
  2050                                addIs [FreeUltrafilterNat_subset],
  2043                                addIs [FreeUltrafilterNat_subset],
  2051     simpset() addsimps [hypreal_less_def, hypreal_minus,hypreal_of_real_def]));
  2044     simpset() addsimps [hypreal_less_def, hypreal_minus,hypreal_of_real_def]));