src/HOL/Hyperreal/NSA.thy
changeset 17298 ad73fb6144cf
parent 16924 04246269386e
child 17318 bc1c75855f3d
equal deleted inserted replaced
17297:17256fe71aca 17298:ad73fb6144cf
  1772 
  1772 
  1773 
  1773 
  1774 subsection{*Alternative Definitions for @{term HFinite} using Free Ultrafilter*}
  1774 subsection{*Alternative Definitions for @{term HFinite} using Free Ultrafilter*}
  1775 
  1775 
  1776 lemma FreeUltrafilterNat_Rep_hypreal:
  1776 lemma FreeUltrafilterNat_Rep_hypreal:
  1777      "[| X \<in> Rep_hypreal x; Y \<in> Rep_hypreal x |]
  1777      "[| X \<in> Rep_star x; Y \<in> Rep_star x |]
  1778       ==> {n. X n = Y n} \<in> FreeUltrafilterNat"
  1778       ==> {n. X n = Y n} \<in> FreeUltrafilterNat"
  1779 by (rule_tac z = x in eq_Abs_hypreal, auto, ultra)
  1779 by (rule_tac z = x in eq_Abs_star, auto, ultra)
  1780 
  1780 
  1781 lemma HFinite_FreeUltrafilterNat:
  1781 lemma HFinite_FreeUltrafilterNat:
  1782     "x \<in> HFinite 
  1782     "x \<in> HFinite 
  1783      ==> \<exists>X \<in> Rep_hypreal x. \<exists>u. {n. abs (X n) < u} \<in> FreeUltrafilterNat"
  1783      ==> \<exists>X \<in> Rep_star x. \<exists>u. {n. abs (X n) < u} \<in> FreeUltrafilterNat"
  1784 apply (cases x)
  1784 apply (rule_tac z = x in eq_Abs_star)
  1785 apply (auto simp add: HFinite_def abs_less_iff minus_less_iff [of x] 
  1785 apply (auto simp add: HFinite_def abs_less_iff minus_less_iff [of x] 
       
  1786               star_of_def star_n_def
  1786               hypreal_less SReal_iff hypreal_minus hypreal_of_real_def)
  1787               hypreal_less SReal_iff hypreal_minus hypreal_of_real_def)
  1787 apply (rule_tac x=x in bexI) 
  1788 apply (rule_tac x=x in bexI) 
  1788 apply (rule_tac x=y in exI, auto, ultra)
  1789 apply (rule_tac x=y in exI, auto, ultra)
  1789 done
  1790 done
  1790 
  1791 
  1791 lemma FreeUltrafilterNat_HFinite:
  1792 lemma FreeUltrafilterNat_HFinite:
  1792      "\<exists>X \<in> Rep_hypreal x.
  1793      "\<exists>X \<in> Rep_star x.
  1793        \<exists>u. {n. abs (X n) < u} \<in> FreeUltrafilterNat
  1794        \<exists>u. {n. abs (X n) < u} \<in> FreeUltrafilterNat
  1794        ==>  x \<in> HFinite"
  1795        ==>  x \<in> HFinite"
  1795 apply (cases x)
  1796 apply (rule_tac z = x in eq_Abs_star)
  1796 apply (auto simp add: HFinite_def abs_less_iff minus_less_iff [of x])
  1797 apply (auto simp add: HFinite_def abs_less_iff minus_less_iff [of x])
  1797 apply (rule_tac x = "hypreal_of_real u" in bexI)
  1798 apply (rule_tac x = "hypreal_of_real u" in bexI)
  1798 apply (auto simp add: hypreal_less SReal_iff hypreal_minus hypreal_of_real_def, ultra+)
  1799 apply (auto simp add: hypreal_less SReal_iff hypreal_minus hypreal_of_real_def star_of_def star_n_def, ultra+)
  1799 done
  1800 done
  1800 
  1801 
  1801 lemma HFinite_FreeUltrafilterNat_iff:
  1802 lemma HFinite_FreeUltrafilterNat_iff:
  1802      "(x \<in> HFinite) = (\<exists>X \<in> Rep_hypreal x.
  1803      "(x \<in> HFinite) = (\<exists>X \<in> Rep_star x.
  1803            \<exists>u. {n. abs (X n) < u} \<in> FreeUltrafilterNat)"
  1804            \<exists>u. {n. abs (X n) < u} \<in> FreeUltrafilterNat)"
  1804 apply (blast intro!: HFinite_FreeUltrafilterNat FreeUltrafilterNat_HFinite)
  1805 apply (blast intro!: HFinite_FreeUltrafilterNat FreeUltrafilterNat_HFinite)
  1805 done
  1806 done
  1806 
  1807 
  1807 
  1808 
  1826 (*-------------------------------------
  1827 (*-------------------------------------
  1827   Exclude this type of sets from free
  1828   Exclude this type of sets from free
  1828   ultrafilter for Infinite numbers!
  1829   ultrafilter for Infinite numbers!
  1829  -------------------------------------*)
  1830  -------------------------------------*)
  1830 lemma FreeUltrafilterNat_const_Finite:
  1831 lemma FreeUltrafilterNat_const_Finite:
  1831      "[| xa: Rep_hypreal x;
  1832      "[| xa: Rep_star x;
  1832                   {n. abs (xa n) = u} \<in> FreeUltrafilterNat
  1833                   {n. abs (xa n) = u} \<in> FreeUltrafilterNat
  1833                |] ==> x \<in> HFinite"
  1834                |] ==> x \<in> HFinite"
  1834 apply (rule FreeUltrafilterNat_HFinite)
  1835 apply (rule FreeUltrafilterNat_HFinite)
  1835 apply (rule_tac x = xa in bexI)
  1836 apply (rule_tac x = xa in bexI)
  1836 apply (rule_tac x = "u + 1" in exI)
  1837 apply (rule_tac x = "u + 1" in exI)
  1837 apply (ultra, assumption)
  1838 apply (ultra, assumption)
  1838 done
  1839 done
  1839 
  1840 
  1840 lemma HInfinite_FreeUltrafilterNat:
  1841 lemma HInfinite_FreeUltrafilterNat:
  1841      "x \<in> HInfinite ==> \<exists>X \<in> Rep_hypreal x.
  1842      "x \<in> HInfinite ==> \<exists>X \<in> Rep_star x.
  1842            \<forall>u. {n. u < abs (X n)} \<in> FreeUltrafilterNat"
  1843            \<forall>u. {n. u < abs (X n)} \<in> FreeUltrafilterNat"
  1843 apply (frule HInfinite_HFinite_iff [THEN iffD1])
  1844 apply (frule HInfinite_HFinite_iff [THEN iffD1])
  1844 apply (cut_tac x = x in Rep_hypreal_nonempty)
  1845 apply (cut_tac x = x in Rep_hypreal_nonempty)
  1845 apply (auto simp del: Rep_hypreal_nonempty simp add: HFinite_FreeUltrafilterNat_iff Bex_def)
  1846 apply (auto simp del: Rep_hypreal_nonempty simp add: HFinite_FreeUltrafilterNat_iff Bex_def)
  1846 apply (drule spec)+
  1847 apply (drule spec)+
  1859 
  1860 
  1860 lemma lemma_Int_HIa: "{n. u < abs (X n)} Int {n. abs (X n) < (u::real)} = {}"
  1861 lemma lemma_Int_HIa: "{n. u < abs (X n)} Int {n. abs (X n) < (u::real)} = {}"
  1861 by (auto intro: order_less_asym)
  1862 by (auto intro: order_less_asym)
  1862 
  1863 
  1863 lemma FreeUltrafilterNat_HInfinite:
  1864 lemma FreeUltrafilterNat_HInfinite:
  1864      "\<exists>X \<in> Rep_hypreal x. \<forall>u.
  1865      "\<exists>X \<in> Rep_star x. \<forall>u.
  1865                {n. u < abs (X n)} \<in> FreeUltrafilterNat
  1866                {n. u < abs (X n)} \<in> FreeUltrafilterNat
  1866                ==>  x \<in> HInfinite"
  1867                ==>  x \<in> HInfinite"
  1867 apply (rule HInfinite_HFinite_iff [THEN iffD2])
  1868 apply (rule HInfinite_HFinite_iff [THEN iffD2])
  1868 apply (safe, drule HFinite_FreeUltrafilterNat, auto)
  1869 apply (safe, drule HFinite_FreeUltrafilterNat, auto)
  1869 apply (drule_tac x = u in spec)
  1870 apply (drule_tac x = u in spec)
  1873 apply (drule_tac Y = "{n. abs (X n) < u}" in FreeUltrafilterNat_Int)
  1874 apply (drule_tac Y = "{n. abs (X n) < u}" in FreeUltrafilterNat_Int)
  1874 apply (auto simp add: lemma_Int_HIa)
  1875 apply (auto simp add: lemma_Int_HIa)
  1875 done
  1876 done
  1876 
  1877 
  1877 lemma HInfinite_FreeUltrafilterNat_iff:
  1878 lemma HInfinite_FreeUltrafilterNat_iff:
  1878      "(x \<in> HInfinite) = (\<exists>X \<in> Rep_hypreal x.
  1879      "(x \<in> HInfinite) = (\<exists>X \<in> Rep_star x.
  1879            \<forall>u. {n. u < abs (X n)} \<in> FreeUltrafilterNat)"
  1880            \<forall>u. {n. u < abs (X n)} \<in> FreeUltrafilterNat)"
  1880 by (blast intro!: HInfinite_FreeUltrafilterNat FreeUltrafilterNat_HInfinite)
  1881 by (blast intro!: HInfinite_FreeUltrafilterNat FreeUltrafilterNat_HInfinite)
  1881 
  1882 
  1882 
  1883 
  1883 subsection{*Alternative Definitions for @{term Infinitesimal} using Free Ultrafilter*}
  1884 subsection{*Alternative Definitions for @{term Infinitesimal} using Free Ultrafilter*}
  1884 
  1885 
  1885 lemma Infinitesimal_FreeUltrafilterNat:
  1886 lemma Infinitesimal_FreeUltrafilterNat:
  1886           "x \<in> Infinitesimal ==> \<exists>X \<in> Rep_hypreal x.
  1887           "x \<in> Infinitesimal ==> \<exists>X \<in> Rep_star x.
  1887            \<forall>u. 0 < u --> {n. abs (X n) < u} \<in> FreeUltrafilterNat"
  1888            \<forall>u. 0 < u --> {n. abs (X n) < u} \<in> FreeUltrafilterNat"
  1888 apply (simp add: Infinitesimal_def)
  1889 apply (simp add: Infinitesimal_def)
  1889 apply (auto simp add: abs_less_iff minus_less_iff [of x])
  1890 apply (auto simp add: abs_less_iff minus_less_iff [of x])
  1890 apply (cases x)
  1891 apply (rule_tac z = x in eq_Abs_star)
  1891 apply (auto, rule bexI [OF _ lemma_hyprel_refl], safe)
  1892 apply (auto, rule bexI [OF _ lemma_starrel_refl], safe)
  1892 apply (drule hypreal_of_real_less_iff [THEN iffD2])
  1893 apply (drule hypreal_of_real_less_iff [THEN iffD2])
  1893 apply (drule_tac x = "hypreal_of_real u" in bspec, auto)
  1894 apply (drule_tac x = "hypreal_of_real u" in bspec, auto)
  1894 apply (auto simp add: hypreal_less hypreal_minus hypreal_of_real_def, ultra)
  1895 apply (auto simp add: hypreal_less hypreal_minus hypreal_of_real_def star_of_def star_n_def, ultra)
  1895 done
  1896 done
  1896 
  1897 
  1897 lemma FreeUltrafilterNat_Infinitesimal:
  1898 lemma FreeUltrafilterNat_Infinitesimal:
  1898      "\<exists>X \<in> Rep_hypreal x.
  1899      "\<exists>X \<in> Rep_star x.
  1899             \<forall>u. 0 < u --> {n. abs (X n) < u} \<in> FreeUltrafilterNat
  1900             \<forall>u. 0 < u --> {n. abs (X n) < u} \<in> FreeUltrafilterNat
  1900       ==> x \<in> Infinitesimal"
  1901       ==> x \<in> Infinitesimal"
  1901 apply (simp add: Infinitesimal_def)
  1902 apply (simp add: Infinitesimal_def)
  1902 apply (cases x)
  1903 apply (rule_tac z = x in eq_Abs_star)
  1903 apply (auto simp add: abs_less_iff abs_interval_iff minus_less_iff [of x])
  1904 apply (auto simp add: abs_less_iff abs_interval_iff minus_less_iff [of x])
  1904 apply (auto simp add: SReal_iff)
  1905 apply (auto simp add: SReal_iff)
  1905 apply (drule_tac [!] x=y in spec) 
  1906 apply (drule_tac [!] x=y in spec) 
  1906 apply (auto simp add: hypreal_less hypreal_minus hypreal_of_real_def, ultra+)
  1907 apply (auto simp add: hypreal_less hypreal_minus hypreal_of_real_def star_of_def star_n_def, ultra+)
  1907 done
  1908 done
  1908 
  1909 
  1909 lemma Infinitesimal_FreeUltrafilterNat_iff:
  1910 lemma Infinitesimal_FreeUltrafilterNat_iff:
  1910      "(x \<in> Infinitesimal) = (\<exists>X \<in> Rep_hypreal x.
  1911      "(x \<in> Infinitesimal) = (\<exists>X \<in> Rep_star x.
  1911            \<forall>u. 0 < u --> {n. abs (X n) < u} \<in> FreeUltrafilterNat)"
  1912            \<forall>u. 0 < u --> {n. abs (X n) < u} \<in> FreeUltrafilterNat)"
  1912 apply (blast intro!: Infinitesimal_FreeUltrafilterNat FreeUltrafilterNat_Infinitesimal)
  1913 apply (blast intro!: Infinitesimal_FreeUltrafilterNat FreeUltrafilterNat_Infinitesimal)
  1913 done
  1914 done
  1914 
  1915 
  1915 (*------------------------------------------------------------------------
  1916 (*------------------------------------------------------------------------
  2006 lemma Compl_real_le_eq: "- {n::nat. real n \<le> u} = {n. u < real n}"
  2007 lemma Compl_real_le_eq: "- {n::nat. real n \<le> u} = {n. u < real n}"
  2007 by (auto dest!: order_le_less_trans simp add: linorder_not_le)
  2008 by (auto dest!: order_le_less_trans simp add: linorder_not_le)
  2008 
  2009 
  2009 text{*@{term omega} is a member of @{term HInfinite}*}
  2010 text{*@{term omega} is a member of @{term HInfinite}*}
  2010 
  2011 
  2011 lemma hypreal_omega: "hyprel``{%n::nat. real (Suc n)} \<in> hypreal"
  2012 lemma hypreal_omega: "starrel``{%n::nat. real (Suc n)} \<in> star"
  2012 by auto
  2013 by auto
  2013 
  2014 
  2014 lemma FreeUltrafilterNat_omega: "{n. u < real n} \<in> FreeUltrafilterNat"
  2015 lemma FreeUltrafilterNat_omega: "{n. u < real n} \<in> FreeUltrafilterNat"
  2015 apply (cut_tac u = u in rabs_real_of_nat_le_real_FreeUltrafilterNat)
  2016 apply (cut_tac u = u in rabs_real_of_nat_le_real_FreeUltrafilterNat)
  2016 apply (auto dest: FreeUltrafilterNat_Compl_mem simp add: Compl_real_le_eq)
  2017 apply (auto dest: FreeUltrafilterNat_Compl_mem simp add: Compl_real_le_eq)
  2017 done
  2018 done
  2018 
  2019 
  2019 theorem HInfinite_omega [simp]: "omega \<in> HInfinite"
  2020 theorem HInfinite_omega [simp]: "omega \<in> HInfinite"
  2020 apply (simp add: omega_def)
  2021 apply (simp add: omega_def star_n_def)
  2021 apply (auto intro!: FreeUltrafilterNat_HInfinite)
  2022 apply (auto intro!: FreeUltrafilterNat_HInfinite)
  2022 apply (rule bexI)
  2023 apply (rule bexI)
  2023 apply (rule_tac [2] lemma_hyprel_refl, auto)
  2024 apply (rule_tac [2] lemma_starrel_refl, auto)
  2024 apply (simp (no_asm) add: real_of_nat_Suc diff_less_eq [symmetric] FreeUltrafilterNat_omega)
  2025 apply (simp (no_asm) add: real_of_nat_Suc diff_less_eq [symmetric] FreeUltrafilterNat_omega)
  2025 done
  2026 done
  2026 
  2027 
  2027 (*-----------------------------------------------
  2028 (*-----------------------------------------------
  2028        Epsilon is a member of Infinitesimal
  2029        Epsilon is a member of Infinitesimal
  2120 (*-----------------------------------------------------
  2121 (*-----------------------------------------------------
  2121     |X(n) - x| < 1/n ==> [<X n>] - hypreal_of_real x| \<in> Infinitesimal
  2122     |X(n) - x| < 1/n ==> [<X n>] - hypreal_of_real x| \<in> Infinitesimal
  2122  -----------------------------------------------------*)
  2123  -----------------------------------------------------*)
  2123 lemma real_seq_to_hypreal_Infinitesimal:
  2124 lemma real_seq_to_hypreal_Infinitesimal:
  2124      "\<forall>n. abs(X n + -x) < inverse(real(Suc n))
  2125      "\<forall>n. abs(X n + -x) < inverse(real(Suc n))
  2125      ==> Abs_hypreal(hyprel``{X}) + -hypreal_of_real x \<in> Infinitesimal"
  2126      ==> Abs_star(starrel``{X}) + -hypreal_of_real x \<in> Infinitesimal"
  2126 apply (auto intro!: bexI dest: FreeUltrafilterNat_inverse_real_of_posnat FreeUltrafilterNat_all FreeUltrafilterNat_Int intro: order_less_trans FreeUltrafilterNat_subset simp add: hypreal_minus hypreal_of_real_def hypreal_add Infinitesimal_FreeUltrafilterNat_iff hypreal_inverse)
  2127 apply (auto intro!: bexI dest: FreeUltrafilterNat_inverse_real_of_posnat FreeUltrafilterNat_all FreeUltrafilterNat_Int intro: order_less_trans FreeUltrafilterNat_subset simp add: hypreal_minus hypreal_of_real_def star_of_def star_n_def hypreal_add Infinitesimal_FreeUltrafilterNat_iff hypreal_inverse)
  2127 done
  2128 done
  2128 
  2129 
  2129 lemma real_seq_to_hypreal_approx:
  2130 lemma real_seq_to_hypreal_approx:
  2130      "\<forall>n. abs(X n + -x) < inverse(real(Suc n))
  2131      "\<forall>n. abs(X n + -x) < inverse(real(Suc n))
  2131       ==> Abs_hypreal(hyprel``{X}) @= hypreal_of_real x"
  2132       ==> Abs_star(starrel``{X}) @= hypreal_of_real x"
  2132 apply (subst approx_minus_iff)
  2133 apply (subst approx_minus_iff)
  2133 apply (rule mem_infmal_iff [THEN subst])
  2134 apply (rule mem_infmal_iff [THEN subst])
  2134 apply (erule real_seq_to_hypreal_Infinitesimal)
  2135 apply (erule real_seq_to_hypreal_Infinitesimal)
  2135 done
  2136 done
  2136 
  2137 
  2137 lemma real_seq_to_hypreal_approx2:
  2138 lemma real_seq_to_hypreal_approx2:
  2138      "\<forall>n. abs(x + -X n) < inverse(real(Suc n))
  2139      "\<forall>n. abs(x + -X n) < inverse(real(Suc n))
  2139                ==> Abs_hypreal(hyprel``{X}) @= hypreal_of_real x"
  2140                ==> Abs_star(starrel``{X}) @= hypreal_of_real x"
  2140 apply (simp add: abs_minus_add_cancel real_seq_to_hypreal_approx)
  2141 apply (simp add: abs_minus_add_cancel real_seq_to_hypreal_approx)
  2141 done
  2142 done
  2142 
  2143 
  2143 lemma real_seq_to_hypreal_Infinitesimal2:
  2144 lemma real_seq_to_hypreal_Infinitesimal2:
  2144      "\<forall>n. abs(X n + -Y n) < inverse(real(Suc n))
  2145      "\<forall>n. abs(X n + -Y n) < inverse(real(Suc n))
  2145       ==> Abs_hypreal(hyprel``{X}) +
  2146       ==> Abs_star(starrel``{X}) +
  2146           -Abs_hypreal(hyprel``{Y}) \<in> Infinitesimal"
  2147           -Abs_star(starrel``{Y}) \<in> Infinitesimal"
  2147 by (auto intro!: bexI
  2148 by (auto intro!: bexI
  2148 	 dest: FreeUltrafilterNat_inverse_real_of_posnat 
  2149 	 dest: FreeUltrafilterNat_inverse_real_of_posnat 
  2149 	       FreeUltrafilterNat_all FreeUltrafilterNat_Int
  2150 	       FreeUltrafilterNat_all FreeUltrafilterNat_Int
  2150 	 intro: order_less_trans FreeUltrafilterNat_subset 
  2151 	 intro: order_less_trans FreeUltrafilterNat_subset 
  2151 	 simp add: Infinitesimal_FreeUltrafilterNat_iff hypreal_minus 
  2152 	 simp add: Infinitesimal_FreeUltrafilterNat_iff hypreal_minus