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

Commit 7358605

Browse files
PatrickMassotjohoelzl
authored andcommitted
feat(analysis/topology/completion): comm_ring on separation quotient, completion (separation_quotient A) is equivalent to completion A
1 parent 13be74f commit 7358605

File tree

6 files changed

+151
-70
lines changed

6 files changed

+151
-70
lines changed

analysis/topology/completion.lean

Lines changed: 122 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -44,39 +44,18 @@ From a slightly different perspective in order to reuse material in analysis.top
4444
import data.set.basic data.set.function
4545
import algebra.pi_instances
4646
import analysis.topology.uniform_space analysis.topology.topological_structures
47+
import ring_theory.ideals
4748

4849
noncomputable theory
4950
local attribute [instance] classical.prop_decidable
5051
open filter set
5152
universes u v w x
5253

53-
namespace filter
54-
variables {α : Type u} {β : Type v} {γ : Type w}
55-
56-
@[simp] lemma prod_pure_pure {a : α} {b : β} :
57-
filter.prod (pure a) (pure b) = pure (a, b) :=
58-
by simp
59-
60-
end filter
61-
6254
/- separation space -/
6355
namespace uniform_space
6456
variables {α : Type u} {β : Type v} {γ : Type w}
6557
variables [uniform_space α] [uniform_space β] [uniform_space γ]
6658

67-
lemma uniform_continuous_of_const {c : α → β} (h : ∀a b, c a = c b) : uniform_continuous c :=
68-
have (λ (x : α × α), (c (x.fst), c (x.snd))) ⁻¹' id_rel = univ, from
69-
eq_univ_iff_forall.2 $ assume ⟨a, b⟩, h a b,
70-
le_trans (map_le_iff_le_comap.2 $ by simp [comap_principal, this, univ_mem_sets]) refl_le_uniformity
71-
72-
lemma cauchy_prod {f : filter α} {g : filter β} : cauchy f → cauchy g → cauchy (filter.prod f g)
73-
| ⟨f_proper, hf⟩ ⟨g_proper, hg⟩ := ⟨filter.prod_neq_bot.2 ⟨f_proper, g_proper⟩,
74-
let p_α := λp:(α×β)×(α×β), (p.1.1, p.2.1), p_β := λp:(α×β)×(α×β), (p.1.2, p.2.2) in
75-
suffices (f.prod f).comap p_α ⊓ (g.prod g).comap p_β ≤ uniformity.comap p_α ⊓ uniformity.comap p_β,
76-
by simpa [uniformity_prod, filter.prod, filter.comap_inf, filter.comap_comap_comp, (∘),
77-
lattice.inf_assoc, lattice.inf_comm, lattice.inf_left_comm],
78-
lattice.inf_le_inf (filter.comap_mono hf) (filter.comap_mono hg)⟩
79-
8059
def separation_setoid (α : Type u) [uniform_space α] : setoid α :=
8160
⟨λx y, (x, y) ∈ separation_rel α, separated_equiv⟩
8261

@@ -170,7 +149,7 @@ lemma comap_quotient_eq_uniformity :
170149
uniformity.comap (λ (p : α × α), (⟦p.fst⟧, ⟦p.snd⟧)) = uniformity :=
171150
le_antisymm comap_quotient_le_uniformity le_comap_map
172151

173-
lemma complete_space_separation [h : complete_space α] :
152+
instance complete_space_separation [h : complete_space α] :
174153
complete_space (quotient (separation_setoid α)) :=
175154
⟨assume f, assume hf : cauchy f,
176155
have cauchy (f.comap (λx, ⟦x⟧)), from
@@ -181,7 +160,7 @@ lemma complete_space_separation [h : complete_space α] :
181160
... ≤ map (λx, ⟦x⟧) (nhds x) : map_mono hx
182161
... ≤ _ : continuous_iff_tendsto.mp uniform_continuous_quotient_mk.continuous _⟩⟩
183162

184-
lemma separated_separation [h : complete_space α] : separated (quotient (separation_setoid α)) :=
163+
instance separated_separation : separated (quotient (separation_setoid α)) :=
185164
set.ext $ assume ⟨a, b⟩, quotient.induction_on₂ a b $ assume a b,
186165
⟨assume h,
187166
have a ≈ b, from assume s hs,
@@ -202,6 +181,53 @@ lemma eq_of_separated_of_uniform_continuous [separated β] {f : α → β} {x y
202181
(H : uniform_continuous f) (h : x ≈ y) : f x = f y :=
203182
separated_def.1 (by apply_instance) _ _ $ separated_of_uniform_continuous H h
204183

184+
def separation_quotient (α : Type*) [uniform_space α] := quotient (separation_setoid α)
185+
186+
namespace separation_quotient
187+
instance : uniform_space (separation_quotient α) := by dunfold separation_quotient ; apply_instance
188+
instance : separated (separation_quotient α) := by dunfold separation_quotient ; apply_instance
189+
190+
def lift [separated β] (f : α → β) : (separation_quotient α → β) :=
191+
if h : uniform_continuous f then
192+
quotient.lift f (λ x y, eq_of_separated_of_uniform_continuous h)
193+
else
194+
λ x, f (classical.inhabited_of_nonempty $ (nonempty_quotient_iff $ separation_setoid α).1 ⟨x⟩).default
195+
196+
lemma lift_mk [separated β] {f : α → β} (h : uniform_continuous f) (a : α) : lift f ⟦a⟧ = f a :=
197+
by rw [lift, dif_pos h]; refl
198+
199+
lemma uniform_continuous_lift [separated β] (f : α → β) : uniform_continuous (lift f) :=
200+
begin
201+
by_cases hf : uniform_continuous f,
202+
{ rw [lift, dif_pos hf], exact uniform_continuous_quotient_lift hf },
203+
{ rw [lift, dif_neg hf], exact uniform_continuous_of_const (assume a b, rfl) }
204+
end
205+
206+
def map (f : α → β) : separation_quotient α → separation_quotient β :=
207+
lift (quotient.mk ∘ f)
208+
209+
lemma map_mk {f : α → β} (h : uniform_continuous f) (a : α) : map f ⟦a⟧ = ⟦f a⟧ :=
210+
by rw [map, lift_mk (h.comp uniform_continuous_quotient_mk)]
211+
212+
lemma uniform_continuous_map (f : α → β): uniform_continuous (map f) :=
213+
uniform_continuous_lift (quotient.mk ∘ f)
214+
215+
lemma map_unique {f : α → β} (hf : uniform_continuous f)
216+
{g : separation_quotient α → separation_quotient β}
217+
(comm : quotient.mk ∘ f = g ∘ quotient.mk) : map f = g :=
218+
by ext ⟨a⟩;
219+
calc map f ⟦a⟧ = ⟦f a⟧ : map_mk hf a
220+
... = g ⟦a⟧ : congr_fun comm a
221+
222+
lemma map_id : map (@id α) = id :=
223+
map_unique uniform_continuous_id rfl
224+
225+
lemma map_comp {f : α → β} {g : β → γ} (hf : uniform_continuous f) (hg : uniform_continuous g) :
226+
map g ∘ map f = map (g ∘ f) :=
227+
(map_unique (hf.comp hg) $ by simp only [(∘), map_mk, hf, hg]).symm
228+
229+
end separation_quotient
230+
205231
lemma separation_prod {a₁ a₂ : α} {b₁ b₂ : β} : (a₁, b₁) ≈ (a₂, b₂) ↔ a₁ ≈ a₂ ∧ b₁ ≈ b₂ :=
206232
begin
207233
split,
@@ -224,6 +250,15 @@ separated_def.2 $ assume x y H, prod.ext
224250
(eq_of_separated_of_uniform_continuous uniform_continuous_fst H)
225251
(eq_of_separated_of_uniform_continuous uniform_continuous_snd H)
226252

253+
instance [comm_ring α] [uniform_space α] [uniform_add_group α] [topological_ring α] :
254+
comm_ring (quotient (separation_setoid α)) :=
255+
begin
256+
dsimp [separation_setoid],
257+
conv in (quotient _) {congr, congr, funext, rw group_separation_rel x y },
258+
change comm_ring (quotient_ring.quotient $ closure (is_ideal.trivial α)),
259+
apply_instance
260+
end
261+
227262
end uniform_space
228263

229264
/-- Space of Cauchy filters
@@ -423,7 +458,7 @@ begin
423458
{ rw [extend, if_pos hf],
424459
exact uniform_continuous_uniformly_extend uniform_embedding_pure_cauchy pure_cauchy_dense hf },
425460
{ rw [extend, if_neg hf],
426-
exact uniform_space.uniform_continuous_of_const (assume a b, by congr) }
461+
exact uniform_continuous_of_const (assume a b, by congr) }
427462
end
428463

429464
end extend
@@ -514,9 +549,9 @@ namespace completion
514549
@[priority 50]
515550
instance : uniform_space (completion α) := by dunfold completion ; apply_instance
516551

517-
instance : complete_space (completion α) := complete_space_separation
552+
instance : complete_space (completion α) := by dunfold completion ; apply_instance
518553

519-
instance : separated (completion α) := separated_separation
554+
instance : separated (completion α) := by dunfold completion ; apply_instance
520555

521556
instance : t2_space (completion α) := separated_t2
522557

@@ -612,6 +647,10 @@ have ∀x:(completion α × completion β) × (completion γ × completion δ),
612647
is_closed_property dense₄ hp (assume p:(α×β)×(γ×δ), ih p.1.1 p.1.2 p.2.1 p.2.2),
613648
this ((a, b), (c, d))
614649

650+
lemma ext [t2_space β] {f g : completion α → β} (hf : continuous f) (hg : continuous g)
651+
(h : ∀a:α, f a = g a) : f = g :=
652+
funext $ assume a, completion.induction_on a (is_closed_eq hf hg) h
653+
615654
section extension
616655
variables {f : α → β}
617656
variables [complete_space β] [separated β]
@@ -637,7 +676,7 @@ section map
637676
variables {f : α → β}
638677

639678
/-- Completion functor acting on morphisms -/
640-
protected def map (f : α → γ) : completion α → completion γ :=
679+
protected def map (f : α → β) : completion α → completion β :=
641680
completion.extension (coe ∘ f)
642681

643682
lemma uniform_continuous_map : uniform_continuous (completion.map f) :=
@@ -647,13 +686,66 @@ lemma continuous_map : continuous (completion.map f) :=
647686
uniform_continuous_extension.continuous
648687

649688
@[simp] lemma map_coe (hf : uniform_continuous f) (a : α) : (completion.map f) a = f a :=
689+
by rw [completion.map, extension_coe]; from hf.comp (uniform_continuous_coe β)
690+
691+
lemma map_unique {f : α → β} {g : completion α → completion β}
692+
(hg : uniform_continuous g) (h : ∀a:α, ↑(f a) = g a) : completion.map f = g :=
693+
completion.ext continuous_map hg.continuous $
650694
begin
651-
rw [completion.map, extension_coe],
652-
exact hf.comp (uniform_continuous_coe β)
695+
intro a,
696+
simp only [completion.map, (∘), h],
697+
rw [extension_coe ((uniform_continuous_coe α).comp hg)]
653698
end
654699

700+
lemma map_id : completion.map (@id α) = id :=
701+
map_unique uniform_continuous_id (assume a, rfl)
702+
703+
lemma extension_map [complete_space γ] [separated γ] {f : β → γ} {g : α → β}
704+
(hf : uniform_continuous f) (hg : uniform_continuous g) :
705+
completion.extension f ∘ completion.map g = completion.extension (f ∘ g) :=
706+
completion.ext (continuous_map.comp continuous_extension) continuous_extension $
707+
by intro a; simp only [hg, hf, hg.comp hf, (∘), map_coe, extension_coe]
708+
709+
lemma map_comp {f : α → β} {g : β → γ} (hf : uniform_continuous f) (hg : uniform_continuous g) :
710+
completion.map g ∘ completion.map f = completion.map (g ∘ f) :=
711+
extension_map (hg.comp (uniform_continuous_coe _)) hf
712+
655713
end map
656714

715+
/- In this section we construct isomorphisms between the completion of a uniform space and the
716+
completion of its separation quotient -/
717+
section separation_quotient_completion
718+
719+
def completion_separation_quotient_equiv (α : Type u) [uniform_space α] :
720+
completion (separation_quotient α) ≃ completion α :=
721+
begin
722+
refine ⟨completion.extension (separation_quotient.lift (coe : α → completion α)),
723+
completion.map quotient.mk, _, _⟩,
724+
{ assume a,
725+
refine completion.induction_on a (is_closed_eq (continuous_extension.comp continuous_map) continuous_id) _,
726+
rintros ⟨a⟩,
727+
show completion.map quotient.mk (completion.extension (separation_quotient.lift coe) ↑⟦a⟧) = ↑⟦a⟧,
728+
rw [extension_coe (separation_quotient.uniform_continuous_lift _),
729+
separation_quotient.lift_mk (uniform_continuous_coe α),
730+
completion.map_coe uniform_continuous_quotient_mk] },
731+
{ assume a,
732+
refine completion.induction_on a (is_closed_eq (continuous_map.comp continuous_extension) continuous_id) _,
733+
assume a,
734+
rw [map_coe uniform_continuous_quotient_mk,
735+
extension_coe (separation_quotient.uniform_continuous_lift _),
736+
separation_quotient.lift_mk (uniform_continuous_coe α) _] }
737+
end
738+
739+
lemma uniform_continuous_completion_separation_quotient_equiv :
740+
uniform_continuous ⇑(completion_separation_quotient_equiv α) :=
741+
uniform_continuous_extension
742+
743+
lemma uniform_continuous_completion_separation_quotient_equiv_symm :
744+
uniform_continuous ⇑(completion_separation_quotient_equiv α).symm :=
745+
uniform_continuous_map
746+
747+
end separation_quotient_completion
748+
657749
section prod
658750
variables [uniform_space β]
659751
protected def prod {α β} [uniform_space α] [uniform_space β] (p : completion α × completion β) : completion (α × β) :=

analysis/topology/continuity.lean

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ have ∀ (a : α), nhds a ⊓ principal s ≠ ⊥ → nhds (f a) ⊓ principal (
104104
neq_bot_of_le_neq_bot h₁ h₂,
105105
by simp [image_subset_iff, closure_eq_nhds]; assumption
106106

107+
lemma mem_closure [topological_space α] [topological_space β]
108+
{s : set α} {t : set β} {f : α → β} {a : α}
109+
(hf : continuous f) (ha : a ∈ closure s) (ht : ∀a∈s, f a ∈ t) : f a ∈ closure t :=
110+
subset.trans (image_closure_subset_closure_image hf) (closure_mono $ image_subset_iff.2 ht) $
111+
(mem_image_of_mem f ha)
112+
107113
lemma compact_image {s : set α} {f : α → β} (hs : compact s) (hf : continuous f) : compact (f '' s) :=
108114
compact_of_finite_subcover $ assume c hco hcs,
109115
have hdo : ∀t∈c, is_open (f ⁻¹' t), from assume t' ht, hf _ $ hco _ ht,
@@ -507,6 +513,15 @@ have filter.prod (nhds a) (nhds b) ⊓ principal (set.prod s t) =
507513
by rw [←prod_inf_prod, prod_principal_principal],
508514
by simp [closure_eq_nhds, nhds_prod_eq, this]; exact prod_neq_bot
509515

516+
lemma mem_closure2 [topological_space α] [topological_space β] [topological_space γ]
517+
{s : set α} {t : set β} {u : set γ} {f : α → β → γ} {a : α} {b : β}
518+
(hf : continuous (λp:α×β, f p.1 p.2)) (ha : a ∈ closure s) (hb : b ∈ closure t)
519+
(hu : ∀a b, a ∈ s → b ∈ t → f a b ∈ u) :
520+
f a b ∈ closure u :=
521+
have (a, b) ∈ closure (set.prod s t), by rw [closure_prod_eq]; from ⟨ha, hb⟩,
522+
show (λp:α×β, f p.1 p.2) (a, b) ∈ closure u, from
523+
mem_closure hf this $ assume ⟨a, b⟩ ⟨ha, hb⟩, hu a b ha hb
524+
510525
lemma is_closed_prod [topological_space α] [topological_space β] {s₁ : set α} {s₂ : set β}
511526
(h₁ : is_closed s₁) (h₂ : is_closed s₂) : is_closed (set.prod s₁ s₂) :=
512527
closure_eq_iff_is_closed.mp $ by simp [h₁, h₂, closure_prod_eq, closure_eq_of_is_closed]

analysis/topology/topological_structures.lean

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -385,45 +385,16 @@ end topological_ring
385385

386386
section topological_comm_ring
387387
universe u'
388-
variables (α) [topological_space α] [comm_ring α] [t : topological_ring α]
388+
variables (α) [topological_space α] [comm_ring α] [topological_ring α]
389389

390+
instance ideal_closure (S : set α) [is_ideal S] : is_ideal (closure S) :=
391+
{ zero_ := subset_closure (is_ideal.zero S),
392+
add_ := assume x y hx hy,
393+
mem_closure2 continuous_add' hx hy $ assume a b, is_ideal.add,
394+
smul := assume c x hx,
395+
have continuous (λx:α, c * x) := continuous_mul continuous_const continuous_id,
396+
mem_closure this hx $ assume a, is_ideal.mul_left }
390397

391-
class is_ideal' {α : Type u} [comm_ring α] (s : set α) : Prop :=
392-
(zero : (0:α) ∈ s)
393-
(add : (λ p : α × α, p.1 + p.2) '' set.prod s s ⊆ s)
394-
(mul : ∀ b, (λ s, b*s) '' s ⊆ s)
395-
396-
lemma is_ideal_iff {β : Type*} [comm_ring β] (S : set β) :
397-
is_ideal S ↔ is_ideal' S :=
398-
begin
399-
split ; intro h ; haveI := h,
400-
{ split,
401-
{ exact is_ideal.zero S },
402-
{ rintros a ⟨⟨x, y⟩, ⟨x_in, y_in⟩, sum⟩,
403-
rw ←sum,
404-
exact is_ideal.add x_in y_in },
405-
{ rintros b s ⟨a, ⟨a_in, prod⟩⟩,
406-
rw ←prod,
407-
exact is_ideal.mul_left a_in } },
408-
{ exact { zero_ := h.zero,
409-
add_ := λ x y x_in y_in, have xy : x + y ∈ (λ (p : β × β), p.fst + p.snd) '' set.prod S S :=
410-
mem_image_of_mem (λ p : β × β, p.1 + p.2) (mk_mem_prod x_in y_in),
411-
is_ideal'.add S xy,
412-
smul := λ b, by rw ←image_subset_iff' ; exact is_ideal'.mul S b }}
413-
end
414-
415-
instance ideal_closure [topological_ring α] (S : set α) [is_ideal S] : is_ideal (closure S) :=
416-
begin
417-
rcases (is_ideal_iff S).1 (by apply_instance) with ⟨zero, add, mul⟩,
418-
rw is_ideal_iff,
419-
split,
420-
{ exact subset_closure zero },
421-
{ rw ←closure_prod_eq,
422-
exact subset.trans (image_closure_subset_closure_image continuous_add') (closure_mono add) },
423-
{ intro b,
424-
have : continuous (λ s, b*s) := continuous_mul continuous_const continuous_id,
425-
exact subset.trans (image_closure_subset_closure_image this) (closure_mono (mul b)) },
426-
end
427398
end topological_comm_ring
428399

429400
/-- (Partially) ordered topology

data/quot.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ theorem quotient.choice_eq {ι : Type*} {α : ι → Type*} [∀ i, setoid (α i
8383
(f : ∀ i, α i) : quotient.choice (λ i, ⟦f i⟧) = ⟦f⟧ :=
8484
quotient.sound $ λ i, quotient.mk_out _
8585

86+
lemma nonempty_quotient_iff (s : setoid α): nonempty (quotient s) ↔ nonempty α :=
87+
⟨assume ⟨a⟩, quotient.induction_on a nonempty.intro, assume ⟨a⟩, ⟨⟦a⟧⟩⟩
88+
8689
/-- `trunc α` is the quotient of `α` by the always-true relation. This
8790
is related to the propositional truncation in HoTT, and is similar
8891
in effect to `nonempty α`, but unlike `nonempty α`, `trunc α` is data,

data/set/basic.lean

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -882,9 +882,6 @@ theorem image_subset_iff {s : set α} {t : set β} {f : α → β} :
882882
f '' s ⊆ t ↔ s ⊆ f ⁻¹' t :=
883883
ball_image_iff
884884

885-
lemma image_subset_iff' {α : Type*} {β : Type*} (f : α → β) (s : set α) (t : set β) :
886-
f '' s ⊆ t ↔ ∀ a, a ∈ s → f a ∈ t := image_subset_iff
887-
888885
theorem image_preimage_subset (f : α → β) (s : set β) :
889886
f '' (f ⁻¹' s) ⊆ s :=
890887
image_subset_iff.2 (subset.refl _)

order/filter.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1596,6 +1596,9 @@ by simp only [filter.prod, comap_inf, inf_comm, inf_assoc, lattice.inf_left_comm
15961596
filter.prod (principal s) (principal t) = principal (set.prod s t) :=
15971597
by simp only [filter.prod, comap_principal, principal_eq_iff_eq, comap_principal, inf_principal]; refl
15981598

1599+
@[simp] lemma prod_pure_pure {a : α} {b : β} : filter.prod (pure a) (pure b) = pure (a, b) :=
1600+
by simp
1601+
15991602
lemma prod_def {f : filter α} {g : filter β} : f.prod g = (f.lift $ λs, g.lift' $ set.prod s) :=
16001603
have ∀(s:set α) (t : set β),
16011604
principal (set.prod s t) = (principal s).comap prod.fst ⊓ (principal t).comap prod.snd,

0 commit comments

Comments
 (0)