@@ -44,39 +44,18 @@ From a slightly different perspective in order to reuse material in analysis.top
44
44
import data.set.basic data.set.function
45
45
import algebra.pi_instances
46
46
import analysis.topology.uniform_space analysis.topology.topological_structures
47
+ import ring_theory.ideals
47
48
48
49
noncomputable theory
49
50
local attribute [instance] classical.prop_decidable
50
51
open filter set
51
52
universes u v w x
52
53
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
-
62
54
/- separation space -/
63
55
namespace uniform_space
64
56
variables {α : Type u} {β : Type v} {γ : Type w}
65
57
variables [uniform_space α] [uniform_space β] [uniform_space γ]
66
58
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
-
80
59
def separation_setoid (α : Type u) [uniform_space α] : setoid α :=
81
60
⟨λx y, (x, y) ∈ separation_rel α, separated_equiv⟩
82
61
@@ -170,7 +149,7 @@ lemma comap_quotient_eq_uniformity :
170
149
uniformity.comap (λ (p : α × α), (⟦p.fst⟧, ⟦p.snd⟧)) = uniformity :=
171
150
le_antisymm comap_quotient_le_uniformity le_comap_map
172
151
173
- lemma complete_space_separation [h : complete_space α] :
152
+ instance complete_space_separation [h : complete_space α] :
174
153
complete_space (quotient (separation_setoid α)) :=
175
154
⟨assume f, assume hf : cauchy f,
176
155
have cauchy (f.comap (λx, ⟦x⟧)), from
@@ -181,7 +160,7 @@ lemma complete_space_separation [h : complete_space α] :
181
160
... ≤ map (λx, ⟦x⟧) (nhds x) : map_mono hx
182
161
... ≤ _ : continuous_iff_tendsto.mp uniform_continuous_quotient_mk.continuous _⟩⟩
183
162
184
- lemma separated_separation [h : complete_space α] : separated (quotient (separation_setoid α)) :=
163
+ instance separated_separation : separated (quotient (separation_setoid α)) :=
185
164
set.ext $ assume ⟨a, b⟩, quotient.induction_on₂ a b $ assume a b,
186
165
⟨assume h,
187
166
have a ≈ b, from assume s hs,
@@ -202,6 +181,53 @@ lemma eq_of_separated_of_uniform_continuous [separated β] {f : α → β} {x y
202
181
(H : uniform_continuous f) (h : x ≈ y) : f x = f y :=
203
182
separated_def.1 (by apply_instance) _ _ $ separated_of_uniform_continuous H h
204
183
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
+
205
231
lemma separation_prod {a₁ a₂ : α} {b₁ b₂ : β} : (a₁, b₁) ≈ (a₂, b₂) ↔ a₁ ≈ a₂ ∧ b₁ ≈ b₂ :=
206
232
begin
207
233
split,
@@ -224,6 +250,15 @@ separated_def.2 $ assume x y H, prod.ext
224
250
(eq_of_separated_of_uniform_continuous uniform_continuous_fst H)
225
251
(eq_of_separated_of_uniform_continuous uniform_continuous_snd H)
226
252
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
+
227
262
end uniform_space
228
263
229
264
/-- Space of Cauchy filters
@@ -423,7 +458,7 @@ begin
423
458
{ rw [extend, if_pos hf],
424
459
exact uniform_continuous_uniformly_extend uniform_embedding_pure_cauchy pure_cauchy_dense hf },
425
460
{ 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) }
427
462
end
428
463
429
464
end extend
@@ -514,9 +549,9 @@ namespace completion
514
549
@[priority 50 ]
515
550
instance : uniform_space (completion α) := by dunfold completion ; apply_instance
516
551
517
- instance : complete_space (completion α) := complete_space_separation
552
+ instance : complete_space (completion α) := by dunfold completion ; apply_instance
518
553
519
- instance : separated (completion α) := separated_separation
554
+ instance : separated (completion α) := by dunfold completion ; apply_instance
520
555
521
556
instance : t2_space (completion α) := separated_t2
522
557
@@ -612,6 +647,10 @@ have ∀x:(completion α × completion β) × (completion γ × completion δ),
612
647
is_closed_property dense₄ hp (assume p:(α×β)×(γ×δ), ih p.1 .1 p.1 .2 p.2 .1 p.2 .2 ),
613
648
this ((a, b), (c, d))
614
649
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
+
615
654
section extension
616
655
variables {f : α → β}
617
656
variables [complete_space β] [separated β]
@@ -637,7 +676,7 @@ section map
637
676
variables {f : α → β}
638
677
639
678
/-- Completion functor acting on morphisms -/
640
- protected def map (f : α → γ ) : completion α → completion γ :=
679
+ protected def map (f : α → β ) : completion α → completion β :=
641
680
completion.extension (coe ∘ f)
642
681
643
682
lemma uniform_continuous_map : uniform_continuous (completion.map f) :=
@@ -647,13 +686,66 @@ lemma continuous_map : continuous (completion.map f) :=
647
686
uniform_continuous_extension.continuous
648
687
649
688
@[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 $
650
694
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)]
653
698
end
654
699
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
+
655
713
end map
656
714
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
+
657
749
section prod
658
750
variables [uniform_space β]
659
751
protected def prod {α β} [uniform_space α] [uniform_space β] (p : completion α × completion β) : completion (α × β) :=
0 commit comments