summaryrefslogtreecommitdiff
path: root/src/theory/quantifiers/quant_util.cpp
diff options
context:
space:
mode:
authorajreynol <andrew.j.reynolds@gmail.com>2015-02-04 09:19:46 +0100
committerajreynol <andrew.j.reynolds@gmail.com>2015-02-04 09:19:46 +0100
commit03541f4faeb820539ac25f06f1e64adc7aedca6f (patch)
tree19e09a23a205d1598b8cba8682aadac8a1b0edee /src/theory/quantifiers/quant_util.cpp
parent3df24b6e0480799e8f400d15778ed5d3fb2ba7ae (diff)
Start work on simplifying single inv solutions. Minor.
Diffstat (limited to 'src/theory/quantifiers/quant_util.cpp')
-rw-r--r--src/theory/quantifiers/quant_util.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/theory/quantifiers/quant_util.cpp b/src/theory/quantifiers/quant_util.cpp
index 2dd800592..8d24c2cef 100644
--- a/src/theory/quantifiers/quant_util.cpp
+++ b/src/theory/quantifiers/quant_util.cpp
@@ -135,6 +135,33 @@ void QuantArith::debugPrintMonomialSum( std::map< Node, Node >& msum, const char
Trace(c) << std::endl;
}
+bool QuantArith::solveEqualityFor( Node lit, Node v, Node & veq ) {
+ Assert( lit.getKind()==EQUAL || lit.getKind()==IFF );
+ //first look directly at sides
+ TypeNode tn = lit[0].getType();
+ for( unsigned r=0; r<2; r++ ){
+ if( lit[r]==v ){
+ Node olitr = lit[r==0 ? 1 : 0];
+ veq = tn.isBoolean() ? lit[r].iffNode( olitr ) : lit[r].eqNode( olitr );
+ return true;
+ }
+ }
+ if( tn.isInteger() || tn.isReal() ){
+ std::map< Node, Node > msum;
+ if( QuantArith::getMonomialSumLit( lit, msum ) ){
+ if( QuantArith::isolate( v, msum, veq, EQUAL ) ){
+ if( veq[0]!=v ){
+ Assert( veq[1]==v );
+ veq = v.eqNode( veq[0] );
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+
void QuantRelevance::registerQuantifier( Node f ){
//compute symbols in f
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback