Theorem: UniformSpace.separation_prod
File: Mathlib/Topology/UniformSpace/Separation.lean

tactic: constructor
state_before: α : Type u
β : Type v
γ : Type w
inst✝² : UniformSpace α
inst✝¹ : UniformSpace β
inst✝ : UniformSpace γ
a₁ a₂ : α
b₁ b₂ : β
⊢ (a₁, b₁) ≈ (a₂, b₂) ↔ a₁ ≈ a₂ ∧ b₁ ≈ b₂

tactic: intro h
state_before: case mp
α : Type u
β : Type v
γ : Type w
inst✝² : UniformSpace α
inst✝¹ : UniformSpace β
inst✝ : UniformSpace γ
a₁ a₂ : α
b₁ b₂ : β
⊢ (a₁, b₁) ≈ (a₂, b₂) → a₁ ≈ a₂ ∧ b₁ ≈ b₂

tactic: exact
  ⟨separated_of_uniformContinuous uniformContinuous_fst h,
    separated_of_uniformContinuous uniformContinuous_snd h⟩
state_before: case mp
α : Type u
β : Type v
γ : Type w
inst✝² : UniformSpace α
inst✝¹ : UniformSpace β
inst✝ : UniformSpace γ
a₁ a₂ : α
b₁ b₂ : β
h : (a₁, b₁) ≈ (a₂, b₂)
⊢ a₁ ≈ a₂ ∧ b₁ ≈ b₂

tactic: rintro ⟨eqv_α, eqv_β⟩ r r_in
state_before: case mpr
α : Type u
β : Type v
γ : Type w
inst✝² : UniformSpace α
inst✝¹ : UniformSpace β
inst✝ : UniformSpace γ
a₁ a₂ : α
b₁ b₂ : β
⊢ a₁ ≈ a₂ ∧ b₁ ≈ b₂ → (a₁, b₁) ≈ (a₂, b₂)

tactic: rw [uniformity_prod] at r_in
state_before: case mpr.intro
α : Type u
β : Type v
γ : Type w
inst✝² : UniformSpace α
inst✝¹ : UniformSpace β
inst✝ : UniformSpace γ
a₁ a₂ : α
b₁ b₂ : β
eqv_α : a₁ ≈ a₂
eqv_β : b₁ ≈ b₂
r : Set ((α × β) × α × β)
r_in : r ∈ (𝓤 (α × β)).sets
⊢ ((a₁, b₁), a₂, b₂) ∈ r

tactic: rcases r_in with ⟨t_α, ⟨r_α, r_α_in, h_α⟩, t_β, ⟨r_β, r_β_in, h_β⟩, rfl⟩
state_before: case mpr.intro
α : Type u
β : Type v
γ : Type w
inst✝² : UniformSpace α
inst✝¹ : UniformSpace β
inst✝ : UniformSpace γ
a₁ a₂ : α
b₁ b₂ : β
eqv_α : a₁ ≈ a₂
eqv_β : b₁ ≈ b₂
r : Set ((α × β) × α × β)
r_in :
  r ∈ (Filter.comap (fun p => (p.fst.fst, p.snd.fst)) (𝓤 α) ⊓ Filter.comap (fun p => (p.fst.snd, p.snd.snd)) (𝓤 β)).sets
⊢ ((a₁, b₁), a₂, b₂) ∈ r

tactic: let p_α := fun p : (α × β) × α × β => (p.1.1, p.2.1)
state_before: case mpr.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : Type u
β : Type v
γ : Type w
inst✝² : UniformSpace α
inst✝¹ : UniformSpace β
inst✝ : UniformSpace γ
a₁ a₂ : α
b₁ b₂ : β
eqv_α : a₁ ≈ a₂
eqv_β : b₁ ≈ b₂
t_α : Set ((α × β) × α × β)
r_α : Set (α × α)
r_α_in : r_α ∈ 𝓤 α
h_α : (fun p => (p.fst.fst, p.snd.fst)) ⁻¹' r_α ⊆ t_α
t_β : Set ((α × β) × α × β)
r_β : Set (β × β)
r_β_in : r_β ∈ 𝓤 β
h_β : (fun p => (p.fst.snd, p.snd.snd)) ⁻¹' r_β ⊆ t_β
⊢ ((a₁, b₁), a₂, b₂) ∈ t_α ∩ t_β

tactic: let p_β := fun p : (α × β) × α × β => (p.1.2, p.2.2)
state_before: case mpr.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : Type u
β : Type v
γ : Type w
inst✝² : UniformSpace α
inst✝¹ : UniformSpace β
inst✝ : UniformSpace γ
a₁ a₂ : α
b₁ b₂ : β
eqv_α : a₁ ≈ a₂
eqv_β : b₁ ≈ b₂
t_α : Set ((α × β) × α × β)
r_α : Set (α × α)
r_α_in : r_α ∈ 𝓤 α
h_α : (fun p => (p.fst.fst, p.snd.fst)) ⁻¹' r_α ⊆ t_α
t_β : Set ((α × β) × α × β)
r_β : Set (β × β)
r_β_in : r_β ∈ 𝓤 β
h_β : (fun p => (p.fst.snd, p.snd.snd)) ⁻¹' r_β ⊆ t_β
p_α : (α × β) × α × β → α × α := fun p => (p.fst.fst, p.snd.fst)
⊢ ((a₁, b₁), a₂, b₂) ∈ t_α ∩ t_β

tactic: have key_α : p_α ((a₁, b₁), (a₂, b₂)) ∈ r_α := by simp [eqv_α r_α r_α_in]
state_before: case mpr.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : Type u
β : Type v
γ : Type w
inst✝² : UniformSpace α
inst✝¹ : UniformSpace β
inst✝ : UniformSpace γ
a₁ a₂ : α
b₁ b₂ : β
eqv_α : a₁ ≈ a₂
eqv_β : b₁ ≈ b₂
t_α : Set ((α × β) × α × β)
r_α : Set (α × α)
r_α_in : r_α ∈ 𝓤 α
h_α : (fun p => (p.fst.fst, p.snd.fst)) ⁻¹' r_α ⊆ t_α
t_β : Set ((α × β) × α × β)
r_β : Set (β × β)
r_β_in : r_β ∈ 𝓤 β
h_β : (fun p => (p.fst.snd, p.snd.snd)) ⁻¹' r_β ⊆ t_β
p_α : (α × β) × α × β → α × α := fun p => (p.fst.fst, p.snd.fst)
p_β : (α × β) × α × β → β × β := fun p => (p.fst.snd, p.snd.snd)
⊢ ((a₁, b₁), a₂, b₂) ∈ t_α ∩ t_β

tactic: have key_β : p_β ((a₁, b₁), (a₂, b₂)) ∈ r_β := by simp [eqv_β r_β r_β_in]
state_before: case mpr.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : Type u
β : Type v
γ : Type w
inst✝² : UniformSpace α
inst✝¹ : UniformSpace β
inst✝ : UniformSpace γ
a₁ a₂ : α
b₁ b₂ : β
eqv_α : a₁ ≈ a₂
eqv_β : b₁ ≈ b₂
t_α : Set ((α × β) × α × β)
r_α : Set (α × α)
r_α_in : r_α ∈ 𝓤 α
h_α : (fun p => (p.fst.fst, p.snd.fst)) ⁻¹' r_α ⊆ t_α
t_β : Set ((α × β) × α × β)
r_β : Set (β × β)
r_β_in : r_β ∈ 𝓤 β
h_β : (fun p => (p.fst.snd, p.snd.snd)) ⁻¹' r_β ⊆ t_β
p_α : (α × β) × α × β → α × α := fun p => (p.fst.fst, p.snd.fst)
p_β : (α × β) × α × β → β × β := fun p => (p.fst.snd, p.snd.snd)
key_α : p_α ((a₁, b₁), a₂, b₂) ∈ r_α
⊢ ((a₁, b₁), a₂, b₂) ∈ t_α ∩ t_β

tactic: exact ⟨h_α key_α, h_β key_β⟩
state_before: case mpr.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : Type u
β : Type v
γ : Type w
inst✝² : UniformSpace α
inst✝¹ : UniformSpace β
inst✝ : UniformSpace γ
a₁ a₂ : α
b₁ b₂ : β
eqv_α : a₁ ≈ a₂
eqv_β : b₁ ≈ b₂
t_α : Set ((α × β) × α × β)
r_α : Set (α × α)
r_α_in : r_α ∈ 𝓤 α
h_α : (fun p => (p.fst.fst, p.snd.fst)) ⁻¹' r_α ⊆ t_α
t_β : Set ((α × β) × α × β)
r_β : Set (β × β)
r_β_in : r_β ∈ 𝓤 β
h_β : (fun p => (p.fst.snd, p.snd.snd)) ⁻¹' r_β ⊆ t_β
p_α : (α × β) × α × β → α × α := fun p => (p.fst.fst, p.snd.fst)
p_β : (α × β) × α × β → β × β := fun p => (p.fst.snd, p.snd.snd)
key_α : p_α ((a₁, b₁), a₂, b₂) ∈ r_α
key_β : p_β ((a₁, b₁), a₂, b₂) ∈ r_β
⊢ ((a₁, b₁), a₂, b₂) ∈ t_α ∩ t_β

tactic: simp [eqv_α r_α r_α_in]
state_before: α : Type u
β : Type v
γ : Type w
inst✝² : UniformSpace α
inst✝¹ : UniformSpace β
inst✝ : UniformSpace γ
a₁ a₂ : α
b₁ b₂ : β
eqv_α : a₁ ≈ a₂
eqv_β : b₁ ≈ b₂
t_α : Set ((α × β) × α × β)
r_α : Set (α × α)
r_α_in : r_α ∈ 𝓤 α
h_α : (fun p => (p.fst.fst, p.snd.fst)) ⁻¹' r_α ⊆ t_α
t_β : Set ((α × β) × α × β)
r_β : Set (β × β)
r_β_in : r_β ∈ 𝓤 β
h_β : (fun p => (p.fst.snd, p.snd.snd)) ⁻¹' r_β ⊆ t_β
p_α : (α × β) × α × β → α × α := fun p => (p.fst.fst, p.snd.fst)
p_β : (α × β) × α × β → β × β := fun p => (p.fst.snd, p.snd.snd)
⊢ p_α ((a₁, b₁), a₂, b₂) ∈ r_α

tactic: simp [eqv_β r_β r_β_in]
state_before: α : Type u
β : Type v
γ : Type w
inst✝² : UniformSpace α
inst✝¹ : UniformSpace β
inst✝ : UniformSpace γ
a₁ a₂ : α
b₁ b₂ : β
eqv_α : a₁ ≈ a₂
eqv_β : b₁ ≈ b₂
t_α : Set ((α × β) × α × β)
r_α : Set (α × α)
r_α_in : r_α ∈ 𝓤 α
h_α : (fun p => (p.fst.fst, p.snd.fst)) ⁻¹' r_α ⊆ t_α
t_β : Set ((α × β) × α × β)
r_β : Set (β × β)
r_β_in : r_β ∈ 𝓤 β
h_β : (fun p => (p.fst.snd, p.snd.snd)) ⁻¹' r_β ⊆ t_β
p_α : (α × β) × α × β → α × α := fun p => (p.fst.fst, p.snd.fst)
p_β : (α × β) × α × β → β × β := fun p => (p.fst.snd, p.snd.snd)
key_α : p_α ((a₁, b₁), a₂, b₂) ∈ r_α
⊢ p_β ((a₁, b₁), a₂, b₂) ∈ r_β