This PR implements `try?` using the new `finish?` infrastructure. It
also removes the old tracing infrastructure, which is now obsolete.
Example:
```lean
/--
info: Try these:
[apply] grind
[apply] grind only [findIdx, insert, = mem_indices_of_mem, = getElem?_neg, = getElem?_pos, = HashMap.mem_insert,
= HashMap.getElem_insert, #1bba]
[apply] grind only [findIdx, insert, = mem_indices_of_mem, = getElem?_neg, = getElem?_pos, = HashMap.mem_insert,
= HashMap.getElem_insert]
[apply] grind =>
instantiate only [findIdx, insert, = mem_indices_of_mem]
instantiate only [= getElem?_neg, = getElem?_pos]
cases #1bba
· instantiate only [findIdx]
· instantiate only
instantiate only [= HashMap.mem_insert, = HashMap.getElem_insert]
-/
#guard_msgs in
example (m : IndexMap α β) (a : α) (b : β) :
(m.insert a b).findIdx a = if h : a ∈ m then m.findIdx a else m.size := by
try?
```
89 lines
2.3 KiB
Text
89 lines
2.3 KiB
Text
import Lean.LibrarySuggestions
|
|
|
|
-- Test that try? can find solutions using grind? +suggestions
|
|
|
|
-- Test 1: Regular tactics should be tried first (rfl should win)
|
|
/--
|
|
info: Try these:
|
|
[apply] rfl
|
|
[apply] simp
|
|
[apply] simp only
|
|
[apply] grind
|
|
[apply] grind only
|
|
[apply] simp_all
|
|
-/
|
|
#guard_msgs in
|
|
example : 5 = 5 := by
|
|
try?
|
|
|
|
-- Test 2: A theorem that requires library suggestions
|
|
-- Define an opaque constant so grind can't unfold it
|
|
axiom SpecialProperty : Nat → Prop
|
|
|
|
-- A specific instance that's provable
|
|
axiom special_7 : SpecialProperty 7
|
|
|
|
-- Set up a premise selector that suggests special_7
|
|
set_library_suggestions (fun _ _ => pure #[{ name := `special_7, score := 1.0 }])
|
|
|
|
-- Expected: try? should find grind only [special_7]
|
|
/--
|
|
info: Try these:
|
|
[apply] grind only [special_7]
|
|
[apply] grind => instantiate only [special_7]
|
|
-/
|
|
#guard_msgs in
|
|
example : SpecialProperty 7 := by
|
|
try?
|
|
|
|
-- Test 3: For simp_all testing, use an axiom-based approach
|
|
axiom CustomOp : Nat → Nat → Nat
|
|
|
|
-- A property about CustomOp that can't be proven by unfolding
|
|
axiom custom_comm : ∀ x y, CustomOp x y = CustomOp y x
|
|
|
|
-- Set up a premise selector that suggests custom_comm
|
|
set_library_suggestions (fun _ _ => pure #[{ name := `custom_comm, score := 1.0 }])
|
|
|
|
-- Expected: try? should find grind only [custom_comm]
|
|
/--
|
|
info: Try these:
|
|
[apply] grind only [custom_comm]
|
|
[apply] grind => instantiate only [custom_comm]
|
|
-/
|
|
#guard_msgs in
|
|
example (a b : Nat) : CustomOp a b = CustomOp b a := by
|
|
try?
|
|
|
|
-- Test 4: With a hypothesis that needs library suggestions
|
|
/--
|
|
info: Try these:
|
|
[apply] grind only [custom_comm]
|
|
[apply] grind => instantiate only [custom_comm]
|
|
-/
|
|
#guard_msgs in
|
|
example (a b c : Nat) (h : CustomOp a b = c) : CustomOp b a = c := by
|
|
try?
|
|
|
|
-- Test 5: Multiple library suggestions with grind
|
|
axiom Property1 : Nat → Prop
|
|
axiom Property2 : Nat → Prop
|
|
|
|
axiom prop1_5 : Property1 5
|
|
axiom prop2_5 : Property2 5
|
|
|
|
-- Set up a premise selector with multiple suggestions
|
|
set_library_suggestions (fun _ _ => pure #[
|
|
{ name := `prop1_5, score := 0.9 },
|
|
{ name := `prop2_5, score := 0.7 }
|
|
])
|
|
|
|
-- Expected: try? should use the best applicable one
|
|
/--
|
|
info: Try these:
|
|
[apply] grind only [prop1_5]
|
|
[apply] grind => instantiate only [prop1_5]
|
|
-/
|
|
#guard_msgs in
|
|
example : Property1 5 := by
|
|
try?
|