lean4-htt/tests/lean/run/grind_pattern1.lean
Leonardo de Moura 08ec2541c7
feat: add support for constructors and axioms to the grind E-matching module (#6839)
This PR ensures `grind` can use constructors and axioms for heuristic
instantiation based on E-matching. It also allows patterns without
pattern variables for theorems such as `theorem evenz : Even 0`.
2025-01-29 05:22:05 +00:00

119 lines
2.9 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

set_option trace.grind.ematch.pattern true
/--
info: [grind.ematch.pattern] Array.getElem_push_lt: [@getElem ? `[Nat] #4 ? ? (@Array.push ? #3 #2) #1 ?]
-/
#guard_msgs in
grind_pattern Array.getElem_push_lt => (a.push x)[i]
/-- info: [grind.ematch.pattern] List.getElem_attach: [@getElem ? `[Nat] ? ? ? (@List.attach #3 #2) #1 ?] -/
#guard_msgs in
grind_pattern List.getElem_attach => xs.attach[i]
/--
info: [grind.ematch.pattern] List.mem_concat_self: [@Membership.mem #2 ? ? (@HAppend.hAppend ? ? ? ? #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 < a.size
---
info: [grind.ematch.pattern] Array.getElem_push_lt: [@Array.push #4 #3 #2]
-/
#guard_msgs in
grind_pattern Array.getElem_push_lt => (a.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
/-- info: [grind.ematch.pattern] fEq: [@f ? ? ? ? #0] -/
#guard_msgs in
grind_pattern fEq => f a
theorem fEq2 [Foo α β] [Boo α β] (a : List α) (_h : a.length > 5) : (f a).1 = a := rfl
/-- info: [grind.ematch.pattern] fEq2: [@f ? ? ? ? #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 ? ? ? #0]
the following theorem parameters cannot be instantiated:
β : Type
inst✝ : Boo α β
---
info: [grind.ematch.pattern] gEq: [@g ? ? ? #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
---
info: [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
---
info: [grind.ematch.pattern] hThm1: [plus #2 #1]
-/
#guard_msgs in
grind_pattern hThm1 => plus a c
/-- info: [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
#4 ∧ #3
-/
#guard_msgs in
grind_pattern And.imp_left => a ∧ b