l3lab/ntp-mathlib huggingface dataset:
@[to_additive]
-- Porting note: renamed theorem to conform to naming convention
theorem comm_topologicalGroup_is_uniform : UniformGroup G := by
  have :
    Tendsto
      ((fun p : G × G => p.1 / p.2) ∘ fun p : (G × G) × G × G => (p.1.2 / p.1.1, p.2.2 / p.2.1))
      (comap (fun p : (G × G) × G × G => (p.1.2 / p.1.1, p.2.2 / p.2.1)) ((𝓝 1).prod (𝓝 1)))
      (𝓝 (1 / 1)) :=
    (tendsto_fst.div' tendsto_snd).comp tendsto_comap
  constructor
  rw [UniformContinuous, uniformity_prod_eq_prod, tendsto_map'_iff, uniformity_eq_comap_nhds_one' G,
    tendsto_comap_iff, prod_comap_comap_eq]
  simp only [Function.comp, div_eq_mul_inv, mul_inv_rev, inv_inv, mul_comm, mul_left_comm] at *
  

Proof state:
case uniformContinuous_div
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this :
  Tendsto (fun x => x.2.1 * (x.1.2 * x.1.1⁻¹ * x.2.2⁻¹))
    (comap (fun p => (p.1.2 * p.1.1⁻¹, p.2.2 * p.2.1⁻¹)) (Filter.prod (𝓝 1) (𝓝 1))) (𝓝 (1 * 1⁻¹))
⊢ Tendsto (fun x => x.1.2 * (x.2.1 * x.1.1⁻¹ * x.2.2⁻¹))
    (comap (fun p => (p.1.2 * p.1.1⁻¹, p.2.2 * p.2.1⁻¹)) (𝓝 1 ×ˢ 𝓝 1)) (𝓝 1)

Next tactic:
simp only [inv_one, mul_one, ← mul_assoc] at this
@[to_additive]
-- Porting note: renamed theorem to conform to naming convention
theorem comm_topologicalGroup_is_uniform : UniformGroup G := by
  have :
    Tendsto
      ((fun p : G × G => p.1 / p.2) ∘ fun p : (G × G) × G × G => (p.1.2 / p.1.1, p.2.2 / p.2.1))
      (comap (fun p : (G × G) × G × G => (p.1.2 / p.1.1, p.2.2 / p.2.1)) ((𝓝 1).prod (𝓝 1)))
      (𝓝 (1 / 1)) :=
    (tendsto_fst.div' tendsto_snd).comp tendsto_comap
  constructor
  rw [UniformContinuous, uniformity_prod_eq_prod, tendsto_map'_iff, uniformity_eq_comap_nhds_one' G,
    tendsto_comap_iff, prod_comap_comap_eq]
  simp only [Function.comp, div_eq_mul_inv, mul_inv_rev, inv_inv, mul_comm, mul_left_comm] at *
  simp only [inv_one, mul_one, ← mul_assoc] at this
  

Proof state:
case uniformContinuous_div
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this :
  Tendsto (fun x => x.2.1 * x.1.2 * x.1.1⁻¹ * x.2.2⁻¹)
    (comap (fun p => (p.1.2 * p.1.1⁻¹, p.2.2 * p.2.1⁻¹)) (Filter.prod (𝓝 1) (𝓝 1))) (𝓝 1)
⊢ Tendsto (fun x => x.1.2 * (x.2.1 * x.1.1⁻¹ * x.2.2⁻¹))
    (comap (fun p => (p.1.2 * p.1.1⁻¹, p.2.2 * p.2.1⁻¹)) (𝓝 1 ×ˢ 𝓝 1)) (𝓝 1)

Next tactic:
simp_rw [← mul_assoc, mul_comm]
@[to_additive]
-- Porting note: renamed theorem to conform to naming convention
theorem comm_topologicalGroup_is_uniform : UniformGroup G := by
  have :
    Tendsto
      ((fun p : G × G => p.1 / p.2) ∘ fun p : (G × G) × G × G => (p.1.2 / p.1.1, p.2.2 / p.2.1))
      (comap (fun p : (G × G) × G × G => (p.1.2 / p.1.1, p.2.2 / p.2.1)) ((𝓝 1).prod (𝓝 1)))
      (𝓝 (1 / 1)) :=
    (tendsto_fst.div' tendsto_snd).comp tendsto_comap
  constructor
  rw [UniformContinuous, uniformity_prod_eq_prod, tendsto_map'_iff, uniformity_eq_comap_nhds_one' G,
    tendsto_comap_iff, prod_comap_comap_eq]
  simp only [Function.comp, div_eq_mul_inv, mul_inv_rev, inv_inv, mul_comm, mul_left_comm] at *
  simp only [inv_one, mul_one, ← mul_assoc] at this
  simp_rw [← mul_assoc, mul_comm]
  

Proof state:
case uniformContinuous_div
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this :
  Tendsto (fun x => x.2.1 * x.1.2 * x.1.1⁻¹ * x.2.2⁻¹)
    (comap (fun p => (p.1.2 * p.1.1⁻¹, p.2.2 * p.2.1⁻¹)) (Filter.prod (𝓝 1) (𝓝 1))) (𝓝 1)
⊢ Tendsto (fun x => x.2.1 * x.1.2 * x.1.1⁻¹ * x.2.2⁻¹)
    (comap (fun p => (p.1.2 * p.1.1⁻¹, p.2.2 * p.2.1⁻¹)) (𝓝 1 ×ˢ 𝓝 1)) (𝓝 1)

Next tactic:
assumption
@[to_additive]
theorem UniformGroup.toUniformSpace_eq {G : Type*} [u : UniformSpace G] [Group G]
    [UniformGroup G] : TopologicalGroup.toUniformSpace G = u := by
  

Proof state:
G✝ : Type u_1
inst✝⁴ : CommGroup G✝
inst✝³ : TopologicalSpace G✝
inst✝² : TopologicalGroup G✝
G : Type u_2
u : UniformSpace G
inst✝¹ : Group G
inst✝ : UniformGroup G
⊢ TopologicalGroup.toUniformSpace G = u

Next tactic:
ext : 1
@[to_additive]
theorem UniformGroup.toUniformSpace_eq {G : Type*} [u : UniformSpace G] [Group G]
    [UniformGroup G] : TopologicalGroup.toUniformSpace G = u := by
  ext : 1
  

Proof state:
case a
G✝ : Type u_1
inst✝⁴ : CommGroup G✝
inst✝³ : TopologicalSpace G✝
inst✝² : TopologicalGroup G✝
G : Type u_2
u : UniformSpace G
inst✝¹ : Group G
inst✝ : UniformGroup G
⊢ 𝓤 G = 𝓤 G

Next tactic:
rw [uniformity_eq_comap_nhds_one' G, uniformity_eq_comap_nhds_one G]
@[to_additive]
theorem tendsto_div_comap_self (x₀ : α) :
    Tendsto (fun t : β × β => t.2 / t.1) ((comap fun p : β × β => (e p.1, e p.2)) <| 𝓝 (x₀, x₀))
      (𝓝 1) := by
  

Proof state:
α : Type u_1
β : Type u_2
hom : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : Group α
inst✝³ : TopologicalGroup α
inst✝² : TopologicalSpace β
inst✝¹ : Group β
inst✝ : MonoidHomClass hom β α
e : hom
de : DenseInducing ⇑e
x₀ : α
⊢ Tendsto (fun t => t.2 / t.1) (comap (fun p => (e p.1, e p.2)) (𝓝 (x₀, x₀))) (𝓝 1)

Next tactic:
have comm : ((fun x : α × α => x.2 / x.1) ∘ fun t : β × β => (e t.1, e t.2)) =
      e ∘ fun t : β × β => t.2 / t.1 := by
    ext t
    change e t.2 / e t.1 = e (t.2 / t.1)
    rw [← map_div e t.2 t.1]
@[to_additive]
theorem tendsto_div_comap_self (x₀ : α) :
    Tendsto (fun t : β × β => t.2 / t.1) ((comap fun p : β × β => (e p.1, e p.2)) <| 𝓝 (x₀, x₀))
      (𝓝 1) := by
  have comm : ((fun x : α × α => x.2 / x.1) ∘ fun t : β × β => (e t.1, e t.2)) =
      e ∘ fun t : β × β => t.2 / t.1 := by
    

Proof state:
α : Type u_1
β : Type u_2
hom : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : Group α
inst✝³ : TopologicalGroup α
inst✝² : TopologicalSpace β
inst✝¹ : Group β
inst✝ : MonoidHomClass hom β α
e : hom
de : DenseInducing ⇑e
x₀ : α
⊢ ((fun x => x.2 / x.1) ∘ fun t => (e t.1, e t.2)) = ⇑e ∘ fun t => t.2 / t.1

Next tactic:
ext t
@[to_additive]
theorem tendsto_div_comap_self (x₀ : α) :
    Tendsto (fun t : β × β => t.2 / t.1) ((comap fun p : β × β => (e p.1, e p.2)) <| 𝓝 (x₀, x₀))
      (𝓝 1) := by
  have comm : ((fun x : α × α => x.2 / x.1) ∘ fun t : β × β => (e t.1, e t.2)) =
      e ∘ fun t : β × β => t.2 / t.1 := by
    ext t
    

Proof state:
case h
α : Type u_1
β : Type u_2
hom : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : Group α
inst✝³ : TopologicalGroup α
inst✝² : TopologicalSpace β
inst✝¹ : Group β
inst✝ : MonoidHomClass hom β α
e : hom
de : DenseInducing ⇑e
x₀ : α
t : β × β
⊢ ((fun x => x.2 / x.1) ∘ fun t => (e t.1, e t.2)) t = (⇑e ∘ fun t => t.2 / t.1) t

Next tactic:
change e t.2 / e t.1 = e (t.2 / t.1)
@[to_additive]
theorem tendsto_div_comap_self (x₀ : α) :
    Tendsto (fun t : β × β => t.2 / t.1) ((comap fun p : β × β => (e p.1, e p.2)) <| 𝓝 (x₀, x₀))
      (𝓝 1) := by
  have comm : ((fun x : α × α => x.2 / x.1) ∘ fun t : β × β => (e t.1, e t.2)) =
      e ∘ fun t : β × β => t.2 / t.1 := by
    ext t
    change e t.2 / e t.1 = e (t.2 / t.1)
    

Proof state:
case h
α : Type u_1
β : Type u_2
hom : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : Group α
inst✝³ : TopologicalGroup α
inst✝² : TopologicalSpace β
inst✝¹ : Group β
inst✝ : MonoidHomClass hom β α
e : hom
de : DenseInducing ⇑e
x₀ : α
t : β × β
⊢ e t.2 / e t.1 = e (t.2 / t.1)

Next tactic:
rw [← map_div e t.2 t.1]
@[to_additive]
theorem tendsto_div_comap_self (x₀ : α) :
    Tendsto (fun t : β × β => t.2 / t.1) ((comap fun p : β × β => (e p.1, e p.2)) <| 𝓝 (x₀, x₀))
      (𝓝 1) := by
  have comm : ((fun x : α × α => x.2 / x.1) ∘ fun t : β × β => (e t.1, e t.2)) =
      e ∘ fun t : β × β => t.2 / t.1 := by
    ext t
    change e t.2 / e t.1 = e (t.2 / t.1)
    rw [← map_div e t.2 t.1]
  

Proof state:
α : Type u_1
β : Type u_2
hom : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : Group α
inst✝³ : TopologicalGroup α
inst✝² : TopologicalSpace β
inst✝¹ : Group β
inst✝ : MonoidHomClass hom β α
e : hom
de : DenseInducing ⇑e
x₀ : α
comm : ((fun x => x.2 / x.1) ∘ fun t => (e t.1, e t.2)) = ⇑e ∘ fun t => t.2 / t.1
⊢ Tendsto (fun t => t.2 / t.1) (comap (fun p => (e p.1, e p.2)) (𝓝 (x₀, x₀))) (𝓝 1)

Next tactic:
have lim : Tendsto (fun x : α × α => x.2 / x.1) (𝓝 (x₀, x₀)) (𝓝 (e 1)) := by
    simpa using (continuous_div'.comp (@continuous_swap α α _ _)).tendsto (x₀, x₀)
@[to_additive]
theorem tendsto_div_comap_self (x₀ : α) :
    Tendsto (fun t : β × β => t.2 / t.1) ((comap fun p : β × β => (e p.1, e p.2)) <| 𝓝 (x₀, x₀))
      (𝓝 1) := by
  have comm : ((fun x : α × α => x.2 / x.1) ∘ fun t : β × β => (e t.1, e t.2)) =
      e ∘ fun t : β × β => t.2 / t.1 := by
    ext t
    change e t.2 / e t.1 = e (t.2 / t.1)
    rw [← map_div e t.2 t.1]
  have lim : Tendsto (fun x : α × α => x.2 / x.1) (𝓝 (x₀, x₀)) (𝓝 (e 1)) := by
    

Proof state:
α : Type u_1
β : Type u_2
hom : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : Group α
inst✝³ : TopologicalGroup α
inst✝² : TopologicalSpace β
inst✝¹ : Group β
inst✝ : MonoidHomClass hom β α
e : hom
de : DenseInducing ⇑e
x₀ : α
comm : ((fun x => x.2 / x.1) ∘ fun t => (e t.1, e t.2)) = ⇑e ∘ fun t => t.2 / t.1
⊢ Tendsto (fun x => x.2 / x.1) (𝓝 (x₀, x₀)) (𝓝 (e 1))

Next tactic:
simpa using (continuous_div'.comp (@continuous_swap α α _ _)).tendsto (x₀, x₀)
@[to_additive]
theorem tendsto_div_comap_self (x₀ : α) :
    Tendsto (fun t : β × β => t.2 / t.1) ((comap fun p : β × β => (e p.1, e p.2)) <| 𝓝 (x₀, x₀))
      (𝓝 1) := by
  have comm : ((fun x : α × α => x.2 / x.1) ∘ fun t : β × β => (e t.1, e t.2)) =
      e ∘ fun t : β × β => t.2 / t.1 := by
    ext t
    change e t.2 / e t.1 = e (t.2 / t.1)
    rw [← map_div e t.2 t.1]
  have lim : Tendsto (fun x : α × α => x.2 / x.1) (𝓝 (x₀, x₀)) (𝓝 (e 1)) := by
    simpa using (continuous_div'.comp (@continuous_swap α α _ _)).tendsto (x₀, x₀)
  

Proof state:
α : Type u_1
β : Type u_2
hom : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : Group α
inst✝³ : TopologicalGroup α
inst✝² : TopologicalSpace β
inst✝¹ : Group β
inst✝ : MonoidHomClass hom β α
e : hom
de : DenseInducing ⇑e
x₀ : α
comm : ((fun x => x.2 / x.1) ∘ fun t => (e t.1, e t.2)) = ⇑e ∘ fun t => t.2 / t.1
lim : Tendsto (fun x => x.2 / x.1) (𝓝 (x₀, x₀)) (𝓝 (e 1))
⊢ Tendsto (fun t => t.2 / t.1) (comap (fun p => (e p.1, e p.2)) (𝓝 (x₀, x₀))) (𝓝 1)

Next tactic:
simpa using de.tendsto_comap_nhds_nhds lim comm
private theorem extend_Z_bilin_aux (x₀ : α) (y₁ : δ) : ∃ U₂ ∈ comap e (𝓝 x₀), ∀ (x) (_ : x ∈ U₂)
    (x') (_ : x' ∈ U₂), (fun p : β × δ => φ p.1 p.2) (x' - x, y₁) ∈ W' := by
  

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
G : Type u_5
inst✝¹⁶ : TopologicalSpace α
inst✝¹⁵ : AddCommGroup α
inst✝¹⁴ : TopologicalAddGroup α
inst✝¹³ : TopologicalSpace β
inst✝¹² : AddCommGroup β
inst✝¹¹ : TopologicalAddGroup β
inst✝¹⁰ : TopologicalSpace γ
inst✝⁹ : AddCommGroup γ
inst✝⁸ : TopologicalAddGroup γ
inst✝⁷ : TopologicalSpace δ
inst✝⁶ : AddCommGroup δ
inst✝⁵ : TopologicalAddGroup δ
inst✝⁴ : UniformSpace G
inst✝³ : AddCommGroup G
inst✝² : UniformAddGroup G
inst✝¹ : SeparatedSpace G
inst✝ : CompleteSpace G
e : β →+ α
de : DenseInducing ⇑e
f : δ →+ γ
df : DenseInducing ⇑f
φ : β →+ δ →+ G
hφ : Continuous fun p => (φ p.1) p.2
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
⊢ ∃ U₂ ∈ comap (⇑e) (𝓝 x₀), ∀ x ∈ U₂, ∀ x' ∈ U₂, (fun p => (φ p.1) p.2) (x' - x, y₁) ∈ W'

Next tactic:
let Nx := 𝓝 x₀
private theorem extend_Z_bilin_aux (x₀ : α) (y₁ : δ) : ∃ U₂ ∈ comap e (𝓝 x₀), ∀ (x) (_ : x ∈ U₂)
    (x') (_ : x' ∈ U₂), (fun p : β × δ => φ p.1 p.2) (x' - x, y₁) ∈ W' := by
  let Nx := 𝓝 x₀
  

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
G : Type u_5
inst✝¹⁶ : TopologicalSpace α
inst✝¹⁵ : AddCommGroup α
inst✝¹⁴ : TopologicalAddGroup α
inst✝¹³ : TopologicalSpace β
inst✝¹² : AddCommGroup β
inst✝¹¹ : TopologicalAddGroup β
inst✝¹⁰ : TopologicalSpace γ
inst✝⁹ : AddCommGroup γ
inst✝⁸ : TopologicalAddGroup γ
inst✝⁷ : TopologicalSpace δ
inst✝⁶ : AddCommGroup δ
inst✝⁵ : TopologicalAddGroup δ
inst✝⁴ : UniformSpace G
inst✝³ : AddCommGroup G
inst✝² : UniformAddGroup G
inst✝¹ : SeparatedSpace G
inst✝ : CompleteSpace G
e : β →+ α
de : DenseInducing ⇑e
f : δ →+ γ
df : DenseInducing ⇑f
φ : β →+ δ →+ G
hφ : Continuous fun p => (φ p.1) p.2
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
⊢ ∃ U₂ ∈ comap (⇑e) (𝓝 x₀), ∀ x ∈ U₂, ∀ x' ∈ U₂, (fun p => (φ p.1) p.2) (x' - x, y₁) ∈ W'

Next tactic:
let ee := fun u : β × β => (e u.1, e u.2)
private theorem extend_Z_bilin_aux (x₀ : α) (y₁ : δ) : ∃ U₂ ∈ comap e (𝓝 x₀), ∀ (x) (_ : x ∈ U₂)
    (x') (_ : x' ∈ U₂), (fun p : β × δ => φ p.1 p.2) (x' - x, y₁) ∈ W' := by
  let Nx := 𝓝 x₀
  let ee := fun u : β × β => (e u.1, e u.2)
  

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
G : Type u_5
inst✝¹⁶ : TopologicalSpace α
inst✝¹⁵ : AddCommGroup α
inst✝¹⁴ : TopologicalAddGroup α
inst✝¹³ : TopologicalSpace β
inst✝¹² : AddCommGroup β
inst✝¹¹ : TopologicalAddGroup β
inst✝¹⁰ : TopologicalSpace γ
inst✝⁹ : AddCommGroup γ
inst✝⁸ : TopologicalAddGroup γ
inst✝⁷ : TopologicalSpace δ
inst✝⁶ : AddCommGroup δ
inst✝⁵ : TopologicalAddGroup δ
inst✝⁴ : UniformSpace G
inst✝³ : AddCommGroup G
inst✝² : UniformAddGroup G
inst✝¹ : SeparatedSpace G
inst✝ : CompleteSpace G
e : β →+ α
de : DenseInducing ⇑e
f : δ →+ γ
df : DenseInducing ⇑f
φ : β →+ δ →+ G
hφ : Continuous fun p => (φ p.1) p.2
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : β × β → α × α := fun u => (e u.1, e u.2)
⊢ ∃ U₂ ∈ comap (⇑e) (𝓝 x₀), ∀ x ∈ U₂, ∀ x' ∈ U₂, (fun p => (φ p.1) p.2) (x' - x, y₁) ∈ W'

Next tactic:
have lim1 : Tendsto (fun a : β × β => (a.2 - a.1, y₁))
      (comap e Nx ×ˢ comap e Nx) (𝓝 (0, y₁)) := by
    have := Tendsto.prod_mk (tendsto_sub_comap_self de x₀)
      (tendsto_const_nhds : Tendsto (fun _ : β × β => y₁) (comap ee <| 𝓝 (x₀, x₀)) (𝓝 y₁))
    rw [nhds_prod_eq, prod_comap_comap_eq, ← nhds_prod_eq]
    exact (this : _)
private theorem extend_Z_bilin_aux (x₀ : α) (y₁ : δ) : ∃ U₂ ∈ comap e (𝓝 x₀), ∀ (x) (_ : x ∈ U₂)
    (x') (_ : x' ∈ U₂), (fun p : β × δ => φ p.1 p.2) (x' - x, y₁) ∈ W' := by
  let Nx := 𝓝 x₀
  let ee := fun u : β × β => (e u.1, e u.2)
  have lim1 : Tendsto (fun a : β × β => (a.2 - a.1, y₁))
      (comap e Nx ×ˢ comap e Nx) (𝓝 (0, y₁)) := by
    

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
G : Type u_5
inst✝¹⁶ : TopologicalSpace α
inst✝¹⁵ : AddCommGroup α
inst✝¹⁴ : TopologicalAddGroup α
inst✝¹³ : TopologicalSpace β
inst✝¹² : AddCommGroup β
inst✝¹¹ : TopologicalAddGroup β
inst✝¹⁰ : TopologicalSpace γ
inst✝⁹ : AddCommGroup γ
inst✝⁸ : TopologicalAddGroup γ
inst✝⁷ : TopologicalSpace δ
inst✝⁶ : AddCommGroup δ
inst✝⁵ : TopologicalAddGroup δ
inst✝⁴ : UniformSpace G
inst✝³ : AddCommGroup G
inst✝² : UniformAddGroup G
inst✝¹ : SeparatedSpace G
inst✝ : CompleteSpace G
e : β →+ α
de : DenseInducing ⇑e
f : δ →+ γ
df : DenseInducing ⇑f
φ : β →+ δ →+ G
hφ : Continuous fun p => (φ p.1) p.2
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : β × β → α × α := fun u => (e u.1, e u.2)
⊢ Tendsto (fun a => (a.2 - a.1, y₁)) (comap (⇑e) Nx ×ˢ comap (⇑e) Nx) (𝓝 (0, y₁))

Next tactic:
have := Tendsto.prod_mk (tendsto_sub_comap_self de x₀)
      (tendsto_const_nhds : Tendsto (fun _ : β × β => y₁) (comap ee <| 𝓝 (x₀, x₀)) (𝓝 y₁))
private theorem extend_Z_bilin_aux (x₀ : α) (y₁ : δ) : ∃ U₂ ∈ comap e (𝓝 x₀), ∀ (x) (_ : x ∈ U₂)
    (x') (_ : x' ∈ U₂), (fun p : β × δ => φ p.1 p.2) (x' - x, y₁) ∈ W' := by
  let Nx := 𝓝 x₀
  let ee := fun u : β × β => (e u.1, e u.2)
  have lim1 : Tendsto (fun a : β × β => (a.2 - a.1, y₁))
      (comap e Nx ×ˢ comap e Nx) (𝓝 (0, y₁)) := by
    have := Tendsto.prod_mk (tendsto_sub_comap_self de x₀)
      (tendsto_const_nhds : Tendsto (fun _ : β × β => y₁) (comap ee <| 𝓝 (x₀, x₀)) (𝓝 y₁))
    

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
G : Type u_5
inst✝¹⁶ : TopologicalSpace α
inst✝¹⁵ : AddCommGroup α
inst✝¹⁴ : TopologicalAddGroup α
inst✝¹³ : TopologicalSpace β
inst✝¹² : AddCommGroup β
inst✝¹¹ : TopologicalAddGroup β
inst✝¹⁰ : TopologicalSpace γ
inst✝⁹ : AddCommGroup γ
inst✝⁸ : TopologicalAddGroup γ
inst✝⁷ : TopologicalSpace δ
inst✝⁶ : AddCommGroup δ
inst✝⁵ : TopologicalAddGroup δ
inst✝⁴ : UniformSpace G
inst✝³ : AddCommGroup G
inst✝² : UniformAddGroup G
inst✝¹ : SeparatedSpace G
inst✝ : CompleteSpace G
e : β →+ α
de : DenseInducing ⇑e
f : δ →+ γ
df : DenseInducing ⇑f
φ : β →+ δ →+ G
hφ : Continuous fun p => (φ p.1) p.2
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : β × β → α × α := fun u => (e u.1, e u.2)
this : Tendsto (fun x => (x.2 - x.1, y₁)) (comap (fun p => (e p.1, e p.2)) (𝓝 (x₀, x₀))) (𝓝 0 ×ˢ 𝓝 y₁)
⊢ Tendsto (fun a => (a.2 - a.1, y₁)) (comap (⇑e) Nx ×ˢ comap (⇑e) Nx) (𝓝 (0, y₁))

Next tactic:
rw [nhds_prod_eq, prod_comap_comap_eq, ← nhds_prod_eq]
private theorem extend_Z_bilin_aux (x₀ : α) (y₁ : δ) : ∃ U₂ ∈ comap e (𝓝 x₀), ∀ (x) (_ : x ∈ U₂)
    (x') (_ : x' ∈ U₂), (fun p : β × δ => φ p.1 p.2) (x' - x, y₁) ∈ W' := by
  let Nx := 𝓝 x₀
  let ee := fun u : β × β => (e u.1, e u.2)
  have lim1 : Tendsto (fun a : β × β => (a.2 - a.1, y₁))
      (comap e Nx ×ˢ comap e Nx) (𝓝 (0, y₁)) := by
    have := Tendsto.prod_mk (tendsto_sub_comap_self de x₀)
      (tendsto_const_nhds : Tendsto (fun _ : β × β => y₁) (comap ee <| 𝓝 (x₀, x₀)) (𝓝 y₁))
    rw [nhds_prod_eq, prod_comap_comap_eq, ← nhds_prod_eq]
    

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
G : Type u_5
inst✝¹⁶ : TopologicalSpace α
inst✝¹⁵ : AddCommGroup α
inst✝¹⁴ : TopologicalAddGroup α
inst✝¹³ : TopologicalSpace β
inst✝¹² : AddCommGroup β
inst✝¹¹ : TopologicalAddGroup β
inst✝¹⁰ : TopologicalSpace γ
inst✝⁹ : AddCommGroup γ
inst✝⁸ : TopologicalAddGroup γ
inst✝⁷ : TopologicalSpace δ
inst✝⁶ : AddCommGroup δ
inst✝⁵ : TopologicalAddGroup δ
inst✝⁴ : UniformSpace G
inst✝³ : AddCommGroup G
inst✝² : UniformAddGroup G
inst✝¹ : SeparatedSpace G
inst✝ : CompleteSpace G
e : β →+ α
de : DenseInducing ⇑e
f : δ →+ γ
df : DenseInducing ⇑f
φ : β →+ δ →+ G
hφ : Continuous fun p => (φ p.1) p.2
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : β × β → α × α := fun u => (e u.1, e u.2)
this : Tendsto (fun x => (x.2 - x.1, y₁)) (comap (fun p => (e p.1, e p.2)) (𝓝 (x₀, x₀))) (𝓝 0 ×ˢ 𝓝 y₁)
⊢ Tendsto (fun a => (a.2 - a.1, y₁)) (comap (fun p => (e p.1, e p.2)) (𝓝 (x₀, x₀))) (𝓝 0 ×ˢ 𝓝 y₁)

Next tactic:
exact (this : _)
private theorem extend_Z_bilin_aux (x₀ : α) (y₁ : δ) : ∃ U₂ ∈ comap e (𝓝 x₀), ∀ (x) (_ : x ∈ U₂)
    (x') (_ : x' ∈ U₂), (fun p : β × δ => φ p.1 p.2) (x' - x, y₁) ∈ W' := by
  let Nx := 𝓝 x₀
  let ee := fun u : β × β => (e u.1, e u.2)
  have lim1 : Tendsto (fun a : β × β => (a.2 - a.1, y₁))
      (comap e Nx ×ˢ comap e Nx) (𝓝 (0, y₁)) := by
    have := Tendsto.prod_mk (tendsto_sub_comap_self de x₀)
      (tendsto_const_nhds : Tendsto (fun _ : β × β => y₁) (comap ee <| 𝓝 (x₀, x₀)) (𝓝 y₁))
    rw [nhds_prod_eq, prod_comap_comap_eq, ← nhds_prod_eq]
    exact (this : _)
  

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
G : Type u_5
inst✝¹⁶ : TopologicalSpace α
inst✝¹⁵ : AddCommGroup α
inst✝¹⁴ : TopologicalAddGroup α
inst✝¹³ : TopologicalSpace β
inst✝¹² : AddCommGroup β
inst✝¹¹ : TopologicalAddGroup β
inst✝¹⁰ : TopologicalSpace γ
inst✝⁹ : AddCommGroup γ
inst✝⁸ : TopologicalAddGroup γ
inst✝⁷ : TopologicalSpace δ
inst✝⁶ : AddCommGroup δ
inst✝⁵ : TopologicalAddGroup δ
inst✝⁴ : UniformSpace G
inst✝³ : AddCommGroup G
inst✝² : UniformAddGroup G
inst✝¹ : SeparatedSpace G
inst✝ : CompleteSpace G
e : β →+ α
de : DenseInducing ⇑e
f : δ →+ γ
df : DenseInducing ⇑f
φ : β →+ δ →+ G
hφ : Continuous fun p => (φ p.1) p.2
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : β × β → α × α := fun u => (e u.1, e u.2)
lim1 : Tendsto (fun a => (a.2 - a.1, y₁)) (comap (⇑e) Nx ×ˢ comap (⇑e) Nx) (𝓝 (0, y₁))
⊢ ∃ U₂ ∈ comap (⇑e) (𝓝 x₀), ∀ x ∈ U₂, ∀ x' ∈ U₂, (fun p => (φ p.1) p.2) (x' - x, y₁) ∈ W'

Next tactic:
have lim2 : Tendsto (fun p : β × δ => φ p.1 p.2) (𝓝 (0, y₁)) (𝓝 0) := by
    simpa using hφ.tendsto (0, y₁)
private theorem extend_Z_bilin_aux (x₀ : α) (y₁ : δ) : ∃ U₂ ∈ comap e (𝓝 x₀), ∀ (x) (_ : x ∈ U₂)
    (x') (_ : x' ∈ U₂), (fun p : β × δ => φ p.1 p.2) (x' - x, y₁) ∈ W' := by
  let Nx := 𝓝 x₀
  let ee := fun u : β × β => (e u.1, e u.2)
  have lim1 : Tendsto (fun a : β × β => (a.2 - a.1, y₁))
      (comap e Nx ×ˢ comap e Nx) (𝓝 (0, y₁)) := by
    have := Tendsto.prod_mk (tendsto_sub_comap_self de x₀)
      (tendsto_const_nhds : Tendsto (fun _ : β × β => y₁) (comap ee <| 𝓝 (x₀, x₀)) (𝓝 y₁))
    rw [nhds_prod_eq, prod_comap_comap_eq, ← nhds_prod_eq]
    exact (this : _)
  have lim2 : Tendsto (fun p : β × δ => φ p.1 p.2) (𝓝 (0, y₁)) (𝓝 0) := by
    

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
G : Type u_5
inst✝¹⁶ : TopologicalSpace α
inst✝¹⁵ : AddCommGroup α
inst✝¹⁴ : TopologicalAddGroup α
inst✝¹³ : TopologicalSpace β
inst✝¹² : AddCommGroup β
inst✝¹¹ : TopologicalAddGroup β
inst✝¹⁰ : TopologicalSpace γ
inst✝⁹ : AddCommGroup γ
inst✝⁸ : TopologicalAddGroup γ
inst✝⁷ : TopologicalSpace δ
inst✝⁶ : AddCommGroup δ
inst✝⁵ : TopologicalAddGroup δ
inst✝⁴ : UniformSpace G
inst✝³ : AddCommGroup G
inst✝² : UniformAddGroup G
inst✝¹ : SeparatedSpace G
inst✝ : CompleteSpace G
e : β →+ α
de : DenseInducing ⇑e
f : δ →+ γ
df : DenseInducing ⇑f
φ : β →+ δ →+ G
hφ : Continuous fun p => (φ p.1) p.2
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : β × β → α × α := fun u => (e u.1, e u.2)
lim1 : Tendsto (fun a => (a.2 - a.1, y₁)) (comap (⇑e) Nx ×ˢ comap (⇑e) Nx) (𝓝 (0, y₁))
⊢ Tendsto (fun p => (φ p.1) p.2) (𝓝 (0, y₁)) (𝓝 0)

Next tactic:
simpa using hφ.tendsto (0, y₁)
private theorem extend_Z_bilin_aux (x₀ : α) (y₁ : δ) : ∃ U₂ ∈ comap e (𝓝 x₀), ∀ (x) (_ : x ∈ U₂)
    (x') (_ : x' ∈ U₂), (fun p : β × δ => φ p.1 p.2) (x' - x, y₁) ∈ W' := by
  let Nx := 𝓝 x₀
  let ee := fun u : β × β => (e u.1, e u.2)
  have lim1 : Tendsto (fun a : β × β => (a.2 - a.1, y₁))
      (comap e Nx ×ˢ comap e Nx) (𝓝 (0, y₁)) := by
    have := Tendsto.prod_mk (tendsto_sub_comap_self de x₀)
      (tendsto_const_nhds : Tendsto (fun _ : β × β => y₁) (comap ee <| 𝓝 (x₀, x₀)) (𝓝 y₁))
    rw [nhds_prod_eq, prod_comap_comap_eq, ← nhds_prod_eq]
    exact (this : _)
  have lim2 : Tendsto (fun p : β × δ => φ p.1 p.2) (𝓝 (0, y₁)) (𝓝 0) := by
    simpa using hφ.tendsto (0, y₁)
  

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
G : Type u_5
inst✝¹⁶ : TopologicalSpace α
inst✝¹⁵ : AddCommGroup α
inst✝¹⁴ : TopologicalAddGroup α
inst✝¹³ : TopologicalSpace β
inst✝¹² : AddCommGroup β
inst✝¹¹ : TopologicalAddGroup β
inst✝¹⁰ : TopologicalSpace γ
inst✝⁹ : AddCommGroup γ
inst✝⁸ : TopologicalAddGroup γ
inst✝⁷ : TopologicalSpace δ
inst✝⁶ : AddCommGroup δ
inst✝⁵ : TopologicalAddGroup δ
inst✝⁴ : UniformSpace G
inst✝³ : AddCommGroup G
inst✝² : UniformAddGroup G
inst✝¹ : SeparatedSpace G
inst✝ : CompleteSpace G
e : β →+ α
de : DenseInducing ⇑e
f : δ →+ γ
df : DenseInducing ⇑f
φ : β →+ δ →+ G
hφ : Continuous fun p => (φ p.1) p.2
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : β × β → α × α := fun u => (e u.1, e u.2)
lim1 : Tendsto (fun a => (a.2 - a.1, y₁)) (comap (⇑e) Nx ×ˢ comap (⇑e) Nx) (𝓝 (0, y₁))
lim2 : Tendsto (fun p => (φ p.1) p.2) (𝓝 (0, y₁)) (𝓝 0)
⊢ ∃ U₂ ∈ comap (⇑e) (𝓝 x₀), ∀ x ∈ U₂, ∀ x' ∈ U₂, (fun p => (φ p.1) p.2) (x' - x, y₁) ∈ W'

Next tactic:
have lim := lim2.comp lim1