@@ -21,10 +21,6 @@ minimal neighborhood, which we call the *neighborhoods kernel* of the set.
21
21
22
22
* `AlexandrovDiscrete`: Prop-valued typeclass for a topological space to be Alexandrov-discrete
23
23
24
- ## TODO
25
-
26
- Finite product of Alexandrov-discrete spaces is Alexandrov-discrete.
27
-
28
24
## Tags
29
25
30
26
Alexandroff, discrete, finitely generated, fg space
@@ -34,6 +30,7 @@ open Filter Set TopologicalSpace Topology
34
30
35
31
/-- A topological space is **Alexandrov-discrete** or **finitely generated** if the intersection of
36
32
a family of open sets is open. -/
33
+ @[mk_iff]
37
34
class AlexandrovDiscrete (α : Type *) [TopologicalSpace α] : Prop where
38
35
/-- The intersection of a family of open sets is an open set. Use `isOpen_sInter` in the root
39
36
namespace instead. -/
@@ -43,6 +40,12 @@ variable {ι : Sort*} {κ : ι → Sort*} {α β : Type*}
43
40
section
44
41
variable [TopologicalSpace α] [TopologicalSpace β]
45
42
43
+ lemma alexandrovDiscrete_iff_isClosed :
44
+ AlexandrovDiscrete α ↔ ∀ S : Set (Set α), (∀ s ∈ S, IsClosed s) → IsClosed (⋃₀ S) := by
45
+ conv_lhs => tactic =>
46
+ simp_rw +singlePass [alexandrovDiscrete_iff, compl_surjective.image_surjective.forall,
47
+ forall_mem_image, ← compl_sUnion, isOpen_compl_iff]
48
+
46
49
instance DiscreteTopology.toAlexandrovDiscrete [DiscreteTopology α] : AlexandrovDiscrete α where
47
50
isOpen_sInter _ _ := isOpen_discrete _
48
51
@@ -61,8 +64,8 @@ lemma isOpen_iInter₂ {f : ∀ i, κ i → Set α} (hf : ∀ i j, IsOpen (f i j
61
64
IsOpen (⋂ i, ⋂ j, f i j) :=
62
65
isOpen_iInter fun _ ↦ isOpen_iInter <| hf _
63
66
64
- lemma isClosed_sUnion (hS : ∀ s ∈ S, IsClosed s) : IsClosed (⋃₀ S) := by
65
- simp only [← isOpen_compl_iff, compl_sUnion] at hS ⊢; exact isOpen_sInter <| forall_mem_image. 2 hS
67
+ lemma isClosed_sUnion (hS : ∀ s ∈ S, IsClosed s) : IsClosed (⋃₀ S) :=
68
+ alexandrovDiscrete_iff_isClosed.mp inferInstance S hS
66
69
67
70
lemma isClosed_iUnion (hf : ∀ i, IsClosed (f i)) : IsClosed (⋃ i, f i) :=
68
71
isClosed_sUnion <| forall_mem_range.2 hf
@@ -196,6 +199,18 @@ lemma isOpen_iff_forall_specializes : IsOpen s ↔ ∀ x y, x ⤳ y → y ∈ s
196
199
simp only [← nhdsKer_subset_iff_isOpen, Set.subset_def, mem_nhdsKer_iff_specializes, exists_imp,
197
200
and_imp, @forall_swap (_ ⤳ _)]
198
201
202
+ omit [AlexandrovDiscrete α] in
203
+ lemma alexandrovDiscrete_iff_nhds : AlexandrovDiscrete α ↔ (∀ a : α, 𝓝 a = 𝓟 (nhdsKer {a})) where
204
+ mp _ a := principal_nhdsKer_singleton a |>.symm
205
+ mpr hα := by
206
+ simp only [alexandrovDiscrete_iff_isClosed, isClosed_iff_clusterPt, ClusterPt, funext hα,
207
+ inf_principal, principal_neBot_iff]
208
+ intro S hS a ha
209
+ rw [sUnion_eq_biUnion, inter_iUnion₂, nonempty_biUnion] at ha
210
+ obtain ⟨s, hs, has⟩ := ha
211
+ specialize hS s hs a has
212
+ exact mem_sUnion_of_mem hS hs
213
+
199
214
lemma alexandrovDiscrete_coinduced {β : Type *} {f : α → β} :
200
215
@AlexandrovDiscrete β (coinduced f ‹_›) :=
201
216
@AlexandrovDiscrete.mk β (coinduced f ‹_›) fun S hS ↦ by
@@ -222,4 +237,14 @@ instance Sigma.instAlexandrovDiscrete {ι : Type*} {X : ι → Type*} [∀ i, To
222
237
[∀ i, AlexandrovDiscrete (X i)] : AlexandrovDiscrete (Σ i, X i) :=
223
238
alexandrovDiscrete_iSup fun _ ↦ alexandrovDiscrete_coinduced
224
239
240
+ instance Prod.instAlexandrovDiscrete : AlexandrovDiscrete (α × β) := by
241
+ simp_rw [alexandrovDiscrete_iff_nhds, Prod.forall, nhds_prod_eq, ← principal_nhdsKer_singleton,
242
+ prod_principal_principal, nhdsKer_pair, forall_true_iff]
243
+
244
+ instance Pi.instAlexandrovDiscreteOfFinite {ι : Type *} [Finite ι] {X : ι → Type *}
245
+ [Π i, TopologicalSpace (X i)] [∀ i, AlexandrovDiscrete (X i)] :
246
+ AlexandrovDiscrete (Π i, X i) := by
247
+ simp_rw [alexandrovDiscrete_iff_nhds, nhds_pi, ← principal_nhdsKer_singleton,
248
+ pi_principal, nhdsKer_singleton_pi, forall_true_iff]
249
+
225
250
end
0 commit comments