In Lean 4, we have support for typing constraints of the form ``` (?m ...).1 =?= v ``` where the type of `?m ...` is a structure with a single field. This kind of constraint is reduced to `?m ... =?= ⟨v⟩` This feature is implemented by the function `isDefEqSingleton`. As far as I remember, Lean 3 does not implement this feature. This commit disables this feature if the structure is a class. The goal is to avoid the generation of counterintuitive instances by typing inference. For example, in the example at issue #2011, the following weird instance was being generated for `Zero (f x)` ``` (@Zero.mk (f x✝) ((@instZero I (fun i => f i) fun i => inst✝¹ i).1 x✝) ``` where `inst✝¹` is the local instance `[∀ i, Zero (f i)]` Note that this instance is definitinally equal to the expected nicer instance `inst✝¹ x✝`. However, the nasty instance trigger nasty unification higher order constraints later. Note that a few tests broke because different error messages were produced. The new error messages seem better. I do not expect this change to affect Mathlib4 since Lean 3 does not have this feature.
10 lines
236 B
Text
10 lines
236 B
Text
have.lean:4:0: error: expected term
|
|
have.lean:2:18-2:19: error: don't know how to synthesize placeholder
|
|
context:
|
|
⊢ False
|
|
have.lean:7:2-7:3: error: type mismatch
|
|
f
|
|
has type
|
|
5 = 6 : Prop
|
|
but is expected to have type
|
|
5 = 3 : Prop
|