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

Commit af434b5

Browse files
committed
refactor(analysis/topology): move is_open_map to continuity
1 parent 29675ad commit af434b5

File tree

3 files changed

+78
-66
lines changed

3 files changed

+78
-66
lines changed

analysis/topology/continuity.lean

Lines changed: 70 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -365,23 +365,22 @@ by ext x; rw [set.mem_preimage_eq, ← closure_induced he.1, he.2]
365365

366366
end embedding
367367

368-
section quotient_map
369-
370368
/-- A function between topological spaces is a quotient map if it is surjective,
371369
and for all `s : set β`, `s` is open iff its preimage is an open set. -/
372370
def quotient_map [tα : topological_space α] [tβ : topological_space β] (f : α → β) : Prop :=
373371
function.surjective f ∧ tβ = tα.coinduced f
374372

373+
namespace quotient_map
375374
variables [topological_space α] [topological_space β] [topological_space γ] [topological_space δ]
376375

377-
lemma quotient_map_id : quotient_map (@id α) :=
376+
protected lemma id : quotient_map (@id α) :=
378377
⟨assume a, ⟨a, rfl⟩, coinduced_id.symm⟩
379378

380-
lemma quotient_map_compose {f : α → β} {g : β → γ} (hf : quotient_map f) (hg : quotient_map g) :
379+
protected lemma comp {f : α → β} {g : β → γ} (hf : quotient_map f) (hg : quotient_map g) :
381380
quotient_map (g ∘ f) :=
382381
⟨function.surjective_comp hg.left hf.left, by rw [hg.right, hf.right, coinduced_compose]⟩
383382

384-
lemma quotient_map_of_quotient_map_compose {f : α → β} {g : β → γ}
383+
protected lemma of_quotient_map_compose {f : α → β} {g : β → γ}
385384
(hf : continuous f) (hg : continuous g)
386385
(hgf : quotient_map (g ∘ f)) : quotient_map g :=
387386
⟨assume b, let ⟨a, h⟩ := hgf.left b in ⟨f a, h⟩,
@@ -390,15 +389,68 @@ lemma quotient_map_of_quotient_map_compose {f : α → β} {g : β → γ}
390389
(by rw [hgf.right, ← continuous_iff_le_coinduced];
391390
apply hf.comp continuous_coinduced_rng)⟩
392391

393-
lemma quotient_map.continuous_iff {f : α → β} {g : β → γ} (hf : quotient_map f) :
392+
protected lemma continuous_iff {f : α → β} {g : β → γ} (hf : quotient_map f) :
394393
continuous g ↔ continuous (g ∘ f) :=
395394
by rw [continuous_iff_le_coinduced, continuous_iff_le_coinduced, hf.right, coinduced_compose]
396395

397-
lemma quotient_map.continuous {f : α → β} (hf : quotient_map f) : continuous f :=
396+
protected lemma continuous {f : α → β} (hf : quotient_map f) : continuous f :=
398397
hf.continuous_iff.mp continuous_id
399398

400399
end quotient_map
401400

401+
section is_open_map
402+
variables [topological_space α] [topological_space β]
403+
404+
def is_open_map (f : α → β) := ∀ U : set α, is_open U → is_open (f '' U)
405+
406+
lemma is_open_map_iff_nhds_le (f : α → β) : is_open_map f ↔ ∀(a:α), nhds (f a) ≤ (nhds a).map f :=
407+
begin
408+
split,
409+
{ assume h a s hs,
410+
rcases mem_nhds_sets_iff.1 hs with ⟨t, hts, ht, hat⟩,
411+
exact filter.mem_sets_of_superset
412+
(mem_nhds_sets (h t ht) (mem_image_of_mem _ hat))
413+
(image_subset_iff.2 hts) },
414+
{ refine assume h s hs, is_open_iff_mem_nhds.2 _,
415+
rintros b ⟨a, ha, rfl⟩,
416+
exact h _ (filter.image_mem_map $ mem_nhds_sets hs ha) }
417+
end
418+
419+
end is_open_map
420+
421+
namespace is_open_map
422+
variables [topological_space α] [topological_space β] [topological_space γ]
423+
open function
424+
425+
protected lemma id : is_open_map (@id α) := assume s hs, by rwa [image_id]
426+
427+
protected lemma comp
428+
{f : α → β} {g : β → γ} (hf : is_open_map f) (hg : is_open_map g) : is_open_map (g ∘ f) :=
429+
by intros s hs; rw [image_comp]; exact hg _ (hf _ hs)
430+
431+
lemma of_inverse {f : α → β} {f' : β → α}
432+
(h : continuous f') (l_inv : left_inverse f f') (r_inv : right_inverse f f') :
433+
is_open_map f :=
434+
assume s hs,
435+
have f' ⁻¹' s = f '' s, by ext x; simp [mem_image_iff_of_inverse r_inv l_inv],
436+
this ▸ h s hs
437+
438+
lemma to_quotient_map {f : α → β}
439+
(open_map : is_open_map f) (cont : continuous f) (surj : function.surjective f) :
440+
quotient_map f :=
441+
⟨ surj,
442+
begin
443+
ext s,
444+
show is_open s ↔ is_open (f ⁻¹' s),
445+
split,
446+
{ exact cont s },
447+
{ assume h,
448+
rw ← @image_preimage_eq _ _ _ s surj,
449+
exact open_map _ h }
450+
end
451+
452+
end is_open_map
453+
402454
section sierpinski
403455
variables [topological_space α]
404456

@@ -526,6 +578,17 @@ lemma is_closed_prod [topological_space α] [topological_space β] {s₁ : set
526578
(h₁ : is_closed s₁) (h₂ : is_closed s₂) : is_closed (set.prod s₁ s₂) :=
527579
closure_eq_iff_is_closed.mp $ by simp [h₁, h₂, closure_prod_eq, closure_eq_of_is_closed]
528580

581+
protected lemma is_open_map.prod
582+
[topological_space α] [topological_space β] [topological_space γ] [topological_space δ]
583+
{f : α → β} {g : γ → δ}
584+
(hf : is_open_map f) (hg : is_open_map g) : is_open_map (λ p : α × γ, (f p.1, g p.2)) :=
585+
begin
586+
rw [is_open_map_iff_nhds_le],
587+
rintros ⟨a, b⟩,
588+
rw [nhds_prod_eq, nhds_prod_eq, ← filter.prod_map_map_eq],
589+
exact filter.prod_mono ((is_open_map_iff_nhds_le f).1 hf a) ((is_open_map_iff_nhds_le g).1 hg b)
590+
end
591+
529592
section tube_lemma
530593

531594
def nhds_contain_boxes (s : set α) (t : set β) : Prop :=

analysis/topology/quotient_topological_structures.lean

Lines changed: 0 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -6,65 +6,6 @@ open function set
66
variables {α : Type*} [topological_space α] {β : Type*} [topological_space β]
77
variables {γ : Type*} [topological_space γ] {δ : Type*} [topological_space δ]
88

9-
def is_open_map (f : α → β) := ∀ U : set α, is_open U → is_open (f '' U)
10-
11-
lemma is_open_map_iff_nhds_le (f : α → β) : is_open_map f ↔ ∀(a:α), nhds (f a) ≤ (nhds a).map f :=
12-
begin
13-
split,
14-
{ assume h a s hs,
15-
rcases mem_nhds_sets_iff.1 hs with ⟨t, hts, ht, hat⟩,
16-
exact filter.mem_sets_of_superset
17-
(mem_nhds_sets (h t ht) (mem_image_of_mem _ hat))
18-
(image_subset_iff.2 hts) },
19-
{ refine assume h s hs, is_open_iff_mem_nhds.2 _,
20-
rintros b ⟨a, ha, rfl⟩,
21-
exact h _ (filter.image_mem_map $ mem_nhds_sets hs ha) }
22-
end
23-
24-
namespace is_open_map
25-
26-
protected lemma id : is_open_map (@id α) := assume s hs, by rwa [image_id]
27-
28-
protected lemma comp
29-
{f : α → β} {g : β → γ} (hf : is_open_map f) (hg : is_open_map g) : is_open_map (g ∘ f) :=
30-
by intros s hs; rw [image_comp]; exact hg _ (hf _ hs)
31-
32-
protected lemma prod {f : α → β} {g : γ → δ}
33-
(hf : is_open_map f) (hg : is_open_map g) : is_open_map (λ p : α × γ, (f p.1, g p.2)) :=
34-
begin
35-
rw [is_open_map_iff_nhds_le],
36-
rintros ⟨a, b⟩,
37-
rw [nhds_prod_eq, nhds_prod_eq, ← filter.prod_map_map_eq],
38-
exact filter.prod_mono ((is_open_map_iff_nhds_le f).1 hf a) ((is_open_map_iff_nhds_le g).1 hg b)
39-
end
40-
41-
lemma of_inverse {f : α → β} {f' : β → α}
42-
(h : continuous f') (l_inv : left_inverse f f') (r_inv : right_inverse f f') :
43-
is_open_map f :=
44-
assume s hs,
45-
have f' ⁻¹' s = f '' s, by ext x; simp [mem_image_iff_of_inverse r_inv l_inv],
46-
this ▸ h s hs
47-
48-
lemma to_quotient_map {f : α → β}
49-
(open_map : is_open_map f) (cont : continuous f) (surj : surjective f) :
50-
quotient_map f :=
51-
⟨ surj,
52-
begin
53-
ext s,
54-
show is_open s ↔ is_open (f ⁻¹' s),
55-
split,
56-
{ exact cont s },
57-
{ assume h,
58-
rw ← @image_preimage_eq _ _ _ s surj,
59-
exact open_map _ h }
60-
end
61-
62-
end is_open_map
63-
64-
lemma is_open_coinduced {β} {s : set β} {f : α → β} :
65-
@is_open β (topological_space.coinduced f _inst_1) s ↔ is_open (f ⁻¹' s) :=
66-
iff.refl _
67-
689
section topological_group
6910
variables [group α] [topological_group α]
7011

analysis/topology/topological_space.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,10 @@ def topological_space.induced {α : Type u} {β : Type v} (f : α → β) (t : t
868868
show is_open (⋃h, f i h), from @is_open_Union β _ t _ $ assume h, (hf i h).left)
869869
end }
870870

871+
lemma is_open_induced_iff [t : topological_space β] {s : set α} {f : α → β} :
872+
@is_open α (t.induced f) s ↔ (∃t, is_open t ∧ s = f ⁻¹' t) :=
873+
iff.refl _
874+
871875
lemma is_closed_induced_iff [t : topological_space β] {s : set α} {f : α → β} :
872876
@is_closed α (t.induced f) s ↔ (∃t, is_closed t ∧ s = f ⁻¹' t) :=
873877
⟨assume ⟨t, ht, heq⟩, ⟨-t, is_closed_compl_iff.2 ht, by simp only [preimage_compl, heq.symm, lattice.neg_neg]⟩,
@@ -885,6 +889,10 @@ def topological_space.coinduced {α : Type u} {β : Type v} (f : α → β) (t :
885889
show is_open (⋃ (H : i ∈ s), f ⁻¹' i), from
886890
@is_open_Union _ _ t _ $ assume hi, h i hi) }
887891

892+
lemma is_open_coinduced {t : topological_space α} {s : set β} {f : α → β} :
893+
@is_open β (topological_space.coinduced f t) s ↔ is_open (f ⁻¹' s) :=
894+
iff.refl _
895+
888896
variables {t t₁ t₂ : topological_space α} {t' : topological_space β} {f : α → β} {g : β → α}
889897

890898
lemma induced_le_iff_le_coinduced {f : α → β } {tα : topological_space α} {tβ : topological_space β} :

0 commit comments

Comments
 (0)