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

Commit 51e2b4c

Browse files
committed
feat(topology/separation): add subtype.t1_space and subtype.regular (#2667)
Also simplify the proof of `exists_open_singleton_of_fintype`
1 parent 4857284 commit 51e2b4c

File tree

2 files changed

+48
-85
lines changed

2 files changed

+48
-85
lines changed

src/data/finset.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,10 @@ def filter (p : α → Prop) [decidable_pred p] (s : finset α) : finset α :=
806806

807807
@[simp] theorem filter_subset (s : finset α) : s.filter p ⊆ s := filter_subset _
808808

809+
theorem filter_ssubset {s : finset α} : s.filter p ⊂ s ↔ ∃ x ∈ s, ¬ p x :=
810+
⟨λ h, let ⟨x, hs, hp⟩ := set.exists_of_ssubset h in ⟨x, hs, mt (λ hp, mem_filter.2 ⟨hs, hp⟩) hp⟩,
811+
λ ⟨x, hs, hp⟩, ⟨s.filter_subset, λ h, hp (mem_filter.1 (h hs)).2⟩⟩
812+
809813
theorem filter_filter (s : finset α) :
810814
(s.filter p).filter q = s.filter (λa, p a ∧ q a) :=
811815
ext.2 $ assume a, by simp only [mem_filter, and_comm, and.left_comm]

src/topology/separation.lean

Lines changed: 44 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -21,96 +21,41 @@ section separation
2121
class t0_space (α : Type u) [topological_space α] : Prop :=
2222
(t0 : ∀ x y, x ≠ y → ∃ U:set α, is_open U ∧ (xor (x ∈ U) (y ∈ U)))
2323

24+
theorem exists_open_singleton_of_open_finset [t0_space α] (s : finset α) (sne : s.nonempty)
25+
(hso : is_open (↑s : set α)) :
26+
∃ x ∈ s, is_open ({x} : set α):=
27+
begin
28+
induction s using finset.strong_induction_on with s ihs,
29+
by_cases hs : set.subsingleton (↑s : set α),
30+
{ rcases sne with ⟨x, hx⟩,
31+
refine ⟨x, hx, _⟩,
32+
have : (↑s : set α) = {x}, from hs.eq_singleton_of_mem hx,
33+
rwa this at hso },
34+
{ dunfold set.subsingleton at hs,
35+
push_neg at hs,
36+
rcases hs with ⟨x, hx, y, hy, hxy⟩,
37+
rcases t0_space.t0 x y hxy with ⟨U, hU, hxyU⟩,
38+
wlog H : x ∈ U ∧ y ∉ U := hxyU using [x y, y x],
39+
obtain ⟨z, hzs, hz⟩ : ∃ z ∈ s.filter (λ z, z ∈ U), is_open ({z} : set α),
40+
{ refine ihs _ (finset.filter_ssubset.2 ⟨y, hy, H.2⟩) ⟨x, finset.mem_filter.2 ⟨hx, H.1⟩⟩ _,
41+
rw [finset.coe_filter],
42+
exact is_open_inter hso hU },
43+
exact ⟨z, (finset.mem_filter.1 hzs).1, hz⟩ }
44+
end
45+
2446
theorem exists_open_singleton_of_fintype [t0_space α] [f : fintype α] [ha : nonempty α] :
2547
∃ x:α, is_open ({x}:set α) :=
26-
have H : ∀ (T : finset α), T ≠ ∅ → ∃ x ∈ T, ∃ u, is_open u ∧ {x} = {y | y ∈ T} ∩ u :=
27-
begin
28-
classical,
29-
intro T,
30-
apply finset.case_strong_induction_on T,
31-
{ intro h, exact (h rfl).elim },
32-
{ intros x S hxS ih h,
33-
by_cases hs : S = ∅,
34-
{ existsi [x, finset.mem_insert_self x S, univ, is_open_univ],
35-
rw [hs, inter_univ], refl },
36-
{ rcases ih S (finset.subset.refl S) hs with ⟨y, hy, V, hv1, hv2⟩,
37-
by_cases hxV : x ∈ V,
38-
{ cases t0_space.t0 x y (λ hxy, hxS $ by rwa hxy) with U hu,
39-
rcases hu with ⟨hu1, ⟨hu2, hu3⟩ | ⟨hu2, hu3⟩⟩,
40-
{ existsi [x, finset.mem_insert_self x S, U ∩ V, is_open_inter hu1 hv1],
41-
apply set.ext,
42-
intro z,
43-
split,
44-
{ intro hzx,
45-
rw set.mem_singleton_iff at hzx,
46-
rw hzx,
47-
exact ⟨finset.mem_insert_self x S, ⟨hu2, hxV⟩⟩ },
48-
{ intro hz,
49-
rw set.mem_singleton_iff,
50-
rcases hz with ⟨hz1, hz2, hz3⟩,
51-
cases finset.mem_insert.1 hz1 with hz4 hz4,
52-
{ exact hz4 },
53-
{ have h1 : z ∈ {y : α | y ∈ S} ∩ V,
54-
{ exact ⟨hz4, hz3⟩ },
55-
rw ← hv2 at h1,
56-
rw set.mem_singleton_iff at h1,
57-
rw h1 at hz2,
58-
exact (hu3 hz2).elim } } },
59-
{ existsi [y, finset.mem_insert_of_mem hy, U ∩ V, is_open_inter hu1 hv1],
60-
apply set.ext,
61-
intro z,
62-
split,
63-
{ intro hz,
64-
rw set.mem_singleton_iff at hz,
65-
rw hz,
66-
refine ⟨finset.mem_insert_of_mem hy, hu2, _⟩,
67-
have h1 : y ∈ {y} := set.mem_singleton y,
68-
rw hv2 at h1,
69-
exact h1.2 },
70-
{ intro hz,
71-
rw set.mem_singleton_iff,
72-
cases hz with hz1 hz2,
73-
cases finset.mem_insert.1 hz1 with hz3 hz3,
74-
{ rw hz3 at hz2,
75-
exact (hu3 hz2.1).elim },
76-
{ have h1 : z ∈ {y : α | y ∈ S} ∩ V := ⟨hz3, hz2.2⟩,
77-
rw ← hv2 at h1,
78-
rw set.mem_singleton_iff at h1,
79-
exact h1 } } } },
80-
{ existsi [y, finset.mem_insert_of_mem hy, V, hv1],
81-
apply set.ext,
82-
intro z,
83-
split,
84-
{ intro hz,
85-
rw set.mem_singleton_iff at hz,
86-
rw hz,
87-
split,
88-
{ exact finset.mem_insert_of_mem hy },
89-
{ have h1 : y ∈ {y} := set.mem_singleton y,
90-
rw hv2 at h1,
91-
exact h1.2 } },
92-
{ intro hz,
93-
rw hv2,
94-
cases hz with hz1 hz2,
95-
cases finset.mem_insert.1 hz1 with hz3 hz3,
96-
{ rw hz3 at hz2,
97-
exact (hxV hz2).elim },
98-
{ exact ⟨hz3, hz2⟩ } } } } }
99-
end,
10048
begin
101-
apply nonempty.elim ha, intro x,
102-
specialize H finset.univ (finset.ne_empty_of_mem $ finset.mem_univ x),
103-
rcases H with ⟨y, hyf, U, hu1, hu2⟩,
104-
existsi y,
105-
have h1 : {y : α | y ∈ finset.univ} = (univ : set α),
106-
{ exact set.eq_univ_of_forall (λ x : α,
107-
by rw mem_set_of_eq; exact finset.mem_univ x) },
108-
rw h1 at hu2,
109-
rw set.univ_inter at hu2,
110-
rw hu2,
111-
exact hu1
49+
refine ha.elim (λ x, _),
50+
have : is_open (↑(finset.univ : finset α) : set α), { simp },
51+
rcases exists_open_singleton_of_open_finset _ ⟨x, finset.mem_univ x⟩ this with ⟨x, _, hx⟩,
52+
exact ⟨x, hx⟩
11253
end
11354

55+
instance subtype.t0_space [t0_space α] {p : α → Prop} : t0_space (subtype p) :=
56+
⟨λ x y hxy, let ⟨U, hU, hxyU⟩ := t0_space.t0 (x:α) y ((not_congr subtype.coe_ext).1 hxy) in
57+
⟨(coe : subtype p → α) ⁻¹' U, is_open_induced hU, hxyU⟩⟩
58+
11459
/-- A T₁ space, also known as a Fréchet space, is a topological space
11560
where every singleton set is closed. Equivalently, for every pair
11661
`x ≠ y`, there is an open set containing `x` and not `y`. -/
@@ -123,6 +68,11 @@ t1_space.t1 x
12368
lemma is_open_ne [t1_space α] {x : α} : is_open {y | y ≠ x} :=
12469
compl_singleton_eq x ▸ is_open_compl_iff.2 (t1_space.t1 x)
12570

71+
instance subtype.t1_space {α : Type u} [topological_space α] [t1_space α] {p : α → Prop} :
72+
t1_space (subtype p) :=
73+
⟨λ ⟨x, hx⟩, is_closed_induced_iff.2 $ ⟨{x}, is_closed_singleton, set.ext $ λ y,
74+
by simp [subtype.coe_ext]⟩⟩
75+
12676
@[priority 100] -- see Note [lower instance priority]
12777
instance t1_space.t0_space [t1_space α] : t0_space α :=
12878
⟨λ x y h, ⟨{z | z ≠ y}, is_open_ne, or.inl ⟨h, not_not_intro rfl⟩⟩⟩
@@ -320,6 +270,15 @@ let ⟨t, ht₁, ht₂, ht₃⟩ := this in
320270
subset.trans (compl_subset_comm.1 ht₂) h₁,
321271
is_closed_compl_iff.mpr ht₁⟩
322272

273+
instance subtype.regular_space [regular_space α] {p : α → Prop} : regular_space (subtype p) :=
274+
begin
275+
intros s a hs ha,
276+
rcases is_closed_induced_iff.1 hs with ⟨s, hs', rfl⟩,
277+
rcases regular_space.regular hs' ha with ⟨t, ht, hst, hat⟩,
278+
refine ⟨coe ⁻¹' t, is_open_induced ht, preimage_mono hst, _⟩,
279+
rw [nhds_induced, ← comap_principal, ← comap_inf, hat, comap_bot]
280+
end
281+
323282
variable (α)
324283
@[priority 100] -- see Note [lower instance priority]
325284
instance regular_space.t2_space [regular_space α] : t2_space α :=

0 commit comments

Comments
 (0)