products/sources/formale sprachen/Isabelle/HOL/Analysis image not shown  

Quellcode-Bibliothek

© Kompilation durch diese Firma

[Weder Korrektheit noch Funktionsfähigkeit der Software werden zugesichert.]

Datei:   Sprache: Isabelle

Original von: Isabelle©

(*  Author:     L C Paulson, University of Cambridge
    Author:     Amine Chaieb, University of Cambridge
    Author:     Robert Himmelmann, TU Muenchen
    Author:     Brian Huffman, Portland State University
*)


chapter \<open>Topology\<close>

theory Elementary_Topology
imports
  "HOL-Library.Set_Idioms"
  "HOL-Library.Disjoint_Sets"
  Product_Vector
begin


section \<open>Elementary Topology\<close>


subsubsection\<^marker>\<open>tag unimportant\<close> \<open>Affine transformations of intervals\<close>

lemma real_affinity_le: "0 < m \ m * x + c \ y \ x \ inverse m * y + - (c / m)"
  for m :: "'a::linordered_field"
  by (simp add: field_simps)

lemma real_le_affinity: "0 < m \ y \ m * x + c \ inverse m * y + - (c / m) \ x"
  for m :: "'a::linordered_field"
  by (simp add: field_simps)

lemma real_affinity_lt: "0 < m \ m * x + c < y \ x < inverse m * y + - (c / m)"
  for m :: "'a::linordered_field"
  by (simp add: field_simps)

lemma real_lt_affinity: "0 < m \ y < m * x + c \ inverse m * y + - (c / m) < x"
  for m :: "'a::linordered_field"
  by (simp add: field_simps)

lemma real_affinity_eq: "m \ 0 \ m * x + c = y \ x = inverse m * y + - (c / m)"
  for m :: "'a::linordered_field"
  by (simp add: field_simps)

lemma real_eq_affinity: "m \ 0 \ y = m * x + c \ inverse m * y + - (c / m) = x"
  for m :: "'a::linordered_field"
  by (simp add: field_simps)


subsection \<open>Topological Basis\<close>

context topological_space
begin

definition\<^marker>\<open>tag important\<close> "topological_basis B \<longleftrightarrow>
  (\<forall>b\<in>B. open b) \<and> (\<forall>x. open x \<longrightarrow> (\<exists>B'. B' \<subseteq> B \<and> \<Union>B' = x))"

lemma topological_basis:
  "topological_basis B \ (\x. open x \ (\B'. B' \ B \ \B' = x))"
  unfolding topological_basis_def
  apply safe
     apply fastforce
    apply fastforce
   apply (erule_tac x=x in allE, simp)
   apply (rule_tac x="{x}" in exI, auto)
  done

lemma topological_basis_iff:
  assumes "\B'. B' \ B \ open B'"
  shows "topological_basis B \ (\O'. open O' \ (\x\O'. \B'\B. x \ B' \ B' \ O'))"
    (is "_ \ ?rhs")
proof safe
  fix O' and x::'a
  assume H: "topological_basis B" "open O'" "x \ O'"
  then have "(\B'\B. \B' = O')" by (simp add: topological_basis_def)
  then obtain B' where "B' \<subseteq> B" "O' = \<Union>B'" by auto
  then show "\B'\B. x \ B' \ B' \ O'" using H by auto
next
  assume H: ?rhs
  show "topological_basis B"
    using assms unfolding topological_basis_def
  proof safe
    fix O' :: "'a set"
    assume "open O'"
    with H obtain f where "\x\O'. f x \ B \ x \ f x \ f x \ O'"
      by (force intro: bchoice simp: Bex_def)
    then show "\B'\B. \B' = O'"
      by (auto intro: exI[where x="{f x |x. x \ O'}"])
  qed
qed

lemma topological_basisI:
  assumes "\B'. B' \ B \ open B'"
    and "\O' x. open O' \ x \ O' \ \B'\B. x \ B' \ B' \ O'"
  shows "topological_basis B"
  using assms by (subst topological_basis_iff) auto

lemma topological_basisE:
  fixes O'
  assumes "topological_basis B"
    and "open O'"
    and "x \ O'"
  obtains B' where "B' \<in> B" "x \<in> B'" "B' \<subseteq> O'"
proof atomize_elim
  from assms have "\B'. B'\B \ open B'"
    by (simp add: topological_basis_def)
  with topological_basis_iff assms
  show  "\B'. B' \ B \ x \ B' \ B' \ O'"
    using assms by (simp add: Bex_def)
qed

lemma topological_basis_open:
  assumes "topological_basis B"
    and "X \ B"
  shows "open X"
  using assms by (simp add: topological_basis_def)

lemma topological_basis_imp_subbasis:
  assumes B: "topological_basis B"
  shows "open = generate_topology B"
proof (intro ext iffI)
  fix S :: "'a set"
  assume "open S"
  with B obtain B' where "B' \<subseteq> B" "S = \<Union>B'"
    unfolding topological_basis_def by blast
  then show "generate_topology B S"
    by (auto intro: generate_topology.intros dest: topological_basis_open)
next
  fix S :: "'a set"
  assume "generate_topology B S"
  then show "open S"
    by induct (auto dest: topological_basis_open[OF B])
qed

lemma basis_dense:
  fixes B :: "'a set set"
    and f :: "'a set \ 'a"
  assumes "topological_basis B"
    and choosefrom_basis: "\B'. B' \ {} \ f B' \ B'"
  shows "\X. open X \ X \ {} \ (\B' \ B. f B' \ X)"
proof (intro allI impI)
  fix X :: "'a set"
  assume "open X" and "X \ {}"
  from topological_basisE[OF \<open>topological_basis B\<close> \<open>open X\<close> choosefrom_basis[OF \<open>X \<noteq> {}\<close>]]
  obtain B' where "B' \<in> B" "f X \<in> B'" "B' \<subseteq> X" .
  then show "\B'\B. f B' \ X"
    by (auto intro!: choosefrom_basis)
qed

end

lemma topological_basis_prod:
  assumes A: "topological_basis A"
    and B: "topological_basis B"
  shows "topological_basis ((\(a, b). a \ b) ` (A \ B))"
  unfolding topological_basis_def
proof (safe, simp_all del: ex_simps add: subset_image_iff ex_simps(1)[symmetric])
  fix S :: "('a \ 'b) set"
  assume "open S"
  then show "\X\A \ B. (\(a,b)\X. a \ b) = S"
  proof (safe intro!: exI[of _ "{x\A \ B. fst x \ snd x \ S}"])
    fix x y
    assume "(x, y) \ S"
    from open_prod_elim[OF \<open>open S\<close> this]
    obtain a b where a: "open a""x \ a" and b: "open b" "y \ b" and "a \ b \ S"
      by (metis mem_Sigma_iff)
    moreover
    from A a obtain A0 where "A0 \ A" "x \ A0" "A0 \ a"
      by (rule topological_basisE)
    moreover
    from B b obtain B0 where "B0 \ B" "y \ B0" "B0 \ b"
      by (rule topological_basisE)
    ultimately show "(x, y) \ (\(a, b)\{X \ A \ B. fst X \ snd X \ S}. a \ b)"
      by (intro UN_I[of "(A0, B0)"]) auto
  qed auto
qed (metis A B topological_basis_open open_Times)


subsection \<open>Countable Basis\<close>

locale\<^marker>\<open>tag important\<close> countable_basis = topological_space p for p::"'a set \<Rightarrow> bool" +
  fixes B :: "'a set set"
  assumes is_basis: "topological_basis B"
    and countable_basis: "countable B"
begin

lemma open_countable_basis_ex:
  assumes "p X"
  shows "\B' \ B. X = \B'"
  using assms countable_basis is_basis
  unfolding topological_basis_def by blast

lemma open_countable_basisE:
  assumes "p X"
  obtains B' where "B' \<subseteq> B" "X = \<Union>B'"
  using assms open_countable_basis_ex
  by atomize_elim simp

lemma countable_dense_exists:
  "\D::'a set. countable D \ (\X. p X \ X \ {} \ (\d \ D. d \ X))"
proof -
  let ?f = "(\B'. SOME x. x \ B')"
  have "countable (?f ` B)" using countable_basis by simp
  with basis_dense[OF is_basis, of ?f] show ?thesis
    by (intro exI[where x="?f ` B"]) (metis (mono_tags) all_not_in_conv imageI someI)
qed

lemma countable_dense_setE:
  obtains D :: "'a set"
  where "countable D" "\X. p X \ X \ {} \ \d \ D. d \ X"
  using countable_dense_exists by blast

end

lemma countable_basis_openI: "countable_basis open B"
  if "countable B" "topological_basis B"
  using that
  by unfold_locales
    (simp_all add: topological_basis topological_space.topological_basis topological_space_axioms)

lemma (in first_countable_topology) first_countable_basisE:
  fixes x :: 'a
  obtains \<A> where "countable \<A>" "\<And>A. A \<in> \<A> \<Longrightarrow> x \<in> A" "\<And>A. A \<in> \<A> \<Longrightarrow> open A"
    "\S. open S \ x \ S \ (\A\\. A \ S)"
proof -
  obtain \<A> where \<A>: "(\<forall>i::nat. x \<in> \<A> i \<and> open (\<A> i))" "(\<forall>S. open S \<and> x \<in> S \<longrightarrow> (\<exists>i. \<A> i \<subseteq> S))"
    using first_countable_basis[of x] by metis
  show thesis
  proof 
    show "countable (range \
)"

      by simp
  qed (use \<A> in auto)
qed

lemma (in first_countable_topology) first_countable_basis_Int_stableE:
  obtains \<A> where "countable \<A>" "\<And>A. A \<in> \<A> \<Longrightarrow> x \<in> A" "\<And>A. A \<in> \<A> \<Longrightarrow> open A"
    "\S. open S \ x \ S \ (\A\\
. A \ S)"
    "\A B. A \ \
\ B \ \ \ A \ B \ \"
proof atomize_elim
  obtain \<B> where \<B>:
    "countable \"
    "\B. B \ \ \ x \ B"
    "\B. B \ \ \ open B"
    "\S. open S \ x \ S \ \B\\. B \ S"
    by (rule first_countable_basisE) blast
  define \<A> where [abs_def]:
    "\
= (\N. \((\n. from_nat_into \ n) ` N)) ` (Collect finite::nat set set)"
  then show "\\
. countable \ \ (\A. A \ \ \ x \ A) \ (\A. A \ \ \ open A) \
        (\<forall>S. open S \<longrightarrow> x \<in> S \<longrightarrow> (\<exists>A\<in>\<A>. A \<subseteq> S)) \<and> (\<forall>A B. A \<in> \<A> \<longrightarrow> B \<in> \<A> \<longrightarrow> A \<inter> B \<in> \<A>)"
  proof (safe intro!: exI[where x=\<A>])
    show "countable \
"
      unfolding \<A>_def by (intro countable_image countable_Collect_finite)
    fix A
    assume "A \ \
"
    then show "x \ A" "open A"
      using \<B>(4)[OF open_UNIV] by (auto simp: \<A>_def intro: \<B> from_nat_into)
  next
    let ?int = "\N. \(from_nat_into \ ` N)"
    fix A B
    assume "A \ \
" "B \ \"
    then obtain N M where "A = ?int N" "B = ?int M" "finite (N \ M)"
      by (auto simp: \<A>_def)
    then show "A \ B \ \
"
      by (auto simp: \<A>_def intro!: image_eqI[where x="N \<union> M"])
  next
    fix S
    assume "open S" "x \ S"
    then obtain a where a: "a\\" "a \ S" using \ by blast
    then show "\a\\
. a \ S" using a \
      by (intro bexI[where x=a]) (auto simp: \<A>_def intro: image_eqI[where x="{to_nat_on \<B> a}"])
  qed
qed

lemma (in topological_space) first_countableI:
  assumes "countable \
"
    and 1: "\A. A \ \
\ x \ A" "\A. A \ \ \ open A"
    and 2: "\S. open S \ x \ S \ \A\\
. A \ S"
  shows "\\
::nat \ 'a set. (\i. x \ \ i \ open (\ i)) \ (\S. open S \ x \ S \ (\i. \ i \ S))"
proof (safe intro!: exI[of _ "from_nat_into \
"])
  fix i
  have "\
\ {}" using 2[of UNIV] by auto
  show "x \ from_nat_into \
i" "open (from_nat_into \ i)"
    using range_from_nat_into_subset[OF \<open>\<A> \<noteq> {}\<close>] 1 by auto
next
  fix S
  assume "open S" "x\S" from 2[OF this]
  show "\i. from_nat_into \
i \ S"
    using subset_range_from_nat_into[OF \<open>countable \<A>\<close>] by auto
qed

instance prod :: (first_countable_topology, first_countable_topology) first_countable_topology
proof
  fix x :: "'a \ 'b"
  obtain \<A> where \<A>:
      "countable \
"
      "\a. a \ \
\ fst x \ a"
      "\a. a \ \
\ open a"
      "\S. open S \ fst x \ S \ \a\\
. a \ S"
    by (rule first_countable_basisE[of "fst x"]) blast
  obtain B where B:
      "countable B"
      "\a. a \ B \ snd x \ a"
      "\a. a \ B \ open a"
      "\S. open S \ snd x \ S \ \a\B. a \ S"
    by (rule first_countable_basisE[of "snd x"]) blast
  show "\\
::nat \ ('a \ 'b) set.
    (\<forall>i. x \<in> \<A> i \<and> open (\<A> i)) \<and> (\<forall>S. open S \<and> x \<in> S \<longrightarrow> (\<exists>i. \<A> i \<subseteq> S))"
  proof (rule first_countableI[of "(\(a, b). a \ b) ` (\
\ B)"], safe)
    fix a b
    assume x: "a \ \
" "b \ B"
    show "x \ a \ b"
      by (simp add: \<A>(2) B(2) mem_Times_iff x)
    show "open (a \ b)"
      by (simp add: \<A>(3) B(3) open_Times x)
  next
    fix S
    assume "open S" "x \ S"
    then obtain a' b' where a'b'"open a'" "open b'" "x \ a' \ b'" "a' \ b' \ S"
      by (rule open_prod_elim)
    moreover
    from a'b' \<A>(4)[of a'] B(4)[of b']
    obtain a b where "a \ \
" "a \ a'" "b \ B" "b \ b'"
      by auto
    ultimately
    show "\a\(\(a, b). a \ b) ` (\
\ B). a \ S"
      by (auto intro!: bexI[of _ "a \ b"] bexI[of _ a] bexI[of _ b])
  qed (simp add: \<A> B)
qed

class second_countable_topology = topological_space +
  assumes ex_countable_subbasis:
    "\B::'a set set. countable B \ open = generate_topology B"
begin

lemma ex_countable_basis: "\B::'a set set. countable B \ topological_basis B"
proof -
  from ex_countable_subbasis obtain B where B: "countable B" "open = generate_topology B"
    by blast
  let ?B = "Inter ` {b. finite b \ b \ B }"

  show ?thesis
  proof (intro exI conjI)
    show "countable ?B"
      by (intro countable_image countable_Collect_finite_subset B)
    {
      fix S
      assume "open S"
      then have "\B'\{b. finite b \ b \ B}. (\b\B'. \b) = S"
        unfolding B
      proof induct
        case UNIV
        show ?case by (intro exI[of _ "{{}}"]) simp
      next
        case (Int a b)
        then obtain x y where x: "a = \(Inter ` x)" "\i. i \ x \ finite i \ i \ B"
          and y: "b = \(Inter ` y)" "\i. i \ y \ finite i \ i \ B"
          by blast
        show ?case
          unfolding x y Int_UN_distrib2
          by (intro exI[of _ "{i \ j| i j. i \ x \ j \ y}"]) (auto dest: x(2) y(2))
      next
        case (UN K)
        then have "\k\K. \B'\{b. finite b \ b \ B}. \ (Inter ` B') = k" by auto
        then obtain k where
            "\ka\K. k ka \ {b. finite b \ b \ B} \ \(Inter ` (k ka)) = ka"
          unfolding bchoice_iff ..
        then show "\B'\{b. finite b \ b \ B}. \ (Inter ` B') = \K"
          by (intro exI[of _ "\(k ` K)"]) auto
      next
        case (Basis S)
        then show ?case
          by (intro exI[of _ "{{S}}"]) auto
      qed
      then have "(\B'\Inter ` {b. finite b \ b \ B}. \B' = S)"
        unfolding subset_image_iff by blast }
    then show "topological_basis ?B"
      unfolding topological_basis_def
      by (safe intro!: open_Inter)
         (simp_all add: B generate_topology.Basis subset_eq)
  qed
qed


end

lemma univ_second_countable:
  obtains \<B> :: "'a::second_countable_topology set set"
  where "countable \" "\C. C \ \ \ open C"
       "\S. open S \ \U. U \ \ \ S = \U"
by (metis ex_countable_basis topological_basis_def)

proposition Lindelof:
  fixes \<F> :: "'a::second_countable_topology set set"
  assumes \<F>: "\<And>S. S \<in> \<F> \<Longrightarrow> open S"
  obtains \<F>' where "\<F>' \<subseteq> \<F>" "countable \<F>'" "\<Union>\<F>' = \<Union>\<F>"
proof -
  obtain \<B> :: "'a set set"
    where "countable \" "\C. C \ \ \ open C"
      and \<B>: "\<And>S. open S \<Longrightarrow> \<exists>U. U \<subseteq> \<B> \<and> S = \<Union>U"
    using univ_second_countable by blast
  define \<D> where "\<D> \<equiv> {S. S \<in> \<B> \<and> (\<exists>U. U \<in> \<F> \<and> S \<subseteq> U)}"
  have "countable \"
    apply (rule countable_subset [OF _ \<open>countable \<B>\<close>])
    apply (force simp: \<D>_def)
    done
  have "\S. \U. S \ \ \ U \ \ \ S \ U"
    by (simp add: \<D>_def)
  then obtain G where G: "\S. S \ \ \ G S \ \ \ S \ G S"
    by metis
  have "\\ \ \\"
    unfolding \<D>_def by (blast dest: \<F> \<B>)
  moreover have "\\ \ \\"
    using \<D>_def by blast
  ultimately have eq1: "\\ = \\" ..
  have eq2: "\\ = \ (G ` \)"
    using G eq1 by auto
  show ?thesis
    apply (rule_tac \<F>' = "G ` \<D>" in that)
    using G \<open>countable \<D>\<close>
    by (auto simp: eq1 eq2)
qed

lemma countable_disjoint_open_subsets:
  fixes \<F> :: "'a::second_countable_topology set set"
  assumes "\S. S \ \ \ open S" and pw: "pairwise disjnt \"
    shows "countable \"
proof -
  obtain \<F>' where "\<F>' \<subseteq> \<F>" "countable \<F>'" "\<Union>\<F>' = \<Union>\<F>"
    by (meson assms Lindelof)
  with pw have "\ \ insert {} \'"
    by (fastforce simp add: pairwise_def disjnt_iff)
  then show ?thesis
    by (simp add: \<open>countable \<F>'\<close> countable_subset)
qed

sublocale second_countable_topology <
  countable_basis "open" "SOME B. countable B \ topological_basis B"
  using someI_ex[OF ex_countable_basis]
  by unfold_locales safe


instance prod :: (second_countable_topology, second_countable_topology) second_countable_topology
proof
  obtain A :: "'a set set" where "countable A" "topological_basis A"
    using ex_countable_basis by auto
  moreover
  obtain B :: "'b set set" where "countable B" "topological_basis B"
    using ex_countable_basis by auto
  ultimately show "\B::('a \ 'b) set set. countable B \ open = generate_topology B"
    by (auto intro!: exI[of _ "(\(a, b). a \ b) ` (A \ B)"] topological_basis_prod
      topological_basis_imp_subbasis)
qed

instance second_countable_topology \<subseteq> first_countable_topology
proof
  fix x :: 'a
  define B :: "'a set set" where "B = (SOME B. countable B \ topological_basis B)"
  then have B: "countable B" "topological_basis B"
    using countable_basis is_basis
    by (auto simp: countable_basis is_basis)
  then show "\A::nat \ 'a set.
    (\<forall>i. x \<in> A i \<and> open (A i)) \<and> (\<forall>S. open S \<and> x \<in> S \<longrightarrow> (\<exists>i. A i \<subseteq> S))"
    by (intro first_countableI[of "{b\B. x \ b}"])
       (fastforce simp: topological_space_class.topological_basis_def)+
qed

instance nat :: second_countable_topology
proof
  show "\B::nat set set. countable B \ open = generate_topology B"
    by (intro exI[of _ "range lessThan \ range greaterThan"]) (auto simp: open_nat_def)
qed

lemma countable_separating_set_linorder1:
  shows "\B::('a::{linorder_topology, second_countable_topology} set). countable B \ (\x y. x < y \ (\b \ B. x < b \ b \ y))"
proof -
  obtain A::"'a set set" where "countable A" "topological_basis A" using ex_countable_basis by auto
  define B1 where "B1 = {(LEAST x. x \ U)| U. U \ A}"
  then have "countable B1" using \<open>countable A\<close> by (simp add: Setcompr_eq_image)
  define B2 where "B2 = {(SOME x. x \ U)| U. U \ A}"
  then have "countable B2" using \<open>countable A\<close> by (simp add: Setcompr_eq_image)
  have "\b \ B1 \ B2. x < b \ b \ y" if "x < y" for x y
  proof (cases)
    assume "\z. x < z \ z < y"
    then obtain z where z: "x < z \ z < y" by auto
    define U where "U = {x<..
    then have "open U" by simp
    moreover have "z \ U" using z U_def by simp
    ultimately obtain V where "V \ A" "z \ V" "V \ U"
      using topological_basisE[OF \<open>topological_basis A\<close>] by auto
    define w where "w = (SOME x. x \ V)"
    then have "w \ V" using \z \ V\ by (metis someI2)
    then have "x < w \ w \ y" using \w \ V\ \V \ U\ U_def by fastforce
    moreover have "w \ B1 \ B2" using w_def B2_def \V \ A\ by auto
    ultimately show ?thesis by auto
  next
    assume "\(\z. x < z \ z < y)"
    then have *: "\z. z > x \ z \ y" by auto
    define U where "U = {x<..}"
    then have "open U" by simp
    moreover have "y \ U" using \x < y\ U_def by simp
    ultimately obtain "V" where "V \ A" "y \ V" "V \ U"
      using topological_basisE[OF \<open>topological_basis A\<close>] by auto
    have "U = {y..}" unfolding U_def using * \<open>x < y\<close> by auto
    then have "V \ {y..}" using \V \ U\ by simp
    then have "(LEAST w. w \ V) = y" using \y \ V\ by (meson Least_equality atLeast_iff subsetCE)
    then have "y \ B1 \ B2" using \V \ A\ B1_def by auto
    moreover have "x < y \ y \ y" using \x < y\ by simp
    ultimately show ?thesis by auto
  qed
  moreover have "countable (B1 \ B2)" using \countable B1\ \countable B2\ by simp
  ultimately show ?thesis by auto
qed

lemma countable_separating_set_linorder2:
  shows "\B::('a::{linorder_topology, second_countable_topology} set). countable B \ (\x y. x < y \ (\b \ B. x \ b \ b < y))"
proof -
  obtain A::"'a set set" where "countable A" "topological_basis A" using ex_countable_basis by auto
  define B1 where "B1 = {(GREATEST x. x \ U) | U. U \ A}"
  then have "countable B1" using \<open>countable A\<close> by (simp add: Setcompr_eq_image)
  define B2 where "B2 = {(SOME x. x \ U)| U. U \ A}"
  then have "countable B2" using \<open>countable A\<close> by (simp add: Setcompr_eq_image)
  have "\b \ B1 \ B2. x \ b \ b < y" if "x < y" for x y
  proof (cases)
    assume "\z. x < z \ z < y"
    then obtain z where z: "x < z \ z < y" by auto
    define U where "U = {x<..
    then have "open U" by simp
    moreover have "z \ U" using z U_def by simp
    ultimately obtain "V" where "V \ A" "z \ V" "V \ U"
      using topological_basisE[OF \<open>topological_basis A\<close>] by auto
    define w where "w = (SOME x. x \ V)"
    then have "w \ V" using \z \ V\ by (metis someI2)
    then have "x \ w \ w < y" using \w \ V\ \V \ U\ U_def by fastforce
    moreover have "w \ B1 \ B2" using w_def B2_def \V \ A\ by auto
    ultimately show ?thesis by auto
  next
    assume "\(\z. x < z \ z < y)"
    then have *: "\z. z < y \ z \ x" using leI by blast
    define U where "U = {..
    then have "open U" by simp
    moreover have "x \ U" using \x < y\ U_def by simp
    ultimately obtain "V" where "V \ A" "x \ V" "V \ U"
      using topological_basisE[OF \<open>topological_basis A\<close>] by auto
    have "U = {..x}" unfolding U_def using * \<open>x < y\<close> by auto
    then have "V \ {..x}" using \V \ U\ by simp
    then have "(GREATEST x. x \ V) = x" using \x \ V\ by (meson Greatest_equality atMost_iff subsetCE)
    then have "x \ B1 \ B2" using \V \ A\ B1_def by auto
    moreover have "x \ x \ x < y" using \x < y\ by simp
    ultimately show ?thesis by auto
  qed
  moreover have "countable (B1 \ B2)" using \countable B1\ \countable B2\ by simp
  ultimately show ?thesis by auto
qed

lemma countable_separating_set_dense_linorder:
  shows "\B::('a::{linorder_topology, dense_linorder, second_countable_topology} set). countable B \ (\x y. x < y \ (\b \ B. x < b \ b < y))"
proof -
  obtain B::"'a set" where B: "countable B" "\x y. x < y \ (\b \ B. x < b \ b \ y)"
    using countable_separating_set_linorder1 by auto
  have "\b \ B. x < b \ b < y" if "x < y" for x y
  proof -
    obtain z where "x < z" "z < y" using \<open>x < y\<close> dense by blast
    then obtain b where "b \ B" "x < b \ b \ z" using B(2) by auto
    then have "x < b \ b < y" using \z < y\ by auto
    then show ?thesis using \<open>b \<in> B\<close> by auto
  qed
  then show ?thesis using B(1) by auto
qed


subsection \<open>Polish spaces\<close>

text \<open>Textbooks define Polish spaces as completely metrizable.
  We assume the topology to be complete for a given metric.\<close>

class polish_space = complete_space + second_countable_topology


subsection \<open>Limit Points\<close>

definition\<^marker>\<open>tag important\<close> (in topological_space) islimpt:: "'a \<Rightarrow> 'a set \<Rightarrow> bool"  (infixr "islimpt" 60)
  where "x islimpt S \ (\T. x\T \ open T \ (\y\S. y\T \ y\x))"

lemma islimptI:
  assumes "\T. x \ T \ open T \ \y\S. y \ T \ y \ x"
  shows "x islimpt S"
  using assms unfolding islimpt_def by auto

lemma islimptE:
  assumes "x islimpt S" and "x \ T" and "open T"
  obtains y where "y \ S" and "y \ T" and "y \ x"
  using assms unfolding islimpt_def by auto

lemma islimpt_iff_eventually: "x islimpt S \ \ eventually (\y. y \ S) (at x)"
  unfolding islimpt_def eventually_at_topological by auto

lemma islimpt_subset: "x islimpt S \ S \ T \ x islimpt T"
  unfolding islimpt_def by fast

lemma islimpt_UNIV_iff: "x islimpt UNIV \ \ open {x}"
  unfolding islimpt_def by (safe, fast, case_tac "T = {x}", fast, fast)

lemma islimpt_punctured: "x islimpt S = x islimpt (S-{x})"
  unfolding islimpt_def by blast

text \<open>A perfect space has no isolated points.\<close>

lemma islimpt_UNIV [simp, intro]: "x islimpt UNIV"
  for x :: "'a::perfect_space"
  unfolding islimpt_UNIV_iff by (rule not_open_singleton)

lemma closed_limpt: "closed S \ (\x. x islimpt S \ x \ S)"
  unfolding closed_def
  apply (subst open_subopen)
  apply (simp add: islimpt_def subset_eq)
  apply (metis ComplE ComplI)
  done

lemma islimpt_EMPTY[simp]: "\ x islimpt {}"
  by (auto simp: islimpt_def)

lemma islimpt_Un: "x islimpt (S \ T) \ x islimpt S \ x islimpt T"
  by (simp add: islimpt_iff_eventually eventually_conj_iff)


lemma islimpt_insert:
  fixes x :: "'a::t1_space"
  shows "x islimpt (insert a s) \ x islimpt s"
proof
  assume *: "x islimpt (insert a s)"
  show "x islimpt s"
  proof (rule islimptI)
    fix t
    assume t: "x \ t" "open t"
    show "\y\s. y \ t \ y \ x"
    proof (cases "x = a")
      case True
      obtain y where "y \ insert a s" "y \ t" "y \ x"
        using * t by (rule islimptE)
      with \<open>x = a\<close> show ?thesis by auto
    next
      case False
      with t have t': "x \ t - {a}" "open (t - {a})"
        by (simp_all add: open_Diff)
      obtain y where "y \ insert a s" "y \ t - {a}" "y \ x"
        using * t' by (rule islimptE)
      then show ?thesis by auto
    qed
  qed
next
  assume "x islimpt s"
  then show "x islimpt (insert a s)"
    by (rule islimpt_subset) auto
qed

lemma islimpt_finite:
  fixes x :: "'a::t1_space"
  shows "finite s \ \ x islimpt s"
  by (induct set: finite) (simp_all add: islimpt_insert)

lemma islimpt_Un_finite:
  fixes x :: "'a::t1_space"
  shows "finite s \ x islimpt (s \ t) \ x islimpt t"
  by (simp add: islimpt_Un islimpt_finite)

lemma islimpt_eq_acc_point:
  fixes l :: "'a :: t1_space"
  shows "l islimpt S \ (\U. l\U \ open U \ infinite (U \ S))"
proof (safe intro!: islimptI)
  fix U
  assume "l islimpt S" "l \ U" "open U" "finite (U \ S)"
  then have "l islimpt S" "l \ (U - (U \ S - {l}))" "open (U - (U \ S - {l}))"
    by (auto intro: finite_imp_closed)
  then show False
    by (rule islimptE) auto
next
  fix T
  assume *: "\U. l\U \ open U \ infinite (U \ S)" "l \ T" "open T"
  then have "infinite (T \ S - {l})"
    by auto
  then have "\x. x \ (T \ S - {l})"
    unfolding ex_in_conv by (intro notI) simp
  then show "\y\S. y \ T \ y \ l"
    by auto
qed

lemma acc_point_range_imp_convergent_subsequence:
  fixes l :: "'a :: first_countable_topology"
  assumes l: "\U. l\U \ open U \ infinite (U \ range f)"
  shows "\r::nat\nat. strict_mono r \ (f \ r) \ l"
proof -
  from countable_basis_at_decseq[of l]
  obtain A where A:
      "\i. open (A i)"
      "\i. l \ A i"
      "\S. open S \ l \ S \ eventually (\i. A i \ S) sequentially"
    by blast
  define s where "s n i = (SOME j. i < j \ f j \ A (Suc n))" for n i
  {
    fix n i
    have "infinite (A (Suc n) \ range f - f`{.. i})"
      using l A by auto
    then have "\x. x \ A (Suc n) \ range f - f`{.. i}"
      unfolding ex_in_conv by (intro notI) simp
    then have "\j. f j \ A (Suc n) \ j \ {.. i}"
      by auto
    then have "\a. i < a \ f a \ A (Suc n)"
      by (auto simp: not_le)
    then have "i < s n i" "f (s n i) \ A (Suc n)"
      unfolding s_def by (auto intro: someI2_ex)
  }
  note s = this
  define r where "r = rec_nat (s 0 0) s"
  have "strict_mono r"
    by (auto simp: r_def s strict_mono_Suc_iff)
  moreover
  have "(\n. f (r n)) \ l"
  proof (rule topological_tendstoI)
    fix S
    assume "open S" "l \ S"
    with A(3) have "eventually (\i. A i \ S) sequentially"
      by auto
    moreover
    {
      fix i
      assume "Suc 0 \ i"
      then have "f (r i) \ A i"
        by (cases i) (simp_all add: r_def s)
    }
    then have "eventually (\i. f (r i) \ A i) sequentially"
      by (auto simp: eventually_sequentially)
    ultimately show "eventually (\i. f (r i) \ S) sequentially"
      by eventually_elim auto
  qed
  ultimately show "\r::nat\nat. strict_mono r \ (f \ r) \ l"
    by (auto simp: convergent_def comp_def)
qed

lemma islimpt_range_imp_convergent_subsequence:
  fixes l :: "'a :: {t1_space, first_countable_topology}"
  assumes l: "l islimpt (range f)"
  shows "\r::nat\nat. strict_mono r \ (f \ r) \ l"
  using l unfolding islimpt_eq_acc_point
  by (rule acc_point_range_imp_convergent_subsequence)

lemma sequence_unique_limpt:
  fixes f :: "nat \ 'a::t2_space"
  assumes "(f \ l) sequentially"
    and "l' islimpt (range f)"
  shows "l' = l"
proof (rule ccontr)
  assume "l' \ l"
  obtain s t where "open s" "open t" "l' \ s" "l \ t" "s \ t = {}"
    using hausdorff [OF \<open>l' \<noteq> l\<close>] by auto
  have "eventually (\n. f n \ t) sequentially"
    using assms(1) \<open>open t\<close> \<open>l \<in> t\<close> by (rule topological_tendstoD)
  then obtain N where "\n\N. f n \ t"
    unfolding eventually_sequentially by auto

  have "UNIV = {.. {N..}"
    by auto
  then have "l' islimpt (f ` ({.. {N..}))"
    using assms(2) by simp
  then have "l' islimpt (f ` {.. f ` {N..})"
    by (simp add: image_Un)
  then have "l' islimpt (f ` {N..})"
    by (simp add: islimpt_Un_finite)
  then obtain y where "y \ f ` {N..}" "y \ s" "y \ l'"
    using \<open>l' \<in> s\<close> \<open>open s\<close> by (rule islimptE)
  then obtain n where "N \ n" "f n \ s" "f n \ l'"
    by auto
  with \<open>\<forall>n\<ge>N. f n \<in> t\<close> have "f n \<in> s \<inter> t"
    by simp
  with \<open>s \<inter> t = {}\<close> show False
    by simp
qed


subsection \<open>Interior of a Set\<close>

definition\<^marker>\<open>tag important\<close> interior :: "('a::topological_space) set \<Rightarrow> 'a set" where
"interior S = \{T. open T \ T \ S}"

lemma interiorI [intro?]:
  assumes "open T" and "x \ T" and "T \ S"
  shows "x \ interior S"
  using assms unfolding interior_def by fast

lemma interiorE [elim?]:
  assumes "x \ interior S"
  obtains T where "open T" and "x \ T" and "T \ S"
  using assms unfolding interior_def by fast

lemma open_interior [simp, intro]: "open (interior S)"
  by (simp add: interior_def open_Union)

lemma interior_subset: "interior S \ S"
  by (auto simp: interior_def)

lemma interior_maximal: "T \ S \ open T \ T \ interior S"
  by (auto simp: interior_def)

lemma interior_open: "open S \ interior S = S"
  by (intro equalityI interior_subset interior_maximal subset_refl)

lemma interior_eq: "interior S = S \ open S"
  by (metis open_interior interior_open)

lemma open_subset_interior: "open S \ S \ interior T \ S \ T"
  by (metis interior_maximal interior_subset subset_trans)

lemma interior_empty [simp]: "interior {} = {}"
  using open_empty by (rule interior_open)

lemma interior_UNIV [simp]: "interior UNIV = UNIV"
  using open_UNIV by (rule interior_open)

lemma interior_interior [simp]: "interior (interior S) = interior S"
  using open_interior by (rule interior_open)

lemma interior_mono: "S \ T \ interior S \ interior T"
  by (auto simp: interior_def)

lemma interior_unique:
  assumes "T \ S" and "open T"
  assumes "\T'. T' \ S \ open T' \ T' \ T"
  shows "interior S = T"
  by (intro equalityI assms interior_subset open_interior interior_maximal)

lemma interior_singleton [simp]: "interior {a} = {}"
  for a :: "'a::perfect_space"
  by (meson interior_eq interior_subset not_open_singleton subset_singletonD)

lemma interior_Int [simp]: "interior (S \ T) = interior S \ interior T"
  by (meson Int_mono Int_subset_iff antisym_conv interior_maximal interior_subset open_Int open_interior)

lemma eventually_nhds_in_nhd: "x \ interior s \ eventually (\y. y \ s) (nhds x)"
  using interior_subset[of s] by (subst eventually_nhds) blast

lemma interior_limit_point [intro]:
  fixes x :: "'a::perfect_space"
  assumes x: "x \ interior S"
  shows "x islimpt S"
  using x islimpt_UNIV [of x]
  unfolding interior_def islimpt_def
  apply (clarsimp, rename_tac T T')
  apply (drule_tac x="T \ T'" in spec)
  apply (auto simp: open_Int)
  done

lemma interior_closed_Un_empty_interior:
  assumes cS: "closed S"
    and iT: "interior T = {}"
  shows "interior (S \ T) = interior S"
proof
  show "interior S \ interior (S \ T)"
    by (rule interior_mono) (rule Un_upper1)
  show "interior (S \ T) \ interior S"
  proof
    fix x
    assume "x \ interior (S \ T)"
    then obtain R where "open R" "x \ R" "R \ S \ T" ..
    show "x \ interior S"
    proof (rule ccontr)
      assume "x \ interior S"
      with \<open>x \<in> R\<close> \<open>open R\<close> obtain y where "y \<in> R - S"
        unfolding interior_def by fast
      from \<open>open R\<close> \<open>closed S\<close> have "open (R - S)"
        by (rule open_Diff)
      from \<open>R \<subseteq> S \<union> T\<close> have "R - S \<subseteq> T"
        by fast
      from \<open>y \<in> R - S\<close> \<open>open (R - S)\<close> \<open>R - S \<subseteq> T\<close> \<open>interior T = {}\<close> show False
        unfolding interior_def by fast
    qed
  qed
qed

lemma interior_Times: "interior (A \ B) = interior A \ interior B"
proof (rule interior_unique)
  show "interior A \ interior B \ A \ B"
    by (intro Sigma_mono interior_subset)
  show "open (interior A \ interior B)"
    by (intro open_Times open_interior)
  fix T
  assume "T \ A \ B" and "open T"
  then show "T \ interior A \ interior B"
  proof safe
    fix x y
    assume "(x, y) \ T"
    then obtain C D where "open C" "open D" "C \ D \ T" "x \ C" "y \ D"
      using \<open>open T\<close> unfolding open_prod_def by fast
    then have "open C" "open D" "C \ A" "D \ B" "x \ C" "y \ D"
      using \<open>T \<subseteq> A \<times> B\<close> by auto
    then show "x \ interior A" and "y \ interior B"
      by (auto intro: interiorI)
  qed
qed

lemma interior_Ici:
  fixes x :: "'a :: {dense_linorder,linorder_topology}"
  assumes "b < x"
  shows "interior {x ..} = {x <..}"
proof (rule interior_unique)
  fix T
  assume "T \ {x ..}" "open T"
  moreover have "x \ T"
  proof
    assume "x \ T"
    obtain y where "y < x" "{y <.. x} \ T"
      using open_left[OF \<open>open T\<close> \<open>x \<in> T\<close> \<open>b < x\<close>] by auto
    with dense[OF \<open>y < x\<close>] obtain z where "z \<in> T" "z < x"
      by (auto simp: subset_eq Ball_def)
    with \<open>T \<subseteq> {x ..}\<close> show False by auto
  qed
  ultimately show "T \ {x <..}"
    by (auto simp: subset_eq less_le)
qed auto

lemma interior_Iic:
  fixes x :: "'a ::{dense_linorder,linorder_topology}"
  assumes "x < b"
  shows "interior {.. x} = {..< x}"
proof (rule interior_unique)
  fix T
  assume "T \ {.. x}" "open T"
  moreover have "x \ T"
  proof
    assume "x \ T"
    obtain y where "x < y" "{x ..< y} \ T"
      using open_right[OF \<open>open T\<close> \<open>x \<in> T\<close> \<open>x < b\<close>] by auto
    with dense[OF \<open>x < y\<close>] obtain z where "z \<in> T" "x < z"
      by (auto simp: subset_eq Ball_def less_le)
    with \<open>T \<subseteq> {.. x}\<close> show False by auto
  qed
  ultimately show "T \ {..< x}"
    by (auto simp: subset_eq less_le)
qed auto

lemma countable_disjoint_nonempty_interior_subsets:
  fixes \<F> :: "'a::second_countable_topology set set"
  assumes pw: "pairwise disjnt \" and int: "\S. \S \ \; interior S = {}\ \ S = {}"
  shows "countable \"
proof (rule countable_image_inj_on)
  have "disjoint (interior ` \)"
    using pw by (simp add: disjoint_image_subset interior_subset)
  then show "countable (interior ` \)"
    by (auto intro: countable_disjoint_open_subsets)
  show "inj_on interior \"
    using pw apply (clarsimp simp: inj_on_def pairwise_def)
    apply (metis disjnt_def disjnt_subset1 inf.orderE int interior_subset)
    done
qed

subsection \<open>Closure of a Set\<close>

definition\<^marker>\<open>tag important\<close> closure :: "('a::topological_space) set \<Rightarrow> 'a set" where
"closure S = S \ {x . x islimpt S}"

lemma interior_closure: "interior S = - (closure (- S))"
  by (auto simp: interior_def closure_def islimpt_def)

lemma closure_interior: "closure S = - interior (- S)"
  by (simp add: interior_closure)

lemma closed_closure[simp, intro]: "closed (closure S)"
  by (simp add: closure_interior closed_Compl)

lemma closure_subset: "S \ closure S"
  by (simp add: closure_def)

lemma closure_hull: "closure S = closed hull S"
  by (auto simp: hull_def closure_interior interior_def)

lemma closure_eq: "closure S = S \ closed S"
  unfolding closure_hull using closed_Inter by (rule hull_eq)

lemma closure_closed [simp]: "closed S \ closure S = S"
  by (simp only: closure_eq)

lemma closure_closure [simp]: "closure (closure S) = closure S"
  unfolding closure_hull by (rule hull_hull)

lemma closure_mono: "S \ T \ closure S \ closure T"
  unfolding closure_hull by (rule hull_mono)

lemma closure_minimal: "S \ T \ closed T \ closure S \ T"
  unfolding closure_hull by (rule hull_minimal)

lemma closure_unique:
  assumes "S \ T"
    and "closed T"
    and "\T'. S \ T' \ closed T' \ T \ T'"
  shows "closure S = T"
  using assms unfolding closure_hull by (rule hull_unique)

lemma closure_empty [simp]: "closure {} = {}"
  using closed_empty by (rule closure_closed)

lemma closure_UNIV [simp]: "closure UNIV = UNIV"
  using closed_UNIV by (rule closure_closed)

lemma closure_Un [simp]: "closure (S \ T) = closure S \ closure T"
  by (simp add: closure_interior)

lemma closure_eq_empty [iff]: "closure S = {} \ S = {}"
  using closure_empty closure_subset[of S] by blast

lemma closure_subset_eq: "closure S \ S \ closed S"
  using closure_eq[of S] closure_subset[of S] by simp

lemma open_Int_closure_eq_empty: "open S \ (S \ closure T) = {} \ S \ T = {}"
  using open_subset_interior[of S "- T"]
  using interior_subset[of "- T"]
  by (auto simp: closure_interior)

lemma open_Int_closure_subset: "open S \ S \ closure T \ closure (S \ T)"
proof
  fix x
  assume *: "open S" "x \ S \ closure T"
  have "x islimpt (S \ T)" if **: "x islimpt T"
  proof (rule islimptI)
    fix A
    assume "x \ A" "open A"
    with * have "x \ A \ S" "open (A \ S)"
      by (simp_all add: open_Int)
    with ** obtain y where "y \ T" "y \ A \ S" "y \ x"
      by (rule islimptE)
    then have "y \ S \ T" "y \ A \ y \ x"
      by simp_all
    then show "\y\(S \ T). y \ A \ y \ x" ..
  qed
  with * show "x \ closure (S \ T)"
    unfolding closure_def by blast
qed

lemma closure_complement: "closure (- S) = - interior S"
  by (simp add: closure_interior)

lemma interior_complement: "interior (- S) = - closure S"
  by (simp add: closure_interior)

lemma interior_diff: "interior(S - T) = interior S - closure T"
  by (simp add: Diff_eq interior_complement)

lemma closure_Times: "closure (A \ B) = closure A \ closure B"
proof (rule closure_unique)
  show "A \ B \ closure A \ closure B"
    by (intro Sigma_mono closure_subset)
  show "closed (closure A \ closure B)"
    by (intro closed_Times closed_closure)
  fix T
  assume "A \ B \ T" and "closed T"
  then show "closure A \ closure B \ T"
    apply (simp add: closed_def open_prod_def, clarify)
    apply (rule ccontr)
    apply (drule_tac x="(a, b)" in bspec, simp, clarify, rename_tac C D)
    apply (simp add: closure_interior interior_def)
    apply (drule_tac x=C in spec)
    apply (drule_tac x=D in spec, auto)
    done
qed

lemma closure_open_Int_superset:
  assumes "open S" "S \ closure T"
  shows "closure(S \ T) = closure S"
proof -
  have "closure S \ closure(S \ T)"
    by (metis assms closed_closure closure_minimal inf.orderE open_Int_closure_subset)
  then show ?thesis
    by (simp add: closure_mono dual_order.antisym)
qed

lemma closure_Int: "closure (\I) \ \{closure S |S. S \ I}"
proof -
  {
    fix y
    assume "y \ \I"
    then have y: "\S \ I. y \ S" by auto
    {
      fix S
      assume "S \ I"
      then have "y \ closure S"
        using closure_subset y by auto
    }
    then have "y \ \{closure S |S. S \ I}"
      by auto
  }
  then have "\I \ \{closure S |S. S \ I}"
    by auto
  moreover have "closed (\{closure S |S. S \ I})"
    unfolding closed_Inter closed_closure by auto
  ultimately show ?thesis using closure_hull[of "\I"]
    hull_minimal[of "\I" "\{closure S |S. S \ I}" "closed"] by auto
qed

lemma islimpt_in_closure: "(x islimpt S) = (x\closure(S-{x}))"
  unfolding closure_def using islimpt_punctured by blast

lemma connected_imp_connected_closure: "connected S \ connected (closure S)"
  by (rule connectedI) (meson closure_subset open_Int open_Int_closure_eq_empty subset_trans connectedD)

lemma bdd_below_closure:
  fixes A :: "real set"
  assumes "bdd_below A"
  shows "bdd_below (closure A)"
proof -
  from assms obtain m where "\x. x \ A \ m \ x"
    by (auto simp: bdd_below_def)
  then have "A \ {m..}" by auto
  then have "closure A \ {m..}"
    using closed_real_atLeast by (rule closure_minimal)
  then show ?thesis
    by (auto simp: bdd_below_def)
qed


subsection \<open>Frontier (also known as boundary)\<close>

definition\<^marker>\<open>tag important\<close> frontier :: "('a::topological_space) set \<Rightarrow> 'a set" where
"frontier S = closure S - interior S"

lemma frontier_closed [iff]: "closed (frontier S)"
  by (simp add: frontier_def closed_Diff)

lemma frontier_closures: "frontier S = closure S \ closure (- S)"
  by (auto simp: frontier_def interior_closure)

lemma frontier_Int: "frontier(S \ T) = closure(S \ T) \ (frontier S \ frontier T)"
proof -
  have "closure (S \ T) \ closure S" "closure (S \ T) \ closure T"
    by (simp_all add: closure_mono)
  then show ?thesis
    by (auto simp: frontier_closures)
qed

lemma frontier_Int_subset: "frontier(S \ T) \ frontier S \ frontier T"
  by (auto simp: frontier_Int)

lemma frontier_Int_closed:
  assumes "closed S" "closed T"
  shows "frontier(S \ T) = (frontier S \ T) \ (S \ frontier T)"
proof -
  have "closure (S \ T) = T \ S"
    using assms by (simp add: Int_commute closed_Int)
  moreover have "T \ (closure S \ closure (- S)) = frontier S \ T"
    by (simp add: Int_commute frontier_closures)
  ultimately show ?thesis
    by (simp add: Int_Un_distrib Int_assoc Int_left_commute assms frontier_closures)
qed

lemma frontier_subset_closed: "closed S \ frontier S \ S"
  by (metis frontier_def closure_closed Diff_subset)

lemma frontier_empty [simp]: "frontier {} = {}"
  by (simp add: frontier_def)

lemma frontier_subset_eq: "frontier S \ S \ closed S"
proof -
  {
    assume "frontier S \ S"
    then have "closure S \ S"
      using interior_subset unfolding frontier_def by auto
    then have "closed S"
      using closure_subset_eq by auto
  }
  then show ?thesis using frontier_subset_closed[of S] ..
qed

lemma frontier_complement [simp]: "frontier (- S) = frontier S"
  by (auto simp: frontier_def closure_complement interior_complement)

lemma frontier_Un_subset: "frontier(S \ T) \ frontier S \ frontier T"
  by (metis compl_sup frontier_Int_subset frontier_complement)

lemma frontier_disjoint_eq: "frontier S \ S = {} \ open S"
  using frontier_complement frontier_subset_eq[of "- S"]
  unfolding open_closed by auto

lemma frontier_UNIV [simp]: "frontier UNIV = {}"
  using frontier_complement frontier_empty by fastforce

lemma frontier_interiors: "frontier s = - interior(s) - interior(-s)"
  by (simp add: Int_commute frontier_def interior_closure)

lemma frontier_interior_subset: "frontier(interior S) \ frontier S"
  by (simp add: Diff_mono frontier_interiors interior_mono interior_subset)

lemma closure_Un_frontier: "closure S = S \ frontier S"
proof -
  have "S \ interior S = S"
    using interior_subset by auto
  then show ?thesis
    using closure_subset by (auto simp: frontier_def)
qed


subsection\<^marker>\<open>tag unimportant\<close> \<open>Filters and the ``eventually true'' quantifier\<close>

text \<open>Identify Trivial limits, where we can't approach arbitrarily closely.\<close>

lemma trivial_limit_within: "trivial_limit (at a within S) \ \ a islimpt S"
proof
  assume "trivial_limit (at a within S)"
  then show "\ a islimpt S"
    unfolding trivial_limit_def
    unfolding eventually_at_topological
    unfolding islimpt_def
    apply (clarsimp simp add: set_eq_iff)
    apply (rename_tac T, rule_tac x=T in exI)
    apply (clarsimp, drule_tac x=y in bspec, simp_all)
    done
next
  assume "\ a islimpt S"
  then show "trivial_limit (at a within S)"
    unfolding trivial_limit_def eventually_at_topological islimpt_def
    by metis
qed

lemma trivial_limit_at_iff: "trivial_limit (at a) \ \ a islimpt UNIV"
  using trivial_limit_within [of a UNIV] by simp

lemma trivial_limit_at: "\ trivial_limit (at a)"
  for a :: "'a::perfect_space"
  by (rule at_neq_bot)

lemma not_trivial_limit_within: "\ trivial_limit (at x within S) = (x \ closure (S - {x}))"
  using islimpt_in_closure by (metis trivial_limit_within)

lemma not_in_closure_trivial_limitI:
  "x \ closure s \ trivial_limit (at x within s)"
  using not_trivial_limit_within[of x s]
  by safe (metis Diff_empty Diff_insert0 closure_subset contra_subsetD)

lemma filterlim_at_within_closure_implies_filterlim: "filterlim f l (at x within s)"
  if "x \ closure s \ filterlim f l (at x within s)"
  by (metis bot.extremum filterlim_filtercomap filterlim_mono not_in_closure_trivial_limitI that)

lemma at_within_eq_bot_iff: "at c within A = bot \ c \ closure (A - {c})"
  using not_trivial_limit_within[of c A] by blast

text \<open>Some property holds "sufficiently close" to the limit point.\<close>

lemma trivial_limit_eventually: "trivial_limit net \ eventually P net"
  by simp

lemma trivial_limit_eq: "trivial_limit net \ (\P. eventually P net)"
  by (simp add: filter_eq_iff)

lemma Lim_topological:
  "(f \ l) net \
    trivial_limit net \<or> (\<forall>S. open S \<longrightarrow> l \<in> S \<longrightarrow> eventually (\<lambda>x. f x \<in> S) net)"
  unfolding tendsto_def trivial_limit_eq by auto

lemma eventually_within_Un:
  "eventually P (at x within (s \ t)) \
    eventually P (at x within s) \<and> eventually P (at x within t)"
  unfolding eventually_at_filter
  by (auto elim!: eventually_rev_mp)

lemma Lim_within_union:
 "(f \ l) (at x within (s \ t)) \
  (f \<longlongrightarrow> l) (at x within s) \<and> (f \<longlongrightarrow> l) (at x within t)"
  unfolding tendsto_def
  by (auto simp: eventually_within_Un)


subsection \<open>Limits\<close>

text \<open>The expected monotonicity property.\<close>

lemma Lim_Un:
  assumes "(f \ l) (at x within S)" "(f \ l) (at x within T)"
  shows "(f \ l) (at x within (S \ T))"
  using assms unfolding at_within_union by (rule filterlim_sup)

lemma Lim_Un_univ:
  "(f \ l) (at x within S) \ (f \ l) (at x within T) \
    S \<union> T = UNIV \<Longrightarrow> (f \<longlongrightarrow> l) (at x)"
  by (metis Lim_Un)

text \<open>Interrelations between restricted and unrestricted limits.\<close>

lemma Lim_at_imp_Lim_at_within: "(f \ l) (at x) \ (f \ l) (at x within S)"
  by (metis order_refl filterlim_mono subset_UNIV at_le)

lemma eventually_within_interior:
  assumes "x \ interior S"
  shows "eventually P (at x within S) \ eventually P (at x)"
  (is "?lhs = ?rhs")
proof
  from assms obtain T where T: "open T" "x \ T" "T \ S" ..
  {
    assume ?lhs
    then obtain A where "open A" and "x \ A" and "\y\A. y \ x \ y \ S \ P y"
      by (auto simp: eventually_at_topological)
    with T have "open (A \ T)" and "x \ A \ T" and "\y \ A \ T. y \ x \ P y"
      by auto
    then show ?rhs
      by (auto simp: eventually_at_topological)
  next
    assume ?rhs
    then show ?lhs
      by (auto elim: eventually_mono simp: eventually_at_filter)
  }
qed

lemma at_within_interior: "x \ interior S \ at x within S = at x"
  unfolding filter_eq_iff by (intro allI eventually_within_interior)

lemma Lim_within_LIMSEQ:
  fixes a :: "'a::first_countable_topology"
  assumes "\S. (\n. S n \ a \ S n \ T) \ S \ a \ (\n. X (S n)) \ L"
  shows "(X \ L) (at a within T)"
  using assms unfolding tendsto_def [where l=L]
  by (simp add: sequentially_imp_eventually_within)

lemma Lim_right_bound:
  fixes f :: "'a :: {linorder_topology, conditionally_complete_linorder, no_top} \
    'b::{linorder_topology, conditionally_complete_linorder}"
  assumes mono: "\a b. a \ I \ b \ I \ x < a \ a \ b \ f a \ f b"
    and bnd: "\a. a \ I \ x < a \ K \ f a"
  shows "(f \ Inf (f ` ({x<..} \ I))) (at x within ({x<..} \ I))"
proof (cases "{x<..} \ I = {}")
  case True
  then show ?thesis by simp
next
  case False
  show ?thesis
  proof (rule order_tendstoI)
    fix a
    assume a: "a < Inf (f ` ({x<..} \ I))"
    {
      fix y
      assume "y \ {x<..} \ I"
      with False bnd have "Inf (f ` ({x<..} \ I)) \ f y"
        by (auto intro!: cInf_lower bdd_belowI2)
      with a have "a < f y"
        by (blast intro: less_le_trans)
    }
    then show "eventually (\x. a < f x) (at x within ({x<..} \ I))"
      by (auto simp: eventually_at_filter intro: exI[of _ 1] zero_less_one)
  next
    fix a
    assume "Inf (f ` ({x<..} \ I)) < a"
    from cInf_lessD[OF _ this] False obtain y where y: "x < y" "y \ I" "f y < a"
      by auto
    then have "eventually (\x. x \ I \ f x < a) (at_right x)"
      unfolding eventually_at_right[OF \<open>x < y\<close>] by (metis less_imp_le le_less_trans mono)
    then show "eventually (\x. f x < a) (at x within ({x<..} \ I))"
      unfolding eventually_at_filter by eventually_elim simp
  qed
qed

(*could prove directly from islimpt_sequential_inj, but only for metric spaces*)
lemma islimpt_sequential:
  fixes x :: "'a::first_countable_topology"
  shows "x islimpt S \ (\f. (\n::nat. f n \ S - {x}) \ (f \ x) sequentially)"
    (is "?lhs = ?rhs")
proof
  assume ?lhs
  from countable_basis_at_decseq[of x] obtain A where A:
      "\i. open (A i)"
      "\i. x \ A i"
      "\S. open S \ x \ S \ eventually (\i. A i \ S) sequentially"
    by blast
  define f where "f n = (SOME y. y \ S \ y \ A n \ x \ y)" for n
  {
    fix n
    from \<open>?lhs\<close> have "\<exists>y. y \<in> S \<and> y \<in> A n \<and> x \<noteq> y"
      unfolding islimpt_def using A(1,2)[of n] by auto
    then have "f n \ S \ f n \ A n \ x \ f n"
      unfolding f_def by (rule someI_ex)
    then have "f n \ S" "f n \ A n" "x \ f n" by auto
  }
  then have "\n. f n \ S - {x}" by auto
  moreover have "(\n. f n) \ x"
  proof (rule topological_tendstoI)
    fix S
    assume "open S" "x \ S"
    from A(3)[OF this] \<open>\<And>n. f n \<in> A n\<close>
    show "eventually (\x. f x \ S) sequentially"
      by (auto elim!: eventually_mono)
  qed
  ultimately show ?rhs by fast
next
  assume ?rhs
  then obtain f :: "nat \ 'a" where f: "\n. f n \ S - {x}" and lim: "f \ x"
    by auto
  show ?lhs
    unfolding islimpt_def
  proof safe
    fix T
    assume "open T" "x \ T"
    from lim[THEN topological_tendstoD, OF this] f
    show "\y\S. y \ T \ y \ x"
      unfolding eventually_sequentially by auto
  qed
qed

text\<open>These are special for limits out of the same topological space.\<close>

lemma Lim_within_id: "(id \ a) (at a within s)"
  unfolding id_def by (rule tendsto_ident_at)

lemma Lim_at_id: "(id \ a) (at a)"
  unfolding id_def by (rule tendsto_ident_at)

text\<open>It's also sometimes useful to extract the limit point from the filter.\<close>

abbreviation netlimit :: "'a::t2_space filter \ 'a"
  where "netlimit F \ Lim F (\x. x)"

lemma netlimit_at [simp]:
  fixes a :: "'a::{perfect_space,t2_space}"
  shows "netlimit (at a) = a"
  using Lim_ident_at [of a UNIV] by simp

lemma lim_within_interior:
  "x \ interior S \ (f \ l) (at x within S) \ (f \ l) (at x)"
  by (metis at_within_interior)

lemma netlimit_within_interior:
  fixes x :: "'a::{t2_space,perfect_space}"
  assumes "x \ interior S"
  shows "netlimit (at x within S) = x"
  using assms by (metis at_within_interior netlimit_at)

text\<open>Useful lemmas on closure and set of possible sequential limits.\<close>

lemma closure_sequential:
  fixes l :: "'a::first_countable_topology"
  shows "l \ closure S \ (\x. (\n. x n \ S) \ (x \ l) sequentially)"
  (is "?lhs = ?rhs")
proof
  assume "?lhs"
  moreover
  {
    assume "l \ S"
    then have "?rhs" using tendsto_const[of l sequentially] by auto
  }
  moreover
  {
    assume "l islimpt S"
    then have "?rhs" unfolding islimpt_sequential by auto
  }
  ultimately show "?rhs"
    unfolding closure_def by auto
next
  assume "?rhs"
  then show "?lhs" unfolding closure_def islimpt_sequential by auto
qed

lemma closed_sequential_limits:
  fixes S :: "'a::first_countable_topology set"
  shows "closed S \ (\x l. (\n. x n \ S) \ (x \ l) sequentially \ l \ S)"
by (metis closure_sequential closure_subset_eq subset_iff)

lemma tendsto_If_within_closures:
  assumes f: "x \ s \ (closure s \ closure t) \
      (f \<longlongrightarrow> l x) (at x within s \<union> (closure s \<inter> closure t))"
  assumes g: "x \ t \ (closure s \ closure t) \
      (g \<longlongrightarrow> l x) (at x within t \<union> (closure s \<inter> closure t))"
  assumes "x \ s \ t"
  shows "((\x. if x \ s then f x else g x) \ l x) (at x within s \ t)"
proof -
  have *: "(s \ t) \ {x. x \ s} = s" "(s \ t) \ {x. x \ s} = t - s"
    by auto
  have "(f \ l x) (at x within s)"
    by (rule filterlim_at_within_closure_implies_filterlim)
       (use \<open>x \<in> _\<close> in \<open>auto simp: inf_commute closure_def intro: tendsto_within_subset[OF f]\<close>)
  moreover
  have "(g \ l x) (at x within t - s)"
    by (rule filterlim_at_within_closure_implies_filterlim)
      (use \<open>x \<in> _\<close> in
        \<open>auto intro!: tendsto_within_subset[OF g] simp: closure_def intro: islimpt_subset\<close>)
  ultimately show ?thesis
    by (intro filterlim_at_within_If) (simp_all only: *)
qed


subsection \<open>Compactness\<close>

lemma brouwer_compactness_lemma:
  fixes f :: "'a::topological_space \ 'b::real_normed_vector"
  assumes "compact s"
    and "continuous_on s f"
    and "\ (\x\s. f x = 0)"
  obtains d where "0 < d" and "\x\s. d \ norm (f x)"
proof (cases "s = {}")
  case True
  show thesis
    by (rule that [of 1]) (auto simp: True)
next
  case False
  have "continuous_on s (norm \ f)"
    by (rule continuous_intros continuous_on_norm assms(2))+
  with False obtain x where x: "x \ s" "\y\s. (norm \ f) x \ (norm \ f) y"
    using continuous_attains_inf[OF assms(1), of "norm \ f"]
    unfolding o_def
    by auto
  have "(norm \ f) x > 0"
    using assms(3) and x(1)
    by auto
  then show ?thesis
    by (rule that) (insert x(2), auto simp: o_def)
qed

subsubsection \<open>Bolzano-Weierstrass property\<close>

proposition Heine_Borel_imp_Bolzano_Weierstrass:
  assumes "compact s"
    and "infinite t"
    and "t \ s"
  shows "\x \ s. x islimpt t"
proof (rule ccontr)
  assume "\ (\x \ s. x islimpt t)"
  then obtain f where f: "\x\s. x \ f x \ open (f x) \ (\y\t. y \ f x \ y = x)"
    unfolding islimpt_def
    using bchoice[of s "\ x T. x \ T \ open T \ (\y\t. y \ T \ y = x)"]
    by auto
  obtain g where g: "g \ {t. \x. x \ s \ t = f x}" "finite g" "s \ \g"
    using assms(1)[unfolded compact_eq_Heine_Borel, THEN spec[where x="{t. \x. x\s \ t = f x}"]]
    using f by auto
  from g(1,3) have g':"\x\g. \xa \ s. x = f xa"
    by auto
  {
    fix x y
    assume "x \ t" "y \ t" "f x = f y"
    then have "x \ f x" "y \ f x \ y = x"
      using f[THEN bspec[where x=x]] and \<open>t \<subseteq> s\<close> by auto
    then have "x = y"
      using \<open>f x = f y\<close> and f[THEN bspec[where x=y]] and \<open>y \<in> t\<close> and \<open>t \<subseteq> s\<close>
      by auto
  }
  then have "inj_on f t"
    unfolding inj_on_def by simp
  then have "infinite (f ` t)"
    using assms(2) using finite_imageD by auto
  moreover
  {
    fix x
    assume "x \ t" "f x \ g"
    from g(3) assms(3) \<open>x \<in> t\<close> obtain h where "h \<in> g" and "x \<in> h"
      by auto
    then obtain y where "y \ s" "h = f y"
      using g'[THEN bspec[where x=h]] by auto
    then have "y = x"
      using f[THEN bspec[where x=y]] and \<open>x\<in>t\<close> and \<open>x\<in>h\<close>[unfolded \<open>h = f y\<close>]
      by auto
    then have False
      using \<open>f x \<notin> g\<close> \<open>h \<in> g\<close> unfolding \<open>h = f y\<close>
      by auto
  }
  then have "f ` t \ g" by auto
  ultimately show False
    using g(2) using finite_subset by auto
qed

lemma sequence_infinite_lemma:
  fixes f :: "nat \ 'a::t1_space"
  assumes "\n. f n \ l"
    and "(f \ l) sequentially"
  shows "infinite (range f)"
proof
  assume "finite (range f)"
  then have "l \ range f \ closed (range f)"
    using \<open>finite (range f)\<close> assms(1) finite_imp_closed by blast
  then have "eventually (\n. f n \ - range f) sequentially"
    by (metis Compl_iff assms(2) open_Compl topological_tendstoD)
  then show False
    unfolding eventually_sequentially by auto
qed

lemma Bolzano_Weierstrass_imp_closed:
  fixes s :: "'a::{first_countable_topology,t2_space} set"
--> --------------------

--> maximum size reached

--> --------------------

¤ Dauer der Verarbeitung: 0.54 Sekunden  (vorverarbeitet)  ¤





zum Wurzelverzeichnis wechseln
Diese Quellcodebibliothek enthält Beispiele in vielen Programmiersprachen. Man kann per Verzeichnistruktur darin navigieren. Der Code wird farblich markiert angezeigt.
zum Wurzelverzeichnis wechseln
sprechenden Kalenders

in der Quellcodebibliothek suchen




Laden

Fehler beim Verzeichnis:


in der Quellcodebibliothek suchen

Die farbliche Syntaxdarstellung ist noch experimentell.


Bot Zugriff