This PR adds a linter (`linter.unusedSimpArgs`) that complains when a simp argument (`simp [foo]`) is unused. It should do the right thing if the `simp` invocation is run multiple times, e.g. inside `all_goals`. It does not trigger when the `simp` call is inside a macro. The linter message contains a clickable hint to remove the simp argument. I chose to display a separate warning for each unused argument. This means that the user has to click multiple times to remove all of them (and wait for re-elaboration in between). But this just means multiple endorphine kicks, and the main benefit over a single warning that would have to span the whole argument list is that already the squigglies tell the users about unused arguments. This closes #4483. Making Init and Std clean wrt to this linter revealed close to 1000 unused simp args, a pleasant experience for anyone enjoying tidying things: #8905
66 lines
1.1 KiB
Text
66 lines
1.1 KiB
Text
/-! Test `·` being able to refer to constants in `simp` -/
|
|
|
|
example : ¬ true = false := by
|
|
simp [(¬ ·)]
|
|
|
|
/-! Test `binop%` -/
|
|
|
|
/--
|
|
trace: y x : Nat
|
|
h : y = 0
|
|
⊢ Add.add x y = x
|
|
-/
|
|
#guard_msgs in
|
|
example (h : y = 0) : x + y = x := by
|
|
simp [(.+.)] -- Expands `HAdd.hAdd
|
|
trace_state
|
|
simp [Add.add]
|
|
simp [h]
|
|
done
|
|
|
|
/--
|
|
trace: y x : Nat
|
|
h : y = 0
|
|
⊢ Add.add x y = x
|
|
-/
|
|
#guard_msgs in
|
|
example (h : y = 0) : x + y = x := by
|
|
simp [.+.]
|
|
trace_state
|
|
simp [Add.add]
|
|
simp [h]
|
|
done
|
|
|
|
/-! Test `binop%` variant `rightact%` as well -/
|
|
|
|
/--
|
|
error: unsolved goals
|
|
x y : Nat
|
|
⊢ Pow.pow x y = Pow.pow y x
|
|
-/
|
|
#guard_msgs in
|
|
example (x y : Nat) : x ^ y = y ^ x := by
|
|
simp only [.^.]
|
|
|
|
|
|
def f (n m : Nat) : Nat := n + m
|
|
macro "ff" t1:term:arg t2:term:arg : term => `(f $t2 $t1)
|
|
|
|
/--
|
|
error: unsolved goals
|
|
x y : Nat
|
|
⊢ [x + y, y + x].sum > 0
|
|
-/
|
|
#guard_msgs in
|
|
example (x y : Nat) : [f x y, ff x y].sum > 0 := by
|
|
simp only [ff · ·] -- NB: ff is syntax, this unfolds also f
|
|
|
|
|
|
/--
|
|
error: unsolved goals
|
|
x y : Nat
|
|
⊢ List.Mem x [x]
|
|
-/
|
|
#guard_msgs in
|
|
example (x y : Nat) : x ∈ [x] := by
|
|
simp only [· ∈ ·] -- syntax has arguments swapped, see #5905
|