Added the command line flag --rewrite-arithmetic-equalities. This sets a static...
authorTim King <taking@cs.nyu.edu>
Wed, 30 Mar 2011 15:07:02 +0000 (15:07 +0000)
committerTim King <taking@cs.nyu.edu>
Wed, 30 Mar 2011 15:07:02 +0000 (15:07 +0000)
src/theory/arith/arith_rewriter.cpp
src/util/options.cpp
src/util/options.h

index 9413941385a920145c5c4ac13581502e7b5715f7..cecbefdee14b0600d5cfd33028f6dbc3aafc9ce4 100644 (file)
@@ -261,8 +261,13 @@ RewriteResponse ArithRewriter::preRewriteAtom(TNode atom){
   }else if(reduction.getKind() == kind::LT){
     Node geq = currNM->mkNode(kind::GEQ, reduction[0], reduction[1]);
     reduction = currNM->mkNode(kind::NOT, geq);
+  }else if( Options::rewriteArithEqualities && reduction.getKind() == kind::EQUAL){
+    Node geq = currNM->mkNode(kind::GEQ, reduction[0], reduction[1]);
+    Node leq = currNM->mkNode(kind::LEQ, reduction[0], reduction[1]);
+    reduction = currNM->mkNode(kind::AND, geq, leq);
   }
 
+
   return RewriteResponse(REWRITE_DONE, reduction);
 }
 
index 6fc71bae38f8d210c6ed4af485a19b460731ec06..94d4791662a121717f2ebbb882ecc81a7f5bb287 100644 (file)
@@ -67,6 +67,7 @@ static const string optionsDescription = "\
    --produce-models       support the get-value command\n\
    --produce-assignments  support the get-assignment command\n\
    --lazy-definition-expansion expand define-fun lazily\n\
+   --rewrite-arithmetic-equalities rewrite (= x y) to (and (<= x y) (>= x y)) in arithmetic \n\
    --incremental          enable incremental solving\n";
 
 static const string languageDescription = "\
@@ -121,7 +122,8 @@ enum OptionValue {
   LAZY_TYPE_CHECKING,
   EAGER_TYPE_CHECKING,
   INCREMENTAL,
-  PIVOT_RULE
+  PIVOT_RULE,
+  REWRITE_ARITHMETIC_EQUALITIES
 };/* enum OptionValue */
 
 /**
@@ -179,6 +181,7 @@ static struct option cmdlineOptions[] = {
   { "eager-type-checking", no_argument, NULL, EAGER_TYPE_CHECKING},
   { "incremental", no_argument, NULL, INCREMENTAL},
   { "pivot-rule" , required_argument, NULL, PIVOT_RULE  },
+  { "rewrite-arithmetic-equalities" , no_argument, NULL, REWRITE_ARITHMETIC_EQUALITIES},
   { NULL         , no_argument      , NULL, '\0'        }
 };/* if you add things to the above, please remember to update usage.h! */
 
@@ -376,6 +379,10 @@ throw(OptionException) {
       incrementalSolving = true;
       break;
 
+    case REWRITE_ARITHMETIC_EQUALITIES:
+      rewriteArithEqualities = true;
+      break;
+
     case PIVOT_RULE:
       if(!strcmp(optarg, "min")) {
         pivotRule = MINIMUM;
@@ -438,4 +445,6 @@ throw(OptionException) {
   return optind;
 }
 
+bool Options::rewriteArithEqualities = false;
+
 }/* CVC4 namespace */
index 2618f8512aef7aea9b8a66b666914f379548a152..2ddc8224fcba010fde0096ffb2c2febbf65c16ab 100644 (file)
@@ -129,6 +129,7 @@ struct CVC4_PUBLIC Options {
   /** Whether incemental solving (push/pop) */
   bool incrementalSolving;
 
+  static bool rewriteArithEqualities;
 
   typedef enum { MINIMUM, BREAK_TIES, MAXIMUM } ArithPivotRule;
   ArithPivotRule pivotRule;