src/HOL/NSA/NSA.thy
changeset 60041 6c86d58ab0ca
parent 59867 58043346ca64
child 61070 b72a990adfe2
equal deleted inserted replaced
60040:1fa1023b13b9 60041:6c86d58ab0ca
  1913 
  1913 
  1914 subsubsection {* @{term HFinite} *}
  1914 subsubsection {* @{term HFinite} *}
  1915 
  1915 
  1916 lemma HFinite_FreeUltrafilterNat:
  1916 lemma HFinite_FreeUltrafilterNat:
  1917     "star_n X \<in> HFinite
  1917     "star_n X \<in> HFinite
  1918      ==> \<exists>u. {n. norm (X n) < u} \<in> FreeUltrafilterNat"
  1918    ==> \<exists>u. eventually (\<lambda>n. norm (X n) < u) FreeUltrafilterNat"
  1919 apply (auto simp add: HFinite_def SReal_def)
  1919 apply (auto simp add: HFinite_def SReal_def)
  1920 apply (rule_tac x=r in exI)
  1920 apply (rule_tac x=r in exI)
  1921 apply (simp add: hnorm_def star_of_def starfun_star_n)
  1921 apply (simp add: hnorm_def star_of_def starfun_star_n)
  1922 apply (simp add: star_less_def starP2_star_n)
  1922 apply (simp add: star_less_def starP2_star_n)
  1923 done
  1923 done
  1924 
  1924 
  1925 lemma FreeUltrafilterNat_HFinite:
  1925 lemma FreeUltrafilterNat_HFinite:
  1926      "\<exists>u. {n. norm (X n) < u} \<in> FreeUltrafilterNat
  1926      "\<exists>u. eventually (\<lambda>n. norm (X n) < u) FreeUltrafilterNat
  1927        ==>  star_n X \<in> HFinite"
  1927        ==>  star_n X \<in> HFinite"
  1928 apply (auto simp add: HFinite_def mem_Rep_star_iff)
  1928 apply (auto simp add: HFinite_def mem_Rep_star_iff)
  1929 apply (rule_tac x="star_of u" in bexI)
  1929 apply (rule_tac x="star_of u" in bexI)
  1930 apply (simp add: hnorm_def starfun_star_n star_of_def)
  1930 apply (simp add: hnorm_def starfun_star_n star_of_def)
  1931 apply (simp add: star_less_def starP2_star_n)
  1931 apply (simp add: star_less_def starP2_star_n)
  1932 apply (simp add: SReal_def)
  1932 apply (simp add: SReal_def)
  1933 done
  1933 done
  1934 
  1934 
  1935 lemma HFinite_FreeUltrafilterNat_iff:
  1935 lemma HFinite_FreeUltrafilterNat_iff:
  1936      "(star_n X \<in> HFinite) = (\<exists>u. {n. norm (X n) < u} \<in> FreeUltrafilterNat)"
  1936      "(star_n X \<in> HFinite) = (\<exists>u. eventually (\<lambda>n. norm (X n) < u) FreeUltrafilterNat)"
  1937 by (blast intro!: HFinite_FreeUltrafilterNat FreeUltrafilterNat_HFinite)
  1937 by (blast intro!: HFinite_FreeUltrafilterNat FreeUltrafilterNat_HFinite)
  1938 
  1938 
  1939 subsubsection {* @{term HInfinite} *}
  1939 subsubsection {* @{term HInfinite} *}
  1940 
  1940 
  1941 lemma lemma_Compl_eq: "- {n. u < norm (f n)} = {n. norm (f n) \<le> u}"
  1941 lemma lemma_Compl_eq: "- {n. u < norm (f n)} = {n. norm (f n) \<le> u}"
  1955 (*-------------------------------------
  1955 (*-------------------------------------
  1956   Exclude this type of sets from free
  1956   Exclude this type of sets from free
  1957   ultrafilter for Infinite numbers!
  1957   ultrafilter for Infinite numbers!
  1958  -------------------------------------*)
  1958  -------------------------------------*)
  1959 lemma FreeUltrafilterNat_const_Finite:
  1959 lemma FreeUltrafilterNat_const_Finite:
  1960      "{n. norm (X n) = u} \<in> FreeUltrafilterNat ==> star_n X \<in> HFinite"
  1960      "eventually (\<lambda>n. norm (X n) = u) FreeUltrafilterNat ==> star_n X \<in> HFinite"
  1961 apply (rule FreeUltrafilterNat_HFinite)
  1961 apply (rule FreeUltrafilterNat_HFinite)
  1962 apply (rule_tac x = "u + 1" in exI)
  1962 apply (rule_tac x = "u + 1" in exI)
  1963 apply (erule ultra, simp)
  1963 apply (auto elim: eventually_elim1)
  1964 done
  1964 done
  1965 
  1965 
  1966 lemma HInfinite_FreeUltrafilterNat:
  1966 lemma HInfinite_FreeUltrafilterNat:
  1967      "star_n X \<in> HInfinite ==> \<forall>u. {n. u < norm (X n)} \<in> FreeUltrafilterNat"
  1967      "star_n X \<in> HInfinite ==> \<forall>u. eventually (\<lambda>n. u < norm (X n)) FreeUltrafilterNat"
  1968 apply (drule HInfinite_HFinite_iff [THEN iffD1])
  1968 apply (drule HInfinite_HFinite_iff [THEN iffD1])
  1969 apply (simp add: HFinite_FreeUltrafilterNat_iff)
  1969 apply (simp add: HFinite_FreeUltrafilterNat_iff)
  1970 apply (rule allI, drule_tac x="u + 1" in spec)
  1970 apply (rule allI, drule_tac x="u + 1" in spec)
  1971 apply (drule FreeUltrafilterNat.not_memD)
  1971 apply (simp add: FreeUltrafilterNat.eventually_not_iff[symmetric])
  1972 apply (simp add: Collect_neg_eq [symmetric] linorder_not_less)
  1972 apply (auto elim: eventually_elim1)
  1973 apply (erule ultra, simp)
       
  1974 done
  1973 done
  1975 
  1974 
  1976 lemma lemma_Int_HI:
  1975 lemma lemma_Int_HI:
  1977      "{n. norm (Xa n) < u} Int {n. X n = Xa n} \<subseteq> {n. norm (X n) < (u::real)}"
  1976      "{n. norm (Xa n) < u} Int {n. X n = Xa n} \<subseteq> {n. norm (X n) < (u::real)}"
  1978 by auto
  1977 by auto
  1979 
  1978 
  1980 lemma lemma_Int_HIa: "{n. u < norm (X n)} Int {n. norm (X n) < u} = {}"
  1979 lemma lemma_Int_HIa: "{n. u < norm (X n)} Int {n. norm (X n) < u} = {}"
  1981 by (auto intro: order_less_asym)
  1980 by (auto intro: order_less_asym)
  1982 
  1981 
  1983 lemma FreeUltrafilterNat_HInfinite:
  1982 lemma FreeUltrafilterNat_HInfinite:
  1984      "\<forall>u. {n. u < norm (X n)} \<in> FreeUltrafilterNat ==> star_n X \<in> HInfinite"
  1983      "\<forall>u. eventually (\<lambda>n. u < norm (X n)) FreeUltrafilterNat ==> star_n X \<in> HInfinite"
  1985 apply (rule HInfinite_HFinite_iff [THEN iffD2])
  1984 apply (rule HInfinite_HFinite_iff [THEN iffD2])
  1986 apply (safe, drule HFinite_FreeUltrafilterNat, safe)
  1985 apply (safe, drule HFinite_FreeUltrafilterNat, safe)
  1987 apply (drule_tac x = u in spec)
  1986 apply (drule_tac x = u in spec)
  1988 apply (drule (1) FreeUltrafilterNat.Int)
  1987 proof -
  1989 apply (simp add: Collect_conj_eq [symmetric])
  1988   fix u assume "\<forall>\<^sub>Fn in \<U>. norm (X n) < u" "\<forall>\<^sub>Fn in \<U>. u < norm (X n)"
  1990 apply (subgoal_tac "\<forall>n. \<not> (norm (X n) < u \<and> u < norm (X n))", auto)
  1989   then have "\<forall>\<^sub>F x in \<U>. False"
  1991 done
  1990     by eventually_elim auto
       
  1991   then show False
       
  1992     by (simp add: eventually_False FreeUltrafilterNat.proper)
       
  1993 qed
  1992 
  1994 
  1993 lemma HInfinite_FreeUltrafilterNat_iff:
  1995 lemma HInfinite_FreeUltrafilterNat_iff:
  1994      "(star_n X \<in> HInfinite) = (\<forall>u. {n. u < norm (X n)} \<in> FreeUltrafilterNat)"
  1996      "(star_n X \<in> HInfinite) = (\<forall>u. eventually (\<lambda>n. u < norm (X n)) FreeUltrafilterNat)"
  1995 by (blast intro!: HInfinite_FreeUltrafilterNat FreeUltrafilterNat_HInfinite)
  1997 by (blast intro!: HInfinite_FreeUltrafilterNat FreeUltrafilterNat_HInfinite)
  1996 
  1998 
  1997 subsubsection {* @{term Infinitesimal} *}
  1999 subsubsection {* @{term Infinitesimal} *}
  1998 
  2000 
  1999 lemma ball_SReal_eq: "(\<forall>x::hypreal \<in> Reals. P x) = (\<forall>x::real. P (star_of x))"
  2001 lemma ball_SReal_eq: "(\<forall>x::hypreal \<in> Reals. P x) = (\<forall>x::real. P (star_of x))"
  2000 by (unfold SReal_def, auto)
  2002 by (unfold SReal_def, auto)
  2001 
  2003 
  2002 lemma Infinitesimal_FreeUltrafilterNat:
  2004 lemma Infinitesimal_FreeUltrafilterNat:
  2003      "star_n X \<in> Infinitesimal ==> \<forall>u>0. {n. norm (X n) < u} \<in> \<U>"
  2005      "star_n X \<in> Infinitesimal ==> \<forall>u>0. eventually (\<lambda>n. norm (X n) < u) \<U>"
  2004 apply (simp add: Infinitesimal_def ball_SReal_eq)
  2006 apply (simp add: Infinitesimal_def ball_SReal_eq)
  2005 apply (simp add: hnorm_def starfun_star_n star_of_def)
  2007 apply (simp add: hnorm_def starfun_star_n star_of_def)
  2006 apply (simp add: star_less_def starP2_star_n)
  2008 apply (simp add: star_less_def starP2_star_n)
  2007 done
  2009 done
  2008 
  2010 
  2009 lemma FreeUltrafilterNat_Infinitesimal:
  2011 lemma FreeUltrafilterNat_Infinitesimal:
  2010      "\<forall>u>0. {n. norm (X n) < u} \<in> \<U> ==> star_n X \<in> Infinitesimal"
  2012      "\<forall>u>0. eventually (\<lambda>n. norm (X n) < u) \<U> ==> star_n X \<in> Infinitesimal"
  2011 apply (simp add: Infinitesimal_def ball_SReal_eq)
  2013 apply (simp add: Infinitesimal_def ball_SReal_eq)
  2012 apply (simp add: hnorm_def starfun_star_n star_of_def)
  2014 apply (simp add: hnorm_def starfun_star_n star_of_def)
  2013 apply (simp add: star_less_def starP2_star_n)
  2015 apply (simp add: star_less_def starP2_star_n)
  2014 done
  2016 done
  2015 
  2017 
  2016 lemma Infinitesimal_FreeUltrafilterNat_iff:
  2018 lemma Infinitesimal_FreeUltrafilterNat_iff:
  2017      "(star_n X \<in> Infinitesimal) = (\<forall>u>0. {n. norm (X n) < u} \<in> \<U>)"
  2019      "(star_n X \<in> Infinitesimal) = (\<forall>u>0. eventually (\<lambda>n. norm (X n) < u) \<U>)"
  2018 by (blast intro!: Infinitesimal_FreeUltrafilterNat FreeUltrafilterNat_Infinitesimal)
  2020 by (blast intro!: Infinitesimal_FreeUltrafilterNat FreeUltrafilterNat_Infinitesimal)
  2019 
  2021 
  2020 (*------------------------------------------------------------------------
  2022 (*------------------------------------------------------------------------
  2021          Infinitesimals as smaller than 1/n for all n::nat (> 0)
  2023          Infinitesimals as smaller than 1/n for all n::nat (> 0)
  2022  ------------------------------------------------------------------------*)
  2024  ------------------------------------------------------------------------*)
  2085 lemma finite_rabs_real_of_nat_le_real: "finite {n::nat. abs(real n) \<le> u}"
  2087 lemma finite_rabs_real_of_nat_le_real: "finite {n::nat. abs(real n) \<le> u}"
  2086 apply (simp (no_asm) add: real_of_nat_Suc_gt_zero finite_real_of_nat_le_real)
  2088 apply (simp (no_asm) add: real_of_nat_Suc_gt_zero finite_real_of_nat_le_real)
  2087 done
  2089 done
  2088 
  2090 
  2089 lemma rabs_real_of_nat_le_real_FreeUltrafilterNat:
  2091 lemma rabs_real_of_nat_le_real_FreeUltrafilterNat:
  2090      "{n. abs(real n) \<le> u} \<notin> FreeUltrafilterNat"
  2092      "\<not> eventually (\<lambda>n. abs(real n) \<le> u) FreeUltrafilterNat"
  2091 by (blast intro!: FreeUltrafilterNat.finite finite_rabs_real_of_nat_le_real)
  2093 by (blast intro!: FreeUltrafilterNat.finite finite_rabs_real_of_nat_le_real)
  2092 
  2094 
  2093 lemma FreeUltrafilterNat_nat_gt_real: "{n. u < real n} \<in> FreeUltrafilterNat"
  2095 lemma FreeUltrafilterNat_nat_gt_real: "eventually (\<lambda>n. u < real n) FreeUltrafilterNat"
  2094 apply (rule ccontr, drule FreeUltrafilterNat.not_memD)
  2096 apply (rule FreeUltrafilterNat.finite')
  2095 apply (subgoal_tac "- {n::nat. u < real n} = {n. real n \<le> u}")
  2097 apply (subgoal_tac "{n::nat. \<not> u < real n} = {n. real n \<le> u}")
  2096 prefer 2 apply force
  2098 apply (auto simp add: finite_real_of_nat_le_real)
  2097 apply (simp add: finite_real_of_nat_le_real [THEN FreeUltrafilterNat.finite])
       
  2098 done
  2099 done
  2099 
  2100 
  2100 (*--------------------------------------------------------------
  2101 (*--------------------------------------------------------------
  2101  The complement of {n. abs(real n) \<le> u} =
  2102  The complement of {n. abs(real n) \<le> u} =
  2102  {n. u < abs (real n)} is in FreeUltrafilterNat
  2103  {n. u < abs (real n)} is in FreeUltrafilterNat
  2106 lemma Compl_real_le_eq: "- {n::nat. real n \<le> u} = {n. u < real n}"
  2107 lemma Compl_real_le_eq: "- {n::nat. real n \<le> u} = {n. u < real n}"
  2107 by (auto dest!: order_le_less_trans simp add: linorder_not_le)
  2108 by (auto dest!: order_le_less_trans simp add: linorder_not_le)
  2108 
  2109 
  2109 text{*@{term omega} is a member of @{term HInfinite}*}
  2110 text{*@{term omega} is a member of @{term HInfinite}*}
  2110 
  2111 
  2111 lemma FreeUltrafilterNat_omega: "{n. u < real n} \<in> FreeUltrafilterNat"
  2112 lemma FreeUltrafilterNat_omega: "eventually (\<lambda>n. u < real n) FreeUltrafilterNat"
  2112 apply (cut_tac u = u in rabs_real_of_nat_le_real_FreeUltrafilterNat)
  2113   by (fact FreeUltrafilterNat_nat_gt_real)
  2113 apply (auto dest: FreeUltrafilterNat.not_memD simp add: Compl_real_le_eq)
       
  2114 done
       
  2115 
  2114 
  2116 theorem HInfinite_omega [simp]: "omega \<in> HInfinite"
  2115 theorem HInfinite_omega [simp]: "omega \<in> HInfinite"
  2117 apply (simp add: omega_def)
  2116 apply (simp add: omega_def)
  2118 apply (rule FreeUltrafilterNat_HInfinite)
  2117 apply (rule FreeUltrafilterNat_HInfinite)
  2119 apply (simp add: real_of_nat_Suc diff_less_eq [symmetric] FreeUltrafilterNat_omega)
  2118 apply (simp add: real_of_nat_Suc diff_less_eq [symmetric] FreeUltrafilterNat_omega)
  2163 lemma finite_inverse_real_of_posnat_ge_real:
  2162 lemma finite_inverse_real_of_posnat_ge_real:
  2164      "0 < u ==> finite {n. u \<le> inverse(real(Suc n))}"
  2163      "0 < u ==> finite {n. u \<le> inverse(real(Suc n))}"
  2165 by (auto simp add: lemma_real_le_Un_eq2 lemma_finite_epsilon_set finite_inverse_real_of_posnat_gt_real)
  2164 by (auto simp add: lemma_real_le_Un_eq2 lemma_finite_epsilon_set finite_inverse_real_of_posnat_gt_real)
  2166 
  2165 
  2167 lemma inverse_real_of_posnat_ge_real_FreeUltrafilterNat:
  2166 lemma inverse_real_of_posnat_ge_real_FreeUltrafilterNat:
  2168      "0 < u ==> {n. u \<le> inverse(real(Suc n))} \<notin> FreeUltrafilterNat"
  2167      "0 < u ==> \<not> eventually (\<lambda>n. u \<le> inverse(real(Suc n))) FreeUltrafilterNat"
  2169 by (blast intro!: FreeUltrafilterNat.finite finite_inverse_real_of_posnat_ge_real)
  2168 by (blast intro!: FreeUltrafilterNat.finite finite_inverse_real_of_posnat_ge_real)
  2170 
  2169 
  2171 (*--------------------------------------------------------------
  2170 (*--------------------------------------------------------------
  2172     The complement of  {n. u \<le> inverse(real(Suc n))} =
  2171     The complement of  {n. u \<le> inverse(real(Suc n))} =
  2173     {n. inverse(real(Suc n)) < u} is in FreeUltrafilterNat
  2172     {n. inverse(real(Suc n)) < u} is in FreeUltrafilterNat
  2177      "- {n. u \<le> inverse(real(Suc n))} = {n. inverse(real(Suc n)) < u}"
  2176      "- {n. u \<le> inverse(real(Suc n))} = {n. inverse(real(Suc n)) < u}"
  2178 by (auto dest!: order_le_less_trans simp add: linorder_not_le)
  2177 by (auto dest!: order_le_less_trans simp add: linorder_not_le)
  2179 
  2178 
  2180 
  2179 
  2181 lemma FreeUltrafilterNat_inverse_real_of_posnat:
  2180 lemma FreeUltrafilterNat_inverse_real_of_posnat:
  2182      "0 < u ==>
  2181      "0 < u ==> eventually (\<lambda>n. inverse(real(Suc n)) < u) FreeUltrafilterNat"
  2183       {n. inverse(real(Suc n)) < u} \<in> FreeUltrafilterNat"
  2182 by (drule inverse_real_of_posnat_ge_real_FreeUltrafilterNat)
  2184 by (metis Compl_le_inverse_eq FreeUltrafilterNat.ultra inverse_real_of_posnat_ge_real_FreeUltrafilterNat)
  2183    (simp add: FreeUltrafilterNat.eventually_not_iff not_le[symmetric])
  2185 
  2184 
  2186 text{* Example of an hypersequence (i.e. an extended standard sequence)
  2185 text{* Example of an hypersequence (i.e. an extended standard sequence)
  2187    whose term with an hypernatural suffix is an infinitesimal i.e.
  2186    whose term with an hypernatural suffix is an infinitesimal i.e.
  2188    the whn'nth term of the hypersequence is a member of Infinitesimal*}
  2187    the whn'nth term of the hypersequence is a member of Infinitesimal*}
  2189 
  2188 
  2206  -----------------------------------------------------*)
  2205  -----------------------------------------------------*)
  2207 lemma real_seq_to_hypreal_Infinitesimal:
  2206 lemma real_seq_to_hypreal_Infinitesimal:
  2208      "\<forall>n. norm(X n - x) < inverse(real(Suc n))
  2207      "\<forall>n. norm(X n - x) < inverse(real(Suc n))
  2209      ==> star_n X - star_of x \<in> Infinitesimal"
  2208      ==> star_n X - star_of x \<in> Infinitesimal"
  2210 unfolding star_n_diff star_of_def Infinitesimal_FreeUltrafilterNat_iff star_n_inverse
  2209 unfolding star_n_diff star_of_def Infinitesimal_FreeUltrafilterNat_iff star_n_inverse
  2211 by (auto dest: FreeUltrafilterNat_inverse_real_of_posnat FreeUltrafilterNat.Int 
  2210 by (auto dest!: FreeUltrafilterNat_inverse_real_of_posnat  
  2212          intro: order_less_trans FreeUltrafilterNat.subset)
  2211          intro: order_less_trans elim!: eventually_elim1)
  2213 
  2212 
  2214 lemma real_seq_to_hypreal_approx:
  2213 lemma real_seq_to_hypreal_approx:
  2215      "\<forall>n. norm(X n - x) < inverse(real(Suc n))
  2214      "\<forall>n. norm(X n - x) < inverse(real(Suc n))
  2216       ==> star_n X @= star_of x"
  2215       ==> star_n X @= star_of x"
  2217 by (metis bex_Infinitesimal_iff real_seq_to_hypreal_Infinitesimal)
  2216 by (metis bex_Infinitesimal_iff real_seq_to_hypreal_Infinitesimal)
  2223 
  2222 
  2224 lemma real_seq_to_hypreal_Infinitesimal2:
  2223 lemma real_seq_to_hypreal_Infinitesimal2:
  2225      "\<forall>n. norm(X n - Y n) < inverse(real(Suc n))
  2224      "\<forall>n. norm(X n - Y n) < inverse(real(Suc n))
  2226       ==> star_n X - star_n Y \<in> Infinitesimal"
  2225       ==> star_n X - star_n Y \<in> Infinitesimal"
  2227 unfolding Infinitesimal_FreeUltrafilterNat_iff star_n_diff
  2226 unfolding Infinitesimal_FreeUltrafilterNat_iff star_n_diff
  2228 by (auto dest: FreeUltrafilterNat_inverse_real_of_posnat
  2227 by (auto dest!: FreeUltrafilterNat_inverse_real_of_posnat
  2229          intro: order_less_trans FreeUltrafilterNat.subset)
  2228          intro: order_less_trans elim!: eventually_elim1)
  2230 
  2229 
  2231 end
  2230 end