This PR adds the attribute `[grind?]`. It is like `[grind]` but displays inferred E-matching patterns. It is a more convinient than writing. Thanks @kim-em for suggesting this feature. ```lean set_option trace.grind.ematch.pattern true ``` This PR also improves some tests, and adds helper function `ENode.isRoot`.
61 lines
1.8 KiB
Text
61 lines
1.8 KiB
Text
opaque R : Nat → Nat → Prop
|
||
|
||
@[grind ->]
|
||
axiom Rtrans {x y z : Nat} : R x y → R y z → R x z
|
||
|
||
@[grind →]
|
||
axiom Rtrans' {x y z : Nat} : R x y → R y z → R x z
|
||
|
||
@[grind <-]
|
||
axiom Rsymm {x y : Nat} : R x y → R y x
|
||
|
||
@[grind ←]
|
||
axiom Rsymm' {x y : Nat} : R x y → R y x
|
||
|
||
example : R a b → R b c → R d c → R a d := by
|
||
grind only [-> Rtrans, <- Rsymm]
|
||
|
||
example : R a b → R b c → R d c → R a d := by
|
||
grind only [→ Rtrans, ← Rsymm]
|
||
|
||
|
||
opaque State : Type
|
||
opaque State.le (σ₁ σ₂ : State) : Prop
|
||
axiom State.update : State → Nat → Nat → State
|
||
opaque Expr : Type
|
||
opaque Expr.eval : Expr → State → Nat
|
||
axiom Expr.constProp : Expr → State → Expr
|
||
|
||
|
||
/-- trace: [grind.ematch.pattern] eval_constProp_of_sub: [State.le #3 #2, constProp #1 #3] -/
|
||
#guard_msgs (trace) in
|
||
set_option trace.grind.ematch.pattern true in
|
||
@[grind =>] theorem Expr.eval_constProp_of_sub (e : Expr) (h : State.le σ' σ) : (e.constProp σ').eval σ = e.eval σ :=
|
||
sorry
|
||
|
||
/-- trace: [grind.ematch.pattern] eval_constProp_of_eq_of_sub: [State.le #3 #2, constProp #1 #3] -/
|
||
#guard_msgs (trace) in
|
||
set_option trace.grind.ematch.pattern true in
|
||
@[grind =>] theorem Expr.eval_constProp_of_eq_of_sub {e : Expr} (h₂ : State.le σ' σ) : (e.constProp σ').eval σ = e.eval σ :=
|
||
sorry
|
||
|
||
/-- trace: [grind.ematch.pattern] update_le_update: [le #4 #3, update #4 #2 #1] -/
|
||
#guard_msgs (trace) in
|
||
set_option trace.grind.ematch.pattern true in
|
||
@[grind =>] theorem State.update_le_update (h : State.le σ' σ) : State.le (σ'.update x v) (σ.update x v) :=
|
||
sorry
|
||
|
||
|
||
namespace Foo
|
||
|
||
/-- info: Rtrans: [R #4 #3, R #3 #2] -/
|
||
#guard_msgs (info) in
|
||
@[grind? ->]
|
||
axiom Rtrans {x y z : Nat} : R x y → R y z → R x z
|
||
|
||
/-- info: Rtrans': [R #4 #3, R #3 #2] -/
|
||
#guard_msgs (info) in
|
||
@[grind? →]
|
||
axiom Rtrans' {x y z : Nat} : R x y → R y z → R x z
|
||
|
||
end Foo
|