This PR sets up the new integrated test/bench suite. It then migrates all benchmarks and some related tests to the new suite. There's also some documentation and some linting. For now, a lot of the old tests are left alone so this PR doesn't become even larger than it already is. Eventually, all tests should be migrated to the new suite though so there isn't a confusing mix of two systems.
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
|