Zulip Chat Archive
Stream: lean4
Topic: Proofs when defining structures
Frédéric Dupuis (Aug 23 2024 at 22:22):
In the following bit of code, map_smul'
should be ∀ m x, f (m • x) = m • f x
, where f
is the relevant toFun
. However, when trying to provide the proof, f
is actually called some inaccessible name like (↑__src✝).toFun
. How can I give it a proper name that can be worked with? In the docs it's called self.toFun
but that doesn't seem to work either.
import Mathlib.Algebra.Module.LinearMap.Defs
variable {R M : Type*} [Ring R] [AddCommGroup M] [Module R M]
def foo : M →+ M where
toFun := id
map_add' := by simp
map_zero' := by simp
def bar : M →ₗ[R] M :=
{ foo with
map_smul' := by sorry }
If there's only foo
and I'm working on map_add'
, I can at least work around this by calling f
whatever is on the RHS of toFun
(i.e. id
in this case), but in the second structure I can't even do that.
Kyle Miller (Aug 23 2024 at 22:36):
One trick here is to do the let
lifting that Lean does yourself:
def bar : M →ₗ[R] M :=
let f := foo
{ f with
map_smul' := by sorry }
Kyle Miller (Aug 23 2024 at 22:37):
Or you can use Mathlib's spread notation, which currently has a hack that makes dsimp
be able to simplify the inaccessible names. (Edit: I misremembered the purpose of the hack; it's to make it so whatever comes after __ :=
is also available as an instance. It's not about whether dsimp
can unfold it.)
def bar : M →ₗ[R] M where
__ := foo
map_smul' := by
dsimp only
-- ⊢ ∀ (m : R) (x : M), (↑foo).toFun (m • x) = (RingHom.id R) m • (↑foo).toFun x
sorry
Kyle Miller (Aug 23 2024 at 22:38):
Oh, I didn't check before testing the above, it looks like dsimp only
simplifies your original case too.
def bar : M →ₗ[R] M :=
{ foo with
map_smul' := by
dsimp only
-- ⊢ ∀ (m : R) (x : M), (↑foo).toFun (m • x) = (RingHom.id R) m • (↑foo).toFun x
sorry }
Frédéric Dupuis (Aug 23 2024 at 22:47):
I see, thanks!
Last updated: May 02 2025 at 03:31 UTC