Zulip Chat Archive
Stream: mathlib4
Topic: OreLocalization.smul reducibility
Kevin Buzzard (Sep 13 2024 at 18:56):
Right now OreLocalization.smul
is irreducible. So if A
is an R
-module and S
is a submonoid of R
, then A[S⁻¹]
is an R[S⁻¹]
-module. In mathlib we have defined mul
on R[S⁻¹]
as being equal to smul
, so if a b : R[S⁻¹]
then a • b = a * b
and the proof is rfl
.
If however A
is an R
-algebra then in #16650 I made A[S⁻¹]
into an R[S⁻¹]
-algebra, and now if a b : A[S⁻¹]
then a • b = a * b
and the proof isn't rfl
(at least not according to typeclass inference) because smul
is irreducible so Lean can't see that it's defeq to mul
. Here is some code illustrating this:
import Mathlib.Algebra.Algebra.Defs
import Mathlib.RingTheory.OreLocalization.Basic
namespace OreLocalization
section CommMagma
variable {R A : Type*} [CommMonoid R] [CommMagma A] [MulAction R A] [IsScalarTower R A A]
{S : Submonoid R}
private def mul' (a₁ : A) (s₁ : S) (a₂ : A) (s₂ : S) : A[S⁻¹] :=
a₁ * a₂ /ₒ (s₂ * s₁)
private def mul''
(a : A) (s : S) : A[S⁻¹] → A[S⁻¹] :=
liftExpand (mul' a s) fun a₁ r₁ ⟨s₁, hs₁⟩ hr₁s₁ => by
sorry -- proof omitted
protected def mul : A[S⁻¹] → A[S⁻¹] → A[S⁻¹] :=
liftExpand mul'' fun a₁ r₁ s hs => by
sorry -- proof omitted
-- OreLocalization.smul is irreducible but this still
-- works because mul on R[S⁻¹] is defined to be smul.
example (a b : R[S⁻¹]) : a • b = a * b := rfl
instance : Mul (A[S⁻¹]) where
mul := OreLocalization.mul
-- But here irreducibility causes problems:
example (as bt : R[S⁻¹]) : as * bt = as • bt := rfl -- fails
example (as bt : R[S⁻¹]) : as * bt = as • bt := by
unfold HSMul.hSMul instHSMul SMul.smul instSMul
-- rfl -- fails
unfold OreLocalization.smul
rfl -- now works
end CommMagma
end OreLocalization
To make the last proof rfl
you can just remove the irreducible
attribute on smul
. This I do in #16746 and my understanding of recent comments by @Eric Wieser was that this is the right thing to do in this situation. However benchmarking only this change reveals that it makes the file Algebra.Module.LocalizedModule
8% slower. Is this a deal breaker?
Eric Wieser (Sep 13 2024 at 18:59):
In my opinion correctness wins over performance unless the performance is really disastrous. An 8% change in just one file doesn't seem too bad to me.
Eric Wieser (Sep 13 2024 at 19:00):
In a future change, you could try making liftExpand
irreducible instead
Eric Wieser (Sep 13 2024 at 19:11):
Something I'd very much like to have here is a way to tell the elaborator to treat lift
as a recursor and mk
as a constructor, such that both are irreducible in isolation but lift f (mk x)
reduces to f x
Kevin Buzzard (Sep 13 2024 at 19:14):
Here is another diamond which making smul not-irreducible doesn't fix:
rs : OreLocalization S R
⊢ liftExpand (fun r s ↦ Quotient.mk' (r, s)) ⋯ rs = rs
Proof is cases rs; rfl
. Here OreLocalization S R
is a quotient of R x S
. The fact that this isn't rfl means that if I make A[1/S] into an R[1/S]-algebra and add this to typeclass inference then there are two nondefeq toFun
instances of Algebra R[S⁻¹] R[S⁻¹]
floating around. Is it likely that I can solve this by refactoring liftExpand
?
Eric Wieser (Sep 13 2024 at 19:25):
That looks impossible to make rfl; but presumably this is an #xy problem and came from reducing something else that you wanted to be rfl?
Kevin Buzzard (Sep 13 2024 at 20:48):
Right, I want to make Algebra R[1/S] A[1/S]
from Algebra R A
but then I get two nondefeq Algebra R[1/S] R[1/S]
instances
Eric Wieser (Sep 14 2024 at 01:01):
I think this is a problem with any attempt to make Algebra A B -> Algebra (F A) (F B)
instances, for most F
s
Eric Wieser (Sep 14 2024 at 01:03):
But arguably you should never create those instances anyway, as they create propositional diamonds when B := F A
Last updated: May 02 2025 at 03:31 UTC