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?
```
145 lines
3.9 KiB
Text
145 lines
3.9 KiB
Text
module
|
||
reset_grind_attrs%
|
||
|
||
attribute [grind =] List.length_cons
|
||
attribute [grind =] List.getElem?_eq_getElem
|
||
attribute [grind =] List.length_replicate
|
||
attribute [grind =] List.getElem_replicate
|
||
attribute [grind =] List.getElem?_eq_none
|
||
attribute [grind =] List.getElem?_eq_some_iff
|
||
attribute [grind =] getElem!_pos
|
||
|
||
attribute [grind =] Option.map_some Option.map_none
|
||
attribute [grind =] List.getElem?_map
|
||
attribute [grind =] List.getElem?_replicate
|
||
|
||
attribute [grind =] List.getLast?_eq_some_iff
|
||
attribute [grind ←] List.mem_concat_self
|
||
|
||
attribute [grind =] List.getElem_cons_zero in
|
||
attribute [grind =] List.getElem?_cons_zero in
|
||
|
||
/--
|
||
info: Try these:
|
||
[apply] grind only [= List.getElem?_replicate]
|
||
[apply] grind => instantiate only [= List.getElem?_replicate]
|
||
-/
|
||
#guard_msgs (info) in
|
||
theorem getElem?_replicate' : (List.replicate n a)[m]? = if m < n then some a else none := by
|
||
grind?
|
||
|
||
/--
|
||
info: Try these:
|
||
[apply] grind only [= List.length_cons]
|
||
[apply] grind => instantiate only [= List.length_cons]
|
||
-/
|
||
#guard_msgs (info) in
|
||
example : 0 < (x :: t).length := by
|
||
grind?
|
||
|
||
attribute [grind ext] List.ext_getElem?
|
||
/--
|
||
info: Try these:
|
||
[apply] grind only [= List.getElem?_replicate, = List.getElem?_map, = List.getElem?_eq_none,
|
||
= List.getElem?_eq_getElem, = List.length_replicate, = List.getElem?_eq_some_iff, = Option.map_some,
|
||
= Option.map_none, #12fe, #986e, #0323]
|
||
[apply] grind only [= List.getElem?_replicate, = List.getElem?_map, = List.getElem?_eq_none,
|
||
= List.getElem?_eq_getElem, = List.length_replicate, = List.getElem?_eq_some_iff, = Option.map_some,
|
||
= Option.map_none]
|
||
[apply] grind =>
|
||
cases #12fe
|
||
instantiate only [= List.getElem?_replicate, = List.getElem?_map, = List.getElem?_eq_none,
|
||
= List.getElem?_eq_getElem]
|
||
instantiate only [= List.getElem?_replicate, = List.getElem?_eq_none, = List.getElem?_eq_getElem,
|
||
= List.length_replicate]
|
||
instantiate only [= List.length_replicate]
|
||
cases #986e
|
||
· instantiate only [= List.getElem?_eq_some_iff]
|
||
cases #0323
|
||
· instantiate only [= Option.map_some]
|
||
· instantiate only [= Option.map_none]
|
||
· instantiate only [= Option.map_some]
|
||
-/
|
||
#guard_msgs (info) in
|
||
theorem map_replicate' : (List.replicate n a).map f = List.replicate n (f a) := by
|
||
grind?
|
||
|
||
/--
|
||
info: Try these:
|
||
[apply] grind only [= List.getLast?_eq_some_iff, ← List.mem_concat_self, #e8ab]
|
||
[apply] grind only [= List.getLast?_eq_some_iff, ← List.mem_concat_self]
|
||
[apply] grind =>
|
||
instantiate only [= List.getLast?_eq_some_iff]
|
||
cases #e8ab <;> instantiate only [← List.mem_concat_self]
|
||
-/
|
||
#guard_msgs (info) in
|
||
theorem mem_of_getLast?_eq_some' {xs : List α} {a : α} (h : xs.getLast? = some a) : a ∈ xs := by
|
||
grind?
|
||
|
||
@[expose] public def f : Nat → Nat
|
||
| 0 => 1
|
||
| _ => 2
|
||
|
||
/--
|
||
info: Try these:
|
||
[apply] grind only
|
||
[apply] grind => instantiate only
|
||
-/
|
||
#guard_msgs (info) in
|
||
example : x = 0 → f x = 1 := by
|
||
unfold f
|
||
grind? -- should not include match equations
|
||
|
||
attribute [grind] f
|
||
|
||
/--
|
||
info: Try these:
|
||
[apply] grind only [f]
|
||
[apply] grind => instantiate only [f]
|
||
-/
|
||
#guard_msgs (info) in
|
||
example : x = 0 → f x = 1 := by
|
||
grind? [f]
|
||
|
||
opaque g : Nat → Nat
|
||
|
||
theorem gthm : g (g x) = g x := sorry
|
||
|
||
grind_pattern gthm => g (g x)
|
||
|
||
/--
|
||
info: Try these:
|
||
[apply] grind only [usr gthm]
|
||
[apply] grind => instantiate only [usr gthm]
|
||
-/
|
||
#guard_msgs (info) in
|
||
example : g (g (g x)) = g x := by
|
||
grind?
|
||
|
||
/--
|
||
error: `And` is marked as a built-in case-split for `grind` and cannot be erased
|
||
-/
|
||
#guard_msgs (error) in
|
||
attribute [-grind] And
|
||
|
||
/--
|
||
error: `And` is marked as a built-in case-split for `grind` and cannot be erased
|
||
-/
|
||
#guard_msgs (error) in
|
||
example : p ∧ q → p := by
|
||
grind [-And]
|
||
|
||
example : (List.replicate n a)[m]? = if m < n then some a else none := by
|
||
grind?
|
||
|
||
reset_grind_attrs%
|
||
|
||
set_option warn.sorry false
|
||
|
||
/--
|
||
info: Try this:
|
||
[apply] grind => sorry
|
||
-/
|
||
#guard_msgs in
|
||
example : (List.replicate n a)[m]? = if m < n then some a else none := by
|
||
grind?
|