Bug fix to CVC4::theory::arith::VarList as well as some superficial changes. test...
authorTim King <taking@cs.nyu.edu>
Thu, 16 Sep 2010 21:16:59 +0000 (21:16 +0000)
committerTim King <taking@cs.nyu.edu>
Thu, 16 Sep 2010 21:16:59 +0000 (21:16 +0000)
src/theory/arith/normal_form.cpp
src/theory/arith/normal_form.h
test/regress/regress0/arith/Makefile.am

index 18e31848bcc56174556a547d0f9cd4e87641b65a..6e476bb7fc2bf41c5cb96a2a50fb41510f285482 100644 (file)
@@ -58,23 +58,20 @@ VarList VarList::operator*(const VarList& vl) const{
   }else if(vl.empty()){
     return *this;
   }else{
-    vector<Variable> result;
-    vector<Variable> thisAsVec = this->asList();
-    vector<Variable> vlAsVec = vl.asList();
-    back_insert_iterator<vector<Variable> > bii(result);
-
-    merge(thisAsVec.begin(), thisAsVec.end(), vlAsVec.begin(), vlAsVec.end(), bii);
-
-    return VarList::mkVarList(result);
-  }
-}
-
-std::vector<Variable> VarList::asList() const {
-  vector<Variable> res;
-  for(iterator i = begin(), e = end(); i != e; ++i){
-    res.push_back(*i);
+    vector<Node> result;
+    back_insert_iterator< vector<Node> > bii(result);
+
+    Node::iterator
+      thisBegin = this->backingNode.begin(),
+      thisEnd = this->backingNode.end(),
+      v1Begin = vl.backingNode.begin(),
+      v1End = vl.backingNode.end();
+
+    merge(thisBegin, thisEnd, v1Begin, v1End, bii);
+    Assert(result.size() >= 2);
+    Node mult = NodeManager::currentNM()->mkNode(kind::MULT, result);
+    return VarList::parseVarList(mult);
   }
-  return res;
 }
 
 Monomial Monomial::mkMonomial(const Constant& c, const VarList& vl){
@@ -162,12 +159,17 @@ Polynomial Polynomial::operator*(const Monomial& mono) const{
     for(iterator i = this->begin(), end = this->end(); i != end; ++i){
       newMonos.push_back(mono * (*i));
     }
+
+    // We may need to sort newMonos.
+    // Suppose this = (+ x y), mono = x, (* x y).getId() < (* x x).getId()
+    // newMonos = <(* x x), (* x y)> after this loop.
+    // This is not sorted according to the current VarList order.
+    std::sort(newMonos.begin(), newMonos.end());
     return Polynomial::mkPolynomial(newMonos);
   }
 }
 
 Polynomial Polynomial::operator*(const Polynomial& poly) const{
-
   Polynomial res = Polynomial::mkZero();
   for(iterator i = this->begin(), end = this->end(); i != end; ++i){
     Monomial curr = *i;
index 1f7bc6be32e952956d4035e3ccd6536f4462bc54..0762868cf88156357b26d1e689fd2a0ab230d3a5 100644 (file)
@@ -43,10 +43,11 @@ namespace arith {
  *   where
  *     constant' \not\in {0,1}
 
- * polynomial := monomial | (+ [monomial])
+ * polynomial := monomial' | (+ [monomial])
  *   where
  *     len [monomial] >= 2
  *     isStrictlySorted monoOrder [monomial]
+ *     forall (\x -> x != 0) [monomial]
 
  * restricted_cmp := (|><| polynomial constant)
  *   where
@@ -335,8 +336,6 @@ public:
 
   bool operator==(const VarList& vl) const{ return cmp(vl) == 0; }
 
-  std::vector<Variable> asList() const;
-
 private:
   bool isSorted(iterator start, iterator end);
 };
index e4fc110b4f167d0cfcada4f8830bf6b55506b89a..18ca5fe860abb2ef66352e520be2f46b95a319a3 100644 (file)
@@ -5,7 +5,8 @@ TESTS_ENVIRONMENT = @srcdir@/../../run_regression @top_builddir@/src/main/cvc4
 # put it below in "TESTS +="
 TESTS =        \
        arith.01.cvc \
-       arith.02.cvc 
+       arith.02.cvc \
+       arith.03.cvc
 
 EXTRA_DIST = $(TESTS)