l3lab/ntp-mathlib huggingface dataset:
/-- A version of `continuous_inf_dom_right` for binary functions -/
theorem continuous_inf_dom_right₂ {α β γ} {f : α → β → γ} {ta1 ta2 : TopologicalSpace α}
    {tb1 tb2 : TopologicalSpace β} {tc1 : TopologicalSpace γ}
    (h : by haveI := ta2; haveI := tb2; exact Continuous fun p : α × β => f p.1 p.2) : by
    

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type ?u.27758
β : Type ?u.27764
γ : Type ?u.27770
f : α → β → γ
ta1 ta2 : TopologicalSpace α
tb1 tb2 : TopologicalSpace β
tc1 : TopologicalSpace γ
h : Continuous fun p => f p.1 p.2
⊢ Sort ?u.27775

Next tactic:
haveI := ta1 ⊓ ta2
/-- A version of `continuous_inf_dom_right` for binary functions -/
theorem continuous_inf_dom_right₂ {α β γ} {f : α → β → γ} {ta1 ta2 : TopologicalSpace α}
    {tb1 tb2 : TopologicalSpace β} {tc1 : TopologicalSpace γ}
    (h : by haveI := ta2; haveI := tb2; exact Continuous fun p : α × β => f p.1 p.2) : by
    haveI := ta1 ⊓ ta2; 

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type ?u.27758
β : Type ?u.27764
γ : Type ?u.27770
f : α → β → γ
ta1 ta2 : TopologicalSpace α
tb1 tb2 : TopologicalSpace β
tc1 : TopologicalSpace γ
h : Continuous fun p => f p.1 p.2
this : TopologicalSpace α
⊢ Sort ?u.27775

Next tactic:
haveI := tb1 ⊓ tb2
/-- A version of `continuous_inf_dom_right` for binary functions -/
theorem continuous_inf_dom_right₂ {α β γ} {f : α → β → γ} {ta1 ta2 : TopologicalSpace α}
    {tb1 tb2 : TopologicalSpace β} {tc1 : TopologicalSpace γ}
    (h : by haveI := ta2; haveI := tb2; exact Continuous fun p : α × β => f p.1 p.2) : by
    haveI := ta1 ⊓ ta2; haveI := tb1 ⊓ tb2; 

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type ?u.27758
β : Type ?u.27764
γ : Type ?u.27770
f : α → β → γ
ta1 ta2 : TopologicalSpace α
tb1 tb2 : TopologicalSpace β
tc1 : TopologicalSpace γ
h : Continuous fun p => f p.1 p.2
this✝ : TopologicalSpace α
this : TopologicalSpace β
⊢ Sort ?u.27775

Next tactic:
exact Continuous fun p : α × β => f p.1 p.2
/-- A version of `continuous_inf_dom_right` for binary functions -/
theorem continuous_inf_dom_right₂ {α β γ} {f : α → β → γ} {ta1 ta2 : TopologicalSpace α}
    {tb1 tb2 : TopologicalSpace β} {tc1 : TopologicalSpace γ}
    (h : by haveI := ta2; haveI := tb2; exact Continuous fun p : α × β => f p.1 p.2) : by
    haveI := ta1 ⊓ ta2; haveI := tb1 ⊓ tb2; exact Continuous fun p : α × β => f p.1 p.2 := by
  

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_5
β : Type u_6
γ : Type u_7
f : α → β → γ
ta1 ta2 : TopologicalSpace α
tb1 tb2 : TopologicalSpace β
tc1 : TopologicalSpace γ
h : Continuous fun p => f p.1 p.2
⊢ Continuous fun p => f p.1 p.2

Next tactic:
have ha := @continuous_inf_dom_right _ _ id ta1 ta2 ta2 (@continuous_id _ (id _))
/-- A version of `continuous_inf_dom_right` for binary functions -/
theorem continuous_inf_dom_right₂ {α β γ} {f : α → β → γ} {ta1 ta2 : TopologicalSpace α}
    {tb1 tb2 : TopologicalSpace β} {tc1 : TopologicalSpace γ}
    (h : by haveI := ta2; haveI := tb2; exact Continuous fun p : α × β => f p.1 p.2) : by
    haveI := ta1 ⊓ ta2; haveI := tb1 ⊓ tb2; exact Continuous fun p : α × β => f p.1 p.2 := by
  have ha := @continuous_inf_dom_right _ _ id ta1 ta2 ta2 (@continuous_id _ (id _))
  

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_5
β : Type u_6
γ : Type u_7
f : α → β → γ
ta1 ta2 : TopologicalSpace α
tb1 tb2 : TopologicalSpace β
tc1 : TopologicalSpace γ
h : Continuous fun p => f p.1 p.2
ha : Continuous id
⊢ Continuous fun p => f p.1 p.2

Next tactic:
have hb := @continuous_inf_dom_right _ _ id tb1 tb2 tb2 (@continuous_id _ (id _))
/-- A version of `continuous_inf_dom_right` for binary functions -/
theorem continuous_inf_dom_right₂ {α β γ} {f : α → β → γ} {ta1 ta2 : TopologicalSpace α}
    {tb1 tb2 : TopologicalSpace β} {tc1 : TopologicalSpace γ}
    (h : by haveI := ta2; haveI := tb2; exact Continuous fun p : α × β => f p.1 p.2) : by
    haveI := ta1 ⊓ ta2; haveI := tb1 ⊓ tb2; exact Continuous fun p : α × β => f p.1 p.2 := by
  have ha := @continuous_inf_dom_right _ _ id ta1 ta2 ta2 (@continuous_id _ (id _))
  have hb := @continuous_inf_dom_right _ _ id tb1 tb2 tb2 (@continuous_id _ (id _))
  

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_5
β : Type u_6
γ : Type u_7
f : α → β → γ
ta1 ta2 : TopologicalSpace α
tb1 tb2 : TopologicalSpace β
tc1 : TopologicalSpace γ
h : Continuous fun p => f p.1 p.2
ha : Continuous id
hb : Continuous id
⊢ Continuous fun p => f p.1 p.2

Next tactic:
have h_continuous_id := @Continuous.prod_map _ _ _ _ ta2 tb2 (ta1 ⊓ ta2) (tb1 ⊓ tb2) _ _ ha hb
/-- A version of `continuous_inf_dom_right` for binary functions -/
theorem continuous_inf_dom_right₂ {α β γ} {f : α → β → γ} {ta1 ta2 : TopologicalSpace α}
    {tb1 tb2 : TopologicalSpace β} {tc1 : TopologicalSpace γ}
    (h : by haveI := ta2; haveI := tb2; exact Continuous fun p : α × β => f p.1 p.2) : by
    haveI := ta1 ⊓ ta2; haveI := tb1 ⊓ tb2; exact Continuous fun p : α × β => f p.1 p.2 := by
  have ha := @continuous_inf_dom_right _ _ id ta1 ta2 ta2 (@continuous_id _ (id _))
  have hb := @continuous_inf_dom_right _ _ id tb1 tb2 tb2 (@continuous_id _ (id _))
  have h_continuous_id := @Continuous.prod_map _ _ _ _ ta2 tb2 (ta1 ⊓ ta2) (tb1 ⊓ tb2) _ _ ha hb
  

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_5
β : Type u_6
γ : Type u_7
f : α → β → γ
ta1 ta2 : TopologicalSpace α
tb1 tb2 : TopologicalSpace β
tc1 : TopologicalSpace γ
h : Continuous fun p => f p.1 p.2
ha : Continuous id
hb : Continuous id
h_continuous_id : Continuous fun x => (id x.1, id x.2)
⊢ Continuous fun p => f p.1 p.2

Next tactic:
exact @Continuous.comp _ _ _ (id _) (id _) _ _ _ h h_continuous_id
/-- A version of `continuous_sInf_dom` for binary functions -/
theorem continuous_sInf_dom₂ {α β γ} {f : α → β → γ} {tas : Set (TopologicalSpace α)}
    {tbs : Set (TopologicalSpace β)} {ta : TopologicalSpace α} {tb : TopologicalSpace β}
    {tc : TopologicalSpace γ} (ha : ta ∈ tas) (hb : tb ∈ tbs)
    (hf : Continuous fun p : α × β => f p.1 p.2) : by
    

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type ?u.28452
β : Type ?u.28456
γ : Type ?u.28465
f : α → β → γ
tas : Set (TopologicalSpace α)
tbs : Set (TopologicalSpace β)
ta : TopologicalSpace α
tb : TopologicalSpace β
tc : TopologicalSpace γ
ha : ta ∈ tas
hb : tb ∈ tbs
hf : Continuous fun p => f p.1 p.2
⊢ Sort ?u.28630

Next tactic:
haveI := sInf tas
/-- A version of `continuous_sInf_dom` for binary functions -/
theorem continuous_sInf_dom₂ {α β γ} {f : α → β → γ} {tas : Set (TopologicalSpace α)}
    {tbs : Set (TopologicalSpace β)} {ta : TopologicalSpace α} {tb : TopologicalSpace β}
    {tc : TopologicalSpace γ} (ha : ta ∈ tas) (hb : tb ∈ tbs)
    (hf : Continuous fun p : α × β => f p.1 p.2) : by
    haveI := sInf tas; 

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type ?u.28452
β : Type ?u.28456
γ : Type ?u.28465
f : α → β → γ
tas : Set (TopologicalSpace α)
tbs : Set (TopologicalSpace β)
ta : TopologicalSpace α
tb : TopologicalSpace β
tc : TopologicalSpace γ
ha : ta ∈ tas
hb : tb ∈ tbs
hf : Continuous fun p => f p.1 p.2
this : TopologicalSpace α
⊢ Sort ?u.28630

Next tactic:
haveI := sInf tbs
/-- A version of `continuous_sInf_dom` for binary functions -/
theorem continuous_sInf_dom₂ {α β γ} {f : α → β → γ} {tas : Set (TopologicalSpace α)}
    {tbs : Set (TopologicalSpace β)} {ta : TopologicalSpace α} {tb : TopologicalSpace β}
    {tc : TopologicalSpace γ} (ha : ta ∈ tas) (hb : tb ∈ tbs)
    (hf : Continuous fun p : α × β => f p.1 p.2) : by
    haveI := sInf tas; haveI := sInf tbs;
      

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type ?u.28452
β : Type ?u.28456
γ : Type ?u.28465
f : α → β → γ
tas : Set (TopologicalSpace α)
tbs : Set (TopologicalSpace β)
ta : TopologicalSpace α
tb : TopologicalSpace β
tc : TopologicalSpace γ
ha : ta ∈ tas
hb : tb ∈ tbs
hf : Continuous fun p => f p.1 p.2
this✝ : TopologicalSpace α
this : TopologicalSpace β
⊢ Sort ?u.28630

Next tactic:
exact @Continuous _ _ _ tc fun p : α × β => f p.1 p.2
/-- A version of `continuous_sInf_dom` for binary functions -/
theorem continuous_sInf_dom₂ {α β γ} {f : α → β → γ} {tas : Set (TopologicalSpace α)}
    {tbs : Set (TopologicalSpace β)} {ta : TopologicalSpace α} {tb : TopologicalSpace β}
    {tc : TopologicalSpace γ} (ha : ta ∈ tas) (hb : tb ∈ tbs)
    (hf : Continuous fun p : α × β => f p.1 p.2) : by
    haveI := sInf tas; haveI := sInf tbs;
      exact @Continuous _ _ _ tc fun p : α × β => f p.1 p.2 := by
  

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_5
β : Type u_6
γ : Type u_7
f : α → β → γ
tas : Set (TopologicalSpace α)
tbs : Set (TopologicalSpace β)
ta : TopologicalSpace α
tb : TopologicalSpace β
tc : TopologicalSpace γ
ha : ta ∈ tas
hb : tb ∈ tbs
hf : Continuous fun p => f p.1 p.2
⊢ Continuous fun p => f p.1 p.2

Next tactic:
have ha := continuous_sInf_dom ha continuous_id
/-- A version of `continuous_sInf_dom` for binary functions -/
theorem continuous_sInf_dom₂ {α β γ} {f : α → β → γ} {tas : Set (TopologicalSpace α)}
    {tbs : Set (TopologicalSpace β)} {ta : TopologicalSpace α} {tb : TopologicalSpace β}
    {tc : TopologicalSpace γ} (ha : ta ∈ tas) (hb : tb ∈ tbs)
    (hf : Continuous fun p : α × β => f p.1 p.2) : by
    haveI := sInf tas; haveI := sInf tbs;
      exact @Continuous _ _ _ tc fun p : α × β => f p.1 p.2 := by
  have ha := continuous_sInf_dom ha continuous_id
  

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_5
β : Type u_6
γ : Type u_7
f : α → β → γ
tas : Set (TopologicalSpace α)
tbs : Set (TopologicalSpace β)
ta : TopologicalSpace α
tb : TopologicalSpace β
tc : TopologicalSpace γ
ha✝ : ta ∈ tas
hb : tb ∈ tbs
hf : Continuous fun p => f p.1 p.2
ha : Continuous id
⊢ Continuous fun p => f p.1 p.2

Next tactic:
have hb := continuous_sInf_dom hb continuous_id
/-- A version of `continuous_sInf_dom` for binary functions -/
theorem continuous_sInf_dom₂ {α β γ} {f : α → β → γ} {tas : Set (TopologicalSpace α)}
    {tbs : Set (TopologicalSpace β)} {ta : TopologicalSpace α} {tb : TopologicalSpace β}
    {tc : TopologicalSpace γ} (ha : ta ∈ tas) (hb : tb ∈ tbs)
    (hf : Continuous fun p : α × β => f p.1 p.2) : by
    haveI := sInf tas; haveI := sInf tbs;
      exact @Continuous _ _ _ tc fun p : α × β => f p.1 p.2 := by
  have ha := continuous_sInf_dom ha continuous_id
  have hb := continuous_sInf_dom hb continuous_id
  

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_5
β : Type u_6
γ : Type u_7
f : α → β → γ
tas : Set (TopologicalSpace α)
tbs : Set (TopologicalSpace β)
ta : TopologicalSpace α
tb : TopologicalSpace β
tc : TopologicalSpace γ
ha✝ : ta ∈ tas
hb✝ : tb ∈ tbs
hf : Continuous fun p => f p.1 p.2
ha : Continuous id
hb : Continuous id
⊢ Continuous fun p => f p.1 p.2

Next tactic:
have h_continuous_id := @Continuous.prod_map _ _ _ _ ta tb (sInf tas) (sInf tbs) _ _ ha hb
/-- A version of `continuous_sInf_dom` for binary functions -/
theorem continuous_sInf_dom₂ {α β γ} {f : α → β → γ} {tas : Set (TopologicalSpace α)}
    {tbs : Set (TopologicalSpace β)} {ta : TopologicalSpace α} {tb : TopologicalSpace β}
    {tc : TopologicalSpace γ} (ha : ta ∈ tas) (hb : tb ∈ tbs)
    (hf : Continuous fun p : α × β => f p.1 p.2) : by
    haveI := sInf tas; haveI := sInf tbs;
      exact @Continuous _ _ _ tc fun p : α × β => f p.1 p.2 := by
  have ha := continuous_sInf_dom ha continuous_id
  have hb := continuous_sInf_dom hb continuous_id
  have h_continuous_id := @Continuous.prod_map _ _ _ _ ta tb (sInf tas) (sInf tbs) _ _ ha hb
  

Proof state:
α✝ : Type u
β✝ : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_5
β : Type u_6
γ : Type u_7
f : α → β → γ
tas : Set (TopologicalSpace α)
tbs : Set (TopologicalSpace β)
ta : TopologicalSpace α
tb : TopologicalSpace β
tc : TopologicalSpace γ
ha✝ : ta ∈ tas
hb✝ : tb ∈ tbs
hf : Continuous fun p => f p.1 p.2
ha : Continuous id
hb : Continuous id
h_continuous_id : Continuous fun x => (id x.1, id x.2)
⊢ Continuous fun p => f p.1 p.2

Next tactic:
exact @Continuous.comp _ _ _ (id _) (id _) _ _ _ hf h_continuous_id
lemma isClosedMap_swap : IsClosedMap (Prod.swap : α × β → β × α) := fun s hs ↦ by
  

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set (α × β)
hs : IsClosed s
⊢ IsClosed (Prod.swap '' s)

Next tactic:
rw [image_swap_eq_preimage_swap]
lemma isClosedMap_swap : IsClosedMap (Prod.swap : α × β → β × α) := fun s hs ↦ by
  rw [image_swap_eq_preimage_swap]
  

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set (α × β)
hs : IsClosed s
⊢ IsClosed (Prod.swap ⁻¹' s)

Next tactic:
exact hs.preimage continuous_swap
theorem nhds_prod_eq {a : α} {b : β} : 𝓝 (a, b) = 𝓝 a ×ˢ 𝓝 b := by
  

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
a : α
b : β
⊢ 𝓝 (a, b) = 𝓝 a ×ˢ 𝓝 b

Next tactic:
dsimp only [SProd.sprod]
theorem nhds_prod_eq {a : α} {b : β} : 𝓝 (a, b) = 𝓝 a ×ˢ 𝓝 b := by
  dsimp only [SProd.sprod]
  

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
a : α
b : β
⊢ 𝓝 (a, b) = Filter.prod (𝓝 a) (𝓝 b)

Next tactic:
rw [Filter.prod, instTopologicalSpaceProd, nhds_inf (t₁ := TopologicalSpace.induced Prod.fst _)
    (t₂ := TopologicalSpace.induced Prod.snd _), nhds_induced, nhds_induced]
theorem nhdsWithin_prod_eq (a : α) (b : β) (s : Set α) (t : Set β) :
    𝓝[s ×ˢ t] (a, b) = 𝓝[s] a ×ˢ 𝓝[t] b := by
  

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
a : α
b : β
s : Set α
t : Set β
⊢ 𝓝[s ×ˢ t] (a, b) = 𝓝[s] a ×ˢ 𝓝[t] b

Next tactic:
simp only [nhdsWithin, nhds_prod_eq, ← prod_inf_prod, prod_principal_principal]
theorem mem_nhds_prod_iff {a : α} {b : β} {s : Set (α × β)} :
    s ∈ 𝓝 (a, b) ↔ ∃ u ∈ 𝓝 a, ∃ v ∈ 𝓝 b, u ×ˢ v ⊆ s := by 

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
a : α
b : β
s : Set (α × β)
⊢ s ∈ 𝓝 (a, b) ↔ ∃ u ∈ 𝓝 a, ∃ v ∈ 𝓝 b, u ×ˢ v ⊆ s

Next tactic:
rw [nhds_prod_eq, mem_prod_iff]
theorem mem_nhdsWithin_prod_iff {a : α} {b : β} {s : Set (α × β)} {ta : Set α} {tb : Set β} :
    s ∈ 𝓝[ta ×ˢ tb] (a, b) ↔ ∃ u ∈ 𝓝[ta] a, ∃ v ∈ 𝓝[tb] b, u ×ˢ v ⊆ s := by
  

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
a : α
b : β
s : Set (α × β)
ta : Set α
tb : Set β
⊢ s ∈ 𝓝[ta ×ˢ tb] (a, b) ↔ ∃ u ∈ 𝓝[ta] a, ∃ v ∈ 𝓝[tb] b, u ×ˢ v ⊆ s

Next tactic:
rw [nhdsWithin_prod_eq, mem_prod_iff]
theorem Filter.HasBasis.prod_nhds {ιa ιb : Type*} {pa : ιa → Prop} {pb : ιb → Prop}
    {sa : ιa → Set α} {sb : ιb → Set β} {a : α} {b : β} (ha : (𝓝 a).HasBasis pa sa)
    (hb : (𝓝 b).HasBasis pb sb) :
    (𝓝 (a, b)).HasBasis (fun i : ιa × ιb => pa i.1 ∧ pb i.2) fun i => sa i.1 ×ˢ sb i.2 := by
  

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
ιa : Type u_5
ιb : Type u_6
pa : ιa → Prop
pb : ιb → Prop
sa : ιa → Set α
sb : ιb → Set β
a : α
b : β
ha : HasBasis (𝓝 a) pa sa
hb : HasBasis (𝓝 b) pb sb
⊢ HasBasis (𝓝 (a, b)) (fun i => pa i.1 ∧ pb i.2) fun i => sa i.1 ×ˢ sb i.2

Next tactic:
rw [nhds_prod_eq]
theorem Filter.HasBasis.prod_nhds {ιa ιb : Type*} {pa : ιa → Prop} {pb : ιb → Prop}
    {sa : ιa → Set α} {sb : ιb → Set β} {a : α} {b : β} (ha : (𝓝 a).HasBasis pa sa)
    (hb : (𝓝 b).HasBasis pb sb) :
    (𝓝 (a, b)).HasBasis (fun i : ιa × ιb => pa i.1 ∧ pb i.2) fun i => sa i.1 ×ˢ sb i.2 := by
  rw [nhds_prod_eq]
  

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
ιa : Type u_5
ιb : Type u_6
pa : ιa → Prop
pb : ιb → Prop
sa : ιa → Set α
sb : ιb → Set β
a : α
b : β
ha : HasBasis (𝓝 a) pa sa
hb : HasBasis (𝓝 b) pb sb
⊢ HasBasis (𝓝 a ×ˢ 𝓝 b) (fun i => pa i.1 ∧ pb i.2) fun i => sa i.1 ×ˢ sb i.2

Next tactic:
exact ha.prod hb
theorem mem_nhds_prod_iff' {a : α} {b : β} {s : Set (α × β)} :
    s ∈ 𝓝 (a, b) ↔ ∃ u v, IsOpen u ∧ a ∈ u ∧ IsOpen v ∧ b ∈ v ∧ u ×ˢ v ⊆ s :=
  ((nhds_basis_opens a).prod_nhds (nhds_basis_opens b)).mem_iff.trans <| by
    

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
a : α
b : β
s : Set (α × β)
⊢ (∃ i, ((a ∈ i.1 ∧ IsOpen i.1) ∧ b ∈ i.2 ∧ IsOpen i.2) ∧ i.1 ×ˢ i.2 ⊆ s) ↔
    ∃ u v, IsOpen u ∧ a ∈ u ∧ IsOpen v ∧ b ∈ v ∧ u ×ˢ v ⊆ s

Next tactic:
simp only [Prod.exists, and_comm, and_assoc, and_left_comm]
theorem Prod.tendsto_iff {α} (seq : α → β × γ) {f : Filter α} (x : β × γ) :
    Tendsto seq f (𝓝 x) ↔
      Tendsto (fun n => (seq n).fst) f (𝓝 x.fst) ∧ Tendsto (fun n => (seq n).snd) f (𝓝 x.snd) := by
  

Proof state:
α✝ : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_5
seq : α → β × γ
f : Filter α
x : β × γ
⊢ Tendsto seq f (𝓝 x) ↔ Tendsto (fun n => (seq n).1) f (𝓝 x.1) ∧ Tendsto (fun n => (seq n).2) f (𝓝 x.2)

Next tactic:
rw [nhds_prod_eq, Filter.tendsto_prod_iff']
instance [DiscreteTopology α] [DiscreteTopology β] : DiscreteTopology (α × β) :=
  discreteTopology_iff_nhds.2 fun (a, b) => by
    

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁷ : TopologicalSpace α
inst✝⁶ : TopologicalSpace β
inst✝⁵ : TopologicalSpace γ
inst✝⁴ : TopologicalSpace δ
inst✝³ : TopologicalSpace ε
inst✝² : TopologicalSpace ζ
inst✝¹ : DiscreteTopology α
inst✝ : DiscreteTopology β
x✝ : α × β
a : α
b : β
⊢ 𝓝 (a, b) = pure (a, b)

Next tactic:
rw [nhds_prod_eq, nhds_discrete α, nhds_discrete β, prod_pure_pure]
theorem prod_mem_nhds_iff {s : Set α} {t : Set β} {a : α} {b : β} :
    s ×ˢ t ∈ 𝓝 (a, b) ↔ s ∈ 𝓝 a ∧ t ∈ 𝓝 b := by 

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
a : α
b : β
⊢ s ×ˢ t ∈ 𝓝 (a, b) ↔ s ∈ 𝓝 a ∧ t ∈ 𝓝 b

Next tactic:
rw [nhds_prod_eq, prod_mem_prod_iff]
theorem nhds_swap (a : α) (b : β) : 𝓝 (a, b) = (𝓝 (b, a)).map Prod.swap := by
  

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
a : α
b : β
⊢ 𝓝 (a, b) = map Prod.swap (𝓝 (b, a))

Next tactic:
rw [nhds_prod_eq, Filter.prod_comm, nhds_prod_eq]
theorem nhds_swap (a : α) (b : β) : 𝓝 (a, b) = (𝓝 (b, a)).map Prod.swap := by
  rw [nhds_prod_eq, Filter.prod_comm, nhds_prod_eq]; 

Proof state:
α : Type u
β : Type v
γ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
a : α
b : β
⊢ map (fun p => (p.2, p.1)) (𝓝 b ×ˢ 𝓝 a) = map Prod.swap (𝓝 b ×ˢ 𝓝 a)

Next tactic:
rfl
theorem Filter.Tendsto.prod_mk_nhds {γ} {a : α} {b : β} {f : Filter γ} {ma : γ → α} {mb : γ → β}
    (ha : Tendsto ma f (𝓝 a)) (hb : Tendsto mb f (𝓝 b)) :
    Tendsto (fun c => (ma c, mb c)) f (𝓝 (a, b)) := by
  

Proof state:
α : Type u
β : Type v
γ✝ : Type u_1
δ : Type u_2
ε : Type u_3
ζ : Type u_4
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ✝
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
γ : Type u_5
a : α
b : β
f : Filter γ
ma : γ → α
mb : γ → β
ha : Tendsto ma f (𝓝 a)
hb : Tendsto mb f (𝓝 b)
⊢ Tendsto (fun c => (ma c, mb c)) f (𝓝 (a, b))

Next tactic:
rw [nhds_prod_eq]