This PR makes `simp_arith` use `RArray` for the context of the reflection proofs, which scales better when there are many variables. On our synthetic benchmark: ``` simp_arith1 instructions -25.1% (-4892.6 σ) ``` No effect on mathlib, though, guess it’s not used much on large goals there: http://speed.lean-fro.org/mathlib4/compare/873b982b-2038-462a-9b68-0c0fc457f90d/to/56e66691-2f1f-4947-a922-37b80680315d
19 lines
770 B
Text
19 lines
770 B
Text
import Lean
|
|
|
|
open Nat.SOM
|
|
|
|
-- Convenient RArray literals
|
|
elab tk:"#R[" ts:term,* "]" : term => do
|
|
let ts : Array Lean.Syntax := ts
|
|
let es ← ts.mapM fun stx => Lean.Elab.Term.elabTerm stx none
|
|
if h : 0 < es.size then
|
|
return (Lean.RArray.toExpr (← Lean.Meta.inferType es[0]!) id (Lean.RArray.ofArray es h))
|
|
else
|
|
throwErrorAt tk "RArray cannot be empty"
|
|
|
|
example : (x + y) * (x + y + 1) = x * (1 + y + x) + (y + 1 + x) * y :=
|
|
let ctx := #R[x, y]
|
|
let lhs : Expr := .mul (.add (.var 0) (.var 1)) (.add (.add (.var 0) (.var 1)) (.num 1))
|
|
let rhs : Expr := .add (.mul (.var 0) (.add (.add (.num 1) (.var 1)) (.var 0)))
|
|
(.mul (.add (.add (.var 1) (.num 1)) (.var 0)) (.var 1))
|
|
Expr.eq_of_toPoly_eq ctx lhs rhs (Eq.refl true)
|