Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(topology/maps): a few lemmas about is_open_map #1855

Merged
merged 4 commits into from
Jan 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
20 changes: 14 additions & 6 deletions src/topology/constructions.lean
Original file line number Diff line number Diff line change
Expand Up @@ -98,11 +98,11 @@ The 𝓝 filter and the subspace topology.

theorem mem_nhds_subtype (s : set α) (a : {x // x ∈ s}) (t : set {x // x ∈ s}) :
t ∈ 𝓝 a ↔ ∃ u ∈ 𝓝 a.val, (@subtype.val α s) ⁻¹' u ⊆ t :=
by rw mem_nhds_induced
mem_nhds_induced subtype.val a t

theorem nhds_subtype (s : set α) (a : {x // x ∈ s}) :
𝓝 a = comap subtype.val (𝓝 a.val) :=
by rw nhds_induced
nhds_induced subtype.val a

end topα

Expand Down Expand Up @@ -297,7 +297,7 @@ begin
rw [is_open_map_iff_nhds_le],
rintros ⟨a, b⟩,
rw [nhds_prod_eq, nhds_prod_eq, ← filter.prod_map_map_eq],
exact filter.prod_mono ((is_open_map_iff_nhds_le f).1 hf a) ((is_open_map_iff_nhds_le g).1 hg b)
exact filter.prod_mono (is_open_map_iff_nhds_le.1 hf a) (is_open_map_iff_nhds_le.1 hg b)
end

protected lemma open_embedding.prod {f : α → β} {g : γ → δ}
Expand Down Expand Up @@ -370,13 +370,21 @@ lemma embedding_subtype_val : embedding (@subtype.val α p) :=
lemma continuous_subtype_val : continuous (@subtype.val α p) :=
continuous_induced_dom

lemma subtype_val.open_embedding {s : set α} (hs : is_open s) :
open_embedding (subtype.val : {x // x ∈ s} → α) :=
lemma is_open.open_embedding_subtype_val {s : set α} (hs : is_open s) :
open_embedding (subtype.val : s → α) :=
{ induced := rfl,
inj := subtype.val_injective,
open_range := (subtype.val_range : range subtype.val = s).symm ▸ hs }

lemma subtype_val.closed_embedding {s : set α} (hs : is_closed s) :
lemma is_open.is_open_map_subtype_val {s : set α} (hs : is_open s) :
is_open_map (subtype.val : s → α) :=
hs.open_embedding_subtype_val.is_open_map

lemma is_open_map.restrict {f : α → β} (hf : is_open_map f) {s : set α} (hs : is_open s) :
is_open_map (function.restrict f s) :=
hf.comp hs.is_open_map_subtype_val

lemma is_closed.closed_embedding_subtype_val {s : set α} (hs : is_closed s) :
closed_embedding (subtype.val : {x // x ∈ s} → α) :=
{ induced := rfl,
inj := subtype.val_injective,
Expand Down
24 changes: 24 additions & 0 deletions src/topology/continuous_on.lean
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,30 @@ begin
exact (hf x hx).mem_closure_image hx
end

theorem is_open_map.continuous_on_image_of_left_inv_on {f : α → β} {s : set α}
(h : is_open_map (function.restrict f s)) {finv : β → α} (hleft : left_inv_on finv f s) :
continuous_on finv (f '' s) :=
begin
rintros _ ⟨x, xs, rfl⟩ t ht,
rw [hleft x xs] at ht,
replace h := h.nhds_le ⟨x, xs⟩,
apply mem_nhds_within_of_mem_nhds,
apply h,
erw [map_compose.symm, function.comp, mem_map, ← nhds_within_eq_map_subtype_val],
apply mem_sets_of_superset (inter_mem_nhds_within _ ht),
assume y hy,
rw [mem_set_of_eq, mem_preimage, hleft _ hy.1],
exact hy.2
end

theorem is_open_map.continuous_on_range_of_left_inverse {f : α → β} (hf : is_open_map f)
{finv : β → α} (hleft : function.left_inverse finv f) :
continuous_on finv (range f) :=
begin
rw [← image_univ],
exact (hf.restrict is_open_univ).continuous_on_image_of_left_inv_on (λ x _, hleft x)
end

lemma continuous_on.congr_mono {f g : α → β} {s s₁ : set α} (h : continuous_on f s)
(h' : ∀x ∈ s₁, g x = f x) (h₁ : s₁ ⊆ s) : continuous_on g s₁ :=
begin
Expand Down
29 changes: 20 additions & 9 deletions src/topology/maps.lean
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ variables [topological_space α] [topological_space β] [topological_space γ] [
lemma inducing_id : inducing (@id α) :=
⟨induced_id.symm⟩

lemma inducing.comp {f : αβ} {g : βγ} (hg : inducing g) (hf : inducing f) :
protected lemma inducing.comp {g : βγ} {f : αβ} (hg : inducing g) (hf : inducing f) :
inducing (g ∘ f) :=
⟨by rw [hf.induced, hg.induced, induced_compose]⟩

Expand Down Expand Up @@ -114,7 +114,7 @@ lemma embedding.mk' (f : α → β) (inj : function.injective f)
lemma embedding_id : embedding (@id α) :=
⟨inducing_id, assume a₁ a₂ h, h⟩

lemma embedding.comp {f : αβ} {g : βγ} (hg : embedding g) (hf : embedding f) :
lemma embedding.comp {g : βγ} {f : αβ} (hg : embedding g) (hf : embedding f) :
embedding (g ∘ f) :=
{ inj:= assume a₁ a₂ h, hf.inj $ hg.inj h,
..hg.to_inducing.comp hf.to_inducing }
Expand Down Expand Up @@ -157,7 +157,8 @@ end embedding

/-- A function between topological spaces is a quotient map if it is surjective,
and for all `s : set β`, `s` is open iff its preimage is an open set. -/
def quotient_map {α : Type*} {β : Type*} [tα : topological_space α] [tβ : topological_space β] (f : α → β) : Prop :=
def quotient_map {α : Type*} {β : Type*} [tα : topological_space α] [tβ : topological_space β]
(f : α → β) : Prop :=
function.surjective f ∧ tβ = tα.coinduced f

namespace quotient_map
Expand All @@ -166,7 +167,7 @@ variables [topological_space α] [topological_space β] [topological_space γ] [
protected lemma id : quotient_map (@id α) :=
⟨assume a, ⟨a, rfl⟩, coinduced_id.symm⟩

protected lemma comp {f : αβ} {g : βγ} (hf : quotient_map f) (hg : quotient_map g) :
protected lemma comp {g : βγ} {f : αβ} (hg : quotient_map g) (hf : quotient_map f) :
quotient_map (g ∘ f) :=
⟨function.surjective_comp hg.left hf.left, by rw [hg.right, hf.right, coinduced_compose]⟩

Expand All @@ -191,9 +192,13 @@ end quotient_map
section is_open_map
variables [topological_space α] [topological_space β]

/-- A map `f : α → β` is said to be an *open map*, if the image of any open `U : set α`
is open in `β`. -/
def is_open_map (f : α → β) := ∀ U : set α, is_open U → is_open (f '' U)

lemma is_open_map_iff_nhds_le (f : α → β) : is_open_map f ↔ ∀(a:α), 𝓝 (f a) ≤ (𝓝 a).map f :=
variable {f : α → β}

lemma is_open_map_iff_nhds_le : is_open_map f ↔ ∀(a:α), 𝓝 (f a) ≤ (𝓝 a).map f :=
begin
split,
{ assume h a s hs,
Expand All @@ -215,9 +220,15 @@ open function
protected lemma id : is_open_map (@id α) := assume s hs, by rwa [image_id]

protected lemma comp
{f : αβ} {g : βγ} (hf : is_open_map f) (hg : is_open_map g) : is_open_map (g ∘ f) :=
{g : βγ} {f : αβ} (hg : is_open_map g) (hf : is_open_map f) : is_open_map (g ∘ f) :=
by intros s hs; rw [image_comp]; exact hg _ (hf _ hs)

lemma is_open_range {f : α → β} (hf : is_open_map f) : is_open (range f) :=
by { rw ← image_univ, exact hf _ is_open_univ }

lemma nhds_le {f : α → β} (hf : is_open_map f) (a : α) : 𝓝 (f a) ≤ (𝓝 a).map f :=
is_open_map_iff_nhds_le.1 hf a

lemma of_inverse {f : α → β} {f' : β → α}
(h : continuous f') (l_inv : left_inverse f f') (r_inv : right_inverse f f') :
is_open_map f :=
Expand Down Expand Up @@ -255,7 +266,7 @@ open function

protected lemma id : is_closed_map (@id α) := assume s hs, by rwa image_id

protected lemma comp {f : αβ} {g : βγ} (hf : is_closed_map f) (hg : is_closed_map g) :
protected lemma comp {g : βγ} {f : αβ} (hg : is_closed_map g) (hf : is_closed_map f) :
is_closed_map (g ∘ f) :=
by { intros s hs, rw image_comp, exact hg _ (hf _ hs) }

Expand Down Expand Up @@ -315,7 +326,7 @@ end
lemma open_embedding_id : open_embedding (@id α) :=
⟨embedding_id, by convert is_open_univ; apply range_id⟩

lemma open_embedding.comp {f : αβ} {g : βγ}
lemma open_embedding.comp {g : βγ} {f : αβ}
(hg : open_embedding g) (hf : open_embedding f) : open_embedding (g ∘ f) :=
⟨hg.1.comp hf.1, show is_open (range (g ∘ f)),
by rw [range_comp, ←hg.open_iff_image_open]; exact hf.2⟩
Expand Down Expand Up @@ -373,7 +384,7 @@ end
lemma closed_embedding_id : closed_embedding (@id α) :=
⟨embedding_id, by convert is_closed_univ; apply range_id⟩

lemma closed_embedding.comp {f : αβ} {g : βγ}
lemma closed_embedding.comp {g : βγ} {f : αβ}
(hg : closed_embedding g) (hf : closed_embedding f) : closed_embedding (g ∘ f) :=
⟨hg.to_embedding.comp hf.to_embedding, show is_closed (range (g ∘ f)),
by rw [range_comp, ←hg.closed_iff_image_closed]; exact hf.closed_range⟩
Expand Down