topology.uniform_space.separation
⟷
Mathlib.Topology.UniformSpace.Separation
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
dist_setoid
(#18502)
Use uniform_space.separation_setoid
instead.
@@ -113,6 +113,13 @@ lemma filter.has_basis.mem_separation_rel {ι : Sort*} {p : ι → Prop} {s : ι
a ∈ 𝓢 α ↔ ∀ i, p i → a ∈ s i :=
h.forall_mem_mem
+theorem separation_rel_iff_specializes {a b : α} : (a, b) ∈ 𝓢 α ↔ a ⤳ b :=
+by simp only [(𝓤 α).basis_sets.mem_separation_rel, id, mem_set_of_eq,
+ (nhds_basis_uniformity (𝓤 α).basis_sets).specializes_iff]
+
+theorem separation_rel_iff_inseparable {a b : α} : (a, b) ∈ 𝓢 α ↔ inseparable a b :=
+ separation_rel_iff_specializes.trans specializes_iff_inseparable
+
/-- A uniform space is separated if its separation relation is trivial (each point
is related only to itself). -/
class separated_space (α : Type u) [uniform_space α] : Prop := (out : 𝓢 α = id_rel)
@@ -362,6 +369,9 @@ instance : separated_space (separation_quotient α) := uniform_space.separated_s
instance [inhabited α] : inhabited (separation_quotient α) :=
quotient.inhabited (separation_setoid α)
+lemma mk_eq_mk {x y : α} : (⟦x⟧ : separation_quotient α) = ⟦y⟧ ↔ inseparable x y :=
+quotient.eq'.trans separation_rel_iff_inseparable
+
/-- Factoring functions to a separated space through the separation quotient. -/
def lift [separated_space β] (f : α → β) : (separation_quotient α → β) :=
if h : uniform_continuous f then
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(first ported)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -76,7 +76,7 @@ open scoped Classical Topology uniformity Filter
noncomputable section
-/- ./././Mathport/Syntax/Translate/Basic.lean:339:40: warning: unsupported option eqn_compiler.zeta -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:340:40: warning: unsupported option eqn_compiler.zeta -/
set_option eqn_compiler.zeta true
universe u v w
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -98,18 +98,19 @@ instance (priority := 100) UniformSpace.to_regularSpace : RegularSpace α :=
#align uniform_space.to_regular_space UniformSpace.to_regularSpace
-/
-#print separationRel /-
+/- warning: separation_rel clashes with inseparable -> Inseparable
+Case conversion may be inaccurate. Consider using '#align separation_rel Inseparableₓ'. -/
+#print Inseparable /-
/-- The separation relation is the intersection of all entourages.
Two points which are related by the separation relation are "indistinguishable"
according to the uniform structure. -/
-protected def separationRel (α : Type u) [u : UniformSpace α] :=
+protected def Inseparable (α : Type u) [u : UniformSpace α] :=
⋂₀ (𝓤 α).sets
-#align separation_rel separationRel
+#align separation_rel Inseparable
-/
-scoped[uniformity] notation "𝓢" => separationRel
+scoped[uniformity] notation "𝓢" => Inseparable
-#print separated_equiv /-
theorem separated_equiv : Equivalence fun x y => (x, y) ∈ 𝓢 α :=
⟨fun x => fun s => refl_mem_uniformity, fun x y => fun h (s : Set (α × α)) hs =>
have : preimage Prod.swap s ∈ 𝓤 α := symm_le_uniformity hs
@@ -118,69 +119,70 @@ theorem separated_equiv : Equivalence fun x y => (x, y) ∈ 𝓢 α :=
let ⟨t, ht, (h_ts : compRel t t ⊆ s)⟩ := comp_mem_uniformity_sets hs
h_ts <| show (x, z) ∈ compRel t t from ⟨y, hxy t ht, hyz t ht⟩⟩
#align separated_equiv separated_equiv
--/
-#print Filter.HasBasis.mem_separationRel /-
-theorem Filter.HasBasis.mem_separationRel {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
+#print Filter.HasBasis.inseparable_iff_uniformity /-
+theorem Filter.HasBasis.inseparable_iff_uniformity {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
(h : (𝓤 α).HasBasis p s) {a : α × α} : a ∈ 𝓢 α ↔ ∀ i, p i → a ∈ s i :=
h.forall_mem_mem
-#align filter.has_basis.mem_separation_rel Filter.HasBasis.mem_separationRel
+#align filter.has_basis.mem_separation_rel Filter.HasBasis.inseparable_iff_uniformity
-/
-#print separationRel_iff_specializes /-
-theorem separationRel_iff_specializes {a b : α} : (a, b) ∈ 𝓢 α ↔ a ⤳ b := by
- simp only [(𝓤 α).basis_sets.mem_separationRel, id, mem_set_of_eq,
+/- warning: separation_rel_iff_specializes clashes with specializes_iff_inseparable -> specializes_iff_inseparable
+Case conversion may be inaccurate. Consider using '#align separation_rel_iff_specializes specializes_iff_inseparableₓ'. -/
+#print specializes_iff_inseparable /-
+theorem specializes_iff_inseparable {a b : α} : (a, b) ∈ 𝓢 α ↔ a ⤳ b := by
+ simp only [(𝓤 α).basis_sets.inseparable_iff_uniformity, id, mem_set_of_eq,
(nhds_basis_uniformity (𝓤 α).basis_sets).specializes_iff]
-#align separation_rel_iff_specializes separationRel_iff_specializes
+#align separation_rel_iff_specializes specializes_iff_inseparable
-/
-#print separationRel_iff_inseparable /-
-theorem separationRel_iff_inseparable {a b : α} : (a, b) ∈ 𝓢 α ↔ Inseparable a b :=
- separationRel_iff_specializes.trans specializes_iff_inseparable
-#align separation_rel_iff_inseparable separationRel_iff_inseparable
--/
+theorem inseparable_iff_inseparable {a b : α} : (a, b) ∈ 𝓢 α ↔ Inseparable a b :=
+ specializes_iff_inseparable.trans specializes_iff_inseparable
+#align separation_rel_iff_inseparable inseparable_iff_inseparable
-#print SeparatedSpace /-
+/- warning: separated_space clashes with t0_space -> T0Space
+Case conversion may be inaccurate. Consider using '#align separated_space T0Spaceₓ'. -/
+#print T0Space /-
/-- A uniform space is separated if its separation relation is trivial (each point
is related only to itself). -/
-class SeparatedSpace (α : Type u) [UniformSpace α] : Prop where
+class T0Space (α : Type u) [UniformSpace α] : Prop where
out : 𝓢 α = idRel
-#align separated_space SeparatedSpace
+#align separated_space T0Space
-/
-#print separatedSpace_iff /-
-theorem separatedSpace_iff {α : Type u} [UniformSpace α] : SeparatedSpace α ↔ 𝓢 α = idRel :=
+#print t0Space_iff_ker_uniformity /-
+theorem t0Space_iff_ker_uniformity {α : Type u} [UniformSpace α] : T0Space α ↔ 𝓢 α = idRel :=
⟨fun h => h.1, fun h => ⟨h⟩⟩
-#align separated_space_iff separatedSpace_iff
+#align separated_space_iff t0Space_iff_ker_uniformity
-/
-#print separated_def /-
-theorem separated_def {α : Type u} [UniformSpace α] :
- SeparatedSpace α ↔ ∀ x y, (∀ r ∈ 𝓤 α, (x, y) ∈ r) → x = y := by
- simp [separatedSpace_iff, idRel_subset.2 separated_equiv.1, subset.antisymm_iff] <;>
- simp [subset_def, separationRel]
-#align separated_def separated_def
+#print t0Space_iff_uniformity /-
+theorem t0Space_iff_uniformity {α : Type u} [UniformSpace α] :
+ T0Space α ↔ ∀ x y, (∀ r ∈ 𝓤 α, (x, y) ∈ r) → x = y := by
+ simp [t0Space_iff_ker_uniformity, idRel_subset.2 separated_equiv.1, subset.antisymm_iff] <;>
+ simp [subset_def, Inseparable]
+#align separated_def t0Space_iff_uniformity
-/
-#print separated_def' /-
-theorem separated_def' {α : Type u} [UniformSpace α] :
- SeparatedSpace α ↔ ∀ x y, x ≠ y → ∃ r ∈ 𝓤 α, (x, y) ∉ r :=
- separated_def.trans <|
+#print t0Space_iff_uniformity' /-
+theorem t0Space_iff_uniformity' {α : Type u} [UniformSpace α] :
+ T0Space α ↔ ∀ x y, x ≠ y → ∃ r ∈ 𝓤 α, (x, y) ∉ r :=
+ t0Space_iff_uniformity.trans <|
forall₂_congr fun x y => by rw [← not_imp_not] <;> simp [Classical.not_forall]
-#align separated_def' separated_def'
+#align separated_def' t0Space_iff_uniformity'
-/
#print eq_of_uniformity /-
-theorem eq_of_uniformity {α : Type _} [UniformSpace α] [SeparatedSpace α] {x y : α}
+theorem eq_of_uniformity {α : Type _} [UniformSpace α] [T0Space α] {x y : α}
(h : ∀ {V}, V ∈ 𝓤 α → (x, y) ∈ V) : x = y :=
- separated_def.mp ‹SeparatedSpace α› x y fun _ => h
+ t0Space_iff_uniformity.mp ‹T0Space α› x y fun _ => h
#align eq_of_uniformity eq_of_uniformity
-/
#print eq_of_uniformity_basis /-
-theorem eq_of_uniformity_basis {α : Type _} [UniformSpace α] [SeparatedSpace α] {ι : Type _}
- {p : ι → Prop} {s : ι → Set (α × α)} (hs : (𝓤 α).HasBasis p s) {x y : α}
- (h : ∀ {i}, p i → (x, y) ∈ s i) : x = y :=
+theorem eq_of_uniformity_basis {α : Type _} [UniformSpace α] [T0Space α] {ι : Type _} {p : ι → Prop}
+ {s : ι → Set (α × α)} (hs : (𝓤 α).HasBasis p s) {x y : α} (h : ∀ {i}, p i → (x, y) ∈ s i) :
+ x = y :=
eq_of_uniformity fun V V_in =>
let ⟨i, hi, H⟩ := hs.mem_iff.mp V_in
H (h hi)
@@ -188,102 +190,109 @@ theorem eq_of_uniformity_basis {α : Type _} [UniformSpace α] [SeparatedSpace
-/
#print eq_of_forall_symmetric /-
-theorem eq_of_forall_symmetric {α : Type _} [UniformSpace α] [SeparatedSpace α] {x y : α}
+theorem eq_of_forall_symmetric {α : Type _} [UniformSpace α] [T0Space α] {x y : α}
(h : ∀ {V}, V ∈ 𝓤 α → SymmetricRel V → (x, y) ∈ V) : x = y :=
eq_of_uniformity_basis hasBasis_symmetric (by simpa [and_imp] using fun _ => h)
#align eq_of_forall_symmetric eq_of_forall_symmetric
-/
#print eq_of_clusterPt_uniformity /-
-theorem eq_of_clusterPt_uniformity [SeparatedSpace α] {x y : α} (h : ClusterPt (x, y) (𝓤 α)) :
- x = y :=
+theorem eq_of_clusterPt_uniformity [T0Space α] {x y : α} (h : ClusterPt (x, y) (𝓤 α)) : x = y :=
eq_of_uniformity_basis uniformity_hasBasis_closed fun V ⟨hV, hVc⟩ =>
isClosed_iff_clusterPt.1 hVc _ <| h.mono <| le_principal_iff.2 hV
#align eq_of_cluster_pt_uniformity eq_of_clusterPt_uniformity
-/
-#print idRel_sub_separationRel /-
-theorem idRel_sub_separationRel (α : Type _) [UniformSpace α] : idRel ⊆ 𝓢 α :=
+/- warning: id_rel_sub_separation_relation clashes with inseparable.rfl -> Inseparable.rfl
+Case conversion may be inaccurate. Consider using '#align id_rel_sub_separation_relation Inseparable.rflₓ'. -/
+#print Inseparable.rfl /-
+theorem Inseparable.rfl (α : Type _) [UniformSpace α] : idRel ⊆ 𝓢 α :=
by
- unfold separationRel
+ unfold Inseparable
rw [idRel_subset]
intro x
suffices ∀ t ∈ 𝓤 α, (x, x) ∈ t by simpa only [refl_mem_uniformity]
exact fun t => refl_mem_uniformity
-#align id_rel_sub_separation_relation idRel_sub_separationRel
+#align id_rel_sub_separation_relation Inseparable.rfl
-/
-#print separationRel_comap /-
-theorem separationRel_comap {f : α → β}
+/- warning: separation_rel_comap clashes with inducing.inseparable_iff -> Inducing.inseparable_iff
+Case conversion may be inaccurate. Consider using '#align separation_rel_comap Inducing.inseparable_iffₓ'. -/
+#print Inducing.inseparable_iff /-
+theorem Inducing.inseparable_iff {f : α → β}
(h : ‹UniformSpace α› = UniformSpace.comap f ‹UniformSpace β›) : 𝓢 α = Prod.map f f ⁻¹' 𝓢 β :=
by
subst h
- dsimp [separationRel]
+ dsimp [Inseparable]
simp_rw [uniformity_comap, (Filter.comap_hasBasis (Prod.map f f) (𝓤 β)).ker, ← preimage_Inter,
sInter_eq_bInter]
rfl
-#align separation_rel_comap separationRel_comap
+#align separation_rel_comap Inducing.inseparable_iff
-/
-#print Filter.HasBasis.separationRel /-
-protected theorem Filter.HasBasis.separationRel {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
- (h : HasBasis (𝓤 α) p s) : 𝓢 α = ⋂ (i) (hi : p i), s i := by unfold separationRel;
+/- warning: filter.has_basis.separation_rel clashes with filter.has_basis.sInter_sets -> Filter.HasBasis.ker
+Case conversion may be inaccurate. Consider using '#align filter.has_basis.separation_rel Filter.HasBasis.kerₓ'. -/
+#print Filter.HasBasis.ker /-
+protected theorem Filter.HasBasis.ker {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
+ (h : HasBasis (𝓤 α) p s) : 𝓢 α = ⋂ (i) (hi : p i), s i := by unfold Inseparable;
rw [h.sInter_sets]
-#align filter.has_basis.separation_rel Filter.HasBasis.separationRel
+#align filter.has_basis.separation_rel Filter.HasBasis.ker
-/
-#print separationRel_eq_inter_closure /-
-theorem separationRel_eq_inter_closure : 𝓢 α = ⋂₀ (closure '' (𝓤 α).sets) := by
+theorem inseparable_eq_inter_closure : 𝓢 α = ⋂₀ (closure '' (𝓤 α).sets) := by
simp [uniformity_has_basis_closure.separation_rel]
-#align separation_rel_eq_inter_closure separationRel_eq_inter_closure
--/
+#align separation_rel_eq_inter_closure inseparable_eq_inter_closure
-#print isClosed_separationRel /-
-theorem isClosed_separationRel : IsClosed (𝓢 α) :=
+/- warning: is_closed_separation_rel clashes with is_closed_set_of_inseparable -> isClosed_setOf_inseparable
+Case conversion may be inaccurate. Consider using '#align is_closed_separation_rel isClosed_setOf_inseparableₓ'. -/
+#print isClosed_setOf_inseparable /-
+theorem isClosed_setOf_inseparable : IsClosed (𝓢 α) :=
by
- rw [separationRel_eq_inter_closure]
+ rw [inseparable_eq_inter_closure]
apply isClosed_sInter
rintro _ ⟨t, t_in, rfl⟩
exact isClosed_closure
-#align is_closed_separation_rel isClosed_separationRel
+#align is_closed_separation_rel isClosed_setOf_inseparable
-/
-#print separated_iff_t2 /-
-theorem separated_iff_t2 : SeparatedSpace α ↔ T2Space α := by
+#print R1Space.t2Space_iff_t0Space /-
+theorem R1Space.t2Space_iff_t0Space : T0Space α ↔ T2Space α := by
classical
constructor <;> intro h
· rw [t2_iff_isClosed_diagonal, ← show 𝓢 α = diagonal α from h.1]
- exact isClosed_separationRel
- · rw [separated_def']
+ exact isClosed_setOf_inseparable
+ · rw [t0Space_iff_uniformity']
intro x y hxy
rcases t2_separation hxy with ⟨u, v, uo, vo, hx, hy, h⟩
rcases isOpen_iff_ball_subset.1 uo x hx with ⟨r, hrU, hr⟩
exact ⟨r, hrU, fun H => h.le_bot ⟨hr H, hy⟩⟩
-#align separated_iff_t2 separated_iff_t2
+#align separated_iff_t2 R1Space.t2Space_iff_t0Space
-/
-#print separated_t3 /-
+#print RegularSpace.t3Space_iff_t0Space /-
-- see Note [lower instance priority]
-instance (priority := 100) separated_t3 [SeparatedSpace α] : T3Space α :=
+instance (priority := 100) RegularSpace.t3Space_iff_t0Space [T0Space α] : T3Space α :=
haveI := separated_iff_t2.mp ‹_›
⟨⟩
-#align separated_t3 separated_t3
+#align separated_t3 RegularSpace.t3Space_iff_t0Space
-/
-#print Subtype.separatedSpace /-
-instance Subtype.separatedSpace [SeparatedSpace α] (s : Set α) : SeparatedSpace s :=
- separated_iff_t2.mpr Subtype.t2Space
-#align subtype.separated_space Subtype.separatedSpace
+/- warning: subtype.separated_space clashes with subtype.t0_space -> Subtype.t0Space
+Case conversion may be inaccurate. Consider using '#align subtype.separated_space Subtype.t0Spaceₓ'. -/
+#print Subtype.t0Space /-
+instance Subtype.t0Space [T0Space α] (s : Set α) : T0Space s :=
+ R1Space.t2Space_iff_t0Space.mpr Subtype.t2Space
+#align subtype.separated_space Subtype.t0Space
-/
#print isClosed_of_spaced_out /-
-theorem isClosed_of_spaced_out [SeparatedSpace α] {V₀ : Set (α × α)} (V₀_in : V₀ ∈ 𝓤 α) {s : Set α}
+theorem isClosed_of_spaced_out [T0Space α] {V₀ : Set (α × α)} (V₀_in : V₀ ∈ 𝓤 α) {s : Set α}
(hs : s.Pairwise fun x y => (x, y) ∉ V₀) : IsClosed s :=
by
rcases comp_symm_mem_uniformity_sets V₀_in with ⟨V₁, V₁_in, V₁_symm, h_comp⟩
apply isClosed_of_closure_subset
intro x hx
- rw [mem_closure_iff_ball] at hx
+ rw [mem_closure_iff_ball] at hx
rcases hx V₁_in with ⟨y, hy, hy'⟩
suffices x = y by rwa [this]
apply eq_of_forall_symmetric
@@ -297,7 +306,7 @@ theorem isClosed_of_spaced_out [SeparatedSpace α] {V₀ : Set (α × α)} (V₀
-/
#print isClosed_range_of_spaced_out /-
-theorem isClosed_range_of_spaced_out {ι} [SeparatedSpace α] {V₀ : Set (α × α)} (V₀_in : V₀ ∈ 𝓤 α)
+theorem isClosed_range_of_spaced_out {ι} [T0Space α] {V₀ : Set (α × α)} (V₀_in : V₀ ∈ 𝓤 α)
{f : ι → α} (hf : Pairwise fun x y => (f x, f y) ∉ V₀) : IsClosed (range f) :=
isClosed_of_spaced_out V₀_in <| by rintro _ ⟨x, rfl⟩ _ ⟨y, rfl⟩ h; exact hf (ne_of_apply_ne f h)
#align is_closed_range_of_spaced_out isClosed_range_of_spaced_out
@@ -310,18 +319,19 @@ theorem isClosed_range_of_spaced_out {ι} [SeparatedSpace α] {V₀ : Set (α ×
namespace UniformSpace
-#print UniformSpace.separationSetoid /-
+/- warning: uniform_space.separation_setoid clashes with inseparable_setoid -> inseparableSetoid
+Case conversion may be inaccurate. Consider using '#align uniform_space.separation_setoid inseparableSetoidₓ'. -/
+#print inseparableSetoid /-
/-- The separation relation of a uniform space seen as a setoid. -/
-def separationSetoid (α : Type u) [UniformSpace α] : Setoid α :=
+def inseparableSetoid (α : Type u) [UniformSpace α] : Setoid α :=
⟨fun x y => (x, y) ∈ 𝓢 α, separated_equiv⟩
-#align uniform_space.separation_setoid UniformSpace.separationSetoid
+#align uniform_space.separation_setoid inseparableSetoid
-/
attribute [local instance] separation_setoid
-#print UniformSpace.separationSetoid.uniformSpace /-
-instance separationSetoid.uniformSpace {α : Type u} [u : UniformSpace α] :
- UniformSpace (Quotient (separationSetoid α))
+instance inseparableSetoid.uniformSpace {α : Type u} [u : UniformSpace α] :
+ UniformSpace (Quotient (inseparableSetoid α))
where
toTopologicalSpace := u.toTopologicalSpace.coinduced fun x => ⟦x⟧
uniformity := map (fun p : α × α => (⟦p.1⟧, ⟦p.2⟧)) u.uniformity
@@ -339,8 +349,8 @@ instance separationSetoid.uniformSpace {α : Type u} [u : UniformSpace α] :
compRel s (compRel s s)) :=
(lift'_mono' fun s hs ⟨a, b⟩ ⟨c, ⟨⟨a₁, a₂⟩, ha, a_eq⟩, ⟨⟨b₁, b₂⟩, hb, b_eq⟩⟩ =>
by
- simp at a_eq
- simp at b_eq
+ simp at a_eq
+ simp at b_eq
have h : ⟦a₂⟧ = ⟦b₁⟧ := by rw [a_eq.right, b_eq.left]
have h : (a₂, b₁) ∈ 𝓢 α := Quotient.exact h
simp [Function.comp, Set.image, compRel, and_comm, and_left_comm, and_assoc]
@@ -367,52 +377,50 @@ instance separationSetoid.uniformSpace {α : Type u} [u : UniformSpace α] :
simp only [isOpen_coinduced, isOpen_uniformity, uniformity, Quotient.forall, mem_preimage,
mem_map, preimage_set_of_eq, Quotient.eq']
exact ⟨fun h a ha => (this a ha).mp <| h a ha, fun h a ha => (this a ha).mpr <| h a ha⟩
-#align uniform_space.separation_setoid.uniform_space UniformSpace.separationSetoid.uniformSpace
--/
+#align uniform_space.separation_setoid.uniform_space inseparableSetoid.uniformSpace
-#print UniformSpace.uniformity_quotient /-
-theorem uniformity_quotient :
- 𝓤 (Quotient (separationSetoid α)) = (𝓤 α).map fun p : α × α => (⟦p.1⟧, ⟦p.2⟧) :=
+#print SeparationQuotient.uniformity_eq /-
+theorem uniformity_eq :
+ 𝓤 (Quotient (inseparableSetoid α)) = (𝓤 α).map fun p : α × α => (⟦p.1⟧, ⟦p.2⟧) :=
rfl
-#align uniform_space.uniformity_quotient UniformSpace.uniformity_quotient
+#align uniform_space.uniformity_quotient SeparationQuotient.uniformity_eq
-/
-#print UniformSpace.uniformContinuous_quotient_mk' /-
-theorem uniformContinuous_quotient_mk' :
- UniformContinuous (Quotient.mk' : α → Quotient (separationSetoid α)) :=
+#print SeparationQuotient.uniformContinuous_mk /-
+theorem uniformContinuous_mk :
+ UniformContinuous (Quotient.mk' : α → Quotient (inseparableSetoid α)) :=
le_rfl
-#align uniform_space.uniform_continuous_quotient_mk UniformSpace.uniformContinuous_quotient_mk'
+#align uniform_space.uniform_continuous_quotient_mk SeparationQuotient.uniformContinuous_mk
-/
-#print UniformSpace.uniformContinuous_quotient /-
-theorem uniformContinuous_quotient {f : Quotient (separationSetoid α) → β}
+#print SeparationQuotient.uniformContinuous_dom /-
+theorem uniformContinuous_dom {f : Quotient (inseparableSetoid α) → β}
(hf : UniformContinuous fun x => f ⟦x⟧) : UniformContinuous f :=
hf
-#align uniform_space.uniform_continuous_quotient UniformSpace.uniformContinuous_quotient
+#align uniform_space.uniform_continuous_quotient SeparationQuotient.uniformContinuous_dom
-/
-#print UniformSpace.uniformContinuous_quotient_lift /-
-theorem uniformContinuous_quotient_lift {f : α → β} {h : ∀ a b, (a, b) ∈ 𝓢 α → f a = f b}
+#print SeparationQuotient.uniformContinuous_lift /-
+theorem uniformContinuous_lift {f : α → β} {h : ∀ a b, (a, b) ∈ 𝓢 α → f a = f b}
(hf : UniformContinuous f) : UniformContinuous fun a => Quotient.lift f h a :=
- uniformContinuous_quotient hf
-#align uniform_space.uniform_continuous_quotient_lift UniformSpace.uniformContinuous_quotient_lift
+ uniformContinuous_dom hf
+#align uniform_space.uniform_continuous_quotient_lift SeparationQuotient.uniformContinuous_lift
-/
-#print UniformSpace.uniformContinuous_quotient_lift₂ /-
-theorem uniformContinuous_quotient_lift₂ {f : α → β → γ}
+#print SeparationQuotient.uniformContinuous_uncurry_lift₂ /-
+theorem uniformContinuous_uncurry_lift₂ {f : α → β → γ}
{h : ∀ a c b d, (a, b) ∈ 𝓢 α → (c, d) ∈ 𝓢 β → f a c = f b d}
(hf : UniformContinuous fun p : α × β => f p.1 p.2) :
UniformContinuous fun p : _ × _ => Quotient.lift₂ f h p.1 p.2 :=
by
rw [UniformContinuous, uniformity_prod_eq_prod, uniformity_quotient, uniformity_quotient,
Filter.prod_map_map_eq, Filter.tendsto_map'_iff, Filter.tendsto_map'_iff]
- rwa [UniformContinuous, uniformity_prod_eq_prod, Filter.tendsto_map'_iff] at hf
-#align uniform_space.uniform_continuous_quotient_lift₂ UniformSpace.uniformContinuous_quotient_lift₂
+ rwa [UniformContinuous, uniformity_prod_eq_prod, Filter.tendsto_map'_iff] at hf
+#align uniform_space.uniform_continuous_quotient_lift₂ SeparationQuotient.uniformContinuous_uncurry_lift₂
-/
-#print UniformSpace.comap_quotient_le_uniformity /-
theorem comap_quotient_le_uniformity :
- ((𝓤 <| Quotient <| separationSetoid α).comap fun p : α × α => (⟦p.fst⟧, ⟦p.snd⟧)) ≤ 𝓤 α :=
+ ((𝓤 <| Quotient <| inseparableSetoid α).comap fun p : α × α => (⟦p.fst⟧, ⟦p.snd⟧)) ≤ 𝓤 α :=
fun t' ht' =>
let ⟨t, ht, tt_t'⟩ := comp_mem_uniformity_sets ht'
let ⟨s, hs, ss_t⟩ := comp_mem_uniformity_sets ht
@@ -425,138 +433,148 @@ theorem comap_quotient_le_uniformity :
tt_t'
⟨b₁, show ((a₁, a₂).1, b₁) ∈ t from ab₁, ss_t ⟨b₂, show ((b₁, a₂).1, b₂) ∈ s from hb, ba₂⟩⟩⟩
#align uniform_space.comap_quotient_le_uniformity UniformSpace.comap_quotient_le_uniformity
--/
-#print UniformSpace.comap_quotient_eq_uniformity /-
-theorem comap_quotient_eq_uniformity :
- ((𝓤 <| Quotient <| separationSetoid α).comap fun p : α × α => (⟦p.fst⟧, ⟦p.snd⟧)) = 𝓤 α :=
+#print SeparationQuotient.comap_mk_uniformity /-
+theorem comap_mk_uniformity :
+ ((𝓤 <| Quotient <| inseparableSetoid α).comap fun p : α × α => (⟦p.fst⟧, ⟦p.snd⟧)) = 𝓤 α :=
le_antisymm comap_quotient_le_uniformity le_comap_map
-#align uniform_space.comap_quotient_eq_uniformity UniformSpace.comap_quotient_eq_uniformity
+#align uniform_space.comap_quotient_eq_uniformity SeparationQuotient.comap_mk_uniformity
-/
-#print UniformSpace.separated_separation /-
-instance separated_separation : SeparatedSpace (Quotient (separationSetoid α)) :=
+#print SeparationQuotient.instT0Space /-
+instance instT0Space : T0Space (Quotient (inseparableSetoid α)) :=
⟨Set.ext fun ⟨a, b⟩ =>
Quotient.induction_on₂ a b fun a b =>
⟨fun h =>
have : a ≈ b := fun s hs =>
have :
- s ∈ (𝓤 <| Quotient <| separationSetoid α).comap fun p : α × α => (⟦p.1⟧, ⟦p.2⟧) :=
+ s ∈ (𝓤 <| Quotient <| inseparableSetoid α).comap fun p : α × α => (⟦p.1⟧, ⟦p.2⟧) :=
comap_quotient_le_uniformity hs
let ⟨t, ht, hts⟩ := this
hts (by dsimp [preimage]; exact h t ht)
show ⟦a⟧ = ⟦b⟧ from Quotient.sound this,
fun heq : ⟦a⟧ = ⟦b⟧ => fun h hs => HEq ▸ refl_mem_uniformity hs⟩⟩
-#align uniform_space.separated_separation UniformSpace.separated_separation
+#align uniform_space.separated_separation SeparationQuotient.instT0Space
-/
-#print UniformSpace.separated_of_uniformContinuous /-
-theorem separated_of_uniformContinuous {f : α → β} {x y : α} (H : UniformContinuous f) (h : x ≈ y) :
- f x ≈ f y := fun _ h' => h _ (H h')
-#align uniform_space.separated_of_uniform_continuous UniformSpace.separated_of_uniformContinuous
+/- warning: uniform_space.separated_of_uniform_continuous clashes with inseparable.map -> Inseparable.map
+Case conversion may be inaccurate. Consider using '#align uniform_space.separated_of_uniform_continuous Inseparable.mapₓ'. -/
+#print Inseparable.map /-
+theorem map {f : α → β} {x y : α} (H : UniformContinuous f) (h : x ≈ y) : f x ≈ f y := fun _ h' =>
+ h _ (H h')
+#align uniform_space.separated_of_uniform_continuous Inseparable.map
-/
-#print UniformSpace.eq_of_separated_of_uniformContinuous /-
-theorem eq_of_separated_of_uniformContinuous [SeparatedSpace β] {f : α → β} {x y : α}
+theorem eq_of_separated_of_uniformContinuous [T0Space β] {f : α → β} {x y : α}
(H : UniformContinuous f) (h : x ≈ y) : f x = f y :=
- separated_def.1 (by infer_instance) _ _ <| separated_of_uniformContinuous H h
+ t0Space_iff_uniformity.1 (by infer_instance) _ _ <| map H h
#align uniform_space.eq_of_separated_of_uniform_continuous UniformSpace.eq_of_separated_of_uniformContinuous
--/
-#print UniformSpace.SeparationQuotient /-
+/- warning: uniform_space.separation_quotient clashes with separation_quotient -> SeparationQuotient
+Case conversion may be inaccurate. Consider using '#align uniform_space.separation_quotient SeparationQuotientₓ'. -/
+#print SeparationQuotient /-
/-- The maximal separated quotient of a uniform space `α`. -/
def SeparationQuotient (α : Type _) [UniformSpace α] :=
- Quotient (separationSetoid α)
-#align uniform_space.separation_quotient UniformSpace.SeparationQuotient
+ Quotient (inseparableSetoid α)
+#align uniform_space.separation_quotient SeparationQuotient
-/
namespace SeparationQuotient
instance : UniformSpace (SeparationQuotient α) :=
- separationSetoid.uniformSpace
+ inseparableSetoid.uniformSpace
-instance : SeparatedSpace (SeparationQuotient α) :=
- UniformSpace.separated_separation
+instance : T0Space (SeparationQuotient α) :=
+ SeparationQuotient.instT0Space
instance [Inhabited α] : Inhabited (SeparationQuotient α) :=
- Quotient.inhabited (separationSetoid α)
+ Quotient.inhabited (inseparableSetoid α)
-#print UniformSpace.SeparationQuotient.mk_eq_mk /-
-theorem mk_eq_mk {x y : α} : (⟦x⟧ : SeparationQuotient α) = ⟦y⟧ ↔ Inseparable x y :=
- Quotient.eq''.trans separationRel_iff_inseparable
-#align uniform_space.separation_quotient.mk_eq_mk UniformSpace.SeparationQuotient.mk_eq_mk
+/- warning: uniform_space.separation_quotient.mk_eq_mk clashes with separation_quotient.mk_eq_mk -> SeparationQuotient.mk_eq_mk
+Case conversion may be inaccurate. Consider using '#align uniform_space.separation_quotient.mk_eq_mk SeparationQuotient.mk_eq_mkₓ'. -/
+#print SeparationQuotient.mk_eq_mk /-
+theorem SeparationQuotient.mk_eq_mk {x y : α} :
+ (⟦x⟧ : SeparationQuotient α) = ⟦y⟧ ↔ Inseparable x y :=
+ Quotient.eq''.trans inseparable_iff_inseparable
+#align uniform_space.separation_quotient.mk_eq_mk SeparationQuotient.mk_eq_mk
-/
-#print UniformSpace.SeparationQuotient.lift /-
+#print SeparationQuotient.lift' /-
/-- Factoring functions to a separated space through the separation quotient. -/
-def lift [SeparatedSpace β] (f : α → β) : SeparationQuotient α → β :=
+def SeparationQuotient.lift' [T0Space β] (f : α → β) : SeparationQuotient α → β :=
if h : UniformContinuous f then Quotient.lift f fun x y => eq_of_separated_of_uniformContinuous h
else fun x => f (Nonempty.some ⟨x.out⟩)
-#align uniform_space.separation_quotient.lift UniformSpace.SeparationQuotient.lift
+#align uniform_space.separation_quotient.lift SeparationQuotient.lift'
-/
-#print UniformSpace.SeparationQuotient.lift_mk /-
-theorem lift_mk [SeparatedSpace β] {f : α → β} (h : UniformContinuous f) (a : α) :
- lift f ⟦a⟧ = f a := by rw [lift, dif_pos h] <;> rfl
-#align uniform_space.separation_quotient.lift_mk UniformSpace.SeparationQuotient.lift_mk
+#print SeparationQuotient.lift'_mk /-
+theorem SeparationQuotient.lift'_mk [T0Space β] {f : α → β} (h : UniformContinuous f) (a : α) :
+ SeparationQuotient.lift' f ⟦a⟧ = f a := by rw [lift, dif_pos h] <;> rfl
+#align uniform_space.separation_quotient.lift_mk SeparationQuotient.lift'_mk
-/
-#print UniformSpace.SeparationQuotient.uniformContinuous_lift /-
-theorem uniformContinuous_lift [SeparatedSpace β] (f : α → β) : UniformContinuous (lift f) :=
+#print SeparationQuotient.uniformContinuous_lift' /-
+theorem SeparationQuotient.uniformContinuous_lift' [T0Space β] (f : α → β) :
+ UniformContinuous (SeparationQuotient.lift' f) :=
by
by_cases hf : UniformContinuous f
· rw [lift, dif_pos hf]; exact uniform_continuous_quotient_lift hf
· rw [lift, dif_neg hf]; exact uniformContinuous_of_const fun a b => rfl
-#align uniform_space.separation_quotient.uniform_continuous_lift UniformSpace.SeparationQuotient.uniformContinuous_lift
+#align uniform_space.separation_quotient.uniform_continuous_lift SeparationQuotient.uniformContinuous_lift'
-/
-#print UniformSpace.SeparationQuotient.map /-
+#print SeparationQuotient.map /-
/-- The separation quotient functor acting on functions. -/
-def map (f : α → β) : SeparationQuotient α → SeparationQuotient β :=
- lift (Quotient.mk' ∘ f)
-#align uniform_space.separation_quotient.map UniformSpace.SeparationQuotient.map
+def SeparationQuotient.map (f : α → β) : SeparationQuotient α → SeparationQuotient β :=
+ SeparationQuotient.lift' (Quotient.mk' ∘ f)
+#align uniform_space.separation_quotient.map SeparationQuotient.map
-/
-#print UniformSpace.SeparationQuotient.map_mk /-
-theorem map_mk {f : α → β} (h : UniformContinuous f) (a : α) : map f ⟦a⟧ = ⟦f a⟧ := by
+#print SeparationQuotient.map_mk /-
+theorem SeparationQuotient.map_mk {f : α → β} (h : UniformContinuous f) (a : α) :
+ SeparationQuotient.map f ⟦a⟧ = ⟦f a⟧ := by
rw [map, lift_mk (uniform_continuous_quotient_mk.comp h)]
-#align uniform_space.separation_quotient.map_mk UniformSpace.SeparationQuotient.map_mk
+#align uniform_space.separation_quotient.map_mk SeparationQuotient.map_mk
-/
-#print UniformSpace.SeparationQuotient.uniformContinuous_map /-
-theorem uniformContinuous_map (f : α → β) : UniformContinuous (map f) :=
- uniformContinuous_lift (Quotient.mk' ∘ f)
-#align uniform_space.separation_quotient.uniform_continuous_map UniformSpace.SeparationQuotient.uniformContinuous_map
+#print SeparationQuotient.uniformContinuous_map /-
+theorem SeparationQuotient.uniformContinuous_map (f : α → β) :
+ UniformContinuous (SeparationQuotient.map f) :=
+ SeparationQuotient.uniformContinuous_lift' (Quotient.mk' ∘ f)
+#align uniform_space.separation_quotient.uniform_continuous_map SeparationQuotient.uniformContinuous_map
-/
-#print UniformSpace.SeparationQuotient.map_unique /-
-theorem map_unique {f : α → β} (hf : UniformContinuous f)
+#print SeparationQuotient.map_unique /-
+theorem SeparationQuotient.map_unique {f : α → β} (hf : UniformContinuous f)
{g : SeparationQuotient α → SeparationQuotient β} (comm : Quotient.mk' ∘ f = g ∘ Quotient.mk') :
- map f = g := by
+ SeparationQuotient.map f = g := by
ext ⟨a⟩ <;>
calc
map f ⟦a⟧ = ⟦f a⟧ := map_mk hf a
_ = g ⟦a⟧ := congr_fun comm a
-#align uniform_space.separation_quotient.map_unique UniformSpace.SeparationQuotient.map_unique
+#align uniform_space.separation_quotient.map_unique SeparationQuotient.map_unique
-/
-#print UniformSpace.SeparationQuotient.map_id /-
-theorem map_id : map (@id α) = id :=
- map_unique uniformContinuous_id rfl
-#align uniform_space.separation_quotient.map_id UniformSpace.SeparationQuotient.map_id
+#print SeparationQuotient.map_id /-
+theorem SeparationQuotient.map_id : SeparationQuotient.map (@id α) = id :=
+ SeparationQuotient.map_unique uniformContinuous_id rfl
+#align uniform_space.separation_quotient.map_id SeparationQuotient.map_id
-/
-#print UniformSpace.SeparationQuotient.map_comp /-
-theorem map_comp {f : α → β} {g : β → γ} (hf : UniformContinuous f) (hg : UniformContinuous g) :
- map g ∘ map f = map (g ∘ f) :=
- (map_unique (hg.comp hf) <| by simp only [(· ∘ ·), map_mk, hf, hg]).symm
-#align uniform_space.separation_quotient.map_comp UniformSpace.SeparationQuotient.map_comp
+#print SeparationQuotient.map_comp /-
+theorem SeparationQuotient.map_comp {f : α → β} {g : β → γ} (hf : UniformContinuous f)
+ (hg : UniformContinuous g) :
+ SeparationQuotient.map g ∘ SeparationQuotient.map f = SeparationQuotient.map (g ∘ f) :=
+ (SeparationQuotient.map_unique (hg.comp hf) <| by simp only [(· ∘ ·), map_mk, hf, hg]).symm
+#align uniform_space.separation_quotient.map_comp SeparationQuotient.map_comp
-/
end SeparationQuotient
-#print UniformSpace.separation_prod /-
-theorem separation_prod {a₁ a₂ : α} {b₁ b₂ : β} : (a₁, b₁) ≈ (a₂, b₂) ↔ a₁ ≈ a₂ ∧ b₁ ≈ b₂ :=
+/- warning: uniform_space.separation_prod clashes with inseparable_prod -> inseparable_prod
+Case conversion may be inaccurate. Consider using '#align uniform_space.separation_prod inseparable_prodₓ'. -/
+#print inseparable_prod /-
+theorem inseparable_prod {a₁ a₂ : α} {b₁ b₂ : β} : (a₁, b₁) ≈ (a₂, b₂) ↔ a₁ ≈ a₂ ∧ b₁ ≈ b₂ :=
by
constructor
· intro h
@@ -564,22 +582,22 @@ theorem separation_prod {a₁ a₂ : α} {b₁ b₂ : β} : (a₁, b₁) ≈ (a
⟨separated_of_uniform_continuous uniformContinuous_fst h,
separated_of_uniform_continuous uniformContinuous_snd h⟩
· rintro ⟨eqv_α, eqv_β⟩ r r_in
- rw [uniformity_prod] at r_in
+ rw [uniformity_prod] at r_in
rcases r_in with ⟨t_α, ⟨r_α, r_α_in, h_α⟩, t_β, ⟨r_β, r_β_in, h_β⟩, rfl⟩
let p_α := fun p : (α × β) × α × β => (p.1.1, p.2.1)
let p_β := fun p : (α × β) × α × β => (p.1.2, p.2.2)
have key_α : p_α ((a₁, b₁), (a₂, b₂)) ∈ r_α := by simp [p_α, eqv_α r_α r_α_in]
have key_β : p_β ((a₁, b₁), (a₂, b₂)) ∈ r_β := by simp [p_β, eqv_β r_β r_β_in]
exact ⟨h_α key_α, h_β key_β⟩
-#align uniform_space.separation_prod UniformSpace.separation_prod
+#align uniform_space.separation_prod inseparable_prod
-/
-#print UniformSpace.Separated.prod /-
-instance Separated.prod [SeparatedSpace α] [SeparatedSpace β] : SeparatedSpace (α × β) :=
- separated_def.2 fun x y H =>
+#print Prod.instT0Space /-
+instance Prod.instT0Space [T0Space α] [T0Space β] : T0Space (α × β) :=
+ t0Space_iff_uniformity.2 fun x y H =>
Prod.ext (eq_of_separated_of_uniformContinuous uniformContinuous_fst H)
(eq_of_separated_of_uniformContinuous uniformContinuous_snd H)
-#align uniform_space.separated.prod UniformSpace.Separated.prod
+#align uniform_space.separated.prod Prod.instT0Space
-/
end UniformSpace
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -92,7 +92,7 @@ variable [UniformSpace α] [UniformSpace β] [UniformSpace γ]
#print UniformSpace.to_regularSpace /-
instance (priority := 100) UniformSpace.to_regularSpace : RegularSpace α :=
- RegularSpace.ofBasis
+ RegularSpace.of_hasBasis
(fun a => by rw [nhds_eq_comap_uniformity]; exact uniformity_has_basis_closed.comap _)
fun a V hV => hV.2.Preimage <| continuous_const.prod_mk continuous_id
#align uniform_space.to_regular_space UniformSpace.to_regularSpace
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -249,7 +249,16 @@ theorem isClosed_separationRel : IsClosed (𝓢 α) :=
-/
#print separated_iff_t2 /-
-theorem separated_iff_t2 : SeparatedSpace α ↔ T2Space α := by classical
+theorem separated_iff_t2 : SeparatedSpace α ↔ T2Space α := by
+ classical
+ constructor <;> intro h
+ · rw [t2_iff_isClosed_diagonal, ← show 𝓢 α = diagonal α from h.1]
+ exact isClosed_separationRel
+ · rw [separated_def']
+ intro x y hxy
+ rcases t2_separation hxy with ⟨u, v, uo, vo, hx, hy, h⟩
+ rcases isOpen_iff_ball_subset.1 uo x hx with ⟨r, hrU, hr⟩
+ exact ⟨r, hrU, fun H => h.le_bot ⟨hr H, hy⟩⟩
#align separated_iff_t2 separated_iff_t2
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -249,16 +249,7 @@ theorem isClosed_separationRel : IsClosed (𝓢 α) :=
-/
#print separated_iff_t2 /-
-theorem separated_iff_t2 : SeparatedSpace α ↔ T2Space α := by
- classical
- constructor <;> intro h
- · rw [t2_iff_isClosed_diagonal, ← show 𝓢 α = diagonal α from h.1]
- exact isClosed_separationRel
- · rw [separated_def']
- intro x y hxy
- rcases t2_separation hxy with ⟨u, v, uo, vo, hx, hy, h⟩
- rcases isOpen_iff_ball_subset.1 uo x hx with ⟨r, hrU, hr⟩
- exact ⟨r, hrU, fun H => h.le_bot ⟨hr H, hy⟩⟩
+theorem separated_iff_t2 : SeparatedSpace α ↔ T2Space α := by classical
#align separated_iff_t2 separated_iff_t2
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/b1abe23ae96fef89ad30d9f4362c307f72a55010
@@ -165,7 +165,8 @@ theorem separated_def {α : Type u} [UniformSpace α] :
#print separated_def' /-
theorem separated_def' {α : Type u} [UniformSpace α] :
SeparatedSpace α ↔ ∀ x y, x ≠ y → ∃ r ∈ 𝓤 α, (x, y) ∉ r :=
- separated_def.trans <| forall₂_congr fun x y => by rw [← not_imp_not] <;> simp [not_forall]
+ separated_def.trans <|
+ forall₂_congr fun x y => by rw [← not_imp_not] <;> simp [Classical.not_forall]
#align separated_def' separated_def'
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,9 +3,9 @@ Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Patrick Massot
-/
-import Mathbin.Tactic.ApplyFun
-import Mathbin.Topology.UniformSpace.Basic
-import Mathbin.Topology.Separation
+import Tactic.ApplyFun
+import Topology.UniformSpace.Basic
+import Topology.Separation
#align_import topology.uniform_space.separation from "leanprover-community/mathlib"@"0c1f285a9f6e608ae2bdffa3f993eafb01eba829"
@@ -76,7 +76,7 @@ open scoped Classical Topology uniformity Filter
noncomputable section
-/- ./././Mathport/Syntax/Translate/Basic.lean:334:40: warning: unsupported option eqn_compiler.zeta -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:339:40: warning: unsupported option eqn_compiler.zeta -/
set_option eqn_compiler.zeta true
universe u v w
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -363,7 +363,7 @@ instance separationSetoid.uniformSpace {α : Type u} [u : UniformSpace α] :
have ht' : ∀ {a₁ a₂}, a₁ ≈ a₂ → (a₁, a₂) ∈ t := fun a₁ a₂ h => sInter_subset_of_mem ht h
u.uniformity.sets_of_superset ht fun ⟨a₁, a₂⟩ h₁ h₂ => hts (ht' <| Setoid.symm h₂) h₁,
fun h => u.uniformity.sets_of_superset h <| by simp (config := { contextual := true })⟩
- simp only [isOpen_coinduced, isOpen_uniformity, uniformity, forall_quotient_iff, mem_preimage,
+ simp only [isOpen_coinduced, isOpen_uniformity, uniformity, Quotient.forall, mem_preimage,
mem_map, preimage_set_of_eq, Quotient.eq']
exact ⟨fun h a ha => (this a ha).mp <| h a ha, fun h a ha => (this a ha).mpr <| h a ha⟩
#align uniform_space.separation_setoid.uniform_space UniformSpace.separationSetoid.uniformSpace
mathlib commit https://github.com/leanprover-community/mathlib/commit/001ffdc42920050657fd45bd2b8bfbec8eaaeb29
@@ -218,8 +218,8 @@ theorem separationRel_comap {f : α → β}
by
subst h
dsimp [separationRel]
- simp_rw [uniformity_comap, (Filter.comap_hasBasis (Prod.map f f) (𝓤 β)).sInter_sets, ←
- preimage_Inter, sInter_eq_bInter]
+ simp_rw [uniformity_comap, (Filter.comap_hasBasis (Prod.map f f) (𝓤 β)).ker, ← preimage_Inter,
+ sInter_eq_bInter]
rfl
#align separation_rel_comap separationRel_comap
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,16 +2,13 @@
Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Patrick Massot
-
-! This file was ported from Lean 3 source module topology.uniform_space.separation
-! leanprover-community/mathlib commit 0c1f285a9f6e608ae2bdffa3f993eafb01eba829
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Tactic.ApplyFun
import Mathbin.Topology.UniformSpace.Basic
import Mathbin.Topology.Separation
+#align_import topology.uniform_space.separation from "leanprover-community/mathlib"@"0c1f285a9f6e608ae2bdffa3f993eafb01eba829"
+
/-!
# Hausdorff properties of uniform spaces. Separation quotient.
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -110,7 +110,6 @@ protected def separationRel (α : Type u) [u : UniformSpace α] :=
#align separation_rel separationRel
-/
--- mathport name: separation_rel
scoped[uniformity] notation "𝓢" => separationRel
#print separated_equiv /-
@@ -124,10 +123,12 @@ theorem separated_equiv : Equivalence fun x y => (x, y) ∈ 𝓢 α :=
#align separated_equiv separated_equiv
-/
+#print Filter.HasBasis.mem_separationRel /-
theorem Filter.HasBasis.mem_separationRel {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
(h : (𝓤 α).HasBasis p s) {a : α × α} : a ∈ 𝓢 α ↔ ∀ i, p i → a ∈ s i :=
h.forall_mem_mem
#align filter.has_basis.mem_separation_rel Filter.HasBasis.mem_separationRel
+-/
#print separationRel_iff_specializes /-
theorem separationRel_iff_specializes {a b : α} : (a, b) ∈ 𝓢 α ↔ a ⤳ b := by
@@ -164,10 +165,12 @@ theorem separated_def {α : Type u} [UniformSpace α] :
#align separated_def separated_def
-/
+#print separated_def' /-
theorem separated_def' {α : Type u} [UniformSpace α] :
SeparatedSpace α ↔ ∀ x y, x ≠ y → ∃ r ∈ 𝓤 α, (x, y) ∉ r :=
separated_def.trans <| forall₂_congr fun x y => by rw [← not_imp_not] <;> simp [not_forall]
#align separated_def' separated_def'
+-/
#print eq_of_uniformity /-
theorem eq_of_uniformity {α : Type _} [UniformSpace α] [SeparatedSpace α] {x y : α}
@@ -176,6 +179,7 @@ theorem eq_of_uniformity {α : Type _} [UniformSpace α] [SeparatedSpace α] {x
#align eq_of_uniformity eq_of_uniformity
-/
+#print eq_of_uniformity_basis /-
theorem eq_of_uniformity_basis {α : Type _} [UniformSpace α] [SeparatedSpace α] {ι : Type _}
{p : ι → Prop} {s : ι → Set (α × α)} (hs : (𝓤 α).HasBasis p s) {x y : α}
(h : ∀ {i}, p i → (x, y) ∈ s i) : x = y :=
@@ -183,6 +187,7 @@ theorem eq_of_uniformity_basis {α : Type _} [UniformSpace α] [SeparatedSpace
let ⟨i, hi, H⟩ := hs.mem_iff.mp V_in
H (h hi)
#align eq_of_uniformity_basis eq_of_uniformity_basis
+-/
#print eq_of_forall_symmetric /-
theorem eq_of_forall_symmetric {α : Type _} [UniformSpace α] [SeparatedSpace α] {x y : α}
@@ -191,11 +196,13 @@ theorem eq_of_forall_symmetric {α : Type _} [UniformSpace α] [SeparatedSpace
#align eq_of_forall_symmetric eq_of_forall_symmetric
-/
+#print eq_of_clusterPt_uniformity /-
theorem eq_of_clusterPt_uniformity [SeparatedSpace α] {x y : α} (h : ClusterPt (x, y) (𝓤 α)) :
x = y :=
eq_of_uniformity_basis uniformity_hasBasis_closed fun V ⟨hV, hVc⟩ =>
isClosed_iff_clusterPt.1 hVc _ <| h.mono <| le_principal_iff.2 hV
#align eq_of_cluster_pt_uniformity eq_of_clusterPt_uniformity
+-/
#print idRel_sub_separationRel /-
theorem idRel_sub_separationRel (α : Type _) [UniformSpace α] : idRel ⊆ 𝓢 α :=
@@ -220,15 +227,20 @@ theorem separationRel_comap {f : α → β}
#align separation_rel_comap separationRel_comap
-/
+#print Filter.HasBasis.separationRel /-
protected theorem Filter.HasBasis.separationRel {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
(h : HasBasis (𝓤 α) p s) : 𝓢 α = ⋂ (i) (hi : p i), s i := by unfold separationRel;
rw [h.sInter_sets]
#align filter.has_basis.separation_rel Filter.HasBasis.separationRel
+-/
+#print separationRel_eq_inter_closure /-
theorem separationRel_eq_inter_closure : 𝓢 α = ⋂₀ (closure '' (𝓤 α).sets) := by
simp [uniformity_has_basis_closure.separation_rel]
#align separation_rel_eq_inter_closure separationRel_eq_inter_closure
+-/
+#print isClosed_separationRel /-
theorem isClosed_separationRel : IsClosed (𝓢 α) :=
by
rw [separationRel_eq_inter_closure]
@@ -236,6 +248,7 @@ theorem isClosed_separationRel : IsClosed (𝓢 α) :=
rintro _ ⟨t, t_in, rfl⟩
exact isClosed_closure
#align is_closed_separation_rel isClosed_separationRel
+-/
#print separated_iff_t2 /-
theorem separated_iff_t2 : SeparatedSpace α ↔ T2Space α := by
@@ -285,10 +298,12 @@ theorem isClosed_of_spaced_out [SeparatedSpace α] {V₀ : Set (α × α)} (V₀
#align is_closed_of_spaced_out isClosed_of_spaced_out
-/
+#print isClosed_range_of_spaced_out /-
theorem isClosed_range_of_spaced_out {ι} [SeparatedSpace α] {V₀ : Set (α × α)} (V₀_in : V₀ ∈ 𝓤 α)
{f : ι → α} (hf : Pairwise fun x y => (f x, f y) ∉ V₀) : IsClosed (range f) :=
isClosed_of_spaced_out V₀_in <| by rintro _ ⟨x, rfl⟩ _ ⟨y, rfl⟩ h; exact hf (ne_of_apply_ne f h)
#align is_closed_range_of_spaced_out isClosed_range_of_spaced_out
+-/
/-!
### Separation quotient
@@ -385,6 +400,7 @@ theorem uniformContinuous_quotient_lift {f : α → β} {h : ∀ a b, (a, b) ∈
#align uniform_space.uniform_continuous_quotient_lift UniformSpace.uniformContinuous_quotient_lift
-/
+#print UniformSpace.uniformContinuous_quotient_lift₂ /-
theorem uniformContinuous_quotient_lift₂ {f : α → β → γ}
{h : ∀ a c b d, (a, b) ∈ 𝓢 α → (c, d) ∈ 𝓢 β → f a c = f b d}
(hf : UniformContinuous fun p : α × β => f p.1 p.2) :
@@ -394,7 +410,9 @@ theorem uniformContinuous_quotient_lift₂ {f : α → β → γ}
Filter.prod_map_map_eq, Filter.tendsto_map'_iff, Filter.tendsto_map'_iff]
rwa [UniformContinuous, uniformity_prod_eq_prod, Filter.tendsto_map'_iff] at hf
#align uniform_space.uniform_continuous_quotient_lift₂ UniformSpace.uniformContinuous_quotient_lift₂
+-/
+#print UniformSpace.comap_quotient_le_uniformity /-
theorem comap_quotient_le_uniformity :
((𝓤 <| Quotient <| separationSetoid α).comap fun p : α × α => (⟦p.fst⟧, ⟦p.snd⟧)) ≤ 𝓤 α :=
fun t' ht' =>
@@ -409,6 +427,7 @@ theorem comap_quotient_le_uniformity :
tt_t'
⟨b₁, show ((a₁, a₂).1, b₁) ∈ t from ab₁, ss_t ⟨b₂, show ((b₁, a₂).1, b₂) ∈ s from hb, ba₂⟩⟩⟩
#align uniform_space.comap_quotient_le_uniformity UniformSpace.comap_quotient_le_uniformity
+-/
#print UniformSpace.comap_quotient_eq_uniformity /-
theorem comap_quotient_eq_uniformity :
@@ -538,6 +557,7 @@ theorem map_comp {f : α → β} {g : β → γ} (hf : UniformContinuous f) (hg
end SeparationQuotient
+#print UniformSpace.separation_prod /-
theorem separation_prod {a₁ a₂ : α} {b₁ b₂ : β} : (a₁, b₁) ≈ (a₂, b₂) ↔ a₁ ≈ a₂ ∧ b₁ ≈ b₂ :=
by
constructor
@@ -554,12 +574,15 @@ theorem separation_prod {a₁ a₂ : α} {b₁ b₂ : β} : (a₁, b₁) ≈ (a
have key_β : p_β ((a₁, b₁), (a₂, b₂)) ∈ r_β := by simp [p_β, eqv_β r_β r_β_in]
exact ⟨h_α key_α, h_β key_β⟩
#align uniform_space.separation_prod UniformSpace.separation_prod
+-/
+#print UniformSpace.Separated.prod /-
instance Separated.prod [SeparatedSpace α] [SeparatedSpace β] : SeparatedSpace (α × β) :=
separated_def.2 fun x y H =>
Prod.ext (eq_of_separated_of_uniformContinuous uniformContinuous_fst H)
(eq_of_separated_of_uniformContinuous uniformContinuous_snd H)
#align uniform_space.separated.prod UniformSpace.Separated.prod
+-/
end UniformSpace
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -337,7 +337,6 @@ instance separationSetoid.uniformSpace {α : Type u} [u : UniformSpace α] :
(u.uniformity.lift' fun s : Set (α × α) => compRel s (compRel s s)) :=
by rw [map_lift'_eq] <;> exact monotone_id.comp_rel (monotone_id.comp_rel monotone_id)
_ ≤ map (fun p : α × α => (⟦p.1⟧, ⟦p.2⟧)) u.uniformity := map_mono comp_le_uniformity3
-
isOpen_uniformity s :=
by
have :
@@ -521,7 +520,6 @@ theorem map_unique {f : α → β} (hf : UniformContinuous f)
calc
map f ⟦a⟧ = ⟦f a⟧ := map_mk hf a
_ = g ⟦a⟧ := congr_fun comm a
-
#align uniform_space.separation_quotient.map_unique UniformSpace.SeparationQuotient.map_unique
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -240,14 +240,14 @@ theorem isClosed_separationRel : IsClosed (𝓢 α) :=
#print separated_iff_t2 /-
theorem separated_iff_t2 : SeparatedSpace α ↔ T2Space α := by
classical
- constructor <;> intro h
- · rw [t2_iff_isClosed_diagonal, ← show 𝓢 α = diagonal α from h.1]
- exact isClosed_separationRel
- · rw [separated_def']
- intro x y hxy
- rcases t2_separation hxy with ⟨u, v, uo, vo, hx, hy, h⟩
- rcases isOpen_iff_ball_subset.1 uo x hx with ⟨r, hrU, hr⟩
- exact ⟨r, hrU, fun H => h.le_bot ⟨hr H, hy⟩⟩
+ constructor <;> intro h
+ · rw [t2_iff_isClosed_diagonal, ← show 𝓢 α = diagonal α from h.1]
+ exact isClosed_separationRel
+ · rw [separated_def']
+ intro x y hxy
+ rcases t2_separation hxy with ⟨u, v, uo, vo, hx, hy, h⟩
+ rcases isOpen_iff_ball_subset.1 uo x hx with ⟨r, hrU, hr⟩
+ exact ⟨r, hrU, fun H => h.le_bot ⟨hr H, hy⟩⟩
#align separated_iff_t2 separated_iff_t2
-/
@@ -343,7 +343,7 @@ instance separationSetoid.uniformSpace {α : Type u} [u : UniformSpace α] :
have :
∀ a,
⟦a⟧ ∈ s →
- ({ p : α × α | p.1 = a → ⟦p.2⟧ ∈ s } ∈ 𝓤 α ↔ { p : α × α | p.1 ≈ a → ⟦p.2⟧ ∈ s } ∈ 𝓤 α) :=
+ ({p : α × α | p.1 = a → ⟦p.2⟧ ∈ s} ∈ 𝓤 α ↔ {p : α × α | p.1 ≈ a → ⟦p.2⟧ ∈ s} ∈ 𝓤 α) :=
fun a ha =>
⟨fun h =>
let ⟨t, ht, hts⟩ := comp_mem_uniformity_sets h
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -272,7 +272,7 @@ theorem isClosed_of_spaced_out [SeparatedSpace α] {V₀ : Set (α × α)} (V₀
rcases comp_symm_mem_uniformity_sets V₀_in with ⟨V₁, V₁_in, V₁_symm, h_comp⟩
apply isClosed_of_closure_subset
intro x hx
- rw [mem_closure_iff_ball] at hx
+ rw [mem_closure_iff_ball] at hx
rcases hx V₁_in with ⟨y, hy, hy'⟩
suffices x = y by rwa [this]
apply eq_of_forall_symmetric
@@ -326,8 +326,8 @@ instance separationSetoid.uniformSpace {α : Type u} [u : UniformSpace α] :
compRel s (compRel s s)) :=
(lift'_mono' fun s hs ⟨a, b⟩ ⟨c, ⟨⟨a₁, a₂⟩, ha, a_eq⟩, ⟨⟨b₁, b₂⟩, hb, b_eq⟩⟩ =>
by
- simp at a_eq
- simp at b_eq
+ simp at a_eq
+ simp at b_eq
have h : ⟦a₂⟧ = ⟦b₁⟧ := by rw [a_eq.right, b_eq.left]
have h : (a₂, b₁) ∈ 𝓢 α := Quotient.exact h
simp [Function.comp, Set.image, compRel, and_comm, and_left_comm, and_assoc]
@@ -393,7 +393,7 @@ theorem uniformContinuous_quotient_lift₂ {f : α → β → γ}
by
rw [UniformContinuous, uniformity_prod_eq_prod, uniformity_quotient, uniformity_quotient,
Filter.prod_map_map_eq, Filter.tendsto_map'_iff, Filter.tendsto_map'_iff]
- rwa [UniformContinuous, uniformity_prod_eq_prod, Filter.tendsto_map'_iff] at hf
+ rwa [UniformContinuous, uniformity_prod_eq_prod, Filter.tendsto_map'_iff] at hf
#align uniform_space.uniform_continuous_quotient_lift₂ UniformSpace.uniformContinuous_quotient_lift₂
theorem comap_quotient_le_uniformity :
@@ -548,7 +548,7 @@ theorem separation_prod {a₁ a₂ : α} {b₁ b₂ : β} : (a₁, b₁) ≈ (a
⟨separated_of_uniform_continuous uniformContinuous_fst h,
separated_of_uniform_continuous uniformContinuous_snd h⟩
· rintro ⟨eqv_α, eqv_β⟩ r r_in
- rw [uniformity_prod] at r_in
+ rw [uniformity_prod] at r_in
rcases r_in with ⟨t_α, ⟨r_α, r_α_in, h_α⟩, t_β, ⟨r_β, r_β_in, h_β⟩, rfl⟩
let p_α := fun p : (α × β) × α × β => (p.1.1, p.2.1)
let p_β := fun p : (α × β) × α × β => (p.1.2, p.2.2)
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -75,7 +75,7 @@ uniformly continuous).
open Filter TopologicalSpace Set Classical Function UniformSpace
-open Classical Topology uniformity Filter
+open scoped Classical Topology uniformity Filter
noncomputable section
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -124,12 +124,6 @@ theorem separated_equiv : Equivalence fun x y => (x, y) ∈ 𝓢 α :=
#align separated_equiv separated_equiv
-/
-/- warning: filter.has_basis.mem_separation_rel -> Filter.HasBasis.mem_separationRel is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α] {ι : Sort.{u2}} {p : ι -> Prop} {s : ι -> (Set.{u1} (Prod.{u1, u1} α α))}, (Filter.HasBasis.{u1, u2} (Prod.{u1, u1} α α) ι (uniformity.{u1} α _inst_1) p s) -> (forall {a : Prod.{u1, u1} α α}, Iff (Membership.Mem.{u1, u1} (Prod.{u1, u1} α α) (Set.{u1} (Prod.{u1, u1} α α)) (Set.hasMem.{u1} (Prod.{u1, u1} α α)) a (separationRel.{u1} α _inst_1)) (forall (i : ι), (p i) -> (Membership.Mem.{u1, u1} (Prod.{u1, u1} α α) (Set.{u1} (Prod.{u1, u1} α α)) (Set.hasMem.{u1} (Prod.{u1, u1} α α)) a (s i))))
-but is expected to have type
- forall {α : Type.{u2}} [_inst_1 : UniformSpace.{u2} α] {ι : Sort.{u1}} {p : ι -> Prop} {s : ι -> (Set.{u2} (Prod.{u2, u2} α α))}, (Filter.HasBasis.{u2, u1} (Prod.{u2, u2} α α) ι (uniformity.{u2} α _inst_1) p s) -> (forall {a : Prod.{u2, u2} α α}, Iff (Membership.mem.{u2, u2} (Prod.{u2, u2} α α) (Set.{u2} (Prod.{u2, u2} α α)) (Set.instMembershipSet.{u2} (Prod.{u2, u2} α α)) a (separationRel.{u2} α _inst_1)) (forall (i : ι), (p i) -> (Membership.mem.{u2, u2} (Prod.{u2, u2} α α) (Set.{u2} (Prod.{u2, u2} α α)) (Set.instMembershipSet.{u2} (Prod.{u2, u2} α α)) a (s i))))
-Case conversion may be inaccurate. Consider using '#align filter.has_basis.mem_separation_rel Filter.HasBasis.mem_separationRelₓ'. -/
theorem Filter.HasBasis.mem_separationRel {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
(h : (𝓤 α).HasBasis p s) {a : α × α} : a ∈ 𝓢 α ↔ ∀ i, p i → a ∈ s i :=
h.forall_mem_mem
@@ -170,12 +164,6 @@ theorem separated_def {α : Type u} [UniformSpace α] :
#align separated_def separated_def
-/
-/- warning: separated_def' -> separated_def' is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_4 : UniformSpace.{u1} α], Iff (SeparatedSpace.{u1} α _inst_4) (forall (x : α) (y : α), (Ne.{succ u1} α x y) -> (Exists.{succ u1} (Set.{u1} (Prod.{u1, u1} α α)) (fun (r : Set.{u1} (Prod.{u1, u1} α α)) => Exists.{0} (Membership.Mem.{u1, u1} (Set.{u1} (Prod.{u1, u1} α α)) (Filter.{u1} (Prod.{u1, u1} α α)) (Filter.hasMem.{u1} (Prod.{u1, u1} α α)) r (uniformity.{u1} α _inst_4)) (fun (H : Membership.Mem.{u1, u1} (Set.{u1} (Prod.{u1, u1} α α)) (Filter.{u1} (Prod.{u1, u1} α α)) (Filter.hasMem.{u1} (Prod.{u1, u1} α α)) r (uniformity.{u1} α _inst_4)) => Not (Membership.Mem.{u1, u1} (Prod.{u1, u1} α α) (Set.{u1} (Prod.{u1, u1} α α)) (Set.hasMem.{u1} (Prod.{u1, u1} α α)) (Prod.mk.{u1, u1} α α x y) r)))))
-but is expected to have type
- forall {α : Type.{u1}} [_inst_4 : UniformSpace.{u1} α], Iff (SeparatedSpace.{u1} α _inst_4) (forall (x : α) (y : α), (Ne.{succ u1} α x y) -> (Exists.{succ u1} (Set.{u1} (Prod.{u1, u1} α α)) (fun (r : Set.{u1} (Prod.{u1, u1} α α)) => And (Membership.mem.{u1, u1} (Set.{u1} (Prod.{u1, u1} α α)) (Filter.{u1} (Prod.{u1, u1} α α)) (instMembershipSetFilter.{u1} (Prod.{u1, u1} α α)) r (uniformity.{u1} α _inst_4)) (Not (Membership.mem.{u1, u1} (Prod.{u1, u1} α α) (Set.{u1} (Prod.{u1, u1} α α)) (Set.instMembershipSet.{u1} (Prod.{u1, u1} α α)) (Prod.mk.{u1, u1} α α x y) r)))))
-Case conversion may be inaccurate. Consider using '#align separated_def' separated_def'ₓ'. -/
theorem separated_def' {α : Type u} [UniformSpace α] :
SeparatedSpace α ↔ ∀ x y, x ≠ y → ∃ r ∈ 𝓤 α, (x, y) ∉ r :=
separated_def.trans <| forall₂_congr fun x y => by rw [← not_imp_not] <;> simp [not_forall]
@@ -188,12 +176,6 @@ theorem eq_of_uniformity {α : Type _} [UniformSpace α] [SeparatedSpace α] {x
#align eq_of_uniformity eq_of_uniformity
-/
-/- warning: eq_of_uniformity_basis -> eq_of_uniformity_basis is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_4 : UniformSpace.{u1} α] [_inst_5 : SeparatedSpace.{u1} α _inst_4] {ι : Type.{u2}} {p : ι -> Prop} {s : ι -> (Set.{u1} (Prod.{u1, u1} α α))}, (Filter.HasBasis.{u1, succ u2} (Prod.{u1, u1} α α) ι (uniformity.{u1} α _inst_4) p s) -> (forall {x : α} {y : α}, (forall {i : ι}, (p i) -> (Membership.Mem.{u1, u1} (Prod.{u1, u1} α α) (Set.{u1} (Prod.{u1, u1} α α)) (Set.hasMem.{u1} (Prod.{u1, u1} α α)) (Prod.mk.{u1, u1} α α x y) (s i))) -> (Eq.{succ u1} α x y))
-but is expected to have type
- forall {α : Type.{u2}} [_inst_4 : UniformSpace.{u2} α] [_inst_5 : SeparatedSpace.{u2} α _inst_4] {ι : Type.{u1}} {p : ι -> Prop} {s : ι -> (Set.{u2} (Prod.{u2, u2} α α))}, (Filter.HasBasis.{u2, succ u1} (Prod.{u2, u2} α α) ι (uniformity.{u2} α _inst_4) p s) -> (forall {x : α} {y : α}, (forall {i : ι}, (p i) -> (Membership.mem.{u2, u2} (Prod.{u2, u2} α α) (Set.{u2} (Prod.{u2, u2} α α)) (Set.instMembershipSet.{u2} (Prod.{u2, u2} α α)) (Prod.mk.{u2, u2} α α x y) (s i))) -> (Eq.{succ u2} α x y))
-Case conversion may be inaccurate. Consider using '#align eq_of_uniformity_basis eq_of_uniformity_basisₓ'. -/
theorem eq_of_uniformity_basis {α : Type _} [UniformSpace α] [SeparatedSpace α] {ι : Type _}
{p : ι → Prop} {s : ι → Set (α × α)} (hs : (𝓤 α).HasBasis p s) {x y : α}
(h : ∀ {i}, p i → (x, y) ∈ s i) : x = y :=
@@ -209,12 +191,6 @@ theorem eq_of_forall_symmetric {α : Type _} [UniformSpace α] [SeparatedSpace
#align eq_of_forall_symmetric eq_of_forall_symmetric
-/
-/- warning: eq_of_cluster_pt_uniformity -> eq_of_clusterPt_uniformity is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α] [_inst_4 : SeparatedSpace.{u1} α _inst_1] {x : α} {y : α}, (ClusterPt.{u1} (Prod.{u1, u1} α α) (Prod.topologicalSpace.{u1, u1} α α (UniformSpace.toTopologicalSpace.{u1} α _inst_1) (UniformSpace.toTopologicalSpace.{u1} α _inst_1)) (Prod.mk.{u1, u1} α α x y) (uniformity.{u1} α _inst_1)) -> (Eq.{succ u1} α x y)
-but is expected to have type
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α] [_inst_4 : SeparatedSpace.{u1} α _inst_1] {x : α} {y : α}, (ClusterPt.{u1} (Prod.{u1, u1} α α) (instTopologicalSpaceProd.{u1, u1} α α (UniformSpace.toTopologicalSpace.{u1} α _inst_1) (UniformSpace.toTopologicalSpace.{u1} α _inst_1)) (Prod.mk.{u1, u1} α α x y) (uniformity.{u1} α _inst_1)) -> (Eq.{succ u1} α x y)
-Case conversion may be inaccurate. Consider using '#align eq_of_cluster_pt_uniformity eq_of_clusterPt_uniformityₓ'. -/
theorem eq_of_clusterPt_uniformity [SeparatedSpace α] {x y : α} (h : ClusterPt (x, y) (𝓤 α)) :
x = y :=
eq_of_uniformity_basis uniformity_hasBasis_closed fun V ⟨hV, hVc⟩ =>
@@ -244,33 +220,15 @@ theorem separationRel_comap {f : α → β}
#align separation_rel_comap separationRel_comap
-/
-/- warning: filter.has_basis.separation_rel -> Filter.HasBasis.separationRel is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α] {ι : Sort.{u2}} {p : ι -> Prop} {s : ι -> (Set.{u1} (Prod.{u1, u1} α α))}, (Filter.HasBasis.{u1, u2} (Prod.{u1, u1} α α) ι (uniformity.{u1} α _inst_1) p s) -> (Eq.{succ u1} (Set.{u1} (Prod.{u1, u1} α α)) (separationRel.{u1} α _inst_1) (Set.iInter.{u1, u2} (Prod.{u1, u1} α α) ι (fun (i : ι) => Set.iInter.{u1, 0} (Prod.{u1, u1} α α) (p i) (fun (hi : p i) => s i))))
-but is expected to have type
- forall {α : Type.{u2}} [_inst_1 : UniformSpace.{u2} α] {ι : Sort.{u1}} {p : ι -> Prop} {s : ι -> (Set.{u2} (Prod.{u2, u2} α α))}, (Filter.HasBasis.{u2, u1} (Prod.{u2, u2} α α) ι (uniformity.{u2} α _inst_1) p s) -> (Eq.{succ u2} (Set.{u2} (Prod.{u2, u2} α α)) (separationRel.{u2} α _inst_1) (Set.iInter.{u2, u1} (Prod.{u2, u2} α α) ι (fun (i : ι) => Set.iInter.{u2, 0} (Prod.{u2, u2} α α) (p i) (fun (hi : p i) => s i))))
-Case conversion may be inaccurate. Consider using '#align filter.has_basis.separation_rel Filter.HasBasis.separationRelₓ'. -/
protected theorem Filter.HasBasis.separationRel {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
(h : HasBasis (𝓤 α) p s) : 𝓢 α = ⋂ (i) (hi : p i), s i := by unfold separationRel;
rw [h.sInter_sets]
#align filter.has_basis.separation_rel Filter.HasBasis.separationRel
-/- warning: separation_rel_eq_inter_closure -> separationRel_eq_inter_closure is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α], Eq.{succ u1} (Set.{u1} (Prod.{u1, u1} α α)) (separationRel.{u1} α _inst_1) (Set.sInter.{u1} (Prod.{u1, u1} α α) (Set.image.{u1, u1} (Set.{u1} (Prod.{u1, u1} α α)) (Set.{u1} (Prod.{u1, u1} α α)) (closure.{u1} (Prod.{u1, u1} α α) (Prod.topologicalSpace.{u1, u1} α α (UniformSpace.toTopologicalSpace.{u1} α _inst_1) (UniformSpace.toTopologicalSpace.{u1} α _inst_1))) (Filter.sets.{u1} (Prod.{u1, u1} α α) (uniformity.{u1} α _inst_1))))
-but is expected to have type
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α], Eq.{succ u1} (Set.{u1} (Prod.{u1, u1} α α)) (separationRel.{u1} α _inst_1) (Set.sInter.{u1} (Prod.{u1, u1} α α) (Set.image.{u1, u1} (Set.{u1} (Prod.{u1, u1} α α)) (Set.{u1} (Prod.{u1, u1} α α)) (closure.{u1} (Prod.{u1, u1} α α) (instTopologicalSpaceProd.{u1, u1} α α (UniformSpace.toTopologicalSpace.{u1} α _inst_1) (UniformSpace.toTopologicalSpace.{u1} α _inst_1))) (Filter.sets.{u1} (Prod.{u1, u1} α α) (uniformity.{u1} α _inst_1))))
-Case conversion may be inaccurate. Consider using '#align separation_rel_eq_inter_closure separationRel_eq_inter_closureₓ'. -/
theorem separationRel_eq_inter_closure : 𝓢 α = ⋂₀ (closure '' (𝓤 α).sets) := by
simp [uniformity_has_basis_closure.separation_rel]
#align separation_rel_eq_inter_closure separationRel_eq_inter_closure
-/- warning: is_closed_separation_rel -> isClosed_separationRel is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α], IsClosed.{u1} (Prod.{u1, u1} α α) (Prod.topologicalSpace.{u1, u1} α α (UniformSpace.toTopologicalSpace.{u1} α _inst_1) (UniformSpace.toTopologicalSpace.{u1} α _inst_1)) (separationRel.{u1} α _inst_1)
-but is expected to have type
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α], IsClosed.{u1} (Prod.{u1, u1} α α) (instTopologicalSpaceProd.{u1, u1} α α (UniformSpace.toTopologicalSpace.{u1} α _inst_1) (UniformSpace.toTopologicalSpace.{u1} α _inst_1)) (separationRel.{u1} α _inst_1)
-Case conversion may be inaccurate. Consider using '#align is_closed_separation_rel isClosed_separationRelₓ'. -/
theorem isClosed_separationRel : IsClosed (𝓢 α) :=
by
rw [separationRel_eq_inter_closure]
@@ -327,12 +285,6 @@ theorem isClosed_of_spaced_out [SeparatedSpace α] {V₀ : Set (α × α)} (V₀
#align is_closed_of_spaced_out isClosed_of_spaced_out
-/
-/- warning: is_closed_range_of_spaced_out -> isClosed_range_of_spaced_out is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α] {ι : Type.{u2}} [_inst_4 : SeparatedSpace.{u1} α _inst_1] {V₀ : Set.{u1} (Prod.{u1, u1} α α)}, (Membership.Mem.{u1, u1} (Set.{u1} (Prod.{u1, u1} α α)) (Filter.{u1} (Prod.{u1, u1} α α)) (Filter.hasMem.{u1} (Prod.{u1, u1} α α)) V₀ (uniformity.{u1} α _inst_1)) -> (forall {f : ι -> α}, (Pairwise.{u2} ι (fun (x : ι) (y : ι) => Not (Membership.Mem.{u1, u1} (Prod.{u1, u1} α α) (Set.{u1} (Prod.{u1, u1} α α)) (Set.hasMem.{u1} (Prod.{u1, u1} α α)) (Prod.mk.{u1, u1} α α (f x) (f y)) V₀))) -> (IsClosed.{u1} α (UniformSpace.toTopologicalSpace.{u1} α _inst_1) (Set.range.{u1, succ u2} α ι f)))
-but is expected to have type
- forall {α : Type.{u2}} [_inst_1 : UniformSpace.{u2} α] {ι : Type.{u1}} [_inst_4 : SeparatedSpace.{u2} α _inst_1] {V₀ : Set.{u2} (Prod.{u2, u2} α α)}, (Membership.mem.{u2, u2} (Set.{u2} (Prod.{u2, u2} α α)) (Filter.{u2} (Prod.{u2, u2} α α)) (instMembershipSetFilter.{u2} (Prod.{u2, u2} α α)) V₀ (uniformity.{u2} α _inst_1)) -> (forall {f : ι -> α}, (Pairwise.{u1} ι (fun (x : ι) (y : ι) => Not (Membership.mem.{u2, u2} (Prod.{u2, u2} α α) (Set.{u2} (Prod.{u2, u2} α α)) (Set.instMembershipSet.{u2} (Prod.{u2, u2} α α)) (Prod.mk.{u2, u2} α α (f x) (f y)) V₀))) -> (IsClosed.{u2} α (UniformSpace.toTopologicalSpace.{u2} α _inst_1) (Set.range.{u2, succ u1} α ι f)))
-Case conversion may be inaccurate. Consider using '#align is_closed_range_of_spaced_out isClosed_range_of_spaced_outₓ'. -/
theorem isClosed_range_of_spaced_out {ι} [SeparatedSpace α] {V₀ : Set (α × α)} (V₀_in : V₀ ∈ 𝓤 α)
{f : ι → α} (hf : Pairwise fun x y => (f x, f y) ∉ V₀) : IsClosed (range f) :=
isClosed_of_spaced_out V₀_in <| by rintro _ ⟨x, rfl⟩ _ ⟨y, rfl⟩ h; exact hf (ne_of_apply_ne f h)
@@ -434,12 +386,6 @@ theorem uniformContinuous_quotient_lift {f : α → β} {h : ∀ a b, (a, b) ∈
#align uniform_space.uniform_continuous_quotient_lift UniformSpace.uniformContinuous_quotient_lift
-/
-/- warning: uniform_space.uniform_continuous_quotient_lift₂ -> UniformSpace.uniformContinuous_quotient_lift₂ is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : UniformSpace.{u1} α] [_inst_2 : UniformSpace.{u2} β] [_inst_3 : UniformSpace.{u3} γ] {f : α -> β -> γ} {h : forall (a : α) (c : β) (b : α) (d : β), (Membership.Mem.{u1, u1} (Prod.{u1, u1} α α) (Set.{u1} (Prod.{u1, u1} α α)) (Set.hasMem.{u1} (Prod.{u1, u1} α α)) (Prod.mk.{u1, u1} α α a b) (separationRel.{u1} α _inst_1)) -> (Membership.Mem.{u2, u2} (Prod.{u2, u2} β β) (Set.{u2} (Prod.{u2, u2} β β)) (Set.hasMem.{u2} (Prod.{u2, u2} β β)) (Prod.mk.{u2, u2} β β c d) (separationRel.{u2} β _inst_2)) -> (Eq.{succ u3} γ (f a c) (f b d))}, (UniformContinuous.{max u1 u2, u3} (Prod.{u1, u2} α β) γ (Prod.uniformSpace.{u1, u2} α β _inst_1 _inst_2) _inst_3 (fun (p : Prod.{u1, u2} α β) => f (Prod.fst.{u1, u2} α β p) (Prod.snd.{u1, u2} α β p))) -> (UniformContinuous.{max u1 u2, u3} (Prod.{u1, u2} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u2} β (UniformSpace.separationSetoid.{u2} β _inst_2))) γ (Prod.uniformSpace.{u1, u2} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u2} β (UniformSpace.separationSetoid.{u2} β _inst_2)) (UniformSpace.separationSetoid.uniformSpace.{u1} α _inst_1) (UniformSpace.separationSetoid.uniformSpace.{u2} β _inst_2)) _inst_3 (fun (p : Prod.{u1, u2} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u2} β (UniformSpace.separationSetoid.{u2} β _inst_2))) => Quotient.lift₂.{succ u1, succ u2, succ u3} α β γ (UniformSpace.separationSetoid.{u1} α _inst_1) (UniformSpace.separationSetoid.{u2} β _inst_2) f h (Prod.fst.{u1, u2} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u2} β (UniformSpace.separationSetoid.{u2} β _inst_2)) p) (Prod.snd.{u1, u2} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u2} β (UniformSpace.separationSetoid.{u2} β _inst_2)) p)))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : UniformSpace.{u1} α] [_inst_2 : UniformSpace.{u2} β] [_inst_3 : UniformSpace.{u3} γ] {f : α -> β -> γ} {h : forall (a : α) (c : β) (b : α) (d : β), (Membership.mem.{u1, u1} (Prod.{u1, u1} α α) (Set.{u1} (Prod.{u1, u1} α α)) (Set.instMembershipSet.{u1} (Prod.{u1, u1} α α)) (Prod.mk.{u1, u1} α α a b) (separationRel.{u1} α _inst_1)) -> (Membership.mem.{u2, u2} (Prod.{u2, u2} β β) (Set.{u2} (Prod.{u2, u2} β β)) (Set.instMembershipSet.{u2} (Prod.{u2, u2} β β)) (Prod.mk.{u2, u2} β β c d) (separationRel.{u2} β _inst_2)) -> (Eq.{succ u3} γ (f a c) (f b d))}, (UniformContinuous.{max u1 u2, u3} (Prod.{u1, u2} α β) γ (instUniformSpaceProd.{u1, u2} α β _inst_1 _inst_2) _inst_3 (fun (p : Prod.{u1, u2} α β) => f (Prod.fst.{u1, u2} α β p) (Prod.snd.{u1, u2} α β p))) -> (UniformContinuous.{max u2 u1, u3} (Prod.{u1, u2} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u2} β (UniformSpace.separationSetoid.{u2} β _inst_2))) γ (instUniformSpaceProd.{u1, u2} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u2} β (UniformSpace.separationSetoid.{u2} β _inst_2)) (UniformSpace.separationSetoid.uniformSpace.{u1} α _inst_1) (UniformSpace.separationSetoid.uniformSpace.{u2} β _inst_2)) _inst_3 (fun (p : Prod.{u1, u2} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u2} β (UniformSpace.separationSetoid.{u2} β _inst_2))) => Quotient.lift₂.{succ u1, succ u2, succ u3} α β γ (UniformSpace.separationSetoid.{u1} α _inst_1) (UniformSpace.separationSetoid.{u2} β _inst_2) f h (Prod.fst.{u1, u2} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u2} β (UniformSpace.separationSetoid.{u2} β _inst_2)) p) (Prod.snd.{u1, u2} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u2} β (UniformSpace.separationSetoid.{u2} β _inst_2)) p)))
-Case conversion may be inaccurate. Consider using '#align uniform_space.uniform_continuous_quotient_lift₂ UniformSpace.uniformContinuous_quotient_lift₂ₓ'. -/
theorem uniformContinuous_quotient_lift₂ {f : α → β → γ}
{h : ∀ a c b d, (a, b) ∈ 𝓢 α → (c, d) ∈ 𝓢 β → f a c = f b d}
(hf : UniformContinuous fun p : α × β => f p.1 p.2) :
@@ -450,12 +396,6 @@ theorem uniformContinuous_quotient_lift₂ {f : α → β → γ}
rwa [UniformContinuous, uniformity_prod_eq_prod, Filter.tendsto_map'_iff] at hf
#align uniform_space.uniform_continuous_quotient_lift₂ UniformSpace.uniformContinuous_quotient_lift₂
-/- warning: uniform_space.comap_quotient_le_uniformity -> UniformSpace.comap_quotient_le_uniformity is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α], LE.le.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (Preorder.toHasLe.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (PartialOrder.toPreorder.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (Filter.partialOrder.{u1} (Prod.{u1, u1} α α)))) (Filter.comap.{u1, u1} (Prod.{u1, u1} α α) (Prod.{u1, u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1))) (fun (p : Prod.{u1, u1} α α) => Prod.mk.{u1, u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.mk'.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1) (Prod.fst.{u1, u1} α α p)) (Quotient.mk'.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1) (Prod.snd.{u1, u1} α α p))) (uniformity.{u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (UniformSpace.separationSetoid.uniformSpace.{u1} α _inst_1))) (uniformity.{u1} α _inst_1)
-but is expected to have type
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α], LE.le.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (Preorder.toLE.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (PartialOrder.toPreorder.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (Filter.instPartialOrderFilter.{u1} (Prod.{u1, u1} α α)))) (Filter.comap.{u1, u1} (Prod.{u1, u1} α α) (Prod.{u1, u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1))) (fun (p : Prod.{u1, u1} α α) => Prod.mk.{u1, u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.mk.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1) (Prod.fst.{u1, u1} α α p)) (Quotient.mk.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1) (Prod.snd.{u1, u1} α α p))) (uniformity.{u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (UniformSpace.separationSetoid.uniformSpace.{u1} α _inst_1))) (uniformity.{u1} α _inst_1)
-Case conversion may be inaccurate. Consider using '#align uniform_space.comap_quotient_le_uniformity UniformSpace.comap_quotient_le_uniformityₓ'. -/
theorem comap_quotient_le_uniformity :
((𝓤 <| Quotient <| separationSetoid α).comap fun p : α × α => (⟦p.fst⟧, ⟦p.snd⟧)) ≤ 𝓤 α :=
fun t' ht' =>
@@ -600,12 +540,6 @@ theorem map_comp {f : α → β} {g : β → γ} (hf : UniformContinuous f) (hg
end SeparationQuotient
-/- warning: uniform_space.separation_prod -> UniformSpace.separation_prod is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : UniformSpace.{u1} α] [_inst_2 : UniformSpace.{u2} β] {a₁ : α} {a₂ : α} {b₁ : β} {b₂ : β}, Iff (HasEquivₓ.Equiv.{max (succ u1) (succ u2)} (Prod.{u1, u2} α β) (setoidHasEquiv.{max (succ u1) (succ u2)} (Prod.{u1, u2} α β) (UniformSpace.separationSetoid.{max u1 u2} (Prod.{u1, u2} α β) (Prod.uniformSpace.{u1, u2} α β _inst_1 _inst_2))) (Prod.mk.{u1, u2} α β a₁ b₁) (Prod.mk.{u1, u2} α β a₂ b₂)) (And (HasEquivₓ.Equiv.{succ u1} α (setoidHasEquiv.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) a₁ a₂) (HasEquivₓ.Equiv.{succ u2} β (setoidHasEquiv.{succ u2} β (UniformSpace.separationSetoid.{u2} β _inst_2)) b₁ b₂))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : UniformSpace.{u1} α] [_inst_2 : UniformSpace.{u2} β] {a₁ : α} {a₂ : α} {b₁ : β} {b₂ : β}, Iff (HasEquiv.Equiv.{max (succ u2) (succ u1), 0} (Prod.{u1, u2} α β) (instHasEquiv.{max (succ u1) (succ u2)} (Prod.{u1, u2} α β) (UniformSpace.separationSetoid.{max u1 u2} (Prod.{u1, u2} α β) (instUniformSpaceProd.{u1, u2} α β _inst_1 _inst_2))) (Prod.mk.{u1, u2} α β a₁ b₁) (Prod.mk.{u1, u2} α β a₂ b₂)) (And (HasEquiv.Equiv.{succ u1, 0} α (instHasEquiv.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) a₁ a₂) (HasEquiv.Equiv.{succ u2, 0} β (instHasEquiv.{succ u2} β (UniformSpace.separationSetoid.{u2} β _inst_2)) b₁ b₂))
-Case conversion may be inaccurate. Consider using '#align uniform_space.separation_prod UniformSpace.separation_prodₓ'. -/
theorem separation_prod {a₁ a₂ : α} {b₁ b₂ : β} : (a₁, b₁) ≈ (a₂, b₂) ↔ a₁ ≈ a₂ ∧ b₁ ≈ b₂ :=
by
constructor
@@ -623,12 +557,6 @@ theorem separation_prod {a₁ a₂ : α} {b₁ b₂ : β} : (a₁, b₁) ≈ (a
exact ⟨h_α key_α, h_β key_β⟩
#align uniform_space.separation_prod UniformSpace.separation_prod
-/- warning: uniform_space.separated.prod -> UniformSpace.Separated.prod is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : UniformSpace.{u1} α] [_inst_2 : UniformSpace.{u2} β] [_inst_4 : SeparatedSpace.{u1} α _inst_1] [_inst_5 : SeparatedSpace.{u2} β _inst_2], SeparatedSpace.{max u1 u2} (Prod.{u1, u2} α β) (Prod.uniformSpace.{u1, u2} α β _inst_1 _inst_2)
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : UniformSpace.{u1} α] [_inst_2 : UniformSpace.{u2} β] [_inst_4 : SeparatedSpace.{u1} α _inst_1] [_inst_5 : SeparatedSpace.{u2} β _inst_2], SeparatedSpace.{max u2 u1} (Prod.{u1, u2} α β) (instUniformSpaceProd.{u1, u2} α β _inst_1 _inst_2)
-Case conversion may be inaccurate. Consider using '#align uniform_space.separated.prod UniformSpace.Separated.prodₓ'. -/
instance Separated.prod [SeparatedSpace α] [SeparatedSpace β] : SeparatedSpace (α × β) :=
separated_def.2 fun x y H =>
Prod.ext (eq_of_separated_of_uniformContinuous uniformContinuous_fst H)
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -96,9 +96,7 @@ variable [UniformSpace α] [UniformSpace β] [UniformSpace γ]
#print UniformSpace.to_regularSpace /-
instance (priority := 100) UniformSpace.to_regularSpace : RegularSpace α :=
RegularSpace.ofBasis
- (fun a => by
- rw [nhds_eq_comap_uniformity]
- exact uniformity_has_basis_closed.comap _)
+ (fun a => by rw [nhds_eq_comap_uniformity]; exact uniformity_has_basis_closed.comap _)
fun a V hV => hV.2.Preimage <| continuous_const.prod_mk continuous_id
#align uniform_space.to_regular_space UniformSpace.to_regularSpace
-/
@@ -253,9 +251,7 @@ but is expected to have type
forall {α : Type.{u2}} [_inst_1 : UniformSpace.{u2} α] {ι : Sort.{u1}} {p : ι -> Prop} {s : ι -> (Set.{u2} (Prod.{u2, u2} α α))}, (Filter.HasBasis.{u2, u1} (Prod.{u2, u2} α α) ι (uniformity.{u2} α _inst_1) p s) -> (Eq.{succ u2} (Set.{u2} (Prod.{u2, u2} α α)) (separationRel.{u2} α _inst_1) (Set.iInter.{u2, u1} (Prod.{u2, u2} α α) ι (fun (i : ι) => Set.iInter.{u2, 0} (Prod.{u2, u2} α α) (p i) (fun (hi : p i) => s i))))
Case conversion may be inaccurate. Consider using '#align filter.has_basis.separation_rel Filter.HasBasis.separationRelₓ'. -/
protected theorem Filter.HasBasis.separationRel {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
- (h : HasBasis (𝓤 α) p s) : 𝓢 α = ⋂ (i) (hi : p i), s i :=
- by
- unfold separationRel
+ (h : HasBasis (𝓤 α) p s) : 𝓢 α = ⋂ (i) (hi : p i), s i := by unfold separationRel;
rw [h.sInter_sets]
#align filter.has_basis.separation_rel Filter.HasBasis.separationRel
@@ -339,9 +335,7 @@ but is expected to have type
Case conversion may be inaccurate. Consider using '#align is_closed_range_of_spaced_out isClosed_range_of_spaced_outₓ'. -/
theorem isClosed_range_of_spaced_out {ι} [SeparatedSpace α] {V₀ : Set (α × α)} (V₀_in : V₀ ∈ 𝓤 α)
{f : ι → α} (hf : Pairwise fun x y => (f x, f y) ∉ V₀) : IsClosed (range f) :=
- isClosed_of_spaced_out V₀_in <| by
- rintro _ ⟨x, rfl⟩ _ ⟨y, rfl⟩ h
- exact hf (ne_of_apply_ne f h)
+ isClosed_of_spaced_out V₀_in <| by rintro _ ⟨x, rfl⟩ _ ⟨y, rfl⟩ h; exact hf (ne_of_apply_ne f h)
#align is_closed_range_of_spaced_out isClosed_range_of_spaced_out
/-!
@@ -555,10 +549,8 @@ theorem lift_mk [SeparatedSpace β] {f : α → β} (h : UniformContinuous f) (a
theorem uniformContinuous_lift [SeparatedSpace β] (f : α → β) : UniformContinuous (lift f) :=
by
by_cases hf : UniformContinuous f
- · rw [lift, dif_pos hf]
- exact uniform_continuous_quotient_lift hf
- · rw [lift, dif_neg hf]
- exact uniformContinuous_of_const fun a b => rfl
+ · rw [lift, dif_pos hf]; exact uniform_continuous_quotient_lift hf
+ · rw [lift, dif_neg hf]; exact uniformContinuous_of_const fun a b => rfl
#align uniform_space.separation_quotient.uniform_continuous_lift UniformSpace.SeparationQuotient.uniformContinuous_lift
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
@@ -458,7 +458,7 @@ theorem uniformContinuous_quotient_lift₂ {f : α → β → γ}
/- warning: uniform_space.comap_quotient_le_uniformity -> UniformSpace.comap_quotient_le_uniformity is a dubious translation:
lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α], LE.le.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (Preorder.toLE.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (PartialOrder.toPreorder.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (Filter.partialOrder.{u1} (Prod.{u1, u1} α α)))) (Filter.comap.{u1, u1} (Prod.{u1, u1} α α) (Prod.{u1, u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1))) (fun (p : Prod.{u1, u1} α α) => Prod.mk.{u1, u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.mk'.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1) (Prod.fst.{u1, u1} α α p)) (Quotient.mk'.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1) (Prod.snd.{u1, u1} α α p))) (uniformity.{u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (UniformSpace.separationSetoid.uniformSpace.{u1} α _inst_1))) (uniformity.{u1} α _inst_1)
+ forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α], LE.le.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (Preorder.toHasLe.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (PartialOrder.toPreorder.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (Filter.partialOrder.{u1} (Prod.{u1, u1} α α)))) (Filter.comap.{u1, u1} (Prod.{u1, u1} α α) (Prod.{u1, u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1))) (fun (p : Prod.{u1, u1} α α) => Prod.mk.{u1, u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.mk'.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1) (Prod.fst.{u1, u1} α α p)) (Quotient.mk'.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1) (Prod.snd.{u1, u1} α α p))) (uniformity.{u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (UniformSpace.separationSetoid.uniformSpace.{u1} α _inst_1))) (uniformity.{u1} α _inst_1)
but is expected to have type
forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α], LE.le.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (Preorder.toLE.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (PartialOrder.toPreorder.{u1} (Filter.{u1} (Prod.{u1, u1} α α)) (Filter.instPartialOrderFilter.{u1} (Prod.{u1, u1} α α)))) (Filter.comap.{u1, u1} (Prod.{u1, u1} α α) (Prod.{u1, u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1))) (fun (p : Prod.{u1, u1} α α) => Prod.mk.{u1, u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (Quotient.mk.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1) (Prod.fst.{u1, u1} α α p)) (Quotient.mk.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1) (Prod.snd.{u1, u1} α α p))) (uniformity.{u1} (Quotient.{succ u1} α (UniformSpace.separationSetoid.{u1} α _inst_1)) (UniformSpace.separationSetoid.uniformSpace.{u1} α _inst_1))) (uniformity.{u1} α _inst_1)
Case conversion may be inaccurate. Consider using '#align uniform_space.comap_quotient_le_uniformity UniformSpace.comap_quotient_le_uniformityₓ'. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -240,7 +240,7 @@ theorem separationRel_comap {f : α → β}
by
subst h
dsimp [separationRel]
- simp_rw [uniformity_comap, (Filter.comap_hasBasis (Prod.map f f) (𝓤 β)).interₛ_sets, ←
+ simp_rw [uniformity_comap, (Filter.comap_hasBasis (Prod.map f f) (𝓤 β)).sInter_sets, ←
preimage_Inter, sInter_eq_bInter]
rfl
#align separation_rel_comap separationRel_comap
@@ -248,9 +248,9 @@ theorem separationRel_comap {f : α → β}
/- warning: filter.has_basis.separation_rel -> Filter.HasBasis.separationRel is a dubious translation:
lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α] {ι : Sort.{u2}} {p : ι -> Prop} {s : ι -> (Set.{u1} (Prod.{u1, u1} α α))}, (Filter.HasBasis.{u1, u2} (Prod.{u1, u1} α α) ι (uniformity.{u1} α _inst_1) p s) -> (Eq.{succ u1} (Set.{u1} (Prod.{u1, u1} α α)) (separationRel.{u1} α _inst_1) (Set.interᵢ.{u1, u2} (Prod.{u1, u1} α α) ι (fun (i : ι) => Set.interᵢ.{u1, 0} (Prod.{u1, u1} α α) (p i) (fun (hi : p i) => s i))))
+ forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α] {ι : Sort.{u2}} {p : ι -> Prop} {s : ι -> (Set.{u1} (Prod.{u1, u1} α α))}, (Filter.HasBasis.{u1, u2} (Prod.{u1, u1} α α) ι (uniformity.{u1} α _inst_1) p s) -> (Eq.{succ u1} (Set.{u1} (Prod.{u1, u1} α α)) (separationRel.{u1} α _inst_1) (Set.iInter.{u1, u2} (Prod.{u1, u1} α α) ι (fun (i : ι) => Set.iInter.{u1, 0} (Prod.{u1, u1} α α) (p i) (fun (hi : p i) => s i))))
but is expected to have type
- forall {α : Type.{u2}} [_inst_1 : UniformSpace.{u2} α] {ι : Sort.{u1}} {p : ι -> Prop} {s : ι -> (Set.{u2} (Prod.{u2, u2} α α))}, (Filter.HasBasis.{u2, u1} (Prod.{u2, u2} α α) ι (uniformity.{u2} α _inst_1) p s) -> (Eq.{succ u2} (Set.{u2} (Prod.{u2, u2} α α)) (separationRel.{u2} α _inst_1) (Set.interᵢ.{u2, u1} (Prod.{u2, u2} α α) ι (fun (i : ι) => Set.interᵢ.{u2, 0} (Prod.{u2, u2} α α) (p i) (fun (hi : p i) => s i))))
+ forall {α : Type.{u2}} [_inst_1 : UniformSpace.{u2} α] {ι : Sort.{u1}} {p : ι -> Prop} {s : ι -> (Set.{u2} (Prod.{u2, u2} α α))}, (Filter.HasBasis.{u2, u1} (Prod.{u2, u2} α α) ι (uniformity.{u2} α _inst_1) p s) -> (Eq.{succ u2} (Set.{u2} (Prod.{u2, u2} α α)) (separationRel.{u2} α _inst_1) (Set.iInter.{u2, u1} (Prod.{u2, u2} α α) ι (fun (i : ι) => Set.iInter.{u2, 0} (Prod.{u2, u2} α α) (p i) (fun (hi : p i) => s i))))
Case conversion may be inaccurate. Consider using '#align filter.has_basis.separation_rel Filter.HasBasis.separationRelₓ'. -/
protected theorem Filter.HasBasis.separationRel {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
(h : HasBasis (𝓤 α) p s) : 𝓢 α = ⋂ (i) (hi : p i), s i :=
@@ -261,9 +261,9 @@ protected theorem Filter.HasBasis.separationRel {ι : Sort _} {p : ι → Prop}
/- warning: separation_rel_eq_inter_closure -> separationRel_eq_inter_closure is a dubious translation:
lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α], Eq.{succ u1} (Set.{u1} (Prod.{u1, u1} α α)) (separationRel.{u1} α _inst_1) (Set.interₛ.{u1} (Prod.{u1, u1} α α) (Set.image.{u1, u1} (Set.{u1} (Prod.{u1, u1} α α)) (Set.{u1} (Prod.{u1, u1} α α)) (closure.{u1} (Prod.{u1, u1} α α) (Prod.topologicalSpace.{u1, u1} α α (UniformSpace.toTopologicalSpace.{u1} α _inst_1) (UniformSpace.toTopologicalSpace.{u1} α _inst_1))) (Filter.sets.{u1} (Prod.{u1, u1} α α) (uniformity.{u1} α _inst_1))))
+ forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α], Eq.{succ u1} (Set.{u1} (Prod.{u1, u1} α α)) (separationRel.{u1} α _inst_1) (Set.sInter.{u1} (Prod.{u1, u1} α α) (Set.image.{u1, u1} (Set.{u1} (Prod.{u1, u1} α α)) (Set.{u1} (Prod.{u1, u1} α α)) (closure.{u1} (Prod.{u1, u1} α α) (Prod.topologicalSpace.{u1, u1} α α (UniformSpace.toTopologicalSpace.{u1} α _inst_1) (UniformSpace.toTopologicalSpace.{u1} α _inst_1))) (Filter.sets.{u1} (Prod.{u1, u1} α α) (uniformity.{u1} α _inst_1))))
but is expected to have type
- forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α], Eq.{succ u1} (Set.{u1} (Prod.{u1, u1} α α)) (separationRel.{u1} α _inst_1) (Set.interₛ.{u1} (Prod.{u1, u1} α α) (Set.image.{u1, u1} (Set.{u1} (Prod.{u1, u1} α α)) (Set.{u1} (Prod.{u1, u1} α α)) (closure.{u1} (Prod.{u1, u1} α α) (instTopologicalSpaceProd.{u1, u1} α α (UniformSpace.toTopologicalSpace.{u1} α _inst_1) (UniformSpace.toTopologicalSpace.{u1} α _inst_1))) (Filter.sets.{u1} (Prod.{u1, u1} α α) (uniformity.{u1} α _inst_1))))
+ forall {α : Type.{u1}} [_inst_1 : UniformSpace.{u1} α], Eq.{succ u1} (Set.{u1} (Prod.{u1, u1} α α)) (separationRel.{u1} α _inst_1) (Set.sInter.{u1} (Prod.{u1, u1} α α) (Set.image.{u1, u1} (Set.{u1} (Prod.{u1, u1} α α)) (Set.{u1} (Prod.{u1, u1} α α)) (closure.{u1} (Prod.{u1, u1} α α) (instTopologicalSpaceProd.{u1, u1} α α (UniformSpace.toTopologicalSpace.{u1} α _inst_1) (UniformSpace.toTopologicalSpace.{u1} α _inst_1))) (Filter.sets.{u1} (Prod.{u1, u1} α α) (uniformity.{u1} α _inst_1))))
Case conversion may be inaccurate. Consider using '#align separation_rel_eq_inter_closure separationRel_eq_inter_closureₓ'. -/
theorem separationRel_eq_inter_closure : 𝓢 α = ⋂₀ (closure '' (𝓤 α).sets) := by
simp [uniformity_has_basis_closure.separation_rel]
@@ -278,7 +278,7 @@ Case conversion may be inaccurate. Consider using '#align is_closed_separation_r
theorem isClosed_separationRel : IsClosed (𝓢 α) :=
by
rw [separationRel_eq_inter_closure]
- apply isClosed_interₛ
+ apply isClosed_sInter
rintro _ ⟨t, t_in, rfl⟩
exact isClosed_closure
#align is_closed_separation_rel isClosed_separationRel
@@ -403,7 +403,7 @@ instance separationSetoid.uniformSpace {α : Type u} [u : UniformSpace α] :
let ⟨t, ht, hts⟩ := comp_mem_uniformity_sets h
have hts : ∀ {a₁ a₂}, (a, a₁) ∈ t → (a₁, a₂) ∈ t → ⟦a₂⟧ ∈ s := fun a₁ a₂ ha₁ ha₂ =>
@hts (a, a₂) ⟨a₁, ha₁, ha₂⟩ rfl
- have ht' : ∀ {a₁ a₂}, a₁ ≈ a₂ → (a₁, a₂) ∈ t := fun a₁ a₂ h => interₛ_subset_of_mem ht h
+ have ht' : ∀ {a₁ a₂}, a₁ ≈ a₂ → (a₁, a₂) ∈ t := fun a₁ a₂ h => sInter_subset_of_mem ht h
u.uniformity.sets_of_superset ht fun ⟨a₁, a₂⟩ h₁ h₂ => hts (ht' <| Setoid.symm h₂) h₁,
fun h => u.uniformity.sets_of_superset h <| by simp (config := { contextual := true })⟩
simp only [isOpen_coinduced, isOpen_uniformity, uniformity, forall_quotient_iff, mem_preimage,
mathlib commit https://github.com/leanprover-community/mathlib/commit/4c586d291f189eecb9d00581aeb3dd998ac34442
@@ -378,14 +378,14 @@ instance separationSetoid.uniformSpace {α : Type u} [u : UniformSpace α] :
u.uniformity.lift'
((image fun p : α × α => (⟦p.fst⟧, ⟦p.snd⟧)) ∘ fun s : Set (α × α) =>
compRel s (compRel s s)) :=
- lift'_mono' fun s hs ⟨a, b⟩ ⟨c, ⟨⟨a₁, a₂⟩, ha, a_eq⟩, ⟨⟨b₁, b₂⟩, hb, b_eq⟩⟩ =>
+ (lift'_mono' fun s hs ⟨a, b⟩ ⟨c, ⟨⟨a₁, a₂⟩, ha, a_eq⟩, ⟨⟨b₁, b₂⟩, hb, b_eq⟩⟩ =>
by
simp at a_eq
simp at b_eq
have h : ⟦a₂⟧ = ⟦b₁⟧ := by rw [a_eq.right, b_eq.left]
have h : (a₂, b₁) ∈ 𝓢 α := Quotient.exact h
simp [Function.comp, Set.image, compRel, and_comm, and_left_comm, and_assoc]
- exact ⟨a₁, a_eq.left, b₂, b_eq.right, a₂, ha, b₁, h s hs, hb⟩
+ exact ⟨a₁, a_eq.left, b₂, b_eq.right, a₂, ha, b₁, h s hs, hb⟩)
_ =
map (fun p : α × α => (⟦p.1⟧, ⟦p.2⟧))
(u.uniformity.lift' fun s : Set (α × α) => compRel s (compRel s s)) :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/9da1b3534b65d9661eb8f42443598a92bbb49211
@@ -531,9 +531,11 @@ instance : SeparatedSpace (SeparationQuotient α) :=
instance [Inhabited α] : Inhabited (SeparationQuotient α) :=
Quotient.inhabited (separationSetoid α)
-theorem mk'_eq_mk' {x y : α} : (⟦x⟧ : SeparationQuotient α) = ⟦y⟧ ↔ Inseparable x y :=
+#print UniformSpace.SeparationQuotient.mk_eq_mk /-
+theorem mk_eq_mk {x y : α} : (⟦x⟧ : SeparationQuotient α) = ⟦y⟧ ↔ Inseparable x y :=
Quotient.eq''.trans separationRel_iff_inseparable
-#align uniform_space.separation_quotient.mk_eq_mk UniformSpace.SeparationQuotient.mk'_eq_mk'
+#align uniform_space.separation_quotient.mk_eq_mk UniformSpace.SeparationQuotient.mk_eq_mk
+-/
#print UniformSpace.SeparationQuotient.lift /-
/-- Factoring functions to a separated space through the separation quotient. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/9da1b3534b65d9661eb8f42443598a92bbb49211
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Patrick Massot
! This file was ported from Lean 3 source module topology.uniform_space.separation
-! leanprover-community/mathlib commit 4c19a16e4b705bf135cf9a80ac18fcc99c438514
+! leanprover-community/mathlib commit 0c1f285a9f6e608ae2bdffa3f993eafb01eba829
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -137,6 +137,19 @@ theorem Filter.HasBasis.mem_separationRel {ι : Sort _} {p : ι → Prop} {s :
h.forall_mem_mem
#align filter.has_basis.mem_separation_rel Filter.HasBasis.mem_separationRel
+#print separationRel_iff_specializes /-
+theorem separationRel_iff_specializes {a b : α} : (a, b) ∈ 𝓢 α ↔ a ⤳ b := by
+ simp only [(𝓤 α).basis_sets.mem_separationRel, id, mem_set_of_eq,
+ (nhds_basis_uniformity (𝓤 α).basis_sets).specializes_iff]
+#align separation_rel_iff_specializes separationRel_iff_specializes
+-/
+
+#print separationRel_iff_inseparable /-
+theorem separationRel_iff_inseparable {a b : α} : (a, b) ∈ 𝓢 α ↔ Inseparable a b :=
+ separationRel_iff_specializes.trans specializes_iff_inseparable
+#align separation_rel_iff_inseparable separationRel_iff_inseparable
+-/
+
#print SeparatedSpace /-
/-- A uniform space is separated if its separation relation is trivial (each point
is related only to itself). -/
@@ -518,6 +531,10 @@ instance : SeparatedSpace (SeparationQuotient α) :=
instance [Inhabited α] : Inhabited (SeparationQuotient α) :=
Quotient.inhabited (separationSetoid α)
+theorem mk'_eq_mk' {x y : α} : (⟦x⟧ : SeparationQuotient α) = ⟦y⟧ ↔ Inseparable x y :=
+ Quotient.eq''.trans separationRel_iff_inseparable
+#align uniform_space.separation_quotient.mk_eq_mk UniformSpace.SeparationQuotient.mk'_eq_mk'
+
#print UniformSpace.SeparationQuotient.lift /-
/-- Factoring functions to a separated space through the separation quotient. -/
def lift [SeparatedSpace β] (f : α → β) : SeparationQuotient α → β :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -250,7 +250,7 @@ instance instUniformSpace : UniformSpace (SeparationQuotient α) where
exact @hUt (x, z) ⟨y', this.mem_open (UniformSpace.isOpen_ball _ hUo) hxyU, hyzU⟩
nhds_eq_comap_uniformity := surjective_mk.forall.2 fun x ↦ comap_injective surjective_mk <| by
conv_lhs => rw [comap_mk_nhds_mk, nhds_eq_comap_uniformity, ← comap_map_mk_uniformity]
- simp only [Filter.comap_comap]; rfl
+ simp only [Filter.comap_comap, Function.comp, Prod_map]
theorem uniformity_eq : 𝓤 (SeparationQuotient α) = (𝓤 α).map (Prod.map mk mk) := rfl
#align uniform_space.uniformity_quotient SeparationQuotient.uniformity_eq
isOpen_uniformity
with nhds_eq_comap_uniformity
as I suggested in #2028UniformSpace.Core
so that we can drop refl
,
as it follows from nhds_eq_comap_uniformity
;UniformSpace.mk'
- can't be a match_pattern
anymore;UniformSpace.ofNhdsEqComap
.@@ -238,21 +238,19 @@ theorem comap_map_mk_uniformity : comap (Prod.map mk mk) (map (Prod.map mk mk) (
simp only [Prod.map, Prod.ext_iff, mk_eq_mk] at hxy
exact ((hxy.1.prod hxy.2).mem_open_iff hU.2).1 hyU
-instance instUniformSpace : UniformSpace (SeparationQuotient α) :=
- .ofNhdsEqComap
- { uniformity := map (Prod.map mk mk) (𝓤 α)
- refl := le_trans (by simpa using surjective_mk) (Filter.map_mono refl_le_uniformity)
- symm := tendsto_map' <| tendsto_map.comp tendsto_swap_uniformity
- comp := fun t ht ↦ by
- rcases comp_open_symm_mem_uniformity_sets ht with ⟨U, hU, hUo, -, hUt⟩
- refine mem_of_superset (mem_lift' <| image_mem_map hU) ?_
- simp only [subset_def, Prod.forall, mem_compRel, mem_image, Prod.ext_iff]
- rintro _ _ ⟨_, ⟨⟨x, y⟩, hxyU, rfl, rfl⟩, ⟨⟨y', z⟩, hyzU, hy, rfl⟩⟩
- have : y' ⤳ y := (mk_eq_mk.1 hy).specializes
- exact @hUt (x, z) ⟨y', this.mem_open (UniformSpace.isOpen_ball _ hUo) hxyU, hyzU⟩ }
- inferInstance <| surjective_mk.forall.2 fun x ↦ comap_injective surjective_mk <| by
- conv_lhs => rw [comap_mk_nhds_mk, nhds_eq_comap_uniformity, ← comap_map_mk_uniformity]
- simp only [Filter.comap_comap]; rfl
+instance instUniformSpace : UniformSpace (SeparationQuotient α) where
+ uniformity := map (Prod.map mk mk) (𝓤 α)
+ symm := tendsto_map' <| tendsto_map.comp tendsto_swap_uniformity
+ comp := fun t ht ↦ by
+ rcases comp_open_symm_mem_uniformity_sets ht with ⟨U, hU, hUo, -, hUt⟩
+ refine mem_of_superset (mem_lift' <| image_mem_map hU) ?_
+ simp only [subset_def, Prod.forall, mem_compRel, mem_image, Prod.ext_iff]
+ rintro _ _ ⟨_, ⟨⟨x, y⟩, hxyU, rfl, rfl⟩, ⟨⟨y', z⟩, hyzU, hy, rfl⟩⟩
+ have : y' ⤳ y := (mk_eq_mk.1 hy).specializes
+ exact @hUt (x, z) ⟨y', this.mem_open (UniformSpace.isOpen_ball _ hUo) hxyU, hyzU⟩
+ nhds_eq_comap_uniformity := surjective_mk.forall.2 fun x ↦ comap_injective surjective_mk <| by
+ conv_lhs => rw [comap_mk_nhds_mk, nhds_eq_comap_uniformity, ← comap_map_mk_uniformity]
+ simp only [Filter.comap_comap]; rfl
theorem uniformity_eq : 𝓤 (SeparationQuotient α) = (𝓤 α).map (Prod.map mk mk) := rfl
#align uniform_space.uniformity_quotient SeparationQuotient.uniformity_eq
separationRel
(#10644)
We had duplicated API between topological spaces and uniform spaces. In this PR I mostly deduplicate it with some exceptions:
SeparationQuotient.lift'
and SeparationQuotient.map
are leftovers from the old version
that are designed to work with uniform spaces;UniformSpace
when TopologicalSpace
would work.Outside of UniformSpace/Separation
, I mostly changed SeparatedSpace
to T0Space
and separationRel
to Inseparable
. I also rewrote a few proofs that were broken by the API change.
Fixes #2031
@@ -1,7 +1,7 @@
/-
Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
-Authors: Johannes Hölzl, Patrick Massot
+Authors: Johannes Hölzl, Patrick Massot, Yury Kudryashov
-/
import Mathlib.Tactic.ApplyFun
import Mathlib.Topology.UniformSpace.Basic
@@ -12,58 +12,89 @@ import Mathlib.Topology.Separation
/-!
# Hausdorff properties of uniform spaces. Separation quotient.
-This file studies uniform spaces whose underlying topological spaces are separated
-(also known as Hausdorff or T₂).
-This turns out to be equivalent to asking that the intersection of all entourages
-is the diagonal only. This condition actually implies the stronger separation property
-that the space is T₃, hence those conditions are equivalent for topologies coming from
-a uniform structure.
+Two points of a topological space are called `Inseparable`,
+if their neighborhoods filter are equal.
+Equivalently, `Inseparable x y` means that any open set that contains `x` must contain `y`
+and vice versa.
+
+In a uniform space, points `x` and `y` are inseparable
+if and only if `(x, y)` belongs to all entourages,
+see `inseparable_iff_ker_uniformity`.
+
+A uniform space is a regular topological space,
+hence separation axioms `T0Space`, `T1Space`, `T2Space`, and `T3Space`
+are equivalent for uniform spaces,
+and Lean typeclass search can automatically convert from one assumption to another.
+We say that a uniform space is *separated*, if it satisfies these axioms.
+If you need an `Iff` statement (e.g., to rewrite),
+then see `R1Space.t0Space_iff_t2Space` and `RegularSpace.t0Space_iff_t3Space`.
+
+In this file we prove several facts
+that relate `Inseparable` and `Specializes` to the uniformity filter.
+Most of them are simple corollaries of `Filter.HasBasis.inseparable_iff_uniformity`
+for different filter bases of `𝓤 α`.
+
+Then we study the Kolmogorov quotient `SeparationQuotient X` of a uniform space.
+For a general topological space,
+this quotient is defined as the quotient by `Inseparable` equivalence relation.
+It is the maximal T₀ quotient of a topological space.
+
+In case of a uniform space, we equip this quotient with a `UniformSpace` structure
+that agrees with the quotient topology.
+We also prove that the quotient map induces uniformity on the original space.
+
+Finally, we turn `SeparationQuotient` into a functor
+(not in terms of `CategoryTheory.Functor` to avoid extra imports)
+by defining `SeparationQuotient.lift'` and `SeparationQuotient.map` operations.
-More generally, the intersection `𝓢 X` of all entourages of `X`, which has type `Set (X × X)` is an
-equivalence relation on `X`. Points which are equivalent under the relation are basically
-undistinguishable from the point of view of the uniform structure. For instance any uniformly
-continuous function will send equivalent points to the same value.
-
-The quotient `SeparationQuotient X` of `X` by `𝓢 X` has a natural uniform structure which is
-separated, and satisfies a universal property: every uniformly continuous function
-from `X` to a separated uniform space uniquely factors through `SeparationQuotient X`.
-As usual, this allows to turn `SeparationQuotient` into a functor (but we don't use the
-category theory library in this file).
+## Main definitions
-These notions admit relative versions, one can ask that `s : Set X` is separated, this
-is equivalent to asking that the uniform structure induced on `s` is separated.
+* `SeparationQuotient.instUniformSpace`: uniform space structure on `SeparationQuotient α`,
+ where `α` is a uniform space;
-## Main definitions
+* `SeparationQuotient.lift'`: given a map `f : α → β`
+ from a uniform space to a separated uniform space,
+ lift it to a map `SeparationQuotient α → β`;
+ if the original map is not uniformly continuous, then returns a constant map.
-* `separationRel X : Set (X × X)`: the separation relation
-* `SeparatedSpace X`: a predicate class asserting that `X` is separated
-* `SeparationQuotient X`: the maximal separated quotient of `X`.
-* `SeparationQuotient.lift f`: factors a map `f : X → Y` through the separation quotient of `X`.
-* `SeparationQuotient.map f`: turns a map `f : X → Y` into a map between the separation quotients
- of `X` and `Y`.
+* `SeparationQuotient.map`: given a map `f : α → β` between uniform spaces,
+ returns a map `SeparationQuotient α → SeparationQuotient β`.
+ If the original map is not uniformly continuous, then returns a constant map.
+ Otherwise, `SeparationQuotient.map f (SeparationQuotient.mk x) = SeparationQuotient.mk (f x)`.
## Main results
-* `separated_iff_t2`: the equivalence between being separated and being Hausdorff for uniform
- spaces.
-* `SeparationQuotient.uniformContinuous_lift`: factoring a uniformly continuous map through the
+* `SeparationQuotient.uniformity_eq`: the uniformity filter on `SeparationQuotient α`
+ is the push forward of the uniformity filter on `α`.
+* `SeparationQuotient.comap_mk_uniformity`: the quotient map `α → SeparationQuotient α`
+ induces uniform space structure on the original space.
+* `SeparationQuotient.uniformContinuous_lift'`: factoring a uniformly continuous map through the
separation quotient gives a uniformly continuous map.
* `SeparationQuotient.uniformContinuous_map`: maps induced between separation quotients are
uniformly continuous.
-## Notations
+## Implementation notes
+
+This files used to contain definitions of `separationRel α` and `UniformSpace.SeparationQuotient α`.
+These definitions were equal (but not definitionally equal)
+to `{x : α × α | Inseparable x.1 x.2}` and `SeparationQuotient α`, respectively,
+and were added to the library before their geneeralizations to topological spaces.
-Localized in `uniformity`, we have the notation `𝓢 X` for the separation relation
-on a uniform space `X`,
+In #10644, we migrated from these definitions
+to more general `Inseparable` and `SeparationQuotient`.
-## Implementation notes
+## TODO
-The separation setoid `separationSetoid` is not declared as a global instance.
-It is made a local instance while building the theory of `SeparationQuotient`.
-The factored map `SeparationQuotient.lift f` is defined without imposing any condition on
-`f`, but returns junk if `f` is not uniformly continuous (constant junk hence it is always
-uniformly continuous).
+Definitions `SeparationQuotient.lift'` and `SeparationQuotient.map`
+rely on `UniformSpace` structures in the domain and in the codomain.
+We should generalize them to topological spaces.
+This generalization will drop `UniformContinuous` assumptions in some lemmas,
+and add these assumptions in other lemmas,
+so it was not done in #10644 to keep it reasonably sized.
+## Keywords
+
+uniform space, separated space, Hausdorff space, separation quotient
-/
open Filter Set Function Topology Uniformity UniformSpace
@@ -86,136 +117,89 @@ instance (priority := 100) UniformSpace.to_regularSpace : RegularSpace α :=
fun a _V hV ↦ isClosed_ball a hV.2
#align uniform_space.to_regular_space UniformSpace.to_regularSpace
--- Porting note (#11215): TODO: use `Inseparable`
-/-- The separation relation is the intersection of all entourages.
- Two points which are related by the separation relation are "indistinguishable"
- according to the uniform structure. -/
-def separationRel (α : Type u) [UniformSpace α] := (𝓤 α).ker
-#align separation_rel separationRel
-
-@[inherit_doc]
-scoped[Uniformity] notation "𝓢" => separationRel
-
-theorem separated_equiv : Equivalence fun x y => (x, y) ∈ 𝓢 α :=
- ⟨fun _ _ => refl_mem_uniformity, fun h _s hs => h _ (symm_le_uniformity hs),
- fun {x y z} (hxy : (x, y) ∈ 𝓢 α) (hyz : (y, z) ∈ 𝓢 α) s (hs : s ∈ 𝓤 α) =>
- let ⟨t, ht, (h_ts : compRel t t ⊆ s)⟩ := comp_mem_uniformity_sets hs
- h_ts <| show (x, z) ∈ compRel t t from ⟨y, hxy t ht, hyz t ht⟩⟩
-#align separated_equiv separated_equiv
-
-theorem Filter.HasBasis.mem_separationRel {ι : Sort*} {p : ι → Prop} {s : ι → Set (α × α)}
- (h : (𝓤 α).HasBasis p s) {a : α × α} : a ∈ 𝓢 α ↔ ∀ i, p i → a ∈ s i :=
- h.forall_mem_mem
-#align filter.has_basis.mem_separation_rel Filter.HasBasis.mem_separationRel
-
-theorem separationRel_iff_specializes {a b : α} : (a, b) ∈ 𝓢 α ↔ a ⤳ b := by
- simp only [(𝓤 α).basis_sets.mem_separationRel, id, mem_setOf_eq,
- (nhds_basis_uniformity (𝓤 α).basis_sets).specializes_iff]
-#align separation_rel_iff_specializes separationRel_iff_specializes
-
-theorem separationRel_iff_inseparable {a b : α} : (a, b) ∈ 𝓢 α ↔ Inseparable a b :=
- separationRel_iff_specializes.trans specializes_iff_inseparable
-#align separation_rel_iff_inseparable separationRel_iff_inseparable
-
-/-- A uniform space is separated if its separation relation is trivial (each point
-is related only to itself). -/
-class SeparatedSpace (α : Type u) [UniformSpace α] : Prop where
- /-- The separation relation is equal to the diagonal `idRel`. -/
- out : 𝓢 α = idRel
-#align separated_space SeparatedSpace
-
-theorem separatedSpace_iff {α : Type u} [UniformSpace α] : SeparatedSpace α ↔ 𝓢 α = idRel :=
- ⟨fun h => h.1, fun h => ⟨h⟩⟩
-#align separated_space_iff separatedSpace_iff
-
-theorem separated_def {α : Type u} [UniformSpace α] :
- SeparatedSpace α ↔ ∀ x y, (∀ r ∈ 𝓤 α, (x, y) ∈ r) → x = y := by
- simp only [separatedSpace_iff, Set.ext_iff, Prod.forall, mem_idRel, separationRel, mem_sInter]
- exact forall₂_congr fun _ _ => ⟨Iff.mp, fun h => ⟨h, fun H U hU => H ▸ refl_mem_uniformity hU⟩⟩
-#align separated_def separated_def
-
-theorem separated_def' {α : Type u} [UniformSpace α] :
- SeparatedSpace α ↔ Pairwise fun x y => ∃ r ∈ 𝓤 α, (x, y) ∉ r :=
- separated_def.trans <| forall₂_congr fun x y => by rw [← not_imp_not]; simp [not_forall]
-#align separated_def' separated_def'
-
-theorem eq_of_uniformity {α : Type*} [UniformSpace α] [SeparatedSpace α] {x y : α}
+#align separation_rel Inseparable
+#noalign separated_equiv
+#align separation_rel_iff_specializes specializes_iff_inseparable
+#noalign separation_rel_iff_inseparable
+
+theorem Filter.HasBasis.specializes_iff_uniformity {ι : Sort*} {p : ι → Prop} {s : ι → Set (α × α)}
+ (h : (𝓤 α).HasBasis p s) {x y : α} : x ⤳ y ↔ ∀ i, p i → (x, y) ∈ s i :=
+ (nhds_basis_uniformity h).specializes_iff
+
+theorem Filter.HasBasis.inseparable_iff_uniformity {ι : Sort*} {p : ι → Prop} {s : ι → Set (α × α)}
+ (h : (𝓤 α).HasBasis p s) {x y : α} : Inseparable x y ↔ ∀ i, p i → (x, y) ∈ s i :=
+ specializes_iff_inseparable.symm.trans h.specializes_iff_uniformity
+#align filter.has_basis.mem_separation_rel Filter.HasBasis.inseparable_iff_uniformity
+
+theorem inseparable_iff_ker_uniformity {x y : α} : Inseparable x y ↔ (x, y) ∈ (𝓤 α).ker :=
+ (𝓤 α).basis_sets.inseparable_iff_uniformity
+
+protected theorem Inseparable.nhds_le_uniformity {x y : α} (h : Inseparable x y) :
+ 𝓝 (x, y) ≤ 𝓤 α := by
+ rw [h.prod rfl]
+ apply nhds_le_uniformity
+
+theorem inseparable_iff_clusterPt_uniformity {x y : α} :
+ Inseparable x y ↔ ClusterPt (x, y) (𝓤 α) := by
+ refine ⟨fun h ↦ .of_nhds_le h.nhds_le_uniformity, fun h ↦ ?_⟩
+ simp_rw [uniformity_hasBasis_closed.inseparable_iff_uniformity, isClosed_iff_clusterPt]
+ exact fun U ⟨hU, hUc⟩ ↦ hUc _ <| h.mono <| le_principal_iff.2 hU
+
+#align separated_space T0Space
+
+theorem t0Space_iff_uniformity :
+ T0Space α ↔ ∀ x y, (∀ r ∈ 𝓤 α, (x, y) ∈ r) → x = y := by
+ simp only [t0Space_iff_inseparable, inseparable_iff_ker_uniformity, mem_ker, id]
+#align separated_def t0Space_iff_uniformity
+
+theorem t0Space_iff_uniformity' :
+ T0Space α ↔ Pairwise fun x y ↦ ∃ r ∈ 𝓤 α, (x, y) ∉ r := by
+ simp [t0Space_iff_not_inseparable, inseparable_iff_ker_uniformity]
+#align separated_def' t0Space_iff_uniformity'
+
+theorem t0Space_iff_ker_uniformity : T0Space α ↔ (𝓤 α).ker = diagonal α := by
+ simp_rw [t0Space_iff_uniformity, subset_antisymm_iff, diagonal_subset_iff, subset_def,
+ Prod.forall, Filter.mem_ker, mem_diagonal_iff, iff_self_and]
+ exact fun _ x s hs ↦ refl_mem_uniformity hs
+#align separated_space_iff t0Space_iff_ker_uniformity
+
+theorem eq_of_uniformity {α : Type*} [UniformSpace α] [T0Space α] {x y : α}
(h : ∀ {V}, V ∈ 𝓤 α → (x, y) ∈ V) : x = y :=
- separated_def.mp ‹SeparatedSpace α› x y fun _ => h
+ t0Space_iff_uniformity.mp ‹T0Space α› x y @h
#align eq_of_uniformity eq_of_uniformity
-theorem eq_of_uniformity_basis {α : Type*} [UniformSpace α] [SeparatedSpace α] {ι : Type*}
+theorem eq_of_uniformity_basis {α : Type*} [UniformSpace α] [T0Space α] {ι : Sort*}
{p : ι → Prop} {s : ι → Set (α × α)} (hs : (𝓤 α).HasBasis p s) {x y : α}
(h : ∀ {i}, p i → (x, y) ∈ s i) : x = y :=
- eq_of_uniformity fun V_in => let ⟨_, hi, H⟩ := hs.mem_iff.mp V_in; H (h hi)
+ (hs.inseparable_iff_uniformity.2 @h).eq
#align eq_of_uniformity_basis eq_of_uniformity_basis
-theorem eq_of_forall_symmetric {α : Type*} [UniformSpace α] [SeparatedSpace α] {x y : α}
+theorem eq_of_forall_symmetric {α : Type*} [UniformSpace α] [T0Space α] {x y : α}
(h : ∀ {V}, V ∈ 𝓤 α → SymmetricRel V → (x, y) ∈ V) : x = y :=
- eq_of_uniformity_basis hasBasis_symmetric (by simpa [and_imp])
+ eq_of_uniformity_basis hasBasis_symmetric (by simpa)
#align eq_of_forall_symmetric eq_of_forall_symmetric
-theorem eq_of_clusterPt_uniformity [SeparatedSpace α] {x y : α} (h : ClusterPt (x, y) (𝓤 α)) :
- x = y :=
- eq_of_uniformity_basis uniformity_hasBasis_closed fun ⟨hV, hVc⟩ =>
- isClosed_iff_clusterPt.1 hVc _ <| h.mono <| le_principal_iff.2 hV
+theorem eq_of_clusterPt_uniformity [T0Space α] {x y : α} (h : ClusterPt (x, y) (𝓤 α)) : x = y :=
+ (inseparable_iff_clusterPt_uniformity.2 h).eq
#align eq_of_cluster_pt_uniformity eq_of_clusterPt_uniformity
-theorem idRel_sub_separationRel (α : Type*) [UniformSpace α] : idRel ⊆ 𝓢 α := by
- unfold separationRel
- rw [idRel_subset]
- intro x
- suffices ∀ t ∈ 𝓤 α, (x, x) ∈ t by simpa only [refl_mem_uniformity]
- exact fun t => refl_mem_uniformity
-#align id_rel_sub_separation_relation idRel_sub_separationRel
-
-theorem separationRel_comap {f : α → β}
- (h : ‹UniformSpace α› = UniformSpace.comap f ‹UniformSpace β›) :
- 𝓢 α = Prod.map f f ⁻¹' 𝓢 β := by
- subst h
- dsimp [separationRel]
- simp_rw [uniformity_comap, ((𝓤 β).comap_hasBasis <| Prod.map f f).ker, ker_def, preimage_iInter]
-#align separation_rel_comap separationRel_comap
-
-protected theorem Filter.HasBasis.separationRel {ι : Sort*} {p : ι → Prop} {s : ι → Set (α × α)}
- (h : HasBasis (𝓤 α) p s) : 𝓢 α = ⋂ (i) (_ : p i), s i := by
- unfold separationRel
- rw [h.ker]
-#align filter.has_basis.separation_rel Filter.HasBasis.separationRel
-
-theorem separationRel_eq_inter_closure : 𝓢 α = ⋂₀ (closure '' (𝓤 α).sets) := by
- simp [uniformity_hasBasis_closure.separationRel]
-#align separation_rel_eq_inter_closure separationRel_eq_inter_closure
-
-theorem isClosed_separationRel : IsClosed (𝓢 α) := by
- rw [separationRel_eq_inter_closure]
- apply isClosed_sInter
- rintro _ ⟨t, -, rfl⟩
- exact isClosed_closure
-#align is_closed_separation_rel isClosed_separationRel
-
-theorem separated_iff_t2 : SeparatedSpace α ↔ T2Space α := by
- constructor <;> intro h
- · rw [t2_iff_isClosed_diagonal, ← show 𝓢 α = diagonal α from h.1]
- exact isClosed_separationRel
- · rw [separated_def']
- intro x y hxy
- rcases t2_separation hxy with ⟨u, v, uo, -, hx, hy, h⟩
- rcases isOpen_iff_ball_subset.1 uo x hx with ⟨r, hrU, hr⟩
- exact ⟨r, hrU, fun H => h.le_bot ⟨hr H, hy⟩⟩
-#align separated_iff_t2 separated_iff_t2
-
--- see Note [lower instance priority]
-instance (priority := 100) separated_t3 [SeparatedSpace α] : T3Space α :=
- haveI := separated_iff_t2.mp ‹_›
- ⟨⟩
-#align separated_t3 separated_t3
-
-instance Subtype.separatedSpace [SeparatedSpace α] (s : Set α) : SeparatedSpace s :=
- separated_iff_t2.mpr inferInstance
-#align subtype.separated_space Subtype.separatedSpace
-
-theorem isClosed_of_spaced_out [SeparatedSpace α] {V₀ : Set (α × α)} (V₀_in : V₀ ∈ 𝓤 α) {s : Set α}
+theorem Filter.Tendsto.inseparable_iff_uniformity {l : Filter β} [NeBot l] {f g : β → α} {a b : α}
+ (ha : Tendsto f l (𝓝 a)) (hb : Tendsto g l (𝓝 b)) :
+ Inseparable a b ↔ Tendsto (fun x ↦ (f x, g x)) l (𝓤 α) := by
+ refine ⟨fun h ↦ (ha.prod_mk_nhds hb).mono_right h.nhds_le_uniformity, fun h ↦ ?_⟩
+ rw [inseparable_iff_clusterPt_uniformity]
+ exact (ClusterPt.of_le_nhds (ha.prod_mk_nhds hb)).mono h
+
+#align id_rel_sub_separation_relation Inseparable.rfl
+#align separation_rel_comap Inducing.inseparable_iff
+#align filter.has_basis.separation_rel Filter.HasBasis.ker
+#noalign separation_rel_eq_inter_closure
+#align is_closed_separation_rel isClosed_setOf_inseparable
+#align separated_iff_t2 R1Space.t2Space_iff_t0Space
+#align separated_t3 RegularSpace.t3Space_iff_t0Space
+#align subtype.separated_space Subtype.t0Space
+
+theorem isClosed_of_spaced_out [T0Space α] {V₀ : Set (α × α)} (V₀_in : V₀ ∈ 𝓤 α) {s : Set α}
(hs : s.Pairwise fun x y => (x, y) ∉ V₀) : IsClosed s := by
rcases comp_symm_mem_uniformity_sets V₀_in with ⟨V₁, V₁_in, V₁_symm, h_comp⟩
apply isClosed_of_closure_subset
@@ -232,7 +216,7 @@ theorem isClosed_of_spaced_out [SeparatedSpace α] {V₀ : Set (α × α)} (V₀
exact ball_inter_right x _ _ hz
#align is_closed_of_spaced_out isClosed_of_spaced_out
-theorem isClosed_range_of_spaced_out {ι} [SeparatedSpace α] {V₀ : Set (α × α)} (V₀_in : V₀ ∈ 𝓤 α)
+theorem isClosed_range_of_spaced_out {ι} [T0Space α] {V₀ : Set (α × α)} (V₀_in : V₀ ∈ 𝓤 α)
{f : ι → α} (hf : Pairwise fun x y => (f x, f y) ∉ V₀) : IsClosed (range f) :=
isClosed_of_spaced_out V₀_in <| by
rintro _ ⟨x, rfl⟩ _ ⟨y, rfl⟩ h
@@ -243,197 +227,125 @@ theorem isClosed_range_of_spaced_out {ι} [SeparatedSpace α] {V₀ : Set (α ×
### Separation quotient
-/
-namespace UniformSpace
-
-/-- The separation relation of a uniform space seen as a setoid. -/
-def separationSetoid (α : Type u) [UniformSpace α] : Setoid α :=
- ⟨fun x y => (x, y) ∈ 𝓢 α, separated_equiv⟩
-#align uniform_space.separation_setoid UniformSpace.separationSetoid
-
-attribute [local instance] separationSetoid
-
-instance separationSetoid.uniformSpace {α : Type u} [UniformSpace α] :
- UniformSpace (Quotient (separationSetoid α)) where
- toTopologicalSpace := instTopologicalSpaceQuotient
- uniformity := map (fun p : α × α => (⟦p.1⟧, ⟦p.2⟧)) (𝓤 α)
- refl := le_trans (by simp [Quotient.exists_rep]) (Filter.map_mono refl_le_uniformity)
- symm := tendsto_map' <| tendsto_map.comp tendsto_swap_uniformity
- comp s hs := by
- rcases comp_open_symm_mem_uniformity_sets hs with ⟨U, hU, hUo, -, hUs⟩
- refine' mem_of_superset (mem_lift' <| image_mem_map hU) ?_
- simp only [subset_def, Prod.forall, mem_compRel, mem_image, Prod.ext_iff]
- rintro _ _ ⟨_, ⟨⟨x, y⟩, hxyU, rfl, rfl⟩, ⟨⟨y', z⟩, hyzU, hy, rfl⟩⟩
- have : y' ⤳ y := separationRel_iff_specializes.1 (Quotient.exact hy)
- exact @hUs (x, z) ⟨y', this.mem_open (UniformSpace.isOpen_ball _ hUo) hxyU, hyzU⟩
- isOpen_uniformity s := isOpen_coinduced.trans <| by
- simp only [_root_.isOpen_uniformity, Quotient.forall, mem_map', mem_setOf_eq]
- refine forall₂_congr fun x _ => ⟨fun h => ?_, fun h => mem_of_superset h ?_⟩
- · rcases comp_mem_uniformity_sets h with ⟨t, ht, hts⟩
- refine mem_of_superset ht fun (y, z) hyz hyx => @hts (x, z) ⟨y, ?_, hyz⟩ rfl
- exact Quotient.exact hyx.symm _ ht
- · exact fun y hy hyx => hy <| congr_arg _ hyx
-#align uniform_space.separation_setoid.uniform_space UniformSpace.separationSetoid.uniformSpace
-
-theorem uniformity_quotient :
- 𝓤 (Quotient (separationSetoid α)) = (𝓤 α).map fun p : α × α => (⟦p.1⟧, ⟦p.2⟧) :=
- rfl
-#align uniform_space.uniformity_quotient UniformSpace.uniformity_quotient
+#align uniform_space.separation_setoid inseparableSetoid
-theorem uniformContinuous_quotient_mk' :
- UniformContinuous (Quotient.mk' : α → Quotient (separationSetoid α)) :=
- le_rfl
-#align uniform_space.uniform_continuous_quotient_mk UniformSpace.uniformContinuous_quotient_mk'
+namespace SeparationQuotient
-theorem uniformContinuous_quotient_mk : UniformContinuous (Quotient.mk (separationSetoid α)) :=
+theorem comap_map_mk_uniformity : comap (Prod.map mk mk) (map (Prod.map mk mk) (𝓤 α)) = 𝓤 α := by
+ refine le_antisymm ?_ le_comap_map
+ refine ((((𝓤 α).basis_sets.map _).comap _).le_basis_iff uniformity_hasBasis_open).2 fun U hU ↦ ?_
+ refine ⟨U, hU.1, fun (x₁, x₂) ⟨(y₁, y₂), hyU, hxy⟩ ↦ ?_⟩
+ simp only [Prod.map, Prod.ext_iff, mk_eq_mk] at hxy
+ exact ((hxy.1.prod hxy.2).mem_open_iff hU.2).1 hyU
+
+instance instUniformSpace : UniformSpace (SeparationQuotient α) :=
+ .ofNhdsEqComap
+ { uniformity := map (Prod.map mk mk) (𝓤 α)
+ refl := le_trans (by simpa using surjective_mk) (Filter.map_mono refl_le_uniformity)
+ symm := tendsto_map' <| tendsto_map.comp tendsto_swap_uniformity
+ comp := fun t ht ↦ by
+ rcases comp_open_symm_mem_uniformity_sets ht with ⟨U, hU, hUo, -, hUt⟩
+ refine mem_of_superset (mem_lift' <| image_mem_map hU) ?_
+ simp only [subset_def, Prod.forall, mem_compRel, mem_image, Prod.ext_iff]
+ rintro _ _ ⟨_, ⟨⟨x, y⟩, hxyU, rfl, rfl⟩, ⟨⟨y', z⟩, hyzU, hy, rfl⟩⟩
+ have : y' ⤳ y := (mk_eq_mk.1 hy).specializes
+ exact @hUt (x, z) ⟨y', this.mem_open (UniformSpace.isOpen_ball _ hUo) hxyU, hyzU⟩ }
+ inferInstance <| surjective_mk.forall.2 fun x ↦ comap_injective surjective_mk <| by
+ conv_lhs => rw [comap_mk_nhds_mk, nhds_eq_comap_uniformity, ← comap_map_mk_uniformity]
+ simp only [Filter.comap_comap]; rfl
+
+theorem uniformity_eq : 𝓤 (SeparationQuotient α) = (𝓤 α).map (Prod.map mk mk) := rfl
+#align uniform_space.uniformity_quotient SeparationQuotient.uniformity_eq
+
+theorem uniformContinuous_mk : UniformContinuous (mk : α → SeparationQuotient α) :=
le_rfl
+#align uniform_space.uniform_continuous_quotient_mk SeparationQuotient.uniformContinuous_mk
-theorem uniformContinuous_quotient {f : Quotient (separationSetoid α) → β}
- (hf : UniformContinuous fun x => f ⟦x⟧) : UniformContinuous f :=
- hf
-#align uniform_space.uniform_continuous_quotient UniformSpace.uniformContinuous_quotient
-
-theorem uniformContinuous_quotient_lift {f : α → β} {h : ∀ a b, (a, b) ∈ 𝓢 α → f a = f b}
- (hf : UniformContinuous f) : UniformContinuous fun a => Quotient.lift f h a :=
- uniformContinuous_quotient hf
-#align uniform_space.uniform_continuous_quotient_lift UniformSpace.uniformContinuous_quotient_lift
-
-theorem uniformContinuous_quotient_lift₂ {f : α → β → γ}
- {h : ∀ a c b d, (a, b) ∈ 𝓢 α → (c, d) ∈ 𝓢 β → f a c = f b d}
- (hf : UniformContinuous fun p : α × β => f p.1 p.2) :
- UniformContinuous fun p : _ × _ => Quotient.lift₂ f h p.1 p.2 := by
- rw [UniformContinuous, uniformity_prod_eq_prod, uniformity_quotient, uniformity_quotient,
- Filter.prod_map_map_eq, Filter.tendsto_map'_iff, Filter.tendsto_map'_iff]
- rwa [UniformContinuous, uniformity_prod_eq_prod, Filter.tendsto_map'_iff] at hf
-#align uniform_space.uniform_continuous_quotient_lift₂ UniformSpace.uniformContinuous_quotient_lift₂
-
-theorem comap_quotient_le_uniformity :
- ((𝓤 <| Quotient <| separationSetoid α).comap fun p : α × α => (⟦p.fst⟧, ⟦p.snd⟧)) ≤ 𝓤 α :=
- ((((𝓤 α).basis_sets.map _).comap _).le_basis_iff uniformity_hasBasis_open).2 fun U hU =>
- ⟨U, hU.1, fun ⟨x, y⟩ ⟨⟨x', y'⟩, hx', h⟩ => by
- simp only [Prod.ext_iff, Quotient.eq] at h
- exact (((separationRel_iff_inseparable.1 h.1).prod
- (separationRel_iff_inseparable.1 h.2)).mem_open_iff hU.2).1 hx'⟩
-#align uniform_space.comap_quotient_le_uniformity UniformSpace.comap_quotient_le_uniformity
-
-theorem comap_quotient_eq_uniformity :
- ((𝓤 <| Quotient <| separationSetoid α).comap fun p : α × α => (⟦p.fst⟧, ⟦p.snd⟧)) = 𝓤 α :=
- le_antisymm comap_quotient_le_uniformity le_comap_map
-#align uniform_space.comap_quotient_eq_uniformity UniformSpace.comap_quotient_eq_uniformity
-
-instance separated_separation : SeparatedSpace (Quotient (separationSetoid α)) :=
- ⟨Set.ext fun ⟨a, b⟩ =>
- Quotient.inductionOn₂ a b fun a b =>
- ⟨fun h =>
- have : a ≈ b := fun s hs =>
- have :
- s ∈ (𝓤 <| Quotient <| separationSetoid α).comap fun p : α × α => (⟦p.1⟧, ⟦p.2⟧) :=
- comap_quotient_le_uniformity hs
- let ⟨t, ht, hts⟩ := this
- hts (by dsimp [preimage]; exact h t ht)
- show ⟦a⟧ = ⟦b⟧ from Quotient.sound this,
- fun heq : ⟦a⟧ = ⟦b⟧ => fun h hs => heq ▸ refl_mem_uniformity hs⟩⟩
-#align uniform_space.separated_separation UniformSpace.separated_separation
-
-theorem separated_of_uniformContinuous {f : α → β} {x y : α} (H : UniformContinuous f) (h : x ≈ y) :
- f x ≈ f y := fun _ h' => h _ (H h')
-#align uniform_space.separated_of_uniform_continuous UniformSpace.separated_of_uniformContinuous
-
-theorem eq_of_separated_of_uniformContinuous [SeparatedSpace β] {f : α → β} {x y : α}
- (H : UniformContinuous f) (h : x ≈ y) : f x = f y :=
- separated_def.1 (by infer_instance) _ _ <| separated_of_uniformContinuous H h
-#align uniform_space.eq_of_separated_of_uniform_continuous UniformSpace.eq_of_separated_of_uniformContinuous
-
-/-- The maximal separated quotient of a uniform space `α`. -/
-def SeparationQuotient (α : Type*) [UniformSpace α] :=
- Quotient (separationSetoid α)
-#align uniform_space.separation_quotient UniformSpace.SeparationQuotient
+theorem uniformContinuous_dom {f : SeparationQuotient α → β} :
+ UniformContinuous f ↔ UniformContinuous (f ∘ mk) :=
+ .rfl
+#align uniform_space.uniform_continuous_quotient SeparationQuotient.uniformContinuous_dom
-namespace SeparationQuotient
+theorem uniformContinuous_dom₂ {f : SeparationQuotient α × SeparationQuotient β → γ} :
+ UniformContinuous f ↔ UniformContinuous fun p : α × β ↦ f (mk p.1, mk p.2) := by
+ simp only [UniformContinuous, uniformity_prod_eq_prod, uniformity_eq, prod_map_map_eq,
+ tendsto_map'_iff]
+ rfl
+
+theorem uniformContinuous_lift {f : α → β} (h : ∀ a b, Inseparable a b → f a = f b) :
+ UniformContinuous (lift f h) ↔ UniformContinuous f :=
+ .rfl
+#align uniform_space.uniform_continuous_quotient_lift SeparationQuotient.uniformContinuous_lift
+
+theorem uniformContinuous_uncurry_lift₂ {f : α → β → γ}
+ (h : ∀ a c b d, Inseparable a b → Inseparable c d → f a c = f b d) :
+ UniformContinuous (uncurry <| lift₂ f h) ↔ UniformContinuous (uncurry f) :=
+ uniformContinuous_dom₂
+#align uniform_space.uniform_continuous_quotient_lift₂ SeparationQuotient.uniformContinuous_uncurry_lift₂
+
+#noalign uniform_space.comap_quotient_le_uniformity
+
+theorem comap_mk_uniformity : (𝓤 (SeparationQuotient α)).comap (Prod.map mk mk) = 𝓤 α :=
+ comap_map_mk_uniformity
+#align uniform_space.comap_quotient_eq_uniformity SeparationQuotient.comap_mk_uniformity
-instance : UniformSpace (SeparationQuotient α) :=
- separationSetoid.uniformSpace
+#align uniform_space.separated_separation SeparationQuotient.instT0Space
-instance : SeparatedSpace (SeparationQuotient α) :=
- UniformSpace.separated_separation
+#align uniform_space.separated_of_uniform_continuous Inseparable.map
+#noalign uniform_space.eq_of_separated_of_uniform_continuous
-instance [Inhabited α] : Inhabited (SeparationQuotient α) :=
- inferInstanceAs (Inhabited (Quotient (separationSetoid α)))
+#align uniform_space.separation_quotient SeparationQuotient
+#align uniform_space.separation_quotient.mk_eq_mk SeparationQuotient.mk_eq_mk
-lemma mk_eq_mk {x y : α} : (⟦x⟧ : SeparationQuotient α) = ⟦y⟧ ↔ Inseparable x y :=
- Quotient.eq'.trans separationRel_iff_inseparable
-#align uniform_space.separation_quotient.mk_eq_mk UniformSpace.SeparationQuotient.mk_eq_mk
+/-- Factoring functions to a separated space through the separation quotient.
-/-- Factoring functions to a separated space through the separation quotient. -/
-def lift [SeparatedSpace β] (f : α → β) : SeparationQuotient α → β :=
- if h : UniformContinuous f then Quotient.lift f fun _ _ => eq_of_separated_of_uniformContinuous h
- else fun x => f (Nonempty.some ⟨x.out⟩)
-#align uniform_space.separation_quotient.lift UniformSpace.SeparationQuotient.lift
+TODO: unify with `SeparationQuotient.lift`. -/
+def lift' [T0Space β] (f : α → β) : SeparationQuotient α → β :=
+ if hc : UniformContinuous f then lift f fun _ _ h => (h.map hc.continuous).eq
+ else fun x => f (Nonempty.some ⟨x.out'⟩)
+#align uniform_space.separation_quotient.lift SeparationQuotient.lift'
-theorem lift_mk [SeparatedSpace β] {f : α → β} (h : UniformContinuous f) (a : α) :
- lift f ⟦a⟧ = f a := by rw [lift, dif_pos h]; rfl
-#align uniform_space.separation_quotient.lift_mk UniformSpace.SeparationQuotient.lift_mk
+theorem lift'_mk [T0Space β] {f : α → β} (h : UniformContinuous f) (a : α) :
+ lift' f (mk a) = f a := by rw [lift', dif_pos h]; rfl
+#align uniform_space.separation_quotient.lift_mk SeparationQuotient.lift'_mk
-theorem uniformContinuous_lift [SeparatedSpace β] (f : α → β) : UniformContinuous (lift f) := by
+theorem uniformContinuous_lift' [T0Space β] (f : α → β) : UniformContinuous (lift' f) := by
by_cases hf : UniformContinuous f
- · rw [lift, dif_pos hf]
- exact uniformContinuous_quotient_lift hf
- · rw [lift, dif_neg hf]
+ · rwa [lift', dif_pos hf, uniformContinuous_lift]
+ · rw [lift', dif_neg hf]
exact uniformContinuous_of_const fun a _ => rfl
-#align uniform_space.separation_quotient.uniform_continuous_lift UniformSpace.SeparationQuotient.uniformContinuous_lift
+#align uniform_space.separation_quotient.uniform_continuous_lift SeparationQuotient.uniformContinuous_lift'
/-- The separation quotient functor acting on functions. -/
-def map (f : α → β) : SeparationQuotient α → SeparationQuotient β :=
- lift (Quotient.mk' ∘ f)
-#align uniform_space.separation_quotient.map UniformSpace.SeparationQuotient.map
+def map (f : α → β) : SeparationQuotient α → SeparationQuotient β := lift' (mk ∘ f)
+#align uniform_space.separation_quotient.map SeparationQuotient.map
-theorem map_mk {f : α → β} (h : UniformContinuous f) (a : α) : map f ⟦a⟧ = ⟦f a⟧ := by
- rw [map, lift_mk (uniformContinuous_quotient_mk'.comp h)]; rfl
-#align uniform_space.separation_quotient.map_mk UniformSpace.SeparationQuotient.map_mk
+theorem map_mk {f : α → β} (h : UniformContinuous f) (a : α) : map f (mk a) = mk (f a) := by
+ rw [map, lift'_mk (uniformContinuous_mk.comp h)]; rfl
+#align uniform_space.separation_quotient.map_mk SeparationQuotient.map_mk
theorem uniformContinuous_map (f : α → β) : UniformContinuous (map f) :=
- uniformContinuous_lift (Quotient.mk' ∘ f)
-#align uniform_space.separation_quotient.uniform_continuous_map UniformSpace.SeparationQuotient.uniformContinuous_map
+ uniformContinuous_lift' _
+#align uniform_space.separation_quotient.uniform_continuous_map SeparationQuotient.uniformContinuous_map
theorem map_unique {f : α → β} (hf : UniformContinuous f)
- {g : SeparationQuotient α → SeparationQuotient β}
- (comm : Quotient.mk _ ∘ f = g ∘ Quotient.mk _) : map f = g := by
+ {g : SeparationQuotient α → SeparationQuotient β} (comm : mk ∘ f = g ∘ mk) : map f = g := by
ext ⟨a⟩
calc
map f ⟦a⟧ = ⟦f a⟧ := map_mk hf a
_ = g ⟦a⟧ := congr_fun comm a
-#align uniform_space.separation_quotient.map_unique UniformSpace.SeparationQuotient.map_unique
+#align uniform_space.separation_quotient.map_unique SeparationQuotient.map_unique
-theorem map_id : map (@id α) = id :=
- map_unique uniformContinuous_id rfl
-#align uniform_space.separation_quotient.map_id UniformSpace.SeparationQuotient.map_id
+@[simp]
+theorem map_id : map (@id α) = id := map_unique uniformContinuous_id rfl
+#align uniform_space.separation_quotient.map_id SeparationQuotient.map_id
theorem map_comp {f : α → β} {g : β → γ} (hf : UniformContinuous f) (hg : UniformContinuous g) :
map g ∘ map f = map (g ∘ f) :=
(map_unique (hg.comp hf) <| by simp only [Function.comp, map_mk, hf, hg]).symm
-#align uniform_space.separation_quotient.map_comp UniformSpace.SeparationQuotient.map_comp
+#align uniform_space.separation_quotient.map_comp SeparationQuotient.map_comp
end SeparationQuotient
-theorem separation_prod {a₁ a₂ : α} {b₁ b₂ : β} : (a₁, b₁) ≈ (a₂, b₂) ↔ a₁ ≈ a₂ ∧ b₁ ≈ b₂ := by
- constructor
- · intro h
- exact
- ⟨separated_of_uniformContinuous uniformContinuous_fst h,
- separated_of_uniformContinuous uniformContinuous_snd h⟩
- · rintro ⟨eqv_α, eqv_β⟩ r r_in
- rw [uniformity_prod] at r_in
- rcases r_in with ⟨t_α, ⟨r_α, r_α_in, h_α⟩, t_β, ⟨r_β, r_β_in, h_β⟩, rfl⟩
- let p_α := fun p : (α × β) × α × β => (p.1.1, p.2.1)
- let p_β := fun p : (α × β) × α × β => (p.1.2, p.2.2)
- have key_α : p_α ((a₁, b₁), (a₂, b₂)) ∈ r_α := by simp [eqv_α r_α r_α_in]
- have key_β : p_β ((a₁, b₁), (a₂, b₂)) ∈ r_β := by simp [eqv_β r_β r_β_in]
- exact ⟨h_α key_α, h_β key_β⟩
-#align uniform_space.separation_prod UniformSpace.separation_prod
-
-instance Separated.prod [SeparatedSpace α] [SeparatedSpace β] : SeparatedSpace (α × β) :=
- separated_def.2 fun _ _ H =>
- Prod.ext (eq_of_separated_of_uniformContinuous uniformContinuous_fst H)
- (eq_of_separated_of_uniformContinuous uniformContinuous_snd H)
-#align uniform_space.separated.prod UniformSpace.Separated.prod
-
-end UniformSpace
+#align uniform_space.separation_prod inseparable_prod
+#align uniform_space.separated.prod Prod.instT0Space
@@ -86,7 +86,7 @@ instance (priority := 100) UniformSpace.to_regularSpace : RegularSpace α :=
fun a _V hV ↦ isClosed_ball a hV.2
#align uniform_space.to_regular_space UniformSpace.to_regularSpace
--- Porting note: todo: use `Inseparable`
+-- Porting note (#11215): TODO: use `Inseparable`
/-- The separation relation is the intersection of all entourages.
Two points which are related by the separation relation are "indistinguishable"
according to the uniform structure. -/
Homogenises porting notes via capitalisation and addition of whitespace.
It makes the following changes:
@@ -86,7 +86,7 @@ instance (priority := 100) UniformSpace.to_regularSpace : RegularSpace α :=
fun a _V hV ↦ isClosed_ball a hV.2
#align uniform_space.to_regular_space UniformSpace.to_regularSpace
--- porting note: todo: use `Inseparable`
+-- Porting note: todo: use `Inseparable`
/-- The separation relation is the intersection of all entourages.
Two points which are related by the separation relation are "indistinguishable"
according to the uniform structure. -/
Mathport chose wrong names for these constructors.
@@ -81,11 +81,9 @@ variable [UniformSpace α] [UniformSpace β] [UniformSpace γ]
-/
instance (priority := 100) UniformSpace.to_regularSpace : RegularSpace α :=
- RegularSpace.ofBasis
- (fun a => by
- rw [nhds_eq_comap_uniformity]
- exact uniformity_hasBasis_closed.comap _)
- fun a V hV => by exact hV.2.preimage <| continuous_const.prod_mk continuous_id
+ .of_hasBasis
+ (fun _ ↦ nhds_basis_uniformity' uniformity_hasBasis_closed)
+ fun a _V hV ↦ isClosed_ball a hV.2
#align uniform_space.to_regular_space UniformSpace.to_regularSpace
-- porting note: todo: use `Inseparable`
$
with <|
(#9319)
See Zulip thread for the discussion.
@@ -176,7 +176,7 @@ theorem separationRel_comap {f : α → β}
𝓢 α = Prod.map f f ⁻¹' 𝓢 β := by
subst h
dsimp [separationRel]
- simp_rw [uniformity_comap, ((𝓤 β).comap_hasBasis $ Prod.map f f).ker, ker_def, preimage_iInter]
+ simp_rw [uniformity_comap, ((𝓤 β).comap_hasBasis <| Prod.map f f).ker, ker_def, preimage_iInter]
#align separation_rel_comap separationRel_comap
protected theorem Filter.HasBasis.separationRel {ι : Sort*} {p : ι → Prop} {s : ι → Set (α × α)}
Pairwise
wherever possible (#9236)
Performed with a regex search for ∀ (.) (.), \1 ≠ \2 →
, and a few variants to catch implicit binders and explicit types.
I have deliberately avoided trying to make the analogous Set.Pairwise
transformation (or any Pairwise (foo on bar)
transformations) in this PR, to keep the diff small.
Co-authored-by: Yaël Dillies <yael.dillies@gmail.com>
@@ -137,7 +137,7 @@ theorem separated_def {α : Type u} [UniformSpace α] :
#align separated_def separated_def
theorem separated_def' {α : Type u} [UniformSpace α] :
- SeparatedSpace α ↔ ∀ x y, x ≠ y → ∃ r ∈ 𝓤 α, (x, y) ∉ r :=
+ SeparatedSpace α ↔ Pairwise fun x y => ∃ r ∈ 𝓤 α, (x, y) ∉ r :=
separated_def.trans <| forall₂_congr fun x y => by rw [← not_imp_not]; simp [not_forall]
#align separated_def' separated_def'
Quotient.exists
(#7220)
Also forall_quotient_iff {α : Type*} [r : Setoid α] ...
-> Quotient.forall {α : Sort*} {s : Setoid α} ...
@@ -268,7 +268,7 @@ instance separationSetoid.uniformSpace {α : Type u} [UniformSpace α] :
have : y' ⤳ y := separationRel_iff_specializes.1 (Quotient.exact hy)
exact @hUs (x, z) ⟨y', this.mem_open (UniformSpace.isOpen_ball _ hUo) hxyU, hyzU⟩
isOpen_uniformity s := isOpen_coinduced.trans <| by
- simp only [_root_.isOpen_uniformity, forall_quotient_iff, mem_map', mem_setOf_eq]
+ simp only [_root_.isOpen_uniformity, Quotient.forall, mem_map', mem_setOf_eq]
refine forall₂_congr fun x _ => ⟨fun h => ?_, fun h => mem_of_superset h ?_⟩
· rcases comp_mem_uniformity_sets h with ⟨t, ht, hts⟩
refine mem_of_superset ht fun (y, z) hyz hyx => @hts (x, z) ⟨y, ?_, hyz⟩ rfl
In an Alexandrov-discrete space, every set has a smallest neighborhood. We call this neighborhood the exterior of the set. It is completely analogous to the interior, except that all inclusions are reversed.
@@ -92,7 +92,7 @@ instance (priority := 100) UniformSpace.to_regularSpace : RegularSpace α :=
/-- The separation relation is the intersection of all entourages.
Two points which are related by the separation relation are "indistinguishable"
according to the uniform structure. -/
-def separationRel (α : Type u) [UniformSpace α] := ⋂₀ (𝓤 α).sets
+def separationRel (α : Type u) [UniformSpace α] := (𝓤 α).ker
#align separation_rel separationRel
@[inherit_doc]
@@ -176,15 +176,13 @@ theorem separationRel_comap {f : α → β}
𝓢 α = Prod.map f f ⁻¹' 𝓢 β := by
subst h
dsimp [separationRel]
- simp_rw [uniformity_comap, (Filter.comap_hasBasis (Prod.map f f) (𝓤 β)).sInter_sets, ←
- preimage_iInter, sInter_eq_biInter]
- rfl
+ simp_rw [uniformity_comap, ((𝓤 β).comap_hasBasis $ Prod.map f f).ker, ker_def, preimage_iInter]
#align separation_rel_comap separationRel_comap
protected theorem Filter.HasBasis.separationRel {ι : Sort*} {p : ι → Prop} {s : ι → Set (α × α)}
(h : HasBasis (𝓤 α) p s) : 𝓢 α = ⋂ (i) (_ : p i), s i := by
unfold separationRel
- rw [h.sInter_sets]
+ rw [h.ker]
#align filter.has_basis.separation_rel Filter.HasBasis.separationRel
theorem separationRel_eq_inter_closure : 𝓢 α = ⋂₀ (closure '' (𝓤 α).sets) := by
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -105,7 +105,7 @@ theorem separated_equiv : Equivalence fun x y => (x, y) ∈ 𝓢 α :=
h_ts <| show (x, z) ∈ compRel t t from ⟨y, hxy t ht, hyz t ht⟩⟩
#align separated_equiv separated_equiv
-theorem Filter.HasBasis.mem_separationRel {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
+theorem Filter.HasBasis.mem_separationRel {ι : Sort*} {p : ι → Prop} {s : ι → Set (α × α)}
(h : (𝓤 α).HasBasis p s) {a : α × α} : a ∈ 𝓢 α ↔ ∀ i, p i → a ∈ s i :=
h.forall_mem_mem
#align filter.has_basis.mem_separation_rel Filter.HasBasis.mem_separationRel
@@ -141,18 +141,18 @@ theorem separated_def' {α : Type u} [UniformSpace α] :
separated_def.trans <| forall₂_congr fun x y => by rw [← not_imp_not]; simp [not_forall]
#align separated_def' separated_def'
-theorem eq_of_uniformity {α : Type _} [UniformSpace α] [SeparatedSpace α] {x y : α}
+theorem eq_of_uniformity {α : Type*} [UniformSpace α] [SeparatedSpace α] {x y : α}
(h : ∀ {V}, V ∈ 𝓤 α → (x, y) ∈ V) : x = y :=
separated_def.mp ‹SeparatedSpace α› x y fun _ => h
#align eq_of_uniformity eq_of_uniformity
-theorem eq_of_uniformity_basis {α : Type _} [UniformSpace α] [SeparatedSpace α] {ι : Type _}
+theorem eq_of_uniformity_basis {α : Type*} [UniformSpace α] [SeparatedSpace α] {ι : Type*}
{p : ι → Prop} {s : ι → Set (α × α)} (hs : (𝓤 α).HasBasis p s) {x y : α}
(h : ∀ {i}, p i → (x, y) ∈ s i) : x = y :=
eq_of_uniformity fun V_in => let ⟨_, hi, H⟩ := hs.mem_iff.mp V_in; H (h hi)
#align eq_of_uniformity_basis eq_of_uniformity_basis
-theorem eq_of_forall_symmetric {α : Type _} [UniformSpace α] [SeparatedSpace α] {x y : α}
+theorem eq_of_forall_symmetric {α : Type*} [UniformSpace α] [SeparatedSpace α] {x y : α}
(h : ∀ {V}, V ∈ 𝓤 α → SymmetricRel V → (x, y) ∈ V) : x = y :=
eq_of_uniformity_basis hasBasis_symmetric (by simpa [and_imp])
#align eq_of_forall_symmetric eq_of_forall_symmetric
@@ -163,7 +163,7 @@ theorem eq_of_clusterPt_uniformity [SeparatedSpace α] {x y : α} (h : ClusterPt
isClosed_iff_clusterPt.1 hVc _ <| h.mono <| le_principal_iff.2 hV
#align eq_of_cluster_pt_uniformity eq_of_clusterPt_uniformity
-theorem idRel_sub_separationRel (α : Type _) [UniformSpace α] : idRel ⊆ 𝓢 α := by
+theorem idRel_sub_separationRel (α : Type*) [UniformSpace α] : idRel ⊆ 𝓢 α := by
unfold separationRel
rw [idRel_subset]
intro x
@@ -181,7 +181,7 @@ theorem separationRel_comap {f : α → β}
rfl
#align separation_rel_comap separationRel_comap
-protected theorem Filter.HasBasis.separationRel {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
+protected theorem Filter.HasBasis.separationRel {ι : Sort*} {p : ι → Prop} {s : ι → Set (α × α)}
(h : HasBasis (𝓤 α) p s) : 𝓢 α = ⋂ (i) (_ : p i), s i := by
unfold separationRel
rw [h.sInter_sets]
@@ -348,7 +348,7 @@ theorem eq_of_separated_of_uniformContinuous [SeparatedSpace β] {f : α → β}
#align uniform_space.eq_of_separated_of_uniform_continuous UniformSpace.eq_of_separated_of_uniformContinuous
/-- The maximal separated quotient of a uniform space `α`. -/
-def SeparationQuotient (α : Type _) [UniformSpace α] :=
+def SeparationQuotient (α : Type*) [UniformSpace α] :=
Quotient (separationSetoid α)
#align uniform_space.separation_quotient UniformSpace.SeparationQuotient
@@ -2,16 +2,13 @@
Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Patrick Massot
-
-! This file was ported from Lean 3 source module topology.uniform_space.separation
-! leanprover-community/mathlib commit 0c1f285a9f6e608ae2bdffa3f993eafb01eba829
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Tactic.ApplyFun
import Mathlib.Topology.UniformSpace.Basic
import Mathlib.Topology.Separation
+#align_import topology.uniform_space.separation from "leanprover-community/mathlib"@"0c1f285a9f6e608ae2bdffa3f993eafb01eba829"
+
/-!
# Hausdorff properties of uniform spaces. Separation quotient.
@@ -367,7 +367,7 @@ instance [Inhabited α] : Inhabited (SeparationQuotient α) :=
inferInstanceAs (Inhabited (Quotient (separationSetoid α)))
lemma mk_eq_mk {x y : α} : (⟦x⟧ : SeparationQuotient α) = ⟦y⟧ ↔ Inseparable x y :=
-Quotient.eq'.trans separationRel_iff_inseparable
+ Quotient.eq'.trans separationRel_iff_inseparable
#align uniform_space.separation_quotient.mk_eq_mk UniformSpace.SeparationQuotient.mk_eq_mk
/-- Factoring functions to a separated space through the separation quotient. -/
@@ -185,7 +185,7 @@ theorem separationRel_comap {f : α → β}
#align separation_rel_comap separationRel_comap
protected theorem Filter.HasBasis.separationRel {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
- (h : HasBasis (𝓤 α) p s) : 𝓢 α = ⋂ (i) (_hi : p i), s i := by
+ (h : HasBasis (𝓤 α) p s) : 𝓢 α = ⋂ (i) (_ : p i), s i := by
unfold separationRel
rw [h.sInter_sets]
#align filter.has_basis.separation_rel Filter.HasBasis.separationRel
sSup
/iSup
(#3938)
As discussed on Zulip
supₛ
→ sSup
infₛ
→ sInf
supᵢ
→ iSup
infᵢ
→ iInf
bsupₛ
→ bsSup
binfₛ
→ bsInf
bsupᵢ
→ biSup
binfᵢ
→ biInf
csupₛ
→ csSup
cinfₛ
→ csInf
csupᵢ
→ ciSup
cinfᵢ
→ ciInf
unionₛ
→ sUnion
interₛ
→ sInter
unionᵢ
→ iUnion
interᵢ
→ iInter
bunionₛ
→ bsUnion
binterₛ
→ bsInter
bunionᵢ
→ biUnion
binterᵢ
→ biInter
Co-authored-by: Parcly Taxel <reddeloostw@gmail.com>
@@ -135,7 +135,7 @@ theorem separatedSpace_iff {α : Type u} [UniformSpace α] : SeparatedSpace α
theorem separated_def {α : Type u} [UniformSpace α] :
SeparatedSpace α ↔ ∀ x y, (∀ r ∈ 𝓤 α, (x, y) ∈ r) → x = y := by
- simp only [separatedSpace_iff, Set.ext_iff, Prod.forall, mem_idRel, separationRel, mem_interₛ]
+ simp only [separatedSpace_iff, Set.ext_iff, Prod.forall, mem_idRel, separationRel, mem_sInter]
exact forall₂_congr fun _ _ => ⟨Iff.mp, fun h => ⟨h, fun H U hU => H ▸ refl_mem_uniformity hU⟩⟩
#align separated_def separated_def
@@ -179,15 +179,15 @@ theorem separationRel_comap {f : α → β}
𝓢 α = Prod.map f f ⁻¹' 𝓢 β := by
subst h
dsimp [separationRel]
- simp_rw [uniformity_comap, (Filter.comap_hasBasis (Prod.map f f) (𝓤 β)).interₛ_sets, ←
- preimage_interᵢ, interₛ_eq_binterᵢ]
+ simp_rw [uniformity_comap, (Filter.comap_hasBasis (Prod.map f f) (𝓤 β)).sInter_sets, ←
+ preimage_iInter, sInter_eq_biInter]
rfl
#align separation_rel_comap separationRel_comap
protected theorem Filter.HasBasis.separationRel {ι : Sort _} {p : ι → Prop} {s : ι → Set (α × α)}
(h : HasBasis (𝓤 α) p s) : 𝓢 α = ⋂ (i) (_hi : p i), s i := by
unfold separationRel
- rw [h.interₛ_sets]
+ rw [h.sInter_sets]
#align filter.has_basis.separation_rel Filter.HasBasis.separationRel
theorem separationRel_eq_inter_closure : 𝓢 α = ⋂₀ (closure '' (𝓤 α).sets) := by
@@ -196,7 +196,7 @@ theorem separationRel_eq_inter_closure : 𝓢 α = ⋂₀ (closure '' (𝓤 α).
theorem isClosed_separationRel : IsClosed (𝓢 α) := by
rw [separationRel_eq_inter_closure]
- apply isClosed_interₛ
+ apply isClosed_sInter
rintro _ ⟨t, -, rfl⟩
exact isClosed_closure
#align is_closed_separation_rel isClosed_separationRel
@@ -42,16 +42,16 @@ is equivalent to asking that the uniform structure induced on `s` is separated.
* `SeparatedSpace X`: a predicate class asserting that `X` is separated
* `SeparationQuotient X`: the maximal separated quotient of `X`.
* `SeparationQuotient.lift f`: factors a map `f : X → Y` through the separation quotient of `X`.
-* `separation_quotient.map f`: turns a map `f : X → Y` into a map between the separation quotients
+* `SeparationQuotient.map f`: turns a map `f : X → Y` into a map between the separation quotients
of `X` and `Y`.
## Main results
* `separated_iff_t2`: the equivalence between being separated and being Hausdorff for uniform
spaces.
-* `separation_quotient.uniform_continuous_lift`: factoring a uniformly continuous map through the
+* `SeparationQuotient.uniformContinuous_lift`: factoring a uniformly continuous map through the
separation quotient gives a uniformly continuous map.
-* `separation_quotient.uniform_continuous_map`: maps induced between separation quotients are
+* `SeparationQuotient.uniformContinuous_map`: maps induced between separation quotients are
uniformly continuous.
## Notations
@@ -61,7 +61,7 @@ on a uniform space `X`,
## Implementation notes
-The separation setoid `separation_setoid` is not declared as a global instance.
+The separation setoid `separationSetoid` is not declared as a global instance.
It is made a local instance while building the theory of `SeparationQuotient`.
The factored map `SeparationQuotient.lift f` is defined without imposing any condition on
`f`, but returns junk if `f` is not uniformly continuous (constant junk hence it is always
@@ -265,7 +265,7 @@ instance separationSetoid.uniformSpace {α : Type u} [UniformSpace α] :
uniformity := map (fun p : α × α => (⟦p.1⟧, ⟦p.2⟧)) (𝓤 α)
refl := le_trans (by simp [Quotient.exists_rep]) (Filter.map_mono refl_le_uniformity)
symm := tendsto_map' <| tendsto_map.comp tendsto_swap_uniformity
- comp := fun s hs => by
+ comp s hs := by
rcases comp_open_symm_mem_uniformity_sets hs with ⟨U, hU, hUo, -, hUs⟩
refine' mem_of_superset (mem_lift' <| image_mem_map hU) ?_
simp only [subset_def, Prod.forall, mem_compRel, mem_image, Prod.ext_iff]
Some Mathlib 4 lemmas were backported to Mathlib 3 in leanprover-community/mathlib#18502, sync SHAs
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Patrick Massot
! This file was ported from Lean 3 source module topology.uniform_space.separation
-! leanprover-community/mathlib commit d90e4e186f1d18e375dcd4e5b5f6364b01cb3e46
+! leanprover-community/mathlib commit 0c1f285a9f6e608ae2bdffa3f993eafb01eba829
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -113,14 +113,14 @@ theorem Filter.HasBasis.mem_separationRel {ι : Sort _} {p : ι → Prop} {s :
h.forall_mem_mem
#align filter.has_basis.mem_separation_rel Filter.HasBasis.mem_separationRel
--- porting note: new lemma
theorem separationRel_iff_specializes {a b : α} : (a, b) ∈ 𝓢 α ↔ a ⤳ b := by
simp only [(𝓤 α).basis_sets.mem_separationRel, id, mem_setOf_eq,
(nhds_basis_uniformity (𝓤 α).basis_sets).specializes_iff]
+#align separation_rel_iff_specializes separationRel_iff_specializes
--- porting note: new lemma
theorem separationRel_iff_inseparable {a b : α} : (a, b) ∈ 𝓢 α ↔ Inseparable a b :=
separationRel_iff_specializes.trans specializes_iff_inseparable
+#align separation_rel_iff_inseparable separationRel_iff_inseparable
/-- A uniform space is separated if its separation relation is trivial (each point
is related only to itself). -/
@@ -366,6 +366,10 @@ instance : SeparatedSpace (SeparationQuotient α) :=
instance [Inhabited α] : Inhabited (SeparationQuotient α) :=
inferInstanceAs (Inhabited (Quotient (separationSetoid α)))
+lemma mk_eq_mk {x y : α} : (⟦x⟧ : SeparationQuotient α) = ⟦y⟧ ↔ Inseparable x y :=
+Quotient.eq'.trans separationRel_iff_inseparable
+#align uniform_space.separation_quotient.mk_eq_mk UniformSpace.SeparationQuotient.mk_eq_mk
+
/-- Factoring functions to a separated space through the separation quotient. -/
def lift [SeparatedSpace β] (f : α → β) : SeparationQuotient α → β :=
if h : UniformContinuous f then Quotient.lift f fun _ _ => eq_of_separated_of_uniformContinuous h
The unported dependencies are