# HG changeset patch # User huffman # Date 1159397856 -7200 # Node ID 93271c59d211f94e8a3c3e0f03629b208cdd3a2b # Parent 8bd4e37ff05c87cd97cfa273b7134e9463278f93 add intro/dest rules for (NS)LIMSEQ and (NS)Cauchy; rewrite equivalence proofs using transfer diff -r 8bd4e37ff05c -r 93271c59d211 src/HOL/Hyperreal/SEQ.thy --- a/src/HOL/Hyperreal/SEQ.thy Thu Sep 28 00:10:08 2006 +0200 +++ b/src/HOL/Hyperreal/SEQ.thy Thu Sep 28 00:57:36 2006 +0200 @@ -73,6 +73,14 @@ "(X ----> L) = (\r>0. \no. \n \ no. norm (X n - L) < r)" by (simp add: LIMSEQ_def) +lemma LIMSEQ_I: + "(\r. 0 < r \ \no. \n\no. norm (X n - L) < r) \ X ----> L" +by (simp add: LIMSEQ_def) + +lemma LIMSEQ_D: + "\X ----> L; 0 < r\ \ \no. \n\no. norm (X n - L) < r" +by (simp add: LIMSEQ_def) + lemma LIMSEQ_const: "(%n. k) ----> k" by (simp add: LIMSEQ_def) @@ -113,6 +121,14 @@ "(X ----NS> L) = (\N \ HNatInfinite. ( *f* X) N \ star_of L)" by (simp add: NSLIMSEQ_def) +lemma NSLIMSEQ_I: + "(\N. N \ HNatInfinite \ starfun X N \ star_of L) \ X ----NS> L" +by (simp add: NSLIMSEQ_def) + +lemma NSLIMSEQ_D: + "\X ----NS> L; N \ HNatInfinite\ \ starfun X N \ star_of L" +by (simp add: NSLIMSEQ_def) + lemma NSLIMSEQ_const: "(%n. k) ----NS> k" by (simp add: NSLIMSEQ_def) @@ -179,101 +195,51 @@ subsubsection {* Equivalence of @{term LIMSEQ} and @{term NSLIMSEQ} *} -text{*LIMSEQ ==> NSLIMSEQ*} - lemma LIMSEQ_NSLIMSEQ: - "X ----> L ==> X ----NS> L" -apply (simp add: LIMSEQ_def NSLIMSEQ_def, safe) -apply (rule_tac x = N in star_cases) -apply (simp add: HNatInfinite_FreeUltrafilterNat_iff) -apply (rule approx_minus_iff [THEN iffD2]) -apply (auto simp add: starfun mem_infmal_iff [symmetric] star_of_def - star_n_diff Infinitesimal_FreeUltrafilterNat_iff) -apply (drule_tac x = u in spec, safe) -apply (drule_tac x = no in spec) -apply (erule ultra, simp add: less_imp_le) -done - -text{*NSLIMSEQ ==> LIMSEQ*} + assumes X: "X ----> L" shows "X ----NS> L" +proof (rule NSLIMSEQ_I) + fix N assume N: "N \ HNatInfinite" + have "starfun X N - star_of L \ Infinitesimal" + proof (rule InfinitesimalI2) + fix r::real assume r: "0 < r" + from LIMSEQ_D [OF X r] + obtain no where "\n\no. norm (X n - L) < r" .. + hence "\n\star_of no. hnorm (starfun X n - star_of L) < star_of r" + by transfer + thus "hnorm (starfun X N - star_of L) < star_of r" + using N by (simp add: star_of_le_HNatInfinite) + qed + thus "starfun X N \ star_of L" + by (unfold approx_def) +qed -lemma lemma_NSLIMSEQ1: "!!(f::nat=>nat). \n. n \ f n - ==> {n. f n = 0} = {0} | {n. f n = 0} = {}" -apply auto -apply (drule_tac x = xa in spec) -apply (drule_tac [2] x = x in spec, auto) -done +lemma NSLIMSEQ_LIMSEQ: + assumes X: "X ----NS> L" shows "X ----> L" +proof (rule LIMSEQ_I) + fix r::real assume r: "0 < r" + have "\no. \n\no. hnorm (starfun X n - star_of L) < star_of r" + proof (intro exI allI impI) + fix n assume "whn \ n" + with HNatInfinite_whn have "n \ HNatInfinite" + by (rule HNatInfinite_upward_closed) + with X have "starfun X n \ star_of L" + by (rule NSLIMSEQ_D) + hence "starfun X n - star_of L \ Infinitesimal" + by (unfold approx_def) + thus "hnorm (starfun X n - star_of L) < star_of r" + using r by (rule InfinitesimalD2) + qed + thus "\no. \n\no. norm (X n - L) < r" + by transfer +qed -lemma lemma_NSLIMSEQ2: "{n. f n \ Suc u} = {n. f n \ u} Un {n. f n = Suc u}" -by (auto simp add: le_Suc_eq) +theorem LIMSEQ_NSLIMSEQ_iff: "(f ----> L) = (f ----NS> L)" +by (blast intro: LIMSEQ_NSLIMSEQ NSLIMSEQ_LIMSEQ) -lemma lemma_NSLIMSEQ3: - "!!(f::nat=>nat). \n. n \ f n ==> {n. f n = Suc u} \ {n. n \ Suc u}" -apply auto -apply (drule_tac x = x in spec, auto) -done - -text{* the following sequence @{term "f(n)"} defines a hypernatural *} +(* Used once by Integration/Rats.thy in AFP *) lemma NSLIMSEQ_finite_set: "!!(f::nat=>nat). \n. n \ f n ==> finite {n. f n \ u}" -apply (induct u) -apply (auto simp add: lemma_NSLIMSEQ2) -apply (auto intro: lemma_NSLIMSEQ3 [THEN finite_subset] finite_atMost [unfolded atMost_def]) -apply (drule lemma_NSLIMSEQ1, safe) -apply (simp_all (no_asm_simp)) -done - -lemma Compl_less_set: "- {n. u < (f::nat=>nat) n} = {n. f n \ u}" -by (auto dest: less_le_trans simp add: le_def) - -text{* the index set is in the free ultrafilter *} -lemma FreeUltrafilterNat_NSLIMSEQ: - "!!(f::nat=>nat). \n. n \ f n ==> {n. u < f n} : FreeUltrafilterNat" -apply (rule FreeUltrafilterNat_Compl_iff2 [THEN iffD2]) -apply (rule FreeUltrafilterNat_finite) -apply (auto dest: NSLIMSEQ_finite_set simp add: Compl_less_set) -done - -text{* thus, the sequence defines an infinite hypernatural! *} -lemma HNatInfinite_NSLIMSEQ: "\n. n \ f n - ==> star_n f : HNatInfinite" -apply (auto simp add: HNatInfinite_FreeUltrafilterNat_iff) -apply (erule FreeUltrafilterNat_NSLIMSEQ) -done - -lemma lemmaLIM: - "{n. X (f n) + - L = Y n} Int {n. norm (Y n) < r} \ - {n. norm (X (f n) + - L) < r}" -by auto - -lemma lemmaLIM2: - "{n. norm (X (f n) - L) < r} Int {n. r \ norm (X (f n) - L)} = {}" -by auto - -lemma lemmaLIM3: "[| 0 < r; \n. r \ norm (X (f n) - L); - ( *f* X) (star_n f) - - star_of L \ 0 |] ==> False" -apply (auto simp add: starfun mem_infmal_iff [symmetric] star_of_def star_n_diff Infinitesimal_FreeUltrafilterNat_iff) -apply (drule_tac x = r in spec, safe) -apply (drule FreeUltrafilterNat_all) -apply (drule FreeUltrafilterNat_Int, assumption) -apply (simp add: lemmaLIM2) -done - -lemma NSLIMSEQ_LIMSEQ: "X ----NS> L ==> X ----> L" -apply (simp add: LIMSEQ_def NSLIMSEQ_def) -apply (rule ccontr, simp, safe) -txt{* skolemization step *} -apply (drule no_choice, safe) -apply (drule_tac x = "star_n f" in bspec) -apply (drule_tac [2] approx_minus_iff [THEN iffD1]) -apply (simp_all add: linorder_not_less) -apply (blast intro: HNatInfinite_NSLIMSEQ) -apply (blast intro: lemmaLIM3) -done - -text{* Now, the all-important result is trivially proved! *} -theorem LIMSEQ_NSLIMSEQ_iff: "(f ----> L) = (f ----NS> L)" -by (blast intro: LIMSEQ_NSLIMSEQ NSLIMSEQ_LIMSEQ) +by (rule_tac B="{..u}" in finite_subset, auto intro: order_trans) subsubsection {* Derived theorems about @{term LIMSEQ} *} @@ -762,53 +728,68 @@ subsection {* Cauchy Sequences *} +lemma CauchyI: + "(\e. 0 < e \ \M. \m\M. \n\M. norm (X m - X n) < e) \ Cauchy X" +by (simp add: Cauchy_def) + +lemma CauchyD: + "\Cauchy X; 0 < e\ \ \M. \m\M. \n\M. norm (X m - X n) < e" +by (simp add: Cauchy_def) + +lemma NSCauchyI: + "(\M N. \M \ HNatInfinite; N \ HNatInfinite\ \ starfun X M \ starfun X N) + \ NSCauchy X" +by (simp add: NSCauchy_def) + +lemma NSCauchyD: + "\NSCauchy X; M \ HNatInfinite; N \ HNatInfinite\ + \ starfun X M \ starfun X N" +by (simp add: NSCauchy_def) + subsubsection{*Equivalence Between NS and Standard*} -text{*Standard Implies Nonstandard*} - -lemma lemmaCauchy1: - "star_n x : HNatInfinite - ==> {n. M \ x n} : FreeUltrafilterNat" -apply (auto simp add: HNatInfinite_FreeUltrafilterNat_iff) -apply (drule_tac x = M in spec, ultra) -done - -lemma lemmaCauchy2: - "{n. \m n. M \ m & M \ (n::nat) --> norm (X m - X n) < u} Int - {n. M \ xa n} Int {n. M \ x n} \ - {n. norm (X (xa n) - X (x n)) < u}" -by blast +lemma Cauchy_NSCauchy: + assumes X: "Cauchy X" shows "NSCauchy X" +proof (rule NSCauchyI) + fix M assume M: "M \ HNatInfinite" + fix N assume N: "N \ HNatInfinite" + have "starfun X M - starfun X N \ Infinitesimal" + proof (rule InfinitesimalI2) + fix r :: real assume r: "0 < r" + from CauchyD [OF X r] + obtain k where "\m\k. \n\k. norm (X m - X n) < r" .. + hence "\m\star_of k. \n\star_of k. + hnorm (starfun X m - starfun X n) < star_of r" + by transfer + thus "hnorm (starfun X M - starfun X N) < star_of r" + using M N by (simp add: star_of_le_HNatInfinite) + qed + thus "starfun X M \ starfun X N" + by (unfold approx_def) +qed -lemma Cauchy_NSCauchy: "Cauchy X ==> NSCauchy X" -apply (simp add: Cauchy_def NSCauchy_def, safe) -apply (rule_tac x = M in star_cases) -apply (rule_tac x = N in star_cases) -apply (rule approx_minus_iff [THEN iffD2]) -apply (rule mem_infmal_iff [THEN iffD1]) -apply (auto simp add: starfun star_n_diff Infinitesimal_FreeUltrafilterNat_iff) -apply (drule spec, auto) -apply (drule_tac M = M in lemmaCauchy1) -apply (drule_tac M = M in lemmaCauchy1) -apply (rule_tac x1 = Xaa in lemmaCauchy2 [THEN [2] FreeUltrafilterNat_subset]) -apply (rule FreeUltrafilterNat_Int) -apply (auto intro: FreeUltrafilterNat_Int) -done - -text{*Nonstandard Implies Standard*} - -lemma NSCauchy_Cauchy: "NSCauchy X ==> Cauchy X" -apply (auto simp add: Cauchy_def NSCauchy_def) -apply (rule ccontr, simp) -apply (auto dest!: no_choice HNatInfinite_NSLIMSEQ - simp add: all_conj_distrib) -apply (drule bspec, assumption) -apply (drule_tac x = "star_n fa" in bspec); -apply (auto simp add: starfun) -apply (drule approx_minus_iff [THEN iffD1]) -apply (drule mem_infmal_iff [THEN iffD2]) -apply (auto simp add: star_n_diff Infinitesimal_FreeUltrafilterNat_iff) -done - +lemma NSCauchy_Cauchy: + assumes X: "NSCauchy X" shows "Cauchy X" +proof (rule CauchyI) + fix r::real assume r: "0 < r" + have "\k. \m\k. \n\k. hnorm (starfun X m - starfun X n) < star_of r" + proof (intro exI allI impI) + fix M assume "whn \ M" + with HNatInfinite_whn have M: "M \ HNatInfinite" + by (rule HNatInfinite_upward_closed) + fix N assume "whn \ N" + with HNatInfinite_whn have N: "N \ HNatInfinite" + by (rule HNatInfinite_upward_closed) + from X M N have "starfun X M \ starfun X N" + by (rule NSCauchyD) + hence "starfun X M - starfun X N \ Infinitesimal" + by (unfold approx_def) + thus "hnorm (starfun X M - starfun X N) < star_of r" + using r by (rule InfinitesimalD2) + qed + thus "\k. \m\k. \n\k. norm (X m - X n) < r" + by transfer +qed theorem NSCauchy_Cauchy_iff: "NSCauchy X = Cauchy X" by (blast intro!: NSCauchy_Cauchy Cauchy_NSCauchy)