Zulip Chat Archive

Stream: maths

Topic: Ultrafilter map continuous


Adam Topaz (Sep 24 2020 at 22:28):

I have a 20 line proof of the following example:

import order.filter.ultrafilter
import topology.stone_cech

open filter
open topological_space

example {α β : Type*} (f : α  β) : continuous (ultrafilter.map f) := sorry

Is there a simpler proof for this? e.g. using docs#continuous_ultrafilter_extend ? I'm not as familiar with the topology parts of mathlib as I should be...

Reid Barton (Sep 24 2020 at 22:37):

I was under the impression that I built the adjunction involving the Stone-Cech compactification at some point... but where...

Reid Barton (Sep 24 2020 at 22:39):

lol

-- TODO: These proofs seem too long!
noncomputable def hom_iso (S : Type u) (X : CompHaus) :
  (free_obj S  X)  (S  X) :=
{ to_fun := λ g, g  ultrafilter.pure,
  inv_fun := λ f, ultrafilter.extend f, continuous_ultrafilter_extend f⟩,
  left_inv := λ g, begin
    apply subtype.eq,
    apply dense_inducing_pure.dense.equalizer,
    { apply continuous_ultrafilter_extend },
    { apply g.2 },
    { ext x,
      exact congr_fun (ultrafilter_extend_extends (g  ultrafilter.pure)) x },
    { apply_instance }
  end,
  right_inv := λ f, ultrafilter_extend_extends f }

Adam Topaz (Sep 24 2020 at 22:40):

Nice. I didn't know the adjunction existed in mathlib

Reid Barton (Sep 24 2020 at 22:40):

Maybe this will help (mathlib commit d12db89ac21bdcf5d33fd1dc7262ebbd3a7dcf54)

import category_theory.monad.adjunction
import topology.category.Top.basic
import topology.stone_cech

noncomputable theory

universe u

structure CompHaus :=
(to_Top : Top.{u})
[is_compact : compact_space to_Top]
[is_hausdorff : t2_space to_Top]

namespace CompHaus

open category_theory filter

instance : has_coe CompHaus.{u} Top.{u} :=
λ X, X.1

-- TODO: Fix this mess
instance {X : CompHaus.{u}} : compact_space X.to_Top := X.is_compact
instance {X : CompHaus.{u}} : t2_space X.to_Top := X.is_hausdorff
instance i {X : CompHaus.{u}} : compact_space X := X.is_compact
instance ij {X : CompHaus.{u}} : t2_space X := X.is_hausdorff

def of (X : Type u) [topological_space X] [compact_space X] [t2_space X] : CompHaus :=
⟨⟨X⟩⟩

instance category : large_category CompHaus :=
induced_category.category to_Top

instance concrete_category : concrete_category CompHaus.{u} :=
induced_category.concrete_category to_Top

instance has_forget_to_CompHaus : has_forget₂ CompHaus Top :=
induced_category.has_forget₂ to_Top

section adj
/- The space of ultrafilters β : Set → CompHaus
is left adjoint to the forgetful functor CompHaus → Set. -/

def free_obj (S : Type u) : CompHaus.{u} :=
of (ultrafilter S)

-- TODO: These proofs seem too long!
noncomputable def hom_iso (S : Type u) (X : CompHaus) :
  (free_obj S  X)  (S  X) :=
{ to_fun := λ g, g  ultrafilter.pure,
  inv_fun := λ f, ultrafilter.extend f, continuous_ultrafilter_extend f⟩,
  left_inv := λ g, begin
    apply subtype.eq,
    apply dense_inducing_pure.dense.equalizer,
    { apply continuous_ultrafilter_extend },
    { apply g.2 },
    { ext x,
      exact congr_fun (ultrafilter_extend_extends (g  ultrafilter.pure)) x },
    { apply_instance }
  end,
  right_inv := λ f, ultrafilter_extend_extends f }

instance : is_right_adjoint (forget CompHaus.{u}) :=
{ left := _,
  adj := adjunction.adjunction_of_equiv_left hom_iso (by { intros, refl }) }

end adj

end CompHaus

Reid Barton (Sep 24 2020 at 22:42):

I mean, your statement definitely follows somehow from this but it might be longer than your proof.

Adam Topaz (Sep 24 2020 at 22:43):

Is this in mathlib? API search came up empty with CompHaus

Reid Barton (Sep 24 2020 at 22:43):

No just a file I had lying around

Adam Topaz (Sep 24 2020 at 22:45):

Ah ok. Thanks.

Adam Topaz (Sep 24 2020 at 22:46):

I was hoping to be able to just quote a lemma from mathlib :smile:

Reid Barton (Sep 24 2020 at 22:48):

I agree it seems to be missing

Adam Topaz (Sep 24 2020 at 22:49):

There must be a way to do it with ultrafilter.extend, but I couldn't come up with a nice proof.

Adam Topaz (Sep 24 2020 at 22:52):

Here's my original proof FWIW

import order.filter.ultrafilter
import topology.stone_cech

open filter
open topological_space

example {α β : Type*} (f : α  β) : continuous (ultrafilter.map f) :=
begin
  intros U hU,
  induction hU,
  { rcases hU_H with V,rfl⟩,
    apply is_open_of_is_topological_basis ultrafilter_basis_is_basis,
    use f ⁻¹' V,
    refl },
  { apply is_open_of_is_topological_basis ultrafilter_basis_is_basis,
    use set.univ,
    ext,
    refine λ cond, _, by tauto⟩,
    apply univ_sets },
  { apply is_open_inter,
    assumption' },
  { rw set.preimage_sUnion,
    apply is_open_sUnion,
    rintros T T,rfl⟩,
    apply is_open_sUnion,
    rintros S S,rfl⟩,
    apply hU_ih,
    assumption }
end

Reid Barton (Sep 24 2020 at 23:01):

Now I'm not even sure you can do it easily with ultrafilter.extend. Because you need to somehow identify the extension with ultrafilter.map, and the obvious way to do that (it's the unique continuous map that fits in a square) presupposes that you already know ultrafilter.map is continuous.

Adam Topaz (Sep 24 2020 at 23:07):

Right. I was also hoping mathlib had some lemma saying that ultrafilter.extend agrees with pure composed with the map f.

Adam Topaz (Sep 24 2020 at 23:07):

I guess it's not there :oh_no:

Reid Barton (Sep 24 2020 at 23:16):

This seems to be frustratingly close

lemma continuous_ultrafilter.map {α β : Type*} (f : α  β) : continuous (ultrafilter.map f) :=
begin
  rw continuous_iff_ultrafilter,
  intros u g hg,
  let G : ultrafilter (ultrafilter α) := g, hg⟩,
  change G.val  𝓝 u  (G.map _).val  𝓝 _,
  rw [ultrafilter_converges_iff, ultrafilter_converges_iff],
  rintro rfl,
  -- ⊢ ultrafilter.map f (mjoin G) = mjoin (ultrafilter.map (ultrafilter.map f) G)
end

Adam Topaz (Sep 24 2020 at 23:19):

Does this last goal follow from the monad laws?

Adam Topaz (Sep 24 2020 at 23:19):

(I'm away from my computer right now.)

Reid Barton (Sep 24 2020 at 23:22):

Kind of... it works when α and β are in the same universe:

lemma {u} continuous_ultrafilter.map {α β : Type u} (f : α  β) : continuous (ultrafilter.map f) :=
begin
  rw continuous_iff_ultrafilter,
  intros u g hg,
  let G : ultrafilter (ultrafilter α) := g, hg⟩,
  change G.val  𝓝 u  (G.map _).val  𝓝 _,
  rw [ultrafilter_converges_iff, ultrafilter_converges_iff],
  rintro rfl,
  exact (mjoin_map_map f G).symm
end

Adam Topaz (Sep 24 2020 at 23:22):

Oh right .... That's because of mjoin

Reid Barton (Sep 24 2020 at 23:23):

how frustrating

Reid Barton (Sep 24 2020 at 23:29):

OK sometimes the simple way is best

lemma continuous_ultrafilter.map {α β : Type*} (f : α  β) : continuous (ultrafilter.map f) :=
begin
  apply continuous_generated_from,
  rintros _ s, rfl⟩,
  exact ultrafilter_is_open_basic (f ⁻¹' s)
end

Adam Topaz (Sep 24 2020 at 23:31):

Cool. I guess continuous_generated_from is the boilerplate version of the induction in my original proof. Good to know!


Last updated: Dec 20 2023 at 11:08 UTC