# HG changeset patch # User hoelzl # Date 1362494588 -3600 # Node ID 5e6296afe08d6804a3dbdb929f0174569f61795e # Parent 04ebef4ee84474ee39f3e87494f0c9359fc8cc6d move Liminf / Limsup lemmas on complete_lattices to its own file diff -r 04ebef4ee844 -r 5e6296afe08d src/HOL/Library/Extended_Real.thy --- a/src/HOL/Library/Extended_Real.thy Tue Mar 05 15:27:08 2013 +0100 +++ b/src/HOL/Library/Extended_Real.thy Tue Mar 05 15:43:08 2013 +0100 @@ -8,7 +8,7 @@ header {* Extended real number line *} theory Extended_Real -imports Complex_Main Extended_Nat +imports Complex_Main Extended_Nat Liminf_Limsup begin text {* @@ -18,26 +18,6 @@ *} -lemma SUPR_pair: - "(SUP i : A. SUP j : B. f i j) = (SUP p : A \ B. f (fst p) (snd p))" - by (rule antisym) (auto intro!: SUP_least SUP_upper2) - -lemma INFI_pair: - "(INF i : A. INF j : B. f i j) = (INF p : A \ B. f (fst p) (snd p))" - by (rule antisym) (auto intro!: INF_greatest INF_lower2) - -lemma le_Sup_iff_less: - fixes x :: "'a :: {complete_linorder, inner_dense_linorder}" - shows "x \ (SUP i:A. f i) \ (\yi\A. y \ f i)" (is "?lhs = ?rhs") - unfolding le_SUP_iff - by (blast intro: less_imp_le less_trans less_le_trans dest: dense) - -lemma Inf_le_iff_less: - fixes x :: "'a :: {complete_linorder, inner_dense_linorder}" - shows "(INF i:A. f i) \ x \ (\y>x. \i\A. f i \ y)" - unfolding INF_le_iff - by (blast intro: less_imp_le less_trans le_less_trans dest: dense) - subsection {* Definition and basic properties *} datatype ereal = ereal real | PInfty | MInfty @@ -1718,6 +1698,31 @@ show thesis by auto qed +instance ereal :: perfect_space +proof (default, rule) + fix a :: ereal assume a: "open {a}" + show False + proof (cases a) + case MInf + then obtain y where "{.. {a}" using a open_MInfty2[of "{a}"] by auto + then have "ereal (y - 1) \ {a}" apply (subst subsetD[of "{..` by auto + next + case PInf + then obtain y where "{ereal y<..} \ {a}" using a open_PInfty2[of "{a}"] by auto + then have "ereal (y + 1) \ {a}" apply (subst subsetD[of "{ereal y<..}"]) by auto + then show False using `a = \` by auto + next + case (real r) + then have fin: "\a\ \ \" by simp + from ereal_open_cont_interval[OF a singletonI this] guess e . note e = this + then obtain b where b_def: "a b Liminf sequentially" - -abbreviation "limsup \ Limsup sequentially" - -lemma Liminf_eqI: - "(\P. eventually P F \ INFI (Collect P) f \ x) \ - (\y. (\P. eventually P F \ INFI (Collect P) f \ y) \ x \ y) \ Liminf F f = x" - unfolding Liminf_def by (auto intro!: SUP_eqI) - -lemma Limsup_eqI: - "(\P. eventually P F \ x \ SUPR (Collect P) f) \ - (\y. (\P. eventually P F \ y \ SUPR (Collect P) f) \ y \ x) \ Limsup F f = x" - unfolding Limsup_def by (auto intro!: INF_eqI) - -lemma liminf_SUPR_INFI: - fixes f :: "nat \ 'a :: complete_lattice" - shows "liminf f = (SUP n. INF m:{n..}. f m)" - unfolding Liminf_def eventually_sequentially - by (rule SUPR_eq) (auto simp: atLeast_def intro!: INF_mono) - -lemma limsup_INFI_SUPR: - fixes f :: "nat \ 'a :: complete_lattice" - shows "limsup f = (INF n. SUP m:{n..}. f m)" - unfolding Limsup_def eventually_sequentially - by (rule INFI_eq) (auto simp: atLeast_def intro!: SUP_mono) - -lemma Limsup_const: - assumes ntriv: "\ trivial_limit F" - shows "Limsup F (\x. c) = (c::'a::complete_lattice)" -proof - - have *: "\P. Ex P \ P \ (\x. False)" by auto - have "\P. eventually P F \ (SUP x : {x. P x}. c) = c" - using ntriv by (intro SUP_const) (auto simp: eventually_False *) - then show ?thesis - unfolding Limsup_def using eventually_True - by (subst INF_cong[where D="\x. c"]) - (auto intro!: INF_const simp del: eventually_True) -qed +lemma ereal_Limsup_uminus: + fixes f :: "'a => ereal" + shows "Limsup net (\x. - (f x)) = -(Liminf net f)" + unfolding Limsup_def Liminf_def ereal_SUPR_uminus ereal_INFI_uminus .. -lemma Liminf_const: - assumes ntriv: "\ trivial_limit F" - shows "Liminf F (\x. c) = (c::'a::complete_lattice)" -proof - - have *: "\P. Ex P \ P \ (\x. False)" by auto - have "\P. eventually P F \ (INF x : {x. P x}. c) = c" - using ntriv by (intro INF_const) (auto simp: eventually_False *) - then show ?thesis - unfolding Liminf_def using eventually_True - by (subst SUP_cong[where D="\x. c"]) - (auto intro!: SUP_const simp del: eventually_True) -qed - -lemma Liminf_mono: - fixes f g :: "'a => 'b :: complete_lattice" - assumes ev: "eventually (\x. f x \ g x) F" - shows "Liminf F f \ Liminf F g" - unfolding Liminf_def -proof (safe intro!: SUP_mono) - fix P assume "eventually P F" - with ev have "eventually (\x. f x \ g x \ P x) F" (is "eventually ?Q F") by (rule eventually_conj) - then show "\Q\{P. eventually P F}. INFI (Collect P) f \ INFI (Collect Q) g" - by (intro bexI[of _ ?Q]) (auto intro!: INF_mono) -qed - -lemma Liminf_eq: - fixes f g :: "'a \ 'b :: complete_lattice" - assumes "eventually (\x. f x = g x) F" - shows "Liminf F f = Liminf F g" - by (intro antisym Liminf_mono eventually_mono[OF _ assms]) auto - -lemma Limsup_mono: - fixes f g :: "'a \ 'b :: complete_lattice" - assumes ev: "eventually (\x. f x \ g x) F" - shows "Limsup F f \ Limsup F g" - unfolding Limsup_def -proof (safe intro!: INF_mono) - fix P assume "eventually P F" - with ev have "eventually (\x. f x \ g x \ P x) F" (is "eventually ?Q F") by (rule eventually_conj) - then show "\Q\{P. eventually P F}. SUPR (Collect Q) f \ SUPR (Collect P) g" - by (intro bexI[of _ ?Q]) (auto intro!: SUP_mono) -qed - -lemma Limsup_eq: - fixes f g :: "'a \ 'b :: complete_lattice" - assumes "eventually (\x. f x = g x) net" - shows "Limsup net f = Limsup net g" - by (intro antisym Limsup_mono eventually_mono[OF _ assms]) auto - -lemma Liminf_le_Limsup: - fixes f :: "'a \ 'b::complete_lattice" - assumes ntriv: "\ trivial_limit F" - shows "Liminf F f \ Limsup F f" - unfolding Limsup_def Liminf_def - apply (rule complete_lattice_class.SUP_least) - apply (rule complete_lattice_class.INF_greatest) -proof safe - fix P Q assume "eventually P F" "eventually Q F" - then have "eventually (\x. P x \ Q x) F" (is "eventually ?C F") by (rule eventually_conj) - then have not_False: "(\x. P x \ Q x) \ (\x. False)" - using ntriv by (auto simp add: eventually_False) - have "INFI (Collect P) f \ INFI (Collect ?C) f" - by (rule INF_mono) auto - also have "\ \ SUPR (Collect ?C) f" - using not_False by (intro INF_le_SUP) auto - also have "\ \ SUPR (Collect Q) f" - by (rule SUP_mono) auto - finally show "INFI (Collect P) f \ SUPR (Collect Q) f" . -qed +lemma liminf_bounded_iff: + fixes x :: "nat \ ereal" + shows "C \ liminf x \ (\BN. \n\N. B < x n)" (is "?lhs <-> ?rhs") + unfolding le_Liminf_iff eventually_sequentially .. lemma fixes X :: "nat \ ereal" @@ -2105,220 +2002,6 @@ and ereal_decseq_uminus[simp]: "decseq (\i. - X i) = incseq X" unfolding incseq_def decseq_def by auto -lemma Liminf_bounded: - fixes X Y :: "'a \ 'b::complete_lattice" - assumes ntriv: "\ trivial_limit F" - assumes le: "eventually (\n. C \ X n) F" - shows "C \ Liminf F X" - using Liminf_mono[OF le] Liminf_const[OF ntriv, of C] by simp - -lemma Limsup_bounded: - fixes X Y :: "'a \ 'b::complete_lattice" - assumes ntriv: "\ trivial_limit F" - assumes le: "eventually (\n. X n \ C) F" - shows "Limsup F X \ C" - using Limsup_mono[OF le] Limsup_const[OF ntriv, of C] by simp - -lemma le_Liminf_iff: - fixes X :: "_ \ _ :: complete_linorder" - shows "C \ Liminf F X \ (\yx. y < X x) F)" -proof - - { fix y P assume "eventually P F" "y < INFI (Collect P) X" - then have "eventually (\x. y < X x) F" - by (auto elim!: eventually_elim1 dest: less_INF_D) } - moreover - { fix y P assume "y < C" and y: "\yx. y < X x) F" - have "\P. eventually P F \ y < INFI (Collect P) X" - proof cases - assume "\z. y < z \ z < C" - then guess z .. - moreover then have "z \ INFI {x. z < X x} X" - by (auto intro!: INF_greatest) - ultimately show ?thesis - using y by (intro exI[of _ "\x. z < X x"]) auto - next - assume "\ (\z. y < z \ z < C)" - then have "C \ INFI {x. y < X x} X" - by (intro INF_greatest) auto - with `y < C` show ?thesis - using y by (intro exI[of _ "\x. y < X x"]) auto - qed } - ultimately show ?thesis - unfolding Liminf_def le_SUP_iff by auto -qed - -lemma lim_imp_Liminf: - fixes f :: "'a \ _ :: {complete_linorder, linorder_topology}" - assumes ntriv: "\ trivial_limit F" - assumes lim: "(f ---> f0) F" - shows "Liminf F f = f0" -proof (intro Liminf_eqI) - fix P assume P: "eventually P F" - then have "eventually (\x. INFI (Collect P) f \ f x) F" - by eventually_elim (auto intro!: INF_lower) - then show "INFI (Collect P) f \ f0" - by (rule tendsto_le[OF ntriv lim tendsto_const]) -next - fix y assume upper: "\P. eventually P F \ INFI (Collect P) f \ y" - show "f0 \ y" - proof cases - assume "\z. y < z \ z < f0" - then guess z .. - moreover have "z \ INFI {x. z < f x} f" - by (rule INF_greatest) simp - ultimately show ?thesis - using lim[THEN topological_tendstoD, THEN upper, of "{z <..}"] by auto - next - assume discrete: "\ (\z. y < z \ z < f0)" - show ?thesis - proof (rule classical) - assume "\ f0 \ y" - then have "eventually (\x. y < f x) F" - using lim[THEN topological_tendstoD, of "{y <..}"] by auto - then have "eventually (\x. f0 \ f x) F" - using discrete by (auto elim!: eventually_elim1) - then have "INFI {x. f0 \ f x} f \ y" - by (rule upper) - moreover have "f0 \ INFI {x. f0 \ f x} f" - by (intro INF_greatest) simp - ultimately show "f0 \ y" by simp - qed - qed -qed - -lemma lim_imp_Limsup: - fixes f :: "'a \ _ :: {complete_linorder, linorder_topology}" - assumes ntriv: "\ trivial_limit F" - assumes lim: "(f ---> f0) F" - shows "Limsup F f = f0" -proof (intro Limsup_eqI) - fix P assume P: "eventually P F" - then have "eventually (\x. f x \ SUPR (Collect P) f) F" - by eventually_elim (auto intro!: SUP_upper) - then show "f0 \ SUPR (Collect P) f" - by (rule tendsto_le[OF ntriv tendsto_const lim]) -next - fix y assume lower: "\P. eventually P F \ y \ SUPR (Collect P) f" - show "y \ f0" - proof cases - assume "\z. f0 < z \ z < y" - then guess z .. - moreover have "SUPR {x. f x < z} f \ z" - by (rule SUP_least) simp - ultimately show ?thesis - using lim[THEN topological_tendstoD, THEN lower, of "{..< z}"] by auto - next - assume discrete: "\ (\z. f0 < z \ z < y)" - show ?thesis - proof (rule classical) - assume "\ y \ f0" - then have "eventually (\x. f x < y) F" - using lim[THEN topological_tendstoD, of "{..< y}"] by auto - then have "eventually (\x. f x \ f0) F" - using discrete by (auto elim!: eventually_elim1 simp: not_less) - then have "y \ SUPR {x. f x \ f0} f" - by (rule lower) - moreover have "SUPR {x. f x \ f0} f \ f0" - by (intro SUP_least) simp - ultimately show "y \ f0" by simp - qed - qed -qed - -lemma Liminf_eq_Limsup: - fixes f0 :: "'a :: {complete_linorder, linorder_topology}" - assumes ntriv: "\ trivial_limit F" - and lim: "Liminf F f = f0" "Limsup F f = f0" - shows "(f ---> f0) F" -proof (rule order_tendstoI) - fix a assume "f0 < a" - with assms have "Limsup F f < a" by simp - then obtain P where "eventually P F" "SUPR (Collect P) f < a" - unfolding Limsup_def INF_less_iff by auto - then show "eventually (\x. f x < a) F" - by (auto elim!: eventually_elim1 dest: SUP_lessD) -next - fix a assume "a < f0" - with assms have "a < Liminf F f" by simp - then obtain P where "eventually P F" "a < INFI (Collect P) f" - unfolding Liminf_def less_SUP_iff by auto - then show "eventually (\x. a < f x) F" - by (auto elim!: eventually_elim1 dest: less_INF_D) -qed - -lemma tendsto_iff_Liminf_eq_Limsup: - fixes f0 :: "'a :: {complete_linorder, linorder_topology}" - shows "\ trivial_limit F \ (f ---> f0) F \ (Liminf F f = f0 \ Limsup F f = f0)" - by (metis Liminf_eq_Limsup lim_imp_Limsup lim_imp_Liminf) - -lemma liminf_bounded_iff: - fixes x :: "nat \ ereal" - shows "C \ liminf x \ (\BN. \n\N. B < x n)" (is "?lhs <-> ?rhs") - unfolding le_Liminf_iff eventually_sequentially .. - -lemma liminf_subseq_mono: - fixes X :: "nat \ 'a :: complete_linorder" - assumes "subseq r" - shows "liminf X \ liminf (X \ r) " -proof- - have "\n. (INF m:{n..}. X m) \ (INF m:{n..}. (X \ r) m)" - proof (safe intro!: INF_mono) - fix n m :: nat assume "n \ m" then show "\ma\{n..}. X ma \ (X \ r) m" - using seq_suble[OF `subseq r`, of m] by (intro bexI[of _ "r m"]) auto - qed - then show ?thesis by (auto intro!: SUP_mono simp: liminf_SUPR_INFI comp_def) -qed - -lemma limsup_subseq_mono: - fixes X :: "nat \ 'a :: complete_linorder" - assumes "subseq r" - shows "limsup (X \ r) \ limsup X" -proof- - have "\n. (SUP m:{n..}. (X \ r) m) \ (SUP m:{n..}. X m)" - proof (safe intro!: SUP_mono) - fix n m :: nat assume "n \ m" then show "\ma\{n..}. (X \ r) m \ X ma" - using seq_suble[OF `subseq r`, of m] by (intro bexI[of _ "r m"]) auto - qed - then show ?thesis by (auto intro!: INF_mono simp: limsup_INFI_SUPR comp_def) -qed - -definition (in order) mono_set: - "mono_set S \ (\x y. x \ y \ x \ S \ y \ S)" - -lemma (in order) mono_greaterThan [intro, simp]: "mono_set {B<..}" unfolding mono_set by auto -lemma (in order) mono_atLeast [intro, simp]: "mono_set {B..}" unfolding mono_set by auto -lemma (in order) mono_UNIV [intro, simp]: "mono_set UNIV" unfolding mono_set by auto -lemma (in order) mono_empty [intro, simp]: "mono_set {}" unfolding mono_set by auto - -lemma (in complete_linorder) mono_set_iff: - fixes S :: "'a set" - defines "a \ Inf S" - shows "mono_set S \ (S = {a <..} \ S = {a..})" (is "_ = ?c") -proof - assume "mono_set S" - then have mono: "\x y. x \ y \ x \ S \ y \ S" by (auto simp: mono_set) - show ?c - proof cases - assume "a \ S" - show ?c - using mono[OF _ `a \ S`] - by (auto intro: Inf_lower simp: a_def) - next - assume "a \ S" - have "S = {a <..}" - proof safe - fix x assume "x \ S" - then have "a \ x" unfolding a_def by (rule Inf_lower) - then show "a < x" using `x \ S` `a \ S` by (cases "a = x") auto - next - fix x assume "a < x" - then obtain y where "y < x" "y \ S" unfolding a_def Inf_less_iff .. - with mono[of y x] show "x \ S" by auto - qed - then show ?c .. - qed -qed auto - subsubsection {* Tests for code generator *} (* A small list of simple arithmetic expressions *) diff -r 04ebef4ee844 -r 5e6296afe08d src/HOL/Library/Liminf_Limsup.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Library/Liminf_Limsup.thy Tue Mar 05 15:43:08 2013 +0100 @@ -0,0 +1,320 @@ +(* Title: HOL/Library/Liminf_Limsup.thy + Author: Johannes Hölzl, TU München +*) + +header {* Liminf and Limsup on complete lattices *} + +theory Liminf_Limsup +imports "~~/src/HOL/Complex_Main" +begin + +lemma le_Sup_iff_less: + fixes x :: "'a :: {complete_linorder, inner_dense_linorder}" + shows "x \ (SUP i:A. f i) \ (\yi\A. y \ f i)" (is "?lhs = ?rhs") + unfolding le_SUP_iff + by (blast intro: less_imp_le less_trans less_le_trans dest: dense) + +lemma Inf_le_iff_less: + fixes x :: "'a :: {complete_linorder, inner_dense_linorder}" + shows "(INF i:A. f i) \ x \ (\y>x. \i\A. f i \ y)" + unfolding INF_le_iff + by (blast intro: less_imp_le less_trans le_less_trans dest: dense) + +lemma SUPR_pair: + "(SUP i : A. SUP j : B. f i j) = (SUP p : A \ B. f (fst p) (snd p))" + by (rule antisym) (auto intro!: SUP_least SUP_upper2) + +lemma INFI_pair: + "(INF i : A. INF j : B. f i j) = (INF p : A \ B. f (fst p) (snd p))" + by (rule antisym) (auto intro!: INF_greatest INF_lower2) + +subsubsection {* @{text Liminf} and @{text Limsup} *} + +definition + "Liminf F f = (SUP P:{P. eventually P F}. INF x:{x. P x}. f x)" + +definition + "Limsup F f = (INF P:{P. eventually P F}. SUP x:{x. P x}. f x)" + +abbreviation "liminf \ Liminf sequentially" + +abbreviation "limsup \ Limsup sequentially" + +lemma Liminf_eqI: + "(\P. eventually P F \ INFI (Collect P) f \ x) \ + (\y. (\P. eventually P F \ INFI (Collect P) f \ y) \ x \ y) \ Liminf F f = x" + unfolding Liminf_def by (auto intro!: SUP_eqI) + +lemma Limsup_eqI: + "(\P. eventually P F \ x \ SUPR (Collect P) f) \ + (\y. (\P. eventually P F \ y \ SUPR (Collect P) f) \ y \ x) \ Limsup F f = x" + unfolding Limsup_def by (auto intro!: INF_eqI) + +lemma liminf_SUPR_INFI: + fixes f :: "nat \ 'a :: complete_lattice" + shows "liminf f = (SUP n. INF m:{n..}. f m)" + unfolding Liminf_def eventually_sequentially + by (rule SUPR_eq) (auto simp: atLeast_def intro!: INF_mono) + +lemma limsup_INFI_SUPR: + fixes f :: "nat \ 'a :: complete_lattice" + shows "limsup f = (INF n. SUP m:{n..}. f m)" + unfolding Limsup_def eventually_sequentially + by (rule INFI_eq) (auto simp: atLeast_def intro!: SUP_mono) + +lemma Limsup_const: + assumes ntriv: "\ trivial_limit F" + shows "Limsup F (\x. c) = (c::'a::complete_lattice)" +proof - + have *: "\P. Ex P \ P \ (\x. False)" by auto + have "\P. eventually P F \ (SUP x : {x. P x}. c) = c" + using ntriv by (intro SUP_const) (auto simp: eventually_False *) + then show ?thesis + unfolding Limsup_def using eventually_True + by (subst INF_cong[where D="\x. c"]) + (auto intro!: INF_const simp del: eventually_True) +qed + +lemma Liminf_const: + assumes ntriv: "\ trivial_limit F" + shows "Liminf F (\x. c) = (c::'a::complete_lattice)" +proof - + have *: "\P. Ex P \ P \ (\x. False)" by auto + have "\P. eventually P F \ (INF x : {x. P x}. c) = c" + using ntriv by (intro INF_const) (auto simp: eventually_False *) + then show ?thesis + unfolding Liminf_def using eventually_True + by (subst SUP_cong[where D="\x. c"]) + (auto intro!: SUP_const simp del: eventually_True) +qed + +lemma Liminf_mono: + fixes f g :: "'a => 'b :: complete_lattice" + assumes ev: "eventually (\x. f x \ g x) F" + shows "Liminf F f \ Liminf F g" + unfolding Liminf_def +proof (safe intro!: SUP_mono) + fix P assume "eventually P F" + with ev have "eventually (\x. f x \ g x \ P x) F" (is "eventually ?Q F") by (rule eventually_conj) + then show "\Q\{P. eventually P F}. INFI (Collect P) f \ INFI (Collect Q) g" + by (intro bexI[of _ ?Q]) (auto intro!: INF_mono) +qed + +lemma Liminf_eq: + fixes f g :: "'a \ 'b :: complete_lattice" + assumes "eventually (\x. f x = g x) F" + shows "Liminf F f = Liminf F g" + by (intro antisym Liminf_mono eventually_mono[OF _ assms]) auto + +lemma Limsup_mono: + fixes f g :: "'a \ 'b :: complete_lattice" + assumes ev: "eventually (\x. f x \ g x) F" + shows "Limsup F f \ Limsup F g" + unfolding Limsup_def +proof (safe intro!: INF_mono) + fix P assume "eventually P F" + with ev have "eventually (\x. f x \ g x \ P x) F" (is "eventually ?Q F") by (rule eventually_conj) + then show "\Q\{P. eventually P F}. SUPR (Collect Q) f \ SUPR (Collect P) g" + by (intro bexI[of _ ?Q]) (auto intro!: SUP_mono) +qed + +lemma Limsup_eq: + fixes f g :: "'a \ 'b :: complete_lattice" + assumes "eventually (\x. f x = g x) net" + shows "Limsup net f = Limsup net g" + by (intro antisym Limsup_mono eventually_mono[OF _ assms]) auto + +lemma Liminf_le_Limsup: + fixes f :: "'a \ 'b::complete_lattice" + assumes ntriv: "\ trivial_limit F" + shows "Liminf F f \ Limsup F f" + unfolding Limsup_def Liminf_def + apply (rule complete_lattice_class.SUP_least) + apply (rule complete_lattice_class.INF_greatest) +proof safe + fix P Q assume "eventually P F" "eventually Q F" + then have "eventually (\x. P x \ Q x) F" (is "eventually ?C F") by (rule eventually_conj) + then have not_False: "(\x. P x \ Q x) \ (\x. False)" + using ntriv by (auto simp add: eventually_False) + have "INFI (Collect P) f \ INFI (Collect ?C) f" + by (rule INF_mono) auto + also have "\ \ SUPR (Collect ?C) f" + using not_False by (intro INF_le_SUP) auto + also have "\ \ SUPR (Collect Q) f" + by (rule SUP_mono) auto + finally show "INFI (Collect P) f \ SUPR (Collect Q) f" . +qed + +lemma Liminf_bounded: + fixes X Y :: "'a \ 'b::complete_lattice" + assumes ntriv: "\ trivial_limit F" + assumes le: "eventually (\n. C \ X n) F" + shows "C \ Liminf F X" + using Liminf_mono[OF le] Liminf_const[OF ntriv, of C] by simp + +lemma Limsup_bounded: + fixes X Y :: "'a \ 'b::complete_lattice" + assumes ntriv: "\ trivial_limit F" + assumes le: "eventually (\n. X n \ C) F" + shows "Limsup F X \ C" + using Limsup_mono[OF le] Limsup_const[OF ntriv, of C] by simp + +lemma le_Liminf_iff: + fixes X :: "_ \ _ :: complete_linorder" + shows "C \ Liminf F X \ (\yx. y < X x) F)" +proof - + { fix y P assume "eventually P F" "y < INFI (Collect P) X" + then have "eventually (\x. y < X x) F" + by (auto elim!: eventually_elim1 dest: less_INF_D) } + moreover + { fix y P assume "y < C" and y: "\yx. y < X x) F" + have "\P. eventually P F \ y < INFI (Collect P) X" + proof cases + assume "\z. y < z \ z < C" + then guess z .. + moreover then have "z \ INFI {x. z < X x} X" + by (auto intro!: INF_greatest) + ultimately show ?thesis + using y by (intro exI[of _ "\x. z < X x"]) auto + next + assume "\ (\z. y < z \ z < C)" + then have "C \ INFI {x. y < X x} X" + by (intro INF_greatest) auto + with `y < C` show ?thesis + using y by (intro exI[of _ "\x. y < X x"]) auto + qed } + ultimately show ?thesis + unfolding Liminf_def le_SUP_iff by auto +qed + +lemma lim_imp_Liminf: + fixes f :: "'a \ _ :: {complete_linorder, linorder_topology}" + assumes ntriv: "\ trivial_limit F" + assumes lim: "(f ---> f0) F" + shows "Liminf F f = f0" +proof (intro Liminf_eqI) + fix P assume P: "eventually P F" + then have "eventually (\x. INFI (Collect P) f \ f x) F" + by eventually_elim (auto intro!: INF_lower) + then show "INFI (Collect P) f \ f0" + by (rule tendsto_le[OF ntriv lim tendsto_const]) +next + fix y assume upper: "\P. eventually P F \ INFI (Collect P) f \ y" + show "f0 \ y" + proof cases + assume "\z. y < z \ z < f0" + then guess z .. + moreover have "z \ INFI {x. z < f x} f" + by (rule INF_greatest) simp + ultimately show ?thesis + using lim[THEN topological_tendstoD, THEN upper, of "{z <..}"] by auto + next + assume discrete: "\ (\z. y < z \ z < f0)" + show ?thesis + proof (rule classical) + assume "\ f0 \ y" + then have "eventually (\x. y < f x) F" + using lim[THEN topological_tendstoD, of "{y <..}"] by auto + then have "eventually (\x. f0 \ f x) F" + using discrete by (auto elim!: eventually_elim1) + then have "INFI {x. f0 \ f x} f \ y" + by (rule upper) + moreover have "f0 \ INFI {x. f0 \ f x} f" + by (intro INF_greatest) simp + ultimately show "f0 \ y" by simp + qed + qed +qed + +lemma lim_imp_Limsup: + fixes f :: "'a \ _ :: {complete_linorder, linorder_topology}" + assumes ntriv: "\ trivial_limit F" + assumes lim: "(f ---> f0) F" + shows "Limsup F f = f0" +proof (intro Limsup_eqI) + fix P assume P: "eventually P F" + then have "eventually (\x. f x \ SUPR (Collect P) f) F" + by eventually_elim (auto intro!: SUP_upper) + then show "f0 \ SUPR (Collect P) f" + by (rule tendsto_le[OF ntriv tendsto_const lim]) +next + fix y assume lower: "\P. eventually P F \ y \ SUPR (Collect P) f" + show "y \ f0" + proof cases + assume "\z. f0 < z \ z < y" + then guess z .. + moreover have "SUPR {x. f x < z} f \ z" + by (rule SUP_least) simp + ultimately show ?thesis + using lim[THEN topological_tendstoD, THEN lower, of "{..< z}"] by auto + next + assume discrete: "\ (\z. f0 < z \ z < y)" + show ?thesis + proof (rule classical) + assume "\ y \ f0" + then have "eventually (\x. f x < y) F" + using lim[THEN topological_tendstoD, of "{..< y}"] by auto + then have "eventually (\x. f x \ f0) F" + using discrete by (auto elim!: eventually_elim1 simp: not_less) + then have "y \ SUPR {x. f x \ f0} f" + by (rule lower) + moreover have "SUPR {x. f x \ f0} f \ f0" + by (intro SUP_least) simp + ultimately show "y \ f0" by simp + qed + qed +qed + +lemma Liminf_eq_Limsup: + fixes f0 :: "'a :: {complete_linorder, linorder_topology}" + assumes ntriv: "\ trivial_limit F" + and lim: "Liminf F f = f0" "Limsup F f = f0" + shows "(f ---> f0) F" +proof (rule order_tendstoI) + fix a assume "f0 < a" + with assms have "Limsup F f < a" by simp + then obtain P where "eventually P F" "SUPR (Collect P) f < a" + unfolding Limsup_def INF_less_iff by auto + then show "eventually (\x. f x < a) F" + by (auto elim!: eventually_elim1 dest: SUP_lessD) +next + fix a assume "a < f0" + with assms have "a < Liminf F f" by simp + then obtain P where "eventually P F" "a < INFI (Collect P) f" + unfolding Liminf_def less_SUP_iff by auto + then show "eventually (\x. a < f x) F" + by (auto elim!: eventually_elim1 dest: less_INF_D) +qed + +lemma tendsto_iff_Liminf_eq_Limsup: + fixes f0 :: "'a :: {complete_linorder, linorder_topology}" + shows "\ trivial_limit F \ (f ---> f0) F \ (Liminf F f = f0 \ Limsup F f = f0)" + by (metis Liminf_eq_Limsup lim_imp_Limsup lim_imp_Liminf) + +lemma liminf_subseq_mono: + fixes X :: "nat \ 'a :: complete_linorder" + assumes "subseq r" + shows "liminf X \ liminf (X \ r) " +proof- + have "\n. (INF m:{n..}. X m) \ (INF m:{n..}. (X \ r) m)" + proof (safe intro!: INF_mono) + fix n m :: nat assume "n \ m" then show "\ma\{n..}. X ma \ (X \ r) m" + using seq_suble[OF `subseq r`, of m] by (intro bexI[of _ "r m"]) auto + qed + then show ?thesis by (auto intro!: SUP_mono simp: liminf_SUPR_INFI comp_def) +qed + +lemma limsup_subseq_mono: + fixes X :: "nat \ 'a :: complete_linorder" + assumes "subseq r" + shows "limsup (X \ r) \ limsup X" +proof- + have "\n. (SUP m:{n..}. (X \ r) m) \ (SUP m:{n..}. X m)" + proof (safe intro!: SUP_mono) + fix n m :: nat assume "n \ m" then show "\ma\{n..}. (X \ r) m \ X ma" + using seq_suble[OF `subseq r`, of m] by (intro bexI[of _ "r m"]) auto + qed + then show ?thesis by (auto intro!: INF_mono simp: limsup_INFI_SUPR comp_def) +qed + +end diff -r 04ebef4ee844 -r 5e6296afe08d src/HOL/Multivariate_Analysis/Extended_Real_Limits.thy --- a/src/HOL/Multivariate_Analysis/Extended_Real_Limits.thy Tue Mar 05 15:27:08 2013 +0100 +++ b/src/HOL/Multivariate_Analysis/Extended_Real_Limits.thy Tue Mar 05 15:43:08 2013 +0100 @@ -22,35 +22,13 @@ lemma ereal_open_uminus: fixes S :: "ereal set" - assumes "open S" - shows "open (uminus ` S)" - unfolding open_ereal_def -proof (intro conjI impI) - obtain x y where - S: "open (ereal -` S)" "\ \ S \ {ereal x<..} \ S" "-\ \ S \ {..< ereal y} \ S" - using `open S` unfolding open_ereal_def by auto - have "ereal -` uminus ` S = uminus ` (ereal -` S)" - proof safe - fix x y - assume "ereal x = - y" "y \ S" - then show "x \ uminus ` ereal -` S" by (cases y) auto - next - fix x - assume "ereal x \ S" - then show "- x \ ereal -` uminus ` S" - by (auto intro: image_eqI[of _ _ "ereal x"]) - qed - then show "open (ereal -` uminus ` S)" - using S by (auto intro: open_negations) - { assume "\ \ uminus ` S" - then have "-\ \ S" by (metis image_iff ereal_uminus_uminus) - then have "uminus ` {.. uminus ` S" using S by (intro image_mono) auto - then show "\x. {ereal x<..} \ uminus ` S" using ereal_uminus_lessThan by auto } - { assume "-\ \ uminus ` S" - then have "\ : S" by (metis image_iff ereal_uminus_uminus) - then have "uminus ` {ereal x<..} <= uminus ` S" using S by (intro image_mono) auto - then show "\y. {..)` by auto - next - case PInf - then obtain y where "{ereal y<..} <= {a}" using a open_PInfty2[of "{a}"] by auto - then have "ereal(y+1):{a}" apply (subst subsetD[of "{ereal y<..}"]) by auto - then show False using `a=\` by auto - next - case (real r) then have fin: "\a\ \ \" by simp - from ereal_open_cont_interval[OF a singletonI this] guess e . note e = this - then obtain b where b_def: "a" by (simp add: bot_ereal_def atLeast_eq_UNIV_iff) qed -lemma ereal_open_mono_set: - fixes S :: "ereal set" - shows "(open S \ mono_set S) \ (S = UNIV \ S = {Inf S <..})" - by (metis Inf_UNIV atLeast_eq_UNIV_iff ereal_open_atLeast - ereal_open_closed mono_set_iff open_ereal_greaterThan) - -lemma ereal_closed_mono_set: - fixes S :: "ereal set" - shows "(closed S \ mono_set S) \ (S = {} \ S = {Inf S ..})" - by (metis Inf_UNIV atLeast_eq_UNIV_iff closed_ereal_atLeast - ereal_open_closed mono_empty mono_set_iff open_ereal_greaterThan) - -lemma ereal_Liminf_Sup_monoset: - fixes f :: "'a => ereal" - shows "Liminf net f = - Sup {l. \S. open S \ mono_set S \ l \ S \ eventually (\x. f x \ S) net}" - (is "_ = Sup ?A") -proof (safe intro!: Liminf_eqI complete_lattice_class.Sup_upper complete_lattice_class.Sup_least) - fix P assume P: "eventually P net" - fix S assume S: "mono_set S" "INFI (Collect P) f \ S" - { fix x assume "P x" - then have "INFI (Collect P) f \ f x" - by (intro complete_lattice_class.INF_lower) simp - with S have "f x \ S" - by (simp add: mono_set) } - with P show "eventually (\x. f x \ S) net" - by (auto elim: eventually_elim1) -next - fix y l - assume S: "\S. open S \ mono_set S \ l \ S \ eventually (\x. f x \ S) net" - assume P: "\P. eventually P net \ INFI (Collect P) f \ y" - show "l \ y" - proof (rule dense_le) - fix B assume "B < l" - then have "eventually (\x. f x \ {B <..}) net" - by (intro S[rule_format]) auto - then have "INFI {x. B < f x} f \ y" - using P by auto - moreover have "B \ INFI {x. B < f x} f" - by (intro INF_greatest) auto - ultimately show "B \ y" - by simp - qed -qed - -lemma ereal_Limsup_Inf_monoset: - fixes f :: "'a => ereal" - shows "Limsup net f = - Inf {l. \S. open S \ mono_set (uminus ` S) \ l \ S \ eventually (\x. f x \ S) net}" - (is "_ = Inf ?A") -proof (safe intro!: Limsup_eqI complete_lattice_class.Inf_lower complete_lattice_class.Inf_greatest) - fix P assume P: "eventually P net" - fix S assume S: "mono_set (uminus`S)" "SUPR (Collect P) f \ S" - { fix x assume "P x" - then have "f x \ SUPR (Collect P) f" - by (intro complete_lattice_class.SUP_upper) simp - with S(1)[unfolded mono_set, rule_format, of "- SUPR (Collect P) f" "- f x"] S(2) - have "f x \ S" - by (simp add: inj_image_mem_iff) } - with P show "eventually (\x. f x \ S) net" - by (auto elim: eventually_elim1) -next - fix y l - assume S: "\S. open S \ mono_set (uminus ` S) \ l \ S \ eventually (\x. f x \ S) net" - assume P: "\P. eventually P net \ y \ SUPR (Collect P) f" - show "y \ l" - proof (rule dense_ge) - fix B assume "l < B" - then have "eventually (\x. f x \ {..< B}) net" - by (intro S[rule_format]) auto - then have "y \ SUPR {x. f x < B} f" - using P by auto - moreover have "SUPR {x. f x < B} f \ B" - by (intro SUP_least) auto - ultimately show "y \ B" - by simp - qed -qed - lemma open_uminus_iff: "open (uminus ` S) \ open (S::ereal set)" using ereal_open_uminus[of S] ereal_open_uminus[of "uminus`S"] by auto -lemma ereal_Limsup_uminus: - fixes f :: "'a => ereal" - shows "Limsup net (\x. - (f x)) = -(Liminf net f)" -proof - - { fix P l - have "(\x. (l::ereal) = -x \ P x) \ P (-l)" - by (auto intro!: exI[of _ "-l"]) } - note Ex_cancel = this - { fix P :: "ereal set \ bool" - have "(\S. P S) \ (\S. P (uminus`S))" - apply auto - apply (erule_tac x="uminus`S" in allE) - apply (auto simp: image_image) - done } - note add_uminus_image = this - { fix x S - have "(x::ereal) \ uminus`S \ -x\S" - by (auto intro!: image_eqI[of _ _ "-x"]) } - note remove_uminus_image = this - show ?thesis - unfolding ereal_Limsup_Inf_monoset ereal_Liminf_Sup_monoset - unfolding ereal_Inf_uminus_image_eq[symmetric] image_Collect Ex_cancel - by (subst add_uminus_image) (simp add: open_uminus_iff remove_uminus_image) -qed - lemma ereal_Liminf_uminus: fixes f :: "'a => ereal" shows "Liminf net (\x. - (f x)) = -(Limsup net f)" @@ -423,14 +272,6 @@ ereal_lim_mult[of "\x. - (f x)" "-f0" net "- 1"] by (auto simp: ereal_uminus_reorder) -lemma lim_imp_Limsup: - fixes f :: "'a => ereal" - assumes "\ trivial_limit net" - and lim: "(f ---> f0) net" - shows "Limsup net f = f0" - using ereal_Lim_uminus[of f f0] lim_imp_Liminf[of net "(%x. -(f x))" "-f0"] - ereal_Liminf_uminus[of net f] assms by simp - lemma convergent_ereal_limsup: fixes X :: "nat \ ereal" shows "convergent X \ limsup X = lim X" @@ -461,43 +302,10 @@ using assms ereal_Lim_uminus[of f "-\"] Liminf_PInfty[of _ "\x. - (f x)"] ereal_Liminf_uminus[of _ f] by (auto simp: ereal_uminus_eq_reorder) -lemma ereal_Liminf_eq_Limsup: - fixes f :: "'a \ ereal" - assumes ntriv: "\ trivial_limit net" - and lim: "Liminf net f = f0" "Limsup net f = f0" - shows "(f ---> f0) net" -proof (cases f0) - case PInf - then show ?thesis using Liminf_PInfty[OF ntriv] lim by auto -next - case MInf - then show ?thesis using Limsup_MInfty[OF ntriv] lim by auto -next - case (real r) - show "(f ---> f0) net" - proof (rule topological_tendstoI) - fix S - assume "open S" "f0 \ S" - then obtain a b where "a < Liminf net f" "Limsup net f < b" "{a<.. S" - using ereal_open_cont_interval2[of S f0] real lim by auto - then have "eventually (\x. f x \ {a<.. S` show "eventually (%x. f x : S) net" - by (rule_tac eventually_mono) auto - qed -qed - -lemma ereal_Liminf_eq_Limsup_iff: - fixes f :: "'a \ ereal" - assumes "\ trivial_limit net" - shows "(f ---> f0) net \ Liminf net f = f0 \ Limsup net f = f0" - by (metis assms ereal_Liminf_eq_Limsup lim_imp_Liminf lim_imp_Limsup) - lemma convergent_ereal: fixes X :: "nat \ ereal" shows "convergent X \ limsup X = liminf X" - using ereal_Liminf_eq_Limsup_iff[of sequentially] + using tendsto_iff_Liminf_eq_Limsup[of sequentially] by (auto simp: convergent_def) lemma limsup_INFI_SUPR: @@ -535,45 +343,6 @@ shows "X N >= L" using dec by (intro ereal_lim_mono[of N, OF _ lim tendsto_const]) (simp add: decseq_def) -lemma liminf_bounded_open: - fixes x :: "nat \ ereal" - shows "x0 \ liminf x \ (\S. open S \ mono_set S \ x0 \ S \ (\N. \n\N. x n \ S))" - (is "_ \ ?P x0") -proof - assume "?P x0" - then show "x0 \ liminf x" - unfolding ereal_Liminf_Sup_monoset eventually_sequentially - by (intro complete_lattice_class.Sup_upper) auto -next - assume "x0 \ liminf x" - { fix S :: "ereal set" - assume om: "open S & mono_set S & x0:S" - { assume "S = UNIV" then have "EX N. (ALL n>=N. x n : S)" by auto } - moreover - { assume "~(S=UNIV)" - then obtain B where B_def: "S = {B<..}" using om ereal_open_mono_set by auto - then have "B=N. x n : S" - unfolding B_def using `x0 \ liminf x` liminf_bounded_iff by auto - } - ultimately have "EX N. (ALL n>=N. x n : S)" by auto - } - then show "?P x0" by auto -qed - -lemma limsup_subseq_mono: - fixes X :: "nat \ ereal" - assumes "subseq r" - shows "limsup (X \ r) \ limsup X" -proof - - have "(\n. - X n) \ r = (\n. - (X \ r) n)" by (simp add: fun_eq_iff) - then have "- limsup X \ - limsup (X \ r)" - using liminf_subseq_mono[of r "(%n. - X n)"] - ereal_Liminf_uminus[of sequentially X] - ereal_Liminf_uminus[of sequentially "X o r"] assms by auto - then show ?thesis by auto -qed - lemma bounded_abs: assumes "(a::real)<=x" "x<=b" shows "abs x <= max (abs a) (abs b)" @@ -652,85 +421,6 @@ show "f ----> x" by auto } qed -lemma Liminf_within: - fixes f :: "'a::metric_space \ 'b::complete_lattice" - shows "Liminf (at x within S) f = (SUP e:{0<..}. INF y:(S \ ball x e - {x}). f y)" - unfolding Liminf_def eventually_within -proof (rule SUPR_eq, simp_all add: Ball_def Bex_def, safe) - fix P d assume "0 < d" "\y. y \ S \ 0 < dist y x \ dist y x < d \ P y" - then have "S \ ball x d - {x} \ {x. P x}" - by (auto simp: zero_less_dist_iff dist_commute) - then show "\r>0. INFI (Collect P) f \ INFI (S \ ball x r - {x}) f" - by (intro exI[of _ d] INF_mono conjI `0 < d`) auto -next - fix d :: real assume "0 < d" - then show "\P. (\d>0. \xa. xa \ S \ 0 < dist xa x \ dist xa x < d \ P xa) \ - INFI (S \ ball x d - {x}) f \ INFI (Collect P) f" - by (intro exI[of _ "\y. y \ S \ ball x d - {x}"]) - (auto intro!: INF_mono exI[of _ d] simp: dist_commute) -qed - -lemma Limsup_within: - fixes f :: "'a::metric_space => 'b::complete_lattice" - shows "Limsup (at x within S) f = (INF e:{0<..}. SUP y:(S \ ball x e - {x}). f y)" - unfolding Limsup_def eventually_within -proof (rule INFI_eq, simp_all add: Ball_def Bex_def, safe) - fix P d assume "0 < d" "\y. y \ S \ 0 < dist y x \ dist y x < d \ P y" - then have "S \ ball x d - {x} \ {x. P x}" - by (auto simp: zero_less_dist_iff dist_commute) - then show "\r>0. SUPR (S \ ball x r - {x}) f \ SUPR (Collect P) f" - by (intro exI[of _ d] SUP_mono conjI `0 < d`) auto -next - fix d :: real assume "0 < d" - then show "\P. (\d>0. \xa. xa \ S \ 0 < dist xa x \ dist xa x < d \ P xa) \ - SUPR (Collect P) f \ SUPR (S \ ball x d - {x}) f" - by (intro exI[of _ "\y. y \ S \ ball x d - {x}"]) - (auto intro!: SUP_mono exI[of _ d] simp: dist_commute) -qed - -lemma Liminf_within_UNIV: - fixes f :: "'a::metric_space => _" - shows "Liminf (at x) f = Liminf (at x within UNIV) f" - by simp (* TODO: delete *) - - -lemma Liminf_at: - fixes f :: "'a::metric_space => _" - shows "Liminf (at x) f = (SUP e:{0<..}. INF y:(ball x e - {x}). f y)" - using Liminf_within[of x UNIV f] by simp - - -lemma Limsup_within_UNIV: - fixes f :: "'a::metric_space => _" - shows "Limsup (at x) f = Limsup (at x within UNIV) f" - by simp (* TODO: delete *) - - -lemma Limsup_at: - fixes f :: "'a::metric_space => _" - shows "Limsup (at x) f = (INF e:{0<..}. SUP y:(ball x e - {x}). f y)" - using Limsup_within[of x UNIV f] by simp - -lemma Lim_within_constant: - assumes "ALL y:S. f y = C" - shows "(f ---> C) (at x within S)" - unfolding tendsto_def Limits.eventually_within eventually_at_topological - using assms by simp (metis open_UNIV UNIV_I) - -lemma Liminf_within_constant: - fixes f :: "'a::topological_space \ ereal" - assumes "ALL y:S. f y = C" - and "~trivial_limit (at x within S)" - shows "Liminf (at x within S) f = C" - by (metis Lim_within_constant assms lim_imp_Liminf) - -lemma Limsup_within_constant: - fixes f :: "'a::topological_space \ ereal" - assumes "ALL y:S. f y = C" - and "~trivial_limit (at x within S)" - shows "Limsup (at x within S) f = C" - by (metis Lim_within_constant assms lim_imp_Limsup) - lemma islimpt_punctured: "x islimpt S = x islimpt (S-{x})" unfolding islimpt_def by blast @@ -1317,4 +1007,205 @@ then show "\i. f i = 0" by auto qed simp +lemma Liminf_within: + fixes f :: "'a::metric_space \ 'b::complete_lattice" + shows "Liminf (at x within S) f = (SUP e:{0<..}. INF y:(S \ ball x e - {x}). f y)" + unfolding Liminf_def eventually_within +proof (rule SUPR_eq, simp_all add: Ball_def Bex_def, safe) + fix P d assume "0 < d" "\y. y \ S \ 0 < dist y x \ dist y x < d \ P y" + then have "S \ ball x d - {x} \ {x. P x}" + by (auto simp: zero_less_dist_iff dist_commute) + then show "\r>0. INFI (Collect P) f \ INFI (S \ ball x r - {x}) f" + by (intro exI[of _ d] INF_mono conjI `0 < d`) auto +next + fix d :: real assume "0 < d" + then show "\P. (\d>0. \xa. xa \ S \ 0 < dist xa x \ dist xa x < d \ P xa) \ + INFI (S \ ball x d - {x}) f \ INFI (Collect P) f" + by (intro exI[of _ "\y. y \ S \ ball x d - {x}"]) + (auto intro!: INF_mono exI[of _ d] simp: dist_commute) +qed + +lemma Limsup_within: + fixes f :: "'a::metric_space => 'b::complete_lattice" + shows "Limsup (at x within S) f = (INF e:{0<..}. SUP y:(S \ ball x e - {x}). f y)" + unfolding Limsup_def eventually_within +proof (rule INFI_eq, simp_all add: Ball_def Bex_def, safe) + fix P d assume "0 < d" "\y. y \ S \ 0 < dist y x \ dist y x < d \ P y" + then have "S \ ball x d - {x} \ {x. P x}" + by (auto simp: zero_less_dist_iff dist_commute) + then show "\r>0. SUPR (S \ ball x r - {x}) f \ SUPR (Collect P) f" + by (intro exI[of _ d] SUP_mono conjI `0 < d`) auto +next + fix d :: real assume "0 < d" + then show "\P. (\d>0. \xa. xa \ S \ 0 < dist xa x \ dist xa x < d \ P xa) \ + SUPR (Collect P) f \ SUPR (S \ ball x d - {x}) f" + by (intro exI[of _ "\y. y \ S \ ball x d - {x}"]) + (auto intro!: SUP_mono exI[of _ d] simp: dist_commute) +qed + +lemma Liminf_at: + fixes f :: "'a::metric_space => _" + shows "Liminf (at x) f = (SUP e:{0<..}. INF y:(ball x e - {x}). f y)" + using Liminf_within[of x UNIV f] by simp + +lemma Limsup_at: + fixes f :: "'a::metric_space => _" + shows "Limsup (at x) f = (INF e:{0<..}. SUP y:(ball x e - {x}). f y)" + using Limsup_within[of x UNIV f] by simp + +lemma min_Liminf_at: + fixes f :: "'a::metric_space => 'b::complete_linorder" + shows "min (f x) (Liminf (at x) f) = (SUP e:{0<..}. INF y:ball x e. f y)" + unfolding inf_min[symmetric] Liminf_at + apply (subst inf_commute) + apply (subst SUP_inf) + apply (intro SUP_cong[OF refl]) + apply (cut_tac A="ball x b - {x}" and B="{x}" and M=f in INF_union) + apply (simp add: INF_def del: inf_ereal_def) + done + +subsection {* monoset *} + +definition (in order) mono_set: + "mono_set S \ (\x y. x \ y \ x \ S \ y \ S)" + +lemma (in order) mono_greaterThan [intro, simp]: "mono_set {B<..}" unfolding mono_set by auto +lemma (in order) mono_atLeast [intro, simp]: "mono_set {B..}" unfolding mono_set by auto +lemma (in order) mono_UNIV [intro, simp]: "mono_set UNIV" unfolding mono_set by auto +lemma (in order) mono_empty [intro, simp]: "mono_set {}" unfolding mono_set by auto + +lemma (in complete_linorder) mono_set_iff: + fixes S :: "'a set" + defines "a \ Inf S" + shows "mono_set S \ (S = {a <..} \ S = {a..})" (is "_ = ?c") +proof + assume "mono_set S" + then have mono: "\x y. x \ y \ x \ S \ y \ S" by (auto simp: mono_set) + show ?c + proof cases + assume "a \ S" + show ?c + using mono[OF _ `a \ S`] + by (auto intro: Inf_lower simp: a_def) + next + assume "a \ S" + have "S = {a <..}" + proof safe + fix x assume "x \ S" + then have "a \ x" unfolding a_def by (rule Inf_lower) + then show "a < x" using `x \ S` `a \ S` by (cases "a = x") auto + next + fix x assume "a < x" + then obtain y where "y < x" "y \ S" unfolding a_def Inf_less_iff .. + with mono[of y x] show "x \ S" by auto + qed + then show ?c .. + qed +qed auto + +lemma ereal_open_mono_set: + fixes S :: "ereal set" + shows "(open S \ mono_set S) \ (S = UNIV \ S = {Inf S <..})" + by (metis Inf_UNIV atLeast_eq_UNIV_iff ereal_open_atLeast + ereal_open_closed mono_set_iff open_ereal_greaterThan) + +lemma ereal_closed_mono_set: + fixes S :: "ereal set" + shows "(closed S \ mono_set S) \ (S = {} \ S = {Inf S ..})" + by (metis Inf_UNIV atLeast_eq_UNIV_iff closed_ereal_atLeast + ereal_open_closed mono_empty mono_set_iff open_ereal_greaterThan) + +lemma ereal_Liminf_Sup_monoset: + fixes f :: "'a => ereal" + shows "Liminf net f = + Sup {l. \S. open S \ mono_set S \ l \ S \ eventually (\x. f x \ S) net}" + (is "_ = Sup ?A") +proof (safe intro!: Liminf_eqI complete_lattice_class.Sup_upper complete_lattice_class.Sup_least) + fix P assume P: "eventually P net" + fix S assume S: "mono_set S" "INFI (Collect P) f \ S" + { fix x assume "P x" + then have "INFI (Collect P) f \ f x" + by (intro complete_lattice_class.INF_lower) simp + with S have "f x \ S" + by (simp add: mono_set) } + with P show "eventually (\x. f x \ S) net" + by (auto elim: eventually_elim1) +next + fix y l + assume S: "\S. open S \ mono_set S \ l \ S \ eventually (\x. f x \ S) net" + assume P: "\P. eventually P net \ INFI (Collect P) f \ y" + show "l \ y" + proof (rule dense_le) + fix B assume "B < l" + then have "eventually (\x. f x \ {B <..}) net" + by (intro S[rule_format]) auto + then have "INFI {x. B < f x} f \ y" + using P by auto + moreover have "B \ INFI {x. B < f x} f" + by (intro INF_greatest) auto + ultimately show "B \ y" + by simp + qed +qed + +lemma ereal_Limsup_Inf_monoset: + fixes f :: "'a => ereal" + shows "Limsup net f = + Inf {l. \S. open S \ mono_set (uminus ` S) \ l \ S \ eventually (\x. f x \ S) net}" + (is "_ = Inf ?A") +proof (safe intro!: Limsup_eqI complete_lattice_class.Inf_lower complete_lattice_class.Inf_greatest) + fix P assume P: "eventually P net" + fix S assume S: "mono_set (uminus`S)" "SUPR (Collect P) f \ S" + { fix x assume "P x" + then have "f x \ SUPR (Collect P) f" + by (intro complete_lattice_class.SUP_upper) simp + with S(1)[unfolded mono_set, rule_format, of "- SUPR (Collect P) f" "- f x"] S(2) + have "f x \ S" + by (simp add: inj_image_mem_iff) } + with P show "eventually (\x. f x \ S) net" + by (auto elim: eventually_elim1) +next + fix y l + assume S: "\S. open S \ mono_set (uminus ` S) \ l \ S \ eventually (\x. f x \ S) net" + assume P: "\P. eventually P net \ y \ SUPR (Collect P) f" + show "y \ l" + proof (rule dense_ge) + fix B assume "l < B" + then have "eventually (\x. f x \ {..< B}) net" + by (intro S[rule_format]) auto + then have "y \ SUPR {x. f x < B} f" + using P by auto + moreover have "SUPR {x. f x < B} f \ B" + by (intro SUP_least) auto + ultimately show "y \ B" + by simp + qed +qed + +lemma liminf_bounded_open: + fixes x :: "nat \ ereal" + shows "x0 \ liminf x \ (\S. open S \ mono_set S \ x0 \ S \ (\N. \n\N. x n \ S))" + (is "_ \ ?P x0") +proof + assume "?P x0" + then show "x0 \ liminf x" + unfolding ereal_Liminf_Sup_monoset eventually_sequentially + by (intro complete_lattice_class.Sup_upper) auto +next + assume "x0 \ liminf x" + { fix S :: "ereal set" + assume om: "open S & mono_set S & x0:S" + { assume "S = UNIV" then have "EX N. (ALL n>=N. x n : S)" by auto } + moreover + { assume "~(S=UNIV)" + then obtain B where B_def: "S = {B<..}" using om ereal_open_mono_set by auto + then have "B=N. x n : S" + unfolding B_def using `x0 \ liminf x` liminf_bounded_iff by auto + } + ultimately have "EX N. (ALL n>=N. x n : S)" by auto + } + then show "?P x0" by auto +qed + end diff -r 04ebef4ee844 -r 5e6296afe08d src/HOL/Probability/Lebesgue_Integration.thy --- a/src/HOL/Probability/Lebesgue_Integration.thy Tue Mar 05 15:27:08 2013 +0100 +++ b/src/HOL/Probability/Lebesgue_Integration.thy Tue Mar 05 15:43:08 2013 +0100 @@ -2190,7 +2190,7 @@ using diff positive_integral_positive[of M] by (subst integral_eq_positive_integral[of _ M]) (auto simp: ereal_real integrable_def) then show ?lim_diff - using ereal_Liminf_eq_Limsup[OF trivial_limit_sequentially liminf_limsup_eq] + using Liminf_eq_Limsup[OF trivial_limit_sequentially liminf_limsup_eq] by simp show ?lim