50 lines
1.3 KiB
Text
50 lines
1.3 KiB
Text
module
|
||
public section -- TODO: Fix error messages with private names.
|
||
def replicate : (n : Nat) → (a : α) → List α
|
||
| 0, _ => []
|
||
| n+1, a => a :: replicate n a
|
||
|
||
/--
|
||
trace: [grind.ematch.pattern] replicate.eq_1: [@replicate #1 `[0] #0]
|
||
[grind.ematch.pattern] replicate.eq_2: [@replicate #2 (#0 + 1) #1]
|
||
-/
|
||
#guard_msgs (trace) in
|
||
set_option trace.grind.ematch.pattern true in
|
||
attribute [grind] replicate
|
||
|
||
example : ys = [] → replicate 0 [] = ys := by
|
||
grind only [replicate]
|
||
|
||
/--
|
||
error: invalid `grind` parameter, `replicate` is a definition, the only acceptable (and redundant) modifier is '='
|
||
-/
|
||
#guard_msgs (error) in
|
||
example : ys = [] → replicate 0 [] = ys := by
|
||
grind only [←replicate]
|
||
|
||
example : ys = [] → replicate 0 [] = ys := by
|
||
fail_if_success grind only
|
||
sorry
|
||
|
||
example (ys : List α) : n = 0 → replicate n ys = [] := by
|
||
grind only [replicate]
|
||
|
||
example (ys : List α) : n = 0 → List.replicate n ys = [] := by
|
||
grind only [List.replicate]
|
||
|
||
opaque foo : Nat → Nat
|
||
opaque bla : Nat → Nat
|
||
|
||
theorem foo_bla : foo x = bla x := sorry
|
||
|
||
example : foo x = bla x := by
|
||
grind only [_=_ foo_bla]
|
||
|
||
@[reducible] def inc (_ : Nat) := 1
|
||
|
||
/--
|
||
error: `inc` is a reducible definition, `grind` automatically unfolds them
|
||
-/
|
||
#guard_msgs (error) in
|
||
example : a = 1 → inc x = a := by
|
||
grind [inc]
|