# HG changeset patch # User hoelzl # Date 1300109857 -3600 # Node ID 8885ba6296927d1a947db67792439abe58172a35 # Parent a54e8e95fe962311c31b22ab26a8d802681562a0 add lemmas for monotone sequences diff -r a54e8e95fe96 -r 8885ba629692 src/HOL/SEQ.thy --- a/src/HOL/SEQ.thy Mon Mar 14 14:37:36 2011 +0100 +++ b/src/HOL/SEQ.thy Mon Mar 14 14:37:37 2011 +0100 @@ -13,25 +13,7 @@ imports Limits RComplete begin -abbreviation - LIMSEQ :: "[nat \ 'a::topological_space, 'a] \ bool" - ("((_)/ ----> (_))" [60, 60] 60) where - "X ----> L \ (X ---> L) sequentially" - -definition - lim :: "(nat \ 'a::metric_space) \ 'a" where - --{*Standard definition of limit using choice operator*} - "lim X = (THE L. X ----> L)" - -definition - convergent :: "(nat \ 'a::metric_space) \ bool" where - --{*Standard definition of convergence*} - "convergent X = (\L. X ----> L)" - -definition - Bseq :: "(nat => 'a::real_normed_vector) => bool" where - --{*Standard definition for bounded sequence*} - "Bseq X = (\K>0.\n. norm (X n) \ K)" +subsection {* Monotone sequences and subsequences *} definition monoseq :: "(nat \ 'a::order) \ bool" where @@ -56,6 +38,171 @@ --{*Definition of subsequence*} "subseq f \ (\m. \n>m. f m < f n)" +lemma incseq_mono: "mono f \ incseq f" + unfolding mono_def incseq_def by auto + +lemma incseq_SucI: + "(\n. X n \ X (Suc n)) \ incseq X" + using lift_Suc_mono_le[of X] + by (auto simp: incseq_def) + +lemma incseqD: "\i j. incseq f \ i \ j \ f i \ f j" + by (auto simp: incseq_def) + +lemma incseq_SucD: "incseq A \ A i \ A (Suc i)" + using incseqD[of A i "Suc i"] by auto + +lemma incseq_Suc_iff: "incseq f \ (\n. f n \ f (Suc n))" + by (auto intro: incseq_SucI dest: incseq_SucD) + +lemma incseq_const[simp, intro]: "incseq (\x. k)" + unfolding incseq_def by auto + +lemma decseq_SucI: + "(\n. X (Suc n) \ X n) \ decseq X" + using order.lift_Suc_mono_le[OF dual_order, of X] + by (auto simp: decseq_def) + +lemma decseqD: "\i j. decseq f \ i \ j \ f j \ f i" + by (auto simp: decseq_def) + +lemma decseq_SucD: "decseq A \ A (Suc i) \ A i" + using decseqD[of A i "Suc i"] by auto + +lemma decseq_Suc_iff: "decseq f \ (\n. f (Suc n) \ f n)" + by (auto intro: decseq_SucI dest: decseq_SucD) + +lemma decseq_const[simp, intro]: "decseq (\x. k)" + unfolding decseq_def by auto + +lemma monoseq_iff: "monoseq X \ incseq X \ decseq X" + unfolding monoseq_def incseq_def decseq_def .. + +lemma monoseq_Suc: + "monoseq X \ (\n. X n \ X (Suc n)) \ (\n. X (Suc n) \ X n)" + unfolding monoseq_iff incseq_Suc_iff decseq_Suc_iff .. + +lemma monoI1: "\m. \ n \ m. X m \ X n ==> monoseq X" +by (simp add: monoseq_def) + +lemma monoI2: "\m. \ n \ m. X n \ X m ==> monoseq X" +by (simp add: monoseq_def) + +lemma mono_SucI1: "\n. X n \ X (Suc n) ==> monoseq X" +by (simp add: monoseq_Suc) + +lemma mono_SucI2: "\n. X (Suc n) \ X n ==> monoseq X" +by (simp add: monoseq_Suc) + +lemma monoseq_minus: + fixes a :: "nat \ 'a::ordered_ab_group_add" + assumes "monoseq a" + shows "monoseq (\ n. - a n)" +proof (cases "\ m. \ n \ m. a m \ a n") + case True + hence "\ m. \ n \ m. - a n \ - a m" by auto + thus ?thesis by (rule monoI2) +next + case False + hence "\ m. \ n \ m. - a m \ - a n" using `monoseq a`[unfolded monoseq_def] by auto + thus ?thesis by (rule monoI1) +qed + +text{*Subsequence (alternative definition, (e.g. Hoskins)*} + +lemma subseq_Suc_iff: "subseq f = (\n. (f n) < (f (Suc n)))" +apply (simp add: subseq_def) +apply (auto dest!: less_imp_Suc_add) +apply (induct_tac k) +apply (auto intro: less_trans) +done + +text{* for any sequence, there is a monotonic subsequence *} +lemma seq_monosub: + fixes s :: "nat => 'a::linorder" + shows "\f. subseq f \ monoseq (\ n. (s (f n)))" +proof cases + let "?P p n" = "p > n \ (\m\p. s m \ s p)" + assume *: "\n. \p. ?P p n" + def f \ "nat_rec (SOME p. ?P p 0) (\_ n. SOME p. ?P p n)" + have f_0: "f 0 = (SOME p. ?P p 0)" unfolding f_def by simp + have f_Suc: "\i. f (Suc i) = (SOME p. ?P p (f i))" unfolding f_def nat_rec_Suc .. + have P_0: "?P (f 0) 0" unfolding f_0 using *[rule_format] by (rule someI2_ex) auto + have P_Suc: "\i. ?P (f (Suc i)) (f i)" unfolding f_Suc using *[rule_format] by (rule someI2_ex) auto + then have "subseq f" unfolding subseq_Suc_iff by auto + moreover have "monoseq (\n. s (f n))" unfolding monoseq_Suc + proof (intro disjI2 allI) + fix n show "s (f (Suc n)) \ s (f n)" + proof (cases n) + case 0 with P_Suc[of 0] P_0 show ?thesis by auto + next + case (Suc m) + from P_Suc[of n] Suc have "f (Suc m) \ f (Suc (Suc m))" by simp + with P_Suc Suc show ?thesis by simp + qed + qed + ultimately show ?thesis by auto +next + let "?P p m" = "m < p \ s m < s p" + assume "\ (\n. \p>n. (\m\p. s m \ s p))" + then obtain N where N: "\p. p > N \ \m>p. s p < s m" by (force simp: not_le le_less) + def f \ "nat_rec (SOME p. ?P p (Suc N)) (\_ n. SOME p. ?P p n)" + have f_0: "f 0 = (SOME p. ?P p (Suc N))" unfolding f_def by simp + have f_Suc: "\i. f (Suc i) = (SOME p. ?P p (f i))" unfolding f_def nat_rec_Suc .. + have P_0: "?P (f 0) (Suc N)" + unfolding f_0 some_eq_ex[of "\p. ?P p (Suc N)"] using N[of "Suc N"] by auto + { fix i have "N < f i \ ?P (f (Suc i)) (f i)" + unfolding f_Suc some_eq_ex[of "\p. ?P p (f i)"] using N[of "f i"] . } + note P' = this + { fix i have "N < f i \ ?P (f (Suc i)) (f i)" + by (induct i) (insert P_0 P', auto) } + then have "subseq f" "monoseq (\x. s (f x))" + unfolding subseq_Suc_iff monoseq_Suc by (auto simp: not_le intro: less_imp_le) + then show ?thesis by auto +qed + +lemma seq_suble: assumes sf: "subseq f" shows "n \ f n" +proof(induct n) + case 0 thus ?case by simp +next + case (Suc n) + from sf[unfolded subseq_Suc_iff, rule_format, of n] Suc.hyps + have "n < f (Suc n)" by arith + thus ?case by arith +qed + +lemma incseq_imp_monoseq: "incseq X \ monoseq X" + by (simp add: incseq_def monoseq_def) + +lemma decseq_imp_monoseq: "decseq X \ monoseq X" + by (simp add: decseq_def monoseq_def) + +lemma decseq_eq_incseq: + fixes X :: "nat \ 'a::ordered_ab_group_add" shows "decseq X = incseq (\n. - X n)" + by (simp add: decseq_def incseq_def) + +subsection {* Defintions of limits *} + +abbreviation + LIMSEQ :: "[nat \ 'a::topological_space, 'a] \ bool" + ("((_)/ ----> (_))" [60, 60] 60) where + "X ----> L \ (X ---> L) sequentially" + +definition + lim :: "(nat \ 'a::metric_space) \ 'a" where + --{*Standard definition of limit using choice operator*} + "lim X = (THE L. X ----> L)" + +definition + convergent :: "(nat \ 'a::metric_space) \ bool" where + --{*Standard definition of convergence*} + "convergent X = (\L. X ----> L)" + +definition + Bseq :: "(nat => 'a::real_normed_vector) => bool" where + --{*Standard definition for bounded sequence*} + "Bseq X = (\K>0.\n. norm (X n) \ K)" + definition Cauchy :: "(nat \ 'a::metric_space) \ bool" where --{*Standard definition of the Cauchy condition*} @@ -502,53 +649,6 @@ qed qed -text{*Subsequence (alternative definition, (e.g. Hoskins)*} - -lemma subseq_Suc_iff: "subseq f = (\n. (f n) < (f (Suc n)))" -apply (simp add: subseq_def) -apply (auto dest!: less_imp_Suc_add) -apply (induct_tac k) -apply (auto intro: less_trans) -done - -lemma monoseq_Suc: - "monoseq X \ (\n. X n \ X (Suc n)) \ (\n. X (Suc n) \ X n)" -apply (simp add: monoseq_def) -apply (auto dest!: le_imp_less_or_eq) -apply (auto intro!: lessI [THEN less_imp_le] dest!: less_imp_Suc_add) -apply (induct_tac "ka") -apply (auto intro: order_trans) -apply (erule contrapos_np) -apply (induct_tac "k") -apply (auto intro: order_trans) -done - -lemma monoI1: "\m. \ n \ m. X m \ X n ==> monoseq X" -by (simp add: monoseq_def) - -lemma monoI2: "\m. \ n \ m. X n \ X m ==> monoseq X" -by (simp add: monoseq_def) - -lemma mono_SucI1: "\n. X n \ X (Suc n) ==> monoseq X" -by (simp add: monoseq_Suc) - -lemma mono_SucI2: "\n. X (Suc n) \ X n ==> monoseq X" -by (simp add: monoseq_Suc) - -lemma monoseq_minus: - fixes a :: "nat \ 'a::ordered_ab_group_add" - assumes "monoseq a" - shows "monoseq (\ n. - a n)" -proof (cases "\ m. \ n \ m. a m \ a n") - case True - hence "\ m. \ n \ m. - a n \ - a m" by auto - thus ?thesis by (rule monoI2) -next - case False - hence "\ m. \ n \ m. - a m \ - a n" using `monoseq a`[unfolded monoseq_def] by auto - thus ?thesis by (rule monoI1) -qed - lemma monoseq_le: fixes a :: "nat \ real" assumes "monoseq a" and "a ----> x" @@ -602,60 +702,6 @@ qed auto qed -text{* for any sequence, there is a monotonic subsequence *} -lemma seq_monosub: - fixes s :: "nat => 'a::linorder" - shows "\f. subseq f \ monoseq (\ n. (s (f n)))" -proof cases - let "?P p n" = "p > n \ (\m\p. s m \ s p)" - assume *: "\n. \p. ?P p n" - def f \ "nat_rec (SOME p. ?P p 0) (\_ n. SOME p. ?P p n)" - have f_0: "f 0 = (SOME p. ?P p 0)" unfolding f_def by simp - have f_Suc: "\i. f (Suc i) = (SOME p. ?P p (f i))" unfolding f_def nat_rec_Suc .. - have P_0: "?P (f 0) 0" unfolding f_0 using *[rule_format] by (rule someI2_ex) auto - have P_Suc: "\i. ?P (f (Suc i)) (f i)" unfolding f_Suc using *[rule_format] by (rule someI2_ex) auto - then have "subseq f" unfolding subseq_Suc_iff by auto - moreover have "monoseq (\n. s (f n))" unfolding monoseq_Suc - proof (intro disjI2 allI) - fix n show "s (f (Suc n)) \ s (f n)" - proof (cases n) - case 0 with P_Suc[of 0] P_0 show ?thesis by auto - next - case (Suc m) - from P_Suc[of n] Suc have "f (Suc m) \ f (Suc (Suc m))" by simp - with P_Suc Suc show ?thesis by simp - qed - qed - ultimately show ?thesis by auto -next - let "?P p m" = "m < p \ s m < s p" - assume "\ (\n. \p>n. (\m\p. s m \ s p))" - then obtain N where N: "\p. p > N \ \m>p. s p < s m" by (force simp: not_le le_less) - def f \ "nat_rec (SOME p. ?P p (Suc N)) (\_ n. SOME p. ?P p n)" - have f_0: "f 0 = (SOME p. ?P p (Suc N))" unfolding f_def by simp - have f_Suc: "\i. f (Suc i) = (SOME p. ?P p (f i))" unfolding f_def nat_rec_Suc .. - have P_0: "?P (f 0) (Suc N)" - unfolding f_0 some_eq_ex[of "\p. ?P p (Suc N)"] using N[of "Suc N"] by auto - { fix i have "N < f i \ ?P (f (Suc i)) (f i)" - unfolding f_Suc some_eq_ex[of "\p. ?P p (f i)"] using N[of "f i"] . } - note P' = this - { fix i have "N < f i \ ?P (f (Suc i)) (f i)" - by (induct i) (insert P_0 P', auto) } - then have "subseq f" "monoseq (\x. s (f x))" - unfolding subseq_Suc_iff monoseq_Suc by (auto simp: not_le intro: less_imp_le) - then show ?thesis by auto -qed - -lemma seq_suble: assumes sf: "subseq f" shows "n \ f n" -proof(induct n) - case 0 thus ?case by simp -next - case (Suc n) - from sf[unfolded subseq_Suc_iff, rule_format, of n] Suc.hyps - have "n < f (Suc n)" by arith - thus ?case by arith -qed - lemma LIMSEQ_subseq_LIMSEQ: "\ X ----> L; subseq f \ \ (X o f) ----> L" apply (rule topological_tendstoI) @@ -810,9 +856,6 @@ subsubsection{*Increasing and Decreasing Series*} -lemma incseq_imp_monoseq: "incseq X \ monoseq X" - by (simp add: incseq_def monoseq_def) - lemma incseq_le: fixes X :: "nat \ real" assumes inc: "incseq X" and lim: "X ----> L" shows "X n \ L" @@ -834,32 +877,6 @@ by (blast intro: eq_refl X) qed -lemma incseq_SucI: - assumes "\n. X n \ X (Suc n)" - shows "incseq X" unfolding incseq_def -proof safe - fix m n :: nat - { fix d m :: nat - have "X m \ X (m + d)" - proof (induct d) - case (Suc d) - also have "X (m + d) \ X (m + Suc d)" - using assms by simp - finally show ?case . - qed simp } - note this[of m "n - m"] - moreover assume "m \ n" - ultimately show "X m \ X n" by simp -qed - -lemma decseq_imp_monoseq: "decseq X \ monoseq X" - by (simp add: decseq_def monoseq_def) - -lemma decseq_eq_incseq: - fixes X :: "nat \ 'a::ordered_ab_group_add" shows "decseq X = incseq (\n. - X n)" - by (simp add: decseq_def incseq_def) - - lemma decseq_le: fixes X :: "nat \ real" assumes dec: "decseq X" and lim: "X ----> L" shows "L \ X n" proof -