/-! # Improve zeta-delta tracking for `simp?` https://github.com/leanprover/lean4/issues/6655 reports issues with `simp?` where it would over-report local variables. This comes down to two kinds of issues: - zeta-delta tracking wasn't being reset, so previous `simp?`s would contribute variables - `simp?` would report variables that weren't explicitly mentioned, because `whnf` would be run with different configurations during the tracking. (e.g. `withInferTypeConfig` enables `zetaDelta`.) This file tests that it resets the tracking and filters the list. -/ set_option linter.unusedSimpArgs false /-! Example from #6655. This used to suggest `simp only [e, d]`. -/ /-- info: Try this: [apply] simp only [e] --- trace: α : Type c : α → α x : α d : α → α := c e : α → α := d ⊢ d x = x --- warning: declaration uses `sorry` -/ #guard_msgs in example {α : Type} (c : α → α) (x : α) : c x = x := by let d := c let e := d change e x = x simp? [e] trace_state sorry /-! Example from #6655. This used to suggest `simp only [d]`. -/ /-- info: Try this: [apply] simp only --- warning: declaration uses `sorry` -/ #guard_msgs in example {α : Type} (c : α → α) (x : α) : c x = x := by let d := c change d x = x simp [d] have : x = x := by simp? sorry /-! Example from comments of #6655. This used to suggest `simp only [Int.add_sub_cancel, p]`. (N.B. the goal at that point does not have `p` in it!) -/ /-- info: Try this: [apply] simp only [Int.add_sub_cancel] -/ #guard_msgs in example (a b : Int) : a + b - b = a := by let p := 1 have h : p = 1 := by simp only [p] simp? /-! Example from https://github.com/leanprover/lean4/pull/7539 by JovanGerb. This used to suggest `simp only [a, b] ` and `simp only [a, b]` -/ /-- info: Try this: [apply] simp only [a] --- info: Try this: [apply] simp only -/ #guard_msgs in example : True := by let a := 1 let b := 2 have : b = 2 := by simp [a,b] have : a = 1 := by simp? [a] have : 1 = 1 := by simp? trivial /-! Test that there is still a deficiency. This should say `simp only [e]`. -/ /-- info: Try this: [apply] simp only [e, c] --- trace: α : Type b : α → α x : α c : α → α := b d : α → α := c e : α → α := d ⊢ d x = x --- warning: declaration uses `sorry` -/ #guard_msgs in example {α : Type} (b : α → α) (x : α) : b x = x := by let c := b let d := c let e := d change e x = x simp? [e, c] trace_state sorry