# HG changeset patch # User hoelzl # Date 1454957629 -3600 # Node ID 106569399cd60cfa1f4f8ecd54f0d3f63884d197 # Parent d2bc8a7e5fec870af53b44039378a2b96eecb508 add type class for topological monoids diff -r d2bc8a7e5fec -r 106569399cd6 src/HOL/Limits.thy --- a/src/HOL/Limits.thy Mon Feb 08 17:18:13 2016 +0100 +++ b/src/HOL/Limits.thy Mon Feb 08 19:53:49 2016 +0100 @@ -573,28 +573,64 @@ "((\x. \f x\) \ (0::real)) F \ (f \ 0) F" by (fold real_norm_def, rule tendsto_norm_zero_iff) -subsubsection \Addition and subtraction\ +subsection \Topological Monoid\ + +class topological_monoid_add = topological_space + monoid_add + + assumes tendsto_add_Pair: "LIM x (nhds a \\<^sub>F nhds b). fst x + snd x :> nhds (a + b)" + +class topological_comm_monoid_add = topological_monoid_add + comm_monoid_add lemma tendsto_add [tendsto_intros]: - fixes a b :: "'a::real_normed_vector" - shows "\(f \ a) F; (g \ b) F\ \ ((\x. f x + g x) \ a + b) F" - by (simp only: tendsto_Zfun_iff add_diff_add Zfun_add) + fixes a b :: "'a::topological_monoid_add" + shows "(f \ a) F \ (g \ b) F \ ((\x. f x + g x) \ a + b) F" + using filterlim_compose[OF tendsto_add_Pair, of "\x. (f x, g x)" a b F] + by (simp add: nhds_prod[symmetric] tendsto_Pair) lemma continuous_add [continuous_intros]: - fixes f g :: "'a::t2_space \ 'b::real_normed_vector" + fixes f g :: "_ \ 'b::topological_monoid_add" shows "continuous F f \ continuous F g \ continuous F (\x. f x + g x)" unfolding continuous_def by (rule tendsto_add) lemma continuous_on_add [continuous_intros]: - fixes f g :: "_ \ 'b::real_normed_vector" + fixes f g :: "_ \ 'b::topological_monoid_add" shows "continuous_on s f \ continuous_on s g \ continuous_on s (\x. f x + g x)" unfolding continuous_on_def by (auto intro: tendsto_add) lemma tendsto_add_zero: - fixes f g :: "_ \ 'b::real_normed_vector" + fixes f g :: "_ \ 'b::topological_monoid_add" shows "\(f \ 0) F; (g \ 0) F\ \ ((\x. f x + g x) \ 0) F" by (drule (1) tendsto_add, simp) +lemma tendsto_setsum [tendsto_intros]: + fixes f :: "'a \ 'b \ 'c::topological_comm_monoid_add" + assumes "\i. i \ S \ (f i \ a i) F" + shows "((\x. \i\S. f i x) \ (\i\S. a i)) F" +proof (cases "finite S") + assume "finite S" thus ?thesis using assms + by (induct, simp, simp add: tendsto_add) +qed simp + +lemma continuous_setsum [continuous_intros]: + fixes f :: "'a \ 'b::t2_space \ 'c::topological_comm_monoid_add" + shows "(\i. i \ S \ continuous F (f i)) \ continuous F (\x. \i\S. f i x)" + unfolding continuous_def by (rule tendsto_setsum) + +lemma continuous_on_setsum [continuous_intros]: + fixes f :: "'a \ 'b::topological_space \ 'c::topological_comm_monoid_add" + shows "(\i. i \ S \ continuous_on s (f i)) \ continuous_on s (\x. \i\S. f i x)" + unfolding continuous_on_def by (auto intro: tendsto_setsum) + +subsubsection \Addition and subtraction\ + +instance real_normed_vector < topological_comm_monoid_add +proof + fix a b :: 'a show "((\x. fst x + snd x) \ a + b) (nhds a \\<^sub>F nhds b)" + unfolding tendsto_Zfun_iff add_diff_add + using tendsto_fst[OF filterlim_ident, of "(a,b)"] tendsto_snd[OF filterlim_ident, of "(a,b)"] + by (intro Zfun_add) + (auto simp add: tendsto_Zfun_iff[symmetric] nhds_prod[symmetric] intro!: tendsto_fst) +qed + lemma tendsto_minus [tendsto_intros]: fixes a :: "'a::real_normed_vector" shows "(f \ a) F \ ((\x. - f x) \ - a) F" @@ -638,25 +674,6 @@ lemma continuous_on_op_minus: "continuous_on (s::'a::real_normed_vector set) (op - x)" by (rule continuous_intros | simp)+ -lemma tendsto_setsum [tendsto_intros]: - fixes f :: "'a \ 'b \ 'c::real_normed_vector" - assumes "\i. i \ S \ (f i \ a i) F" - shows "((\x. \i\S. f i x) \ (\i\S. a i)) F" -proof (cases "finite S") - assume "finite S" thus ?thesis using assms - by (induct, simp, simp add: tendsto_add) -qed simp - -lemma continuous_setsum [continuous_intros]: - fixes f :: "'a \ 'b::t2_space \ 'c::real_normed_vector" - shows "(\i. i \ S \ continuous F (f i)) \ continuous F (\x. \i\S. f i x)" - unfolding continuous_def by (rule tendsto_setsum) - -lemma continuous_on_setsum [continuous_intros]: - fixes f :: "'a \ _ \ 'c::real_normed_vector" - shows "(\i. i \ S \ continuous_on s (f i)) \ continuous_on s (\x. \i\S. f i x)" - unfolding continuous_on_def by (auto intro: tendsto_setsum) - lemmas real_tendsto_sandwich = tendsto_sandwich[where 'b=real] subsubsection \Linear operators and multiplication\ @@ -1468,7 +1485,7 @@ subsection \Limits of Sequences\ -lemma [trans]: "X=Y ==> Y \ z ==> X \ z" +lemma [trans]: "X = Y \ Y \ z \ X \ z" by simp lemma LIMSEQ_iff: @@ -2042,7 +2059,7 @@ by (fact continuous_rabs) lemma isCont_add [simp]: - fixes f :: "'a::t2_space \ 'b::real_normed_vector" + fixes f :: "'a::t2_space \ 'b::topological_monoid_add" shows "\isCont f a; isCont g a\ \ isCont (\x. f x + g x) a" by (fact continuous_add) @@ -2081,7 +2098,7 @@ by (fact continuous_power) lemma isCont_setsum [simp]: - fixes f :: "'a \ 'b::t2_space \ 'c::real_normed_vector" + fixes f :: "'a \ 'b::t2_space \ 'c::topological_comm_monoid_add" shows "\i\A. isCont (f i) a \ isCont (\x. \i\A. f i x) a" by (auto intro: continuous_setsum) @@ -2401,4 +2418,3 @@ using LIM_fun_gt_zero[of f l c] LIM_fun_less_zero[of f l c] by (auto simp add: neq_iff) end - diff -r d2bc8a7e5fec -r 106569399cd6 src/HOL/Real_Vector_Spaces.thy --- a/src/HOL/Real_Vector_Spaces.thy Mon Feb 08 17:18:13 2016 +0100 +++ b/src/HOL/Real_Vector_Spaces.thy Mon Feb 08 19:53:49 2016 +0100 @@ -2143,4 +2143,3 @@ qed end - diff -r d2bc8a7e5fec -r 106569399cd6 src/HOL/Series.thy --- a/src/HOL/Series.thy Mon Feb 08 17:18:13 2016 +0100 +++ b/src/HOL/Series.thy Mon Feb 08 19:53:49 2016 +0100 @@ -271,12 +271,59 @@ by (auto intro: le_less_trans simp: eventually_sequentially) } qed +subsection \Infinite summability on topological monoids\ + +lemma Zero_notin_Suc: "0 \ Suc ` A" + by auto + +context + fixes f g :: "nat \ 'a :: {t2_space, topological_comm_monoid_add}" +begin + +lemma sums_Suc: + assumes "(\n. f (Suc n)) sums l" shows "f sums (l + f 0)" +proof - + have "(\n. (\i l + f 0" + using assms by (auto intro!: tendsto_add simp: sums_def) + moreover have "(\ii g sums b \ (\n. f n + g n) sums (a + b)" + unfolding sums_def by (simp add: setsum.distrib tendsto_add) + +lemma summable_add: "summable f \ summable g \ summable (\n. f n + g n)" + unfolding summable_def by (auto intro: sums_add) + +lemma suminf_add: "summable f \ summable g \ suminf f + suminf g = (\n. f n + g n)" + by (intro sums_unique sums_add summable_sums) + +end + +context + fixes f :: "'i \ nat \ 'a::{t2_space, topological_comm_monoid_add}" and I :: "'i set" +begin + +lemma sums_setsum: "(\i. i \ I \ (f i) sums (x i)) \ (\n. \i\I. f i n) sums (\i\I. x i)" + by (induct I rule: infinite_finite_induct) (auto intro!: sums_add) + +lemma suminf_setsum: "(\i. i \ I \ summable (f i)) \ (\n. \i\I. f i n) = (\i\I. \n. f i n)" + using sums_unique[OF sums_setsum, OF summable_sums] by simp + +lemma summable_setsum: "(\i. i \ I \ summable (f i)) \ summable (\n. \i\I. f i n)" + using sums_summable[OF sums_setsum[OF summable_sums]] . + +end subsection \Infinite summability on real normed vector spaces\ -lemma sums_Suc_iff: +context fixes f :: "nat \ 'a::real_normed_vector" - shows "(\n. f (Suc n)) sums s \ f sums (s + f 0)" +begin + +lemma sums_Suc_iff: "(\n. f (Suc n)) sums s \ f sums (s + f 0)" proof - have "f sums (s + f 0) \ (\i. \j s + f 0" by (subst LIMSEQ_Suc_iff) (simp add: sums_def) @@ -292,7 +339,7 @@ finally show ?thesis .. qed -lemma summable_Suc_iff: "summable (\n. f (Suc n) :: 'a :: real_normed_vector) = summable f" +lemma summable_Suc_iff: "summable (\n. f (Suc n)) = summable f" proof assume "summable f" hence "f sums suminf f" by (rule summable_sums) @@ -300,19 +347,12 @@ thus "summable (\n. f (Suc n))" unfolding summable_def by blast qed (auto simp: sums_Suc_iff summable_def) +end + context fixes f :: "nat \ 'a::real_normed_vector" begin -lemma sums_add: "f sums a \ g sums b \ (\n. f n + g n) sums (a + b)" - unfolding sums_def by (simp add: setsum.distrib tendsto_add) - -lemma summable_add: "summable f \ summable g \ summable (\n. f n + g n)" - unfolding summable_def by (auto intro: sums_add) - -lemma suminf_add: "summable f \ summable g \ suminf f + suminf g = (\n. f n + g n)" - by (intro sums_unique sums_add summable_sums) - lemma sums_diff: "f sums a \ g sums b \ (\n. f n - g n) sums (a - b)" unfolding sums_def by (simp add: setsum_subtractf tendsto_diff) @@ -331,9 +371,6 @@ lemma suminf_minus: "summable f \ (\n. - f n) = - (\n. f n)" by (intro sums_unique [symmetric] sums_minus summable_sums) -lemma sums_Suc: "(\ n. f (Suc n)) sums l \ f sums (l + f 0)" - by (simp add: sums_Suc_iff) - lemma sums_iff_shift: "(\i. f (i + n)) sums s \ f sums (s + (\i 'a) \ convergent f" +lemma summable_imp_convergent: "summable f \ convergent f" by (force dest!: summable_LIMSEQ_zero simp: convergent_def) -lemma summable_imp_Bseq: - "summable f \ Bseq (f :: nat \ 'a :: real_normed_vector)" +lemma summable_imp_Bseq: "summable f \ Bseq f" by (simp add: convergent_imp_Bseq summable_imp_convergent) end @@ -396,22 +431,6 @@ shows "summable (\n. - f n) \ summable f" by (auto dest: summable_minus) \\used two ways, hence must be outside the context above\ - -context - fixes f :: "'i \ nat \ 'a::real_normed_vector" and I :: "'i set" -begin - -lemma sums_setsum: "(\i. i \ I \ (f i) sums (x i)) \ (\n. \i\I. f i n) sums (\i\I. x i)" - by (induct I rule: infinite_finite_induct) (auto intro!: sums_add) - -lemma suminf_setsum: "(\i. i \ I \ summable (f i)) \ (\n. \i\I. f i n) = (\i\I. \n. f i n)" - using sums_unique[OF sums_setsum, OF summable_sums] by simp - -lemma summable_setsum: "(\i. i \ I \ summable (f i)) \ summable (\n. \i\I. f i n)" - using sums_summable[OF sums_setsum[OF summable_sums]] . - -end - lemma (in bounded_linear) sums: "(\n. X n) sums a \ (\n. f (X n)) sums (f a)" unfolding sums_def by (drule tendsto, simp only: setsum) @@ -923,7 +942,7 @@ fixes f :: "nat \ real" assumes "summable f" and "inj g" - and pos: "!!x. 0 \ f x" + and pos: "\x. 0 \ f x" shows summable_reindex: "summable (f o g)" and suminf_reindex_mono: "suminf (f o g) \ suminf f" and suminf_reindex: "(\x. x \ range g \ f x = 0) \ suminf (f \ g) = suminf f"