@@ -6,7 +6,7 @@ Authors: Johannes Hölzl, Mario Carneiro, Patrick Massot
66module
77
88public import Mathlib.Topology.Homeomorph.Defs
9- public import Mathlib.Topology.Maps.Basic
9+ public import Mathlib.Topology.Maps.OpenQuotient
1010public import Mathlib.Topology.Separation.SeparatedNhds
1111
1212/-!
@@ -358,6 +358,16 @@ theorem ContinuousAt.prodMap' {f : X → Z} {g : Y → W} {x : X} {y : Y} (hf :
358358 (hg : ContinuousAt g y) : ContinuousAt (Prod.map f g) (x, y) :=
359359 hf.prodMap hg
360360
361+ @[simp]
362+ theorem continuousAt_prodMap_iff {f : X → Z} {g : Y → W} {x : X} {y : Y} :
363+ ContinuousAt (Prod.map f g) (x, y) ↔ ContinuousAt f x ∧ ContinuousAt g y := by
364+ simp [ContinuousAt, nhds_prod_eq, tendsto_iff_comap, comap_prodMap_prod]
365+
366+ @[simp]
367+ theorem continuous_prodMap_iff [Nonempty Z] [Nonempty W] {f : Z → X} {g : W → Y} :
368+ Continuous (Prod.map f g) ↔ Continuous f ∧ Continuous g := by
369+ simp [continuous_iff_continuousAt, forall_and]
370+
361371theorem ContinuousAt.comp₂ {f : Y × Z → W} {g : X → Y} {h : X → Z} {x : X}
362372 (hf : ContinuousAt f (g x, h x)) (hg : ContinuousAt g x) (hh : ContinuousAt h x) :
363373 ContinuousAt (fun x ↦ f (g x, h x)) x :=
@@ -494,11 +504,17 @@ theorem isOpen_prod_iff' {s : Set X} {t : Set Y} :
494504 simp only [st.1 .ne_empty, st.2 .ne_empty, or_false] at H
495505 exact H.1 .prod H.2
496506
507+ theorem isOpenQuotientMap_fst [Nonempty Y] : IsOpenQuotientMap (Prod.fst : X × Y → X) :=
508+ ⟨Prod.fst_surjective, continuous_fst, isOpenMap_fst⟩
509+
510+ theorem isOpenQuotientMap_snd [Nonempty X] : IsOpenQuotientMap (Prod.snd : X × Y → Y) :=
511+ ⟨Prod.snd_surjective, continuous_snd, isOpenMap_snd⟩
512+
497513theorem isQuotientMap_fst [Nonempty Y] : IsQuotientMap (Prod.fst : X × Y → X) :=
498- isOpenMap_fst .isQuotientMap continuous_fst Prod.fst_surjective
514+ isOpenQuotientMap_fst .isQuotientMap
499515
500516theorem isQuotientMap_snd [Nonempty X] : IsQuotientMap (Prod.snd : X × Y → Y) :=
501- isOpenMap_snd .isQuotientMap continuous_snd Prod.snd_surjective
517+ isOpenQuotientMap_snd .isQuotientMap
502518
503519theorem closure_prod_eq {s : Set X} {t : Set Y} : closure (s ×ˢ t) = closure s ×ˢ closure t :=
504520 ext fun ⟨a, b⟩ => by
@@ -589,6 +605,15 @@ protected theorem IsOpenMap.prodMap {f : X → Y} {g : Z → W} (hf : IsOpenMap
589605 rw [nhds_prod_eq, nhds_prod_eq, ← Filter.prod_map_map_eq']
590606 exact Filter.prod_mono (hf.nhds_le a) (hg.nhds_le b)
591607
608+ @[simp]
609+ theorem isOpenMap_prodMap_iff [Nonempty X] [Nonempty Z] {f : X → Y} {g : Z → W} :
610+ IsOpenMap (Prod.map f g) ↔ IsOpenMap f ∧ IsOpenMap g := by
611+ refine ⟨fun h ↦ ⟨?_, ?_⟩, fun ⟨hf, hg⟩ ↦ hf.prodMap hg⟩
612+ · rw [(isOpenQuotientMap_fst (Y := Z)).isOpenMap_iff]
613+ exact isOpenMap_fst.comp h
614+ · rw [(isOpenQuotientMap_snd (X := X)).isOpenMap_iff]
615+ exact isOpenMap_snd.comp h
616+
592617protected lemma Topology.IsOpenEmbedding.prodMap {f : X → Y} {g : Z → W} (hf : IsOpenEmbedding f)
593618 (hg : IsOpenEmbedding g) : IsOpenEmbedding (Prod.map f g) :=
594619 .of_isEmbedding_isOpenMap (hf.1 .prodMap hg.1 ) (hf.isOpenMap.prodMap hg.isOpenMap)
@@ -612,6 +637,13 @@ theorem IsOpenQuotientMap.prodMap {f : X → Y} {g : Z → W} (hf : IsOpenQuotie
612637 (hg : IsOpenQuotientMap g) : IsOpenQuotientMap (Prod.map f g) :=
613638 ⟨.prodMap hf.1 hg.1 , .prodMap hf.2 hg.2 , .prodMap hf.3 hg.3 ⟩
614639
640+ @[simp]
641+ theorem isOpenQuotientMap_prodMap_iff [Nonempty X] [Nonempty Z] {f : X → Y} {g : Z → W} :
642+ IsOpenQuotientMap (Prod.map f g) ↔ IsOpenQuotientMap f ∧ IsOpenQuotientMap g := by
643+ have : Nonempty Y := .map f inferInstance
644+ have : Nonempty W := .map g inferInstance
645+ grind [isOpenQuotientMap_iff, continuous_prodMap_iff, isOpenMap_prodMap_iff, Prod.map_surjective]
646+
615647theorem TopologicalSpace.prod_mono {α β : Type *} {σ₁ σ₂ : TopologicalSpace α}
616648 {τ₁ τ₂ : TopologicalSpace β} (hσ : σ₁ ≤ σ₂) (hτ : τ₁ ≤ τ₂) :
617649 @instTopologicalSpaceProd α β σ₁ τ₁ ≤ @instTopologicalSpaceProd α β σ₂ τ₂ :=
0 commit comments