Theorem: UniformCauchySeqOn.prod_map
File: Mathlib/Topology/UniformSpace/UniformConvergence.lean

tactic: intro u hu
state_before: α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s'✝ : Set α
x : α
p : Filter ι
p'✝ : Filter α
g : ι → α
ι' : Type u_1
α' : Type u_2
β' : Type u_3
inst✝ : UniformSpace β'
F' : ι' → α' → β'
p' : Filter ι'
s' : Set α'
h : UniformCauchySeqOn F p s
h' : UniformCauchySeqOn F' p' s'
⊢ UniformCauchySeqOn (fun i => Prod.map (F i.fst) (F' i.snd)) (p ×ˢ p') (s ×ˢ s')

tactic: rw [uniformity_prod_eq_prod, mem_map, mem_prod_iff] at hu
state_before: α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s'✝ : Set α
x : α
p : Filter ι
p'✝ : Filter α
g : ι → α
ι' : Type u_1
α' : Type u_2
β' : Type u_3
inst✝ : UniformSpace β'
F' : ι' → α' → β'
p' : Filter ι'
s' : Set α'
h : UniformCauchySeqOn F p s
h' : UniformCauchySeqOn F' p' s'
u : Set ((β × β') × β × β')
hu : u ∈ 𝓤 (β × β')
⊢ ∀ᶠ (m : (ι × ι') × ι × ι') in (p ×ˢ p') ×ˢ p ×ˢ p',
    ∀ (x : α × α'),
      x ∈ s ×ˢ s' →
        ((fun i => Prod.map (F i.fst) (F' i.snd)) m.fst x, (fun i => Prod.map (F i.fst) (F' i.snd)) m.snd x) ∈ u

tactic: obtain ⟨v, hv, w, hw, hvw⟩ := hu
state_before: α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s'✝ : Set α
x : α
p : Filter ι
p'✝ : Filter α
g : ι → α
ι' : Type u_1
α' : Type u_2
β' : Type u_3
inst✝ : UniformSpace β'
F' : ι' → α' → β'
p' : Filter ι'
s' : Set α'
h : UniformCauchySeqOn F p s
h' : UniformCauchySeqOn F' p' s'
u : Set ((β × β') × β × β')
hu : ∃ t₁, t₁ ∈ 𝓤 β ∧ ∃ t₂, t₂ ∈ 𝓤 β' ∧ t₁ ×ˢ t₂ ⊆ (fun p => ((p.fst.fst, p.snd.fst), p.fst.snd, p.snd.snd)) ⁻¹' u
⊢ ∀ᶠ (m : (ι × ι') × ι × ι') in (p ×ˢ p') ×ˢ p ×ˢ p',
    ∀ (x : α × α'),
      x ∈ s ×ˢ s' →
        ((fun i => Prod.map (F i.fst) (F' i.snd)) m.fst x, (fun i => Prod.map (F i.fst) (F' i.snd)) m.snd x) ∈ u

tactic: simp_rw [mem_prod, Prod_map, and_imp, Prod.forall]
state_before: case intro.intro.intro.intro
α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s'✝ : Set α
x : α
p : Filter ι
p'✝ : Filter α
g : ι → α
ι' : Type u_1
α' : Type u_2
β' : Type u_3
inst✝ : UniformSpace β'
F' : ι' → α' → β'
p' : Filter ι'
s' : Set α'
h : UniformCauchySeqOn F p s
h' : UniformCauchySeqOn F' p' s'
u : Set ((β × β') × β × β')
v : Set (β × β)
hv : v ∈ 𝓤 β
w : Set (β' × β')
hw : w ∈ 𝓤 β'
hvw : v ×ˢ w ⊆ (fun p => ((p.fst.fst, p.snd.fst), p.fst.snd, p.snd.snd)) ⁻¹' u
⊢ ∀ᶠ (m : (ι × ι') × ι × ι') in (p ×ˢ p') ×ˢ p ×ˢ p',
    ∀ (x : α × α'),
      x ∈ s ×ˢ s' →
        ((fun i => Prod.map (F i.fst) (F' i.snd)) m.fst x, (fun i => Prod.map (F i.fst) (F' i.snd)) m.snd x) ∈ u

tactic: rw [← Set.image_subset_iff] at hvw
state_before: case intro.intro.intro.intro
α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s'✝ : Set α
x : α
p : Filter ι
p'✝ : Filter α
g : ι → α
ι' : Type u_1
α' : Type u_2
β' : Type u_3
inst✝ : UniformSpace β'
F' : ι' → α' → β'
p' : Filter ι'
s' : Set α'
h : UniformCauchySeqOn F p s
h' : UniformCauchySeqOn F' p' s'
u : Set ((β × β') × β × β')
v : Set (β × β)
hv : v ∈ 𝓤 β
w : Set (β' × β')
hw : w ∈ 𝓤 β'
hvw : v ×ˢ w ⊆ (fun p => ((p.fst.fst, p.snd.fst), p.fst.snd, p.snd.snd)) ⁻¹' u
⊢ ∀ᶠ (m : (ι × ι') × ι × ι') in (p ×ˢ p') ×ˢ p ×ˢ p',
    ∀ (a : α) (b : α'), a ∈ s → b ∈ s' → ((F m.fst.fst a, F' m.fst.snd b), F m.snd.fst a, F' m.snd.snd b) ∈ u

tactic: apply (tendsto_swap4_prod.eventually ((h v hv).prod_mk (h' w hw))).mono
state_before: case intro.intro.intro.intro
α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s'✝ : Set α
x : α
p : Filter ι
p'✝ : Filter α
g : ι → α
ι' : Type u_1
α' : Type u_2
β' : Type u_3
inst✝ : UniformSpace β'
F' : ι' → α' → β'
p' : Filter ι'
s' : Set α'
h : UniformCauchySeqOn F p s
h' : UniformCauchySeqOn F' p' s'
u : Set ((β × β') × β × β')
v : Set (β × β)
hv : v ∈ 𝓤 β
w : Set (β' × β')
hw : w ∈ 𝓤 β'
hvw : (fun p => ((p.fst.fst, p.snd.fst), p.fst.snd, p.snd.snd)) '' v ×ˢ w ⊆ u
⊢ ∀ᶠ (m : (ι × ι') × ι × ι') in (p ×ˢ p') ×ˢ p ×ˢ p',
    ∀ (a : α) (b : α'), a ∈ s → b ∈ s' → ((F m.fst.fst a, F' m.fst.snd b), F m.snd.fst a, F' m.snd.snd b) ∈ u

tactic: intro x hx a b ha hb
state_before: case intro.intro.intro.intro
α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s'✝ : Set α
x : α
p : Filter ι
p'✝ : Filter α
g : ι → α
ι' : Type u_1
α' : Type u_2
β' : Type u_3
inst✝ : UniformSpace β'
F' : ι' → α' → β'
p' : Filter ι'
s' : Set α'
h : UniformCauchySeqOn F p s
h' : UniformCauchySeqOn F' p' s'
u : Set ((β × β') × β × β')
v : Set (β × β)
hv : v ∈ 𝓤 β
w : Set (β' × β')
hw : w ∈ 𝓤 β'
hvw : (fun p => ((p.fst.fst, p.snd.fst), p.fst.snd, p.snd.snd)) '' v ×ˢ w ⊆ u
⊢ ∀ (x : (ι × ι') × ι × ι'),
    ((∀ (x_1 : α),
          x_1 ∈ s →
            (F ((x.fst.fst, x.snd.fst), x.fst.snd, x.snd.snd).fst.fst x_1,
                F ((x.fst.fst, x.snd.fst), x.fst.snd, x.snd.snd).fst.snd x_1) ∈
              v) ∧
        ∀ (x_1 : α'),
          x_1 ∈ s' →
            (F' ((x.fst.fst, x.snd.fst), x.fst.snd, x.snd.snd).snd.fst x_1,
                F' ((x.fst.fst, x.snd.fst), x.fst.snd, x.snd.snd).snd.snd x_1) ∈
              w) →
      ∀ (a : α) (b : α'), a ∈ s → b ∈ s' → ((F x.fst.fst a, F' x.fst.snd b), F x.snd.fst a, F' x.snd.snd b) ∈ u

tactic: refine' hvw ⟨_, mk_mem_prod (hx.1 a ha) (hx.2 b hb), rfl⟩
state_before: case intro.intro.intro.intro
α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s'✝ : Set α
x✝ : α
p : Filter ι
p'✝ : Filter α
g : ι → α
ι' : Type u_1
α' : Type u_2
β' : Type u_3
inst✝ : UniformSpace β'
F' : ι' → α' → β'
p' : Filter ι'
s' : Set α'
h : UniformCauchySeqOn F p s
h' : UniformCauchySeqOn F' p' s'
u : Set ((β × β') × β × β')
v : Set (β × β)
hv : v ∈ 𝓤 β
w : Set (β' × β')
hw : w ∈ 𝓤 β'
hvw : (fun p => ((p.fst.fst, p.snd.fst), p.fst.snd, p.snd.snd)) '' v ×ˢ w ⊆ u
x : (ι × ι') × ι × ι'
hx :
  (∀ (x_1 : α),
      x_1 ∈ s →
        (F ((x.fst.fst, x.snd.fst), x.fst.snd, x.snd.snd).fst.fst x_1,
            F ((x.fst.fst, x.snd.fst), x.fst.snd, x.snd.snd).fst.snd x_1) ∈
          v) ∧
    ∀ (x_1 : α'),
      x_1 ∈ s' →
        (F' ((x.fst.fst, x.snd.fst), x.fst.snd, x.snd.snd).snd.fst x_1,
            F' ((x.fst.fst, x.snd.fst), x.fst.snd, x.snd.snd).snd.snd x_1) ∈
          w
a : α
b : α'
ha : a ∈ s
hb : b ∈ s'
⊢ ((F x.fst.fst a, F' x.fst.snd b), F x.snd.fst a, F' x.snd.snd b) ∈ u