124 lines
3.1 KiB
Text
124 lines
3.1 KiB
Text
module
|
||
@[expose] public section -- TODO: remove after we fix congr_eq
|
||
|
||
set_option trace.grind.ematch.pattern true
|
||
|
||
/--
|
||
trace: [grind.ematch.pattern] Array.getElem_push_lt: [@getElem (Array #4) `[Nat] _ _ _ (@Array.push _ #3 #2) #1 _]
|
||
-/
|
||
#guard_msgs in
|
||
grind_pattern Array.getElem_push_lt => (xs.push x)[i]
|
||
|
||
|
||
/--
|
||
trace: [grind.ematch.pattern] List.getElem_attach: [@getElem (List (@Subtype #3 _)) `[Nat] (@Subtype _ _) _ _ (@List.attach _ #2) #1 _]
|
||
-/
|
||
#guard_msgs in
|
||
grind_pattern List.getElem_attach => xs.attach[i]
|
||
|
||
/--
|
||
trace: [grind.ematch.pattern] List.mem_concat_self: [@Membership.mem #2 (List _) _ (@HAppend.hAppend (List _) (List _) (List _) _ #1 (@List.cons _ #0 (@List.nil _))) #0]
|
||
-/
|
||
#guard_msgs in
|
||
grind_pattern List.mem_concat_self => a ∈ xs ++ [a]
|
||
|
||
def foo (x : Nat) := x + x
|
||
|
||
/-- error: invalid E-matching theorem `foo`, type is not a proposition -/
|
||
#guard_msgs in
|
||
grind_pattern foo => x + x
|
||
|
||
/--
|
||
error: invalid pattern(s) for `Array.getElem_push_lt`
|
||
[@Array.push #4 #3 #2]
|
||
the following theorem parameters cannot be instantiated:
|
||
i : Nat
|
||
h : i < xs.size
|
||
---
|
||
trace: [grind.ematch.pattern] Array.getElem_push_lt: [@Array.push #4 #3 #2]
|
||
-/
|
||
#guard_msgs in
|
||
grind_pattern Array.getElem_push_lt => (xs.push x)
|
||
|
||
class Foo (α : Type) (β : outParam Type) where
|
||
a : Unit
|
||
|
||
class Boo (α : Type) (β : Type) where
|
||
b : β
|
||
|
||
def f [Foo α β] [Boo α β] (a : α) : (α × β) :=
|
||
(a, Boo.b α)
|
||
|
||
instance [Foo α β] : Foo (List α) (Array β) where
|
||
a := ()
|
||
|
||
instance [Boo α β] : Boo (List α) (Array β) where
|
||
b := #[Boo.b α]
|
||
|
||
theorem fEq [Foo α β] [Boo α β] (a : List α) : (f a).1 = a := rfl
|
||
|
||
/-- trace: [grind.ematch.pattern] fEq: [@f (List #4) (Array #3) _ _ #0] -/
|
||
#guard_msgs in
|
||
grind_pattern fEq => f a
|
||
|
||
theorem fEq2 [Foo α β] [Boo α β] (a : List α) (_h : a.length > 5) : (f a).1 = a := rfl
|
||
|
||
/-- trace: [grind.ematch.pattern] fEq2: [@f (List #5) (Array #4) _ _ #1] -/
|
||
#guard_msgs in
|
||
grind_pattern fEq2 => f a
|
||
|
||
def g [Boo α β] (a : α) : (α × β) :=
|
||
(a, Boo.b α)
|
||
|
||
theorem gEq [Boo α β] (a : List α) : (g (β := Array β) a).1 = a := rfl
|
||
|
||
/--
|
||
error: invalid pattern(s) for `gEq`
|
||
[@g (List #3) _ _ #0]
|
||
the following theorem parameters cannot be instantiated:
|
||
β : Type
|
||
inst✝ : Boo α β
|
||
---
|
||
trace: [grind.ematch.pattern] gEq: [@g (List #3) _ _ #0]
|
||
-/
|
||
#guard_msgs in
|
||
grind_pattern gEq => g a
|
||
|
||
def plus (a : Nat) (b : Nat) := a + b
|
||
|
||
theorem hThm1 (h : b > 10) : plus a b + plus a c > 10 := by
|
||
unfold plus; omega
|
||
|
||
/--
|
||
error: invalid pattern(s) for `hThm1`
|
||
[plus #2 #3]
|
||
the following theorem parameters cannot be instantiated:
|
||
c : Nat
|
||
---
|
||
trace: [grind.ematch.pattern] hThm1: [plus #2 #3]
|
||
-/
|
||
#guard_msgs in
|
||
grind_pattern hThm1 => plus a b
|
||
|
||
/--
|
||
error: invalid pattern(s) for `hThm1`
|
||
[plus #2 #1]
|
||
the following theorem parameters cannot be instantiated:
|
||
b : Nat
|
||
h : b > 10
|
||
---
|
||
trace: [grind.ematch.pattern] hThm1: [plus #2 #1]
|
||
-/
|
||
#guard_msgs in
|
||
grind_pattern hThm1 => plus a c
|
||
|
||
/-- trace: [grind.ematch.pattern] hThm1: [plus #2 #1, plus #2 #3] -/
|
||
#guard_msgs in
|
||
grind_pattern hThm1 => plus a c, plus a b
|
||
|
||
/--
|
||
error: invalid pattern, (non-forbidden) application expected
|
||
And #4 #3
|
||
-/
|
||
#guard_msgs (error) in
|
||
grind_pattern And.imp_left => a ∧ b
|