This PR introduces stricter inference for the `@[defeq]` attribute and a companion `@[backward_defeq]` attribute that preserves the pre-PR behavior as an opt-in. ### What changed * `@[defeq]` is now inferred only when the equation holds at `.instances` transparency (the transparency `dsimp` operates at). * `@[backward_defeq]` is the old set: every theorem whose `rfl` proof the legacy inference would have accepted is tagged `@[backward_defeq]`, so `defeq ⊆ backward_defeq` holds by construction. * The option `backward.defeqAttrib.useBackward` (default `false`) makes `dsimp` also use `@[backward_defeq]` theorems, restoring the pre-PR behavior for a specific proof or file. * The option is eqn-affecting: its value at the point of a function's definition is recorded so that the equation lemmas later generated for that function use the same value, regardless of the ambient option at the use site. ### Mathlib adaption A companion adaption branch (`lean-pr-testing-backward-defeq-attrib` on mathlib4) builds cleanly against this PR and passes `lake test` without warnings. Most adaption changes are scoped `set_option backward.defeqAttrib.useBackward true in` additions on the failing declarations; a small number of files needed proof-level edits where the stored form of a `dsimp%`/`@[reassoc]`/`@[elementwise]` /`@[simps]`/`@[to_app]`-generated lemma had drifted under the stricter regime. --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
36 lines
885 B
Text
36 lines
885 B
Text
-- set_option trace.Elab.definition.eqns true
|
|
|
|
def f (x : Nat) : Nat :=
|
|
match x with
|
|
| 0 => 1
|
|
| 100 => 2
|
|
| 1000 => 3
|
|
| x+1 => f x
|
|
termination_by x
|
|
|
|
/--
|
|
info: equations:
|
|
@[backward_defeq] theorem f.eq_1 : f 0 = 1
|
|
@[backward_defeq] theorem f.eq_2 : f 100 = 2
|
|
@[backward_defeq] theorem f.eq_3 : f 1000 = 3
|
|
theorem f.eq_4 : ∀ (x_2 : Nat), (x_2 = 99 → False) → (x_2 = 999 → False) → f x_2.succ = f x_2
|
|
-/
|
|
#guard_msgs(pass trace, all) in
|
|
#print equations f
|
|
|
|
def g (x : Nat) : Nat :=
|
|
match x with
|
|
| 0 => 1
|
|
| 100 => 2
|
|
| 1000 => 3
|
|
| x+1 => x
|
|
|
|
/--
|
|
info: equations:
|
|
@[backward_defeq] theorem g.eq_1 : g 0 = 1
|
|
@[backward_defeq] theorem g.eq_2 : g 100 = 2
|
|
@[backward_defeq] theorem g.eq_3 : g 1000 = 3
|
|
theorem g.eq_4 : ∀ (x_2 : Nat), (x_2 = 99 → False) → (x_2 = 999 → False) → g x_2.succ = x_2
|
|
-/
|
|
#guard_msgs(pass trace, all) in
|
|
#print equations g
|