Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

[Merged by Bors] - feat(topology): A locally compact Hausdorff space is totally disconnected if and only if it is totally separated#7649

Closed
laughinggas wants to merge 12 commits into
masterfrom
tot-disc
Closed

[Merged by Bors] - feat(topology): A locally compact Hausdorff space is totally disconnected if and only if it is totally separated#7649
laughinggas wants to merge 12 commits into
masterfrom
tot-disc

Conversation

@laughinggas

@laughinggas laughinggas commented May 18, 2021

Copy link
Copy Markdown
Collaborator

We prove that a locally compact Hausdorff space is totally disconnected if and only if it is totally separated.


Open in Gitpod

@laughinggas laughinggas requested a review from kbuzzard May 18, 2021 14:08
@PatrickMassot

Copy link
Copy Markdown
Member

This PR can be simplified significantly using https://github.com/leanprover-community/lean-liquid/blob/master/src/for_mathlib/topology.lean. I'll try to prioritize PRing that file to mathlib.

@kim-em kim-em added the awaiting-review The author would like community review of the PR label May 19, 2021
@github-actions github-actions Bot added the blocked-by-other-PR This PR depends on another PR which is still in the queue. A bot manages this label via PR comment. label May 19, 2021

@PatrickMassot PatrickMassot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While waiting for #7671 to land I added a quick review. You also need to remove that submodule that you probably never intended to commit.

Comment thread src/topology/tot_disc_eq_tot_sep.lean Outdated
Comment thread src/topology/tot_disc_eq_tot_sep.lean Outdated
Comment thread src/topology/tot_disc_eq_tot_sep.lean Outdated
Comment thread src/topology/tot_disc_eq_tot_sep.lean Outdated
Comment thread src/topology/tot_disc_eq_tot_sep.lean Outdated
Comment thread src/topology/tot_disc_eq_tot_sep.lean Outdated
Comment thread src/topology/tot_disc_eq_tot_sep.lean Outdated
Comment thread src/topology/tot_disc_eq_tot_sep.lean Outdated
@github-actions github-actions Bot removed the blocked-by-other-PR This PR depends on another PR which is still in the queue. A bot manages this label via PR comment. label May 20, 2021
@github-actions

Copy link
Copy Markdown

🎉 Great news! Looks like all the dependencies have been resolved:

💡 To add or remove a dependency please update this issue/PR description.

Brought to you by Dependent Issues (:robot: ). Happy coding!

Comment thread src/topology/connected.lean Outdated
Comment thread src/topology/separation.lean Outdated
Comment thread src/topology/separation.lean Outdated
Comment thread src/topology/connected.lean Outdated
Comment thread src/topology/separation.lean Outdated
Comment thread src/topology/separation.lean Outdated
Comment thread src/topology/separation.lean Outdated
Comment thread src/topology/separation.lean Outdated
Comment thread src/topology/separation.lean Outdated
Comment on lines +1045 to +1090
begin
refine topological_space.is_topological_basis_of_open_of_nhds _ _,
{ rintros u hu, change (is_clopen u) at hu, apply hu.1, },
rintros x U memU hU,
simp only [exists_prop, set.mem_set_of_eq],
obtain ⟨s, comp, xs, sU⟩ := exists_compact_subset hU memU,
obtain ⟨t, h, ht, xt⟩ := mem_interior.1 xs,
set u : set s := (coe : s → H)⁻¹' (interior s) with hu,
have u_open_in_s : is_open u,
{ apply is_open.preimage (continuous_subtype_coe) is_open_interior, },
obtain ⟨V, clopen_in_s, Vx, V_sub⟩ := @compact_exists_clopen_in_open s _
(subtype.t2_space) (is_compact_iff_compact_space.1 comp) (subtype.totally_disconnected_space)
⟨x, h xt⟩ u u_open_in_s xs,
have V_clopen : (set.image (coe : s → H) V) ∈ {Z : set H | is_clopen Z},
{ change is_clopen (set.image (coe : s → H) V), split,
{ set v : set u := (coe : u → s)⁻¹' V with hv,
have : (coe : u → H) = (coe : s → H) ∘ (coe : u → s), { exact rfl, },
have pre_f : embedding (coe : u → H),
{ rw this, refine embedding.comp embedding_subtype_coe embedding_subtype_coe, },
have f' : open_embedding (coe : u → H),
{ constructor, apply pre_f,
{ have : set.range (coe : u → H) = interior s,
{ rw [this, set.range_comp],
have g : set.range (coe : u → s) = u,
{ ext z, split,
{ rw set.mem_range, rintros ⟨y, hy⟩, rw ←hy, apply y.property, },
rintros hz, rw set.mem_range, use ⟨z, hz⟩, simp, },
rw [g, subtype.image_preimage_coe],
apply set.inter_eq_self_of_subset_left interior_subset, },
rw this, apply is_open_interior, }, },
have f2 : is_open v,
{ rw hv, apply is_open.preimage (continuous_subtype_coe) clopen_in_s.1, },
have f3 : (set.image (coe : s → H) V) = (set.image (coe : u → H) v),
{ rw [this, hv], symmetry',
rw set.image_comp, congr, rw [subtype.image_preimage_coe],
apply set.inter_eq_self_of_subset_left V_sub, },
rw f3, apply (open_embedding.is_open_map f') v f2, },
{ apply (closed_embedding.closed_iff_image_closed
(is_closed.closed_embedding_subtype_coe (is_compact.is_closed comp))).1
(clopen_in_s).2, }, },
refine ⟨_, V_clopen, _, _⟩,
{ simp [Vx, h xt], },
{ transitivity s,
{ simp, },
assumption, },
end

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
begin
refine topological_space.is_topological_basis_of_open_of_nhds _ _,
{ rintros u hu, change (is_clopen u) at hu, apply hu.1, },
rintros x U memU hU,
simp only [exists_prop, set.mem_set_of_eq],
obtain ⟨s, comp, xs, sU⟩ := exists_compact_subset hU memU,
obtain ⟨t, h, ht, xt⟩ := mem_interior.1 xs,
set u : set s := (coe : s → H)⁻¹' (interior s) with hu,
have u_open_in_s : is_open u,
{ apply is_open.preimage (continuous_subtype_coe) is_open_interior, },
obtain ⟨V, clopen_in_s, Vx, V_sub⟩ := @compact_exists_clopen_in_open s _
(subtype.t2_space) (is_compact_iff_compact_space.1 comp) (subtype.totally_disconnected_space)
⟨x, h xt⟩ u u_open_in_s xs,
have V_clopen : (set.image (coe : s → H) V) ∈ {Z : set H | is_clopen Z},
{ change is_clopen (set.image (coe : s → H) V), split,
{ set v : set u := (coe : u → s)⁻¹' V with hv,
have : (coe : u → H) = (coe : s → H) ∘ (coe : u → s), { exact rfl, },
have pre_f : embedding (coe : u → H),
{ rw this, refine embedding.comp embedding_subtype_coe embedding_subtype_coe, },
have f' : open_embedding (coe : u → H),
{ constructor, apply pre_f,
{ have : set.range (coe : u → H) = interior s,
{ rw [this, set.range_comp],
have g : set.range (coe : u → s) = u,
{ ext z, split,
{ rw set.mem_range, rintros ⟨y, hy⟩, rw ←hy, apply y.property, },
rintros hz, rw set.mem_range, use ⟨z, hz⟩, simp, },
rw [g, subtype.image_preimage_coe],
apply set.inter_eq_self_of_subset_left interior_subset, },
rw this, apply is_open_interior, }, },
have f2 : is_open v,
{ rw hv, apply is_open.preimage (continuous_subtype_coe) clopen_in_s.1, },
have f3 : (set.image (coe : s → H) V) = (set.image (coe : u → H) v),
{ rw [this, hv], symmetry',
rw set.image_comp, congr, rw [subtype.image_preimage_coe],
apply set.inter_eq_self_of_subset_left V_sub, },
rw f3, apply (open_embedding.is_open_map f') v f2, },
{ apply (closed_embedding.closed_iff_image_closed
(is_closed.closed_embedding_subtype_coe (is_compact.is_closed comp))).1
(clopen_in_s).2, }, },
refine ⟨_, V_clopen, _, _⟩,
{ simp [Vx, h xt], },
{ transitivity s,
{ simp, },
assumption, },
end
begin
refine is_topological_basis_of_open_of_nhds (λ u hu, hu.1) _,
rintros x U memU hU,
obtain ⟨s, comp, xs, sU⟩ := exists_compact_subset hU memU,
obtain ⟨t, h, ht, xt⟩ := mem_interior.1 xs,
let u : set s := (coe : s → H)⁻¹' (interior s),
have u_open_in_s : is_open u := is_open_interior.preimage continuous_subtype_coe,
let X : s := ⟨x, h xt⟩,
have Xu : X ∈ u := xs,
haveI : compact_space s := is_compact_iff_compact_space.1 comp,
obtain ⟨V : set s, clopen_in_s, Vx, V_sub⟩ := compact_exists_clopen_in_open u_open_in_s Xu,
have V_clopen : is_clopen ((coe : s → H) '' V),
{ refine ⟨_, (comp.is_closed.closed_embedding_subtype_coe.closed_iff_image_closed).1
clopen_in_s.2⟩,
let v : set u := (coe : u → s)⁻¹' V,
have : (coe : u → H) = (coe : s → H) ∘ (coe : u → s) := rfl,
have f0 : embedding (coe : u → H) := embedding_subtype_coe.comp embedding_subtype_coe,
have f1 : open_embedding (coe : u → H),
{ refine ⟨f0, _⟩,
{ have : set.range (coe : u → H) = interior s,
{ rw [this, set.range_comp, subtype.range_coe, subtype.image_preimage_coe],
apply set.inter_eq_self_of_subset_left interior_subset, },
rw this,
apply is_open_interior } },
have f2 : is_open v := clopen_in_s.1.preimage continuous_subtype_coe,
have f3 : (coe : s → H) '' V = (coe : u → H) '' v,
{ rw [this, image_comp coe coe, subtype.image_preimage_coe,
inter_eq_self_of_subset_left V_sub] },
rw f3,
apply f1.is_open_map v f2 },
refine ⟨coe '' V, V_clopen, by simp [Vx, h xt], _⟩,
transitivity s,
{ simp },
assumption
end

I've done some cleanup but this is still more painful than what we could hope for.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the cleanup. The problem here is that I really need to use both the openness of interior s and the compactness of s, hence I need to work with subsets in each of these respective spaces. Would you be having any suggestion for a better proof that I could try to work on? I was wondering whether thinking in terms of filters might help (I am uncomfortable with them).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree the relevant diagram of spaces is actually not so simple. But on paper we are very good at pretending it is. I don't have a magic solution (otherwise I would have written it).

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, I guess this is the best I can do for now. Thank you for your help!

@PatrickMassot PatrickMassot added awaiting-author A reviewer has asked the author a question or requested changes and removed awaiting-review The author would like community review of the PR labels May 26, 2021
@laughinggas laughinggas added awaiting-review The author would like community review of the PR and removed awaiting-author A reviewer has asked the author a question or requested changes labels May 29, 2021
@kim-em kim-em requested a review from PatrickMassot May 30, 2021 01:36
@PatrickMassot

Copy link
Copy Markdown
Member

bors merge

@github-actions github-actions Bot added ready-to-merge All that is left is for bors to build and merge this PR. (Remember you need to say `bors r+`.) and removed awaiting-review The author would like community review of the PR labels Jun 1, 2021
bors Bot pushed a commit that referenced this pull request Jun 1, 2021
…cted if and only if it is totally separated (#7649)

We prove that a locally compact Hausdorff space is totally disconnected if and only if it is totally separated.
@bors

bors Bot commented Jun 1, 2021

Copy link
Copy Markdown

Build failed (retrying...):

bors Bot pushed a commit that referenced this pull request Jun 1, 2021
…cted if and only if it is totally separated (#7649)

We prove that a locally compact Hausdorff space is totally disconnected if and only if it is totally separated.
@bors

bors Bot commented Jun 1, 2021

Copy link
Copy Markdown

Build failed:

@bryangingechen bryangingechen added awaiting-author A reviewer has asked the author a question or requested changes and removed ready-to-merge All that is left is for bors to build and merge this PR. (Remember you need to say `bors r+`.) labels Jun 1, 2021
@laughinggas laughinggas added ready-to-merge All that is left is for bors to build and merge this PR. (Remember you need to say `bors r+`.) and removed awaiting-author A reviewer has asked the author a question or requested changes labels Jun 3, 2021
@bryangingechen

Copy link
Copy Markdown
Collaborator

Given that this has already passed review, I'll put it back on the queue:
bors r+

@laughinggas Note that the "ready-to-merge" label is added by automation; if you add it yourself, we might think the PR is already on the bors queue and forget about it!

bors Bot pushed a commit that referenced this pull request Jun 3, 2021
…cted if and only if it is totally separated (#7649)

We prove that a locally compact Hausdorff space is totally disconnected if and only if it is totally separated.
@bors

bors Bot commented Jun 4, 2021

Copy link
Copy Markdown

Pull request successfully merged into master.

Build succeeded:

@bors bors Bot changed the title feat(topology): A locally compact Hausdorff space is totally disconnected if and only if it is totally separated [Merged by Bors] - feat(topology): A locally compact Hausdorff space is totally disconnected if and only if it is totally separated Jun 4, 2021
@bors bors Bot closed this Jun 4, 2021
@bors bors Bot deleted the tot-disc branch June 4, 2021 02:14
@laughinggas

Copy link
Copy Markdown
Collaborator Author

Given that this has already passed review, I'll put it back on the queue:
bors r+

@laughinggas Note that the "ready-to-merge" label is added by automation; if you add it yourself, we might think the PR is already on the bors queue and forget about it!

Apologies, I will remember that, in the future!

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

ready-to-merge All that is left is for bors to build and merge this PR. (Remember you need to say `bors r+`.)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants