l3lab/ntp-mathlib huggingface dataset:
@[to_additive]
theorem IsClosed.smul_left_of_isCompact (ht : IsClosed t) (hs : IsCompact s) :
    IsClosed (s • t) := by
  have : ∀ x ∈ s • t, ∃ g ∈ s, g⁻¹ • x ∈ t := by
    

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : Group α
inst✝² : MulAction α β
inst✝¹ : ContinuousInv α
inst✝ : ContinuousSMul α β
s : Set α
t : Set β
ht : IsClosed t
hs : IsCompact s
⊢ ∀ x ∈ s • t, ∃ g ∈ s, g⁻¹ • x ∈ t

Next tactic:
intro x ⟨g, y, hgs, hyt, hgyx⟩
@[to_additive]
theorem IsClosed.smul_left_of_isCompact (ht : IsClosed t) (hs : IsCompact s) :
    IsClosed (s • t) := by
  have : ∀ x ∈ s • t, ∃ g ∈ s, g⁻¹ • x ∈ t := by
    intro x ⟨g, y, hgs, hyt, hgyx⟩
    

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : Group α
inst✝² : MulAction α β
inst✝¹ : ContinuousInv α
inst✝ : ContinuousSMul α β
s : Set α
t : Set β
ht : IsClosed t
hs : IsCompact s
x : β
g : α
y : β
hgs : g ∈ s
hyt : y ∈ t
hgyx : (fun x x_1 => x • x_1) g y = x
⊢ ∃ g ∈ s, g⁻¹ • x ∈ t

Next tactic:
refine ⟨g, hgs, ?_⟩
@[to_additive]
theorem IsClosed.smul_left_of_isCompact (ht : IsClosed t) (hs : IsCompact s) :
    IsClosed (s • t) := by
  have : ∀ x ∈ s • t, ∃ g ∈ s, g⁻¹ • x ∈ t := by
    intro x ⟨g, y, hgs, hyt, hgyx⟩
    refine ⟨g, hgs, ?_⟩
    

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : Group α
inst✝² : MulAction α β
inst✝¹ : ContinuousInv α
inst✝ : ContinuousSMul α β
s : Set α
t : Set β
ht : IsClosed t
hs : IsCompact s
x : β
g : α
y : β
hgs : g ∈ s
hyt : y ∈ t
hgyx : (fun x x_1 => x • x_1) g y = x
⊢ g⁻¹ • x ∈ t

Next tactic:
convert hyt
@[to_additive]
theorem IsClosed.smul_left_of_isCompact (ht : IsClosed t) (hs : IsCompact s) :
    IsClosed (s • t) := by
  have : ∀ x ∈ s • t, ∃ g ∈ s, g⁻¹ • x ∈ t := by
    intro x ⟨g, y, hgs, hyt, hgyx⟩
    refine ⟨g, hgs, ?_⟩
    convert hyt
    

Proof state:
case h.e'_4
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : Group α
inst✝² : MulAction α β
inst✝¹ : ContinuousInv α
inst✝ : ContinuousSMul α β
s : Set α
t : Set β
ht : IsClosed t
hs : IsCompact s
x : β
g : α
y : β
hgs : g ∈ s
hyt : y ∈ t
hgyx : (fun x x_1 => x • x_1) g y = x
⊢ g⁻¹ • x = y

Next tactic:
rwa [inv_smul_eq_iff, eq_comm]
@[to_additive]
theorem IsClosed.smul_left_of_isCompact (ht : IsClosed t) (hs : IsCompact s) :
    IsClosed (s • t) := by
  have : ∀ x ∈ s • t, ∃ g ∈ s, g⁻¹ • x ∈ t := by
    intro x ⟨g, y, hgs, hyt, hgyx⟩
    refine ⟨g, hgs, ?_⟩
    convert hyt
    rwa [inv_smul_eq_iff, eq_comm]
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : Group α
inst✝² : MulAction α β
inst✝¹ : ContinuousInv α
inst✝ : ContinuousSMul α β
s : Set α
t : Set β
ht : IsClosed t
hs : IsCompact s
this : ∀ x ∈ s • t, ∃ g ∈ s, g⁻¹ • x ∈ t
⊢ IsClosed (s • t)

Next tactic:
choose! f hf using this
@[to_additive]
theorem IsClosed.smul_left_of_isCompact (ht : IsClosed t) (hs : IsCompact s) :
    IsClosed (s • t) := by
  have : ∀ x ∈ s • t, ∃ g ∈ s, g⁻¹ • x ∈ t := by
    intro x ⟨g, y, hgs, hyt, hgyx⟩
    refine ⟨g, hgs, ?_⟩
    convert hyt
    rwa [inv_smul_eq_iff, eq_comm]
  choose! f hf using this
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : Group α
inst✝² : MulAction α β
inst✝¹ : ContinuousInv α
inst✝ : ContinuousSMul α β
s : Set α
t : Set β
ht : IsClosed t
hs : IsCompact s
f : β → α
hf : ∀ x ∈ s • t, f x ∈ s ∧ (f x)⁻¹ • x ∈ t
⊢ IsClosed (s • t)

Next tactic:
refine isClosed_of_closure_subset (fun x hx ↦ ?_)
@[to_additive]
theorem IsClosed.smul_left_of_isCompact (ht : IsClosed t) (hs : IsCompact s) :
    IsClosed (s • t) := by
  have : ∀ x ∈ s • t, ∃ g ∈ s, g⁻¹ • x ∈ t := by
    intro x ⟨g, y, hgs, hyt, hgyx⟩
    refine ⟨g, hgs, ?_⟩
    convert hyt
    rwa [inv_smul_eq_iff, eq_comm]
  choose! f hf using this
  refine isClosed_of_closure_subset (fun x hx ↦ ?_)
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : Group α
inst✝² : MulAction α β
inst✝¹ : ContinuousInv α
inst✝ : ContinuousSMul α β
s : Set α
t : Set β
ht : IsClosed t
hs : IsCompact s
f : β → α
hf : ∀ x ∈ s • t, f x ∈ s ∧ (f x)⁻¹ • x ∈ t
x : β
hx : x ∈ closure (s • t)
⊢ x ∈ s • t

Next tactic:
rcases mem_closure_iff_ultrafilter.mp hx with ⟨u, hust, hux⟩
@[to_additive]
theorem IsClosed.smul_left_of_isCompact (ht : IsClosed t) (hs : IsCompact s) :
    IsClosed (s • t) := by
  have : ∀ x ∈ s • t, ∃ g ∈ s, g⁻¹ • x ∈ t := by
    intro x ⟨g, y, hgs, hyt, hgyx⟩
    refine ⟨g, hgs, ?_⟩
    convert hyt
    rwa [inv_smul_eq_iff, eq_comm]
  choose! f hf using this
  refine isClosed_of_closure_subset (fun x hx ↦ ?_)
  rcases mem_closure_iff_ultrafilter.mp hx with ⟨u, hust, hux⟩
  

Proof state:
case intro.intro
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : Group α
inst✝² : MulAction α β
inst✝¹ : ContinuousInv α
inst✝ : ContinuousSMul α β
s : Set α
t : Set β
ht : IsClosed t
hs : IsCompact s
f : β → α
hf : ∀ x ∈ s • t, f x ∈ s ∧ (f x)⁻¹ • x ∈ t
x : β
hx : x ∈ closure (s • t)
u : Ultrafilter β
hust : s • t ∈ u
hux : ↑u ≤ 𝓝 x
⊢ x ∈ s • t

Next tactic:
have : Ultrafilter.map f u ≤ 𝓟 s :=
    calc Ultrafilter.map f u ≤ map f (𝓟 (s • t)) := map_mono (le_principal_iff.mpr hust)
      _ = 𝓟 (f '' (s • t)) := map_principal
      _ ≤ 𝓟 s := principal_mono.mpr (image_subset_iff.mpr (fun x hx ↦ (hf x hx).1))
@[to_additive]
theorem IsClosed.smul_left_of_isCompact (ht : IsClosed t) (hs : IsCompact s) :
    IsClosed (s • t) := by
  have : ∀ x ∈ s • t, ∃ g ∈ s, g⁻¹ • x ∈ t := by
    intro x ⟨g, y, hgs, hyt, hgyx⟩
    refine ⟨g, hgs, ?_⟩
    convert hyt
    rwa [inv_smul_eq_iff, eq_comm]
  choose! f hf using this
  refine isClosed_of_closure_subset (fun x hx ↦ ?_)
  rcases mem_closure_iff_ultrafilter.mp hx with ⟨u, hust, hux⟩
  have : Ultrafilter.map f u ≤ 𝓟 s :=
    calc Ultrafilter.map f u ≤ map f (𝓟 (s • t)) := map_mono (le_principal_iff.mpr hust)
      _ = 𝓟 (f '' (s • t)) := map_principal
      _ ≤ 𝓟 s := principal_mono.mpr (image_subset_iff.mpr (fun x hx ↦ (hf x hx).1))
  

Proof state:
case intro.intro
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : Group α
inst✝² : MulAction α β
inst✝¹ : ContinuousInv α
inst✝ : ContinuousSMul α β
s : Set α
t : Set β
ht : IsClosed t
hs : IsCompact s
f : β → α
hf : ∀ x ∈ s • t, f x ∈ s ∧ (f x)⁻¹ • x ∈ t
x : β
hx : x ∈ closure (s • t)
u : Ultrafilter β
hust : s • t ∈ u
hux : ↑u ≤ 𝓝 x
this : ↑(Ultrafilter.map f u) ≤ 𝓟 s
⊢ x ∈ s • t

Next tactic:
rcases hs.ultrafilter_le_nhds (Ultrafilter.map f u) this with ⟨g, hg, hug⟩
@[to_additive]
theorem IsClosed.smul_left_of_isCompact (ht : IsClosed t) (hs : IsCompact s) :
    IsClosed (s • t) := by
  have : ∀ x ∈ s • t, ∃ g ∈ s, g⁻¹ • x ∈ t := by
    intro x ⟨g, y, hgs, hyt, hgyx⟩
    refine ⟨g, hgs, ?_⟩
    convert hyt
    rwa [inv_smul_eq_iff, eq_comm]
  choose! f hf using this
  refine isClosed_of_closure_subset (fun x hx ↦ ?_)
  rcases mem_closure_iff_ultrafilter.mp hx with ⟨u, hust, hux⟩
  have : Ultrafilter.map f u ≤ 𝓟 s :=
    calc Ultrafilter.map f u ≤ map f (𝓟 (s • t)) := map_mono (le_principal_iff.mpr hust)
      _ = 𝓟 (f '' (s • t)) := map_principal
      _ ≤ 𝓟 s := principal_mono.mpr (image_subset_iff.mpr (fun x hx ↦ (hf x hx).1))
  rcases hs.ultrafilter_le_nhds (Ultrafilter.map f u) this with ⟨g, hg, hug⟩
  

Proof state:
case intro.intro.intro.intro
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : Group α
inst✝² : MulAction α β
inst✝¹ : ContinuousInv α
inst✝ : ContinuousSMul α β
s : Set α
t : Set β
ht : IsClosed t
hs : IsCompact s
f : β → α
hf : ∀ x ∈ s • t, f x ∈ s ∧ (f x)⁻¹ • x ∈ t
x : β
hx : x ∈ closure (s • t)
u : Ultrafilter β
hust : s • t ∈ u
hux : ↑u ≤ 𝓝 x
this : ↑(Ultrafilter.map f u) ≤ 𝓟 s
g : α
hg : g ∈ s
hug : ↑(Ultrafilter.map f u) ≤ 𝓝 g
⊢ x ∈ s • t

Next tactic:
suffices g⁻¹ • x ∈ t from
    ⟨g, g⁻¹ • x, hg, this, smul_inv_smul _ _⟩
@[to_additive]
theorem IsClosed.smul_left_of_isCompact (ht : IsClosed t) (hs : IsCompact s) :
    IsClosed (s • t) := by
  have : ∀ x ∈ s • t, ∃ g ∈ s, g⁻¹ • x ∈ t := by
    intro x ⟨g, y, hgs, hyt, hgyx⟩
    refine ⟨g, hgs, ?_⟩
    convert hyt
    rwa [inv_smul_eq_iff, eq_comm]
  choose! f hf using this
  refine isClosed_of_closure_subset (fun x hx ↦ ?_)
  rcases mem_closure_iff_ultrafilter.mp hx with ⟨u, hust, hux⟩
  have : Ultrafilter.map f u ≤ 𝓟 s :=
    calc Ultrafilter.map f u ≤ map f (𝓟 (s • t)) := map_mono (le_principal_iff.mpr hust)
      _ = 𝓟 (f '' (s • t)) := map_principal
      _ ≤ 𝓟 s := principal_mono.mpr (image_subset_iff.mpr (fun x hx ↦ (hf x hx).1))
  rcases hs.ultrafilter_le_nhds (Ultrafilter.map f u) this with ⟨g, hg, hug⟩
  suffices g⁻¹ • x ∈ t from
    ⟨g, g⁻¹ • x, hg, this, smul_inv_smul _ _⟩
  

Proof state:
case intro.intro.intro.intro
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : Group α
inst✝² : MulAction α β
inst✝¹ : ContinuousInv α
inst✝ : ContinuousSMul α β
s : Set α
t : Set β
ht : IsClosed t
hs : IsCompact s
f : β → α
hf : ∀ x ∈ s • t, f x ∈ s ∧ (f x)⁻¹ • x ∈ t
x : β
hx : x ∈ closure (s • t)
u : Ultrafilter β
hust : s • t ∈ u
hux : ↑u ≤ 𝓝 x
this : ↑(Ultrafilter.map f u) ≤ 𝓟 s
g : α
hg : g ∈ s
hug : ↑(Ultrafilter.map f u) ≤ 𝓝 g
⊢ g⁻¹ • x ∈ t

Next tactic:
exact ht.mem_of_tendsto ((Tendsto.inv hug).smul hux)
    (Eventually.mono hust (fun y hy ↦ (hf y hy).2))
@[to_additive]
theorem MulAction.isClosedMap_quotient [CompactSpace α] :
    letI := orbitRel α β
    IsClosedMap (Quotient.mk' : β → Quotient (orbitRel α β)) := by
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁶ : TopologicalSpace α
inst✝⁵ : TopologicalSpace β
inst✝⁴ : Group α
inst✝³ : MulAction α β
inst✝² : ContinuousInv α
inst✝¹ : ContinuousSMul α β
s : Set α
t : Set β
inst✝ : CompactSpace α
⊢ IsClosedMap Quotient.mk'

Next tactic:
intro t ht
@[to_additive]
theorem MulAction.isClosedMap_quotient [CompactSpace α] :
    letI := orbitRel α β
    IsClosedMap (Quotient.mk' : β → Quotient (orbitRel α β)) := by
  intro t ht
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁶ : TopologicalSpace α
inst✝⁵ : TopologicalSpace β
inst✝⁴ : Group α
inst✝³ : MulAction α β
inst✝² : ContinuousInv α
inst✝¹ : ContinuousSMul α β
s : Set α
t✝ : Set β
inst✝ : CompactSpace α
t : Set β
ht : IsClosed t
⊢ IsClosed (Quotient.mk' '' t)

Next tactic:
rw [← quotientMap_quotient_mk'.isClosed_preimage, MulAction.quotient_preimage_image_eq_union_mul]
@[to_additive]
theorem MulAction.isClosedMap_quotient [CompactSpace α] :
    letI := orbitRel α β
    IsClosedMap (Quotient.mk' : β → Quotient (orbitRel α β)) := by
  intro t ht
  rw [← quotientMap_quotient_mk'.isClosed_preimage, MulAction.quotient_preimage_image_eq_union_mul]
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁶ : TopologicalSpace α
inst✝⁵ : TopologicalSpace β
inst✝⁴ : Group α
inst✝³ : MulAction α β
inst✝² : ContinuousInv α
inst✝¹ : ContinuousSMul α β
s : Set α
t✝ : Set β
inst✝ : CompactSpace α
t : Set β
ht : IsClosed t
⊢ IsClosed (⋃ g, (fun x => g • x) '' t)

Next tactic:
convert ht.smul_left_of_isCompact (isCompact_univ (X := α))
@[to_additive]
theorem MulAction.isClosedMap_quotient [CompactSpace α] :
    letI := orbitRel α β
    IsClosedMap (Quotient.mk' : β → Quotient (orbitRel α β)) := by
  intro t ht
  rw [← quotientMap_quotient_mk'.isClosed_preimage, MulAction.quotient_preimage_image_eq_union_mul]
  convert ht.smul_left_of_isCompact (isCompact_univ (X := α))
  

Proof state:
case h.e'_3
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁶ : TopologicalSpace α
inst✝⁵ : TopologicalSpace β
inst✝⁴ : Group α
inst✝³ : MulAction α β
inst✝² : ContinuousInv α
inst✝¹ : ContinuousSMul α β
s : Set α
t✝ : Set β
inst✝ : CompactSpace α
t : Set β
ht : IsClosed t
⊢ ⋃ g, (fun x => g • x) '' t = univ • t

Next tactic:
rw [← biUnion_univ, ← iUnion_smul_left_image]
@[to_additive]
theorem MulAction.isClosedMap_quotient [CompactSpace α] :
    letI := orbitRel α β
    IsClosedMap (Quotient.mk' : β → Quotient (orbitRel α β)) := by
  intro t ht
  rw [← quotientMap_quotient_mk'.isClosed_preimage, MulAction.quotient_preimage_image_eq_union_mul]
  convert ht.smul_left_of_isCompact (isCompact_univ (X := α))
  rw [← biUnion_univ, ← iUnion_smul_left_image]
  

Proof state:
case h.e'_3
G : Type w
H : Type x
α : Type u
β : Type v
inst✝⁶ : TopologicalSpace α
inst✝⁵ : TopologicalSpace β
inst✝⁴ : Group α
inst✝³ : MulAction α β
inst✝² : ContinuousInv α
inst✝¹ : ContinuousSMul α β
s : Set α
t✝ : Set β
inst✝ : CompactSpace α
t : Set β
ht : IsClosed t
⊢ ⋃ x ∈ univ, (fun x_1 => x • x_1) '' t = ⋃ a ∈ univ, a • t

Next tactic:
rfl
@[to_additive]
theorem singleton_mul_mem_nhds (a : α) {b : α} (h : s ∈ 𝓝 b) : {a} * s ∈ 𝓝 (a * b) := by
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace α
inst✝¹ : Group α
inst✝ : ContinuousConstSMul α α
s t : Set α
a b : α
h : s ∈ 𝓝 b
⊢ {a} * s ∈ 𝓝 (a * b)

Next tactic:
have := smul_mem_nhds a h
@[to_additive]
theorem singleton_mul_mem_nhds (a : α) {b : α} (h : s ∈ 𝓝 b) : {a} * s ∈ 𝓝 (a * b) := by
  have := smul_mem_nhds a h
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace α
inst✝¹ : Group α
inst✝ : ContinuousConstSMul α α
s t : Set α
a b : α
h : s ∈ 𝓝 b
this : a • s ∈ 𝓝 (a • b)
⊢ {a} * s ∈ 𝓝 (a * b)

Next tactic:
rwa [← singleton_smul] at this
@[to_additive]
theorem singleton_mul_mem_nhds_of_nhds_one (a : α) (h : s ∈ 𝓝 (1 : α)) : {a} * s ∈ 𝓝 a := by
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace α
inst✝¹ : Group α
inst✝ : ContinuousConstSMul α α
s t : Set α
a : α
h : s ∈ 𝓝 1
⊢ {a} * s ∈ 𝓝 a

Next tactic:
simpa only [mul_one] using singleton_mul_mem_nhds a h
@[to_additive]
theorem IsOpen.mul_right (hs : IsOpen s) : IsOpen (s * t) := by
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace α
inst✝¹ : Group α
inst✝ : ContinuousConstSMul αᵐᵒᵖ α
s t : Set α
hs : IsOpen s
⊢ IsOpen (s * t)

Next tactic:
rw [← iUnion_op_smul_set]
@[to_additive]
theorem IsOpen.mul_right (hs : IsOpen s) : IsOpen (s * t) := by
  rw [← iUnion_op_smul_set]
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace α
inst✝¹ : Group α
inst✝ : ContinuousConstSMul αᵐᵒᵖ α
s t : Set α
hs : IsOpen s
⊢ IsOpen (⋃ a ∈ t, op a • s)

Next tactic:
exact isOpen_biUnion fun a _ => hs.smul _
@[to_additive]
theorem mul_singleton_mem_nhds (a : α) {b : α} (h : s ∈ 𝓝 b) : s * {a} ∈ 𝓝 (b * a) := by
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace α
inst✝¹ : Group α
inst✝ : ContinuousConstSMul αᵐᵒᵖ α
s t : Set α
a b : α
h : s ∈ 𝓝 b
⊢ s * {a} ∈ 𝓝 (b * a)

Next tactic:
simp only [← iUnion_op_smul_set, mem_singleton_iff, iUnion_iUnion_eq_left]
@[to_additive]
theorem mul_singleton_mem_nhds (a : α) {b : α} (h : s ∈ 𝓝 b) : s * {a} ∈ 𝓝 (b * a) := by
  simp only [← iUnion_op_smul_set, mem_singleton_iff, iUnion_iUnion_eq_left]
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace α
inst✝¹ : Group α
inst✝ : ContinuousConstSMul αᵐᵒᵖ α
s t : Set α
a b : α
h : s ∈ 𝓝 b
⊢ op a • s ∈ 𝓝 (b * a)

Next tactic:
exact smul_mem_nhds _ h
@[to_additive]
theorem mul_singleton_mem_nhds_of_nhds_one (a : α) (h : s ∈ 𝓝 (1 : α)) : s * {a} ∈ 𝓝 a := by
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace α
inst✝¹ : Group α
inst✝ : ContinuousConstSMul αᵐᵒᵖ α
s t : Set α
a : α
h : s ∈ 𝓝 1
⊢ s * {a} ∈ 𝓝 a

Next tactic:
simpa only [one_mul] using mul_singleton_mem_nhds a h
@[to_additive]
theorem IsOpen.div_left (ht : IsOpen t) : IsOpen (s / t) := by
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t : Set G
ht : IsOpen t
⊢ IsOpen (s / t)

Next tactic:
rw [← iUnion_div_left_image]
@[to_additive]
theorem IsOpen.div_left (ht : IsOpen t) : IsOpen (s / t) := by
  rw [← iUnion_div_left_image]
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t : Set G
ht : IsOpen t
⊢ IsOpen (⋃ a ∈ s, (fun x => a / x) '' t)

Next tactic:
exact isOpen_biUnion fun a _ => isOpenMap_div_left a t ht
@[to_additive]
theorem IsOpen.div_right (hs : IsOpen s) : IsOpen (s / t) := by
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t : Set G
hs : IsOpen s
⊢ IsOpen (s / t)

Next tactic:
rw [← iUnion_div_right_image]
@[to_additive]
theorem IsOpen.div_right (hs : IsOpen s) : IsOpen (s / t) := by
  rw [← iUnion_div_right_image]
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t : Set G
hs : IsOpen s
⊢ IsOpen (⋃ a ∈ t, (fun x => x / a) '' s)

Next tactic:
exact isOpen_biUnion fun a _ => isOpenMap_div_right a s hs
@[to_additive]
theorem IsOpen.mul_closure (hs : IsOpen s) (t : Set G) : s * closure t = s * t := by
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t✝ : Set G
hs : IsOpen s
t : Set G
⊢ s * closure t = s * t

Next tactic:
refine' (mul_subset_iff.2 fun a ha b hb => _).antisymm (mul_subset_mul_left subset_closure)
@[to_additive]
theorem IsOpen.mul_closure (hs : IsOpen s) (t : Set G) : s * closure t = s * t := by
  refine' (mul_subset_iff.2 fun a ha b hb => _).antisymm (mul_subset_mul_left subset_closure)
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t✝ : Set G
hs : IsOpen s
t : Set G
a : G
ha : a ∈ s
b : G
hb : b ∈ closure t
⊢ a * b ∈ s * t

Next tactic:
rw [mem_closure_iff] at hb
@[to_additive]
theorem IsOpen.mul_closure (hs : IsOpen s) (t : Set G) : s * closure t = s * t := by
  refine' (mul_subset_iff.2 fun a ha b hb => _).antisymm (mul_subset_mul_left subset_closure)
  rw [mem_closure_iff] at hb
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t✝ : Set G
hs : IsOpen s
t : Set G
a : G
ha : a ∈ s
b : G
hb : ∀ (o : Set G), IsOpen o → b ∈ o → Set.Nonempty (o ∩ t)
⊢ a * b ∈ s * t

Next tactic:
have hbU : b ∈ s⁻¹ * {a * b} := ⟨a⁻¹, a * b, Set.inv_mem_inv.2 ha, rfl, inv_mul_cancel_left _ _⟩
@[to_additive]
theorem IsOpen.mul_closure (hs : IsOpen s) (t : Set G) : s * closure t = s * t := by
  refine' (mul_subset_iff.2 fun a ha b hb => _).antisymm (mul_subset_mul_left subset_closure)
  rw [mem_closure_iff] at hb
  have hbU : b ∈ s⁻¹ * {a * b} := ⟨a⁻¹, a * b, Set.inv_mem_inv.2 ha, rfl, inv_mul_cancel_left _ _⟩
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t✝ : Set G
hs : IsOpen s
t : Set G
a : G
ha : a ∈ s
b : G
hb : ∀ (o : Set G), IsOpen o → b ∈ o → Set.Nonempty (o ∩ t)
hbU : b ∈ s⁻¹ * {a * b}
⊢ a * b ∈ s * t

Next tactic:
obtain ⟨_, ⟨c, d, hc, rfl : d = _, rfl⟩, hcs⟩ := hb _ hs.inv.mul_right hbU
@[to_additive]
theorem IsOpen.mul_closure (hs : IsOpen s) (t : Set G) : s * closure t = s * t := by
  refine' (mul_subset_iff.2 fun a ha b hb => _).antisymm (mul_subset_mul_left subset_closure)
  rw [mem_closure_iff] at hb
  have hbU : b ∈ s⁻¹ * {a * b} := ⟨a⁻¹, a * b, Set.inv_mem_inv.2 ha, rfl, inv_mul_cancel_left _ _⟩
  obtain ⟨_, ⟨c, d, hc, rfl : d = _, rfl⟩, hcs⟩ := hb _ hs.inv.mul_right hbU
  

Proof state:
case intro.intro.intro.intro.intro.intro
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t✝ : Set G
hs : IsOpen s
t : Set G
a : G
ha : a ∈ s
b : G
hb : ∀ (o : Set G), IsOpen o → b ∈ o → Set.Nonempty (o ∩ t)
hbU : b ∈ s⁻¹ * {a * b}
c : G
hc : c ∈ s⁻¹
hcs : (fun x x_1 => x * x_1) c (a * b) ∈ t
⊢ a * b ∈ s * t

Next tactic:
exact ⟨c⁻¹, _, hc, hcs, inv_mul_cancel_left _ _⟩
@[to_additive]
theorem IsOpen.closure_mul (ht : IsOpen t) (s : Set G) : closure s * t = s * t := by
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s✝ t : Set G
ht : IsOpen t
s : Set G
⊢ closure s * t = s * t

Next tactic:
rw [← inv_inv (closure s * t), mul_inv_rev, inv_closure, ht.inv.mul_closure, mul_inv_rev, inv_inv,
    inv_inv]
@[to_additive]
theorem IsOpen.div_closure (hs : IsOpen s) (t : Set G) : s / closure t = s / t := by
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t✝ : Set G
hs : IsOpen s
t : Set G
⊢ s / closure t = s / t

Next tactic:
simp_rw [div_eq_mul_inv, inv_closure, hs.mul_closure]
@[to_additive]
theorem IsOpen.closure_div (ht : IsOpen t) (s : Set G) : closure s / t = s / t := by
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s✝ t : Set G
ht : IsOpen t
s : Set G
⊢ closure s / t = s / t

Next tactic:
simp_rw [div_eq_mul_inv, ht.inv.closure_mul]
@[to_additive]
theorem IsClosed.mul_right_of_isCompact (ht : IsClosed t) (hs : IsCompact s) :
    IsClosed (t * s) := by
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t : Set G
ht : IsClosed t
hs : IsCompact s
⊢ IsClosed (t * s)

Next tactic:
rw [← image_op_smul]
@[to_additive]
theorem IsClosed.mul_right_of_isCompact (ht : IsClosed t) (hs : IsCompact s) :
    IsClosed (t * s) := by
  rw [← image_op_smul]
  

Proof state:
G : Type w
H : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t : Set G
ht : IsClosed t
hs : IsCompact s
⊢ IsClosed (op '' s • t)

Next tactic:
exact IsClosed.smul_left_of_isCompact ht (hs.image continuous_op)
@[to_additive]
theorem QuotientGroup.isClosedMap_coe {H : Subgroup G} (hH : IsCompact (H : Set G)) :
    IsClosedMap ((↑) : G → G ⧸ H) := by
  

Proof state:
G : Type w
H✝ : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t : Set G
H : Subgroup G
hH : IsCompact ↑H
⊢ IsClosedMap mk

Next tactic:
intro t ht
@[to_additive]
theorem QuotientGroup.isClosedMap_coe {H : Subgroup G} (hH : IsCompact (H : Set G)) :
    IsClosedMap ((↑) : G → G ⧸ H) := by
  intro t ht
  

Proof state:
G : Type w
H✝ : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t✝ : Set G
H : Subgroup G
hH : IsCompact ↑H
t : Set G
ht : IsClosed t
⊢ IsClosed (mk '' t)

Next tactic:
rw [← quotientMap_quotient_mk'.isClosed_preimage]
@[to_additive]
theorem QuotientGroup.isClosedMap_coe {H : Subgroup G} (hH : IsCompact (H : Set G)) :
    IsClosedMap ((↑) : G → G ⧸ H) := by
  intro t ht
  rw [← quotientMap_quotient_mk'.isClosed_preimage]
  

Proof state:
G : Type w
H✝ : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t✝ : Set G
H : Subgroup G
hH : IsCompact ↑H
t : Set G
ht : IsClosed t
⊢ IsClosed (Quotient.mk' ⁻¹' (mk '' t))

Next tactic:
convert ht.mul_right_of_isCompact hH
@[to_additive]
theorem QuotientGroup.isClosedMap_coe {H : Subgroup G} (hH : IsCompact (H : Set G)) :
    IsClosedMap ((↑) : G → G ⧸ H) := by
  intro t ht
  rw [← quotientMap_quotient_mk'.isClosed_preimage]
  convert ht.mul_right_of_isCompact hH
  

Proof state:
case h.e'_3
G : Type w
H✝ : Type x
α : Type u
β : Type v
inst✝² : TopologicalSpace G
inst✝¹ : Group G
inst✝ : TopologicalGroup G
s t✝ : Set G
H : Subgroup G
hH : IsCompact ↑H
t : Set G
ht : IsClosed t
⊢ Quotient.mk' ⁻¹' (mk '' t) = t * ↑H

Next tactic:
refine (QuotientGroup.preimage_image_mk_eq_iUnion_image _ _).trans ?_