[GOAL]
α✝ : Type u_1
β : Type u_2
α : Type u_3
inst✝¹ : UniformSpace α
inst✝ : Group α
h₁ : UniformContinuous fun p => p.fst * p.snd
h₂ : UniformContinuous fun p => p⁻¹
⊢ UniformContinuous fun p => p.fst / p.snd
[PROOFSTEP]
simpa only [div_eq_mul_inv] using h₁.comp (uniformContinuous_fst.prod_mk (h₂.comp uniformContinuous_snd))
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : UniformSpace β
f : β → α
hf : UniformContinuous f
⊢ UniformContinuous fun x => (f x)⁻¹
[PROOFSTEP]
have : UniformContinuous fun x => 1 / f x := uniformContinuous_const.div hf
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : UniformSpace β
f : β → α
hf : UniformContinuous f
this : UniformContinuous fun x => 1 / f x
⊢ UniformContinuous fun x => (f x)⁻¹
[PROOFSTEP]
simp_all
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : UniformSpace β
f g : β → α
hf : UniformContinuous f
hg : UniformContinuous g
⊢ UniformContinuous fun x => f x * g x
[PROOFSTEP]
have : UniformContinuous fun x => f x / (g x)⁻¹ := hf.div hg.inv
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : UniformSpace β
f g : β → α
hf : UniformContinuous f
hg : UniformContinuous g
this : UniformContinuous fun x => f x / (g x)⁻¹
⊢ UniformContinuous fun x => f x * g x
[PROOFSTEP]
simp_all
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : UniformSpace β
f : β → α
hf : UniformContinuous f
⊢ UniformContinuous fun x => f x ^ 0
[PROOFSTEP]
simp_rw [pow_zero]
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : UniformSpace β
f : β → α
hf : UniformContinuous f
⊢ UniformContinuous fun x => 1
[PROOFSTEP]
exact uniformContinuous_const
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : UniformSpace β
f : β → α
hf : UniformContinuous f
n : ℕ
⊢ UniformContinuous fun x => f x ^ (n + 1)
[PROOFSTEP]
simp_rw [pow_succ]
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : UniformSpace β
f : β → α
hf : UniformContinuous f
n : ℕ
⊢ UniformContinuous fun x => f x * f x ^ n
[PROOFSTEP]
exact hf.mul (hf.pow_const n)
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : UniformSpace β
f : β → α
hf : UniformContinuous f
n : ℕ
⊢ UniformContinuous fun x => f x ^ ↑n
[PROOFSTEP]
simp_rw [zpow_ofNat]
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : UniformSpace β
f : β → α
hf : UniformContinuous f
n : ℕ
⊢ UniformContinuous fun x => f x ^ n
[PROOFSTEP]
exact hf.pow_const _
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : UniformSpace β
f : β → α
hf : UniformContinuous f
n : ℕ
⊢ UniformContinuous fun x => f x ^ Int.negSucc n
[PROOFSTEP]
simp_rw [zpow_negSucc]
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : UniformSpace β
f : β → α
hf : UniformContinuous f
n : ℕ
⊢ UniformContinuous fun x => (f x ^ (n + 1))⁻¹
[PROOFSTEP]
exact (hf.pow_const _).inv
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
a : α
⊢ 𝓤 α = map (fun x => (x.fst * a, x.snd * a)) (map (fun x => (x.fst * a⁻¹, x.snd * a⁻¹)) (𝓤 α))
[PROOFSTEP]
simp [Filter.map_map, (· ∘ ·)]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
a : α
⊢ comap (fun x => (x.fst * a, x.snd * a)) (𝓤 α) = 𝓤 α
[PROOFSTEP]
nth_rewrite 1 [← uniformity_translate_mul a, comap_map]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
a : α
⊢ 𝓤 α = 𝓤 α
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
a : α
⊢ Function.Injective fun x => (x.fst * a, x.snd * a)
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
a : α
⊢ Function.Injective fun x => (x.fst * a, x.snd * a)
[PROOFSTEP]
rintro ⟨p₁, p₂⟩ ⟨q₁, q₂⟩
[GOAL]
case mk.mk
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
a p₁ p₂ q₁ q₂ : α
⊢ (fun x => (x.fst * a, x.snd * a)) (p₁, p₂) = (fun x => (x.fst * a, x.snd * a)) (q₁, q₂) → (p₁, p₂) = (q₁, q₂)
[PROOFSTEP]
simp only [Prod.mk.injEq, mul_left_inj, imp_self]
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : Group β
ι : Sort u_3
us' : ι → UniformSpace β
h' : ∀ (i : ι), UniformGroup β
⊢ UniformGroup β
[PROOFSTEP]
rw [← sInf_range]
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : Group β
ι : Sort u_3
us' : ι → UniformSpace β
h' : ∀ (i : ι), UniformGroup β
⊢ UniformGroup β
[PROOFSTEP]
exact uniformGroup_sInf (Set.forall_range_iff.mpr h')
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : Group β
u₁ u₂ : UniformSpace β
h₁ : UniformGroup β
h₂ : UniformGroup β
⊢ UniformGroup β
[PROOFSTEP]
rw [inf_eq_iInf]
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : Group β
u₁ u₂ : UniformSpace β
h₁ : UniformGroup β
h₂ : UniformGroup β
⊢ UniformGroup β
[PROOFSTEP]
refine' uniformGroup_iInf fun b => _
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : Group β
u₁ u₂ : UniformSpace β
h₁ : UniformGroup β
h₂ : UniformGroup β
b : Bool
⊢ UniformGroup β
[PROOFSTEP]
cases b
[GOAL]
case false
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : Group β
u₁ u₂ : UniformSpace β
h₁ : UniformGroup β
h₂ : UniformGroup β
⊢ UniformGroup β
[PROOFSTEP]
assumption
[GOAL]
case true
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : Group β
u₁ u₂ : UniformSpace β
h₁ : UniformGroup β
h₂ : UniformGroup β
⊢ UniformGroup β
[PROOFSTEP]
assumption
[GOAL]
α : Type u_1
β : Type u_2
inst✝⁶ : UniformSpace α
inst✝⁵ : Group α
inst✝⁴ : UniformGroup α
inst✝³ : Group β
γ : Type u_3
inst✝² : Group γ
u : UniformSpace γ
inst✝¹ : UniformGroup γ
F : Type u_4
inst✝ : MonoidHomClass F β γ
f : F
⊢ UniformContinuous fun p => p.fst / p.snd
[PROOFSTEP]
letI : UniformSpace β := u.comap f
[GOAL]
α : Type u_1
β : Type u_2
inst✝⁶ : UniformSpace α
inst✝⁵ : Group α
inst✝⁴ : UniformGroup α
inst✝³ : Group β
γ : Type u_3
inst✝² : Group γ
u : UniformSpace γ
inst✝¹ : UniformGroup γ
F : Type u_4
inst✝ : MonoidHomClass F β γ
f : F
this : UniformSpace β := UniformSpace.comap (↑f) u
⊢ UniformContinuous fun p => p.fst / p.snd
[PROOFSTEP]
refine' uniformContinuous_comap' _
[GOAL]
α : Type u_1
β : Type u_2
inst✝⁶ : UniformSpace α
inst✝⁵ : Group α
inst✝⁴ : UniformGroup α
inst✝³ : Group β
γ : Type u_3
inst✝² : Group γ
u : UniformSpace γ
inst✝¹ : UniformGroup γ
F : Type u_4
inst✝ : MonoidHomClass F β γ
f : F
this : UniformSpace β := UniformSpace.comap (↑f) u
⊢ UniformContinuous (↑f ∘ fun p => p.fst / p.snd)
[PROOFSTEP]
simp_rw [Function.comp, map_div]
[GOAL]
α : Type u_1
β : Type u_2
inst✝⁶ : UniformSpace α
inst✝⁵ : Group α
inst✝⁴ : UniformGroup α
inst✝³ : Group β
γ : Type u_3
inst✝² : Group γ
u : UniformSpace γ
inst✝¹ : UniformGroup γ
F : Type u_4
inst✝ : MonoidHomClass F β γ
f : F
this : UniformSpace β := UniformSpace.comap (↑f) u
⊢ UniformContinuous fun x => ↑f x.fst / ↑f x.snd
[PROOFSTEP]
change UniformContinuous ((fun p : γ × γ => p.1 / p.2) ∘ Prod.map f f)
[GOAL]
α : Type u_1
β : Type u_2
inst✝⁶ : UniformSpace α
inst✝⁵ : Group α
inst✝⁴ : UniformGroup α
inst✝³ : Group β
γ : Type u_3
inst✝² : Group γ
u : UniformSpace γ
inst✝¹ : UniformGroup γ
F : Type u_4
inst✝ : MonoidHomClass F β γ
f : F
this : UniformSpace β := UniformSpace.comap (↑f) u
⊢ UniformContinuous ((fun p => p.fst / p.snd) ∘ Prod.map ↑f ↑f)
[PROOFSTEP]
exact uniformContinuous_div.comp (uniformContinuous_comap.prod_map uniformContinuous_comap)
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
⊢ 𝓤 α = comap (fun x => x.snd / x.fst) (𝓝 1)
[PROOFSTEP]
rw [nhds_eq_comap_uniformity, Filter.comap_comap]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
⊢ 𝓤 α = comap (Prod.mk 1 ∘ fun x => x.snd / x.fst) (𝓤 α)
[PROOFSTEP]
refine' le_antisymm (Filter.map_le_iff_le_comap.1 _) _
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
⊢ map (Prod.mk 1 ∘ fun x => x.snd / x.fst) (𝓤 α) ≤ 𝓤 α
[PROOFSTEP]
intro s hs
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
s : Set (α × α)
hs : s ∈ 𝓤 α
⊢ s ∈ map (Prod.mk 1 ∘ fun x => x.snd / x.fst) (𝓤 α)
[PROOFSTEP]
rcases mem_uniformity_of_uniformContinuous_invariant uniformContinuous_div hs with ⟨t, ht, hts⟩
[GOAL]
case refine'_1.intro.intro
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
s : Set (α × α)
hs : s ∈ 𝓤 α
t : Set (α × α)
ht : t ∈ 𝓤 α
hts : ∀ (a b c : α), (a, b) ∈ t → (a / c, b / c) ∈ s
⊢ s ∈ map (Prod.mk 1 ∘ fun x => x.snd / x.fst) (𝓤 α)
[PROOFSTEP]
refine' mem_map.2 (mem_of_superset ht _)
[GOAL]
case refine'_1.intro.intro
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
s : Set (α × α)
hs : s ∈ 𝓤 α
t : Set (α × α)
ht : t ∈ 𝓤 α
hts : ∀ (a b c : α), (a, b) ∈ t → (a / c, b / c) ∈ s
⊢ t ⊆ (Prod.mk 1 ∘ fun x => x.snd / x.fst) ⁻¹' s
[PROOFSTEP]
rintro ⟨a, b⟩
[GOAL]
case refine'_1.intro.intro.mk
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
s : Set (α × α)
hs : s ∈ 𝓤 α
t : Set (α × α)
ht : t ∈ 𝓤 α
hts : ∀ (a b c : α), (a, b) ∈ t → (a / c, b / c) ∈ s
a b : α
⊢ (a, b) ∈ t → (a, b) ∈ (Prod.mk 1 ∘ fun x => x.snd / x.fst) ⁻¹' s
[PROOFSTEP]
simpa [subset_def] using hts a b a
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
⊢ comap (Prod.mk 1 ∘ fun x => x.snd / x.fst) (𝓤 α) ≤ 𝓤 α
[PROOFSTEP]
intro s hs
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
s : Set (α × α)
hs : s ∈ 𝓤 α
⊢ s ∈ comap (Prod.mk 1 ∘ fun x => x.snd / x.fst) (𝓤 α)
[PROOFSTEP]
rcases mem_uniformity_of_uniformContinuous_invariant uniformContinuous_mul hs with ⟨t, ht, hts⟩
[GOAL]
case refine'_2.intro.intro
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
s : Set (α × α)
hs : s ∈ 𝓤 α
t : Set (α × α)
ht : t ∈ 𝓤 α
hts : ∀ (a b c : α), (a, b) ∈ t → (a * c, b * c) ∈ s
⊢ s ∈ comap (Prod.mk 1 ∘ fun x => x.snd / x.fst) (𝓤 α)
[PROOFSTEP]
refine' ⟨_, ht, _⟩
[GOAL]
case refine'_2.intro.intro
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
s : Set (α × α)
hs : s ∈ 𝓤 α
t : Set (α × α)
ht : t ∈ 𝓤 α
hts : ∀ (a b c : α), (a, b) ∈ t → (a * c, b * c) ∈ s
⊢ (Prod.mk 1 ∘ fun x => x.snd / x.fst) ⁻¹' t ⊆ s
[PROOFSTEP]
rintro ⟨a, b⟩
[GOAL]
case refine'_2.intro.intro.mk
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
s : Set (α × α)
hs : s ∈ 𝓤 α
t : Set (α × α)
ht : t ∈ 𝓤 α
hts : ∀ (a b c : α), (a, b) ∈ t → (a * c, b * c) ∈ s
a b : α
⊢ (a, b) ∈ (Prod.mk 1 ∘ fun x => x.snd / x.fst) ⁻¹' t → (a, b) ∈ s
[PROOFSTEP]
simpa [subset_def] using hts 1 (b / a) a
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
⊢ 𝓤 α = comap (fun x => x.fst / x.snd) (𝓝 1)
[PROOFSTEP]
rw [← comap_swap_uniformity, uniformity_eq_comap_nhds_one, comap_comap]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
⊢ comap ((fun x => x.snd / x.fst) ∘ Prod.swap) (𝓝 1) = comap (fun x => x.fst / x.snd) (𝓝 1)
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
G : Type u_3
inst✝ : Group G
u v : UniformSpace G
hu : UniformGroup G
hv : UniformGroup G
h : 𝓝 1 = 𝓝 1
⊢ 𝓤 G = 𝓤 G
[PROOFSTEP]
rw [@uniformity_eq_comap_nhds_one _ u _ hu, @uniformity_eq_comap_nhds_one _ v _ hv, h]
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : IsCountablyGenerated (𝓝 1)
⊢ IsCountablyGenerated (𝓤 α)
[PROOFSTEP]
rw [uniformity_eq_comap_nhds_one]
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : UniformSpace α
inst✝² : Group α
inst✝¹ : UniformGroup α
inst✝ : IsCountablyGenerated (𝓝 1)
⊢ IsCountablyGenerated (comap (fun x => x.snd / x.fst) (𝓝 1))
[PROOFSTEP]
exact Filter.comap.isCountablyGenerated _ _
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
⊢ 𝓤 α = comap (fun x => x.fst⁻¹ * x.snd) (𝓝 1)
[PROOFSTEP]
rw [← comap_uniformity_mulOpposite, uniformity_eq_comap_nhds_one, ← op_one, ← comap_unop_nhds, comap_comap, comap_comap]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
⊢ comap (unop ∘ (fun x => x.snd / x.fst) ∘ fun p => (op p.fst, op p.snd)) (𝓝 1) = comap (fun x => x.fst⁻¹ * x.snd) (𝓝 1)
[PROOFSTEP]
simp [(· ∘ ·)]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
⊢ 𝓤 α = comap (fun x => x.snd⁻¹ * x.fst) (𝓝 1)
[PROOFSTEP]
rw [← comap_swap_uniformity, uniformity_eq_comap_inv_mul_nhds_one, comap_comap]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
⊢ comap ((fun x => x.fst⁻¹ * x.snd) ∘ Prod.swap) (𝓝 1) = comap (fun x => x.snd⁻¹ * x.fst) (𝓝 1)
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
ι : Sort u_3
p : ι → Prop
U : ι → Set α
h : HasBasis (𝓝 1) p U
⊢ HasBasis (𝓤 α) p fun i => {x | x.snd / x.fst ∈ U i}
[PROOFSTEP]
rw [uniformity_eq_comap_nhds_one]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
ι : Sort u_3
p : ι → Prop
U : ι → Set α
h : HasBasis (𝓝 1) p U
⊢ HasBasis (Filter.comap (fun x => x.snd / x.fst) (𝓝 1)) p fun i => {x | x.snd / x.fst ∈ U i}
[PROOFSTEP]
exact h.comap _
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
ι : Sort u_3
p : ι → Prop
U : ι → Set α
h : HasBasis (𝓝 1) p U
⊢ HasBasis (𝓤 α) p fun i => {x | x.fst⁻¹ * x.snd ∈ U i}
[PROOFSTEP]
rw [uniformity_eq_comap_inv_mul_nhds_one]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
ι : Sort u_3
p : ι → Prop
U : ι → Set α
h : HasBasis (𝓝 1) p U
⊢ HasBasis (Filter.comap (fun x => x.fst⁻¹ * x.snd) (𝓝 1)) p fun i => {x | x.fst⁻¹ * x.snd ∈ U i}
[PROOFSTEP]
exact h.comap _
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
ι : Sort u_3
p : ι → Prop
U : ι → Set α
h : HasBasis (𝓝 1) p U
⊢ HasBasis (𝓤 α) p fun i => {x | x.fst / x.snd ∈ U i}
[PROOFSTEP]
rw [uniformity_eq_comap_nhds_one_swapped]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
ι : Sort u_3
p : ι → Prop
U : ι → Set α
h : HasBasis (𝓝 1) p U
⊢ HasBasis (Filter.comap (fun x => x.fst / x.snd) (𝓝 1)) p fun i => {x | x.fst / x.snd ∈ U i}
[PROOFSTEP]
exact h.comap _
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
ι : Sort u_3
p : ι → Prop
U : ι → Set α
h : HasBasis (𝓝 1) p U
⊢ HasBasis (𝓤 α) p fun i => {x | x.snd⁻¹ * x.fst ∈ U i}
[PROOFSTEP]
rw [uniformity_eq_comap_inv_mul_nhds_one_swapped]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
ι : Sort u_3
p : ι → Prop
U : ι → Set α
h : HasBasis (𝓝 1) p U
⊢ HasBasis (Filter.comap (fun x => x.snd⁻¹ * x.fst) (𝓝 1)) p fun i => {x | x.snd⁻¹ * x.fst ∈ U i}
[PROOFSTEP]
exact h.comap _
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
x y : α
this : Embedding fun a => a * (y / x)
⊢ (x, y) ∈ ⋂₀ (𝓤 α).sets ↔ x / y ∈ closure {1}
[PROOFSTEP]
rw [this.closure_eq_preimage_closure_image, uniformity_eq_comap_nhds_one α, sInter_comap_sets]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
x y : α
this : Embedding fun a => a * (y / x)
⊢ (x, y) ∈ ⋂ (U : Set α) (_ : U ∈ 𝓝 1), (fun x => x.snd / x.fst) ⁻¹' U ↔
    x / y ∈ (fun a => a * (y / x)) ⁻¹' closure ((fun a => a * (y / x)) '' {1})
[PROOFSTEP]
simp [mem_closure_iff_nhds, inter_singleton_nonempty, sub_eq_add_neg, add_assoc]
[GOAL]
α : Type u_1
β : Type u_2
inst✝⁶ : UniformSpace α
inst✝⁵ : Group α
inst✝⁴ : UniformGroup α
hom : Type u_3
inst✝³ : UniformSpace β
inst✝² : Group β
inst✝¹ : UniformGroup β
inst✝ : MonoidHomClass hom α β
f : hom
h : Tendsto (↑f) (𝓝 1) (𝓝 1)
⊢ UniformContinuous ↑f
[PROOFSTEP]
have : ((fun x : β × β => x.2 / x.1) ∘ fun x : α × α => (f x.1, f x.2)) = fun x : α × α => f (x.2 / x.1) := by ext;
  simp only [Function.comp_apply, map_div]
[GOAL]
α : Type u_1
β : Type u_2
inst✝⁶ : UniformSpace α
inst✝⁵ : Group α
inst✝⁴ : UniformGroup α
hom : Type u_3
inst✝³ : UniformSpace β
inst✝² : Group β
inst✝¹ : UniformGroup β
inst✝ : MonoidHomClass hom α β
f : hom
h : Tendsto (↑f) (𝓝 1) (𝓝 1)
⊢ ((fun x => x.snd / x.fst) ∘ fun x => (↑f x.fst, ↑f x.snd)) = fun x => ↑f (x.snd / x.fst)
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u_1
β : Type u_2
inst✝⁶ : UniformSpace α
inst✝⁵ : Group α
inst✝⁴ : UniformGroup α
hom : Type u_3
inst✝³ : UniformSpace β
inst✝² : Group β
inst✝¹ : UniformGroup β
inst✝ : MonoidHomClass hom α β
f : hom
h : Tendsto (↑f) (𝓝 1) (𝓝 1)
x✝ : α × α
⊢ ((fun x => x.snd / x.fst) ∘ fun x => (↑f x.fst, ↑f x.snd)) x✝ = ↑f (x✝.snd / x✝.fst)
[PROOFSTEP]
simp only [Function.comp_apply, map_div]
[GOAL]
α : Type u_1
β : Type u_2
inst✝⁶ : UniformSpace α
inst✝⁵ : Group α
inst✝⁴ : UniformGroup α
hom : Type u_3
inst✝³ : UniformSpace β
inst✝² : Group β
inst✝¹ : UniformGroup β
inst✝ : MonoidHomClass hom α β
f : hom
h : Tendsto (↑f) (𝓝 1) (𝓝 1)
this : ((fun x => x.snd / x.fst) ∘ fun x => (↑f x.fst, ↑f x.snd)) = fun x => ↑f (x.snd / x.fst)
⊢ UniformContinuous ↑f
[PROOFSTEP]
rw [UniformContinuous, uniformity_eq_comap_nhds_one α, uniformity_eq_comap_nhds_one β, tendsto_comap_iff, this]
[GOAL]
α : Type u_1
β : Type u_2
inst✝⁶ : UniformSpace α
inst✝⁵ : Group α
inst✝⁴ : UniformGroup α
hom : Type u_3
inst✝³ : UniformSpace β
inst✝² : Group β
inst✝¹ : UniformGroup β
inst✝ : MonoidHomClass hom α β
f : hom
h : Tendsto (↑f) (𝓝 1) (𝓝 1)
this : ((fun x => x.snd / x.fst) ∘ fun x => (↑f x.fst, ↑f x.snd)) = fun x => ↑f (x.snd / x.fst)
⊢ Tendsto (fun x => ↑f (x.snd / x.fst)) (comap (fun x => x.snd / x.fst) (𝓝 1)) (𝓝 1)
[PROOFSTEP]
exact Tendsto.comp h tendsto_comap
[GOAL]
α : Type u_1
β : Type u_2
inst✝⁶ : UniformSpace α
inst✝⁵ : Group α
inst✝⁴ : UniformGroup α
hom : Type u_3
inst✝³ : UniformSpace β
inst✝² : Group β
inst✝¹ : UniformGroup β
inst✝ : MonoidHomClass hom α β
f : hom
hf : ContinuousAt (↑f) 1
⊢ Tendsto (↑f) (𝓝 1) (𝓝 1)
[PROOFSTEP]
simpa using hf.tendsto
[GOAL]
α : Type u_1
β : Type u_2
inst✝⁷ : UniformSpace α
inst✝⁶ : Group α
inst✝⁵ : UniformGroup α
hom : Type u_3
inst✝⁴ : UniformSpace β
inst✝³ : DiscreteTopology β
inst✝² : Group β
inst✝¹ : UniformGroup β
inst✝ : MonoidHomClass hom α β
f : hom
⊢ UniformContinuous ↑f ↔ IsOpen ↑(MonoidHom.ker ↑f)
[PROOFSTEP]
refine' ⟨fun hf => _, fun hf => _⟩
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
inst✝⁷ : UniformSpace α
inst✝⁶ : Group α
inst✝⁵ : UniformGroup α
hom : Type u_3
inst✝⁴ : UniformSpace β
inst✝³ : DiscreteTopology β
inst✝² : Group β
inst✝¹ : UniformGroup β
inst✝ : MonoidHomClass hom α β
f : hom
hf : UniformContinuous ↑f
⊢ IsOpen ↑(MonoidHom.ker ↑f)
[PROOFSTEP]
apply (isOpen_discrete ({1} : Set β)).preimage hf.continuous
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
inst✝⁷ : UniformSpace α
inst✝⁶ : Group α
inst✝⁵ : UniformGroup α
hom : Type u_3
inst✝⁴ : UniformSpace β
inst✝³ : DiscreteTopology β
inst✝² : Group β
inst✝¹ : UniformGroup β
inst✝ : MonoidHomClass hom α β
f : hom
hf : IsOpen ↑(MonoidHom.ker ↑f)
⊢ UniformContinuous ↑f
[PROOFSTEP]
apply uniformContinuous_of_continuousAt_one
[GOAL]
case refine'_2.hf
α : Type u_1
β : Type u_2
inst✝⁷ : UniformSpace α
inst✝⁶ : Group α
inst✝⁵ : UniformGroup α
hom : Type u_3
inst✝⁴ : UniformSpace β
inst✝³ : DiscreteTopology β
inst✝² : Group β
inst✝¹ : UniformGroup β
inst✝ : MonoidHomClass hom α β
f : hom
hf : IsOpen ↑(MonoidHom.ker ↑f)
⊢ ContinuousAt (↑f) 1
[PROOFSTEP]
rw [ContinuousAt, nhds_discrete β, map_one, tendsto_pure]
[GOAL]
case refine'_2.hf
α : Type u_1
β : Type u_2
inst✝⁷ : UniformSpace α
inst✝⁶ : Group α
inst✝⁵ : UniformGroup α
hom : Type u_3
inst✝⁴ : UniformSpace β
inst✝³ : DiscreteTopology β
inst✝² : Group β
inst✝¹ : UniformGroup β
inst✝ : MonoidHomClass hom α β
f : hom
hf : IsOpen ↑(MonoidHom.ker ↑f)
⊢ ∀ᶠ (x : α) in 𝓝 1, ↑f x = 1
[PROOFSTEP]
exact hf.mem_nhds (map_one f)
[GOAL]
α : Type u_1
β : Type u_2
inst✝⁶ : UniformSpace α
inst✝⁵ : Group α
inst✝⁴ : UniformGroup α
hom : Type u_3
inst✝³ : UniformSpace β
inst✝² : Group β
inst✝¹ : UniformGroup β
inst✝ : MonoidHomClass hom α β
f : hom
h : Continuous ↑f
this : Tendsto (↑f) (𝓝 1) (𝓝 (↑f 1))
⊢ Tendsto (↑f) (𝓝 1) (𝓝 1)
[PROOFSTEP]
rwa [map_one] at this
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
s : Set α
⊢ (∀ (i : Set α),
      i ∈ 𝓝 1 → ∃ t, Set.Finite t ∧ s ⊆ ⋃ (y : α) (_ : y ∈ t), {x | (x, y) ∈ {x | x.snd⁻¹ * x.fst ∈ id i}}) ↔
    ∀ (U : Set α), U ∈ 𝓝 1 → ∃ t, Set.Finite t ∧ s ⊆ ⋃ (y : α) (_ : y ∈ t), y • U
[PROOFSTEP]
simp [← preimage_smul_inv, preimage]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
ι : Type u_3
l : Filter ι
l' : Filter β
f f' : ι → β → α
g g' : β → α
s : Set β
hf : UniformCauchySeqOn f l s
hf' : UniformCauchySeqOn f' l s
u : Set (α × α)
hu : u ∈ 𝓤 α
⊢ ∀ᶠ (m : ι × ι) in l ×ˢ l, ∀ (x : β), x ∈ s → ((f * f') m.fst x, (f * f') m.snd x) ∈ u
[PROOFSTEP]
simpa using (uniformContinuous_mul.comp_uniformCauchySeqOn (hf.prod' hf')) u hu
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : UniformSpace α
inst✝¹ : Group α
inst✝ : UniformGroup α
ι : Type u_3
l : Filter ι
l' : Filter β
f f' : ι → β → α
g g' : β → α
s : Set β
hf : UniformCauchySeqOn f l s
hf' : UniformCauchySeqOn f' l s
u : Set (α × α)
hu : u ∈ 𝓤 α
⊢ ∀ᶠ (m : ι × ι) in l ×ˢ l, ∀ (x : β), x ∈ s → ((f / f') m.fst x, (f / f') m.snd x) ∈ u
[PROOFSTEP]
simpa using (uniformContinuous_div.comp_uniformCauchySeqOn (hf.prod' hf')) u hu
[GOAL]
G : Type u_1
inst✝² : Group G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
⊢ Tendsto (fun p => p.snd / p.fst) (𝓟 idRel) (pure 1)
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
inst✝² : Group G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this : Tendsto (fun p => (p.snd / p.fst)⁻¹) (comap (fun p => p.snd / p.fst) (𝓝 1)) (𝓝 1⁻¹)
⊢ Tendsto Prod.swap (comap (fun p => p.snd / p.fst) (𝓝 1)) (comap (fun p => p.snd / p.fst) (𝓝 1))
[PROOFSTEP]
simpa [tendsto_comap_iff]
[GOAL]
G : Type u_1
inst✝² : Group G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
U : Set G
H : U ∈ 𝓝 1
⊢ U ∈ map (fun p => p.snd / p.fst) (Filter.lift' (comap (fun p => p.snd / p.fst) (𝓝 1)) fun s => s ○ s)
[PROOFSTEP]
rcases exists_nhds_one_split H with ⟨V, V_nhds, V_mul⟩
[GOAL]
case intro.intro
G : Type u_1
inst✝² : Group G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
U : Set G
H : U ∈ 𝓝 1
V : Set G
V_nhds : V ∈ 𝓝 1
V_mul : ∀ (v : G), v ∈ V → ∀ (w : G), w ∈ V → v * w ∈ U
⊢ U ∈ map (fun p => p.snd / p.fst) (Filter.lift' (comap (fun p => p.snd / p.fst) (𝓝 1)) fun s => s ○ s)
[PROOFSTEP]
refine mem_map.2 (mem_of_superset (mem_lift' <| preimage_mem_comap V_nhds) ?_)
[GOAL]
case intro.intro
G : Type u_1
inst✝² : Group G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
U : Set G
H : U ∈ 𝓝 1
V : Set G
V_nhds : V ∈ 𝓝 1
V_mul : ∀ (v : G), v ∈ V → ∀ (w : G), w ∈ V → v * w ∈ U
⊢ (fun p => p.snd / p.fst) ⁻¹' V ○ (fun p => p.snd / p.fst) ⁻¹' V ⊆ (fun p => p.snd / p.fst) ⁻¹' U
[PROOFSTEP]
rintro ⟨x, y⟩ ⟨z, hz₁, hz₂⟩
[GOAL]
case intro.intro.mk.intro.intro
G : Type u_1
inst✝² : Group G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
U : Set G
H : U ∈ 𝓝 1
V : Set G
V_nhds : V ∈ 𝓝 1
V_mul : ∀ (v : G), v ∈ V → ∀ (w : G), w ∈ V → v * w ∈ U
x y z : G
hz₁ : ((x, y).fst, z) ∈ (fun p => p.snd / p.fst) ⁻¹' V
hz₂ : (z, (x, y).snd) ∈ (fun p => p.snd / p.fst) ⁻¹' V
⊢ (x, y) ∈ (fun p => p.snd / p.fst) ⁻¹' U
[PROOFSTEP]
simpa using V_mul _ hz₂ _ hz₁
[GOAL]
G : Type u_1
inst✝² : Group G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
S : Set G
⊢ IsOpen S ↔
    ∀ (x : G),
      x ∈ S →
        {p | p.fst = x → p.snd ∈ S} ∈
          { uniformity := comap (fun p => p.snd / p.fst) (𝓝 1),
              refl := (_ : 𝓟 idRel ≤ comap (fun p => p.snd / p.fst) (𝓝 1)),
              symm :=
                (_ : Tendsto Prod.swap (comap (fun p => p.snd / p.fst) (𝓝 1)) (comap (fun p => p.snd / p.fst) (𝓝 1))),
              comp :=
                (_ :
                  (Filter.lift' (comap (fun p => p.snd / p.fst) (𝓝 1)) fun s => s ○ s) ≤
                    comap (fun p => p.snd / p.fst) (𝓝 1)) }.uniformity
[PROOFSTEP]
simp only [isOpen_iff_mem_nhds, ← mem_comap_prod_mk, comap_comap, (· ∘ ·), nhds_translation_div]
[GOAL]
G : Type u_1
inst✝³ : Group G
inst✝² : TopologicalSpace G
inst✝¹ : TopologicalGroup G
inst✝ : CompactSpace G
⊢ UniformContinuous fun p => p.fst / p.snd
[PROOFSTEP]
apply CompactSpace.uniformContinuous_of_continuous
[GOAL]
case h
G : Type u_1
inst✝³ : Group G
inst✝² : TopologicalSpace G
inst✝¹ : TopologicalGroup G
inst✝ : CompactSpace G
⊢ Continuous fun p => p.fst / p.snd
[PROOFSTEP]
exact continuous_div'
[GOAL]
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Subgroup G
inst✝ : DiscreteTopology { x // x ∈ H }
⊢ IsClosed ↑H
[PROOFSTEP]
obtain ⟨V, V_in, VH⟩ : ∃ (V : Set G), V ∈ 𝓝 (1 : G) ∧ V ∩ (H : Set G) = {1}
[GOAL]
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Subgroup G
inst✝ : DiscreteTopology { x // x ∈ H }
⊢ ∃ V, V ∈ 𝓝 1 ∧ V ∩ ↑H = {1}
case intro.intro
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Subgroup G
inst✝ : DiscreteTopology { x // x ∈ H }
V : Set G
V_in : V ∈ 𝓝 1
VH : V ∩ ↑H = {1}
⊢ IsClosed ↑H
[PROOFSTEP]
exact nhds_inter_eq_singleton_of_mem_discrete H.one_mem
[GOAL]
case intro.intro
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Subgroup G
inst✝ : DiscreteTopology { x // x ∈ H }
V : Set G
V_in : V ∈ 𝓝 1
VH : V ∩ ↑H = {1}
⊢ IsClosed ↑H
[PROOFSTEP]
haveI : SeparatedSpace G := separated_iff_t2.mpr ‹_›
[GOAL]
case intro.intro
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Subgroup G
inst✝ : DiscreteTopology { x // x ∈ H }
V : Set G
V_in : V ∈ 𝓝 1
VH : V ∩ ↑H = {1}
this : SeparatedSpace G
⊢ IsClosed ↑H
[PROOFSTEP]
have : (fun p : G × G => p.2 / p.1) ⁻¹' V ∈ 𝓤 G := preimage_mem_comap V_in
[GOAL]
case intro.intro
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Subgroup G
inst✝ : DiscreteTopology { x // x ∈ H }
V : Set G
V_in : V ∈ 𝓝 1
VH : V ∩ ↑H = {1}
this✝ : SeparatedSpace G
this : (fun p => p.snd / p.fst) ⁻¹' V ∈ 𝓤 G
⊢ IsClosed ↑H
[PROOFSTEP]
apply isClosed_of_spaced_out this
[GOAL]
case intro.intro
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Subgroup G
inst✝ : DiscreteTopology { x // x ∈ H }
V : Set G
V_in : V ∈ 𝓝 1
VH : V ∩ ↑H = {1}
this✝ : SeparatedSpace G
this : (fun p => p.snd / p.fst) ⁻¹' V ∈ 𝓤 G
⊢ Set.Pairwise ↑H fun x y => ¬(x, y) ∈ (fun p => p.snd / p.fst) ⁻¹' V
[PROOFSTEP]
intro h h_in h' h'_in
[GOAL]
case intro.intro
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Subgroup G
inst✝ : DiscreteTopology { x // x ∈ H }
V : Set G
V_in : V ∈ 𝓝 1
VH : V ∩ ↑H = {1}
this✝ : SeparatedSpace G
this : (fun p => p.snd / p.fst) ⁻¹' V ∈ 𝓤 G
h : G
h_in : h ∈ ↑H
h' : G
h'_in : h' ∈ ↑H
⊢ h ≠ h' → (fun x y => ¬(x, y) ∈ (fun p => p.snd / p.fst) ⁻¹' V) h h'
[PROOFSTEP]
contrapose!
[GOAL]
case intro.intro
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Subgroup G
inst✝ : DiscreteTopology { x // x ∈ H }
V : Set G
V_in : V ∈ 𝓝 1
VH : V ∩ ↑H = {1}
this✝ : SeparatedSpace G
this : (fun p => p.snd / p.fst) ⁻¹' V ∈ 𝓤 G
h : G
h_in : h ∈ ↑H
h' : G
h'_in : h' ∈ ↑H
⊢ ¬¬(h, h') ∈ (fun p => p.snd / p.fst) ⁻¹' V → h = h'
[PROOFSTEP]
simp only [Set.mem_preimage, not_not]
[GOAL]
case intro.intro
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Subgroup G
inst✝ : DiscreteTopology { x // x ∈ H }
V : Set G
V_in : V ∈ 𝓝 1
VH : V ∩ ↑H = {1}
this✝ : SeparatedSpace G
this : (fun p => p.snd / p.fst) ⁻¹' V ∈ 𝓤 G
h : G
h_in : h ∈ ↑H
h' : G
h'_in : h' ∈ ↑H
⊢ h' / h ∈ V → h = h'
[PROOFSTEP]
rintro (hyp : h' / h ∈ V)
[GOAL]
case intro.intro
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Subgroup G
inst✝ : DiscreteTopology { x // x ∈ H }
V : Set G
V_in : V ∈ 𝓝 1
VH : V ∩ ↑H = {1}
this✝ : SeparatedSpace G
this : (fun p => p.snd / p.fst) ⁻¹' V ∈ 𝓤 G
h : G
h_in : h ∈ ↑H
h' : G
h'_in : h' ∈ ↑H
hyp : h' / h ∈ V
⊢ h = h'
[PROOFSTEP]
have : h' / h ∈ ({1} : Set G) := VH ▸ Set.mem_inter hyp (H.div_mem h'_in h_in)
[GOAL]
case intro.intro
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Subgroup G
inst✝ : DiscreteTopology { x // x ∈ H }
V : Set G
V_in : V ∈ 𝓝 1
VH : V ∩ ↑H = {1}
this✝¹ : SeparatedSpace G
this✝ : (fun p => p.snd / p.fst) ⁻¹' V ∈ 𝓤 G
h : G
h_in : h ∈ ↑H
h' : G
h'_in : h' ∈ ↑H
hyp : h' / h ∈ V
this : h' / h ∈ {1}
⊢ h = h'
[PROOFSTEP]
exact (eq_of_div_eq_one this).symm
[GOAL]
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Type u_2
inst✝ : Group H
f : H →* G
hf : Function.Injective ↑f
hf' : DiscreteTopology { x // x ∈ range f }
⊢ Tendsto (↑f) cofinite (cocompact G)
[PROOFSTEP]
replace hf : Function.Injective f.rangeRestrict := by simpa
[GOAL]
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Type u_2
inst✝ : Group H
f : H →* G
hf : Function.Injective ↑f
hf' : DiscreteTopology { x // x ∈ range f }
⊢ Function.Injective ↑(rangeRestrict f)
[PROOFSTEP]
simpa
[GOAL]
G : Type u_1
inst✝⁴ : Group G
inst✝³ : TopologicalSpace G
inst✝² : TopologicalGroup G
inst✝¹ : T2Space G
H : Type u_2
inst✝ : Group H
f : H →* G
hf' : DiscreteTopology { x // x ∈ range f }
hf : Function.Injective ↑(rangeRestrict f)
⊢ Tendsto (↑f) cofinite (cocompact G)
[PROOFSTEP]
exact f.range.tendsto_coe_cofinite_of_discrete.comp hf.tendsto_cofinite
[GOAL]
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
⊢ UniformGroup G
[PROOFSTEP]
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
[GOAL]
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this :
  Tendsto ((fun p => p.fst / p.snd) ∘ fun p => (p.fst.snd / p.fst.fst, p.snd.snd / p.snd.fst))
    (comap (fun p => (p.fst.snd / p.fst.fst, p.snd.snd / p.snd.fst)) (Filter.prod (𝓝 1) (𝓝 1))) (𝓝 (1 / 1))
⊢ UniformGroup G
[PROOFSTEP]
constructor
[GOAL]
case uniformContinuous_div
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this :
  Tendsto ((fun p => p.fst / p.snd) ∘ fun p => (p.fst.snd / p.fst.fst, p.snd.snd / p.snd.fst))
    (comap (fun p => (p.fst.snd / p.fst.fst, p.snd.snd / p.snd.fst)) (Filter.prod (𝓝 1) (𝓝 1))) (𝓝 (1 / 1))
⊢ UniformContinuous fun p => p.fst / p.snd
[PROOFSTEP]
rw [UniformContinuous, uniformity_prod_eq_prod, tendsto_map'_iff, uniformity_eq_comap_nhds_one' G, tendsto_comap_iff,
  prod_comap_comap_eq]
[GOAL]
case uniformContinuous_div
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this :
  Tendsto ((fun p => p.fst / p.snd) ∘ fun p => (p.fst.snd / p.fst.fst, p.snd.snd / p.snd.fst))
    (comap (fun p => (p.fst.snd / p.fst.fst, p.snd.snd / p.snd.fst)) (Filter.prod (𝓝 1) (𝓝 1))) (𝓝 (1 / 1))
⊢ Tendsto
    ((fun p => p.snd / p.fst) ∘
      (fun x => (x.fst.fst / x.fst.snd, x.snd.fst / x.snd.snd)) ∘ fun p =>
        ((p.fst.fst, p.snd.fst), p.fst.snd, p.snd.snd))
    (comap (fun p => (p.fst.snd / p.fst.fst, p.snd.snd / p.snd.fst)) (𝓝 1 ×ˢ 𝓝 1)) (𝓝 1)
[PROOFSTEP]
simp only [Function.comp, div_eq_mul_inv, mul_inv_rev, inv_inv, mul_comm, mul_left_comm] at *
[GOAL]
case uniformContinuous_div
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this :
  Tendsto (fun x => x.snd.fst * (x.fst.snd * x.fst.fst⁻¹ * x.snd.snd⁻¹))
    (comap (fun p => (p.fst.snd * p.fst.fst⁻¹, p.snd.snd * p.snd.fst⁻¹)) (Filter.prod (𝓝 1) (𝓝 1))) (𝓝 (1 * 1⁻¹))
⊢ Tendsto (fun x => x.fst.snd * (x.snd.fst * x.fst.fst⁻¹ * x.snd.snd⁻¹))
    (comap (fun p => (p.fst.snd * p.fst.fst⁻¹, p.snd.snd * p.snd.fst⁻¹)) (𝓝 1 ×ˢ 𝓝 1)) (𝓝 1)
[PROOFSTEP]
simp only [inv_one, mul_one, ← mul_assoc] at this
[GOAL]
case uniformContinuous_div
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this :
  Tendsto (fun x => x.snd.fst * x.fst.snd * x.fst.fst⁻¹ * x.snd.snd⁻¹)
    (comap (fun p => (p.fst.snd * p.fst.fst⁻¹, p.snd.snd * p.snd.fst⁻¹)) (Filter.prod (𝓝 1) (𝓝 1))) (𝓝 1)
⊢ Tendsto (fun x => x.fst.snd * (x.snd.fst * x.fst.fst⁻¹ * x.snd.snd⁻¹))
    (comap (fun p => (p.fst.snd * p.fst.fst⁻¹, p.snd.snd * p.snd.fst⁻¹)) (𝓝 1 ×ˢ 𝓝 1)) (𝓝 1)
[PROOFSTEP]
simp_rw [← mul_assoc, mul_comm]
[GOAL]
case uniformContinuous_div
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this :
  Tendsto (fun x => x.snd.fst * x.fst.snd * x.fst.fst⁻¹ * x.snd.snd⁻¹)
    (comap (fun p => (p.fst.snd * p.fst.fst⁻¹, p.snd.snd * p.snd.fst⁻¹)) (Filter.prod (𝓝 1) (𝓝 1))) (𝓝 1)
⊢ Tendsto (fun x => x.snd.fst * x.fst.snd * x.fst.fst⁻¹ * x.snd.snd⁻¹)
    (comap (fun p => (p.fst.snd * p.fst.fst⁻¹, p.snd.snd * p.snd.fst⁻¹)) (𝓝 1 ×ˢ 𝓝 1)) (𝓝 1)
[PROOFSTEP]
assumption
[GOAL]
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
⊢ T2Space G ↔ IsClosed {1}
[PROOFSTEP]
haveI : UniformGroup G := comm_topologicalGroup_is_uniform
[GOAL]
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this : UniformGroup G
⊢ T2Space G ↔ IsClosed {1}
[PROOFSTEP]
rw [← separated_iff_t2, separatedSpace_iff, ← closure_eq_iff_isClosed]
[GOAL]
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this : UniformGroup G
⊢ 𝓢 G = idRel ↔ closure {1} = {1}
[PROOFSTEP]
constructor
[GOAL]
case mp
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this : UniformGroup G
⊢ 𝓢 G = idRel → closure {1} = {1}
[PROOFSTEP]
intro h
[GOAL]
case mpr
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this : UniformGroup G
⊢ closure {1} = {1} → 𝓢 G = idRel
[PROOFSTEP]
intro h
[GOAL]
case mp
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this : UniformGroup G
h : 𝓢 G = idRel
⊢ closure {1} = {1}
[PROOFSTEP]
apply Subset.antisymm
[GOAL]
case mp.h₁
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this : UniformGroup G
h : 𝓢 G = idRel
⊢ closure {1} ⊆ {1}
[PROOFSTEP]
intro x x_in
[GOAL]
case mp.h₁
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this : UniformGroup G
h : 𝓢 G = idRel
x : G
x_in : x ∈ closure {1}
⊢ x ∈ {1}
[PROOFSTEP]
have := group_separationRel x 1
[GOAL]
case mp.h₁
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this✝ : UniformGroup G
h : 𝓢 G = idRel
x : G
x_in : x ∈ closure {1}
this : (x, 1) ∈ 𝓢 G ↔ x / 1 ∈ closure {1}
⊢ x ∈ {1}
[PROOFSTEP]
rw [div_one] at this
[GOAL]
case mp.h₁
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this✝ : UniformGroup G
h : 𝓢 G = idRel
x : G
x_in : x ∈ closure {1}
this : (x, 1) ∈ 𝓢 G ↔ x ∈ closure {1}
⊢ x ∈ {1}
[PROOFSTEP]
rw [← this, h] at x_in
[GOAL]
case mp.h₁
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this✝ : UniformGroup G
h : 𝓢 G = idRel
x : G
x_in : (x, 1) ∈ idRel
this : (x, 1) ∈ 𝓢 G ↔ x ∈ closure {1}
⊢ x ∈ {1}
[PROOFSTEP]
rwa [mem_singleton_iff]
[GOAL]
case mp.h₂
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this : UniformGroup G
h : 𝓢 G = idRel
⊢ {1} ⊆ closure {1}
[PROOFSTEP]
exact subset_closure
[GOAL]
case mpr
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this : UniformGroup G
h : closure {1} = {1}
⊢ 𝓢 G = idRel
[PROOFSTEP]
ext p
[GOAL]
case mpr.h
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this : UniformGroup G
h : closure {1} = {1}
p : G × G
⊢ p ∈ 𝓢 G ↔ p ∈ idRel
[PROOFSTEP]
cases' p with x y
[GOAL]
case mpr.h.mk
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this : UniformGroup G
h : closure {1} = {1}
x y : G
⊢ (x, y) ∈ 𝓢 G ↔ (x, y) ∈ idRel
[PROOFSTEP]
rw [group_separationRel x, h, mem_singleton_iff, div_eq_one]
[GOAL]
case mpr.h.mk
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
this : UniformGroup G
h : closure {1} = {1}
x y : G
⊢ x = y ↔ (x, y) ∈ idRel
[PROOFSTEP]
rfl
[GOAL]
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
H : ∀ (x : G), x ≠ 1 → ∃ U, U ∈ 𝓝 1 ∧ ¬x ∈ U
⊢ T2Space G
[PROOFSTEP]
rw [TopologicalGroup.t2Space_iff_one_closed, ← isOpen_compl_iff, isOpen_iff_mem_nhds]
[GOAL]
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
H : ∀ (x : G), x ≠ 1 → ∃ U, U ∈ 𝓝 1 ∧ ¬x ∈ U
⊢ ∀ (a : G), a ∈ {1}ᶜ → {1}ᶜ ∈ 𝓝 a
[PROOFSTEP]
intro x x_not
[GOAL]
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
H : ∀ (x : G), x ≠ 1 → ∃ U, U ∈ 𝓝 1 ∧ ¬x ∈ U
x : G
x_not : x ∈ {1}ᶜ
⊢ {1}ᶜ ∈ 𝓝 x
[PROOFSTEP]
have : x ≠ 1 := mem_compl_singleton_iff.mp x_not
[GOAL]
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
H : ∀ (x : G), x ≠ 1 → ∃ U, U ∈ 𝓝 1 ∧ ¬x ∈ U
x : G
x_not : x ∈ {1}ᶜ
this : x ≠ 1
⊢ {1}ᶜ ∈ 𝓝 x
[PROOFSTEP]
rcases H x this with ⟨U, U_in, xU⟩
[GOAL]
case intro.intro
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
H : ∀ (x : G), x ≠ 1 → ∃ U, U ∈ 𝓝 1 ∧ ¬x ∈ U
x : G
x_not : x ∈ {1}ᶜ
this : x ≠ 1
U : Set G
U_in : U ∈ 𝓝 1
xU : ¬x ∈ U
⊢ {1}ᶜ ∈ 𝓝 x
[PROOFSTEP]
rw [← nhds_one_symm G] at U_in
[GOAL]
case intro.intro
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
H : ∀ (x : G), x ≠ 1 → ∃ U, U ∈ 𝓝 1 ∧ ¬x ∈ U
x : G
x_not : x ∈ {1}ᶜ
this : x ≠ 1
U : Set G
U_in : U ∈ comap Inv.inv (𝓝 1)
xU : ¬x ∈ U
⊢ {1}ᶜ ∈ 𝓝 x
[PROOFSTEP]
rcases U_in with ⟨W, W_in, UW⟩
[GOAL]
case intro.intro.intro.intro
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
H : ∀ (x : G), x ≠ 1 → ∃ U, U ∈ 𝓝 1 ∧ ¬x ∈ U
x : G
x_not : x ∈ {1}ᶜ
this : x ≠ 1
U : Set G
xU : ¬x ∈ U
W : Set G
W_in : W ∈ 𝓝 1
UW : Inv.inv ⁻¹' W ⊆ U
⊢ {1}ᶜ ∈ 𝓝 x
[PROOFSTEP]
rw [← nhds_translation_mul_inv]
[GOAL]
case intro.intro.intro.intro
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
H : ∀ (x : G), x ≠ 1 → ∃ U, U ∈ 𝓝 1 ∧ ¬x ∈ U
x : G
x_not : x ∈ {1}ᶜ
this : x ≠ 1
U : Set G
xU : ¬x ∈ U
W : Set G
W_in : W ∈ 𝓝 1
UW : Inv.inv ⁻¹' W ⊆ U
⊢ {1}ᶜ ∈ comap (fun y => y * x⁻¹) (𝓝 1)
[PROOFSTEP]
use W, W_in
[GOAL]
case right
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
H : ∀ (x : G), x ≠ 1 → ∃ U, U ∈ 𝓝 1 ∧ ¬x ∈ U
x : G
x_not : x ∈ {1}ᶜ
this : x ≠ 1
U : Set G
xU : ¬x ∈ U
W : Set G
W_in : W ∈ 𝓝 1
UW : Inv.inv ⁻¹' W ⊆ U
⊢ (fun y => y * x⁻¹) ⁻¹' W ⊆ {1}ᶜ
[PROOFSTEP]
rw [subset_compl_comm]
[GOAL]
case right
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
H : ∀ (x : G), x ≠ 1 → ∃ U, U ∈ 𝓝 1 ∧ ¬x ∈ U
x : G
x_not : x ∈ {1}ᶜ
this : x ≠ 1
U : Set G
xU : ¬x ∈ U
W : Set G
W_in : W ∈ 𝓝 1
UW : Inv.inv ⁻¹' W ⊆ U
⊢ {1} ⊆ ((fun y => y * x⁻¹) ⁻¹' W)ᶜ
[PROOFSTEP]
suffices x⁻¹ ∉ W by simpa
[GOAL]
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
H : ∀ (x : G), x ≠ 1 → ∃ U, U ∈ 𝓝 1 ∧ ¬x ∈ U
x : G
x_not : x ∈ {1}ᶜ
this✝ : x ≠ 1
U : Set G
xU : ¬x ∈ U
W : Set G
W_in : W ∈ 𝓝 1
UW : Inv.inv ⁻¹' W ⊆ U
this : ¬x⁻¹ ∈ W
⊢ {1} ⊆ ((fun y => y * x⁻¹) ⁻¹' W)ᶜ
[PROOFSTEP]
simpa
[GOAL]
case right
G : Type u_1
inst✝² : CommGroup G
inst✝¹ : TopologicalSpace G
inst✝ : TopologicalGroup G
H : ∀ (x : G), x ≠ 1 → ∃ U, U ∈ 𝓝 1 ∧ ¬x ∈ U
x : G
x_not : x ∈ {1}ᶜ
this : x ≠ 1
U : Set G
xU : ¬x ∈ U
W : Set G
W_in : W ∈ 𝓝 1
UW : Inv.inv ⁻¹' W ⊆ U
⊢ ¬x⁻¹ ∈ W
[PROOFSTEP]
exact fun h => xU (UW h)
[GOAL]
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
[PROOFSTEP]
ext : 1
[GOAL]
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
[PROOFSTEP]
rw [uniformity_eq_comap_nhds_one' G, uniformity_eq_comap_nhds_one G]
[GOAL]
α : 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.snd / t.fst) (comap (fun p => (↑e p.fst, ↑e p.snd)) (𝓝 (x₀, x₀))) (𝓝 1)
[PROOFSTEP]
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]
[GOAL]
α : 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.snd / x.fst) ∘ fun t => (↑e t.fst, ↑e t.snd)) = ↑e ∘ fun t => t.snd / t.fst
[PROOFSTEP]
ext t
[GOAL]
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.snd / x.fst) ∘ fun t => (↑e t.fst, ↑e t.snd)) t = (↑e ∘ fun t => t.snd / t.fst) t
[PROOFSTEP]
change e t.2 / e t.1 = e (t.2 / t.1)
[GOAL]
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.snd / ↑e t.fst = ↑e (t.snd / t.fst)
[PROOFSTEP]
rw [← map_div e t.2 t.1]
[GOAL]
α : 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.snd / x.fst) ∘ fun t => (↑e t.fst, ↑e t.snd)) = ↑e ∘ fun t => t.snd / t.fst
⊢ Tendsto (fun t => t.snd / t.fst) (comap (fun p => (↑e p.fst, ↑e p.snd)) (𝓝 (x₀, x₀))) (𝓝 1)
[PROOFSTEP]
have lim : Tendsto (fun x : α × α => x.2 / x.1) (𝓝 (x₀, x₀)) (𝓝 (e 1)) := by
  simpa using (continuous_div'.comp (@continuous_swap α α _ _)).tendsto (x₀, x₀)
[GOAL]
α : 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.snd / x.fst) ∘ fun t => (↑e t.fst, ↑e t.snd)) = ↑e ∘ fun t => t.snd / t.fst
⊢ Tendsto (fun x => x.snd / x.fst) (𝓝 (x₀, x₀)) (𝓝 (↑e 1))
[PROOFSTEP]
simpa using (continuous_div'.comp (@continuous_swap α α _ _)).tendsto (x₀, x₀)
[GOAL]
α : 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.snd / x.fst) ∘ fun t => (↑e t.fst, ↑e t.snd)) = ↑e ∘ fun t => t.snd / t.fst
lim : Tendsto (fun x => x.snd / x.fst) (𝓝 (x₀, x₀)) (𝓝 (↑e 1))
⊢ Tendsto (fun t => t.snd / t.fst) (comap (fun p => (↑e p.fst, ↑e p.snd)) (𝓝 (x₀, x₀))) (𝓝 1)
[PROOFSTEP]
simpa using de.tendsto_comap_nhds_nhds lim comm
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
⊢ ∃ U₂,
    U₂ ∈ comap (↑e) (𝓝 x₀) ∧ ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W'
[PROOFSTEP]
let Nx := 𝓝 x₀
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
⊢ ∃ U₂,
    U₂ ∈ comap (↑e) (𝓝 x₀) ∧ ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W'
[PROOFSTEP]
let ee := fun u : β × β => (e u.1, e u.2)
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
⊢ ∃ U₂,
    U₂ ∈ comap (↑e) (𝓝 x₀) ∧ ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W'
[PROOFSTEP]
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 : _)
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
⊢ Tendsto (fun a => (a.snd - a.fst, y₁)) (comap (↑e) Nx ×ˢ comap (↑e) Nx) (𝓝 (0, y₁))
[PROOFSTEP]
have :=
  Tendsto.prod_mk (tendsto_sub_comap_self de x₀)
    (tendsto_const_nhds : Tendsto (fun _ : β × β => y₁) (comap ee <| 𝓝 (x₀, x₀)) (𝓝 y₁))
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
this : Tendsto (fun x => (x.snd - x.fst, y₁)) (comap (fun p => (↑e p.fst, ↑e p.snd)) (𝓝 (x₀, x₀))) (𝓝 0 ×ˢ 𝓝 y₁)
⊢ Tendsto (fun a => (a.snd - a.fst, y₁)) (comap (↑e) Nx ×ˢ comap (↑e) Nx) (𝓝 (0, y₁))
[PROOFSTEP]
rw [nhds_prod_eq, prod_comap_comap_eq, ← nhds_prod_eq]
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
this : Tendsto (fun x => (x.snd - x.fst, y₁)) (comap (fun p => (↑e p.fst, ↑e p.snd)) (𝓝 (x₀, x₀))) (𝓝 0 ×ˢ 𝓝 y₁)
⊢ Tendsto (fun a => (a.snd - a.fst, y₁)) (comap (fun p => (↑e p.fst, ↑e p.snd)) (𝓝 (x₀, x₀))) (𝓝 0 ×ˢ 𝓝 y₁)
[PROOFSTEP]
exact (this : _)
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
lim1 : Tendsto (fun a => (a.snd - a.fst, y₁)) (comap (↑e) Nx ×ˢ comap (↑e) Nx) (𝓝 (0, y₁))
⊢ ∃ U₂,
    U₂ ∈ comap (↑e) (𝓝 x₀) ∧ ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W'
[PROOFSTEP]
have lim2 : Tendsto (fun p : β × δ => φ p.1 p.2) (𝓝 (0, y₁)) (𝓝 0) := by simpa using hφ.tendsto (0, y₁)
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
lim1 : Tendsto (fun a => (a.snd - a.fst, y₁)) (comap (↑e) Nx ×ˢ comap (↑e) Nx) (𝓝 (0, y₁))
⊢ Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, y₁)) (𝓝 0)
[PROOFSTEP]
simpa using hφ.tendsto (0, y₁)
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
lim1 : Tendsto (fun a => (a.snd - a.fst, y₁)) (comap (↑e) Nx ×ˢ comap (↑e) Nx) (𝓝 (0, y₁))
lim2 : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, y₁)) (𝓝 0)
⊢ ∃ U₂,
    U₂ ∈ comap (↑e) (𝓝 x₀) ∧ ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W'
[PROOFSTEP]
have lim := lim2.comp lim1
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
lim1 : Tendsto (fun a => (a.snd - a.fst, y₁)) (comap (↑e) Nx ×ˢ comap (↑e) Nx) (𝓝 (0, y₁))
lim2 : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, y₁)) (𝓝 0)
lim : Tendsto ((fun p => ↑(↑φ p.fst) p.snd) ∘ fun a => (a.snd - a.fst, y₁)) (comap (↑e) Nx ×ˢ comap (↑e) Nx) (𝓝 0)
⊢ ∃ U₂,
    U₂ ∈ comap (↑e) (𝓝 x₀) ∧ ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W'
[PROOFSTEP]
rw [tendsto_prod_self_iff] at lim
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
lim1 : Tendsto (fun a => (a.snd - a.fst, y₁)) (comap (↑e) Nx ×ˢ comap (↑e) Nx) (𝓝 (0, y₁))
lim2 : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, y₁)) (𝓝 0)
lim :
  ∀ (W : Set G),
    W ∈ 𝓝 0 →
      ∃ U,
        U ∈ comap (↑e) Nx ∧
          ∀ (x x' : β), x ∈ U → x' ∈ U → ((fun p => ↑(↑φ p.fst) p.snd) ∘ fun a => (a.snd - a.fst, y₁)) (x, x') ∈ W
⊢ ∃ U₂,
    U₂ ∈ comap (↑e) (𝓝 x₀) ∧ ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W'
[PROOFSTEP]
simp_rw [ball_mem_comm]
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₁ : δ
Nx : Filter α := 𝓝 x₀
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
lim1 : Tendsto (fun a => (a.snd - a.fst, y₁)) (comap (↑e) Nx ×ˢ comap (↑e) Nx) (𝓝 (0, y₁))
lim2 : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, y₁)) (𝓝 0)
lim :
  ∀ (W : Set G),
    W ∈ 𝓝 0 →
      ∃ U,
        U ∈ comap (↑e) Nx ∧
          ∀ (x x' : β), x ∈ U → x' ∈ U → ((fun p => ↑(↑φ p.fst) p.snd) ∘ fun a => (a.snd - a.fst, y₁)) (x, x') ∈ W
⊢ ∃ U₂, U₂ ∈ comap (↑e) (𝓝 x₀) ∧ ∀ (a b : β), a ∈ U₂ → b ∈ U₂ → ↑(↑φ (b - a)) y₁ ∈ W'
[PROOFSTEP]
exact lim W' W'_nhd
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
⊢ ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
let ee := fun u : β × β => (e u.1, e u.2)
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
⊢ ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
let ff := fun u : δ × δ => (f u.1, f u.2)
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
⊢ ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
have lim_φ : Filter.Tendsto (fun p : β × δ => φ p.1 p.2) (𝓝 (0, 0)) (𝓝 0) := by simpa using hφ.tendsto (0, 0)
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
⊢ Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
[PROOFSTEP]
simpa using hφ.tendsto (0, 0)
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
⊢ ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
have lim_φ_sub_sub :
  Tendsto (fun p : (β × β) × δ × δ => (fun p : β × δ => φ p.1 p.2) (p.1.2 - p.1.1, p.2.2 - p.2.1))
    ((comap ee <| 𝓝 (x₀, x₀)) ×ˢ (comap ff <| 𝓝 (y₀, y₀))) (𝓝 0) :=
  by
  have lim_sub_sub :
    Tendsto (fun p : (β × β) × δ × δ => (p.1.2 - p.1.1, p.2.2 - p.2.1)) (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀)))
      (𝓝 0 ×ˢ 𝓝 0) :=
    by
    have := Filter.prod_mono (tendsto_sub_comap_self de x₀) (tendsto_sub_comap_self df y₀)
    rwa [prod_map_map_eq] at this
  rw [← nhds_prod_eq] at lim_sub_sub
  exact Tendsto.comp lim_φ lim_sub_sub
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
⊢ Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
[PROOFSTEP]
have lim_sub_sub :
  Tendsto (fun p : (β × β) × δ × δ => (p.1.2 - p.1.1, p.2.2 - p.2.1)) (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀)))
    (𝓝 0 ×ˢ 𝓝 0) :=
  by
  have := Filter.prod_mono (tendsto_sub_comap_self de x₀) (tendsto_sub_comap_self df y₀)
  rwa [prod_map_map_eq] at this
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
⊢ Tendsto (fun p => (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst)) (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀)))
    (𝓝 0 ×ˢ 𝓝 0)
[PROOFSTEP]
have := Filter.prod_mono (tendsto_sub_comap_self de x₀) (tendsto_sub_comap_self df y₀)
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
this :
  map (fun t => t.snd - t.fst) (comap (fun p => (↑e p.fst, ↑e p.snd)) (𝓝 (x₀, x₀))) ×ˢ
      map (fun t => t.snd - t.fst) (comap (fun p => (↑f p.fst, ↑f p.snd)) (𝓝 (y₀, y₀))) ≤
    𝓝 0 ×ˢ 𝓝 0
⊢ Tendsto (fun p => (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst)) (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀)))
    (𝓝 0 ×ˢ 𝓝 0)
[PROOFSTEP]
rwa [prod_map_map_eq] at this
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_sub_sub :
  Tendsto (fun p => (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst)) (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀)))
    (𝓝 0 ×ˢ 𝓝 0)
⊢ Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
[PROOFSTEP]
rw [← nhds_prod_eq] at lim_sub_sub
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_sub_sub :
  Tendsto (fun p => (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst)) (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀)))
    (𝓝 (0, 0))
⊢ Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
[PROOFSTEP]
exact Tendsto.comp lim_φ lim_sub_sub
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
⊢ ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
rcases exists_nhds_zero_quarter W'_nhd with ⟨W, W_nhd, W4⟩
[GOAL]
case intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
⊢ ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
have :
  ∃ U₁ ∈ comap e (𝓝 x₀),
    ∃ V₁ ∈ comap f (𝓝 y₀),
      ∀ (x) (_ : x ∈ U₁) (x') (_ : x' ∈ U₁),
        ∀ (y) (_ : y ∈ V₁) (y') (_ : y' ∈ V₁), (fun p : β × δ => φ p.1 p.2) (x' - x, y' - y) ∈ W :=
  by
  rcases tendsto_prod_iff.1 lim_φ_sub_sub W W_nhd with ⟨U, U_in, V, V_in, H⟩
  rw [nhds_prod_eq, ← prod_comap_comap_eq, mem_prod_same_iff] at U_in V_in
  rcases U_in with ⟨U₁, U₁_in, HU₁⟩
  rcases V_in with ⟨V₁, V₁_in, HV₁⟩
  exists U₁, U₁_in, V₁, V₁_in
  intro x x_in x' x'_in y y_in y' y'_in
  exact H _ _ (HU₁ (mk_mem_prod x_in x'_in)) (HV₁ (mk_mem_prod y_in y'_in))
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
⊢ ∃ U₁,
    U₁ ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V₁,
        V₁ ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U₁ →
              ∀ (x' : β),
                x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
[PROOFSTEP]
rcases tendsto_prod_iff.1 lim_φ_sub_sub W W_nhd with ⟨U, U_in, V, V_in, H⟩
[GOAL]
case intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U : Set (β × β)
U_in : U ∈ comap ee (𝓝 (x₀, x₀))
V : Set (δ × δ)
V_in : V ∈ comap ff (𝓝 (y₀, y₀))
H :
  ∀ (x : β × β) (y : δ × δ),
    x ∈ U → y ∈ V → (fun p => ↑(↑φ p.fst) p.snd) ((x, y).fst.snd - (x, y).fst.fst, (x, y).snd.snd - (x, y).snd.fst) ∈ W
⊢ ∃ U₁,
    U₁ ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V₁,
        V₁ ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U₁ →
              ∀ (x' : β),
                x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
[PROOFSTEP]
rw [nhds_prod_eq, ← prod_comap_comap_eq, mem_prod_same_iff] at U_in V_in
[GOAL]
case intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U : Set (β × β)
U_in : ∃ t, t ∈ comap (↑e) (𝓝 x₀) ∧ t ×ˢ t ⊆ U
V : Set (δ × δ)
V_in : ∃ t, t ∈ comap (↑f) (𝓝 y₀) ∧ t ×ˢ t ⊆ V
H :
  ∀ (x : β × β) (y : δ × δ),
    x ∈ U → y ∈ V → (fun p => ↑(↑φ p.fst) p.snd) ((x, y).fst.snd - (x, y).fst.fst, (x, y).snd.snd - (x, y).snd.fst) ∈ W
⊢ ∃ U₁,
    U₁ ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V₁,
        V₁ ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U₁ →
              ∀ (x' : β),
                x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
[PROOFSTEP]
rcases U_in with ⟨U₁, U₁_in, HU₁⟩
[GOAL]
case intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U : Set (β × β)
V : Set (δ × δ)
V_in : ∃ t, t ∈ comap (↑f) (𝓝 y₀) ∧ t ×ˢ t ⊆ V
H :
  ∀ (x : β × β) (y : δ × δ),
    x ∈ U → y ∈ V → (fun p => ↑(↑φ p.fst) p.snd) ((x, y).fst.snd - (x, y).fst.fst, (x, y).snd.snd - (x, y).snd.fst) ∈ W
U₁ : Set β
U₁_in : U₁ ∈ comap (↑e) (𝓝 x₀)
HU₁ : U₁ ×ˢ U₁ ⊆ U
⊢ ∃ U₁,
    U₁ ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V₁,
        V₁ ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U₁ →
              ∀ (x' : β),
                x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
[PROOFSTEP]
rcases V_in with ⟨V₁, V₁_in, HV₁⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U : Set (β × β)
V : Set (δ × δ)
H :
  ∀ (x : β × β) (y : δ × δ),
    x ∈ U → y ∈ V → (fun p => ↑(↑φ p.fst) p.snd) ((x, y).fst.snd - (x, y).fst.fst, (x, y).snd.snd - (x, y).snd.fst) ∈ W
U₁ : Set β
U₁_in : U₁ ∈ comap (↑e) (𝓝 x₀)
HU₁ : U₁ ×ˢ U₁ ⊆ U
V₁ : Set δ
V₁_in : V₁ ∈ comap (↑f) (𝓝 y₀)
HV₁ : V₁ ×ˢ V₁ ⊆ V
⊢ ∃ U₁,
    U₁ ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V₁,
        V₁ ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U₁ →
              ∀ (x' : β),
                x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
[PROOFSTEP]
exists U₁, U₁_in, V₁, V₁_in
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U : Set (β × β)
V : Set (δ × δ)
H :
  ∀ (x : β × β) (y : δ × δ),
    x ∈ U → y ∈ V → (fun p => ↑(↑φ p.fst) p.snd) ((x, y).fst.snd - (x, y).fst.fst, (x, y).snd.snd - (x, y).snd.fst) ∈ W
U₁ : Set β
U₁_in : U₁ ∈ comap (↑e) (𝓝 x₀)
HU₁ : U₁ ×ˢ U₁ ⊆ U
V₁ : Set δ
V₁_in : V₁ ∈ comap (↑f) (𝓝 y₀)
HV₁ : V₁ ×ˢ V₁ ⊆ V
⊢ ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
[PROOFSTEP]
intro x x_in x' x'_in y y_in y' y'_in
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U : Set (β × β)
V : Set (δ × δ)
H :
  ∀ (x : β × β) (y : δ × δ),
    x ∈ U → y ∈ V → (fun p => ↑(↑φ p.fst) p.snd) ((x, y).fst.snd - (x, y).fst.fst, (x, y).snd.snd - (x, y).snd.fst) ∈ W
U₁ : Set β
U₁_in : U₁ ∈ comap (↑e) (𝓝 x₀)
HU₁ : U₁ ×ˢ U₁ ⊆ U
V₁ : Set δ
V₁_in : V₁ ∈ comap (↑f) (𝓝 y₀)
HV₁ : V₁ ×ˢ V₁ ⊆ V
x : β
x_in : x ∈ U₁
x' : β
x'_in : x' ∈ U₁
y : δ
y_in : y ∈ V₁
y' : δ
y'_in : y' ∈ V₁
⊢ (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
[PROOFSTEP]
exact H _ _ (HU₁ (mk_mem_prod x_in x'_in)) (HV₁ (mk_mem_prod y_in y'_in))
[GOAL]
case intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
this :
  ∃ U₁,
    U₁ ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V₁,
        V₁ ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U₁ →
              ∀ (x' : β),
                x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
⊢ ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
rcases this with ⟨U₁, U₁_nhd, V₁, V₁_nhd, H⟩
[GOAL]
case intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
⊢ ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
obtain ⟨x₁, x₁_in⟩ : U₁.Nonempty := (de.comap_nhds_neBot _).nonempty_of_mem U₁_nhd
[GOAL]
case intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
⊢ ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
obtain ⟨y₁, y₁_in⟩ : V₁.Nonempty := (df.comap_nhds_neBot _).nonempty_of_mem V₁_nhd
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
⊢ ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
have cont_flip : Continuous fun p : δ × β => φ.flip p.1 p.2 :=
  by
  show Continuous ((fun p : β × δ => φ p.1 p.2) ∘ Prod.swap)
  exact hφ.comp continuous_swap
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
⊢ Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
[PROOFSTEP]
show Continuous ((fun p : β × δ => φ p.1 p.2) ∘ Prod.swap)
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
⊢ Continuous ((fun p => ↑(↑φ p.fst) p.snd) ∘ Prod.swap)
[PROOFSTEP]
exact hφ.comp continuous_swap
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
⊢ ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
rcases extend_Z_bilin_aux de hφ W_nhd x₀ y₁ with ⟨U₂, U₂_nhd, HU⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
U₂ : Set β
U₂_nhd : U₂ ∈ comap (↑e) (𝓝 x₀)
HU : ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
⊢ ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
rcases extend_Z_bilin_aux df cont_flip W_nhd y₀ x₁ with ⟨V₂, V₂_nhd, HV⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
U₂ : Set β
U₂_nhd : U₂ ∈ comap (↑e) (𝓝 x₀)
HU : ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
V₂ : Set δ
V₂_nhd : V₂ ∈ comap (↑f) (𝓝 y₀)
HV : ∀ (x : δ), x ∈ V₂ → ∀ (x' : δ), x' ∈ V₂ → (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (x' - x, x₁) ∈ W
⊢ ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
exists U₁ ∩ U₂, inter_mem U₁_nhd U₂_nhd, V₁ ∩ V₂, inter_mem V₁_nhd V₂_nhd
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
U₂ : Set β
U₂_nhd : U₂ ∈ comap (↑e) (𝓝 x₀)
HU : ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
V₂ : Set δ
V₂_nhd : V₂ ∈ comap (↑f) (𝓝 y₀)
HV : ∀ (x : δ), x ∈ V₂ → ∀ (x' : δ), x' ∈ V₂ → (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (x' - x, x₁) ∈ W
⊢ ∀ (x : β),
    x ∈ U₁ ∩ U₂ →
      ∀ (x' : β),
        x' ∈ U₁ ∩ U₂ →
          ∀ (y : δ),
            y ∈ V₁ ∩ V₂ →
              ∀ (y' : δ),
                y' ∈ V₁ ∩ V₂ → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
rintro x ⟨xU₁, xU₂⟩ x' ⟨x'U₁, x'U₂⟩ y ⟨yV₁, yV₂⟩ y' ⟨y'V₁, y'V₂⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
U₂ : Set β
U₂_nhd : U₂ ∈ comap (↑e) (𝓝 x₀)
HU : ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
V₂ : Set δ
V₂_nhd : V₂ ∈ comap (↑f) (𝓝 y₀)
HV : ∀ (x : δ), x ∈ V₂ → ∀ (x' : δ), x' ∈ V₂ → (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (x' - x, x₁) ∈ W
x : β
xU₁ : x ∈ U₁
xU₂ : x ∈ U₂
x' : β
x'U₁ : x' ∈ U₁
x'U₂ : x' ∈ U₂
y : δ
yV₁ : y ∈ V₁
yV₂ : y ∈ V₂
y' : δ
y'V₁ : y' ∈ V₁
y'V₂ : y' ∈ V₂
⊢ (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
have key_formula : φ x' y' - φ x y = φ (x' - x) y₁ + φ (x' - x) (y' - y₁) + φ x₁ (y' - y) + φ (x - x₁) (y' - y) := by
  simp; abel
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
U₂ : Set β
U₂_nhd : U₂ ∈ comap (↑e) (𝓝 x₀)
HU : ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
V₂ : Set δ
V₂_nhd : V₂ ∈ comap (↑f) (𝓝 y₀)
HV : ∀ (x : δ), x ∈ V₂ → ∀ (x' : δ), x' ∈ V₂ → (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (x' - x, x₁) ∈ W
x : β
xU₁ : x ∈ U₁
xU₂ : x ∈ U₂
x' : β
x'U₁ : x' ∈ U₁
x'U₂ : x' ∈ U₂
y : δ
yV₁ : y ∈ V₁
yV₂ : y ∈ V₂
y' : δ
y'V₁ : y' ∈ V₁
y'V₂ : y' ∈ V₂
⊢ ↑(↑φ x') y' - ↑(↑φ x) y = ↑(↑φ (x' - x)) y₁ + ↑(↑φ (x' - x)) (y' - y₁) + ↑(↑φ x₁) (y' - y) + ↑(↑φ (x - x₁)) (y' - y)
[PROOFSTEP]
simp
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
U₂ : Set β
U₂_nhd : U₂ ∈ comap (↑e) (𝓝 x₀)
HU : ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
V₂ : Set δ
V₂_nhd : V₂ ∈ comap (↑f) (𝓝 y₀)
HV : ∀ (x : δ), x ∈ V₂ → ∀ (x' : δ), x' ∈ V₂ → (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (x' - x, x₁) ∈ W
x : β
xU₁ : x ∈ U₁
xU₂ : x ∈ U₂
x' : β
x'U₁ : x' ∈ U₁
x'U₂ : x' ∈ U₂
y : δ
yV₁ : y ∈ V₁
yV₂ : y ∈ V₂
y' : δ
y'V₁ : y' ∈ V₁
y'V₂ : y' ∈ V₂
⊢ ↑(↑φ x') y' - ↑(↑φ x) y =
    ↑(↑φ x') y' - ↑(↑φ x) y' + (↑(↑φ x₁) y' - ↑(↑φ x₁) y) + (↑(↑φ x) y' - ↑(↑φ x₁) y' - (↑(↑φ x) y - ↑(↑φ x₁) y))
[PROOFSTEP]
abel
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
U₂ : Set β
U₂_nhd : U₂ ∈ comap (↑e) (𝓝 x₀)
HU : ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
V₂ : Set δ
V₂_nhd : V₂ ∈ comap (↑f) (𝓝 y₀)
HV : ∀ (x : δ), x ∈ V₂ → ∀ (x' : δ), x' ∈ V₂ → (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (x' - x, x₁) ∈ W
x : β
xU₁ : x ∈ U₁
xU₂ : x ∈ U₂
x' : β
x'U₁ : x' ∈ U₁
x'U₂ : x' ∈ U₂
y : δ
yV₁ : y ∈ V₁
yV₂ : y ∈ V₂
y' : δ
y'V₁ : y' ∈ V₁
y'V₂ : y' ∈ V₂
⊢ ↑(↑φ x') y' - ↑(↑φ x) y =
    ↑(↑φ x') y' - ↑(↑φ x) y' + (↑(↑φ x₁) y' - ↑(↑φ x₁) y) + (↑(↑φ x) y' - ↑(↑φ x₁) y' - (↑(↑φ x) y - ↑(↑φ x₁) y))
[PROOFSTEP]
abel
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
U₂ : Set β
U₂_nhd : U₂ ∈ comap (↑e) (𝓝 x₀)
HU : ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
V₂ : Set δ
V₂_nhd : V₂ ∈ comap (↑f) (𝓝 y₀)
HV : ∀ (x : δ), x ∈ V₂ → ∀ (x' : δ), x' ∈ V₂ → (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (x' - x, x₁) ∈ W
x : β
xU₁ : x ∈ U₁
xU₂ : x ∈ U₂
x' : β
x'U₁ : x' ∈ U₁
x'U₂ : x' ∈ U₂
y : δ
yV₁ : y ∈ V₁
yV₂ : y ∈ V₂
y' : δ
y'V₁ : y' ∈ V₁
y'V₂ : y' ∈ V₂
key_formula :
  ↑(↑φ x') y' - ↑(↑φ x) y = ↑(↑φ (x' - x)) y₁ + ↑(↑φ (x' - x)) (y' - y₁) + ↑(↑φ x₁) (y' - y) + ↑(↑φ (x - x₁)) (y' - y)
⊢ (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
[PROOFSTEP]
rw [key_formula]
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
U₂ : Set β
U₂_nhd : U₂ ∈ comap (↑e) (𝓝 x₀)
HU : ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
V₂ : Set δ
V₂_nhd : V₂ ∈ comap (↑f) (𝓝 y₀)
HV : ∀ (x : δ), x ∈ V₂ → ∀ (x' : δ), x' ∈ V₂ → (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (x' - x, x₁) ∈ W
x : β
xU₁ : x ∈ U₁
xU₂ : x ∈ U₂
x' : β
x'U₁ : x' ∈ U₁
x'U₂ : x' ∈ U₂
y : δ
yV₁ : y ∈ V₁
yV₂ : y ∈ V₂
y' : δ
y'V₁ : y' ∈ V₁
y'V₂ : y' ∈ V₂
key_formula :
  ↑(↑φ x') y' - ↑(↑φ x) y = ↑(↑φ (x' - x)) y₁ + ↑(↑φ (x' - x)) (y' - y₁) + ↑(↑φ x₁) (y' - y) + ↑(↑φ (x - x₁)) (y' - y)
⊢ ↑(↑φ (x' - x)) y₁ + ↑(↑φ (x' - x)) (y' - y₁) + ↑(↑φ x₁) (y' - y) + ↑(↑φ (x - x₁)) (y' - y) ∈ W'
[PROOFSTEP]
have h₁ := HU x xU₂ x' x'U₂
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
U₂ : Set β
U₂_nhd : U₂ ∈ comap (↑e) (𝓝 x₀)
HU : ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
V₂ : Set δ
V₂_nhd : V₂ ∈ comap (↑f) (𝓝 y₀)
HV : ∀ (x : δ), x ∈ V₂ → ∀ (x' : δ), x' ∈ V₂ → (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (x' - x, x₁) ∈ W
x : β
xU₁ : x ∈ U₁
xU₂ : x ∈ U₂
x' : β
x'U₁ : x' ∈ U₁
x'U₂ : x' ∈ U₂
y : δ
yV₁ : y ∈ V₁
yV₂ : y ∈ V₂
y' : δ
y'V₁ : y' ∈ V₁
y'V₂ : y' ∈ V₂
key_formula :
  ↑(↑φ x') y' - ↑(↑φ x) y = ↑(↑φ (x' - x)) y₁ + ↑(↑φ (x' - x)) (y' - y₁) + ↑(↑φ x₁) (y' - y) + ↑(↑φ (x - x₁)) (y' - y)
h₁ : (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
⊢ ↑(↑φ (x' - x)) y₁ + ↑(↑φ (x' - x)) (y' - y₁) + ↑(↑φ x₁) (y' - y) + ↑(↑φ (x - x₁)) (y' - y) ∈ W'
[PROOFSTEP]
have h₂ := H x xU₁ x' x'U₁ y₁ y₁_in y' y'V₁
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
U₂ : Set β
U₂_nhd : U₂ ∈ comap (↑e) (𝓝 x₀)
HU : ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
V₂ : Set δ
V₂_nhd : V₂ ∈ comap (↑f) (𝓝 y₀)
HV : ∀ (x : δ), x ∈ V₂ → ∀ (x' : δ), x' ∈ V₂ → (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (x' - x, x₁) ∈ W
x : β
xU₁ : x ∈ U₁
xU₂ : x ∈ U₂
x' : β
x'U₁ : x' ∈ U₁
x'U₂ : x' ∈ U₂
y : δ
yV₁ : y ∈ V₁
yV₂ : y ∈ V₂
y' : δ
y'V₁ : y' ∈ V₁
y'V₂ : y' ∈ V₂
key_formula :
  ↑(↑φ x') y' - ↑(↑φ x) y = ↑(↑φ (x' - x)) y₁ + ↑(↑φ (x' - x)) (y' - y₁) + ↑(↑φ x₁) (y' - y) + ↑(↑φ (x - x₁)) (y' - y)
h₁ : (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
h₂ : (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y₁) ∈ W
⊢ ↑(↑φ (x' - x)) y₁ + ↑(↑φ (x' - x)) (y' - y₁) + ↑(↑φ x₁) (y' - y) + ↑(↑φ (x - x₁)) (y' - y) ∈ W'
[PROOFSTEP]
have h₃ := HV y yV₂ y' y'V₂
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
U₂ : Set β
U₂_nhd : U₂ ∈ comap (↑e) (𝓝 x₀)
HU : ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
V₂ : Set δ
V₂_nhd : V₂ ∈ comap (↑f) (𝓝 y₀)
HV : ∀ (x : δ), x ∈ V₂ → ∀ (x' : δ), x' ∈ V₂ → (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (x' - x, x₁) ∈ W
x : β
xU₁ : x ∈ U₁
xU₂ : x ∈ U₂
x' : β
x'U₁ : x' ∈ U₁
x'U₂ : x' ∈ U₂
y : δ
yV₁ : y ∈ V₁
yV₂ : y ∈ V₂
y' : δ
y'V₁ : y' ∈ V₁
y'V₂ : y' ∈ V₂
key_formula :
  ↑(↑φ x') y' - ↑(↑φ x) y = ↑(↑φ (x' - x)) y₁ + ↑(↑φ (x' - x)) (y' - y₁) + ↑(↑φ x₁) (y' - y) + ↑(↑φ (x - x₁)) (y' - y)
h₁ : (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
h₂ : (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y₁) ∈ W
h₃ : (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (y' - y, x₁) ∈ W
⊢ ↑(↑φ (x' - x)) y₁ + ↑(↑φ (x' - x)) (y' - y₁) + ↑(↑φ x₁) (y' - y) + ↑(↑φ (x - x₁)) (y' - y) ∈ W'
[PROOFSTEP]
have h₄ := H x₁ x₁_in x xU₁ y yV₁ y' y'V₁
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
ee : (u : β × β) → (fun x => α) u.fst × (fun x => α) u.snd := fun u => (↑e u.fst, ↑e u.snd)
ff : (u : δ × δ) → (fun x => γ) u.fst × (fun x => γ) u.snd := fun u => (↑f u.fst, ↑f u.snd)
lim_φ : Tendsto (fun p => ↑(↑φ p.fst) p.snd) (𝓝 (0, 0)) (𝓝 0)
lim_φ_sub_sub :
  Tendsto (fun p => (fun p => ↑(↑φ p.fst) p.snd) (p.fst.snd - p.fst.fst, p.snd.snd - p.snd.fst))
    (comap ee (𝓝 (x₀, x₀)) ×ˢ comap ff (𝓝 (y₀, y₀))) (𝓝 0)
W : Set G
W_nhd : W ∈ 𝓝 0
W4 : ∀ {v w s t : G}, v ∈ W → w ∈ W → s ∈ W → t ∈ W → v + w + s + t ∈ W'
U₁ : Set β
U₁_nhd : U₁ ∈ comap (↑e) (𝓝 x₀)
V₁ : Set δ
V₁_nhd : V₁ ∈ comap (↑f) (𝓝 y₀)
H :
  ∀ (x : β),
    x ∈ U₁ →
      ∀ (x' : β), x' ∈ U₁ → ∀ (y : δ), y ∈ V₁ → ∀ (y' : δ), y' ∈ V₁ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y) ∈ W
x₁ : β
x₁_in : x₁ ∈ U₁
y₁ : δ
y₁_in : y₁ ∈ V₁
cont_flip : Continuous fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd
U₂ : Set β
U₂_nhd : U₂ ∈ comap (↑e) (𝓝 x₀)
HU : ∀ (x : β), x ∈ U₂ → ∀ (x' : β), x' ∈ U₂ → (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
V₂ : Set δ
V₂_nhd : V₂ ∈ comap (↑f) (𝓝 y₀)
HV : ∀ (x : δ), x ∈ V₂ → ∀ (x' : δ), x' ∈ V₂ → (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (x' - x, x₁) ∈ W
x : β
xU₁ : x ∈ U₁
xU₂ : x ∈ U₂
x' : β
x'U₁ : x' ∈ U₁
x'U₂ : x' ∈ U₂
y : δ
yV₁ : y ∈ V₁
yV₂ : y ∈ V₂
y' : δ
y'V₁ : y' ∈ V₁
y'V₂ : y' ∈ V₂
key_formula :
  ↑(↑φ x') y' - ↑(↑φ x) y = ↑(↑φ (x' - x)) y₁ + ↑(↑φ (x' - x)) (y' - y₁) + ↑(↑φ x₁) (y' - y) + ↑(↑φ (x - x₁)) (y' - y)
h₁ : (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y₁) ∈ W
h₂ : (fun p => ↑(↑φ p.fst) p.snd) (x' - x, y' - y₁) ∈ W
h₃ : (fun p => ↑(↑(AddMonoidHom.flip φ) p.fst) p.snd) (y' - y, x₁) ∈ W
h₄ : (fun p => ↑(↑φ p.fst) p.snd) (x - x₁, y' - y) ∈ W
⊢ ↑(↑φ (x' - x)) y₁ + ↑(↑φ (x' - x)) (y' - y₁) + ↑(↑φ x₁) (y' - y) + ↑(↑φ (x - x₁)) (y' - y) ∈ W'
[PROOFSTEP]
exact W4 h₁ h₂ h₃ h₄
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
⊢ Continuous (extend (_ : DenseInducing fun p => (↑e p.fst, ↑f p.snd)) fun p => ↑(↑φ p.fst) p.snd)
[PROOFSTEP]
refine' continuous_extend_of_cauchy _ _
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
⊢ ∀ (b : α × γ), Cauchy (map (fun p => ↑(↑φ p.fst) p.snd) (comap (fun p => (↑e p.fst, ↑f p.snd)) (𝓝 b)))
[PROOFSTEP]
rintro ⟨x₀, y₀⟩
[GOAL]
case mk
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
⊢ Cauchy (map (fun p => ↑(↑φ p.fst) p.snd) (comap (fun p => (↑e p.fst, ↑f p.snd)) (𝓝 (x₀, y₀))))
[PROOFSTEP]
constructor
[GOAL]
case mk.left
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
⊢ NeBot (map (fun p => ↑(↑φ p.fst) p.snd) (comap (fun p => (↑e p.fst, ↑f p.snd)) (𝓝 (x₀, y₀))))
[PROOFSTEP]
apply NeBot.map
[GOAL]
case mk.left.hf
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
⊢ NeBot (comap (fun p => (↑e p.fst, ↑f p.snd)) (𝓝 (x₀, y₀)))
[PROOFSTEP]
apply comap_neBot
[GOAL]
case mk.left.hf.hm
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
⊢ ∀ (t : Set (α × γ)), t ∈ 𝓝 (x₀, y₀) → ∃ a, (↑e a.fst, ↑f a.snd) ∈ t
[PROOFSTEP]
intro U h
[GOAL]
case mk.left.hf.hm
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
U : Set (α × γ)
h : U ∈ 𝓝 (x₀, y₀)
⊢ ∃ a, (↑e a.fst, ↑f a.snd) ∈ U
[PROOFSTEP]
rcases mem_closure_iff_nhds.1 ((de.prod df).dense (x₀, y₀)) U h with ⟨x, x_in, ⟨z, z_x⟩⟩
[GOAL]
case mk.left.hf.hm.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
U : Set (α × γ)
h : U ∈ 𝓝 (x₀, y₀)
x : α × γ
x_in : x ∈ U
z : β × δ
z_x : (fun p => (↑e p.fst, ↑f p.snd)) z = x
⊢ ∃ a, (↑e a.fst, ↑f a.snd) ∈ U
[PROOFSTEP]
exists z
[GOAL]
case mk.left.hf.hm.intro.intro.intro
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
U : Set (α × γ)
h : U ∈ 𝓝 (x₀, y₀)
x : α × γ
x_in : x ∈ U
z : β × δ
z_x : (fun p => (↑e p.fst, ↑f p.snd)) z = x
⊢ (↑e z.fst, ↑f z.snd) ∈ U
[PROOFSTEP]
aesop
[GOAL]
case mk.right
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
⊢ map (fun p => ↑(↑φ p.fst) p.snd) (comap (fun p => (↑e p.fst, ↑f p.snd)) (𝓝 (x₀, y₀))) ×ˢ
      map (fun p => ↑(↑φ p.fst) p.snd) (comap (fun p => (↑e p.fst, ↑f p.snd)) (𝓝 (x₀, y₀))) ≤
    𝓤 G
[PROOFSTEP]
suffices
  map (fun p : (β × δ) × β × δ => (fun p : β × δ => φ p.1 p.2) p.2 - (fun p : β × δ => φ p.1 p.2) p.1)
      (comap (fun p : (β × δ) × β × δ => ((e p.1.1, f p.1.2), (e p.2.1, f p.2.2))) (𝓝 (x₀, y₀) ×ˢ 𝓝 (x₀, y₀))) ≤
    𝓝 0
  by rwa [uniformity_eq_comap_nhds_zero G, prod_map_map_eq, ← map_le_iff_le_comap, Filter.map_map, prod_comap_comap_eq]
[GOAL]
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
this :
  map (fun p => (fun p => ↑(↑φ p.fst) p.snd) p.snd - (fun p => ↑(↑φ p.fst) p.snd) p.fst)
      (comap (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) (𝓝 (x₀, y₀) ×ˢ 𝓝 (x₀, y₀))) ≤
    𝓝 0
⊢ map (fun p => ↑(↑φ p.fst) p.snd) (comap (fun p => (↑e p.fst, ↑f p.snd)) (𝓝 (x₀, y₀))) ×ˢ
      map (fun p => ↑(↑φ p.fst) p.snd) (comap (fun p => (↑e p.fst, ↑f p.snd)) (𝓝 (x₀, y₀))) ≤
    𝓤 G
[PROOFSTEP]
rwa [uniformity_eq_comap_nhds_zero G, prod_map_map_eq, ← map_le_iff_le_comap, Filter.map_map, prod_comap_comap_eq]
[GOAL]
case mk.right
α : 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.fst) p.snd
W' : Set G
W'_nhd : W' ∈ 𝓝 0
x₀ : α
y₀ : γ
⊢ map (fun p => (fun p => ↑(↑φ p.fst) p.snd) p.snd - (fun p => ↑(↑φ p.fst) p.snd) p.fst)
      (comap (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) (𝓝 (x₀, y₀) ×ˢ 𝓝 (x₀, y₀))) ≤
    𝓝 0
[PROOFSTEP]
intro W' W'_nhd
[GOAL]
case mk.right
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
⊢ W' ∈
    map (fun p => (fun p => ↑(↑φ p.fst) p.snd) p.snd - (fun p => ↑(↑φ p.fst) p.snd) p.fst)
      (comap (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) (𝓝 (x₀, y₀) ×ˢ 𝓝 (x₀, y₀)))
[PROOFSTEP]
have key := extend_Z_bilin_key de df hφ W'_nhd x₀ y₀
[GOAL]
case mk.right
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
key :
  ∃ U,
    U ∈ comap (↑e) (𝓝 x₀) ∧
      ∃ V,
        V ∈ comap (↑f) (𝓝 y₀) ∧
          ∀ (x : β),
            x ∈ U →
              ∀ (x' : β),
                x' ∈ U →
                  ∀ (y : δ),
                    y ∈ V →
                      ∀ (y' : δ),
                        y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
⊢ W' ∈
    map (fun p => (fun p => ↑(↑φ p.fst) p.snd) p.snd - (fun p => ↑(↑φ p.fst) p.snd) p.fst)
      (comap (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) (𝓝 (x₀, y₀) ×ˢ 𝓝 (x₀, y₀)))
[PROOFSTEP]
rcases key with ⟨U, U_nhd, V, V_nhd, h⟩
[GOAL]
case mk.right.intro.intro.intro.intro
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
U_nhd : U ∈ comap (↑e) (𝓝 x₀)
V : Set δ
V_nhd : V ∈ comap (↑f) (𝓝 y₀)
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
⊢ W' ∈
    map (fun p => (fun p => ↑(↑φ p.fst) p.snd) p.snd - (fun p => ↑(↑φ p.fst) p.snd) p.fst)
      (comap (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) (𝓝 (x₀, y₀) ×ˢ 𝓝 (x₀, y₀)))
[PROOFSTEP]
rw [mem_comap] at U_nhd
[GOAL]
case mk.right.intro.intro.intro.intro
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
U_nhd : ∃ t, t ∈ 𝓝 x₀ ∧ ↑e ⁻¹' t ⊆ U
V : Set δ
V_nhd : V ∈ comap (↑f) (𝓝 y₀)
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
⊢ W' ∈
    map (fun p => (fun p => ↑(↑φ p.fst) p.snd) p.snd - (fun p => ↑(↑φ p.fst) p.snd) p.fst)
      (comap (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) (𝓝 (x₀, y₀) ×ˢ 𝓝 (x₀, y₀)))
[PROOFSTEP]
rcases U_nhd with ⟨U', U'_nhd, U'_sub⟩
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
V_nhd : V ∈ comap (↑f) (𝓝 y₀)
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
⊢ W' ∈
    map (fun p => (fun p => ↑(↑φ p.fst) p.snd) p.snd - (fun p => ↑(↑φ p.fst) p.snd) p.fst)
      (comap (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) (𝓝 (x₀, y₀) ×ˢ 𝓝 (x₀, y₀)))
[PROOFSTEP]
rw [mem_comap] at V_nhd
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
V_nhd : ∃ t, t ∈ 𝓝 y₀ ∧ ↑f ⁻¹' t ⊆ V
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
⊢ W' ∈
    map (fun p => (fun p => ↑(↑φ p.fst) p.snd) p.snd - (fun p => ↑(↑φ p.fst) p.snd) p.fst)
      (comap (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) (𝓝 (x₀, y₀) ×ˢ 𝓝 (x₀, y₀)))
[PROOFSTEP]
rcases V_nhd with ⟨V', V'_nhd, V'_sub⟩
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
⊢ W' ∈
    map (fun p => (fun p => ↑(↑φ p.fst) p.snd) p.snd - (fun p => ↑(↑φ p.fst) p.snd) p.fst)
      (comap (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) (𝓝 (x₀, y₀) ×ˢ 𝓝 (x₀, y₀)))
[PROOFSTEP]
rw [mem_map, mem_comap, nhds_prod_eq]
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
⊢ ∃ t,
    t ∈ (𝓝 x₀ ×ˢ 𝓝 y₀) ×ˢ 𝓝 x₀ ×ˢ 𝓝 y₀ ∧
      (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) ⁻¹' t ⊆
        (fun p => (fun p => ↑(↑φ p.fst) p.snd) p.snd - (fun p => ↑(↑φ p.fst) p.snd) p.fst) ⁻¹' W'
[PROOFSTEP]
exists (U' ×ˢ V') ×ˢ U' ×ˢ V'
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
⊢ (U' ×ˢ V') ×ˢ U' ×ˢ V' ∈ (𝓝 x₀ ×ˢ 𝓝 y₀) ×ˢ 𝓝 x₀ ×ˢ 𝓝 y₀ ∧
    (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) ⁻¹' (U' ×ˢ V') ×ˢ U' ×ˢ V' ⊆
      (fun p => (fun p => ↑(↑φ p.fst) p.snd) p.snd - (fun p => ↑(↑φ p.fst) p.snd) p.fst) ⁻¹' W'
[PROOFSTEP]
rw [mem_prod_same_iff]
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
⊢ (∃ t, t ∈ 𝓝 x₀ ×ˢ 𝓝 y₀ ∧ t ×ˢ t ⊆ (U' ×ˢ V') ×ˢ U' ×ˢ V') ∧
    (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) ⁻¹' (U' ×ˢ V') ×ˢ U' ×ˢ V' ⊆
      (fun p => (fun p => ↑(↑φ p.fst) p.snd) p.snd - (fun p => ↑(↑φ p.fst) p.snd) p.fst) ⁻¹' W'
[PROOFSTEP]
simp only [exists_prop]
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
⊢ (∃ t, t ∈ 𝓝 x₀ ×ˢ 𝓝 y₀ ∧ t ×ˢ t ⊆ (U' ×ˢ V') ×ˢ U' ×ˢ V') ∧
    (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) ⁻¹' (U' ×ˢ V') ×ˢ U' ×ˢ V' ⊆
      (fun p => ↑(↑φ p.snd.fst) p.snd.snd - ↑(↑φ p.fst.fst) p.fst.snd) ⁻¹' W'
[PROOFSTEP]
constructor
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro.left
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
⊢ ∃ t, t ∈ 𝓝 x₀ ×ˢ 𝓝 y₀ ∧ t ×ˢ t ⊆ (U' ×ˢ V') ×ˢ U' ×ˢ V'
[PROOFSTEP]
have := prod_mem_prod U'_nhd V'_nhd
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro.left
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
this : U' ×ˢ V' ∈ 𝓝 x₀ ×ˢ 𝓝 y₀
⊢ ∃ t, t ∈ 𝓝 x₀ ×ˢ 𝓝 y₀ ∧ t ×ˢ t ⊆ (U' ×ˢ V') ×ˢ U' ×ˢ V'
[PROOFSTEP]
tauto
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro.right
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
⊢ (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) ⁻¹' (U' ×ˢ V') ×ˢ U' ×ˢ V' ⊆
    (fun p => ↑(↑φ p.snd.fst) p.snd.snd - ↑(↑φ p.fst.fst) p.fst.snd) ⁻¹' W'
[PROOFSTEP]
intro p h'
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro.right
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
p : (β × δ) × β × δ
h' : p ∈ (fun p => ((↑e p.fst.fst, ↑f p.fst.snd), ↑e p.snd.fst, ↑f p.snd.snd)) ⁻¹' (U' ×ˢ V') ×ˢ U' ×ˢ V'
⊢ p ∈ (fun p => ↑(↑φ p.snd.fst) p.snd.snd - ↑(↑φ p.fst.fst) p.fst.snd) ⁻¹' W'
[PROOFSTEP]
simp only [Set.mem_preimage, Set.prod_mk_mem_set_prod_eq] at h'
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro.right
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
p : (β × δ) × β × δ
h' : (↑e p.fst.fst ∈ U' ∧ ↑f p.fst.snd ∈ V') ∧ ↑e p.snd.fst ∈ U' ∧ ↑f p.snd.snd ∈ V'
⊢ p ∈ (fun p => ↑(↑φ p.snd.fst) p.snd.snd - ↑(↑φ p.fst.fst) p.fst.snd) ⁻¹' W'
[PROOFSTEP]
rcases p with ⟨⟨x, y⟩, ⟨x', y'⟩⟩
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro.right.mk.mk.mk
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
x : β
y : δ
x' : β
y' : δ
h' :
  (↑e ((x, y), x', y').fst.fst ∈ U' ∧ ↑f ((x, y), x', y').fst.snd ∈ V') ∧
    ↑e ((x, y), x', y').snd.fst ∈ U' ∧ ↑f ((x, y), x', y').snd.snd ∈ V'
⊢ ((x, y), x', y') ∈ (fun p => ↑(↑φ p.snd.fst) p.snd.snd - ↑(↑φ p.fst.fst) p.fst.snd) ⁻¹' W'
[PROOFSTEP]
apply h
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro.right.mk.mk.mk.x
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
x : β
y : δ
x' : β
y' : δ
h' :
  (↑e ((x, y), x', y').fst.fst ∈ U' ∧ ↑f ((x, y), x', y').fst.snd ∈ V') ∧
    ↑e ((x, y), x', y').snd.fst ∈ U' ∧ ↑f ((x, y), x', y').snd.snd ∈ V'
⊢ x ∈ U
[PROOFSTEP]
tauto
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro.right.mk.mk.mk.x
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
x : β
y : δ
x' : β
y' : δ
h' :
  (↑e ((x, y), x', y').fst.fst ∈ U' ∧ ↑f ((x, y), x', y').fst.snd ∈ V') ∧
    ↑e ((x, y), x', y').snd.fst ∈ U' ∧ ↑f ((x, y), x', y').snd.snd ∈ V'
⊢ x' ∈ U
[PROOFSTEP]
tauto
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro.right.mk.mk.mk.x
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
x : β
y : δ
x' : β
y' : δ
h' :
  (↑e ((x, y), x', y').fst.fst ∈ U' ∧ ↑f ((x, y), x', y').fst.snd ∈ V') ∧
    ↑e ((x, y), x', y').snd.fst ∈ U' ∧ ↑f ((x, y), x', y').snd.snd ∈ V'
⊢ y ∈ V
[PROOFSTEP]
tauto
[GOAL]
case mk.right.intro.intro.intro.intro.intro.intro.intro.intro.right.mk.mk.mk.x
α : 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.fst) p.snd
W'✝ : Set G
W'_nhd✝ : W'✝ ∈ 𝓝 0
x₀ : α
y₀ : γ
W' : Set G
W'_nhd : W' ∈ 𝓝 0
U : Set β
V : Set δ
h :
  ∀ (x : β),
    x ∈ U →
      ∀ (x' : β),
        x' ∈ U →
          ∀ (y : δ),
            y ∈ V →
              ∀ (y' : δ), y' ∈ V → (fun p => ↑(↑φ p.fst) p.snd) (x', y') - (fun p => ↑(↑φ p.fst) p.snd) (x, y) ∈ W'
U' : Set α
U'_nhd : U' ∈ 𝓝 x₀
U'_sub : ↑e ⁻¹' U' ⊆ U
V' : Set γ
V'_nhd : V' ∈ 𝓝 y₀
V'_sub : ↑f ⁻¹' V' ⊆ V
x : β
y : δ
x' : β
y' : δ
h' :
  (↑e ((x, y), x', y').fst.fst ∈ U' ∧ ↑f ((x, y), x', y').fst.snd ∈ V') ∧
    ↑e ((x, y), x', y').snd.fst ∈ U' ∧ ↑f ((x, y), x', y').snd.snd ∈ V'
⊢ y' ∈ V
[PROOFSTEP]
tauto
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
⊢ CompleteSpace (G ⧸ N)
[PROOFSTEP]
letI : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
⊢ CompleteSpace (G ⧸ N)
[PROOFSTEP]
letI : UniformSpace G := TopologicalGroup.toUniformSpace G
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this : UniformSpace G := TopologicalGroup.toUniformSpace G
⊢ CompleteSpace (G ⧸ N)
[PROOFSTEP]
haveI : (𝓤 (G ⧸ N)).IsCountablyGenerated := comap.isCountablyGenerated _ _
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
⊢ CompleteSpace (G ⧸ N)
[PROOFSTEP]
obtain ⟨u, hu, u_mul⟩ := TopologicalGroup.exists_antitone_basis_nhds_one G
[GOAL]
case intro.intro
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
⊢ CompleteSpace (G ⧸ N)
[PROOFSTEP]
obtain ⟨hv, v_anti⟩ := @HasAntitoneBasis.map _ _ _ _ _ _ ((↑) : G → G ⧸ N) hu
[GOAL]
case intro.intro.mk
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (Filter.map mk (𝓝 1)) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
⊢ CompleteSpace (G ⧸ N)
[PROOFSTEP]
rw [← QuotientGroup.nhds_eq N 1, QuotientGroup.mk_one] at hv
[GOAL]
case intro.intro.mk
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
⊢ CompleteSpace (G ⧸ N)
[PROOFSTEP]
refine'
  UniformSpace.complete_of_cauchySeq_tendsto fun x hx =>
    _
      /- Given `n : ℕ`, for sufficiently large `a b : ℕ`, given any lift of `x b`, we can find a lift
          of `x a` such that the quotient of the lifts lies in `u n`. -/
[GOAL]
case intro.intro.mk
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
⊢ ∃ a, Tendsto x atTop (𝓝 a)
[PROOFSTEP]
have key₀ :
  ∀ i j : ℕ, ∃ M : ℕ, j < M ∧ ∀ a b : ℕ, M ≤ a → M ≤ b → ∀ g : G, x b = g → ∃ g' : G, g / g' ∈ u i ∧ x a = g' :=
  by
  have h𝓤GN : (𝓤 (G ⧸ N)).HasBasis (fun _ => True) fun i => {x | x.snd / x.fst ∈ (↑) '' u i} := by
    simpa [uniformity_eq_comap_nhds_one'] using hv.comap _
  rw [h𝓤GN.cauchySeq_iff] at hx
  simp only [ge_iff_le, mem_setOf_eq, forall_true_left, mem_image] at hx
  intro i j
  rcases hx i with ⟨M, hM⟩
  refine' ⟨max j M + 1, (le_max_left _ _).trans_lt (lt_add_one _), fun a b ha hb g hg => _⟩
  obtain ⟨y, y_mem, hy⟩ :=
    hM a (((le_max_right j _).trans (lt_add_one _).le).trans ha) b
      (((le_max_right j _).trans (lt_add_one _).le).trans hb)
  refine' ⟨y⁻¹ * g, by simpa only [div_eq_mul_inv, mul_inv_rev, inv_inv, mul_inv_cancel_left] using y_mem, _⟩
  rw [QuotientGroup.mk_mul, QuotientGroup.mk_inv, hy, hg, inv_div, div_mul_cancel']
    /- Inductively construct a subsequence `φ : ℕ → ℕ` using `key₀` so that if `a b : ℕ` exceed
        `φ (n + 1)`, then we may find lifts whose quotients lie within `u n`. -/
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
⊢ ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
[PROOFSTEP]
have h𝓤GN : (𝓤 (G ⧸ N)).HasBasis (fun _ => True) fun i => {x | x.snd / x.fst ∈ (↑) '' u i} := by
  simpa [uniformity_eq_comap_nhds_one'] using hv.comap _
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
⊢ HasBasis (𝓤 (G ⧸ N)) (fun x => True) fun i => {x | x.snd / x.fst ∈ mk '' u i}
[PROOFSTEP]
simpa [uniformity_eq_comap_nhds_one'] using hv.comap _
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
h𝓤GN : HasBasis (𝓤 (G ⧸ N)) (fun x => True) fun i => {x | x.snd / x.fst ∈ mk '' u i}
⊢ ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
[PROOFSTEP]
rw [h𝓤GN.cauchySeq_iff] at hx
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : ∀ (i : ℕ), True → ∃ N_1, ∀ (m : ℕ), N_1 ≤ m → ∀ (n : ℕ), N_1 ≤ n → (x m, x n) ∈ {x | x.snd / x.fst ∈ mk '' u i}
h𝓤GN : HasBasis (𝓤 (G ⧸ N)) (fun x => True) fun i => {x | x.snd / x.fst ∈ mk '' u i}
⊢ ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
[PROOFSTEP]
simp only [ge_iff_le, mem_setOf_eq, forall_true_left, mem_image] at hx
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
h𝓤GN : HasBasis (𝓤 (G ⧸ N)) (fun x => True) fun i => {x | x.snd / x.fst ∈ mk '' u i}
hx : ∀ (i : ℕ), ∃ N_1, ∀ (m : ℕ), N_1 ≤ m → ∀ (n : ℕ), N_1 ≤ n → ∃ x_1, x_1 ∈ u i ∧ ↑x_1 = x n / x m
⊢ ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
[PROOFSTEP]
intro i j
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
h𝓤GN : HasBasis (𝓤 (G ⧸ N)) (fun x => True) fun i => {x | x.snd / x.fst ∈ mk '' u i}
hx : ∀ (i : ℕ), ∃ N_1, ∀ (m : ℕ), N_1 ≤ m → ∀ (n : ℕ), N_1 ≤ n → ∃ x_1, x_1 ∈ u i ∧ ↑x_1 = x n / x m
i j : ℕ
⊢ ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
[PROOFSTEP]
rcases hx i with ⟨M, hM⟩
[GOAL]
case intro
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
h𝓤GN : HasBasis (𝓤 (G ⧸ N)) (fun x => True) fun i => {x | x.snd / x.fst ∈ mk '' u i}
hx : ∀ (i : ℕ), ∃ N_1, ∀ (m : ℕ), N_1 ≤ m → ∀ (n : ℕ), N_1 ≤ n → ∃ x_1, x_1 ∈ u i ∧ ↑x_1 = x n / x m
i j M : ℕ
hM : ∀ (m : ℕ), M ≤ m → ∀ (n : ℕ), M ≤ n → ∃ x_1, x_1 ∈ u i ∧ ↑x_1 = x n / x m
⊢ ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
[PROOFSTEP]
refine' ⟨max j M + 1, (le_max_left _ _).trans_lt (lt_add_one _), fun a b ha hb g hg => _⟩
[GOAL]
case intro
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
h𝓤GN : HasBasis (𝓤 (G ⧸ N)) (fun x => True) fun i => {x | x.snd / x.fst ∈ mk '' u i}
hx : ∀ (i : ℕ), ∃ N_1, ∀ (m : ℕ), N_1 ≤ m → ∀ (n : ℕ), N_1 ≤ n → ∃ x_1, x_1 ∈ u i ∧ ↑x_1 = x n / x m
i j M : ℕ
hM : ∀ (m : ℕ), M ≤ m → ∀ (n : ℕ), M ≤ n → ∃ x_1, x_1 ∈ u i ∧ ↑x_1 = x n / x m
a b : ℕ
ha : max j M + 1 ≤ a
hb : max j M + 1 ≤ b
g : G
hg : x b = ↑g
⊢ ∃ g', g / g' ∈ u i ∧ x a = ↑g'
[PROOFSTEP]
obtain ⟨y, y_mem, hy⟩ :=
  hM a (((le_max_right j _).trans (lt_add_one _).le).trans ha) b (((le_max_right j _).trans (lt_add_one _).le).trans hb)
[GOAL]
case intro.intro.intro
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
h𝓤GN : HasBasis (𝓤 (G ⧸ N)) (fun x => True) fun i => {x | x.snd / x.fst ∈ mk '' u i}
hx : ∀ (i : ℕ), ∃ N_1, ∀ (m : ℕ), N_1 ≤ m → ∀ (n : ℕ), N_1 ≤ n → ∃ x_1, x_1 ∈ u i ∧ ↑x_1 = x n / x m
i j M : ℕ
hM : ∀ (m : ℕ), M ≤ m → ∀ (n : ℕ), M ≤ n → ∃ x_1, x_1 ∈ u i ∧ ↑x_1 = x n / x m
a b : ℕ
ha : max j M + 1 ≤ a
hb : max j M + 1 ≤ b
g : G
hg : x b = ↑g
y : G
y_mem : y ∈ u i
hy : ↑y = x b / x a
⊢ ∃ g', g / g' ∈ u i ∧ x a = ↑g'
[PROOFSTEP]
refine' ⟨y⁻¹ * g, by simpa only [div_eq_mul_inv, mul_inv_rev, inv_inv, mul_inv_cancel_left] using y_mem, _⟩
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
h𝓤GN : HasBasis (𝓤 (G ⧸ N)) (fun x => True) fun i => {x | x.snd / x.fst ∈ mk '' u i}
hx : ∀ (i : ℕ), ∃ N_1, ∀ (m : ℕ), N_1 ≤ m → ∀ (n : ℕ), N_1 ≤ n → ∃ x_1, x_1 ∈ u i ∧ ↑x_1 = x n / x m
i j M : ℕ
hM : ∀ (m : ℕ), M ≤ m → ∀ (n : ℕ), M ≤ n → ∃ x_1, x_1 ∈ u i ∧ ↑x_1 = x n / x m
a b : ℕ
ha : max j M + 1 ≤ a
hb : max j M + 1 ≤ b
g : G
hg : x b = ↑g
y : G
y_mem : y ∈ u i
hy : ↑y = x b / x a
⊢ g / (y⁻¹ * g) ∈ u i
[PROOFSTEP]
simpa only [div_eq_mul_inv, mul_inv_rev, inv_inv, mul_inv_cancel_left] using y_mem
[GOAL]
case intro.intro.intro
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
h𝓤GN : HasBasis (𝓤 (G ⧸ N)) (fun x => True) fun i => {x | x.snd / x.fst ∈ mk '' u i}
hx : ∀ (i : ℕ), ∃ N_1, ∀ (m : ℕ), N_1 ≤ m → ∀ (n : ℕ), N_1 ≤ n → ∃ x_1, x_1 ∈ u i ∧ ↑x_1 = x n / x m
i j M : ℕ
hM : ∀ (m : ℕ), M ≤ m → ∀ (n : ℕ), M ≤ n → ∃ x_1, x_1 ∈ u i ∧ ↑x_1 = x n / x m
a b : ℕ
ha : max j M + 1 ≤ a
hb : max j M + 1 ≤ b
g : G
hg : x b = ↑g
y : G
y_mem : y ∈ u i
hy : ↑y = x b / x a
⊢ x a = ↑(y⁻¹ * g)
[PROOFSTEP]
rw [QuotientGroup.mk_mul, QuotientGroup.mk_inv, hy, hg, inv_div, div_mul_cancel']
  /- Inductively construct a subsequence `φ : ℕ → ℕ` using `key₀` so that if `a b : ℕ` exceed
      `φ (n + 1)`, then we may find lifts whose quotients lie within `u n`. -/
[GOAL]
case intro.intro.mk
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
⊢ ∃ a, Tendsto x atTop (𝓝 a)
[PROOFSTEP]
set φ : ℕ → ℕ := fun n => Nat.recOn n (choose <| key₀ 0 0) fun k yk => choose <| key₀ (k + 1) yk
[GOAL]
case intro.intro.mk
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
⊢ ∃ a, Tendsto x atTop (𝓝 a)
[PROOFSTEP]
have hφ :
  ∀ n : ℕ,
    φ n < φ (n + 1) ∧
      ∀ a b : ℕ, φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ g : G, x b = g → ∃ g' : G, g / g' ∈ u (n + 1) ∧ x a = g' :=
  fun n =>
  choose_spec
    (key₀ (n + 1) (φ n))
      /- Inductively construct a sequence `x' n : G` of lifts of `x (φ (n + 1))` such that quotients of
          successive terms lie in `x' n / x' (n + 1) ∈ u (n + 1)`. We actually need the proofs that each
          term is a lift to construct the next term, so we use a Σ-type. -/
[GOAL]
case intro.intro.mk
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
hφ :
  ∀ (n : ℕ),
    φ n < φ (n + 1) ∧
      ∀ (a b : ℕ), φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (n + 1) ∧ x a = ↑g'
⊢ ∃ a, Tendsto x atTop (𝓝 a)
[PROOFSTEP]
set x' : ∀ n, PSigma fun g : G => x (φ (n + 1)) = g := fun n =>
  Nat.recOn n
    ⟨choose (QuotientGroup.mk_surjective (x (φ 1))), (choose_spec (QuotientGroup.mk_surjective (x (φ 1)))).symm⟩
    fun k hk =>
    ⟨choose <| (hφ k).2 _ _ (hφ (k + 1)).1.le le_rfl hk.fst hk.snd,
      (choose_spec <| (hφ k).2 _ _ (hφ (k + 1)).1.le le_rfl hk.fst hk.snd).2⟩
[GOAL]
case intro.intro.mk
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
hφ :
  ∀ (n : ℕ),
    φ n < φ (n + 1) ∧
      ∀ (a b : ℕ), φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (n + 1) ∧ x a = ↑g'
x' : (n : ℕ) → (g : G) ×' x (φ (n + 1)) = ↑g :=
  fun n =>
    Nat.recOn n { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
      fun k hk =>
      { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
        snd := (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) }
⊢ ∃ a, Tendsto x atTop (𝓝 a)
[PROOFSTEP]
have hx' : ∀ n : ℕ, (x' n).fst / (x' (n + 1)).fst ∈ u (n + 1) := fun n =>
  (choose_spec <| (hφ n).2 _ _ (hφ (n + 1)).1.le le_rfl (x' n).fst (x' n).snd).1
    /- The sequence `x'` is Cauchy. This is where we exploit the condition on `u`. The key idea
        is to show by decreasing induction that `x' m / x' n ∈ u m` if `m ≤ n`. -/
[GOAL]
case intro.intro.mk
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
hφ :
  ∀ (n : ℕ),
    φ n < φ (n + 1) ∧
      ∀ (a b : ℕ), φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (n + 1) ∧ x a = ↑g'
x' : (n : ℕ) → (g : G) ×' x (φ (n + 1)) = ↑g :=
  fun n =>
    Nat.recOn n { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
      fun k hk =>
      { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
        snd := (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) }
hx' : ∀ (n : ℕ), (x' n).fst / (x' (n + 1)).fst ∈ u (n + 1)
⊢ ∃ a, Tendsto x atTop (𝓝 a)
[PROOFSTEP]
have x'_cauchy : CauchySeq fun n => (x' n).fst :=
  by
  have h𝓤G : (𝓤 G).HasBasis (fun _ => True) fun i => {x | x.snd / x.fst ∈ u i} := by
    simpa [uniformity_eq_comap_nhds_one'] using hu.toHasBasis.comap _
  rw [h𝓤G.cauchySeq_iff']
  simp only [ge_iff_le, mem_setOf_eq, forall_true_left]
  exact fun m =>
    ⟨m, fun n hmn =>
      Nat.decreasingInduction' (fun k _ _ hk => u_mul k ⟨_, _, hx' k, hk, div_mul_div_cancel' _ _ _⟩) hmn
        (by simpa only [div_self'] using mem_of_mem_nhds (hu.mem _))⟩
      /- Since `G` is complete, `x'` converges to some `x₀`, and so the image of this sequence under
          the quotient map converges to `↑x₀`. The image of `x'` is a convergent subsequence of `x`, and
          since `x` is Cauchy, this implies it converges. -/
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
hφ :
  ∀ (n : ℕ),
    φ n < φ (n + 1) ∧
      ∀ (a b : ℕ), φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (n + 1) ∧ x a = ↑g'
x' : (n : ℕ) → (g : G) ×' x (φ (n + 1)) = ↑g :=
  fun n =>
    Nat.recOn n { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
      fun k hk =>
      { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
        snd := (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) }
hx' : ∀ (n : ℕ), (x' n).fst / (x' (n + 1)).fst ∈ u (n + 1)
⊢ CauchySeq fun n => (x' n).fst
[PROOFSTEP]
have h𝓤G : (𝓤 G).HasBasis (fun _ => True) fun i => {x | x.snd / x.fst ∈ u i} := by
  simpa [uniformity_eq_comap_nhds_one'] using hu.toHasBasis.comap _
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
hφ :
  ∀ (n : ℕ),
    φ n < φ (n + 1) ∧
      ∀ (a b : ℕ), φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (n + 1) ∧ x a = ↑g'
x' : (n : ℕ) → (g : G) ×' x (φ (n + 1)) = ↑g :=
  fun n =>
    Nat.recOn n { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
      fun k hk =>
      { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
        snd := (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) }
hx' : ∀ (n : ℕ), (x' n).fst / (x' (n + 1)).fst ∈ u (n + 1)
⊢ HasBasis (𝓤 G) (fun x => True) fun i => {x | x.snd / x.fst ∈ u i}
[PROOFSTEP]
simpa [uniformity_eq_comap_nhds_one'] using hu.toHasBasis.comap _
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
hφ :
  ∀ (n : ℕ),
    φ n < φ (n + 1) ∧
      ∀ (a b : ℕ), φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (n + 1) ∧ x a = ↑g'
x' : (n : ℕ) → (g : G) ×' x (φ (n + 1)) = ↑g :=
  fun n =>
    Nat.recOn n { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
      fun k hk =>
      { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
        snd := (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) }
hx' : ∀ (n : ℕ), (x' n).fst / (x' (n + 1)).fst ∈ u (n + 1)
h𝓤G : HasBasis (𝓤 G) (fun x => True) fun i => {x | x.snd / x.fst ∈ u i}
⊢ CauchySeq fun n => (x' n).fst
[PROOFSTEP]
rw [h𝓤G.cauchySeq_iff']
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
hφ :
  ∀ (n : ℕ),
    φ n < φ (n + 1) ∧
      ∀ (a b : ℕ), φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (n + 1) ∧ x a = ↑g'
x' : (n : ℕ) → (g : G) ×' x (φ (n + 1)) = ↑g :=
  fun n =>
    Nat.recOn n { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
      fun k hk =>
      { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
        snd := (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) }
hx' : ∀ (n : ℕ), (x' n).fst / (x' (n + 1)).fst ∈ u (n + 1)
h𝓤G : HasBasis (𝓤 G) (fun x => True) fun i => {x | x.snd / x.fst ∈ u i}
⊢ ∀ (i : ℕ), True → ∃ N_1, ∀ (n : ℕ), n ≥ N_1 → ((x' n).fst, (x' N_1).fst) ∈ {x | x.snd / x.fst ∈ u i}
[PROOFSTEP]
simp only [ge_iff_le, mem_setOf_eq, forall_true_left]
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
hφ :
  ∀ (n : ℕ),
    φ n < φ (n + 1) ∧
      ∀ (a b : ℕ), φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (n + 1) ∧ x a = ↑g'
x' : (n : ℕ) → (g : G) ×' x (φ (n + 1)) = ↑g :=
  fun n =>
    Nat.recOn n { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
      fun k hk =>
      { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
        snd := (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) }
hx' : ∀ (n : ℕ), (x' n).fst / (x' (n + 1)).fst ∈ u (n + 1)
h𝓤G : HasBasis (𝓤 G) (fun x => True) fun i => {x | x.snd / x.fst ∈ u i}
⊢ ∀ (i : ℕ),
    ∃ N_1,
      ∀ (n : ℕ),
        N_1 ≤ n →
          (Nat.rec { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
                  (fun k hk =>
                    { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
                      snd :=
                        (_ :
                          x (φ (k + 1 + 1)) =
                            ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) })
                  N_1).fst /
              (Nat.rec
                  { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
                  (fun k hk =>
                    { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
                      snd :=
                        (_ :
                          x (φ (k + 1 + 1)) =
                            ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) })
                  n).fst ∈
            u i
[PROOFSTEP]
exact fun m =>
  ⟨m, fun n hmn =>
    Nat.decreasingInduction' (fun k _ _ hk => u_mul k ⟨_, _, hx' k, hk, div_mul_div_cancel' _ _ _⟩) hmn
      (by simpa only [div_self'] using mem_of_mem_nhds (hu.mem _))⟩
    /- Since `G` is complete, `x'` converges to some `x₀`, and so the image of this sequence under
        the quotient map converges to `↑x₀`. The image of `x'` is a convergent subsequence of `x`, and
        since `x` is Cauchy, this implies it converges. -/
[GOAL]
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
hφ :
  ∀ (n : ℕ),
    φ n < φ (n + 1) ∧
      ∀ (a b : ℕ), φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (n + 1) ∧ x a = ↑g'
x' : (n : ℕ) → (g : G) ×' x (φ (n + 1)) = ↑g :=
  fun n =>
    Nat.recOn n { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
      fun k hk =>
      { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
        snd := (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) }
hx' : ∀ (n : ℕ), (x' n).fst / (x' (n + 1)).fst ∈ u (n + 1)
h𝓤G : HasBasis (𝓤 G) (fun x => True) fun i => {x | x.snd / x.fst ∈ u i}
m n : ℕ
hmn : m ≤ n
⊢ (Nat.rec { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
          (fun k hk =>
            { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
              snd :=
                (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) })
          n).fst /
      (Nat.rec { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
          (fun k hk =>
            { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
              snd :=
                (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) })
          n).fst ∈
    u n
[PROOFSTEP]
simpa only [div_self'] using mem_of_mem_nhds (hu.mem _)
[GOAL]
case intro.intro.mk
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
hφ :
  ∀ (n : ℕ),
    φ n < φ (n + 1) ∧
      ∀ (a b : ℕ), φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (n + 1) ∧ x a = ↑g'
x' : (n : ℕ) → (g : G) ×' x (φ (n + 1)) = ↑g :=
  fun n =>
    Nat.recOn n { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
      fun k hk =>
      { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
        snd := (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) }
hx' : ∀ (n : ℕ), (x' n).fst / (x' (n + 1)).fst ∈ u (n + 1)
x'_cauchy : CauchySeq fun n => (x' n).fst
⊢ ∃ a, Tendsto x atTop (𝓝 a)
[PROOFSTEP]
rcases cauchySeq_tendsto_of_complete x'_cauchy with ⟨x₀, hx₀⟩
[GOAL]
case intro.intro.mk.intro
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
hφ :
  ∀ (n : ℕ),
    φ n < φ (n + 1) ∧
      ∀ (a b : ℕ), φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (n + 1) ∧ x a = ↑g'
x' : (n : ℕ) → (g : G) ×' x (φ (n + 1)) = ↑g :=
  fun n =>
    Nat.recOn n { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
      fun k hk =>
      { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
        snd := (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) }
hx' : ∀ (n : ℕ), (x' n).fst / (x' (n + 1)).fst ∈ u (n + 1)
x'_cauchy : CauchySeq fun n => (x' n).fst
x₀ : G
hx₀ : Tendsto (fun n => (x' n).fst) atTop (𝓝 x₀)
⊢ ∃ a, Tendsto x atTop (𝓝 a)
[PROOFSTEP]
refine'
  ⟨↑x₀, tendsto_nhds_of_cauchySeq_of_subseq hx (strictMono_nat_of_lt_succ fun n => (hφ (n + 1)).1).tendsto_atTop _⟩
[GOAL]
case intro.intro.mk.intro
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
hφ :
  ∀ (n : ℕ),
    φ n < φ (n + 1) ∧
      ∀ (a b : ℕ), φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (n + 1) ∧ x a = ↑g'
x' : (n : ℕ) → (g : G) ×' x (φ (n + 1)) = ↑g :=
  fun n =>
    Nat.recOn n { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
      fun k hk =>
      { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
        snd := (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) }
hx' : ∀ (n : ℕ), (x' n).fst / (x' (n + 1)).fst ∈ u (n + 1)
x'_cauchy : CauchySeq fun n => (x' n).fst
x₀ : G
hx₀ : Tendsto (fun n => (x' n).fst) atTop (𝓝 x₀)
⊢ Tendsto (x ∘ fun n => φ (n + 1)) atTop (𝓝 ↑x₀)
[PROOFSTEP]
convert ((continuous_coinduced_rng : Continuous ((↑) : G → G ⧸ N)).tendsto x₀).comp hx₀
[GOAL]
case h.e'_3
G : Type u
inst✝⁵ : Group G
inst✝⁴ : TopologicalSpace G
inst✝³ : TopologicalGroup G
inst✝² : FirstCountableTopology G
N : Subgroup G
inst✝¹ : Subgroup.Normal N
inst✝ : CompleteSpace G
this✝¹ : UniformSpace (G ⧸ N) := TopologicalGroup.toUniformSpace (G ⧸ N)
this✝ : UniformSpace G := TopologicalGroup.toUniformSpace G
this : IsCountablyGenerated (𝓤 (G ⧸ N))
u : ℕ → Set G
hu : HasAntitoneBasis (𝓝 1) u
u_mul : ∀ (n : ℕ), u (n + 1) * u (n + 1) ⊆ u n
hv : HasBasis (𝓝 1) (fun x => True) fun n => mk '' u n
v_anti : Antitone fun n => mk '' u n
x : ℕ → G ⧸ N
hx : CauchySeq x
key₀ : ∀ (i j : ℕ), ∃ M, j < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u i ∧ x a = ↑g'
φ : ℕ → ℕ :=
  fun n =>
    Nat.recOn n
      (choose (_ : ∃ M, 0 < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u 0 ∧ x a = ↑g'))
      fun k yk =>
      choose (_ : ∃ M, yk < M ∧ ∀ (a b : ℕ), M ≤ a → M ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (k + 1) ∧ x a = ↑g')
hφ :
  ∀ (n : ℕ),
    φ n < φ (n + 1) ∧
      ∀ (a b : ℕ), φ (n + 1) ≤ a → φ (n + 1) ≤ b → ∀ (g : G), x b = ↑g → ∃ g', g / g' ∈ u (n + 1) ∧ x a = ↑g'
x' : (n : ℕ) → (g : G) ×' x (φ (n + 1)) = ↑g :=
  fun n =>
    Nat.recOn n { fst := choose (_ : ∃ a, ↑a = x (φ 1)), snd := (_ : x (φ 1) = ↑(choose (_ : ∃ a, ↑a = x (φ 1)))) }
      fun k hk =>
      { fst := choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'),
        snd := (_ : x (φ (k + 1 + 1)) = ↑(choose (_ : ∃ g', hk.fst / g' ∈ u (k + 1) ∧ x (φ (k + 1 + 1)) = ↑g'))) }
hx' : ∀ (n : ℕ), (x' n).fst / (x' (n + 1)).fst ∈ u (n + 1)
x'_cauchy : CauchySeq fun n => (x' n).fst
x₀ : G
hx₀ : Tendsto (fun n => (x' n).fst) atTop (𝓝 x₀)
⊢ (x ∘ fun n => φ (n + 1)) = mk ∘ fun n => (x' n).fst
[PROOFSTEP]
exact funext fun n => (x' n).snd
[GOAL]
G : Type u
inst✝³ : Group G
us : UniformSpace G
inst✝² : UniformGroup G
inst✝¹ : FirstCountableTopology G
N : Subgroup G
inst✝ : Subgroup.Normal N
hG : CompleteSpace G
⊢ CompleteSpace (G ⧸ N)
[PROOFSTEP]
rw [← @UniformGroup.toUniformSpace_eq _ us _ _] at hG
[GOAL]
G : Type u
inst✝³ : Group G
us : UniformSpace G
inst✝² : UniformGroup G
inst✝¹ : FirstCountableTopology G
N : Subgroup G
inst✝ : Subgroup.Normal N
hG : CompleteSpace G
⊢ CompleteSpace (G ⧸ N)
[PROOFSTEP]
infer_instance