# HG changeset patch # User nipkow # Date 1428920032 -7200 # Node ID 7c4a2e87e4d0596b1d206ac5338da5fa49b123d0 # Parent 7ff7fdfbb9a079134c21fbdff96d3b7824b554d4# Parent 177d740a0d48a243a6a66765bdedc0c3c6434305 merged diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/Filter.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Filter.thy Mon Apr 13 12:13:52 2015 +0200 @@ -0,0 +1,1133 @@ +(* Title: HOL/Filter.thy + Author: Brian Huffman + Author: Johannes Hölzl +*) + +section {* Filters on predicates *} + +theory Filter +imports Set_Interval Lifting_Set +begin + +subsection {* Filters *} + +text {* + This definition also allows non-proper filters. +*} + +locale is_filter = + fixes F :: "('a \ bool) \ bool" + assumes True: "F (\x. True)" + assumes conj: "F (\x. P x) \ F (\x. Q x) \ F (\x. P x \ Q x)" + assumes mono: "\x. P x \ Q x \ F (\x. P x) \ F (\x. Q x)" + +typedef 'a filter = "{F :: ('a \ bool) \ bool. is_filter F}" +proof + show "(\x. True) \ ?filter" by (auto intro: is_filter.intro) +qed + +lemma is_filter_Rep_filter: "is_filter (Rep_filter F)" + using Rep_filter [of F] by simp + +lemma Abs_filter_inverse': + assumes "is_filter F" shows "Rep_filter (Abs_filter F) = F" + using assms by (simp add: Abs_filter_inverse) + + +subsubsection {* Eventually *} + +definition eventually :: "('a \ bool) \ 'a filter \ bool" + where "eventually P F \ Rep_filter F P" + +syntax (xsymbols) + "_eventually" :: "pttrn => 'a filter => bool => bool" ("(3\\<^sub>F _ in _./ _)" [0, 0, 10] 10) + +translations + "\\<^sub>Fx in F. P" == "CONST eventually (\x. P) F" + +lemma eventually_Abs_filter: + assumes "is_filter F" shows "eventually P (Abs_filter F) = F P" + unfolding eventually_def using assms by (simp add: Abs_filter_inverse) + +lemma filter_eq_iff: + shows "F = F' \ (\P. eventually P F = eventually P F')" + unfolding Rep_filter_inject [symmetric] fun_eq_iff eventually_def .. + +lemma eventually_True [simp]: "eventually (\x. True) F" + unfolding eventually_def + by (rule is_filter.True [OF is_filter_Rep_filter]) + +lemma always_eventually: "\x. P x \ eventually P F" +proof - + assume "\x. P x" hence "P = (\x. True)" by (simp add: ext) + thus "eventually P F" by simp +qed + +lemma eventuallyI: "(\x. P x) \ eventually P F" + by (auto intro: always_eventually) + +lemma eventually_mono: + "(\x. P x \ Q x) \ eventually P F \ eventually Q F" + unfolding eventually_def + by (rule is_filter.mono [OF is_filter_Rep_filter]) + +lemma eventually_conj: + assumes P: "eventually (\x. P x) F" + assumes Q: "eventually (\x. Q x) F" + shows "eventually (\x. P x \ Q x) F" + using assms unfolding eventually_def + by (rule is_filter.conj [OF is_filter_Rep_filter]) + +lemma eventually_mp: + assumes "eventually (\x. P x \ Q x) F" + assumes "eventually (\x. P x) F" + shows "eventually (\x. Q x) F" +proof (rule eventually_mono) + show "\x. (P x \ Q x) \ P x \ Q x" by simp + show "eventually (\x. (P x \ Q x) \ P x) F" + using assms by (rule eventually_conj) +qed + +lemma eventually_rev_mp: + assumes "eventually (\x. P x) F" + assumes "eventually (\x. P x \ Q x) F" + shows "eventually (\x. Q x) F" +using assms(2) assms(1) by (rule eventually_mp) + +lemma eventually_conj_iff: + "eventually (\x. P x \ Q x) F \ eventually P F \ eventually Q F" + by (auto intro: eventually_conj elim: eventually_rev_mp) + +lemma eventually_elim1: + assumes "eventually (\i. P i) F" + assumes "\i. P i \ Q i" + shows "eventually (\i. Q i) F" + using assms by (auto elim!: eventually_rev_mp) + +lemma eventually_elim2: + assumes "eventually (\i. P i) F" + assumes "eventually (\i. Q i) F" + assumes "\i. P i \ Q i \ R i" + shows "eventually (\i. R i) F" + using assms by (auto elim!: eventually_rev_mp) + +lemma eventually_ball_finite_distrib: + "finite A \ (eventually (\x. \y\A. P x y) net) \ (\y\A. eventually (\x. P x y) net)" + by (induction A rule: finite_induct) (auto simp: eventually_conj_iff) + +lemma eventually_ball_finite: + "finite A \ \y\A. eventually (\x. P x y) net \ eventually (\x. \y\A. P x y) net" + by (auto simp: eventually_ball_finite_distrib) + +lemma eventually_all_finite: + fixes P :: "'a \ 'b::finite \ bool" + assumes "\y. eventually (\x. P x y) net" + shows "eventually (\x. \y. P x y) net" +using eventually_ball_finite [of UNIV P] assms by simp + +lemma eventually_ex: "(\\<^sub>Fx in F. \y. P x y) \ (\Y. \\<^sub>Fx in F. P x (Y x))" +proof + assume "\\<^sub>Fx in F. \y. P x y" + then have "\\<^sub>Fx in F. P x (SOME y. P x y)" + by (auto intro: someI_ex eventually_elim1) + then show "\Y. \\<^sub>Fx in F. P x (Y x)" + by auto +qed (auto intro: eventually_elim1) + +lemma not_eventually_impI: "eventually P F \ \ eventually Q F \ \ eventually (\x. P x \ Q x) F" + by (auto intro: eventually_mp) + +lemma not_eventuallyD: "\ eventually P F \ \x. \ P x" + by (metis always_eventually) + +lemma eventually_subst: + assumes "eventually (\n. P n = Q n) F" + shows "eventually P F = eventually Q F" (is "?L = ?R") +proof - + from assms have "eventually (\x. P x \ Q x) F" + and "eventually (\x. Q x \ P x) F" + by (auto elim: eventually_elim1) + then show ?thesis by (auto elim: eventually_elim2) +qed + +subsection \ Frequently as dual to eventually \ + +definition frequently :: "('a \ bool) \ 'a filter \ bool" + where "frequently P F \ \ eventually (\x. \ P x) F" + +syntax (xsymbols) + "_frequently" :: "pttrn \ 'a filter \ bool \ bool" ("(3\\<^sub>F _ in _./ _)" [0, 0, 10] 10) + +translations + "\\<^sub>Fx in F. P" == "CONST frequently (\x. P) F" + +lemma not_frequently_False [simp]: "\ (\\<^sub>Fx in F. False)" + by (simp add: frequently_def) + +lemma frequently_ex: "\\<^sub>Fx in F. P x \ \x. P x" + by (auto simp: frequently_def dest: not_eventuallyD) + +lemma frequentlyE: assumes "frequently P F" obtains x where "P x" + using frequently_ex[OF assms] by auto + +lemma frequently_mp: + assumes ev: "\\<^sub>Fx in F. P x \ Q x" and P: "\\<^sub>Fx in F. P x" shows "\\<^sub>Fx in F. Q x" +proof - + from ev have "eventually (\x. \ Q x \ \ P x) F" + by (rule eventually_rev_mp) (auto intro!: always_eventually) + from eventually_mp[OF this] P show ?thesis + by (auto simp: frequently_def) +qed + +lemma frequently_rev_mp: + assumes "\\<^sub>Fx in F. P x" + assumes "\\<^sub>Fx in F. P x \ Q x" + shows "\\<^sub>Fx in F. Q x" +using assms(2) assms(1) by (rule frequently_mp) + +lemma frequently_mono: "(\x. P x \ Q x) \ frequently P F \ frequently Q F" + using frequently_mp[of P Q] by (simp add: always_eventually) + +lemma frequently_elim1: "\\<^sub>Fx in F. P x \ (\i. P i \ Q i) \ \\<^sub>Fx in F. Q x" + by (metis frequently_mono) + +lemma frequently_disj_iff: "(\\<^sub>Fx in F. P x \ Q x) \ (\\<^sub>Fx in F. P x) \ (\\<^sub>Fx in F. Q x)" + by (simp add: frequently_def eventually_conj_iff) + +lemma frequently_disj: "\\<^sub>Fx in F. P x \ \\<^sub>Fx in F. Q x \ \\<^sub>Fx in F. P x \ Q x" + by (simp add: frequently_disj_iff) + +lemma frequently_bex_finite_distrib: + assumes "finite A" shows "(\\<^sub>Fx in F. \y\A. P x y) \ (\y\A. \\<^sub>Fx in F. P x y)" + using assms by induction (auto simp: frequently_disj_iff) + +lemma frequently_bex_finite: "finite A \ \\<^sub>Fx in F. \y\A. P x y \ \y\A. \\<^sub>Fx in F. P x y" + by (simp add: frequently_bex_finite_distrib) + +lemma frequently_all: "(\\<^sub>Fx in F. \y. P x y) \ (\Y. \\<^sub>Fx in F. P x (Y x))" + using eventually_ex[of "\x y. \ P x y" F] by (simp add: frequently_def) + +lemma + shows not_eventually: "\ eventually P F \ (\\<^sub>Fx in F. \ P x)" + and not_frequently: "\ frequently P F \ (\\<^sub>Fx in F. \ P x)" + by (auto simp: frequently_def) + +lemma frequently_imp_iff: + "(\\<^sub>Fx in F. P x \ Q x) \ (eventually P F \ frequently Q F)" + unfolding imp_conv_disj frequently_disj_iff not_eventually[symmetric] .. + +lemma eventually_frequently_const_simps: + "(\\<^sub>Fx in F. P x \ C) \ (\\<^sub>Fx in F. P x) \ C" + "(\\<^sub>Fx in F. C \ P x) \ C \ (\\<^sub>Fx in F. P x)" + "(\\<^sub>Fx in F. P x \ C) \ (\\<^sub>Fx in F. P x) \ C" + "(\\<^sub>Fx in F. C \ P x) \ C \ (\\<^sub>Fx in F. P x)" + "(\\<^sub>Fx in F. P x \ C) \ ((\\<^sub>Fx in F. P x) \ C)" + "(\\<^sub>Fx in F. C \ P x) \ (C \ (\\<^sub>Fx in F. P x))" + by (cases C; simp add: not_frequently)+ + +lemmas eventually_frequently_simps = + eventually_frequently_const_simps + not_eventually + eventually_conj_iff + eventually_ball_finite_distrib + eventually_ex + not_frequently + frequently_disj_iff + frequently_bex_finite_distrib + frequently_all + frequently_imp_iff + +ML {* + fun eventually_elim_tac ctxt facts = SUBGOAL_CASES (fn (goal, i) => + let + val mp_thms = facts RL @{thms eventually_rev_mp} + val raw_elim_thm = + (@{thm allI} RS @{thm always_eventually}) + |> fold (fn thm1 => fn thm2 => thm2 RS thm1) mp_thms + |> fold (fn _ => fn thm => @{thm impI} RS thm) facts + val cases_prop = Thm.prop_of (raw_elim_thm RS Goal.init (Thm.cterm_of ctxt goal)) + val cases = Rule_Cases.make_common ctxt cases_prop [(("elim", []), [])] + in + CASES cases (rtac raw_elim_thm i) + end) +*} + +method_setup eventually_elim = {* + Scan.succeed (fn ctxt => METHOD_CASES (HEADGOAL o eventually_elim_tac ctxt)) +*} "elimination of eventually quantifiers" + +subsubsection {* Finer-than relation *} + +text {* @{term "F \ F'"} means that filter @{term F} is finer than +filter @{term F'}. *} + +instantiation filter :: (type) complete_lattice +begin + +definition le_filter_def: + "F \ F' \ (\P. eventually P F' \ eventually P F)" + +definition + "(F :: 'a filter) < F' \ F \ F' \ \ F' \ F" + +definition + "top = Abs_filter (\P. \x. P x)" + +definition + "bot = Abs_filter (\P. True)" + +definition + "sup F F' = Abs_filter (\P. eventually P F \ eventually P F')" + +definition + "inf F F' = Abs_filter + (\P. \Q R. eventually Q F \ eventually R F' \ (\x. Q x \ R x \ P x))" + +definition + "Sup S = Abs_filter (\P. \F\S. eventually P F)" + +definition + "Inf S = Sup {F::'a filter. \F'\S. F \ F'}" + +lemma eventually_top [simp]: "eventually P top \ (\x. P x)" + unfolding top_filter_def + by (rule eventually_Abs_filter, rule is_filter.intro, auto) + +lemma eventually_bot [simp]: "eventually P bot" + unfolding bot_filter_def + by (subst eventually_Abs_filter, rule is_filter.intro, auto) + +lemma eventually_sup: + "eventually P (sup F F') \ eventually P F \ eventually P F'" + unfolding sup_filter_def + by (rule eventually_Abs_filter, rule is_filter.intro) + (auto elim!: eventually_rev_mp) + +lemma eventually_inf: + "eventually P (inf F F') \ + (\Q R. eventually Q F \ eventually R F' \ (\x. Q x \ R x \ P x))" + unfolding inf_filter_def + apply (rule eventually_Abs_filter, rule is_filter.intro) + apply (fast intro: eventually_True) + apply clarify + apply (intro exI conjI) + apply (erule (1) eventually_conj) + apply (erule (1) eventually_conj) + apply simp + apply auto + done + +lemma eventually_Sup: + "eventually P (Sup S) \ (\F\S. eventually P F)" + unfolding Sup_filter_def + apply (rule eventually_Abs_filter, rule is_filter.intro) + apply (auto intro: eventually_conj elim!: eventually_rev_mp) + done + +instance proof + fix F F' F'' :: "'a filter" and S :: "'a filter set" + { show "F < F' \ F \ F' \ \ F' \ F" + by (rule less_filter_def) } + { show "F \ F" + unfolding le_filter_def by simp } + { assume "F \ F'" and "F' \ F''" thus "F \ F''" + unfolding le_filter_def by simp } + { assume "F \ F'" and "F' \ F" thus "F = F'" + unfolding le_filter_def filter_eq_iff by fast } + { show "inf F F' \ F" and "inf F F' \ F'" + unfolding le_filter_def eventually_inf by (auto intro: eventually_True) } + { assume "F \ F'" and "F \ F''" thus "F \ inf F' F''" + unfolding le_filter_def eventually_inf + by (auto elim!: eventually_mono intro: eventually_conj) } + { show "F \ sup F F'" and "F' \ sup F F'" + unfolding le_filter_def eventually_sup by simp_all } + { assume "F \ F''" and "F' \ F''" thus "sup F F' \ F''" + unfolding le_filter_def eventually_sup by simp } + { assume "F'' \ S" thus "Inf S \ F''" + unfolding le_filter_def Inf_filter_def eventually_Sup Ball_def by simp } + { assume "\F'. F' \ S \ F \ F'" thus "F \ Inf S" + unfolding le_filter_def Inf_filter_def eventually_Sup Ball_def by simp } + { assume "F \ S" thus "F \ Sup S" + unfolding le_filter_def eventually_Sup by simp } + { assume "\F. F \ S \ F \ F'" thus "Sup S \ F'" + unfolding le_filter_def eventually_Sup by simp } + { show "Inf {} = (top::'a filter)" + by (auto simp: top_filter_def Inf_filter_def Sup_filter_def) + (metis (full_types) top_filter_def always_eventually eventually_top) } + { show "Sup {} = (bot::'a filter)" + by (auto simp: bot_filter_def Sup_filter_def) } +qed + +end + +lemma filter_leD: + "F \ F' \ eventually P F' \ eventually P F" + unfolding le_filter_def by simp + +lemma filter_leI: + "(\P. eventually P F' \ eventually P F) \ F \ F'" + unfolding le_filter_def by simp + +lemma eventually_False: + "eventually (\x. False) F \ F = bot" + unfolding filter_eq_iff by (auto elim: eventually_rev_mp) + +lemma eventually_frequently: "F \ bot \ eventually P F \ frequently P F" + using eventually_conj[of P F "\x. \ P x"] + by (auto simp add: frequently_def eventually_False) + +lemma eventually_const_iff: "eventually (\x. P) F \ P \ F = bot" + by (cases P) (auto simp: eventually_False) + +lemma eventually_const[simp]: "F \ bot \ eventually (\x. P) F \ P" + by (simp add: eventually_const_iff) + +lemma frequently_const_iff: "frequently (\x. P) F \ P \ F \ bot" + by (simp add: frequently_def eventually_const_iff) + +lemma frequently_const[simp]: "F \ bot \ frequently (\x. P) F \ P" + by (simp add: frequently_const_iff) + +abbreviation (input) trivial_limit :: "'a filter \ bool" + where "trivial_limit F \ F = bot" + +lemma trivial_limit_def: "trivial_limit F \ eventually (\x. False) F" + by (rule eventually_False [symmetric]) + +lemma eventually_Inf: "eventually P (Inf B) \ (\X\B. finite X \ eventually P (Inf X))" +proof - + let ?F = "\P. \X\B. finite X \ eventually P (Inf X)" + + { fix P have "eventually P (Abs_filter ?F) \ ?F P" + proof (rule eventually_Abs_filter is_filter.intro)+ + show "?F (\x. True)" + by (rule exI[of _ "{}"]) (simp add: le_fun_def) + next + fix P Q + assume "?F P" then guess X .. + moreover + assume "?F Q" then guess Y .. + ultimately show "?F (\x. P x \ Q x)" + by (intro exI[of _ "X \ Y"]) + (auto simp: Inf_union_distrib eventually_inf) + next + fix P Q + assume "?F P" then guess X .. + moreover assume "\x. P x \ Q x" + ultimately show "?F Q" + by (intro exI[of _ X]) (auto elim: eventually_elim1) + qed } + note eventually_F = this + + have "Inf B = Abs_filter ?F" + proof (intro antisym Inf_greatest) + show "Inf B \ Abs_filter ?F" + by (auto simp: le_filter_def eventually_F dest: Inf_superset_mono) + next + fix F assume "F \ B" then show "Abs_filter ?F \ F" + by (auto simp add: le_filter_def eventually_F intro!: exI[of _ "{F}"]) + qed + then show ?thesis + by (simp add: eventually_F) +qed + +lemma eventually_INF: "eventually P (INF b:B. F b) \ (\X\B. finite X \ eventually P (INF b:X. F b))" + unfolding INF_def[of B] eventually_Inf[of P "F`B"] + by (metis Inf_image_eq finite_imageI image_mono finite_subset_image) + +lemma Inf_filter_not_bot: + fixes B :: "'a filter set" + shows "(\X. X \ B \ finite X \ Inf X \ bot) \ Inf B \ bot" + unfolding trivial_limit_def eventually_Inf[of _ B] + bot_bool_def [symmetric] bot_fun_def [symmetric] bot_unique by simp + +lemma INF_filter_not_bot: + fixes F :: "'i \ 'a filter" + shows "(\X. X \ B \ finite X \ (INF b:X. F b) \ bot) \ (INF b:B. F b) \ bot" + unfolding trivial_limit_def eventually_INF[of _ B] + bot_bool_def [symmetric] bot_fun_def [symmetric] bot_unique by simp + +lemma eventually_Inf_base: + assumes "B \ {}" and base: "\F G. F \ B \ G \ B \ \x\B. x \ inf F G" + shows "eventually P (Inf B) \ (\b\B. eventually P b)" +proof (subst eventually_Inf, safe) + fix X assume "finite X" "X \ B" + then have "\b\B. \x\X. b \ x" + proof induct + case empty then show ?case + using `B \ {}` by auto + next + case (insert x X) + then obtain b where "b \ B" "\x. x \ X \ b \ x" + by auto + with `insert x X \ B` base[of b x] show ?case + by (auto intro: order_trans) + qed + then obtain b where "b \ B" "b \ Inf X" + by (auto simp: le_Inf_iff) + then show "eventually P (Inf X) \ Bex B (eventually P)" + by (intro bexI[of _ b]) (auto simp: le_filter_def) +qed (auto intro!: exI[of _ "{x}" for x]) + +lemma eventually_INF_base: + "B \ {} \ (\a b. a \ B \ b \ B \ \x\B. F x \ inf (F a) (F b)) \ + eventually P (INF b:B. F b) \ (\b\B. eventually P (F b))" + unfolding INF_def by (subst eventually_Inf_base) auto + + +subsubsection {* Map function for filters *} + +definition filtermap :: "('a \ 'b) \ 'a filter \ 'b filter" + where "filtermap f F = Abs_filter (\P. eventually (\x. P (f x)) F)" + +lemma eventually_filtermap: + "eventually P (filtermap f F) = eventually (\x. P (f x)) F" + unfolding filtermap_def + apply (rule eventually_Abs_filter) + apply (rule is_filter.intro) + apply (auto elim!: eventually_rev_mp) + done + +lemma filtermap_ident: "filtermap (\x. x) F = F" + by (simp add: filter_eq_iff eventually_filtermap) + +lemma filtermap_filtermap: + "filtermap f (filtermap g F) = filtermap (\x. f (g x)) F" + by (simp add: filter_eq_iff eventually_filtermap) + +lemma filtermap_mono: "F \ F' \ filtermap f F \ filtermap f F'" + unfolding le_filter_def eventually_filtermap by simp + +lemma filtermap_bot [simp]: "filtermap f bot = bot" + by (simp add: filter_eq_iff eventually_filtermap) + +lemma filtermap_sup: "filtermap f (sup F1 F2) = sup (filtermap f F1) (filtermap f F2)" + by (auto simp: filter_eq_iff eventually_filtermap eventually_sup) + +lemma filtermap_inf: "filtermap f (inf F1 F2) \ inf (filtermap f F1) (filtermap f F2)" + by (auto simp: le_filter_def eventually_filtermap eventually_inf) + +lemma filtermap_INF: "filtermap f (INF b:B. F b) \ (INF b:B. filtermap f (F b))" +proof - + { fix X :: "'c set" assume "finite X" + then have "filtermap f (INFIMUM X F) \ (INF b:X. filtermap f (F b))" + proof induct + case (insert x X) + have "filtermap f (INF a:insert x X. F a) \ inf (filtermap f (F x)) (filtermap f (INF a:X. F a))" + by (rule order_trans[OF _ filtermap_inf]) simp + also have "\ \ inf (filtermap f (F x)) (INF a:X. filtermap f (F a))" + by (intro inf_mono insert order_refl) + finally show ?case + by simp + qed simp } + then show ?thesis + unfolding le_filter_def eventually_filtermap + by (subst (1 2) eventually_INF) auto +qed +subsubsection {* Standard filters *} + +definition principal :: "'a set \ 'a filter" where + "principal S = Abs_filter (\P. \x\S. P x)" + +lemma eventually_principal: "eventually P (principal S) \ (\x\S. P x)" + unfolding principal_def + by (rule eventually_Abs_filter, rule is_filter.intro) auto + +lemma eventually_inf_principal: "eventually P (inf F (principal s)) \ eventually (\x. x \ s \ P x) F" + unfolding eventually_inf eventually_principal by (auto elim: eventually_elim1) + +lemma principal_UNIV[simp]: "principal UNIV = top" + by (auto simp: filter_eq_iff eventually_principal) + +lemma principal_empty[simp]: "principal {} = bot" + by (auto simp: filter_eq_iff eventually_principal) + +lemma principal_eq_bot_iff: "principal X = bot \ X = {}" + by (auto simp add: filter_eq_iff eventually_principal) + +lemma principal_le_iff[iff]: "principal A \ principal B \ A \ B" + by (auto simp: le_filter_def eventually_principal) + +lemma le_principal: "F \ principal A \ eventually (\x. x \ A) F" + unfolding le_filter_def eventually_principal + apply safe + apply (erule_tac x="\x. x \ A" in allE) + apply (auto elim: eventually_elim1) + done + +lemma principal_inject[iff]: "principal A = principal B \ A = B" + unfolding eq_iff by simp + +lemma sup_principal[simp]: "sup (principal A) (principal B) = principal (A \ B)" + unfolding filter_eq_iff eventually_sup eventually_principal by auto + +lemma inf_principal[simp]: "inf (principal A) (principal B) = principal (A \ B)" + unfolding filter_eq_iff eventually_inf eventually_principal + by (auto intro: exI[of _ "\x. x \ A"] exI[of _ "\x. x \ B"]) + +lemma SUP_principal[simp]: "(SUP i : I. principal (A i)) = principal (\i\I. A i)" + unfolding filter_eq_iff eventually_Sup SUP_def by (auto simp: eventually_principal) + +lemma INF_principal_finite: "finite X \ (INF x:X. principal (f x)) = principal (\x\X. f x)" + by (induct X rule: finite_induct) auto + +lemma filtermap_principal[simp]: "filtermap f (principal A) = principal (f ` A)" + unfolding filter_eq_iff eventually_filtermap eventually_principal by simp + +subsubsection {* Order filters *} + +definition at_top :: "('a::order) filter" + where "at_top = (INF k. principal {k ..})" + +lemma at_top_sub: "at_top = (INF k:{c::'a::linorder..}. principal {k ..})" + by (auto intro!: INF_eq max.cobounded1 max.cobounded2 simp: at_top_def) + +lemma eventually_at_top_linorder: "eventually P at_top \ (\N::'a::linorder. \n\N. P n)" + unfolding at_top_def + by (subst eventually_INF_base) (auto simp: eventually_principal intro: max.cobounded1 max.cobounded2) + +lemma eventually_ge_at_top: + "eventually (\x. (c::_::linorder) \ x) at_top" + unfolding eventually_at_top_linorder by auto + +lemma eventually_at_top_dense: "eventually P at_top \ (\N::'a::{no_top, linorder}. \n>N. P n)" +proof - + have "eventually P (INF k. principal {k <..}) \ (\N::'a. \n>N. P n)" + by (subst eventually_INF_base) (auto simp: eventually_principal intro: max.cobounded1 max.cobounded2) + also have "(INF k. principal {k::'a <..}) = at_top" + unfolding at_top_def + by (intro INF_eq) (auto intro: less_imp_le simp: Ici_subset_Ioi_iff gt_ex) + finally show ?thesis . +qed + +lemma eventually_gt_at_top: + "eventually (\x. (c::_::unbounded_dense_linorder) < x) at_top" + unfolding eventually_at_top_dense by auto + +definition at_bot :: "('a::order) filter" + where "at_bot = (INF k. principal {.. k})" + +lemma at_bot_sub: "at_bot = (INF k:{.. c::'a::linorder}. principal {.. k})" + by (auto intro!: INF_eq min.cobounded1 min.cobounded2 simp: at_bot_def) + +lemma eventually_at_bot_linorder: + fixes P :: "'a::linorder \ bool" shows "eventually P at_bot \ (\N. \n\N. P n)" + unfolding at_bot_def + by (subst eventually_INF_base) (auto simp: eventually_principal intro: min.cobounded1 min.cobounded2) + +lemma eventually_le_at_bot: + "eventually (\x. x \ (c::_::linorder)) at_bot" + unfolding eventually_at_bot_linorder by auto + +lemma eventually_at_bot_dense: "eventually P at_bot \ (\N::'a::{no_bot, linorder}. \n (\N::'a. \nx. x < (c::_::unbounded_dense_linorder)) at_bot" + unfolding eventually_at_bot_dense by auto + +lemma trivial_limit_at_bot_linorder: "\ trivial_limit (at_bot ::('a::linorder) filter)" + unfolding trivial_limit_def + by (metis eventually_at_bot_linorder order_refl) + +lemma trivial_limit_at_top_linorder: "\ trivial_limit (at_top ::('a::linorder) filter)" + unfolding trivial_limit_def + by (metis eventually_at_top_linorder order_refl) + +subsection {* Sequentially *} + +abbreviation sequentially :: "nat filter" + where "sequentially \ at_top" + +lemma eventually_sequentially: + "eventually P sequentially \ (\N. \n\N. P n)" + by (rule eventually_at_top_linorder) + +lemma sequentially_bot [simp, intro]: "sequentially \ bot" + unfolding filter_eq_iff eventually_sequentially by auto + +lemmas trivial_limit_sequentially = sequentially_bot + +lemma eventually_False_sequentially [simp]: + "\ eventually (\n. False) sequentially" + by (simp add: eventually_False) + +lemma le_sequentially: + "F \ sequentially \ (\N. eventually (\n. N \ n) F)" + by (simp add: at_top_def le_INF_iff le_principal) + +lemma eventually_sequentiallyI: + assumes "\x. c \ x \ P x" + shows "eventually P sequentially" +using assms by (auto simp: eventually_sequentially) + +lemma eventually_sequentially_Suc: "eventually (\i. P (Suc i)) sequentially \ eventually P sequentially" + unfolding eventually_sequentially by (metis Suc_le_D Suc_le_mono le_Suc_eq) + +lemma eventually_sequentially_seg: "eventually (\n. P (n + k)) sequentially \ eventually P sequentially" + using eventually_sequentially_Suc[of "\n. P (n + k)" for k] by (induction k) auto + +subsection \ The cofinite filter \ + +definition "cofinite = Abs_filter (\P. finite {x. \ P x})" + +abbreviation Inf_many :: "('a \ bool) \ bool" (binder "INFM " 10) where + "Inf_many P \ frequently P cofinite" + +abbreviation Alm_all :: "('a \ bool) \ bool" (binder "MOST " 10) where + "Alm_all P \ eventually P cofinite" + +notation (xsymbols) + Inf_many (binder "\\<^sub>\" 10) and + Alm_all (binder "\\<^sub>\" 10) + +notation (HTML output) + Inf_many (binder "\\<^sub>\" 10) and + Alm_all (binder "\\<^sub>\" 10) + +lemma eventually_cofinite: "eventually P cofinite \ finite {x. \ P x}" + unfolding cofinite_def +proof (rule eventually_Abs_filter, rule is_filter.intro) + fix P Q :: "'a \ bool" assume "finite {x. \ P x}" "finite {x. \ Q x}" + from finite_UnI[OF this] show "finite {x. \ (P x \ Q x)}" + by (rule rev_finite_subset) auto +next + fix P Q :: "'a \ bool" assume P: "finite {x. \ P x}" and *: "\x. P x \ Q x" + from * show "finite {x. \ Q x}" + by (intro finite_subset[OF _ P]) auto +qed simp + +lemma frequently_cofinite: "frequently P cofinite \ \ finite {x. P x}" + by (simp add: frequently_def eventually_cofinite) + +lemma cofinite_bot[simp]: "cofinite = (bot::'a filter) \ finite (UNIV :: 'a set)" + unfolding trivial_limit_def eventually_cofinite by simp + +lemma cofinite_eq_sequentially: "cofinite = sequentially" + unfolding filter_eq_iff eventually_sequentially eventually_cofinite +proof safe + fix P :: "nat \ bool" assume [simp]: "finite {x. \ P x}" + show "\N. \n\N. P n" + proof cases + assume "{x. \ P x} \ {}" then show ?thesis + by (intro exI[of _ "Suc (Max {x. \ P x})"]) (auto simp: Suc_le_eq) + qed auto +next + fix P :: "nat \ bool" and N :: nat assume "\n\N. P n" + then have "{x. \ P x} \ {..< N}" + by (auto simp: not_le) + then show "finite {x. \ P x}" + by (blast intro: finite_subset) +qed + +subsection {* Limits *} + +definition filterlim :: "('a \ 'b) \ 'b filter \ 'a filter \ bool" where + "filterlim f F2 F1 \ filtermap f F1 \ F2" + +syntax + "_LIM" :: "pttrns \ 'a \ 'b \ 'a \ bool" ("(3LIM (_)/ (_)./ (_) :> (_))" [1000, 10, 0, 10] 10) + +translations + "LIM x F1. f :> F2" == "CONST filterlim (%x. f) F2 F1" + +lemma filterlim_iff: + "(LIM x F1. f x :> F2) \ (\P. eventually P F2 \ eventually (\x. P (f x)) F1)" + unfolding filterlim_def le_filter_def eventually_filtermap .. + +lemma filterlim_compose: + "filterlim g F3 F2 \ filterlim f F2 F1 \ filterlim (\x. g (f x)) F3 F1" + unfolding filterlim_def filtermap_filtermap[symmetric] by (metis filtermap_mono order_trans) + +lemma filterlim_mono: + "filterlim f F2 F1 \ F2 \ F2' \ F1' \ F1 \ filterlim f F2' F1'" + unfolding filterlim_def by (metis filtermap_mono order_trans) + +lemma filterlim_ident: "LIM x F. x :> F" + by (simp add: filterlim_def filtermap_ident) + +lemma filterlim_cong: + "F1 = F1' \ F2 = F2' \ eventually (\x. f x = g x) F2 \ filterlim f F1 F2 = filterlim g F1' F2'" + by (auto simp: filterlim_def le_filter_def eventually_filtermap elim: eventually_elim2) + +lemma filterlim_mono_eventually: + assumes "filterlim f F G" and ord: "F \ F'" "G' \ G" + assumes eq: "eventually (\x. f x = f' x) G'" + shows "filterlim f' F' G'" + apply (rule filterlim_cong[OF refl refl eq, THEN iffD1]) + apply (rule filterlim_mono[OF _ ord]) + apply fact + done + +lemma filtermap_mono_strong: "inj f \ filtermap f F \ filtermap f G \ F \ G" + apply (auto intro!: filtermap_mono) [] + apply (auto simp: le_filter_def eventually_filtermap) + apply (erule_tac x="\x. P (inv f x)" in allE) + apply auto + done + +lemma filtermap_eq_strong: "inj f \ filtermap f F = filtermap f G \ F = G" + by (simp add: filtermap_mono_strong eq_iff) + +lemma filterlim_principal: + "(LIM x F. f x :> principal S) \ (eventually (\x. f x \ S) F)" + unfolding filterlim_def eventually_filtermap le_principal .. + +lemma filterlim_inf: + "(LIM x F1. f x :> inf F2 F3) \ ((LIM x F1. f x :> F2) \ (LIM x F1. f x :> F3))" + unfolding filterlim_def by simp + +lemma filterlim_INF: + "(LIM x F. f x :> (INF b:B. G b)) \ (\b\B. LIM x F. f x :> G b)" + unfolding filterlim_def le_INF_iff .. + +lemma filterlim_INF_INF: + "(\m. m \ J \ \i\I. filtermap f (F i) \ G m) \ LIM x (INF i:I. F i). f x :> (INF j:J. G j)" + unfolding filterlim_def by (rule order_trans[OF filtermap_INF INF_mono]) + +lemma filterlim_base: + "(\m x. m \ J \ i m \ I) \ (\m x. m \ J \ x \ F (i m) \ f x \ G m) \ + LIM x (INF i:I. principal (F i)). f x :> (INF j:J. principal (G j))" + by (force intro!: filterlim_INF_INF simp: image_subset_iff) + +lemma filterlim_base_iff: + assumes "I \ {}" and chain: "\i j. i \ I \ j \ I \ F i \ F j \ F j \ F i" + shows "(LIM x (INF i:I. principal (F i)). f x :> INF j:J. principal (G j)) \ + (\j\J. \i\I. \x\F i. f x \ G j)" + unfolding filterlim_INF filterlim_principal +proof (subst eventually_INF_base) + fix i j assume "i \ I" "j \ I" + with chain[OF this] show "\x\I. principal (F x) \ inf (principal (F i)) (principal (F j))" + by auto +qed (auto simp: eventually_principal `I \ {}`) + +lemma filterlim_filtermap: "filterlim f F1 (filtermap g F2) = filterlim (\x. f (g x)) F1 F2" + unfolding filterlim_def filtermap_filtermap .. + +lemma filterlim_sup: + "filterlim f F F1 \ filterlim f F F2 \ filterlim f F (sup F1 F2)" + unfolding filterlim_def filtermap_sup by auto + +lemma filterlim_sequentially_Suc: + "(LIM x sequentially. f (Suc x) :> F) \ (LIM x sequentially. f x :> F)" + unfolding filterlim_iff by (subst eventually_sequentially_Suc) simp + +lemma filterlim_Suc: "filterlim Suc sequentially sequentially" + by (simp add: filterlim_iff eventually_sequentially) (metis le_Suc_eq) + + +subsection {* Limits to @{const at_top} and @{const at_bot} *} + +lemma filterlim_at_top: + fixes f :: "'a \ ('b::linorder)" + shows "(LIM x F. f x :> at_top) \ (\Z. eventually (\x. Z \ f x) F)" + by (auto simp: filterlim_iff eventually_at_top_linorder elim!: eventually_elim1) + +lemma filterlim_at_top_mono: + "LIM x F. f x :> at_top \ eventually (\x. f x \ (g x::'a::linorder)) F \ + LIM x F. g x :> at_top" + by (auto simp: filterlim_at_top elim: eventually_elim2 intro: order_trans) + +lemma filterlim_at_top_dense: + fixes f :: "'a \ ('b::unbounded_dense_linorder)" + shows "(LIM x F. f x :> at_top) \ (\Z. eventually (\x. Z < f x) F)" + by (metis eventually_elim1[of _ F] eventually_gt_at_top order_less_imp_le + filterlim_at_top[of f F] filterlim_iff[of f at_top F]) + +lemma filterlim_at_top_ge: + fixes f :: "'a \ ('b::linorder)" and c :: "'b" + shows "(LIM x F. f x :> at_top) \ (\Z\c. eventually (\x. Z \ f x) F)" + unfolding at_top_sub[of c] filterlim_INF by (auto simp add: filterlim_principal) + +lemma filterlim_at_top_at_top: + fixes f :: "'a::linorder \ 'b::linorder" + assumes mono: "\x y. Q x \ Q y \ x \ y \ f x \ f y" + assumes bij: "\x. P x \ f (g x) = x" "\x. P x \ Q (g x)" + assumes Q: "eventually Q at_top" + assumes P: "eventually P at_top" + shows "filterlim f at_top at_top" +proof - + from P obtain x where x: "\y. x \ y \ P y" + unfolding eventually_at_top_linorder by auto + show ?thesis + proof (intro filterlim_at_top_ge[THEN iffD2] allI impI) + fix z assume "x \ z" + with x have "P z" by auto + have "eventually (\x. g z \ x) at_top" + by (rule eventually_ge_at_top) + with Q show "eventually (\x. z \ f x) at_top" + by eventually_elim (metis mono bij `P z`) + qed +qed + +lemma filterlim_at_top_gt: + fixes f :: "'a \ ('b::unbounded_dense_linorder)" and c :: "'b" + shows "(LIM x F. f x :> at_top) \ (\Z>c. eventually (\x. Z \ f x) F)" + by (metis filterlim_at_top order_less_le_trans gt_ex filterlim_at_top_ge) + +lemma filterlim_at_bot: + fixes f :: "'a \ ('b::linorder)" + shows "(LIM x F. f x :> at_bot) \ (\Z. eventually (\x. f x \ Z) F)" + by (auto simp: filterlim_iff eventually_at_bot_linorder elim!: eventually_elim1) + +lemma filterlim_at_bot_dense: + fixes f :: "'a \ ('b::{dense_linorder, no_bot})" + shows "(LIM x F. f x :> at_bot) \ (\Z. eventually (\x. f x < Z) F)" +proof (auto simp add: filterlim_at_bot[of f F]) + fix Z :: 'b + from lt_ex [of Z] obtain Z' where 1: "Z' < Z" .. + assume "\Z. eventually (\x. f x \ Z) F" + hence "eventually (\x. f x \ Z') F" by auto + thus "eventually (\x. f x < Z) F" + apply (rule eventually_mono[rotated]) + using 1 by auto + next + fix Z :: 'b + show "\Z. eventually (\x. f x < Z) F \ eventually (\x. f x \ Z) F" + by (drule spec [of _ Z], erule eventually_mono[rotated], auto simp add: less_imp_le) +qed + +lemma filterlim_at_bot_le: + fixes f :: "'a \ ('b::linorder)" and c :: "'b" + shows "(LIM x F. f x :> at_bot) \ (\Z\c. eventually (\x. Z \ f x) F)" + unfolding filterlim_at_bot +proof safe + fix Z assume *: "\Z\c. eventually (\x. Z \ f x) F" + with *[THEN spec, of "min Z c"] show "eventually (\x. Z \ f x) F" + by (auto elim!: eventually_elim1) +qed simp + +lemma filterlim_at_bot_lt: + fixes f :: "'a \ ('b::unbounded_dense_linorder)" and c :: "'b" + shows "(LIM x F. f x :> at_bot) \ (\Zx. Z \ f x) F)" + by (metis filterlim_at_bot filterlim_at_bot_le lt_ex order_le_less_trans) + + +subsection {* Setup @{typ "'a filter"} for lifting and transfer *} + +context begin interpretation lifting_syntax . + +definition rel_filter :: "('a \ 'b \ bool) \ 'a filter \ 'b filter \ bool" +where "rel_filter R F G = ((R ===> op =) ===> op =) (Rep_filter F) (Rep_filter G)" + +lemma rel_filter_eventually: + "rel_filter R F G \ + ((R ===> op =) ===> op =) (\P. eventually P F) (\P. eventually P G)" +by(simp add: rel_filter_def eventually_def) + +lemma filtermap_id [simp, id_simps]: "filtermap id = id" +by(simp add: fun_eq_iff id_def filtermap_ident) + +lemma filtermap_id' [simp]: "filtermap (\x. x) = (\F. F)" +using filtermap_id unfolding id_def . + +lemma Quotient_filter [quot_map]: + assumes Q: "Quotient R Abs Rep T" + shows "Quotient (rel_filter R) (filtermap Abs) (filtermap Rep) (rel_filter T)" +unfolding Quotient_alt_def +proof(intro conjI strip) + from Q have *: "\x y. T x y \ Abs x = y" + unfolding Quotient_alt_def by blast + + fix F G + assume "rel_filter T F G" + thus "filtermap Abs F = G" unfolding filter_eq_iff + by(auto simp add: eventually_filtermap rel_filter_eventually * rel_funI del: iffI elim!: rel_funD) +next + from Q have *: "\x. T (Rep x) x" unfolding Quotient_alt_def by blast + + fix F + show "rel_filter T (filtermap Rep F) F" + by(auto elim: rel_funD intro: * intro!: ext arg_cong[where f="\P. eventually P F"] rel_funI + del: iffI simp add: eventually_filtermap rel_filter_eventually) +qed(auto simp add: map_fun_def o_def eventually_filtermap filter_eq_iff fun_eq_iff rel_filter_eventually + fun_quotient[OF fun_quotient[OF Q identity_quotient] identity_quotient, unfolded Quotient_alt_def]) + +lemma eventually_parametric [transfer_rule]: + "((A ===> op =) ===> rel_filter A ===> op =) eventually eventually" +by(simp add: rel_fun_def rel_filter_eventually) + +lemma frequently_parametric [transfer_rule]: + "((A ===> op =) ===> rel_filter A ===> op =) frequently frequently" + unfolding frequently_def[abs_def] by transfer_prover + +lemma rel_filter_eq [relator_eq]: "rel_filter op = = op =" +by(auto simp add: rel_filter_eventually rel_fun_eq fun_eq_iff filter_eq_iff) + +lemma rel_filter_mono [relator_mono]: + "A \ B \ rel_filter A \ rel_filter B" +unfolding rel_filter_eventually[abs_def] +by(rule le_funI)+(intro fun_mono fun_mono[THEN le_funD, THEN le_funD] order.refl) + +lemma rel_filter_conversep [simp]: "rel_filter A\\ = (rel_filter A)\\" +by(auto simp add: rel_filter_eventually fun_eq_iff rel_fun_def) + +lemma is_filter_parametric_aux: + assumes "is_filter F" + assumes [transfer_rule]: "bi_total A" "bi_unique A" + and [transfer_rule]: "((A ===> op =) ===> op =) F G" + shows "is_filter G" +proof - + interpret is_filter F by fact + show ?thesis + proof + have "F (\_. True) = G (\x. True)" by transfer_prover + thus "G (\x. True)" by(simp add: True) + next + fix P' Q' + assume "G P'" "G Q'" + moreover + from bi_total_fun[OF `bi_unique A` bi_total_eq, unfolded bi_total_def] + obtain P Q where [transfer_rule]: "(A ===> op =) P P'" "(A ===> op =) Q Q'" by blast + have "F P = G P'" "F Q = G Q'" by transfer_prover+ + ultimately have "F (\x. P x \ Q x)" by(simp add: conj) + moreover have "F (\x. P x \ Q x) = G (\x. P' x \ Q' x)" by transfer_prover + ultimately show "G (\x. P' x \ Q' x)" by simp + next + fix P' Q' + assume "\x. P' x \ Q' x" "G P'" + moreover + from bi_total_fun[OF `bi_unique A` bi_total_eq, unfolded bi_total_def] + obtain P Q where [transfer_rule]: "(A ===> op =) P P'" "(A ===> op =) Q Q'" by blast + have "F P = G P'" by transfer_prover + moreover have "(\x. P x \ Q x) \ (\x. P' x \ Q' x)" by transfer_prover + ultimately have "F Q" by(simp add: mono) + moreover have "F Q = G Q'" by transfer_prover + ultimately show "G Q'" by simp + qed +qed + +lemma is_filter_parametric [transfer_rule]: + "\ bi_total A; bi_unique A \ + \ (((A ===> op =) ===> op =) ===> op =) is_filter is_filter" +apply(rule rel_funI) +apply(rule iffI) + apply(erule (3) is_filter_parametric_aux) +apply(erule is_filter_parametric_aux[where A="conversep A"]) +apply(auto simp add: rel_fun_def) +done + +lemma left_total_rel_filter [transfer_rule]: + assumes [transfer_rule]: "bi_total A" "bi_unique A" + shows "left_total (rel_filter A)" +proof(rule left_totalI) + fix F :: "'a filter" + from bi_total_fun[OF bi_unique_fun[OF `bi_total A` bi_unique_eq] bi_total_eq] + obtain G where [transfer_rule]: "((A ===> op =) ===> op =) (\P. eventually P F) G" + unfolding bi_total_def by blast + moreover have "is_filter (\P. eventually P F) \ is_filter G" by transfer_prover + hence "is_filter G" by(simp add: eventually_def is_filter_Rep_filter) + ultimately have "rel_filter A F (Abs_filter G)" + by(simp add: rel_filter_eventually eventually_Abs_filter) + thus "\G. rel_filter A F G" .. +qed + +lemma right_total_rel_filter [transfer_rule]: + "\ bi_total A; bi_unique A \ \ right_total (rel_filter A)" +using left_total_rel_filter[of "A\\"] by simp + +lemma bi_total_rel_filter [transfer_rule]: + assumes "bi_total A" "bi_unique A" + shows "bi_total (rel_filter A)" +unfolding bi_total_alt_def using assms +by(simp add: left_total_rel_filter right_total_rel_filter) + +lemma left_unique_rel_filter [transfer_rule]: + assumes "left_unique A" + shows "left_unique (rel_filter A)" +proof(rule left_uniqueI) + fix F F' G + assume [transfer_rule]: "rel_filter A F G" "rel_filter A F' G" + show "F = F'" + unfolding filter_eq_iff + proof + fix P :: "'a \ bool" + obtain P' where [transfer_rule]: "(A ===> op =) P P'" + using left_total_fun[OF assms left_total_eq] unfolding left_total_def by blast + have "eventually P F = eventually P' G" + and "eventually P F' = eventually P' G" by transfer_prover+ + thus "eventually P F = eventually P F'" by simp + qed +qed + +lemma right_unique_rel_filter [transfer_rule]: + "right_unique A \ right_unique (rel_filter A)" +using left_unique_rel_filter[of "A\\"] by simp + +lemma bi_unique_rel_filter [transfer_rule]: + "bi_unique A \ bi_unique (rel_filter A)" +by(simp add: bi_unique_alt_def left_unique_rel_filter right_unique_rel_filter) + +lemma top_filter_parametric [transfer_rule]: + "bi_total A \ (rel_filter A) top top" +by(simp add: rel_filter_eventually All_transfer) + +lemma bot_filter_parametric [transfer_rule]: "(rel_filter A) bot bot" +by(simp add: rel_filter_eventually rel_fun_def) + +lemma sup_filter_parametric [transfer_rule]: + "(rel_filter A ===> rel_filter A ===> rel_filter A) sup sup" +by(fastforce simp add: rel_filter_eventually[abs_def] eventually_sup dest: rel_funD) + +lemma Sup_filter_parametric [transfer_rule]: + "(rel_set (rel_filter A) ===> rel_filter A) Sup Sup" +proof(rule rel_funI) + fix S T + assume [transfer_rule]: "rel_set (rel_filter A) S T" + show "rel_filter A (Sup S) (Sup T)" + by(simp add: rel_filter_eventually eventually_Sup) transfer_prover +qed + +lemma principal_parametric [transfer_rule]: + "(rel_set A ===> rel_filter A) principal principal" +proof(rule rel_funI) + fix S S' + assume [transfer_rule]: "rel_set A S S'" + show "rel_filter A (principal S) (principal S')" + by(simp add: rel_filter_eventually eventually_principal) transfer_prover +qed + +context + fixes A :: "'a \ 'b \ bool" + assumes [transfer_rule]: "bi_unique A" +begin + +lemma le_filter_parametric [transfer_rule]: + "(rel_filter A ===> rel_filter A ===> op =) op \ op \" +unfolding le_filter_def[abs_def] by transfer_prover + +lemma less_filter_parametric [transfer_rule]: + "(rel_filter A ===> rel_filter A ===> op =) op < op <" +unfolding less_filter_def[abs_def] by transfer_prover + +context + assumes [transfer_rule]: "bi_total A" +begin + +lemma Inf_filter_parametric [transfer_rule]: + "(rel_set (rel_filter A) ===> rel_filter A) Inf Inf" +unfolding Inf_filter_def[abs_def] by transfer_prover + +lemma inf_filter_parametric [transfer_rule]: + "(rel_filter A ===> rel_filter A ===> rel_filter A) inf inf" +proof(intro rel_funI)+ + fix F F' G G' + assume [transfer_rule]: "rel_filter A F F'" "rel_filter A G G'" + have "rel_filter A (Inf {F, G}) (Inf {F', G'})" by transfer_prover + thus "rel_filter A (inf F G) (inf F' G')" by simp +qed + +end + +end + +end + +end \ No newline at end of file diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/HOLCF/Library/Defl_Bifinite.thy --- a/src/HOL/HOLCF/Library/Defl_Bifinite.thy Mon Apr 13 10:36:06 2015 +0200 +++ b/src/HOL/HOLCF/Library/Defl_Bifinite.thy Mon Apr 13 12:13:52 2015 +0200 @@ -12,38 +12,6 @@ default_sort type -lemma MOST_INFM: - assumes inf: "infinite (UNIV::'a set)" - shows "MOST x::'a. P x \ INFM x::'a. P x" - unfolding Alm_all_def Inf_many_def - apply (auto simp add: Collect_neg_eq) - apply (drule (1) finite_UnI) - apply (simp add: Compl_partition2 inf) - done - -lemma MOST_SucI: "MOST n. P n \ MOST n. P (Suc n)" -by (rule MOST_inj [OF _ inj_Suc]) - -lemma MOST_SucD: "MOST n. P (Suc n) \ MOST n. P n" -unfolding MOST_nat -apply (clarify, rule_tac x="Suc m" in exI, clarify) -apply (erule Suc_lessE, simp) -done - -lemma MOST_Suc_iff: "(MOST n. P (Suc n)) \ (MOST n. P n)" -by (rule iffI [OF MOST_SucD MOST_SucI]) - -lemma INFM_finite_Bex_distrib: - "finite A \ (INFM y. \x\A. P x y) \ (\x\A. INFM y. P x y)" -by (induct set: finite, simp, simp add: INFM_disj_distrib) - -lemma MOST_finite_Ball_distrib: - "finite A \ (MOST y. \x\A. P x y) \ (\x\A. MOST y. P x y)" -by (induct set: finite, simp, simp add: MOST_conj_distrib) - -lemma MOST_ge_nat: "MOST n::nat. m \ n" -unfolding MOST_nat_le by fast - subsection {* Eventually constant sequences *} definition diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/HOLCF/Plain_HOLCF.thy --- a/src/HOL/HOLCF/Plain_HOLCF.thy Mon Apr 13 10:36:06 2015 +0200 +++ b/src/HOL/HOLCF/Plain_HOLCF.thy Mon Apr 13 12:13:52 2015 +0200 @@ -12,4 +12,6 @@ Basic HOLCF concepts and types; does not include definition packages. *} +hide_const (open) Filter.principal + end diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/Library/Infinite_Set.thy --- a/src/HOL/Library/Infinite_Set.thy Mon Apr 13 10:36:06 2015 +0200 +++ b/src/HOL/Library/Infinite_Set.thy Mon Apr 13 12:13:52 2015 +0200 @@ -67,36 +67,22 @@ infinite. *} -lemma finite_nat_bounded: assumes S: "finite (S::nat set)" shows "\k. S \ {.. {}" with Max_less_iff[OF S this] show ?thesis - by auto -qed simp +lemma infinite_nat_iff_unbounded_le: "infinite (S::nat set) \ (\m. \n\m. n \ S)" + using frequently_cofinite[of "\x. x \ S"] + by (simp add: cofinite_eq_sequentially frequently_def eventually_sequentially) + +lemma infinite_nat_iff_unbounded: "infinite (S::nat set) \ (\m. \n>m. n \ S)" + using frequently_cofinite[of "\x. x \ S"] + by (simp add: cofinite_eq_sequentially frequently_def eventually_at_top_dense) lemma finite_nat_iff_bounded: "finite (S::nat set) \ (\k. S \ {.. (\k. S \ {..k})" (is "?lhs \ ?rhs") -proof - assume ?lhs - then obtain k where "S \ {.. {..k}" by auto - then show ?rhs .. -next - assume ?rhs - then obtain k where "S \ {..k}" .. - then show "finite S" - by (rule finite_subset) simp -qed +lemma finite_nat_iff_bounded_le: "finite (S::nat set) \ (\k. S \ {.. k})" + using infinite_nat_iff_unbounded[of S] by (simp add: subset_eq) (metis not_le) -lemma infinite_nat_iff_unbounded: "infinite (S::nat set) \ (\m. \n. m < n \ n \ S)" - unfolding finite_nat_iff_bounded_le by (auto simp: subset_eq not_le) - -lemma infinite_nat_iff_unbounded_le: - "infinite (S::nat set) \ (\m. \n. m \ n \ n \ S)" - unfolding finite_nat_iff_bounded by (auto simp: subset_eq not_less) +lemma finite_nat_bounded: "finite (S::nat set) \ \k. S \ {..m. k < m \ (\n. m < n \ n \ S)" - shows "infinite (S::nat set)" -proof - - { - fix m have "\n. m < n \ n \ S" - proof (cases "k < m") - case True - with k show ?thesis by blast - next - case False - from k obtain n where "Suc k < n \ n \ S" by auto - with False have "m < n \ n \ S" by auto - then show ?thesis .. - qed - } - then show ?thesis - by (auto simp add: infinite_nat_iff_unbounded) -qed +lemma unbounded_k_infinite: "\m>k. \n>m. n \ S \ infinite (S::nat set)" + by (metis (full_types) infinite_nat_iff_unbounded_le le_imp_less_Suc not_less + not_less_iff_gr_or_eq sup.bounded_iff) lemma nat_not_finite: "finite (UNIV::nat set) \ R" by simp @@ -178,181 +148,106 @@ we introduce corresponding binders and their proof rules. *} -definition Inf_many :: "('a \ bool) \ bool" (binder "INFM " 10) - where "Inf_many P \ infinite {x. P x}" - -definition Alm_all :: "('a \ bool) \ bool" (binder "MOST " 10) - where "Alm_all P \ \ (INFM x. \ P x)" - -notation (xsymbols) - Inf_many (binder "\\<^sub>\" 10) and - Alm_all (binder "\\<^sub>\" 10) - -notation (HTML output) - Inf_many (binder "\\<^sub>\" 10) and - Alm_all (binder "\\<^sub>\" 10) - -lemma INFM_iff_infinite: "(INFM x. P x) \ infinite {x. P x}" - unfolding Inf_many_def .. - -lemma MOST_iff_cofinite: "(MOST x. P x) \ finite {x. \ P x}" - unfolding Alm_all_def Inf_many_def by simp - -(* legacy name *) -lemmas MOST_iff_finiteNeg = MOST_iff_cofinite - -lemma not_INFM [simp]: "\ (INFM x. P x) \ (MOST x. \ P x)" - unfolding Alm_all_def not_not .. - -lemma not_MOST [simp]: "\ (MOST x. P x) \ (INFM x. \ P x)" - unfolding Alm_all_def not_not .. +(* The following two lemmas are available as filter-rules, but not in the simp-set *) +lemma not_INFM [simp]: "\ (INFM x. P x) \ (MOST x. \ P x)" by (fact not_frequently) +lemma not_MOST [simp]: "\ (MOST x. P x) \ (INFM x. \ P x)" by (fact not_eventually) lemma INFM_const [simp]: "(INFM x::'a. P) \ P \ infinite (UNIV::'a set)" - unfolding Inf_many_def by simp + by (simp add: frequently_const_iff) lemma MOST_const [simp]: "(MOST x::'a. P) \ P \ finite (UNIV::'a set)" - unfolding Alm_all_def by simp - -lemma INFM_EX: "(\\<^sub>\x. P x) \ (\x. P x)" - apply (erule contrapos_pp) - apply simp - done - -lemma ALL_MOST: "\x. P x \ \\<^sub>\x. P x" - by simp - -lemma INFM_E: - assumes "INFM x. P x" - obtains x where "P x" - using INFM_EX [OF assms] by (rule exE) - -lemma MOST_I: - assumes "\x. P x" - shows "MOST x. P x" - using assms by simp + by (simp add: eventually_const_iff) -lemma INFM_mono: - assumes inf: "\\<^sub>\x. P x" and q: "\x. P x \ Q x" - shows "\\<^sub>\x. Q x" -proof - - from inf have "infinite {x. P x}" unfolding Inf_many_def . - moreover from q have "{x. P x} \ {x. Q x}" by auto - ultimately show ?thesis - using Inf_many_def infinite_super by blast -qed - -lemma MOST_mono: "\\<^sub>\x. P x \ (\x. P x \ Q x) \ \\<^sub>\x. Q x" - unfolding Alm_all_def by (blast intro: INFM_mono) - -lemma INFM_disj_distrib: - "(\\<^sub>\x. P x \ Q x) \ (\\<^sub>\x. P x) \ (\\<^sub>\x. Q x)" - unfolding Inf_many_def by (simp add: Collect_disj_eq) - -lemma INFM_imp_distrib: - "(INFM x. P x \ Q x) \ ((MOST x. P x) \ (INFM x. Q x))" - by (simp only: imp_conv_disj INFM_disj_distrib not_MOST) +lemma INFM_imp_distrib: "(INFM x. P x \ Q x) \ ((MOST x. P x) \ (INFM x. Q x))" + by (simp only: imp_conv_disj frequently_disj_iff not_eventually) -lemma MOST_conj_distrib: - "(\\<^sub>\x. P x \ Q x) \ (\\<^sub>\x. P x) \ (\\<^sub>\x. Q x)" - unfolding Alm_all_def by (simp add: INFM_disj_distrib del: disj_not1) - -lemma MOST_conjI: - "MOST x. P x \ MOST x. Q x \ MOST x. P x \ Q x" - by (simp add: MOST_conj_distrib) - -lemma INFM_conjI: - "INFM x. P x \ MOST x. Q x \ INFM x. P x \ Q x" - unfolding MOST_iff_cofinite INFM_iff_infinite - apply (drule (1) Diff_infinite_finite) - apply (simp add: Collect_conj_eq Collect_neg_eq) - done +lemma MOST_imp_iff: "MOST x. P x \ (MOST x. P x \ Q x) \ (MOST x. Q x)" + by (auto intro: eventually_rev_mp eventually_elim1) -lemma MOST_rev_mp: - assumes "\\<^sub>\x. P x" and "\\<^sub>\x. P x \ Q x" - shows "\\<^sub>\x. Q x" -proof - - have "\\<^sub>\x. P x \ (P x \ Q x)" - using assms by (rule MOST_conjI) - thus ?thesis by (rule MOST_mono) simp -qed - -lemma MOST_imp_iff: - assumes "MOST x. P x" - shows "(MOST x. P x \ Q x) \ (MOST x. Q x)" -proof - assume "MOST x. P x \ Q x" - with assms show "MOST x. Q x" by (rule MOST_rev_mp) -next - assume "MOST x. Q x" - then show "MOST x. P x \ Q x" by (rule MOST_mono) simp -qed - -lemma INFM_MOST_simps [simp]: - "\P Q. (INFM x. P x \ Q) \ (INFM x. P x) \ Q" - "\P Q. (INFM x. P \ Q x) \ P \ (INFM x. Q x)" - "\P Q. (MOST x. P x \ Q) \ (MOST x. P x) \ Q" - "\P Q. (MOST x. P \ Q x) \ P \ (MOST x. Q x)" - "\P Q. (MOST x. P x \ Q) \ ((INFM x. P x) \ Q)" - "\P Q. (MOST x. P \ Q x) \ (P \ (MOST x. Q x))" - unfolding Alm_all_def Inf_many_def - by (simp_all add: Collect_conj_eq) +lemma INFM_conjI: "INFM x. P x \ MOST x. Q x \ INFM x. P x \ Q x" + by (rule frequently_rev_mp[of P]) (auto elim: eventually_elim1) text {* Properties of quantifiers with injective functions. *} lemma INFM_inj: "INFM x. P (f x) \ inj f \ INFM x. P x" - unfolding INFM_iff_infinite - apply clarify - apply (drule (1) finite_vimageI) - apply simp - done + using finite_vimageI[of "{x. P x}" f] by (auto simp: frequently_cofinite) lemma MOST_inj: "MOST x. P x \ inj f \ MOST x. P (f x)" - unfolding MOST_iff_cofinite - apply (drule (1) finite_vimageI) - apply simp - done + using finite_vimageI[of "{x. \ P x}" f] by (auto simp: eventually_cofinite) text {* Properties of quantifiers with singletons. *} lemma not_INFM_eq [simp]: "\ (INFM x. x = a)" "\ (INFM x. a = x)" - unfolding INFM_iff_infinite by simp_all + unfolding frequently_cofinite by simp_all lemma MOST_neq [simp]: "MOST x. x \ a" "MOST x. a \ x" - unfolding MOST_iff_cofinite by simp_all + unfolding eventually_cofinite by simp_all lemma INFM_neq [simp]: "(INFM x::'a. x \ a) \ infinite (UNIV::'a set)" "(INFM x::'a. a \ x) \ infinite (UNIV::'a set)" - unfolding INFM_iff_infinite by simp_all + unfolding frequently_cofinite by simp_all lemma MOST_eq [simp]: "(MOST x::'a. x = a) \ finite (UNIV::'a set)" "(MOST x::'a. a = x) \ finite (UNIV::'a set)" - unfolding MOST_iff_cofinite by simp_all + unfolding eventually_cofinite by simp_all lemma MOST_eq_imp: "MOST x. x = a \ P x" "MOST x. a = x \ P x" - unfolding MOST_iff_cofinite by simp_all + unfolding eventually_cofinite by simp_all text {* Properties of quantifiers over the naturals. *} -lemma INFM_nat: "(\\<^sub>\n. P (n::nat)) \ (\m. \n. m < n \ P n)" - by (simp add: Inf_many_def infinite_nat_iff_unbounded) +lemma MOST_nat: "(\\<^sub>\n. P (n::nat)) \ (\m. \n>m. P n)" + by (auto simp add: eventually_cofinite finite_nat_iff_bounded_le subset_eq not_le[symmetric]) + +lemma MOST_nat_le: "(\\<^sub>\n. P (n::nat)) \ (\m. \n\m. P n)" + by (auto simp add: eventually_cofinite finite_nat_iff_bounded subset_eq not_le[symmetric]) + +lemma INFM_nat: "(\\<^sub>\n. P (n::nat)) \ (\m. \n>m. P n)" + by (simp add: frequently_cofinite infinite_nat_iff_unbounded) -lemma INFM_nat_le: "(\\<^sub>\n. P (n::nat)) \ (\m. \n. m \ n \ P n)" - by (simp add: Inf_many_def infinite_nat_iff_unbounded_le) +lemma INFM_nat_le: "(\\<^sub>\n. P (n::nat)) \ (\m. \n\m. P n)" + by (simp add: frequently_cofinite infinite_nat_iff_unbounded_le) + +lemma MOST_INFM: "infinite (UNIV::'a set) \ MOST x::'a. P x \ INFM x::'a. P x" + by (simp add: eventually_frequently) + +lemma MOST_Suc_iff: "(MOST n. P (Suc n)) \ (MOST n. P n)" + by (simp add: cofinite_eq_sequentially eventually_sequentially_Suc) -lemma MOST_nat: "(\\<^sub>\n. P (n::nat)) \ (\m. \n. m < n \ P n)" - by (simp add: Alm_all_def INFM_nat) +lemma + shows MOST_SucI: "MOST n. P n \ MOST n. P (Suc n)" + and MOST_SucD: "MOST n. P (Suc n) \ MOST n. P n" + by (simp_all add: MOST_Suc_iff) + +lemma MOST_ge_nat: "MOST n::nat. m \ n" + by (simp add: cofinite_eq_sequentially eventually_ge_at_top) -lemma MOST_nat_le: "(\\<^sub>\n. P (n::nat)) \ (\m. \n. m \ n \ P n)" - by (simp add: Alm_all_def INFM_nat_le) - +(* legacy names *) +lemma Inf_many_def: "Inf_many P \ infinite {x. P x}" by (fact frequently_cofinite) +lemma Alm_all_def: "Alm_all P \ \ (INFM x. \ P x)" by simp +lemma INFM_iff_infinite: "(INFM x. P x) \ infinite {x. P x}" by (fact frequently_cofinite) +lemma MOST_iff_cofinite: "(MOST x. P x) \ finite {x. \ P x}" by (fact eventually_cofinite) +lemma INFM_EX: "(\\<^sub>\x. P x) \ (\x. P x)" by (fact frequently_ex) +lemma ALL_MOST: "\x. P x \ \\<^sub>\x. P x" by (fact always_eventually) +lemma INFM_mono: "\\<^sub>\x. P x \ (\x. P x \ Q x) \ \\<^sub>\x. Q x" by (fact frequently_elim1) +lemma MOST_mono: "\\<^sub>\x. P x \ (\x. P x \ Q x) \ \\<^sub>\x. Q x" by (fact eventually_elim1) +lemma INFM_disj_distrib: "(\\<^sub>\x. P x \ Q x) \ (\\<^sub>\x. P x) \ (\\<^sub>\x. Q x)" by (fact frequently_disj_iff) +lemma MOST_rev_mp: "\\<^sub>\x. P x \ \\<^sub>\x. P x \ Q x \ \\<^sub>\x. Q x" by (fact eventually_rev_mp) +lemma MOST_conj_distrib: "(\\<^sub>\x. P x \ Q x) \ (\\<^sub>\x. P x) \ (\\<^sub>\x. Q x)" by (fact eventually_conj_iff) +lemma MOST_conjI: "MOST x. P x \ MOST x. Q x \ MOST x. P x \ Q x" by (fact eventually_conj) +lemma INFM_finite_Bex_distrib: "finite A \ (INFM y. \x\A. P x y) \ (\x\A. INFM y. P x y)" by (fact frequently_bex_finite_distrib) +lemma MOST_finite_Ball_distrib: "finite A \ (MOST y. \x\A. P x y) \ (\x\A. MOST y. P x y)" by (fact eventually_ball_finite_distrib) +lemma INFM_E: "INFM x. P x \ (\x. P x \ thesis) \ thesis" by (fact frequentlyE) +lemma MOST_I: "(\x. P x) \ MOST x. P x" by (rule eventuallyI) +lemmas MOST_iff_finiteNeg = MOST_iff_cofinite subsection "Enumeration of an Infinite Set" @@ -360,6 +255,11 @@ The set's element type must be wellordered (e.g. the natural numbers). *} +text \ + Could be generalized to + @{term "enumerate' S n = (SOME t. t \ s \ finite {s\S. s < t} \ card {s\S. s < t} = n)"}. +\ + primrec (in wellorder) enumerate :: "'a set \ nat \ 'a" where enumerate_0: "enumerate S 0 = (LEAST n. n \ S)" @@ -368,7 +268,7 @@ lemma enumerate_Suc': "enumerate S (Suc n) = enumerate (S - {enumerate S 0}) n" by simp -lemma enumerate_in_set: "infinite S \ enumerate S n : S" +lemma enumerate_in_set: "infinite S \ enumerate S n \ S" apply (induct n arbitrary: S) apply (fastforce intro: LeastI dest!: infinite_imp_nonempty) apply simp @@ -382,13 +282,13 @@ apply (rule order_le_neq_trans) apply (simp add: enumerate_0 Least_le enumerate_in_set) apply (simp only: enumerate_Suc') - apply (subgoal_tac "enumerate (S - {enumerate S 0}) 0 : S - {enumerate S 0}") + apply (subgoal_tac "enumerate (S - {enumerate S 0}) 0 \ S - {enumerate S 0}") apply (blast intro: sym) apply (simp add: enumerate_in_set del: Diff_iff) apply (simp add: enumerate_Suc') done -lemma enumerate_mono: "m infinite S \ enumerate S m < enumerate S n" +lemma enumerate_mono: "m < n \ infinite S \ enumerate S m < enumerate S n" apply (erule less_Suc_induct) apply (auto intro: enumerate_step) done diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/Library/Polynomial.thy --- a/src/HOL/Library/Polynomial.thy Mon Apr 13 10:36:06 2015 +0200 +++ b/src/HOL/Library/Polynomial.thy Mon Apr 13 12:13:52 2015 +0200 @@ -50,9 +50,6 @@ "tl (x ## xs) = xs" by (simp add: cCons_def) -lemma MOST_SucD: "(\\<^sub>\ n. P (Suc n)) \ (\\<^sub>\ n. P n)" - by (auto simp: MOST_nat) (metis Suc_lessE) - subsection {* Definition of type @{text poly} *} typedef 'a poly = "{f :: nat \ 'a::zero. \\<^sub>\ n. f n = 0}" @@ -501,9 +498,9 @@ lift_definition plus_poly :: "'a poly \ 'a poly \ 'a poly" is "\p q n. coeff p n + coeff q n" -proof (rule MOST_rev_mp[OF MOST_coeff_eq_0 MOST_rev_mp[OF MOST_coeff_eq_0]]) - fix q p :: "'a poly" show "\\<^sub>\n. coeff p n = 0 \ coeff q n = 0 \ coeff p n + coeff q n = 0" - by simp +proof - + fix q p :: "'a poly" show "\\<^sub>\n. coeff p n + coeff q n = 0" + using MOST_coeff_eq_0[of p] MOST_coeff_eq_0[of q] by eventually_elim simp qed lemma coeff_add [simp]: @@ -527,9 +524,9 @@ lift_definition minus_poly :: "'a poly \ 'a poly \ 'a poly" is "\p q n. coeff p n - coeff q n" -proof (rule MOST_rev_mp[OF MOST_coeff_eq_0 MOST_rev_mp[OF MOST_coeff_eq_0]]) - fix q p :: "'a poly" show "\\<^sub>\n. coeff p n = 0 \ coeff q n = 0 \ coeff p n - coeff q n = 0" - by simp +proof - + fix q p :: "'a poly" show "\\<^sub>\n. coeff p n - coeff q n = 0" + using MOST_coeff_eq_0[of p] MOST_coeff_eq_0[of q] by eventually_elim simp qed lemma coeff_diff [simp]: @@ -551,9 +548,9 @@ lift_definition uminus_poly :: "'a poly \ 'a poly" is "\p n. - coeff p n" -proof (rule MOST_rev_mp[OF MOST_coeff_eq_0]) - fix p :: "'a poly" show "\\<^sub>\n. coeff p n = 0 \ - coeff p n = 0" - by simp +proof - + fix p :: "'a poly" show "\\<^sub>\n. - coeff p n = 0" + using MOST_coeff_eq_0 by simp qed lemma coeff_minus [simp]: "coeff (- p) n = - coeff p n" @@ -707,11 +704,9 @@ lift_definition smult :: "'a::comm_semiring_0 \ 'a poly \ 'a poly" is "\a p n. a * coeff p n" -proof (intro MOST_nat[THEN iffD2] exI allI impI) - fix a :: 'a and p :: "'a poly" and i - assume "degree p < i" - then show "a * coeff p i = 0" - by (simp add: coeff_eq_0) +proof - + fix a :: 'a and p :: "'a poly" show "\\<^sub>\ i. a * coeff p i = 0" + using MOST_coeff_eq_0[of p] by eventually_elim simp qed lemma coeff_smult [simp]: diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/Main.thy --- a/src/HOL/Main.thy Mon Apr 13 10:36:06 2015 +0200 +++ b/src/HOL/Main.thy Mon Apr 13 12:13:52 2015 +0200 @@ -1,7 +1,7 @@ section {* Main HOL *} theory Main -imports Predicate_Compile Quickcheck_Narrowing Extraction Coinduction Nitpick BNF_Greatest_Fixpoint +imports Predicate_Compile Quickcheck_Narrowing Extraction Coinduction Nitpick BNF_Greatest_Fixpoint Filter begin text {* diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/Multivariate_Analysis/Topology_Euclidean_Space.thy --- a/src/HOL/Multivariate_Analysis/Topology_Euclidean_Space.thy Mon Apr 13 10:36:06 2015 +0200 +++ b/src/HOL/Multivariate_Analysis/Topology_Euclidean_Space.thy Mon Apr 13 12:13:52 2015 +0200 @@ -3331,10 +3331,8 @@ have "(\B \ Z. finite B \ U \ \B \ {})" proof (intro allI impI) fix B assume "finite B" "B \ Z" - with `finite B` ev_Z have "eventually (\x. \b\B. x \ b) F" - by (auto intro!: eventually_Ball_finite) - with F(2) have "eventually (\x. x \ U \ (\B)) F" - by eventually_elim auto + with `finite B` ev_Z F(2) have "eventually (\x. x \ U \ (\B)) F" + by (auto simp: eventually_ball_finite_distrib eventually_conj_iff) with F show "U \ \B \ {}" by (intro notI) (simp add: eventually_False) qed @@ -7506,7 +7504,7 @@ then have cont: "continuous_on ?D (\x. dist ((g \ fst) x) (snd x))" unfolding continuous_on_eq_continuous_within by (intro continuous_dist ballI continuous_within_compose) - (auto intro!: continuous_fst continuous_snd continuous_within_id simp: image_image) + (auto intro!: continuous_fst continuous_snd continuous_within_id simp: image_image) obtain a where "a \ s" and le: "\x. x \ s \ dist (g a) a \ dist (g x) x" using continuous_attains_inf[OF D cont] by auto diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/NSA/Filter.thy --- a/src/HOL/NSA/Filter.thy Mon Apr 13 10:36:06 2015 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,413 +0,0 @@ -(* Title: HOL/NSA/Filter.thy - Author: Jacques D. Fleuriot, University of Cambridge - Author: Lawrence C Paulson - Author: Brian Huffman -*) - -section {* Filters and Ultrafilters *} - -theory Filter -imports "~~/src/HOL/Library/Infinite_Set" -begin - -subsection {* Definitions and basic properties *} - -subsubsection {* Filters *} - -locale filter = - fixes F :: "'a set set" - assumes UNIV [iff]: "UNIV \ F" - assumes empty [iff]: "{} \ F" - assumes Int: "\u \ F; v \ F\ \ u \ v \ F" - assumes subset: "\u \ F; u \ v\ \ v \ F" -begin - -lemma memD: "A \ F \ - A \ F" -proof - assume "A \ F" and "- A \ F" - hence "A \ (- A) \ F" by (rule Int) - thus "False" by simp -qed - -lemma not_memI: "- A \ F \ A \ F" -by (drule memD, simp) - -lemma Int_iff: "(x \ y \ F) = (x \ F \ y \ F)" -by (auto elim: subset intro: Int) - -end - -subsubsection {* Ultrafilters *} - -locale ultrafilter = filter + - assumes ultra: "A \ F \ - A \ F" -begin - -lemma memI: "- A \ F \ A \ F" -using ultra [of A] by simp - -lemma not_memD: "A \ F \ - A \ F" -by (rule memI, simp) - -lemma not_mem_iff: "(A \ F) = (- A \ F)" -by (rule iffI [OF not_memD not_memI]) - -lemma Compl_iff: "(- A \ F) = (A \ F)" -by (rule iffI [OF not_memI not_memD]) - -lemma Un_iff: "(x \ y \ F) = (x \ F \ y \ F)" - apply (rule iffI) - apply (erule contrapos_pp) - apply (simp add: Int_iff not_mem_iff) - apply (auto elim: subset) -done - -end - -subsubsection {* Free Ultrafilters *} - -locale freeultrafilter = ultrafilter + - assumes infinite: "A \ F \ infinite A" -begin - -lemma finite: "finite A \ A \ F" -by (erule contrapos_pn, erule infinite) - -lemma singleton: "{x} \ F" -by (rule finite, simp) - -lemma insert_iff [simp]: "(insert x A \ F) = (A \ F)" -apply (subst insert_is_Un) -apply (subst Un_iff) -apply (simp add: singleton) -done - -lemma filter: "filter F" .. - -lemma ultrafilter: "ultrafilter F" .. - -end - -subsection {* Collect properties *} - -lemma (in filter) Collect_ex: - "({n. \x. P n x} \ F) = (\X. {n. P n (X n)} \ F)" -proof - assume "{n. \x. P n x} \ F" - hence "{n. P n (SOME x. P n x)} \ F" - by (auto elim: someI subset) - thus "\X. {n. P n (X n)} \ F" by fast -next - show "\X. {n. P n (X n)} \ F \ {n. \x. P n x} \ F" - by (auto elim: subset) -qed - -lemma (in filter) Collect_conj: - "({n. P n \ Q n} \ F) = ({n. P n} \ F \ {n. Q n} \ F)" -by (subst Collect_conj_eq, rule Int_iff) - -lemma (in ultrafilter) Collect_not: - "({n. \ P n} \ F) = ({n. P n} \ F)" -by (subst Collect_neg_eq, rule Compl_iff) - -lemma (in ultrafilter) Collect_disj: - "({n. P n \ Q n} \ F) = ({n. P n} \ F \ {n. Q n} \ F)" -by (subst Collect_disj_eq, rule Un_iff) - -lemma (in ultrafilter) Collect_all: - "({n. \x. P n x} \ F) = (\X. {n. P n (X n)} \ F)" -apply (rule Not_eq_iff [THEN iffD1]) -apply (simp add: Collect_not [symmetric]) -apply (rule Collect_ex) -done - -subsection {* Maximal filter = Ultrafilter *} - -text {* - A filter F is an ultrafilter iff it is a maximal filter, - i.e. whenever G is a filter and @{term "F \ G"} then @{term "F = G"} -*} -text {* - Lemmas that shows existence of an extension to what was assumed to - be a maximal filter. Will be used to derive contradiction in proof of - property of ultrafilter. -*} - -lemma extend_lemma1: "UNIV \ F \ A \ {X. \f\F. A \ f \ X}" -by blast - -lemma extend_lemma2: "F \ {X. \f\F. A \ f \ X}" -by blast - -lemma (in filter) extend_filter: -assumes A: "- A \ F" -shows "filter {X. \f\F. A \ f \ X}" (is "filter ?X") -proof (rule filter.intro) - show "UNIV \ ?X" by blast -next - show "{} \ ?X" - proof (clarify) - fix f assume f: "f \ F" and Af: "A \ f \ {}" - from Af have fA: "f \ - A" by blast - from f fA have "- A \ F" by (rule subset) - with A show "False" by simp - qed -next - fix u and v - assume u: "u \ ?X" and v: "v \ ?X" - from u obtain f where f: "f \ F" and Af: "A \ f \ u" by blast - from v obtain g where g: "g \ F" and Ag: "A \ g \ v" by blast - from f g have fg: "f \ g \ F" by (rule Int) - from Af Ag have Afg: "A \ (f \ g) \ u \ v" by blast - from fg Afg show "u \ v \ ?X" by blast -next - fix u and v - assume uv: "u \ v" and u: "u \ ?X" - from u obtain f where f: "f \ F" and Afu: "A \ f \ u" by blast - from Afu uv have Afv: "A \ f \ v" by blast - from f Afv have "\f\F. A \ f \ v" by blast - thus "v \ ?X" by simp -qed - -lemma (in filter) max_filter_ultrafilter: -assumes max: "\G. \filter G; F \ G\ \ F = G" -shows "ultrafilter_axioms F" -proof (rule ultrafilter_axioms.intro) - fix A show "A \ F \ - A \ F" - proof (rule disjCI) - let ?X = "{X. \f\F. A \ f \ X}" - assume AF: "- A \ F" - from AF have X: "filter ?X" by (rule extend_filter) - from UNIV have AX: "A \ ?X" by (rule extend_lemma1) - have FX: "F \ ?X" by (rule extend_lemma2) - from X FX have "F = ?X" by (rule max) - with AX show "A \ F" by simp - qed -qed - -lemma (in ultrafilter) max_filter: -assumes G: "filter G" and sub: "F \ G" shows "F = G" -proof - show "F \ G" using sub . - show "G \ F" - proof - fix A assume A: "A \ G" - from G A have "- A \ G" by (rule filter.memD) - with sub have B: "- A \ F" by blast - thus "A \ F" by (rule memI) - qed -qed - -subsection {* Ultrafilter Theorem *} - -text "A local context makes proof of ultrafilter Theorem more modular" -context - fixes frechet :: "'a set set" - and superfrechet :: "'a set set set" - - assumes infinite_UNIV: "infinite (UNIV :: 'a set)" - - defines frechet_def: "frechet \ {A. finite (- A)}" - and superfrechet_def: "superfrechet \ {G. filter G \ frechet \ G}" -begin - -lemma superfrechetI: - "\filter G; frechet \ G\ \ G \ superfrechet" -by (simp add: superfrechet_def) - -lemma superfrechetD1: - "G \ superfrechet \ filter G" -by (simp add: superfrechet_def) - -lemma superfrechetD2: - "G \ superfrechet \ frechet \ G" -by (simp add: superfrechet_def) - -text {* A few properties of free filters *} - -lemma filter_cofinite: -assumes inf: "infinite (UNIV :: 'a set)" -shows "filter {A:: 'a set. finite (- A)}" (is "filter ?F") -proof (rule filter.intro) - show "UNIV \ ?F" by simp -next - show "{} \ ?F" using inf by simp -next - fix u v assume "u \ ?F" and "v \ ?F" - thus "u \ v \ ?F" by simp -next - fix u v assume uv: "u \ v" and u: "u \ ?F" - from uv have vu: "- v \ - u" by simp - from u show "v \ ?F" - by (simp add: finite_subset [OF vu]) -qed - -text {* - We prove: 1. Existence of maximal filter i.e. ultrafilter; - 2. Freeness property i.e ultrafilter is free. - Use a locale to prove various lemmas and then - export main result: The ultrafilter Theorem -*} - -lemma filter_frechet: "filter frechet" -by (unfold frechet_def, rule filter_cofinite [OF infinite_UNIV]) - -lemma frechet_in_superfrechet: "frechet \ superfrechet" -by (rule superfrechetI [OF filter_frechet subset_refl]) - -lemma lemma_mem_chain_filter: - "\c \ chains superfrechet; x \ c\ \ filter x" -by (unfold chains_def superfrechet_def, blast) - - -subsubsection {* Unions of chains of superfrechets *} - -text "In this section we prove that superfrechet is closed -with respect to unions of non-empty chains. We must show - 1) Union of a chain is a filter, - 2) Union of a chain contains frechet. - -Number 2 is trivial, but 1 requires us to prove all the filter rules." - -lemma Union_chain_UNIV: - "\c \ chains superfrechet; c \ {}\ \ UNIV \ \c" -proof - - assume 1: "c \ chains superfrechet" and 2: "c \ {}" - from 2 obtain x where 3: "x \ c" by blast - from 1 3 have "filter x" by (rule lemma_mem_chain_filter) - hence "UNIV \ x" by (rule filter.UNIV) - with 3 show "UNIV \ \c" by blast -qed - -lemma Union_chain_empty: - "c \ chains superfrechet \ {} \ \c" -proof - assume 1: "c \ chains superfrechet" and 2: "{} \ \c" - from 2 obtain x where 3: "x \ c" and 4: "{} \ x" .. - from 1 3 have "filter x" by (rule lemma_mem_chain_filter) - hence "{} \ x" by (rule filter.empty) - with 4 show "False" by simp -qed - -lemma Union_chain_Int: - "\c \ chains superfrechet; u \ \c; v \ \c\ \ u \ v \ \c" -proof - - assume c: "c \ chains superfrechet" - assume "u \ \c" - then obtain x where ux: "u \ x" and xc: "x \ c" .. - assume "v \ \c" - then obtain y where vy: "v \ y" and yc: "y \ c" .. - from c xc yc have "x \ y \ y \ x" using c unfolding chains_def chain_subset_def by auto - with xc yc have xyc: "x \ y \ c" - by (auto simp add: Un_absorb1 Un_absorb2) - with c have fxy: "filter (x \ y)" by (rule lemma_mem_chain_filter) - from ux have uxy: "u \ x \ y" by simp - from vy have vxy: "v \ x \ y" by simp - from fxy uxy vxy have "u \ v \ x \ y" by (rule filter.Int) - with xyc show "u \ v \ \c" .. -qed - -lemma Union_chain_subset: - "\c \ chains superfrechet; u \ \c; u \ v\ \ v \ \c" -proof - - assume c: "c \ chains superfrechet" - and u: "u \ \c" and uv: "u \ v" - from u obtain x where ux: "u \ x" and xc: "x \ c" .. - from c xc have fx: "filter x" by (rule lemma_mem_chain_filter) - from fx ux uv have vx: "v \ x" by (rule filter.subset) - with xc show "v \ \c" .. -qed - -lemma Union_chain_filter: -assumes chain: "c \ chains superfrechet" and nonempty: "c \ {}" -shows "filter (\c)" -proof (rule filter.intro) - show "UNIV \ \c" using chain nonempty by (rule Union_chain_UNIV) -next - show "{} \ \c" using chain by (rule Union_chain_empty) -next - fix u v assume "u \ \c" and "v \ \c" - with chain show "u \ v \ \c" by (rule Union_chain_Int) -next - fix u v assume "u \ \c" and "u \ v" - with chain show "v \ \c" by (rule Union_chain_subset) -qed - -lemma lemma_mem_chain_frechet_subset: - "\c \ chains superfrechet; x \ c\ \ frechet \ x" -by (unfold superfrechet_def chains_def, blast) - -lemma Union_chain_superfrechet: - "\c \ {}; c \ chains superfrechet\ \ \c \ superfrechet" -proof (rule superfrechetI) - assume 1: "c \ chains superfrechet" and 2: "c \ {}" - thus "filter (\c)" by (rule Union_chain_filter) - from 2 obtain x where 3: "x \ c" by blast - from 1 3 have "frechet \ x" by (rule lemma_mem_chain_frechet_subset) - also from 3 have "x \ \c" by blast - finally show "frechet \ \c" . -qed - -subsubsection {* Existence of free ultrafilter *} - -lemma max_cofinite_filter_Ex: - "\U\superfrechet. \G\superfrechet. U \ G \ G = U" -proof (rule Zorn_Lemma2, safe) - fix c assume c: "c \ chains superfrechet" - show "\U\superfrechet. \G\c. G \ U" (is "?U") - proof (cases) - assume "c = {}" - with frechet_in_superfrechet show "?U" by blast - next - assume A: "c \ {}" - from A c have "\c \ superfrechet" - by (rule Union_chain_superfrechet) - thus "?U" by blast - qed -qed - -lemma mem_superfrechet_all_infinite: - "\U \ superfrechet; A \ U\ \ infinite A" -proof - assume U: "U \ superfrechet" and A: "A \ U" and fin: "finite A" - from U have fil: "filter U" and fre: "frechet \ U" - by (simp_all add: superfrechet_def) - from fin have "- A \ frechet" by (simp add: frechet_def) - with fre have cA: "- A \ U" by (rule subsetD) - from fil A cA have "A \ - A \ U" by (rule filter.Int) - with fil show "False" by (simp add: filter.empty) -qed - -text {* There exists a free ultrafilter on any infinite set *} - -lemma freeultrafilter_Ex: - "\U::'a set set. freeultrafilter U" -proof - - from max_cofinite_filter_Ex obtain U - where U: "U \ superfrechet" - and max [rule_format]: "\G\superfrechet. U \ G \ G = U" .. - from U have fil: "filter U" by (rule superfrechetD1) - from U have fre: "frechet \ U" by (rule superfrechetD2) - have ultra: "ultrafilter_axioms U" - proof (rule filter.max_filter_ultrafilter [OF fil]) - fix G assume G: "filter G" and UG: "U \ G" - from fre UG have "frechet \ G" by simp - with G have "G \ superfrechet" by (rule superfrechetI) - from this UG show "U = G" by (rule max[symmetric]) - qed - have free: "freeultrafilter_axioms U" - proof (rule freeultrafilter_axioms.intro) - fix A assume "A \ U" - with U show "infinite A" by (rule mem_superfrechet_all_infinite) - qed - from fil ultra free have "freeultrafilter U" - by (rule freeultrafilter.intro [OF ultrafilter.intro]) - (* FIXME: unfold_locales should use chained facts *) - then show ?thesis .. -qed - -end - -hide_const (open) filter - -end diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/NSA/Free_Ultrafilter.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/NSA/Free_Ultrafilter.thy Mon Apr 13 12:13:52 2015 +0200 @@ -0,0 +1,200 @@ +(* Title: HOL/NSA/Free_Ultrafilter.thy + Author: Jacques D. Fleuriot, University of Cambridge + Author: Lawrence C Paulson + Author: Brian Huffman +*) + +section {* Filters and Ultrafilters *} + +theory Free_Ultrafilter +imports "~~/src/HOL/Library/Infinite_Set" +begin + +subsection {* Definitions and basic properties *} + +subsubsection {* Ultrafilters *} + +locale ultrafilter = + fixes F :: "'a filter" + assumes proper: "F \ bot" + assumes ultra: "eventually P F \ eventually (\x. \ P x) F" +begin + +lemma eventually_imp_frequently: "frequently P F \ eventually P F" + using ultra[of P] by (simp add: frequently_def) + +lemma frequently_eq_eventually: "frequently P F = eventually P F" + using eventually_imp_frequently eventually_frequently[OF proper] .. + +lemma eventually_disj_iff: "eventually (\x. P x \ Q x) F \ eventually P F \ eventually Q F" + unfolding frequently_eq_eventually[symmetric] frequently_disj_iff .. + +lemma eventually_all_iff: "eventually (\x. \y. P x y) F = (\Y. eventually (\x. P x (Y x)) F)" + using frequently_all[of P F] by (simp add: frequently_eq_eventually) + +lemma eventually_imp_iff: "eventually (\x. P x \ Q x) F \ (eventually P F \ eventually Q F)" + using frequently_imp_iff[of P Q F] by (simp add: frequently_eq_eventually) + +lemma eventually_iff_iff: "eventually (\x. P x \ Q x) F \ (eventually P F \ eventually Q F)" + unfolding iff_conv_conj_imp eventually_conj_iff eventually_imp_iff by simp + +lemma eventually_not_iff: "eventually (\x. \ P x) F \ \ eventually P F" + unfolding not_eventually frequently_eq_eventually .. + +end + +subsection {* Maximal filter = Ultrafilter *} + +text {* + A filter F is an ultrafilter iff it is a maximal filter, + i.e. whenever G is a filter and @{term "F \ G"} then @{term "F = G"} +*} +text {* + Lemmas that shows existence of an extension to what was assumed to + be a maximal filter. Will be used to derive contradiction in proof of + property of ultrafilter. +*} + +lemma extend_filter: + "frequently P F \ inf F (principal {x. P x}) \ bot" + unfolding trivial_limit_def eventually_inf_principal by (simp add: not_eventually) + +lemma max_filter_ultrafilter: + assumes proper: "F \ bot" + assumes max: "\G. G \ bot \ G \ F \ F = G" + shows "ultrafilter F" +proof + fix P show "eventually P F \ (\\<^sub>Fx in F. \ P x)" + proof (rule disjCI) + assume "\ (\\<^sub>Fx in F. \ P x)" + then have "inf F (principal {x. P x}) \ bot" + by (simp add: not_eventually extend_filter) + then have F: "F = inf F (principal {x. P x})" + by (rule max) simp + show "eventually P F" + by (subst F) (simp add: eventually_inf_principal) + qed +qed fact + +lemma le_filter_frequently: "F \ G \ (\P. frequently P F \ frequently P G)" + unfolding frequently_def le_filter_def + apply auto + apply (erule_tac x="\x. \ P x" in allE) + apply auto + done + +lemma (in ultrafilter) max_filter: + assumes G: "G \ bot" and sub: "G \ F" shows "F = G" +proof (rule antisym) + show "F \ G" + using sub + by (auto simp: le_filter_frequently[of F] frequently_eq_eventually le_filter_def[of G] + intro!: eventually_frequently G proper) +qed fact + +subsection {* Ultrafilter Theorem *} + +text "A local context makes proof of ultrafilter Theorem more modular" + +lemma ex_max_ultrafilter: + fixes F :: "'a filter" + assumes F: "F \ bot" + shows "\U\F. ultrafilter U" +proof - + let ?X = "{G. G \ bot \ G \ F}" + let ?R = "{(b, a). a \ bot \ a \ b \ b \ F}" + + have bot_notin_R: "\c. c \ Chains ?R \ bot \ c" + by (auto simp: Chains_def) + + have [simp]: "Field ?R = ?X" + by (auto simp: Field_def bot_unique) + + have "\m\Field ?R. \a\Field ?R. (m, a) \ ?R \ a = m" + proof (rule Zorns_po_lemma) + show "Partial_order ?R" + unfolding partial_order_on_def preorder_on_def + by (auto simp: antisym_def refl_on_def trans_def Field_def bot_unique) + show "\C\Chains ?R. \u\Field ?R. \a\C. (a, u) \ ?R" + proof (safe intro!: bexI del: notI) + fix c x assume c: "c \ Chains ?R" + + { assume "c \ {}" + with c have "Inf c = bot \ (\x\c. x = bot)" + unfolding trivial_limit_def by (intro eventually_Inf_base) (auto simp: Chains_def) + with c have 1: "Inf c \ bot" + by (simp add: bot_notin_R) + from `c \ {}` obtain x where "x \ c" by auto + with c have 2: "Inf c \ F" + by (auto intro!: Inf_lower2[of x] simp: Chains_def) + note 1 2 } + note Inf_c = this + then have [simp]: "inf F (Inf c) = (if c = {} then F else Inf c)" + using c by (auto simp add: inf_absorb2) + + show "inf F (Inf c) \ bot" + using c by (simp add: F Inf_c) + + show "inf F (Inf c) \ Field ?R" + using c by (simp add: Chains_def Inf_c F) + + assume x: "x \ c" + with c show "inf F (Inf c) \ x" "x \ F" + by (auto intro: Inf_lower simp: Chains_def) + qed + qed + then guess U .. + then show ?thesis + by (intro exI[of _ U] conjI max_filter_ultrafilter) auto +qed + +subsubsection {* Free Ultrafilters *} + +text {* There exists a free ultrafilter on any infinite set *} + +locale freeultrafilter = ultrafilter + + assumes infinite: "eventually P F \ infinite {x. P x}" +begin + +lemma finite: "finite {x. P x} \ \ eventually P F" + by (erule contrapos_pn, erule infinite) + +lemma finite': "finite {x. \ P x} \ eventually P F" + by (drule finite) (simp add: not_eventually frequently_eq_eventually) + +lemma le_cofinite: "F \ cofinite" + by (intro filter_leI) + (auto simp add: eventually_cofinite not_eventually frequently_eq_eventually dest!: finite) + +lemma singleton: "\ eventually (\x. x = a) F" +by (rule finite, simp) + +lemma singleton': "\ eventually (op = a) F" +by (rule finite, simp) + +lemma ultrafilter: "ultrafilter F" .. + +end + +lemma freeultrafilter_Ex: + assumes [simp]: "infinite (UNIV :: 'a set)" + shows "\U::'a filter. freeultrafilter U" +proof - + from ex_max_ultrafilter[of "cofinite :: 'a filter"] + obtain U :: "'a filter" where "U \ cofinite" "ultrafilter U" + by auto + interpret ultrafilter U by fact + have "freeultrafilter U" + proof + fix P assume "eventually P U" + with proper have "frequently P U" + by (rule eventually_frequently) + then have "frequently P cofinite" + using `U \ cofinite` by (simp add: le_filter_frequently) + then show "infinite {x. P x}" + by (simp add: frequently_cofinite) + qed + then show ?thesis .. +qed + +end diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/NSA/HyperDef.thy --- a/src/HOL/NSA/HyperDef.thy Mon Apr 13 10:36:06 2015 +0200 +++ b/src/HOL/NSA/HyperDef.thy Mon Apr 13 12:13:52 2015 +0200 @@ -178,7 +178,7 @@ by (cases x, simp add: star_n_def) lemma Rep_star_star_n_iff [simp]: - "(X \ Rep_star (star_n Y)) = ({n. Y n = X n} \ \)" + "(X \ Rep_star (star_n Y)) = (eventually (\n. Y n = X n) \)" by (simp add: star_n_def) lemma Rep_star_star_n: "X \ Rep_star (star_n X)" @@ -207,12 +207,11 @@ by (simp only: star_inverse_def starfun_star_n) lemma star_n_le: - "star_n X \ star_n Y = - ({n. X n \ Y n} \ FreeUltrafilterNat)" + "star_n X \ star_n Y = (eventually (\n. X n \ Y n) FreeUltrafilterNat)" by (simp only: star_le_def starP2_star_n) lemma star_n_less: - "star_n X < star_n Y = ({n. X n < Y n} \ FreeUltrafilterNat)" + "star_n X < star_n Y = (eventually (\n. X n < Y n) FreeUltrafilterNat)" by (simp only: star_less_def starP2_star_n) lemma star_n_zero_num: "0 = star_n (%n. 0)" @@ -273,7 +272,7 @@ by (insert not_ex_hypreal_of_real_eq_epsilon, auto) lemma hypreal_epsilon_not_zero: "epsilon \ 0" -by (simp add: epsilon_def star_zero_def star_of_def star_n_eq_iff +by (simp add: epsilon_def star_zero_def star_of_def star_n_eq_iff FreeUltrafilterNat.proper del: star_of_zero) lemma hypreal_epsilon_inverse_omega: "epsilon = inverse(omega)" diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/NSA/HyperNat.thy --- a/src/HOL/NSA/HyperNat.thy Mon Apr 13 10:36:06 2015 +0200 +++ b/src/HOL/NSA/HyperNat.thy Mon Apr 13 12:13:52 2015 +0200 @@ -274,10 +274,10 @@ hypnat_omega_def: "whn = star_n (%n::nat. n)" lemma hypnat_of_nat_neq_whn: "hypnat_of_nat n \ whn" -by (simp add: hypnat_omega_def star_of_def star_n_eq_iff) +by (simp add: FreeUltrafilterNat.singleton' hypnat_omega_def star_of_def star_n_eq_iff) lemma whn_neq_hypnat_of_nat: "whn \ hypnat_of_nat n" -by (simp add: hypnat_omega_def star_of_def star_n_eq_iff) +by (simp add: FreeUltrafilterNat.singleton hypnat_omega_def star_of_def star_n_eq_iff) lemma whn_not_Nats [simp]: "whn \ Nats" by (simp add: Nats_def image_def whn_neq_hypnat_of_nat) @@ -285,15 +285,9 @@ lemma HNatInfinite_whn [simp]: "whn \ HNatInfinite" by (simp add: HNatInfinite_def) -lemma lemma_unbounded_set [simp]: "{n::nat. m < n} \ FreeUltrafilterNat" -apply (insert finite_atMost [of m]) -apply (drule FreeUltrafilterNat.finite) -apply (drule FreeUltrafilterNat.not_memD) -apply (simp add: Collect_neg_eq [symmetric] linorder_not_le atMost_def) -done - -lemma Compl_Collect_le: "- {n::nat. N \ n} = {n. n < N}" -by (simp add: Collect_neg_eq [symmetric] linorder_not_le) +lemma lemma_unbounded_set [simp]: "eventually (\n::nat. m < n) \" + by (rule filter_leD[OF FreeUltrafilterNat.le_cofinite]) + (auto simp add: cofinite_eq_sequentially eventually_at_top_dense) lemma hypnat_of_nat_eq: "hypnat_of_nat m = star_n (%n::nat. m)" @@ -327,14 +321,14 @@ (*??delete? similar reasoning in hypnat_omega_gt_SHNat above*) lemma HNatInfinite_FreeUltrafilterNat_lemma: - assumes "\N::nat. {n. f n \ N} \ FreeUltrafilterNat" - shows "{n. N < f n} \ FreeUltrafilterNat" + assumes "\N::nat. eventually (\n. f n \ N) \" + shows "eventually (\n. N < f n) \" apply (induct N) using assms apply (drule_tac x = 0 in spec, simp) using assms apply (drule_tac x = "Suc N" in spec) -apply (elim ultra, auto) +apply (auto elim: eventually_elim2) done lemma HNatInfinite_iff: "HNatInfinite = {N. \n \ Nats. n < N}" @@ -347,18 +341,18 @@ Free Ultrafilter*} lemma HNatInfinite_FreeUltrafilterNat: - "star_n X \ HNatInfinite ==> \u. {n. u < X n}: FreeUltrafilterNat" + "star_n X \ HNatInfinite ==> \u. eventually (\n. u < X n) FreeUltrafilterNat" apply (auto simp add: HNatInfinite_iff SHNat_eq) apply (drule_tac x="star_of u" in spec, simp) apply (simp add: star_of_def star_less_def starP2_star_n) done lemma FreeUltrafilterNat_HNatInfinite: - "\u. {n. u < X n}: FreeUltrafilterNat ==> star_n X \ HNatInfinite" + "\u. eventually (\n. u < X n) FreeUltrafilterNat ==> star_n X \ HNatInfinite" by (auto simp add: star_less_def starP2_star_n HNatInfinite_iff SHNat_eq hypnat_of_nat_eq) lemma HNatInfinite_FreeUltrafilterNat_iff: - "(star_n X \ HNatInfinite) = (\u. {n. u < X n}: FreeUltrafilterNat)" + "(star_n X \ HNatInfinite) = (\u. eventually (\n. u < X n) FreeUltrafilterNat)" by (rule iffI [OF HNatInfinite_FreeUltrafilterNat FreeUltrafilterNat_HNatInfinite]) diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/NSA/NSA.thy --- a/src/HOL/NSA/NSA.thy Mon Apr 13 10:36:06 2015 +0200 +++ b/src/HOL/NSA/NSA.thy Mon Apr 13 12:13:52 2015 +0200 @@ -1915,7 +1915,7 @@ lemma HFinite_FreeUltrafilterNat: "star_n X \ HFinite - ==> \u. {n. norm (X n) < u} \ FreeUltrafilterNat" + ==> \u. eventually (\n. norm (X n) < u) FreeUltrafilterNat" apply (auto simp add: HFinite_def SReal_def) apply (rule_tac x=r in exI) apply (simp add: hnorm_def star_of_def starfun_star_n) @@ -1923,7 +1923,7 @@ done lemma FreeUltrafilterNat_HFinite: - "\u. {n. norm (X n) < u} \ FreeUltrafilterNat + "\u. eventually (\n. norm (X n) < u) FreeUltrafilterNat ==> star_n X \ HFinite" apply (auto simp add: HFinite_def mem_Rep_star_iff) apply (rule_tac x="star_of u" in bexI) @@ -1933,7 +1933,7 @@ done lemma HFinite_FreeUltrafilterNat_iff: - "(star_n X \ HFinite) = (\u. {n. norm (X n) < u} \ FreeUltrafilterNat)" + "(star_n X \ HFinite) = (\u. eventually (\n. norm (X n) < u) FreeUltrafilterNat)" by (blast intro!: HFinite_FreeUltrafilterNat FreeUltrafilterNat_HFinite) subsubsection {* @{term HInfinite} *} @@ -1957,20 +1957,19 @@ ultrafilter for Infinite numbers! -------------------------------------*) lemma FreeUltrafilterNat_const_Finite: - "{n. norm (X n) = u} \ FreeUltrafilterNat ==> star_n X \ HFinite" + "eventually (\n. norm (X n) = u) FreeUltrafilterNat ==> star_n X \ HFinite" apply (rule FreeUltrafilterNat_HFinite) apply (rule_tac x = "u + 1" in exI) -apply (erule ultra, simp) +apply (auto elim: eventually_elim1) done lemma HInfinite_FreeUltrafilterNat: - "star_n X \ HInfinite ==> \u. {n. u < norm (X n)} \ FreeUltrafilterNat" + "star_n X \ HInfinite ==> \u. eventually (\n. u < norm (X n)) FreeUltrafilterNat" apply (drule HInfinite_HFinite_iff [THEN iffD1]) apply (simp add: HFinite_FreeUltrafilterNat_iff) apply (rule allI, drule_tac x="u + 1" in spec) -apply (drule FreeUltrafilterNat.not_memD) -apply (simp add: Collect_neg_eq [symmetric] linorder_not_less) -apply (erule ultra, simp) +apply (simp add: FreeUltrafilterNat.eventually_not_iff[symmetric]) +apply (auto elim: eventually_elim1) done lemma lemma_Int_HI: @@ -1981,17 +1980,20 @@ by (auto intro: order_less_asym) lemma FreeUltrafilterNat_HInfinite: - "\u. {n. u < norm (X n)} \ FreeUltrafilterNat ==> star_n X \ HInfinite" + "\u. eventually (\n. u < norm (X n)) FreeUltrafilterNat ==> star_n X \ HInfinite" apply (rule HInfinite_HFinite_iff [THEN iffD2]) apply (safe, drule HFinite_FreeUltrafilterNat, safe) apply (drule_tac x = u in spec) -apply (drule (1) FreeUltrafilterNat.Int) -apply (simp add: Collect_conj_eq [symmetric]) -apply (subgoal_tac "\n. \ (norm (X n) < u \ u < norm (X n))", auto) -done +proof - + fix u assume "\\<^sub>Fn in \. norm (X n) < u" "\\<^sub>Fn in \. u < norm (X n)" + then have "\\<^sub>F x in \. False" + by eventually_elim auto + then show False + by (simp add: eventually_False FreeUltrafilterNat.proper) +qed lemma HInfinite_FreeUltrafilterNat_iff: - "(star_n X \ HInfinite) = (\u. {n. u < norm (X n)} \ FreeUltrafilterNat)" + "(star_n X \ HInfinite) = (\u. eventually (\n. u < norm (X n)) FreeUltrafilterNat)" by (blast intro!: HInfinite_FreeUltrafilterNat FreeUltrafilterNat_HInfinite) subsubsection {* @{term Infinitesimal} *} @@ -2000,21 +2002,21 @@ by (unfold SReal_def, auto) lemma Infinitesimal_FreeUltrafilterNat: - "star_n X \ Infinitesimal ==> \u>0. {n. norm (X n) < u} \ \" + "star_n X \ Infinitesimal ==> \u>0. eventually (\n. norm (X n) < u) \" apply (simp add: Infinitesimal_def ball_SReal_eq) apply (simp add: hnorm_def starfun_star_n star_of_def) apply (simp add: star_less_def starP2_star_n) done lemma FreeUltrafilterNat_Infinitesimal: - "\u>0. {n. norm (X n) < u} \ \ ==> star_n X \ Infinitesimal" + "\u>0. eventually (\n. norm (X n) < u) \ ==> star_n X \ Infinitesimal" apply (simp add: Infinitesimal_def ball_SReal_eq) apply (simp add: hnorm_def starfun_star_n star_of_def) apply (simp add: star_less_def starP2_star_n) done lemma Infinitesimal_FreeUltrafilterNat_iff: - "(star_n X \ Infinitesimal) = (\u>0. {n. norm (X n) < u} \ \)" + "(star_n X \ Infinitesimal) = (\u>0. eventually (\n. norm (X n) < u) \)" by (blast intro!: Infinitesimal_FreeUltrafilterNat FreeUltrafilterNat_Infinitesimal) (*------------------------------------------------------------------------ @@ -2087,14 +2089,13 @@ done lemma rabs_real_of_nat_le_real_FreeUltrafilterNat: - "{n. abs(real n) \ u} \ FreeUltrafilterNat" + "\ eventually (\n. abs(real n) \ u) FreeUltrafilterNat" by (blast intro!: FreeUltrafilterNat.finite finite_rabs_real_of_nat_le_real) -lemma FreeUltrafilterNat_nat_gt_real: "{n. u < real n} \ FreeUltrafilterNat" -apply (rule ccontr, drule FreeUltrafilterNat.not_memD) -apply (subgoal_tac "- {n::nat. u < real n} = {n. real n \ u}") -prefer 2 apply force -apply (simp add: finite_real_of_nat_le_real [THEN FreeUltrafilterNat.finite]) +lemma FreeUltrafilterNat_nat_gt_real: "eventually (\n. u < real n) FreeUltrafilterNat" +apply (rule FreeUltrafilterNat.finite') +apply (subgoal_tac "{n::nat. \ u < real n} = {n. real n \ u}") +apply (auto simp add: finite_real_of_nat_le_real) done (*-------------------------------------------------------------- @@ -2108,10 +2109,8 @@ text{*@{term omega} is a member of @{term HInfinite}*} -lemma FreeUltrafilterNat_omega: "{n. u < real n} \ FreeUltrafilterNat" -apply (cut_tac u = u in rabs_real_of_nat_le_real_FreeUltrafilterNat) -apply (auto dest: FreeUltrafilterNat.not_memD simp add: Compl_real_le_eq) -done +lemma FreeUltrafilterNat_omega: "eventually (\n. u < real n) FreeUltrafilterNat" + by (fact FreeUltrafilterNat_nat_gt_real) theorem HInfinite_omega [simp]: "omega \ HInfinite" apply (simp add: omega_def) @@ -2165,7 +2164,7 @@ by (auto simp add: lemma_real_le_Un_eq2 lemma_finite_epsilon_set finite_inverse_real_of_posnat_gt_real) lemma inverse_real_of_posnat_ge_real_FreeUltrafilterNat: - "0 < u ==> {n. u \ inverse(real(Suc n))} \ FreeUltrafilterNat" + "0 < u ==> \ eventually (\n. u \ inverse(real(Suc n))) FreeUltrafilterNat" by (blast intro!: FreeUltrafilterNat.finite finite_inverse_real_of_posnat_ge_real) (*-------------------------------------------------------------- @@ -2179,9 +2178,9 @@ lemma FreeUltrafilterNat_inverse_real_of_posnat: - "0 < u ==> - {n. inverse(real(Suc n)) < u} \ FreeUltrafilterNat" -by (metis Compl_le_inverse_eq FreeUltrafilterNat.ultra inverse_real_of_posnat_ge_real_FreeUltrafilterNat) + "0 < u ==> eventually (\n. inverse(real(Suc n)) < u) FreeUltrafilterNat" +by (drule inverse_real_of_posnat_ge_real_FreeUltrafilterNat) + (simp add: FreeUltrafilterNat.eventually_not_iff not_le[symmetric]) text{* Example of an hypersequence (i.e. an extended standard sequence) whose term with an hypernatural suffix is an infinitesimal i.e. @@ -2208,8 +2207,8 @@ "\n. norm(X n - x) < inverse(real(Suc n)) ==> star_n X - star_of x \ Infinitesimal" unfolding star_n_diff star_of_def Infinitesimal_FreeUltrafilterNat_iff star_n_inverse -by (auto dest: FreeUltrafilterNat_inverse_real_of_posnat FreeUltrafilterNat.Int - intro: order_less_trans FreeUltrafilterNat.subset) +by (auto dest!: FreeUltrafilterNat_inverse_real_of_posnat + intro: order_less_trans elim!: eventually_elim1) lemma real_seq_to_hypreal_approx: "\n. norm(X n - x) < inverse(real(Suc n)) @@ -2225,7 +2224,7 @@ "\n. norm(X n - Y n) < inverse(real(Suc n)) ==> star_n X - star_n Y \ Infinitesimal" unfolding Infinitesimal_FreeUltrafilterNat_iff star_n_diff -by (auto dest: FreeUltrafilterNat_inverse_real_of_posnat - intro: order_less_trans FreeUltrafilterNat.subset) +by (auto dest!: FreeUltrafilterNat_inverse_real_of_posnat + intro: order_less_trans elim!: eventually_elim1) end diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/NSA/Star.thy --- a/src/HOL/NSA/Star.thy Mon Apr 13 10:36:06 2015 +0200 +++ b/src/HOL/NSA/Star.thy Mon Apr 13 12:13:52 2015 +0200 @@ -22,8 +22,8 @@ definition (* nonstandard extension of function *) is_starext :: "['a star => 'a star, 'a => 'a] => bool" where - "is_starext F f = (\x y. \X \ Rep_star(x). \Y \ Rep_star(y). - ((y = (F x)) = ({n. Y n = f(X n)} : FreeUltrafilterNat)))" + "is_starext F f = + (\x y. \X \ Rep_star(x). \Y \ Rep_star(y). ((y = (F x)) = (eventually (\n. Y n = f(X n)) \)))" definition (* internal functions *) @@ -71,7 +71,7 @@ lemma STAR_real_seq_to_hypreal: "\n. (X n) \ M ==> star_n X \ *s* M" apply (unfold starset_def star_of_def) -apply (simp add: Iset_star_n) +apply (simp add: Iset_star_n FreeUltrafilterNat.proper) done lemma STAR_singleton: "*s* {x} = {star_of x}" @@ -304,9 +304,7 @@ In this theory since @{text hypreal_hrabs} proved here. Maybe move both theorems??*} lemma Infinitesimal_FreeUltrafilterNat_iff2: - "(star_n X \ Infinitesimal) = - (\m. {n. norm(X n) < inverse(real(Suc m))} - \ FreeUltrafilterNat)" + "(star_n X \ Infinitesimal) = (\m. eventually (\n. norm(X n) < inverse(real(Suc m))) \)" by (simp add: Infinitesimal_hypreal_of_nat_iff star_of_def hnorm_def star_of_nat_def starfun_star_n star_n_inverse star_n_less real_of_nat_def) @@ -318,11 +316,11 @@ HNatInfinite_FreeUltrafilterNat_iff Infinitesimal_FreeUltrafilterNat_iff2) apply (drule_tac x="Suc m" in spec) -apply (erule ultra, simp) +apply (auto elim!: eventually_elim1) done lemma approx_FreeUltrafilterNat_iff: "star_n X @= star_n Y = - (\r>0. {n. norm (X n - Y n) < r} : FreeUltrafilterNat)" + (\r>0. eventually (\n. norm (X n - Y n) < r) \)" apply (subst approx_minus_iff) apply (rule mem_infmal_iff [THEN subst]) apply (simp add: star_n_diff) @@ -330,8 +328,7 @@ done lemma approx_FreeUltrafilterNat_iff2: "star_n X @= star_n Y = - (\m. {n. norm (X n - Y n) < - inverse(real(Suc m))} : FreeUltrafilterNat)" + (\m. eventually (\n. norm (X n - Y n) < inverse(real(Suc m))) \)" apply (subst approx_minus_iff) apply (rule mem_infmal_iff [THEN subst]) apply (simp add: star_n_diff) @@ -342,7 +339,7 @@ apply (rule inj_onI) apply (rule ext, rule ccontr) apply (drule_tac x = "star_n (%n. xa)" in fun_cong) -apply (auto simp add: starfun star_n_eq_iff) +apply (auto simp add: starfun star_n_eq_iff FreeUltrafilterNat.proper) done end diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/NSA/StarDef.thy --- a/src/HOL/NSA/StarDef.thy Mon Apr 13 10:36:06 2015 +0200 +++ b/src/HOL/NSA/StarDef.thy Mon Apr 13 12:13:52 2015 +0200 @@ -5,13 +5,13 @@ section {* Construction of Star Types Using Ultrafilters *} theory StarDef -imports Filter +imports Free_Ultrafilter begin subsection {* A Free Ultrafilter over the Naturals *} definition - FreeUltrafilterNat :: "nat set set" ("\") where + FreeUltrafilterNat :: "nat filter" ("\") where "\ = (SOME U. freeultrafilter U)" lemma freeultrafilter_FreeUltrafilterNat: "freeultrafilter \" @@ -24,19 +24,11 @@ interpretation FreeUltrafilterNat: freeultrafilter FreeUltrafilterNat by (rule freeultrafilter_FreeUltrafilterNat) -text {* This rule takes the place of the old ultra tactic *} - -lemma ultra: - "\{n. P n} \ \; {n. P n \ Q n} \ \\ \ {n. Q n} \ \" -by (simp add: Collect_imp_eq - FreeUltrafilterNat.Un_iff FreeUltrafilterNat.Compl_iff) - - subsection {* Definition of @{text star} type constructor *} definition starrel :: "((nat \ 'a) \ (nat \ 'a)) set" where - "starrel = {(X,Y). {n. X n = Y n} \ \}" + "starrel = {(X,Y). eventually (\n. X n = Y n) \}" definition "star = (UNIV :: (nat \ 'a) set) // starrel" @@ -59,14 +51,14 @@ text {* Proving that @{term starrel} is an equivalence relation *} -lemma starrel_iff [iff]: "((X,Y) \ starrel) = ({n. X n = Y n} \ \)" +lemma starrel_iff [iff]: "((X,Y) \ starrel) = (eventually (\n. X n = Y n) \)" by (simp add: starrel_def) lemma equiv_starrel: "equiv UNIV starrel" proof (rule equivI) show "refl starrel" by (simp add: refl_on_def) show "sym starrel" by (simp add: sym_def eq_commute) - show "trans starrel" by (auto intro: transI elim!: ultra) + show "trans starrel" by (intro transI) (auto elim: eventually_elim2) qed lemmas equiv_starrel_iff = @@ -75,7 +67,7 @@ lemma starrel_in_star: "starrel``{x} \ star" by (simp add: star_def quotientI) -lemma star_n_eq_iff: "(star_n X = star_n Y) = ({n. X n = Y n} \ \)" +lemma star_n_eq_iff: "(star_n X = star_n Y) = (eventually (\n. X n = Y n) \)" by (simp add: star_n_def Abs_star_inject starrel_in_star equiv_starrel_iff) @@ -83,8 +75,8 @@ text {* This introduction rule starts each transfer proof. *} lemma transfer_start: - "P \ {n. Q} \ \ \ Trueprop P \ Trueprop Q" -by (subgoal_tac "P \ Q", simp, simp add: atomize_eq) + "P \ eventually (\n. Q) \ \ Trueprop P \ Trueprop Q" + by (simp add: FreeUltrafilterNat.proper) text {*Initialize transfer tactic.*} ML_file "transfer.ML" @@ -98,66 +90,66 @@ text {* Transfer introduction rules. *} lemma transfer_ex [transfer_intro]: - "\\X. p (star_n X) \ {n. P n (X n)} \ \\ - \ \x::'a star. p x \ {n. \x. P n x} \ \" -by (simp only: ex_star_eq FreeUltrafilterNat.Collect_ex) + "\\X. p (star_n X) \ eventually (\n. P n (X n)) \\ + \ \x::'a star. p x \ eventually (\n. \x. P n x) \" +by (simp only: ex_star_eq eventually_ex) lemma transfer_all [transfer_intro]: - "\\X. p (star_n X) \ {n. P n (X n)} \ \\ - \ \x::'a star. p x \ {n. \x. P n x} \ \" -by (simp only: all_star_eq FreeUltrafilterNat.Collect_all) + "\\X. p (star_n X) \ eventually (\n. P n (X n)) \\ + \ \x::'a star. p x \ eventually (\n. \x. P n x) \" +by (simp only: all_star_eq FreeUltrafilterNat.eventually_all_iff) lemma transfer_not [transfer_intro]: - "\p \ {n. P n} \ \\ \ \ p \ {n. \ P n} \ \" -by (simp only: FreeUltrafilterNat.Collect_not) + "\p \ eventually P \\ \ \ p \ eventually (\n. \ P n) \" +by (simp only: FreeUltrafilterNat.eventually_not_iff) lemma transfer_conj [transfer_intro]: - "\p \ {n. P n} \ \; q \ {n. Q n} \ \\ - \ p \ q \ {n. P n \ Q n} \ \" -by (simp only: FreeUltrafilterNat.Collect_conj) + "\p \ eventually P \; q \ eventually Q \\ + \ p \ q \ eventually (\n. P n \ Q n) \" +by (simp only: eventually_conj_iff) lemma transfer_disj [transfer_intro]: - "\p \ {n. P n} \ \; q \ {n. Q n} \ \\ - \ p \ q \ {n. P n \ Q n} \ \" -by (simp only: FreeUltrafilterNat.Collect_disj) + "\p \ eventually P \; q \ eventually Q \\ + \ p \ q \ eventually (\n. P n \ Q n) \" +by (simp only: FreeUltrafilterNat.eventually_disj_iff) lemma transfer_imp [transfer_intro]: - "\p \ {n. P n} \ \; q \ {n. Q n} \ \\ - \ p \ q \ {n. P n \ Q n} \ \" -by (simp only: imp_conv_disj transfer_disj transfer_not) + "\p \ eventually P \; q \ eventually Q \\ + \ p \ q \ eventually (\n. P n \ Q n) \" +by (simp only: FreeUltrafilterNat.eventually_imp_iff) lemma transfer_iff [transfer_intro]: - "\p \ {n. P n} \ \; q \ {n. Q n} \ \\ - \ p = q \ {n. P n = Q n} \ \" -by (simp only: iff_conv_conj_imp transfer_conj transfer_imp) + "\p \ eventually P \; q \ eventually Q \\ + \ p = q \ eventually (\n. P n = Q n) \" +by (simp only: FreeUltrafilterNat.eventually_iff_iff) lemma transfer_if_bool [transfer_intro]: - "\p \ {n. P n} \ \; x \ {n. X n} \ \; y \ {n. Y n} \ \\ - \ (if p then x else y) \ {n. if P n then X n else Y n} \ \" + "\p \ eventually P \; x \ eventually X \; y \ eventually Y \\ + \ (if p then x else y) \ eventually (\n. if P n then X n else Y n) \" by (simp only: if_bool_eq_conj transfer_conj transfer_imp transfer_not) lemma transfer_eq [transfer_intro]: - "\x \ star_n X; y \ star_n Y\ \ x = y \ {n. X n = Y n} \ \" + "\x \ star_n X; y \ star_n Y\ \ x = y \ eventually (\n. X n = Y n) \" by (simp only: star_n_eq_iff) lemma transfer_if [transfer_intro]: - "\p \ {n. P n} \ \; x \ star_n X; y \ star_n Y\ + "\p \ eventually (\n. P n) \; x \ star_n X; y \ star_n Y\ \ (if p then x else y) \ star_n (\n. if P n then X n else Y n)" apply (rule eq_reflection) -apply (auto simp add: star_n_eq_iff transfer_not elim!: ultra) +apply (auto simp add: star_n_eq_iff transfer_not elim!: eventually_elim1) done lemma transfer_fun_eq [transfer_intro]: "\\X. f (star_n X) = g (star_n X) - \ {n. F n (X n) = G n (X n)} \ \\ - \ f = g \ {n. F n = G n} \ \" + \ eventually (\n. F n (X n) = G n (X n)) \\ + \ f = g \ eventually (\n. F n = G n) \" by (simp only: fun_eq_iff transfer_all) lemma transfer_star_n [transfer_intro]: "star_n X \ star_n (\n. X n)" by (rule reflexive) -lemma transfer_bool [transfer_intro]: "p \ {n. p} \ \" -by (simp add: atomize_eq) +lemma transfer_bool [transfer_intro]: "p \ eventually (\n. p) \" +by (simp add: FreeUltrafilterNat.proper) subsection {* Standard elements *} @@ -191,7 +183,7 @@ lemma Ifun_congruent2: "congruent2 starrel starrel (\F X. starrel``{\n. F n (X n)})" -by (auto simp add: congruent2_def equiv_starrel_iff elim!: ultra) +by (auto simp add: congruent2_def equiv_starrel_iff elim!: eventually_rev_mp) lemma Ifun_star_n: "star_n F \ star_n X = star_n (\n. F n (X n))" by (simp add: Ifun_def star_n_def Abs_star_inverse starrel_in_star @@ -298,7 +290,7 @@ definition unstar :: "bool star \ bool" where "unstar b \ b = star_of True" -lemma unstar_star_n: "unstar (star_n P) = ({n. P n} \ \)" +lemma unstar_star_n: "unstar (star_n P) = (eventually P \)" by (simp add: unstar_def star_of_def star_n_eq_iff) lemma unstar_star_of [simp]: "unstar (star_of p) = p" @@ -308,7 +300,7 @@ setup {* Transfer_Principle.add_const @{const_name unstar} *} lemma transfer_unstar [transfer_intro]: - "p \ star_n P \ unstar p \ {n. P n} \ \" + "p \ star_n P \ unstar p \ eventually P \" by (simp only: unstar_star_n) definition @@ -322,11 +314,11 @@ declare starP_def [transfer_unfold] declare starP2_def [transfer_unfold] -lemma starP_star_n: "( *p* P) (star_n X) = ({n. P (X n)} \ \)" +lemma starP_star_n: "( *p* P) (star_n X) = (eventually (\n. P (X n)) \)" by (simp only: starP_def star_of_def Ifun_star_n unstar_star_n) lemma starP2_star_n: - "( *p2* P) (star_n X) (star_n Y) = ({n. P (X n) (Y n)} \ \)" + "( *p2* P) (star_n X) (star_n Y) = (eventually (\n. P (X n) (Y n)) \)" by (simp only: starP2_def star_of_def Ifun_star_n unstar_star_n) lemma starP_star_of [simp]: "( *p* P) (star_of x) = P x" @@ -343,7 +335,7 @@ "Iset A = {x. ( *p2* op \) x A}" lemma Iset_star_n: - "(star_n X \ Iset (star_n A)) = ({n. X n \ A n} \ \)" + "(star_n X \ Iset (star_n A)) = (eventually (\n. X n \ A n) \)" by (simp add: Iset_def starP2_star_n) text {* Transfer tactic should remove occurrences of @{term Iset} *} @@ -351,27 +343,27 @@ lemma transfer_mem [transfer_intro]: "\x \ star_n X; a \ Iset (star_n A)\ - \ x \ a \ {n. X n \ A n} \ \" + \ x \ a \ eventually (\n. X n \ A n) \" by (simp only: Iset_star_n) lemma transfer_Collect [transfer_intro]: - "\\X. p (star_n X) \ {n. P n (X n)} \ \\ + "\\X. p (star_n X) \ eventually (\n. P n (X n)) \\ \ Collect p \ Iset (star_n (\n. Collect (P n)))" by (simp add: atomize_eq set_eq_iff all_star_eq Iset_star_n) lemma transfer_set_eq [transfer_intro]: "\a \ Iset (star_n A); b \ Iset (star_n B)\ - \ a = b \ {n. A n = B n} \ \" + \ a = b \ eventually (\n. A n = B n) \" by (simp only: set_eq_iff transfer_all transfer_iff transfer_mem) lemma transfer_ball [transfer_intro]: - "\a \ Iset (star_n A); \X. p (star_n X) \ {n. P n (X n)} \ \\ - \ \x\a. p x \ {n. \x\A n. P n x} \ \" + "\a \ Iset (star_n A); \X. p (star_n X) \ eventually (\n. P n (X n)) \\ + \ \x\a. p x \ eventually (\n. \x\A n. P n x) \" by (simp only: Ball_def transfer_all transfer_imp transfer_mem) lemma transfer_bex [transfer_intro]: - "\a \ Iset (star_n A); \X. p (star_n X) \ {n. P n (X n)} \ \\ - \ \x\a. p x \ {n. \x\A n. P n x} \ \" + "\a \ Iset (star_n A); \X. p (star_n X) \ eventually (\n. P n (X n)) \\ + \ \x\a. p x \ eventually (\n. \x\A n. P n x) \" by (simp only: Bex_def transfer_ex transfer_conj transfer_mem) lemma transfer_Iset [transfer_intro]: diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/Topological_Spaces.thy --- a/src/HOL/Topological_Spaces.thy Mon Apr 13 10:36:06 2015 +0200 +++ b/src/HOL/Topological_Spaces.thy Mon Apr 13 12:13:52 2015 +0200 @@ -322,557 +322,6 @@ by auto qed -subsection {* Filters *} - -text {* - This definition also allows non-proper filters. -*} - -locale is_filter = - fixes F :: "('a \ bool) \ bool" - assumes True: "F (\x. True)" - assumes conj: "F (\x. P x) \ F (\x. Q x) \ F (\x. P x \ Q x)" - assumes mono: "\x. P x \ Q x \ F (\x. P x) \ F (\x. Q x)" - -typedef 'a filter = "{F :: ('a \ bool) \ bool. is_filter F}" -proof - show "(\x. True) \ ?filter" by (auto intro: is_filter.intro) -qed - -lemma is_filter_Rep_filter: "is_filter (Rep_filter F)" - using Rep_filter [of F] by simp - -lemma Abs_filter_inverse': - assumes "is_filter F" shows "Rep_filter (Abs_filter F) = F" - using assms by (simp add: Abs_filter_inverse) - - -subsubsection {* Eventually *} - -definition eventually :: "('a \ bool) \ 'a filter \ bool" - where "eventually P F \ Rep_filter F P" - -lemma eventually_Abs_filter: - assumes "is_filter F" shows "eventually P (Abs_filter F) = F P" - unfolding eventually_def using assms by (simp add: Abs_filter_inverse) - -lemma filter_eq_iff: - shows "F = F' \ (\P. eventually P F = eventually P F')" - unfolding Rep_filter_inject [symmetric] fun_eq_iff eventually_def .. - -lemma eventually_True [simp]: "eventually (\x. True) F" - unfolding eventually_def - by (rule is_filter.True [OF is_filter_Rep_filter]) - -lemma always_eventually: "\x. P x \ eventually P F" -proof - - assume "\x. P x" hence "P = (\x. True)" by (simp add: ext) - thus "eventually P F" by simp -qed - -lemma eventually_mono: - "(\x. P x \ Q x) \ eventually P F \ eventually Q F" - unfolding eventually_def - by (rule is_filter.mono [OF is_filter_Rep_filter]) - -lemma eventually_conj: - assumes P: "eventually (\x. P x) F" - assumes Q: "eventually (\x. Q x) F" - shows "eventually (\x. P x \ Q x) F" - using assms unfolding eventually_def - by (rule is_filter.conj [OF is_filter_Rep_filter]) - -lemma eventually_Ball_finite: - assumes "finite A" and "\y\A. eventually (\x. P x y) net" - shows "eventually (\x. \y\A. P x y) net" -using assms by (induct set: finite, simp, simp add: eventually_conj) - -lemma eventually_all_finite: - fixes P :: "'a \ 'b::finite \ bool" - assumes "\y. eventually (\x. P x y) net" - shows "eventually (\x. \y. P x y) net" -using eventually_Ball_finite [of UNIV P] assms by simp - -lemma eventually_mp: - assumes "eventually (\x. P x \ Q x) F" - assumes "eventually (\x. P x) F" - shows "eventually (\x. Q x) F" -proof (rule eventually_mono) - show "\x. (P x \ Q x) \ P x \ Q x" by simp - show "eventually (\x. (P x \ Q x) \ P x) F" - using assms by (rule eventually_conj) -qed - -lemma eventually_rev_mp: - assumes "eventually (\x. P x) F" - assumes "eventually (\x. P x \ Q x) F" - shows "eventually (\x. Q x) F" -using assms(2) assms(1) by (rule eventually_mp) - -lemma eventually_conj_iff: - "eventually (\x. P x \ Q x) F \ eventually P F \ eventually Q F" - by (auto intro: eventually_conj elim: eventually_rev_mp) - -lemma eventually_elim1: - assumes "eventually (\i. P i) F" - assumes "\i. P i \ Q i" - shows "eventually (\i. Q i) F" - using assms by (auto elim!: eventually_rev_mp) - -lemma eventually_elim2: - assumes "eventually (\i. P i) F" - assumes "eventually (\i. Q i) F" - assumes "\i. P i \ Q i \ R i" - shows "eventually (\i. R i) F" - using assms by (auto elim!: eventually_rev_mp) - -lemma not_eventually_impI: "eventually P F \ \ eventually Q F \ \ eventually (\x. P x \ Q x) F" - by (auto intro: eventually_mp) - -lemma not_eventuallyD: "\ eventually P F \ \x. \ P x" - by (metis always_eventually) - -lemma eventually_subst: - assumes "eventually (\n. P n = Q n) F" - shows "eventually P F = eventually Q F" (is "?L = ?R") -proof - - from assms have "eventually (\x. P x \ Q x) F" - and "eventually (\x. Q x \ P x) F" - by (auto elim: eventually_elim1) - then show ?thesis by (auto elim: eventually_elim2) -qed - -ML {* - fun eventually_elim_tac ctxt facts = SUBGOAL_CASES (fn (goal, i) => - let - val mp_thms = facts RL @{thms eventually_rev_mp} - val raw_elim_thm = - (@{thm allI} RS @{thm always_eventually}) - |> fold (fn thm1 => fn thm2 => thm2 RS thm1) mp_thms - |> fold (fn _ => fn thm => @{thm impI} RS thm) facts - val cases_prop = Thm.prop_of (raw_elim_thm RS Goal.init (Thm.cterm_of ctxt goal)) - val cases = Rule_Cases.make_common ctxt cases_prop [(("elim", []), [])] - in - CASES cases (rtac raw_elim_thm i) - end) -*} - -method_setup eventually_elim = {* - Scan.succeed (fn ctxt => METHOD_CASES (HEADGOAL o eventually_elim_tac ctxt)) -*} "elimination of eventually quantifiers" - - -subsubsection {* Finer-than relation *} - -text {* @{term "F \ F'"} means that filter @{term F} is finer than -filter @{term F'}. *} - -instantiation filter :: (type) complete_lattice -begin - -definition le_filter_def: - "F \ F' \ (\P. eventually P F' \ eventually P F)" - -definition - "(F :: 'a filter) < F' \ F \ F' \ \ F' \ F" - -definition - "top = Abs_filter (\P. \x. P x)" - -definition - "bot = Abs_filter (\P. True)" - -definition - "sup F F' = Abs_filter (\P. eventually P F \ eventually P F')" - -definition - "inf F F' = Abs_filter - (\P. \Q R. eventually Q F \ eventually R F' \ (\x. Q x \ R x \ P x))" - -definition - "Sup S = Abs_filter (\P. \F\S. eventually P F)" - -definition - "Inf S = Sup {F::'a filter. \F'\S. F \ F'}" - -lemma eventually_top [simp]: "eventually P top \ (\x. P x)" - unfolding top_filter_def - by (rule eventually_Abs_filter, rule is_filter.intro, auto) - -lemma eventually_bot [simp]: "eventually P bot" - unfolding bot_filter_def - by (subst eventually_Abs_filter, rule is_filter.intro, auto) - -lemma eventually_sup: - "eventually P (sup F F') \ eventually P F \ eventually P F'" - unfolding sup_filter_def - by (rule eventually_Abs_filter, rule is_filter.intro) - (auto elim!: eventually_rev_mp) - -lemma eventually_inf: - "eventually P (inf F F') \ - (\Q R. eventually Q F \ eventually R F' \ (\x. Q x \ R x \ P x))" - unfolding inf_filter_def - apply (rule eventually_Abs_filter, rule is_filter.intro) - apply (fast intro: eventually_True) - apply clarify - apply (intro exI conjI) - apply (erule (1) eventually_conj) - apply (erule (1) eventually_conj) - apply simp - apply auto - done - -lemma eventually_Sup: - "eventually P (Sup S) \ (\F\S. eventually P F)" - unfolding Sup_filter_def - apply (rule eventually_Abs_filter, rule is_filter.intro) - apply (auto intro: eventually_conj elim!: eventually_rev_mp) - done - -instance proof - fix F F' F'' :: "'a filter" and S :: "'a filter set" - { show "F < F' \ F \ F' \ \ F' \ F" - by (rule less_filter_def) } - { show "F \ F" - unfolding le_filter_def by simp } - { assume "F \ F'" and "F' \ F''" thus "F \ F''" - unfolding le_filter_def by simp } - { assume "F \ F'" and "F' \ F" thus "F = F'" - unfolding le_filter_def filter_eq_iff by fast } - { show "inf F F' \ F" and "inf F F' \ F'" - unfolding le_filter_def eventually_inf by (auto intro: eventually_True) } - { assume "F \ F'" and "F \ F''" thus "F \ inf F' F''" - unfolding le_filter_def eventually_inf - by (auto elim!: eventually_mono intro: eventually_conj) } - { show "F \ sup F F'" and "F' \ sup F F'" - unfolding le_filter_def eventually_sup by simp_all } - { assume "F \ F''" and "F' \ F''" thus "sup F F' \ F''" - unfolding le_filter_def eventually_sup by simp } - { assume "F'' \ S" thus "Inf S \ F''" - unfolding le_filter_def Inf_filter_def eventually_Sup Ball_def by simp } - { assume "\F'. F' \ S \ F \ F'" thus "F \ Inf S" - unfolding le_filter_def Inf_filter_def eventually_Sup Ball_def by simp } - { assume "F \ S" thus "F \ Sup S" - unfolding le_filter_def eventually_Sup by simp } - { assume "\F. F \ S \ F \ F'" thus "Sup S \ F'" - unfolding le_filter_def eventually_Sup by simp } - { show "Inf {} = (top::'a filter)" - by (auto simp: top_filter_def Inf_filter_def Sup_filter_def) - (metis (full_types) top_filter_def always_eventually eventually_top) } - { show "Sup {} = (bot::'a filter)" - by (auto simp: bot_filter_def Sup_filter_def) } -qed - -end - -lemma filter_leD: - "F \ F' \ eventually P F' \ eventually P F" - unfolding le_filter_def by simp - -lemma filter_leI: - "(\P. eventually P F' \ eventually P F) \ F \ F'" - unfolding le_filter_def by simp - -lemma eventually_False: - "eventually (\x. False) F \ F = bot" - unfolding filter_eq_iff by (auto elim: eventually_rev_mp) - -abbreviation (input) trivial_limit :: "'a filter \ bool" - where "trivial_limit F \ F = bot" - -lemma trivial_limit_def: "trivial_limit F \ eventually (\x. False) F" - by (rule eventually_False [symmetric]) - -lemma eventually_const: "\ trivial_limit net \ eventually (\x. P) net \ P" - by (cases P) (simp_all add: eventually_False) - -lemma eventually_Inf: "eventually P (Inf B) \ (\X\B. finite X \ eventually P (Inf X))" -proof - - let ?F = "\P. \X\B. finite X \ eventually P (Inf X)" - - { fix P have "eventually P (Abs_filter ?F) \ ?F P" - proof (rule eventually_Abs_filter is_filter.intro)+ - show "?F (\x. True)" - by (rule exI[of _ "{}"]) (simp add: le_fun_def) - next - fix P Q - assume "?F P" then guess X .. - moreover - assume "?F Q" then guess Y .. - ultimately show "?F (\x. P x \ Q x)" - by (intro exI[of _ "X \ Y"]) - (auto simp: Inf_union_distrib eventually_inf) - next - fix P Q - assume "?F P" then guess X .. - moreover assume "\x. P x \ Q x" - ultimately show "?F Q" - by (intro exI[of _ X]) (auto elim: eventually_elim1) - qed } - note eventually_F = this - - have "Inf B = Abs_filter ?F" - proof (intro antisym Inf_greatest) - show "Inf B \ Abs_filter ?F" - by (auto simp: le_filter_def eventually_F dest: Inf_superset_mono) - next - fix F assume "F \ B" then show "Abs_filter ?F \ F" - by (auto simp add: le_filter_def eventually_F intro!: exI[of _ "{F}"]) - qed - then show ?thesis - by (simp add: eventually_F) -qed - -lemma eventually_INF: "eventually P (INF b:B. F b) \ (\X\B. finite X \ eventually P (INF b:X. F b))" - unfolding INF_def[of B] eventually_Inf[of P "F`B"] - by (metis Inf_image_eq finite_imageI image_mono finite_subset_image) - -lemma Inf_filter_not_bot: - fixes B :: "'a filter set" - shows "(\X. X \ B \ finite X \ Inf X \ bot) \ Inf B \ bot" - unfolding trivial_limit_def eventually_Inf[of _ B] - bot_bool_def [symmetric] bot_fun_def [symmetric] bot_unique by simp - -lemma INF_filter_not_bot: - fixes F :: "'i \ 'a filter" - shows "(\X. X \ B \ finite X \ (INF b:X. F b) \ bot) \ (INF b:B. F b) \ bot" - unfolding trivial_limit_def eventually_INF[of _ B] - bot_bool_def [symmetric] bot_fun_def [symmetric] bot_unique by simp - -lemma eventually_Inf_base: - assumes "B \ {}" and base: "\F G. F \ B \ G \ B \ \x\B. x \ inf F G" - shows "eventually P (Inf B) \ (\b\B. eventually P b)" -proof (subst eventually_Inf, safe) - fix X assume "finite X" "X \ B" - then have "\b\B. \x\X. b \ x" - proof induct - case empty then show ?case - using `B \ {}` by auto - next - case (insert x X) - then obtain b where "b \ B" "\x. x \ X \ b \ x" - by auto - with `insert x X \ B` base[of b x] show ?case - by (auto intro: order_trans) - qed - then obtain b where "b \ B" "b \ Inf X" - by (auto simp: le_Inf_iff) - then show "eventually P (Inf X) \ Bex B (eventually P)" - by (intro bexI[of _ b]) (auto simp: le_filter_def) -qed (auto intro!: exI[of _ "{x}" for x]) - -lemma eventually_INF_base: - "B \ {} \ (\a b. a \ B \ b \ B \ \x\B. F x \ inf (F a) (F b)) \ - eventually P (INF b:B. F b) \ (\b\B. eventually P (F b))" - unfolding INF_def by (subst eventually_Inf_base) auto - - -subsubsection {* Map function for filters *} - -definition filtermap :: "('a \ 'b) \ 'a filter \ 'b filter" - where "filtermap f F = Abs_filter (\P. eventually (\x. P (f x)) F)" - -lemma eventually_filtermap: - "eventually P (filtermap f F) = eventually (\x. P (f x)) F" - unfolding filtermap_def - apply (rule eventually_Abs_filter) - apply (rule is_filter.intro) - apply (auto elim!: eventually_rev_mp) - done - -lemma filtermap_ident: "filtermap (\x. x) F = F" - by (simp add: filter_eq_iff eventually_filtermap) - -lemma filtermap_filtermap: - "filtermap f (filtermap g F) = filtermap (\x. f (g x)) F" - by (simp add: filter_eq_iff eventually_filtermap) - -lemma filtermap_mono: "F \ F' \ filtermap f F \ filtermap f F'" - unfolding le_filter_def eventually_filtermap by simp - -lemma filtermap_bot [simp]: "filtermap f bot = bot" - by (simp add: filter_eq_iff eventually_filtermap) - -lemma filtermap_sup: "filtermap f (sup F1 F2) = sup (filtermap f F1) (filtermap f F2)" - by (auto simp: filter_eq_iff eventually_filtermap eventually_sup) - -lemma filtermap_inf: "filtermap f (inf F1 F2) \ inf (filtermap f F1) (filtermap f F2)" - by (auto simp: le_filter_def eventually_filtermap eventually_inf) - -lemma filtermap_INF: "filtermap f (INF b:B. F b) \ (INF b:B. filtermap f (F b))" -proof - - { fix X :: "'c set" assume "finite X" - then have "filtermap f (INFIMUM X F) \ (INF b:X. filtermap f (F b))" - proof induct - case (insert x X) - have "filtermap f (INF a:insert x X. F a) \ inf (filtermap f (F x)) (filtermap f (INF a:X. F a))" - by (rule order_trans[OF _ filtermap_inf]) simp - also have "\ \ inf (filtermap f (F x)) (INF a:X. filtermap f (F a))" - by (intro inf_mono insert order_refl) - finally show ?case - by simp - qed simp } - then show ?thesis - unfolding le_filter_def eventually_filtermap - by (subst (1 2) eventually_INF) auto -qed -subsubsection {* Standard filters *} - -definition principal :: "'a set \ 'a filter" where - "principal S = Abs_filter (\P. \x\S. P x)" - -lemma eventually_principal: "eventually P (principal S) \ (\x\S. P x)" - unfolding principal_def - by (rule eventually_Abs_filter, rule is_filter.intro) auto - -lemma eventually_inf_principal: "eventually P (inf F (principal s)) \ eventually (\x. x \ s \ P x) F" - unfolding eventually_inf eventually_principal by (auto elim: eventually_elim1) - -lemma principal_UNIV[simp]: "principal UNIV = top" - by (auto simp: filter_eq_iff eventually_principal) - -lemma principal_empty[simp]: "principal {} = bot" - by (auto simp: filter_eq_iff eventually_principal) - -lemma principal_eq_bot_iff: "principal X = bot \ X = {}" - by (auto simp add: filter_eq_iff eventually_principal) - -lemma principal_le_iff[iff]: "principal A \ principal B \ A \ B" - by (auto simp: le_filter_def eventually_principal) - -lemma le_principal: "F \ principal A \ eventually (\x. x \ A) F" - unfolding le_filter_def eventually_principal - apply safe - apply (erule_tac x="\x. x \ A" in allE) - apply (auto elim: eventually_elim1) - done - -lemma principal_inject[iff]: "principal A = principal B \ A = B" - unfolding eq_iff by simp - -lemma sup_principal[simp]: "sup (principal A) (principal B) = principal (A \ B)" - unfolding filter_eq_iff eventually_sup eventually_principal by auto - -lemma inf_principal[simp]: "inf (principal A) (principal B) = principal (A \ B)" - unfolding filter_eq_iff eventually_inf eventually_principal - by (auto intro: exI[of _ "\x. x \ A"] exI[of _ "\x. x \ B"]) - -lemma SUP_principal[simp]: "(SUP i : I. principal (A i)) = principal (\i\I. A i)" - unfolding filter_eq_iff eventually_Sup SUP_def by (auto simp: eventually_principal) - -lemma INF_principal_finite: "finite X \ (INF x:X. principal (f x)) = principal (\x\X. f x)" - by (induct X rule: finite_induct) auto - -lemma filtermap_principal[simp]: "filtermap f (principal A) = principal (f ` A)" - unfolding filter_eq_iff eventually_filtermap eventually_principal by simp - -subsubsection {* Order filters *} - -definition at_top :: "('a::order) filter" - where "at_top = (INF k. principal {k ..})" - -lemma at_top_sub: "at_top = (INF k:{c::'a::linorder..}. principal {k ..})" - by (auto intro!: INF_eq max.cobounded1 max.cobounded2 simp: at_top_def) - -lemma eventually_at_top_linorder: "eventually P at_top \ (\N::'a::linorder. \n\N. P n)" - unfolding at_top_def - by (subst eventually_INF_base) (auto simp: eventually_principal intro: max.cobounded1 max.cobounded2) - -lemma eventually_ge_at_top: - "eventually (\x. (c::_::linorder) \ x) at_top" - unfolding eventually_at_top_linorder by auto - -lemma eventually_at_top_dense: "eventually P at_top \ (\N::'a::{no_top, linorder}. \n>N. P n)" -proof - - have "eventually P (INF k. principal {k <..}) \ (\N::'a. \n>N. P n)" - by (subst eventually_INF_base) (auto simp: eventually_principal intro: max.cobounded1 max.cobounded2) - also have "(INF k. principal {k::'a <..}) = at_top" - unfolding at_top_def - by (intro INF_eq) (auto intro: less_imp_le simp: Ici_subset_Ioi_iff gt_ex) - finally show ?thesis . -qed - -lemma eventually_gt_at_top: - "eventually (\x. (c::_::unbounded_dense_linorder) < x) at_top" - unfolding eventually_at_top_dense by auto - -definition at_bot :: "('a::order) filter" - where "at_bot = (INF k. principal {.. k})" - -lemma at_bot_sub: "at_bot = (INF k:{.. c::'a::linorder}. principal {.. k})" - by (auto intro!: INF_eq min.cobounded1 min.cobounded2 simp: at_bot_def) - -lemma eventually_at_bot_linorder: - fixes P :: "'a::linorder \ bool" shows "eventually P at_bot \ (\N. \n\N. P n)" - unfolding at_bot_def - by (subst eventually_INF_base) (auto simp: eventually_principal intro: min.cobounded1 min.cobounded2) - -lemma eventually_le_at_bot: - "eventually (\x. x \ (c::_::linorder)) at_bot" - unfolding eventually_at_bot_linorder by auto - -lemma eventually_at_bot_dense: "eventually P at_bot \ (\N::'a::{no_bot, linorder}. \n (\N::'a. \nx. x < (c::_::unbounded_dense_linorder)) at_bot" - unfolding eventually_at_bot_dense by auto - -lemma trivial_limit_at_bot_linorder: "\ trivial_limit (at_bot ::('a::linorder) filter)" - unfolding trivial_limit_def - by (metis eventually_at_bot_linorder order_refl) - -lemma trivial_limit_at_top_linorder: "\ trivial_limit (at_top ::('a::linorder) filter)" - unfolding trivial_limit_def - by (metis eventually_at_top_linorder order_refl) - -subsection {* Sequentially *} - -abbreviation sequentially :: "nat filter" - where "sequentially \ at_top" - -lemma eventually_sequentially: - "eventually P sequentially \ (\N. \n\N. P n)" - by (rule eventually_at_top_linorder) - -lemma sequentially_bot [simp, intro]: "sequentially \ bot" - unfolding filter_eq_iff eventually_sequentially by auto - -lemmas trivial_limit_sequentially = sequentially_bot - -lemma eventually_False_sequentially [simp]: - "\ eventually (\n. False) sequentially" - by (simp add: eventually_False) - -lemma le_sequentially: - "F \ sequentially \ (\N. eventually (\n. N \ n) F)" - by (simp add: at_top_def le_INF_iff le_principal) - -lemma eventually_sequentiallyI: - assumes "\x. c \ x \ P x" - shows "eventually P sequentially" -using assms by (auto simp: eventually_sequentially) - -lemma eventually_sequentially_seg: - "eventually (\n. P (n + k)) sequentially \ eventually P sequentially" - unfolding eventually_sequentially - apply safe - apply (rule_tac x="N + k" in exI) - apply rule - apply (erule_tac x="n - k" in allE) - apply auto [] - apply (rule_tac x=N in exI) - apply auto [] - done - subsubsection {* Topological filters *} definition (in topological_space) nhds :: "'a \ 'a filter" @@ -1005,104 +454,6 @@ "eventually P (at (x::'a::linorder_topology)) \ eventually P (at_left x) \ eventually P (at_right x)" by (subst at_eq_sup_left_right) (simp add: eventually_sup) -subsection {* Limits *} - -definition filterlim :: "('a \ 'b) \ 'b filter \ 'a filter \ bool" where - "filterlim f F2 F1 \ filtermap f F1 \ F2" - -syntax - "_LIM" :: "pttrns \ 'a \ 'b \ 'a \ bool" ("(3LIM (_)/ (_)./ (_) :> (_))" [1000, 10, 0, 10] 10) - -translations - "LIM x F1. f :> F2" == "CONST filterlim (%x. f) F2 F1" - -lemma filterlim_iff: - "(LIM x F1. f x :> F2) \ (\P. eventually P F2 \ eventually (\x. P (f x)) F1)" - unfolding filterlim_def le_filter_def eventually_filtermap .. - -lemma filterlim_compose: - "filterlim g F3 F2 \ filterlim f F2 F1 \ filterlim (\x. g (f x)) F3 F1" - unfolding filterlim_def filtermap_filtermap[symmetric] by (metis filtermap_mono order_trans) - -lemma filterlim_mono: - "filterlim f F2 F1 \ F2 \ F2' \ F1' \ F1 \ filterlim f F2' F1'" - unfolding filterlim_def by (metis filtermap_mono order_trans) - -lemma filterlim_ident: "LIM x F. x :> F" - by (simp add: filterlim_def filtermap_ident) - -lemma filterlim_cong: - "F1 = F1' \ F2 = F2' \ eventually (\x. f x = g x) F2 \ filterlim f F1 F2 = filterlim g F1' F2'" - by (auto simp: filterlim_def le_filter_def eventually_filtermap elim: eventually_elim2) - -lemma filterlim_mono_eventually: - assumes "filterlim f F G" and ord: "F \ F'" "G' \ G" - assumes eq: "eventually (\x. f x = f' x) G'" - shows "filterlim f' F' G'" - apply (rule filterlim_cong[OF refl refl eq, THEN iffD1]) - apply (rule filterlim_mono[OF _ ord]) - apply fact - done - -lemma filtermap_mono_strong: "inj f \ filtermap f F \ filtermap f G \ F \ G" - apply (auto intro!: filtermap_mono) [] - apply (auto simp: le_filter_def eventually_filtermap) - apply (erule_tac x="\x. P (inv f x)" in allE) - apply auto - done - -lemma filtermap_eq_strong: "inj f \ filtermap f F = filtermap f G \ F = G" - by (simp add: filtermap_mono_strong eq_iff) - -lemma filterlim_principal: - "(LIM x F. f x :> principal S) \ (eventually (\x. f x \ S) F)" - unfolding filterlim_def eventually_filtermap le_principal .. - -lemma filterlim_inf: - "(LIM x F1. f x :> inf F2 F3) \ ((LIM x F1. f x :> F2) \ (LIM x F1. f x :> F3))" - unfolding filterlim_def by simp - -lemma filterlim_INF: - "(LIM x F. f x :> (INF b:B. G b)) \ (\b\B. LIM x F. f x :> G b)" - unfolding filterlim_def le_INF_iff .. - -lemma filterlim_INF_INF: - "(\m. m \ J \ \i\I. filtermap f (F i) \ G m) \ LIM x (INF i:I. F i). f x :> (INF j:J. G j)" - unfolding filterlim_def by (rule order_trans[OF filtermap_INF INF_mono]) - -lemma filterlim_base: - "(\m x. m \ J \ i m \ I) \ (\m x. m \ J \ x \ F (i m) \ f x \ G m) \ - LIM x (INF i:I. principal (F i)). f x :> (INF j:J. principal (G j))" - by (force intro!: filterlim_INF_INF simp: image_subset_iff) - -lemma filterlim_base_iff: - assumes "I \ {}" and chain: "\i j. i \ I \ j \ I \ F i \ F j \ F j \ F i" - shows "(LIM x (INF i:I. principal (F i)). f x :> INF j:J. principal (G j)) \ - (\j\J. \i\I. \x\F i. f x \ G j)" - unfolding filterlim_INF filterlim_principal -proof (subst eventually_INF_base) - fix i j assume "i \ I" "j \ I" - with chain[OF this] show "\x\I. principal (F x) \ inf (principal (F i)) (principal (F j))" - by auto -qed (auto simp: eventually_principal `I \ {}`) - -lemma filterlim_filtermap: "filterlim f F1 (filtermap g F2) = filterlim (\x. f (g x)) F1 F2" - unfolding filterlim_def filtermap_filtermap .. - -lemma filterlim_sup: - "filterlim f F F1 \ filterlim f F F2 \ filterlim f F (sup F1 F2)" - unfolding filterlim_def filtermap_sup by auto - -lemma eventually_sequentially_Suc: "eventually (\i. P (Suc i)) sequentially \ eventually P sequentially" - unfolding eventually_sequentially by (metis Suc_le_D Suc_le_mono le_Suc_eq) - -lemma filterlim_sequentially_Suc: - "(LIM x sequentially. f (Suc x) :> F) \ (LIM x sequentially. f x :> F)" - unfolding filterlim_iff by (subst eventually_sequentially_Suc) simp - -lemma filterlim_Suc: "filterlim Suc sequentially sequentially" - by (simp add: filterlim_iff eventually_sequentially) (metis le_Suc_eq) - subsubsection {* Tendsto *} abbreviation (in topological_space) @@ -1296,92 +647,6 @@ lemma Lim_ident_at: "\ trivial_limit (at x within s) \ Lim (at x within s) (\x. x) = x" by (rule tendsto_Lim[OF _ tendsto_ident_at]) auto -subsection {* Limits to @{const at_top} and @{const at_bot} *} - -lemma filterlim_at_top: - fixes f :: "'a \ ('b::linorder)" - shows "(LIM x F. f x :> at_top) \ (\Z. eventually (\x. Z \ f x) F)" - by (auto simp: filterlim_iff eventually_at_top_linorder elim!: eventually_elim1) - -lemma filterlim_at_top_mono: - "LIM x F. f x :> at_top \ eventually (\x. f x \ (g x::'a::linorder)) F \ - LIM x F. g x :> at_top" - by (auto simp: filterlim_at_top elim: eventually_elim2 intro: order_trans) - -lemma filterlim_at_top_dense: - fixes f :: "'a \ ('b::unbounded_dense_linorder)" - shows "(LIM x F. f x :> at_top) \ (\Z. eventually (\x. Z < f x) F)" - by (metis eventually_elim1[of _ F] eventually_gt_at_top order_less_imp_le - filterlim_at_top[of f F] filterlim_iff[of f at_top F]) - -lemma filterlim_at_top_ge: - fixes f :: "'a \ ('b::linorder)" and c :: "'b" - shows "(LIM x F. f x :> at_top) \ (\Z\c. eventually (\x. Z \ f x) F)" - unfolding at_top_sub[of c] filterlim_INF by (auto simp add: filterlim_principal) - -lemma filterlim_at_top_at_top: - fixes f :: "'a::linorder \ 'b::linorder" - assumes mono: "\x y. Q x \ Q y \ x \ y \ f x \ f y" - assumes bij: "\x. P x \ f (g x) = x" "\x. P x \ Q (g x)" - assumes Q: "eventually Q at_top" - assumes P: "eventually P at_top" - shows "filterlim f at_top at_top" -proof - - from P obtain x where x: "\y. x \ y \ P y" - unfolding eventually_at_top_linorder by auto - show ?thesis - proof (intro filterlim_at_top_ge[THEN iffD2] allI impI) - fix z assume "x \ z" - with x have "P z" by auto - have "eventually (\x. g z \ x) at_top" - by (rule eventually_ge_at_top) - with Q show "eventually (\x. z \ f x) at_top" - by eventually_elim (metis mono bij `P z`) - qed -qed - -lemma filterlim_at_top_gt: - fixes f :: "'a \ ('b::unbounded_dense_linorder)" and c :: "'b" - shows "(LIM x F. f x :> at_top) \ (\Z>c. eventually (\x. Z \ f x) F)" - by (metis filterlim_at_top order_less_le_trans gt_ex filterlim_at_top_ge) - -lemma filterlim_at_bot: - fixes f :: "'a \ ('b::linorder)" - shows "(LIM x F. f x :> at_bot) \ (\Z. eventually (\x. f x \ Z) F)" - by (auto simp: filterlim_iff eventually_at_bot_linorder elim!: eventually_elim1) - -lemma filterlim_at_bot_dense: - fixes f :: "'a \ ('b::{dense_linorder, no_bot})" - shows "(LIM x F. f x :> at_bot) \ (\Z. eventually (\x. f x < Z) F)" -proof (auto simp add: filterlim_at_bot[of f F]) - fix Z :: 'b - from lt_ex [of Z] obtain Z' where 1: "Z' < Z" .. - assume "\Z. eventually (\x. f x \ Z) F" - hence "eventually (\x. f x \ Z') F" by auto - thus "eventually (\x. f x < Z) F" - apply (rule eventually_mono[rotated]) - using 1 by auto - next - fix Z :: 'b - show "\Z. eventually (\x. f x < Z) F \ eventually (\x. f x \ Z) F" - by (drule spec [of _ Z], erule eventually_mono[rotated], auto simp add: less_imp_le) -qed - -lemma filterlim_at_bot_le: - fixes f :: "'a \ ('b::linorder)" and c :: "'b" - shows "(LIM x F. f x :> at_bot) \ (\Z\c. eventually (\x. Z \ f x) F)" - unfolding filterlim_at_bot -proof safe - fix Z assume *: "\Z\c. eventually (\x. Z \ f x) F" - with *[THEN spec, of "min Z c"] show "eventually (\x. Z \ f x) F" - by (auto elim!: eventually_elim1) -qed simp - -lemma filterlim_at_bot_lt: - fixes f :: "'a \ ('b::unbounded_dense_linorder)" and c :: "'b" - shows "(LIM x F. f x :> at_bot) \ (\Zx. Z \ f x) F)" - by (metis filterlim_at_bot filterlim_at_bot_le lt_ex order_le_less_trans) - lemma filterlim_at_bot_at_right: fixes f :: "'a::linorder_topology \ 'b::linorder" assumes mono: "\x y. Q x \ Q y \ x \ y \ f x \ f y" @@ -2371,7 +1636,7 @@ by (rule compactE) from `D \ ?C` have "\x\D. eventually (\y. y \ x) (nhds y)" by auto with `finite D` have "eventually (\y. y \ \D) (nhds y)" - by (simp add: eventually_Ball_finite) + by (simp add: eventually_ball_finite) with `s \ \D` have "eventually (\y. y \ s) (nhds y)" by (auto elim!: eventually_mono [rotated]) thus "\t. open t \ y \ t \ t \ - s" @@ -2936,220 +2201,4 @@ qed qed (intro cSUP_least `antimono f`[THEN antimonoD] cInf_lower S) -subsection {* Setup @{typ "'a filter"} for lifting and transfer *} - -context begin interpretation lifting_syntax . - -definition rel_filter :: "('a \ 'b \ bool) \ 'a filter \ 'b filter \ bool" -where "rel_filter R F G = ((R ===> op =) ===> op =) (Rep_filter F) (Rep_filter G)" - -lemma rel_filter_eventually: - "rel_filter R F G \ - ((R ===> op =) ===> op =) (\P. eventually P F) (\P. eventually P G)" -by(simp add: rel_filter_def eventually_def) - -lemma filtermap_id [simp, id_simps]: "filtermap id = id" -by(simp add: fun_eq_iff id_def filtermap_ident) - -lemma filtermap_id' [simp]: "filtermap (\x. x) = (\F. F)" -using filtermap_id unfolding id_def . - -lemma Quotient_filter [quot_map]: - assumes Q: "Quotient R Abs Rep T" - shows "Quotient (rel_filter R) (filtermap Abs) (filtermap Rep) (rel_filter T)" -unfolding Quotient_alt_def -proof(intro conjI strip) - from Q have *: "\x y. T x y \ Abs x = y" - unfolding Quotient_alt_def by blast - - fix F G - assume "rel_filter T F G" - thus "filtermap Abs F = G" unfolding filter_eq_iff - by(auto simp add: eventually_filtermap rel_filter_eventually * rel_funI del: iffI elim!: rel_funD) -next - from Q have *: "\x. T (Rep x) x" unfolding Quotient_alt_def by blast - - fix F - show "rel_filter T (filtermap Rep F) F" - by(auto elim: rel_funD intro: * intro!: ext arg_cong[where f="\P. eventually P F"] rel_funI - del: iffI simp add: eventually_filtermap rel_filter_eventually) -qed(auto simp add: map_fun_def o_def eventually_filtermap filter_eq_iff fun_eq_iff rel_filter_eventually - fun_quotient[OF fun_quotient[OF Q identity_quotient] identity_quotient, unfolded Quotient_alt_def]) - -lemma eventually_parametric [transfer_rule]: - "((A ===> op =) ===> rel_filter A ===> op =) eventually eventually" -by(simp add: rel_fun_def rel_filter_eventually) - -lemma rel_filter_eq [relator_eq]: "rel_filter op = = op =" -by(auto simp add: rel_filter_eventually rel_fun_eq fun_eq_iff filter_eq_iff) - -lemma rel_filter_mono [relator_mono]: - "A \ B \ rel_filter A \ rel_filter B" -unfolding rel_filter_eventually[abs_def] -by(rule le_funI)+(intro fun_mono fun_mono[THEN le_funD, THEN le_funD] order.refl) - -lemma rel_filter_conversep [simp]: "rel_filter A\\ = (rel_filter A)\\" -by(auto simp add: rel_filter_eventually fun_eq_iff rel_fun_def) - -lemma is_filter_parametric_aux: - assumes "is_filter F" - assumes [transfer_rule]: "bi_total A" "bi_unique A" - and [transfer_rule]: "((A ===> op =) ===> op =) F G" - shows "is_filter G" -proof - - interpret is_filter F by fact - show ?thesis - proof - have "F (\_. True) = G (\x. True)" by transfer_prover - thus "G (\x. True)" by(simp add: True) - next - fix P' Q' - assume "G P'" "G Q'" - moreover - from bi_total_fun[OF `bi_unique A` bi_total_eq, unfolded bi_total_def] - obtain P Q where [transfer_rule]: "(A ===> op =) P P'" "(A ===> op =) Q Q'" by blast - have "F P = G P'" "F Q = G Q'" by transfer_prover+ - ultimately have "F (\x. P x \ Q x)" by(simp add: conj) - moreover have "F (\x. P x \ Q x) = G (\x. P' x \ Q' x)" by transfer_prover - ultimately show "G (\x. P' x \ Q' x)" by simp - next - fix P' Q' - assume "\x. P' x \ Q' x" "G P'" - moreover - from bi_total_fun[OF `bi_unique A` bi_total_eq, unfolded bi_total_def] - obtain P Q where [transfer_rule]: "(A ===> op =) P P'" "(A ===> op =) Q Q'" by blast - have "F P = G P'" by transfer_prover - moreover have "(\x. P x \ Q x) \ (\x. P' x \ Q' x)" by transfer_prover - ultimately have "F Q" by(simp add: mono) - moreover have "F Q = G Q'" by transfer_prover - ultimately show "G Q'" by simp - qed -qed - -lemma is_filter_parametric [transfer_rule]: - "\ bi_total A; bi_unique A \ - \ (((A ===> op =) ===> op =) ===> op =) is_filter is_filter" -apply(rule rel_funI) -apply(rule iffI) - apply(erule (3) is_filter_parametric_aux) -apply(erule is_filter_parametric_aux[where A="conversep A"]) -apply(auto simp add: rel_fun_def) -done - -lemma left_total_rel_filter [transfer_rule]: - assumes [transfer_rule]: "bi_total A" "bi_unique A" - shows "left_total (rel_filter A)" -proof(rule left_totalI) - fix F :: "'a filter" - from bi_total_fun[OF bi_unique_fun[OF `bi_total A` bi_unique_eq] bi_total_eq] - obtain G where [transfer_rule]: "((A ===> op =) ===> op =) (\P. eventually P F) G" - unfolding bi_total_def by blast - moreover have "is_filter (\P. eventually P F) \ is_filter G" by transfer_prover - hence "is_filter G" by(simp add: eventually_def is_filter_Rep_filter) - ultimately have "rel_filter A F (Abs_filter G)" - by(simp add: rel_filter_eventually eventually_Abs_filter) - thus "\G. rel_filter A F G" .. -qed - -lemma right_total_rel_filter [transfer_rule]: - "\ bi_total A; bi_unique A \ \ right_total (rel_filter A)" -using left_total_rel_filter[of "A\\"] by simp - -lemma bi_total_rel_filter [transfer_rule]: - assumes "bi_total A" "bi_unique A" - shows "bi_total (rel_filter A)" -unfolding bi_total_alt_def using assms -by(simp add: left_total_rel_filter right_total_rel_filter) - -lemma left_unique_rel_filter [transfer_rule]: - assumes "left_unique A" - shows "left_unique (rel_filter A)" -proof(rule left_uniqueI) - fix F F' G - assume [transfer_rule]: "rel_filter A F G" "rel_filter A F' G" - show "F = F'" - unfolding filter_eq_iff - proof - fix P :: "'a \ bool" - obtain P' where [transfer_rule]: "(A ===> op =) P P'" - using left_total_fun[OF assms left_total_eq] unfolding left_total_def by blast - have "eventually P F = eventually P' G" - and "eventually P F' = eventually P' G" by transfer_prover+ - thus "eventually P F = eventually P F'" by simp - qed -qed - -lemma right_unique_rel_filter [transfer_rule]: - "right_unique A \ right_unique (rel_filter A)" -using left_unique_rel_filter[of "A\\"] by simp - -lemma bi_unique_rel_filter [transfer_rule]: - "bi_unique A \ bi_unique (rel_filter A)" -by(simp add: bi_unique_alt_def left_unique_rel_filter right_unique_rel_filter) - -lemma top_filter_parametric [transfer_rule]: - "bi_total A \ (rel_filter A) top top" -by(simp add: rel_filter_eventually All_transfer) - -lemma bot_filter_parametric [transfer_rule]: "(rel_filter A) bot bot" -by(simp add: rel_filter_eventually rel_fun_def) - -lemma sup_filter_parametric [transfer_rule]: - "(rel_filter A ===> rel_filter A ===> rel_filter A) sup sup" -by(fastforce simp add: rel_filter_eventually[abs_def] eventually_sup dest: rel_funD) - -lemma Sup_filter_parametric [transfer_rule]: - "(rel_set (rel_filter A) ===> rel_filter A) Sup Sup" -proof(rule rel_funI) - fix S T - assume [transfer_rule]: "rel_set (rel_filter A) S T" - show "rel_filter A (Sup S) (Sup T)" - by(simp add: rel_filter_eventually eventually_Sup) transfer_prover -qed - -lemma principal_parametric [transfer_rule]: - "(rel_set A ===> rel_filter A) principal principal" -proof(rule rel_funI) - fix S S' - assume [transfer_rule]: "rel_set A S S'" - show "rel_filter A (principal S) (principal S')" - by(simp add: rel_filter_eventually eventually_principal) transfer_prover -qed - -context - fixes A :: "'a \ 'b \ bool" - assumes [transfer_rule]: "bi_unique A" -begin - -lemma le_filter_parametric [transfer_rule]: - "(rel_filter A ===> rel_filter A ===> op =) op \ op \" -unfolding le_filter_def[abs_def] by transfer_prover - -lemma less_filter_parametric [transfer_rule]: - "(rel_filter A ===> rel_filter A ===> op =) op < op <" -unfolding less_filter_def[abs_def] by transfer_prover - -context - assumes [transfer_rule]: "bi_total A" -begin - -lemma Inf_filter_parametric [transfer_rule]: - "(rel_set (rel_filter A) ===> rel_filter A) Inf Inf" -unfolding Inf_filter_def[abs_def] by transfer_prover - -lemma inf_filter_parametric [transfer_rule]: - "(rel_filter A ===> rel_filter A ===> rel_filter A) inf inf" -proof(intro rel_funI)+ - fix F F' G G' - assume [transfer_rule]: "rel_filter A F F'" "rel_filter A G G'" - have "rel_filter A (Inf {F, G}) (Inf {F', G'})" by transfer_prover - thus "rel_filter A (inf F G) (inf F' G')" by simp -qed - end - -end - -end - -end diff -r 177d740a0d48 -r 7c4a2e87e4d0 src/HOL/Transcendental.thy --- a/src/HOL/Transcendental.thy Mon Apr 13 10:36:06 2015 +0200 +++ b/src/HOL/Transcendental.thy Mon Apr 13 12:13:52 2015 +0200 @@ -2321,7 +2321,7 @@ shows "\(f ---> a) F; (g ---> b) F; a \ 0\ \ ((\x. f x powr g x) ---> a powr b) F" apply (simp add: powr_def) apply (simp add: tendsto_def) - apply (simp add: Topological_Spaces.eventually_conj_iff ) + apply (simp add: eventually_conj_iff ) apply safe apply (case_tac "0 \ S") apply (auto simp: ) @@ -5201,7 +5201,7 @@ then have wnz: "\w. w \ 0 \ (\i\n. c (Suc i) * w^i) = 0" using Suc by auto then have "(\h. \i\n. c (Suc i) * h^i) -- 0 --> 0" - by (simp cong: LIM_cong) --{*the case @{term"w=0"} by continuity}*} + by (simp cong: LIM_cong) --{*the case @{term"w=0"} by continuity*} then have "(\i\n. c (Suc i) * 0^i) = 0" using isCont_polynom [of 0 "\i. c (Suc i)" n] LIM_unique by (force simp add: Limits.isCont_iff)