#include <arith_proof_rules.h>
Inheritance diagram for CVCL::ArithProofRules:
Definition at line 40 of file arith_proof_rules.h.
|
Definition at line 43 of file arith_proof_rules.h. |
|
==> -(e) = (-1) * e
Implemented in CVCL::ArithTheoremProducer, and CVCL::RefinedArithTheoremProducer. Referenced by CVCL::TheoryArith::canon(). |
|
==> x - y = x + (-1) * y
Implemented in CVCL::ArithTheoremProducer, and CVCL::RefinedArithTheoremProducer. Referenced by CVCL::TheoryArith::canon(). |
|
-(e) ==> e / (-1); takes 'e' Canon Rule for unary minus: it just converts it to division by -1, the result is not yet canonical: Implemented in CVCL::ArithTheoremProducer. |
|
(c) / d ==> (c/d), takes c and d Canon Rules for division by constant 'd' Implemented in CVCL::ArithTheoremProducer. |
|
(c * x) / d ==> (c/d) * x, takes (c*x) and d
Implemented in CVCL::ArithTheoremProducer. |
|
(+ c ...)/d ==> push division to all the coefficients. The result is not canonical, but canonizing the summands will make it canonical. Takes (+ c ...) and d Implemented in CVCL::ArithTheoremProducer. |
|
x / d ==> (1/d) * x, takes x and d
Implemented in CVCL::ArithTheoremProducer. |
|
Implemented in CVCL::ArithTheoremProducer. |
|
Canonize (PLUS t1 ... tn).
Implemented in CVCL::ArithTheoremProducer, and CVCL::RefinedArithTheoremProducer. Referenced by CVCL::TheoryArith::canon(). |
|
Canonize (MULT t1 ... tn).
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::canon(). |
|
==> 1/e = e' where e' is canonical; takes e.
Implemented in CVCL::ArithTheoremProducer. |
|
Canonize t1/t2.
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::canon(). |
|
t*c ==> c*t, takes constant c and term t
Implemented in CVCL::ArithTheoremProducer. |
|
t1*t2 ==> Error, takes t1 and t2 where both are non-constants
Implemented in CVCL::ArithTheoremProducer. |
|
0*t ==> 0, takes 0*t
Implemented in CVCL::ArithTheoremProducer. |
|
1*t ==> t, takes 1*t
Implemented in CVCL::ArithTheoremProducer. |
|
c1*c2 ==> c', takes constant c1*c2
Implemented in CVCL::ArithTheoremProducer. |
|
c1*(c2*t) ==> c'*t, takes c1 and c2 and t
Implemented in CVCL::ArithTheoremProducer. |
|
c1*(+ c2 v1 ...) ==> (+ c' c1v1 ...), takes c1 and the sum
Implemented in CVCL::ArithTheoremProducer. |
|
c^n = c' (compute the constant power expression)
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::canon(). |
|
flattens the input. accepts a PLUS expr
Implemented in CVCL::ArithTheoremProducer. |
|
combine like terms. accepts a flattened PLUS expr
Implemented in CVCL::ArithTheoremProducer. |
|
e0 @ e1 <==> true | false, where @ is {=,<,<=,>,>=}
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::doSolve(), CVCL::TheoryArith::isolateVariable(), CVCL::TheoryArith::normalizeProjectIneqs(), and CVCL::TheoryArith::rewrite(). |
|
e[0] @ e[1] <==> 0 @ e[1] - e[0], where @ is {=,<,<=,>,>=}
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::addToBuffer(), CVCL::TheoryArith::doSolve(), CVCL::TheoryArith::normalizeProjectIneqs(), and CVCL::TheoryArith::rewrite(). |
|
x @ y <==> x + z @ y + z, where @ is {=,<,<=,>,>=} (given as 'kind')
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::isolateVariable(), CVCL::TheoryArith::processRealEq(), and CVCL::TheoryArith::processSimpleIntEq(). |
|
x = y <==> x * z = y * z, where z is a non-zero constant
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::normalize(), CVCL::TheoryArith::processRealEq(), and CVCL::TheoryArith::processSimpleIntEq(). |
|
Multiplying inequation by a non-zero constant. z>0 ==> e[0] @ e[1] <==> e[0]*z @ e[1]*z z<0 ==> e[0] @ e[1] <==> e[1]*z @ e[0]*z for @ in {<,<=,>,>=}: Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::isolateVariable(), CVCL::TheoryArith::normalize(), CVCL::TheoryArith::normalizeProjectIneqs(), and CVCL::TheoryArith::processFiniteInterval(). |
|
"op1 GE|GT op2" <==> op2 LE|LT op1
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::rewrite(). |
|
Propagating negation over <,<=,>,>=. NOT (op1 < op2) <==> (op1 >= op2) NOT (op1 <= op2) <==> (op1 > op2) NOT (op1 > op2) <==> (op1 <= op2) NOT (op1 >= op2) <==> (op1 < op2) Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::rewrite(). |
|
Real shadow: a <(=) t, t <(=) b ==> a <(=) b.
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::normalizeProjectIneqs(). |
|
Projecting a tight inequality: alpha <= t <= alpha ==> t = alpha.
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::normalizeProjectIneqs(). |
|
Finite interval for integers: a <= t <= a + c ==> G(t, a, 0, c).
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::processFiniteInterval(). |
|
Dark & Gray shadows when a <= b. takes two integer ineqs (i.e. all vars are ints) "|- beta <= b.x" and "|- a.x <= alpha" and checks if "1 <= a <= b" and returns (D or G) and (!D or !G), where D = Dark_Shadow(ab-1, b.alpha - a.beta), G = Gray_Shadow(a.x, alpha, -(a-1), 0). Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::normalizeProjectIneqs(). |
|
Dark & Gray shadows when b <= a. takes two integer ineqs (i.e. all vars are ints) "|- beta <= b.x" and "|- a.x <= alpha" and checks if "1 <= b < a" and returns (D or G) and (!D or !G), where D = Dark_Shadow(ab-1, b.alpha - a.beta), G = Gray_Shadow(b.x, beta, 0, b-1). Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::normalizeProjectIneqs(). |
|
DARK_SHADOW(t1, t2) ==> t1 <= t2.
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::assertFact(). |
|
GRAY_SHADOW(v, e, c, c) ==> v=e+c.
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::assertFact(). |
|
G(x, e, c1, c2) ==> (G1 or G2) and (!G1 or !G2). Here G1 = G(x,e,c1,c), G2 = G(x,e,c+1,c2), and c = floor((c1+c2)/2). Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::assertFact(). |
|
G(x, e, c1, c2) ==> e+c1 <= x AND x <= e+c2.
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::assertFact(). |
|
Optimized rules: GRAY_SHADOW(a*x, c, c1, c2) ==> [expansion]. Implements three versions of the rule:
where the conclusion may become FALSE or without the GRAY_SHADOW part, depending on the values of a, c and i. Implemented in CVCL::ArithTheoremProducer. |
|
|- G(ax, c, c1, c2) ==> |- G(x, 0, ceil((c1+c)/a), floor((c2+c)/a)) In the case the new c1 > c2, return |- FALSE Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::assertFact(). |
|
a,b: INT; a < b ==> a <= b-1 [or a+1 <= b] Takes a Theorem(\alpha < \beta) and returns Theorem(\alpha < \beta <==> \alpha <= \beta -1) or Theorem(\alpha < \beta <==> \alpha + 1 <= \beta), depending on which side must be changed (changeRight flag) Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::projectInequalities(). |
|
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::processSimpleIntEq(). |
|
Equality elimination rule for integers:
See the detailed description for explanations.
See detailed docs for more information. This rule implements a step in the iterative algorithm for eliminating integer equality. The terms in the rule are defined as follows:
All the variables and coefficients are integer, and a >= 2.
Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::processSimpleIntEq(). |
|
return e <=> TRUE/FALSE for e == IS_INTEGER(c), where c is a constant
Implemented in CVCL::ArithTheoremProducer. |
|
Implemented in CVCL::ArithTheoremProducer. |
|
Implemented in CVCL::ArithTheoremProducer. |
|
Implemented in CVCL::ArithTheoremProducer. |
|
Implemented in CVCL::ArithTheoremProducer. |
|
x /= y ==> (x < y) OR (x > y) Used in concrete model generation Implemented in CVCL::ArithTheoremProducer. Referenced by CVCL::TheoryArith::checkSat(). |