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.
15 lines
306 B
Text
15 lines
306 B
Text
namespace Hidden
|
|
|
|
open Nat
|
|
|
|
theorem zero_add (n : Nat) : 0 + n = n :=
|
|
Nat.recOn (motive := fun x => 0 + x = x)
|
|
n
|
|
rfl
|
|
(fun (n : Nat) (ih : 0 + n = n) =>
|
|
show 0 + succ n = succ n from
|
|
calc
|
|
0 + succ n = succ (0 + n) := rfl
|
|
_ = succ n := by rw [ih])
|
|
|
|
end Hidden
|