Instances For
Instances For
- p : Poly
- h : EqCnstrProof
- sugar : Nat
- id : Nat
Instances For
- core (a b : Expr) (ra rb : RingExpr) : EqCnstrProof
- coreS (a b : Expr) (sa sb : SemiringExpr) (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
- gcd (a b : Int) (c₁ c₂ : EqCnstr) : EqCnstrProof
- numEq0 (k : Nat) (c₁ c₂ : 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.p
The coefficient
k₁
is used because the leading monomial inc
may not be monic. Thus, if we follow the chain back to the input polynomial, we have thatp = C * input_p
for aC
that is equal to the product of allk₁
s in the chain. We have thatC ≠ 1
only if the ring does not implementNoNatZeroDivisors
. Here is a small example where we simplifyx+y
using 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 = 0
grind can deduce that
x+y+z = 0
- normEq0 (p : Poly) (d : PolyDerivation) (c : EqCnstr) : PolyDerivation
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
- (Lean.Meta.Grind.Arith.CommRing.PolyDerivation.normEq0 p d c).p = p
Instances For
A disequality lhs ≠ rhs
asserted by the core.
- lhs : Expr
- rhs : Expr
- rlhs : RingExpr
Reified
lhs
- rrhs : RingExpr
Reified
rhs
- d : PolyDerivation
- ofSemiring? : Option (SemiringExpr × SemiringExpr)
Instances For
State for each CommRing
processed by this module.
- id : Nat
If this is a
OfSemiring.Q α
ring, this field contain thesemiringId
forα
.- type : Expr
- u : Level
Cached
getDecLevel type
- semiringInst : Expr
- ringInst : Expr
- commSemiringInst : Expr
CommSemiring
instance fortype
- commRingInst : Expr
CommRing
instance fortype
IsCharP
instance fortype
if available.NoNatZeroDivisors
instance fortype
if available.Field
instance fortype
if available.- addFn : Expr
- mulFn : Expr
- subFn : Expr
- negFn : Expr
- powFn : Expr
- intCastFn : Expr
- natCastFn : Expr
Inverse if
fieldInst?
issome inst
- one : Expr
Mapping from variables to their denotations. Remark each variable can be in only one ring.
Mapping from
Expr
to a variable representing it.Mapping from Lean expressions to their representations as
RingExpr
- nextId : Nat
Next unique id for
EqCnstr
s. - steps : Nat
Number of "steps": simplification and superposition.
- queue : Queue
Equations to process.
The basis is currently just a list. If this is a performance bottleneck, we should use a better data-structure. For examples, we could use a simple indexing for the linear case where we map variable in the leading monomial to
EqCnstr
.- diseqs : PArray DiseqCnstr
Disequalities.
- recheck : Bool
If
recheck
istrue
, then new equalities have been added to the basis since we checked disequalities and implied equalities. Inverse theorems that have been already asserted.
An equality of the form
c = 0
. It is used to simplify polynomial coefficients.- numEq0Updated : Bool
Flag indicating whether
numEq0?
has been updated.
Instances For
Equations
- One or more equations did not get rendered due to their size.
State for each CommSemiring
processed by this module.
Recall that CommSemiring
are processed using the envelop OfCommSemiring.Q
- id : Nat
- ringId : Nat
Id for
OfCommSemiring.Q
- type : Expr
- u : Level
Cached
getDecLevel type
- semiringInst : Expr
- commSemiringInst : Expr
CommSemiring
instance fortype
AddRightCancel
instance fortype
if available.- toQFn : Expr
- addFn : Expr
- mulFn : Expr
- powFn : Expr
- natCastFn : Expr
- denote : PHashMap ExprPtr SemiringExpr
Mapping from Lean expressions to their representations as
SemiringExpr
Mapping from variables to their denotations. Remark each variable can be in only one ring.
Mapping from
Expr
to a variable representing it.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Equations
- One or more equations did not get rendered due to their size.