lean4-htt/tests/lean/run/maxSuggestionsTest.lean

111 lines
2.9 KiB
Text

import Lean.LibrarySuggestions.Basic
/-!
# Tests for `maxSuggestions` parameter in `Simp.Config` and `Grind.Config`
This test verifies that the `maxSuggestions` field properly limits the number
of library suggestions passed to tactics when using `+suggestions`.
-/
section Grind
-- Define test theorems where only p3 helps with P 3
def P (_ : Nat) := True
theorem p1 : P 1 := trivial
theorem p2 : P 2 := trivial
theorem p3 : P 3 := trivial
theorem p4 : P 4 := trivial
theorem p5 : P 5 := trivial
-- Mock selector that returns suggestions respecting maxSuggestions
-- p3 is at position 3 (score 0.8)
set_library_suggestions (fun _ cfg => pure <|
#[{ name := `p1, score := 1.0 },
{ name := `p2, score := 0.9 },
{ name := `p3, score := 0.8 },
{ name := `p4, score := 0.7 },
{ name := `p5, score := 0.6 }].take cfg.maxSuggestions)
-- Baseline: with default maxSuggestions, all 5 suggestions shown
/--
info: Library suggestions:
p1 (score: 1.000000)
p2 (score: 0.900000)
p3 (score: 0.800000)
p4 (score: 0.700000)
p5 (score: 0.600000)
-/
#guard_msgs in
example : P 1 := by
suggestions
exact p1
-- KEY TEST: P 3 requires p3, which is at position 3
-- With maxSuggestions := some 2, grind only gets p1 and p2, so it FAILS
-- The diagnostics show p1 and p2 were received (not p3)
/--
error: `grind` failed
case grind
h : ¬P 3
⊢ False
[grind] Goal diagnostics
[facts] Asserted facts
[prop] ¬P 3
[prop] P 1
[prop] P 2
[eqc] True propositions
[prop] P 1
[prop] P 2
[eqc] False propositions
[prop] P 3
[grind] Diagnostics
[thm] E-Matching instances
[thm] p1 ↦ 1
[thm] p2 ↦ 1
-/
#guard_msgs in
example : P 3 := by grind +suggestions (maxSuggestions := some 2)
-- With maxSuggestions := some 3, grind gets p1, p2, p3, so it SUCCEEDS
#guard_msgs in
example : P 3 := by grind +suggestions (maxSuggestions := some 3)
end Grind
section Simp
-- Define simp lemmas where only s3 helps with the goal `c = true`
def a : Bool := true
def b : Bool := true
def c : Bool := true
theorem s1 : a = true := rfl
theorem s2 : b = true := rfl
theorem s3 : c = true := rfl
theorem s4 : a = a := rfl
theorem s5 : b = b := rfl
-- Mock selector for simp tests
set_library_suggestions (fun _ cfg => pure <|
#[{ name := `s1, score := 1.0 },
{ name := `s2, score := 0.9 },
{ name := `s3, score := 0.8 },
{ name := `s4, score := 0.7 },
{ name := `s5, score := 0.6 }].take cfg.maxSuggestions)
-- With maxSuggestions := some 2, simp? only gets s1 and s2, so it can't prove c = true
/--
error: `simp` made no progress
-/
#guard_msgs in
example : c = true := by simp? +suggestions (maxSuggestions := some 2) only
-- With maxSuggestions := some 3, simp? gets s1, s2, s3, so it SUCCEEDS
/--
info: Try this:
[apply] simp (maxSuggestions := some 3) only [s3]
-/
#guard_msgs in
example : c = true := by simp? +suggestions (maxSuggestions := some 3) only
end Simp