Skip to content

Commit

Permalink
chore: fix superfluous lemmas in simp.trace (leanprover#2923)
Browse files Browse the repository at this point in the history
Fixes an issue reported on Zulip; see the test case.

* Modifies the `MonadBacktrack` instance for `SimpM` to also backtrack
the `UsedSimps` field.
* When calling the discharger, `saveState`, and then `restoreState` if
something goes wrong.

I'm not certain that it makes sense to restore the `MetaM` state if
discharging fails. I can easily change this to more conservatively just
backtrack the `UsedSimps` after failed discharging.
  • Loading branch information
kim-em authored Dec 11, 2023
1 parent c656e71 commit 20dd63a
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/Lean/Meta/Tactic/Simp/Rewrite.lean
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,18 @@ def synthesizeArgs (thmId : Origin) (xs : Array Expr) (bis : Array BinderInfo) (
if (← synthesizeInstance x type) then
continue
if (← isProp type) then
-- We save the state, so that `UsedTheorems` does not accumulate
-- `simp` lemmas used during unsuccessful discharging.
let usedTheorems := (← get).usedTheorems
match (← discharge? type) with
| some proof =>
unless (← isDefEq x proof) do
trace[Meta.Tactic.simp.discharge] "{← ppOrigin thmId}, failed to assign proof{indentExpr type}"
modify fun s => { s with usedTheorems }
return false
| none =>
trace[Meta.Tactic.simp.discharge] "{← ppOrigin thmId}, failed to discharge hypotheses{indentExpr type}"
modify fun s => { s with usedTheorems }
return false
return true
where
Expand Down
19 changes: 19 additions & 0 deletions tests/lean/simp_trace_backtrack.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
-- As reported at https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/simp.3F.20giving.20nonsense.20lemmas/near/403082483

universe u

-- {α : Type} works as expected, as does specializing this lemma for `Nat`.
@[simp]
theorem tsub_eq_zero_of_le {α : Type u} [LE α] [Sub α] [OfNat α 0] {a b : α} :
a ≤ b → a - b = 0 := by sorry

@[simp]
theorem ge_iff_le (x y : Nat) : x ≥ y ↔ y ≤ x := Iff.rfl

set_option tactic.simp.trace true

-- This used to report: `Try this: simp only [ge_iff_le, Nat.succ_sub_succ_eq_sub]`
-- because we were not backtracking the "used simps" when the discharger failed.
example {n : Nat} : n = 2 - (n + 1) := by
simp [Nat.succ_sub_succ_eq_sub]
sorry
3 changes: 3 additions & 0 deletions tests/lean/simp_trace_backtrack.lean.expected.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
simp_trace_backtrack.lean:7:8-7:26: warning: declaration uses 'sorry'
Try this: simp only [Nat.succ_sub_succ_eq_sub]
simp_trace_backtrack.lean:17:0-17:7: warning: declaration uses 'sorry'

0 comments on commit 20dd63a

Please sign in to comment.