Zulip Chat Archive
Stream: Is there code for X?
Topic: isUniformInducing_extension
Yakov Pechersky (Jul 31 2025 at 17:37):
Is it the case that the docs#UniformSpace.Completion.extension is uniform inducing if it is an extension of a uniform inducing (and dense inducing) function?
In proving that (WithVal v).Completion ≃ᵤ ℚ_[p] for v : Valuation ℚ ℤᵐ⁰, I have an existing (WithVal v).Completion ≃+* ℚ_[p] (#27696). A shortcut to proving this is docs#Equiv.toUniformEquivOfIsUniformInducing. To use it, I'd need to show that my ring equiv is uniform inducing.
The ring equiv is defined via Completion.extensionHom f hf where f : WithVal v →+* ℚ_[p]. I know that IsUniformInducing f and IsDenseInducing f. Having the IsUniformInducing (Completion.extension f hf) would golf the UniformEquiv construction.
Here's the underlying topology question
import Mathlib
variable {X Y : Type*} [UniformSpace X] [UniformSpace Y] [CompleteSpace Y] {f : X → Y}
open UniformSpace
lemma foo (h : IsUniformInducing f) (h' : IsDenseInducing f) :
IsUniformInducing (Completion.extension f) := by
sorry
Aaron Liu (Jul 31 2025 at 18:03):
I think you need [T0Space Y]
Aaron Liu (Jul 31 2025 at 18:03):
(this is equivalent to [T1Space Y], [T2Space Y], [T3Space Y], and [T35Space Y])
Aaron Liu (Jul 31 2025 at 18:04):
actually maybe you don't need it
Yakov Pechersky (Jul 31 2025 at 18:09):
T0Space gives access to induction over Completion X and using Completion.extension_coe h.uniformContinuous, yes.
Aaron Liu (Jul 31 2025 at 18:37):
I have a proof of this now
Aaron Liu (Jul 31 2025 at 18:38):
the signature is
theorem foo.{u_1, u_2} : ∀ {X : Type u_1} {Y : Type u_2} [inst : UniformSpace.{u_1} X] [inst_1 : UniformSpace.{u_2} Y]
[@CompleteSpace.{u_2} Y inst_1] {f : X → Y},
@IsUniformInducing.{u_1, u_2} X Y inst inst_1 f →
@IsDenseInducing.{u_1, u_2} X Y (@UniformSpace.toTopologicalSpace.{u_1} X inst)
(@UniformSpace.toTopologicalSpace.{u_2} Y inst_1) f →
@IsUniformInducing.{u_1, u_2} (@UniformSpace.Completion.{u_1} X inst) Y
(@UniformSpace.Completion.uniformSpace.{u_1} X inst) inst_1
(@UniformSpace.Completion.extension.{u_1, u_2} X inst Y inst_1 f)
Aaron Liu (Jul 31 2025 at 18:41):
unfortunately for the proof to work you'll have to checkout
commit c1d42b9167691c46d300e83a369aaa4d78ddfb06
Aaron Liu (Jul 31 2025 at 18:42):
import Mathlib.Topology.UniformSpace.Completion
open Filter
theorem IsDenseInducing.tendsto_extend {α β γ : Type*} [TopologicalSpace α] [TopologicalSpace β]
{i : α → β} [TopologicalSpace γ] (di : IsDenseInducing i) {f : α → γ}
(a : α) (hf : ContinuousAt f a) : Tendsto f (nhds a) (nhds (di.extend f (i a))) := by
rw [IsDenseInducing.extend, ← di.nhds_eq_comap]
exact @Classical.epsilon_spec γ (fun x => map f (nhds a) ≤ nhds x) ⟨f a, hf.tendsto⟩
theorem UniformSpace.Completion.inseparable_extension_coe {X Y : Type*}
[UniformSpace X] [UniformSpace Y] {f : X → Y} (hf : UniformContinuous f) (x : X) :
Inseparable (Completion.extension f x) (f x) := by
rw [Completion.extension, AbstractCompletion.extend_def _ hf]
refine tendsto_nhds_unique_inseparable ?_ (hf.continuous.tendsto x)
apply @IsDenseInducing.tendsto_extend _ _ _ _ cPkg.uniformStruct.toTopologicalSpace
exact hf.continuous.continuousAt
variable {X Y : Type*} [UniformSpace X] [UniformSpace Y] [CompleteSpace Y] {f : X → Y}
open UniformSpace
lemma foo (h : IsUniformInducing f) (h' : IsDenseInducing f) :
IsUniformInducing (Completion.extension f) := by
let k : AbstractCompletion X := {
space := SeparationQuotient Y
coe := SeparationQuotient.mk ∘ f
uniformStruct := inferInstance
complete := inferInstance
dense := SeparationQuotient.surjective_mk.denseRange.comp
h'.dense SeparationQuotient.continuous_mk
separation := inferInstance
isUniformInducing := SeparationQuotient.isUniformInducing_mk.comp h
}
let l : AbstractCompletion X := { UniformSpace.Completion.cPkg with space := Completion X}
let equiv := k.compareEquiv l
apply SeparationQuotient.isUniformInducing_mk.isUniformInducing_comp_iff.1
apply equiv.isUniformInducing.isUniformInducing_comp_iff.1
have he : SeparationQuotient.mk ∘ Completion.extension f = equiv.symm :=
(Completion.extension_unique
(SeparationQuotient.isUniformInducing_mk.uniformContinuous.comp h.uniformContinuous)
(SeparationQuotient.isUniformInducing_mk.uniformContinuous.comp
Completion.uniformContinuous_extension)
(fun x => SeparationQuotient.mk_eq_mk.2 <|
(Completion.inseparable_extension_coe h.uniformContinuous x).symm)).symm
rw [he, equiv.self_comp_symm]
exact IsUniformInducing.id
Aaron Liu (Jul 31 2025 at 18:43):
If you don't want to checkout
commit c1d42b9167691c46d300e83a369aaa4d78ddfb06
then you can modify it to be universe monomorphic and everything still works hopefully
Yakov Pechersky (Jul 31 2025 at 22:10):
Thanks! Generalized, and avoids the universe issues: #27790.
Aaron Liu (Jul 31 2025 at 22:39):
Yakov Pechersky said:
Thanks! Generalized, and avoids the universe issues: #27790.
It's actually not generalized since you added [T2Space β]
Aaron Liu (Jul 31 2025 at 22:41):
or maybe it is I can't really tell
Aaron Liu (Jul 31 2025 at 22:42):
oh it does turn out to be more general but you can also remove the [T2Space β] assumption to get a doubly-generalized theorem
Aaron Liu (Jul 31 2025 at 22:43):
for some reason people just really like to be evil
Yakov Pechersky (Jul 31 2025 at 22:59):
Will you please contribute how the T2Space removal works?
Aaron Liu (Jul 31 2025 at 23:05):
First observe that in a uniform space T2Space is equivalent to T0Space. Then observe that the statement is not evil. Conclude that T0Space as an assumption is not necessary.
Aaron Liu (Aug 01 2025 at 00:52):
Yakov Pechersky said:
Will you please contribute how the T2Space removal works?
I put a comment on the PR
Aaron Liu (Aug 01 2025 at 15:23):
I was able to remove (h' : DenseRange f)
theorem continuous_rangeFactoriztion_iff {α β : Type*} [TopologicalSpace α] [TopologicalSpace β]
{f : α → β} : Continuous (Set.rangeFactorization f) ↔ Continuous f :=
Topology.IsInducing.subtypeVal.continuous_iff
theorem Continuous.rangeFactoriztion {α β : Type*} [UniformSpace α] [UniformSpace β]
{f : α → β} (hf : Continuous f) : Continuous (Set.rangeFactorization f) :=
continuous_rangeFactoriztion_iff.2 hf
theorem isUniformInducing_rangeFactoriztion_iff {α β : Type*} [UniformSpace α] [UniformSpace β]
{f : α → β} : IsUniformInducing (Set.rangeFactorization f) ↔ IsUniformInducing f :=
(isUniformInducing_val (range f)).isUniformInducing_comp_iff.symm
theorem IsUniformInducing.rangeFactoriztion {α β : Type*} [UniformSpace α] [UniformSpace β]
{f : α → β} (hf : IsUniformInducing f) :
IsUniformInducing (Set.rangeFactorization f) :=
isUniformInducing_rangeFactoriztion_iff.2 hf
theorem isUniformInducing_inclusion {α : Type*} [UniformSpace α] {s t : Set α} (hst : s ⊆ t) :
IsUniformInducing (Set.inclusion hst) :=
(isUniformInducing_val t).isUniformInducing_comp_iff.1 (isUniformInducing_val s)
theorem isUniformEmbedding_inclusion {α : Type*} [UniformSpace α] {s t : Set α} (hst : s ⊆ t) :
IsUniformEmbedding (Set.inclusion hst) :=
⟨isUniformInducing_inclusion hst, Set.inclusion_injective hst⟩
theorem denseRange_inclusion_iff {α : Type*} [TopologicalSpace α] {s t : Set α} (hst : s ⊆ t) :
DenseRange (Set.inclusion hst) ↔ t ⊆ closure s := by
rw [DenseRange, Subtype.dense_iff, ← Set.range_comp, Set.val_comp_inclusion, Subtype.range_coe]
lemma IsDenseInducing.isUniformInducing_extend {α β γ : Type*}
[UniformSpace α] [UniformSpace β] [UniformSpace γ]
[CompleteSpace β] [CompleteSpace γ] {i : α → β} {f : α → γ}
(hid : IsDenseInducing i) (hi : IsUniformInducing i) (h : IsUniformInducing f) :
IsUniformInducing (hid.extend f) := by
have : CompleteSpace (closure (range (SeparationQuotient.mk ∘ f))) :=
isClosed_closure.isComplete.completeSpace_coe
let ff : α → closure (range (SeparationQuotient.mk ∘ f)) :=
Set.inclusion subset_closure ∘ Set.rangeFactorization (SeparationQuotient.mk ∘ f)
have hgu : IsUniformInducing ff :=
(isUniformInducing_inclusion subset_closure).comp
(SeparationQuotient.isUniformInducing_mk.comp h).rangeFactoriztion
have hgd : DenseRange ff :=
((denseRange_inclusion_iff subset_closure).2 subset_rfl).comp
Set.surjective_onto_range.denseRange (continuous_inclusion subset_closure)
have hg : IsDenseInducing ff := hgu.isDenseInducing hgd
let fwd := hid.extend ff
have hfwd : UniformContinuous fwd :=
(uniformContinuous_uniformly_extend hi hid.dense hgu.uniformContinuous)
have hg' : UniformContinuous (hg.extend i) :=
uniformContinuous_uniformly_extend hgu hgd hi.uniformContinuous
have key : SeparationQuotient.mk ∘ hg.extend i ∘ fwd = SeparationQuotient.mk := by
ext x
induction x using isClosed_property hid.dense
· exact isClosed_eq (SeparationQuotient.continuous_mk.comp (hg'.comp hfwd).continuous)
SeparationQuotient.continuous_mk
· simpa [fwd, hid.extend_eq hgu.uniformContinuous.continuous]
using hg.inseparable_extend hi.uniformContinuous.continuous.continuousAt
have hfu : IsUniformInducing fwd := by
refine IsUniformInducing.of_comp hfwd (SeparationQuotient.uniformContinuous_mk.comp hg') ?_
rw [Function.comp_assoc, key]
exact SeparationQuotient.isUniformInducing_mk
have hrr : range (SeparationQuotient.mk ∘ hid.extend f) ⊆
closure (range (SeparationQuotient.mk ∘ f)) := by
convert (SeparationQuotient.continuous_mk.comp (uniformContinuous_uniformly_extend hi hid.dense
h.uniformContinuous).continuous).range_subset_closure_image_dense hid.dense
rw [← Set.range_comp]
apply congrArg range
funext x
simpa using (hid.inseparable_extend h.uniformContinuous.continuous.continuousAt).symm
suffices Subtype.val ∘ fwd = SeparationQuotient.mk ∘ hid.extend f by
rw [← SeparationQuotient.isUniformInducing_mk.isUniformInducing_comp_iff, ← this]
exact (isUniformInducing_val (closure (range (SeparationQuotient.mk ∘ f)))).comp hfu
change Subtype.val ∘ fwd =
Subtype.val ∘ Set.inclusion hrr ∘ Set.rangeFactorization (SeparationQuotient.mk ∘ hid.extend f)
apply congrArg (Function.comp Subtype.val)
refine hid.extend_unique ?_ ?_
· simp [ff, hid.inseparable_extend h.uniformContinuous.continuous.continuousAt]
· exact (continuous_inclusion hrr).comp
(SeparationQuotient.continuous_mk.comp (uniformContinuous_uniformly_extend hi hid.dense
h.uniformContinuous).continuous).rangeFactoriztion
Yakov Pechersky (Aug 01 2025 at 16:02):
Makes sense! Would you like to commit it or should I?
Aaron Liu (Aug 01 2025 at 16:04):
you commit it since I don't have push access to your branch (the downside of PRs from forks)
Last updated: Dec 20 2025 at 21:32 UTC