closes #5333 This PR tries to address issue #5333. My conjecture is that the binder annotations for `C.toB` and `Algebra.toSMul` are not ideal. `Algebra.toSMul` is one of declarations where the new command `set_synth_order` was used. Both classes, `C` and `Algebra`, are parametric over instances, and in both cases, the issue arises due to projection instances: `C.toB` and `Algebra.toSMul`. Let's focus on the binder annotations for `C.toB`. They are as follows: ``` C.toB [inst : A 20000] [self : @C inst] : @B ... ``` As a projection, it seems odd that `inst` is an instance-implicit argument instead of an implicit one, given that its value is fixed by `self`. We observe the same issue in `Algebra.toSMul`: ``` Algebra.toSMul {R : Type u} {A : Type v} [inst1 : CommSemiring R] [inst2 : Semiring A] [self : @Algebra R A inst1 inst2] : SMul R A ``` The PR changes the binder annotations as follows: ``` C.toB {inst : A 20000} [self : @C inst] : @B ... ``` and ``` Algebra.toSMul {R : Type u} {A : Type v} {inst1 : CommSemiring R} {inst2 : Semiring A} [self : @Algebra R A inst1 inst2] : SMul R A ``` In both cases, the `set_synth_order` is used to force `self` to be processed first. In the MWE, there is no instance for `C ...`, and `C.toB` is quickly discarded. I suspect a similar issue occurs when trying to use `Algebra.toSMul`, where there is no `@Algebra R A ... ...`, but Lean spends unnecessary time trying to synthesize `CommSemiring R` and `Semiring A` instances. I believe the new binder annotations make sense, as if there is a way to synthesize `Algebra R A ... ...`, it will tell us how to retrieve the instance-implicit arguments. TODO: - Impact on Mathlib. - Document changes. --------- Co-authored-by: Kim Morrison <scott.morrison@gmail.com> Co-authored-by: Johan Commelin <johan@commelin.net>
19 lines
397 B
Text
19 lines
397 B
Text
-- Artificial example for exposing a regression introduced while working on PR #5376
|
||
-- fix: modify projection instance binder info
|
||
|
||
class Foo (α : Type) [Add α] where
|
||
bla : [Mul α] → BEq α
|
||
|
||
attribute [instance] Foo.bla
|
||
|
||
inductive Boo where
|
||
| unit
|
||
|
||
instance : Add Boo where
|
||
add _ _ := .unit
|
||
|
||
instance : Mul Boo where
|
||
mul _ _ := .unit
|
||
|
||
def f [Foo Boo] (a b : Boo) : Bool :=
|
||
a == b
|