Open eric-wieser opened 1 year ago
Having concrete data on which patterns help where in mathlib would be very helpful.
In both cases, having a
@[flat]
attribute would make it vastly easier to perform performance and API experiments in mathlib to work out where nested structures help, and where they're a hindrance.
In https://github.com/leanprover/lean4/pull/2940, I add a flat
keyword (easier than new @[flat]
notation), which allows us to investigate the effect of this in Mathlib.
A mathlib toolchain that builds against this version can be found in https://github.com/leanprover-community/mathlib4/pull/8977.
Some initial data: used on only the HomClass
classes (a minimally invasive change), this provides a 2.5% wall clock boost for Mathlib.
Proposal
What?
When working with a structure hierarchy like
the type of
D.mk
is asymmetric:More precisely, the representation of
D
is to embed an entireB
structure, but then only take the parts of theC
structure that do not overlap withB
, namelyc : Unit
.I have no doubt that this behavior is useful in some circumstances, but in situations where a symmetric API is more important than performance, this behavior is annoying.
Let's imagine that the symmetric API we want is
D.mk (toA : A) (b c : Unit)
. Right now, there are the following workarounds to achieve thatWrite the type of
D
manually withoutextends
:This boilerplate can be rather a burden, epsecially since the naive
:= { d with }
approach performs unwanted eta-expansionUse the hack from https://arxiv.org/abs/2306.00617 §4.2, which exploits the 'avoid overlaps' rule to our advantage, as
which gives us
D.mk (toDFlatHack : DFlatHack) (toA : A) (b c : Unit) : D
, where the first argument is vacuous and can always be passed as⟨⟩
.In Lean 3 we had
set_option old_structure_cmd true
; but this was a bad design because it did not allow parent structures to selectively be flattened (among other reasons).The proposal is to remove the need for a hack here, such that the user can write
or any other reasonable syntax.
How?
The presence of
flat
simply means "skip the overlapping fields check, and behave as if the fields overlap"; that is, a check for the syntactic marker would be added to the conditions here:https://github.com/leanprover/lean4/blob/57e23917b605d1f1e6b6ff70aa022065d55bb60c/src/Lean/Elab/Structure.lean#L423-L428
https://github.com/leanprover/lean4/blob/57e23917b605d1f1e6b6ff70aa022065d55bb60c/src/Lean/Elab/Structure.lean#L479-L483
Why?
RingHom
, which has to pick betweenMonoidHom
andAddMonoidHom
as it's "main" parent. This affects the shape of the constructor, the simp lemmas about it, and adds ugly additional angle brackets to anonymous constructorsIn both cases, having a
@[flat]
attribute would make it vastly easier to perform performance and API experiments in mathlib to work out where nested structures help, and where they're a hindrance.Community Feedback
Mario originally proposed this syntax here.
Impact
Add :+1: to issues you consider important. If others benefit from the changes in this proposal being added, please ask them to add :+1: to it.