Instances For
- p : Poly
- h : EqCnstrProof
- sugar : Nat
- id : Nat
Instances For
- core (a b : Expr) (ra rb : RingExpr) : EqCnstrProof
- superpose (k₁ : Int) (m₁ : Mon) (c₁ : EqCnstr) (k₂ : Int) (m₂ : Mon) (c₂ : EqCnstr) : EqCnstrProof
- simp (k₁ : Int) (c₁ : EqCnstr) (k₂ : Int) (m₂ : Mon) (c₂ : EqCnstr) : EqCnstrProof
- mul (k : Int) (e : EqCnstr) : EqCnstrProof
- div (k : Int) (e : EqCnstr) : EqCnstrProof
Instances For
Equations
Instances For
A polynomial equipped with a chain of rewrite steps that justifies its equality to the original input.
From an input polynomial p, we use equations (i.e., EqCnstr) as rewriting rules.
For example, consider the following sequence of rewrites for the input polynomial x^2 + x*y
using the equations x - 1 = 0 (c₁) and y - 2 = 0 (c₂).
2*x^2 + x*y | s₁ := .input (2*x^2 + x*y)
= - 2*x*(x - 1)
(2*x + x*y) | s₂ := .step (2*x + x*y) 1 s₁ (-2) x c₁
= - 2*1*(x - 1)
(x*y + 2) | s₃ := .step (x*y + 2) 1 s₂ (-2) 1 c₁
= - 1*y*(x - 1)
(y + 2) | s₄ := .step (y+2) 1 s₃ (-1) y c₁
= - 1*1*(y - 2)
4 | s₅ := .step 4 1 s₄ 1 1 c₂
From the chain above, we build the certificate
(-2*x - y - 2)*(x-1) + (-1)*(y-2)
for
4 = (2*x^2 + x*y)
because x-1 = 0 and y-2=0
- input (p : Poly) : PolyDerivation
- step
(p : Poly)
(k₁ : Int)
(d : PolyDerivation)
(k₂ : Int)
(m₂ : Mon)
(c : EqCnstr)
: PolyDerivation
p = k₁*d.getPoly + k₂*m₂*c.pThe coefficient
k₁is used because the leading monomial incmay not be monic. Thus, if we follow the chain back to the input polynomial, we have thatp = C * input_pfor aCthat is equal to the product of allk₁s in the chain. We have thatC ≠ 1only if the ring does not implementNoNatZeroDivisors. Here is a small example where we simplifyx+yusing the equations2*x - 1 = 0(c₁),3*y - 1 = 0(c₂), and6*z + 5 = 0(c₃)x + y + z | s₁ := .input (x + y + z) *2 = - 1*1*(2*x - 1) 2*y + 2*z + 1 | s₂ := .step (2*y + 2*z + 1) 2 s₁ (-1) 1 c₁ *3 = - 2*1*(3*y - 1) 6*z + 5 | s₃ := .step (6*z + 5) 3 s₂ (-2) 1 c₂ = - 1*1*(6*z + 5) 0 | s₄ := .step (0) 1 s₃ (-1) 1 c₃For this chain, we build the certificate
(-3)*(2*x - 1) + (-2)*(3*y - 1) + (-1)*(6*z + 5)for
0 = 6*(x + y + z)Recall that if the ring implement
NoNatZeroDivisors, then the following property holds:∀ (k : Int) (a : α), k ≠ 0 → (intCast k) * a = 0 → a = 0grind can deduce that
x+y+z = 0
Instances For
Equations
- (Lean.Meta.Grind.Arith.CommRing.PolyDerivation.input p).p = p
- (Lean.Meta.Grind.Arith.CommRing.PolyDerivation.step p k₁ d k₂ m₂ c).p = p
Instances For
State for each CommRing processed by this module.
- id : Nat
- type : Expr
- u : Level
Cached
getDecLevel type - commRingInst : Expr
CommRinginstance fortype IsCharPinstance fortypeif available.NoNatZeroDivisorsinstance fortypeif available.- addFn : Expr
- mulFn : Expr
- subFn : Expr
- negFn : Expr
- powFn : Expr
- intCastFn : Expr
- natCastFn : Expr
Mapping from variables to their denotations. Remark each variable can be in only one ring.
Mapping from
Exprto a variable representing it.Mapping from Lean expressions to their representations as
RingExpr- nextId : Nat
Next unique id for
EqCnstrs. - steps : Nat
Number of "steps": simplification and superposition.
- queue : Queue
Equations to process.
Mapping from variables
xto equations such that the smallest variable in the leading monomial isx.- diseqs : PArray DiseqCnstr
Disequalities.
- recheck : Bool
If
recheckistrue, then new equalities have been added to the basis since we checked disequalities and implied equalities.
Instances For
Equations
- One or more equations did not get rendered due to their size.