Zulip Chat Archive

Stream: mathlib4

Topic: RightActions


Lara Toledano (Feb 03 2026 at 12:41):

I think it would be quite convenient if we had a lemma

open scoped Pointwise RightActions
lemma Set.smul_singleton_eq_op_smul [Mul M] {s : Set M} {a : M} :
s  {a} = s <• a := calc
  s  {a} = (MulOpposite.op a  ·)'' s := by simp
  _       = s <• a := rfl

Is someone already working on this? Do you find it unnecessary? Should I just go ahead and PR?

Bhavik Mehta (Feb 03 2026 at 12:48):

I think the left-hand-side of the new lemma should be s * {a}, but I agree we should have that. Note that we have the Finset version (docs#Finset.mul_singleton) of what you want but the corresponding Set version is (in my eyes) quite a lot less convenient (docs#Set.mul_singleton)

Lara Toledano (Feb 03 2026 at 13:02):

Writing s * {a} does seem better.

I was not aware of (docs#Finset.mul_singleton), thank you for the insight.

If we want the lemmas {a} * s = a • s and s * {a} = s <• a for sets, then I wonder if they might replace the current Set.mul_singleton and Set.singleton_mul. These are tagged with simp so I cannot say I understand what effect that would have...

Bhavik Mehta (Feb 03 2026 at 14:04):

I believe the current simp setup for docs#Set.mul_singleton is quite awkward in practice, you could try making a PR which adds your lemma and marks it simp and un-simps the existing ones. I think the statements of docs#Set.mul_singleton and singleton_mul should still be in mathlib, just not as simp lemmas

Yaël Dillies (Feb 03 2026 at 14:58):

I have a PR in the works that does this, fyi

Lara Toledano (Feb 03 2026 at 15:36):

I would also like to use

variable [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
open scoped Topology RightActions Pointwise
lemma smul_nhds  (x y : G) : x  𝓝 y = 𝓝 (x * y) := calc
    x  𝓝 y = (𝓝 y).map (Homeomorph.mulLeft x) := rfl
    _ = 𝓝 (x * y) := by simp

lemma op_smul_nhds (x y : G) : (𝓝 x) <• y = 𝓝 (x * y) := calc
    (𝓝 x) <• y = (𝓝 x).map (Homeomorph.mulRight y) := rfl
    _ = 𝓝 (x * y) := by simp

as well as the specializations

example  (x : G) : x⁻¹  𝓝 x = 𝓝 1 := by rw [smul_nhds]; simp
example  (x : G) : (𝓝 x) <• x⁻¹ = 𝓝 1 := by rw [op_smul_nhds]; simp

Are you working on that too?

Eric Wieser (Feb 03 2026 at 16:27):

Those are not the right generalizations, I think you just want

open scoped Topology RightActions Pointwise
lemma nhds_smul [Group G] [TopologicalSpace α] [MulAction G α] [ContinuousConstSMul G α]
    (x : G) (y : α) : 𝓝 (x  y) = x  𝓝 y :=
  (isOpenMap_smul x).map_nhds_eq (continuous_id.const_smul _ |>.continuousAt) |>.symm

Lara Toledano (Feb 03 2026 at 16:47):

That is indeed a better generalization of the smul lemma, but what about op_smul? Before we can generalize (𝓝 x) <• y = 𝓝 (x * y) from [Group G]to [MulAction G α] I feel like we would need way more lemmas about the topological properties of fun x : G => x • y given y : α.
On that subject you might be interested in #maths > topological groups and uniformity @ 💬 and #mathlib4 > defining `MulAction.ball`

Bhavik Mehta (Feb 03 2026 at 17:04):

Yaël Dillies said:

I have a PR in the works that does this, fyi

Out of interest, did you end up changing the statement of mul_singleton or just changing the simp-set?

Eric Wieser (Feb 03 2026 at 18:38):

but what about op_smul?

It's the same lemma :)

Yaël Dillies (Feb 03 2026 at 18:42):

Bhavik Mehta said:

Out of interest, did you end up changing the statement of mul_singleton or just changing the simp-set?

The statement, with RHS a \smul s

Eric Wieser (Feb 03 2026 at 18:54):

#34795 adds the above

Bhavik Mehta (Feb 03 2026 at 18:58):

Yaël Dillies said:

Bhavik Mehta said:

Out of interest, did you end up changing the statement of mul_singleton or just changing the simp-set?

The statement, with RHS a \smul s

and the idea is that if someone wants the image version, they can do that further rewrite? That sounds reasonable to me!

Eric Wieser (Feb 03 2026 at 19:11):

Another set of lemmas we might want is:

lemma nhdsWithin_smul {s} (c : G) (x : α) : 𝓝[c  s] (c  x) = c  𝓝[s] x := by
  rw [nhdsWithin, nhdsWithin, nhds_smul,  Filter.map_smul,  Filter.map_smul]
  rw [Filter.map_inf, Filter.map_principal]
  congr
  sorry

where the ugly proof is because we're missing some API elsewhere

Lara Toledano (Feb 04 2026 at 12:16):

Eric Wieser said:

but what about op_smul?

It's the same lemma :)

I can see how

Eric Wieser said:

open scoped Topology RightActions Pointwise
lemma nhds_smul [Group G] [TopologicalSpace α] [MulAction G α] [ContinuousConstSMul G α]
    (x : G) (y : α) : 𝓝 (x  y) = x  𝓝 y :=
  (isOpenMap_smul x).map_nhds_eq (continuous_id.const_smul _ |>.continuousAt) |>.symm

also gives us [IsTopologicalGroup G] (x y : G) : (𝓝 x) <• y = 𝓝 (x*y)

What seems much more difficult to me is to generalize this to [MulAction G α] (x : G) (y : α) : (𝓝 x).map (fun g => g • y) = 𝓝 (x • y). The Effros Theorem states some sufficient conditions on the map and the topological structures on Gand α, but this is really not trivial.

Lara Toledano (Feb 04 2026 at 12:22):

To be fair, this last question has little to do with RightActions or MulOpposite :sweat_smile:

Lara Toledano (Feb 04 2026 at 12:48):

Do you consider the specialization of nhds_smul to x⁻¹ • 𝓝 x = 𝓝 1 rather convenient or unnecessary?


Last updated: Feb 28 2026 at 14:05 UTC