Zulip Chat Archive
Stream: Is there code for X?
Topic: Elements of completion as limits
Adam Topaz (Jul 29 2022 at 00:52):
Do we know that elements of the completion of a uniform space can be represented as limits of Cauchy filters on ?
Junyan Xu (Jul 29 2022 at 03:02):
This is my formalization and proof of the result:
import topology.uniform_space.completion
variables {α : Type*} [uniform_space α]
lemma Cauchy_tendsto_nhds_self (F : Cauchy α) : F.1.tendsto Cauchy.pure_cauchy (nhds F) :=
begin
rw uniform.tendsto_nhds_left,
intros s hs,
obtain ⟨t, ht, hts⟩ := Cauchy.mem_uniformity'.1 hs,
obtain ⟨r, hr, hrt⟩ := (cauchy_iff'.1 F.2).2 t ht,
rw filter.mem_map_iff_exists_image,
use [r, hr],
rw set.image_subset_iff,
intros x hx, apply hts,
rw filter.mem_prod_iff,
use [r, hx, r, hr],
rintro ⟨x, y⟩ ⟨hx, hy⟩,
exact hrt x hx y hy,
end
lemma exists_cauchy (x : uniform_space.completion α) :
∃ F : filter α, cauchy F ∧ F.tendsto coe (nhds x) :=
begin
rcases x, use [x.1, x.2],
rw uniform_space.completion.coe_eq,
erw ← inducing.tendsto_nhds_iff,
{ apply Cauchy_tendsto_nhds_self },
{ exact uniform_inducing.inducing ⟨uniform_space.comap_quotient_eq_uniformity⟩ },
end
I feel I don't really understand it, but I was able to complete the proofs!
Adam Topaz (Jul 29 2022 at 03:08):
Nice! That's roughly the proof I had, but I would be surprised if there wasn't a lemma in mathlib that makes this a one-liner.
Anatole Dedecker (Jul 29 2022 at 03:10):
I'm not sure at all I can do better, but I feel like there has to be a nicer proof involving docs#dense_inducing or things like that
Anatole Dedecker (Jul 29 2022 at 03:10):
Let me give it a try
Anatole Dedecker (Jul 29 2022 at 03:19):
Indeed
Anatole Dedecker (Jul 29 2022 at 03:20):
import topology.uniform_space.completion
open filter uniform_space
open_locale topological_space
variables {α : Type*} [uniform_space α]
lemma exists_cauchy (x : completion α) :
∃ F : filter α, cauchy F ∧ tendsto coe F (𝓝 x) :=
begin
refine ⟨comap coe (𝓝 x), cauchy_nhds.comap' _
(completion.dense_inducing_coe.comap_nhds_ne_bot x), tendsto_comap⟩,
rw (completion.uniform_inducing_coe α).comap_uniformity,
exact le_rfl
end
Anatole Dedecker (Jul 29 2022 at 03:20):
Junyan Xu said:
This is my formalization and proof of the result:
import topology.uniform_space.completion variables {α : Type*} [uniform_space α] lemma Cauchy_tendsto_nhds_self (F : Cauchy α) : F.1.tendsto Cauchy.pure_cauchy (nhds F) := begin rw uniform.tendsto_nhds_left, intros s hs, obtain ⟨t, ht, hts⟩ := Cauchy.mem_uniformity'.1 hs, obtain ⟨r, hr, hrt⟩ := (cauchy_iff'.1 F.2).2 t ht, rw filter.mem_map_iff_exists_image, use [r, hr], rw set.image_subset_iff, intros x hx, apply hts, rw filter.mem_prod_iff, use [r, hx, r, hr], rintro ⟨x, y⟩ ⟨hx, hy⟩, exact hrt x hx y hy, end lemma exists_cauchy (x : uniform_space.completion α) : ∃ F : filter α, cauchy F ∧ F.tendsto coe (nhds x) := begin rcases x, use [x.1, x.2], rw uniform_space.completion.coe_eq, erw ← inducing.tendsto_nhds_iff, { apply Cauchy_tendsto_nhds_self }, { exact uniform_inducing.inducing ⟨uniform_space.comap_quotient_eq_uniformity⟩ }, end
I feel I don't really understand it, but I was able to complete the proofs!
Sorry, I could have saved you a lot of trouble :sweat_smile:
Anatole Dedecker (Jul 29 2022 at 03:24):
This is really a lemma about docs#uniform_inducing s with dense range
Anatole Dedecker (Jul 29 2022 at 03:24):
I don't even use the fact that the completion is complete x)
Junyan Xu (Jul 29 2022 at 03:38):
Very nice proof! Can be compactified to
lemma exists_cauchy (x : completion α) :
∃ F : filter α, cauchy F ∧ tendsto coe F (𝓝 x) :=
⟨comap coe (𝓝 x), cauchy_nhds.comap'
(completion.uniform_inducing_coe α).comap_uniformity.le
(completion.dense_inducing_coe.comap_nhds_ne_bot x), tendsto_comap⟩
Anatole Dedecker (Jul 29 2022 at 03:41):
Nice, I feel better now that you golfed me back :stuck_out_tongue_wink:
Junyan Xu (Jul 29 2022 at 03:41):
Your proof shows every point x
in the completion is the limit at the preferred Cauchy filter comap coe (𝓝 x)
, which is interesting, as my proof shows that any Cauchy filter in the class of x
has x
as the limit.
Anatole Dedecker (Jul 29 2022 at 03:49):
I think the philosophy for such constructions which have a nice universal property is to forbid yourself to unfold the constructions, so somehow we don't want to make sense of "filters in the class of x
"
Anatole Dedecker (Jul 29 2022 at 03:50):
But I agree that your approach feels natural
Junyan Xu (Jul 29 2022 at 03:53):
I wonder if this result also has a short proof ...
lemma forall_cauchy (x : uniform_space.completion α) :
∀ F : Cauchy α, x = quotient.mk' F → F.1.tendsto coe (nhds x) :=
begin
rintro F rfl,
rw uniform_space.completion.coe_eq,
erw ← inducing.tendsto_nhds_iff,
{ apply Cauchy_tendsto_nhds_self },
{ exact uniform_inducing.inducing ⟨uniform_space.comap_quotient_eq_uniformity⟩ },
end
Junyan Xu (Jul 29 2022 at 03:57):
of course this only makes sense for completion
not docs#abstract_completion ...
Anatole Dedecker (Jul 29 2022 at 04:09):
I don't see a more clever way than proving first
lemma Cauchy.tendsto_nhds_self {α : Type*} [uniform_space α] (F : Cauchy α) :
tendsto (λ (x : α), Cauchy.pure_cauchy x) F.val (𝓝 F) :=
begin
sorry,
end
and then
lemma forall_cauchy (x : uniform_space.completion α) :
∀ F : Cauchy α, x = quotient.mk' F → F.1.tendsto coe (nhds x) :=
begin
rintro F rfl,
exact (continuous_quotient_mk.tendsto _).comp F.tendsto_nhds_self
end
Anatole Dedecker (Jul 29 2022 at 04:10):
And I don't think the first sorry can be solved without using filter bases and so on
Junyan Xu (Jul 29 2022 at 04:42):
I also can't find the following lemma in mathlib; is there a simpler proof?
lemma separation_setoid_eq_inseparable_setoid {α} [uniform_space α] :
uniform_space.separation_setoid α = inseparable_setoid α :=
begin
ext, change (a,b) ∈ separation_rel α ↔ inseparable a b,
rw inseparable_iff_forall_open,
split; intro h,
{ intros s hs, suffices : _,
{ split, revert a b h,
exacts [this, this _ _ $ (uniform_space.separation_setoid α).symm' h] },
{ clear h a b, exact λ a b h ha, h _ (is_open_uniformity.1 hs a ha) rfl } },
{ rw uniformity_has_basis_open.mem_separation_rel,
intros s hs,
refine (h {x | (a, x) ∈ s} _).1 (refl_mem_uniformity hs.1),
exact (continuous.prod.mk a).is_open_preimage _ hs.2 },
end
Patrick Massot (Jul 29 2022 at 10:39):
It's nice that you can train student and then send them do internship across the Atlantic so that they can answer questions for you when you sleep. I still tried to get to the bottom of this and found a couple of surprising holes (as usual). I suggest adding:
import topology.uniform_space.completion
open filter set
open_locale topological_space
lemma function.surjective.comap_ne_bot_iff_ne_bot {α β : Type*} {f : α → β}
(hf : function.surjective f) (F : filter β) : (comap f F).ne_bot ↔ F.ne_bot :=
⟨λ h, ⟨λ H, (H ▸ h : (comap f ⊥).ne_bot).ne comap_bot⟩, λ h, h.comap_of_surj hf⟩
open filter set
lemma mem_closure_range_iff_comap {α : Type*} {β : Type*} [topological_space β]
{f : α → β} {b : β} : b ∈ closure (range f) ↔ (comap f (𝓝 b)).ne_bot :=
begin
rw [mem_closure_iff_comap_ne_bot],
conv_rhs { rw [← coe_comp_range_factorization f, ← filter.comap_comap,
surjective_onto_range.comap_ne_bot_iff_ne_bot] }
end
-- Not used below but nice to have.
lemma dense_range.comap_nhds_ne_bot {α : Type*} {β : Type*} [topological_space β]
{f : α → β} (h : dense_range f) (b : β) : (comap f (𝓝 b)).ne_bot :=
mem_closure_range_iff_comap.mp (h b)
variables {α : Type*} [uniform_space α]
open uniform_space
open_locale uniformity
lemma exists_cauchy_tendsto {β : Type*} [uniform_space β]
{f : α → β} (hf : comap (prod.map f f) (𝓤 β) ≤ 𝓤 α) {x} (hx : x ∈ closure (range f)) :
∃ F : filter α, cauchy F ∧ tendsto f F (𝓝 x) :=
⟨comap f (𝓝 x), cauchy_nhds.comap' hf (mem_closure_range_iff_comap.mp hx), tendsto_comap⟩
open uniform_space.completion
lemma uniform_space.completion.exists_cauchy_tendsto (x : completion α) :
∃ F : filter α, cauchy F ∧ tendsto coe F (𝓝 x) :=
exists_cauchy_tendsto (uniform_inducing_coe α).comap_uniformity.le (dense_range_coe x)
Junyan Xu (Jul 29 2022 at 14:17):
(deleted)
Junyan Xu (Jul 30 2022 at 04:28):
So I was able to prove a characterization of the backward map from completion α
to Cauchy α
constructed by Anatole. The code is at https://gist.github.com/alreadydone/9fcfb78af6cd48bdedf3220a598b8321, where the map is called preferred_cauchy
. It turns out it's a right inverse to the "separation quotient" map that produces completion α
from Cauchy α
. Moreover, it sends a point x
in the completion to the unique maximal Cauchy filter F
that tends to x
under α → completion α
; as it turns out, F
tends to x
iff it maps to x
under the quotient map. This was rather mysterious to me, as points in Cauchy α
that maps to the same point in completion α
are by definition topologically indistinguishable, but it makes sense when you think about Cauchy α
as filters on the original space α
instead of a space by itself, so everything still makes sense when considering abstract_completion
, which doesn't mention an intermediate space.
To understand this better I worked out an example: consider the uniformity ⊤ = {univ} on the two point set α = {0, 1}, which induces the trivial topology; every ne_bot filter on this space is Cauchy, and there are three of them: ⊤={univ}, 𝓟 {0}, and 𝓟 {1}. Of course the map α → completion α
sends x to 𝓟 {x}, while ⊤ is not in the image. The separation quotient consists of exactly one point, and preferred_cauchy
maps it to ⊤.
Last updated: Dec 20 2023 at 11:08 UTC