Updated uf to reflect APPLY structure after conversation with Chris. Also corrected...
authorTim King <taking@cs.nyu.edu>
Thu, 25 Feb 2010 21:55:17 +0000 (21:55 +0000)
committerTim King <taking@cs.nyu.edu>
Thu, 25 Feb 2010 21:55:17 +0000 (21:55 +0000)
src/theory/uf/theory_uf.cpp
src/theory/uf/theory_uf.h

index 47bda5bc4289c23628678a83441798ba6e82cf98..2a5eb682e5071ed08cd388737a5680e6152369ee 100644 (file)
@@ -107,7 +107,12 @@ void TheoryUF::registerTerm(TNode n){
    * of its children.
    */
   if(n.getKind() == APPLY){
-    for(TNode::iterator cIter = n.begin(); cIter != n.end(); ++cIter){
+    TNode::iterator cIter = n.begin();
+
+    //The first element of an apply is the function symbol which should not
+    //have an associated ECData, so it needs to be skipped.
+    ++cIter;
+    for(; cIter != n.end(); ++cIter){
       TNode child = *cIter;
 
       /* Because this can be called after nodes have been merged, we need
@@ -137,6 +142,9 @@ bool TheoryUF::sameCongruenceClass(TNode x, TNode y){
 }
 
 bool TheoryUF::equiv(TNode x, TNode y){
+  Assert(x.getKind() == kind::APPLY);
+  Assert(y.getKind() == kind::APPLY);
+
   if(x.getNumChildren() != y.getNumChildren())
     return false;
 
@@ -146,6 +154,10 @@ bool TheoryUF::equiv(TNode x, TNode y){
   TNode::iterator xIter = x.begin();
   TNode::iterator yIter = y.begin();
 
+  //Skip operator of the applies
+  ++xIter;
+  ++yIter;
+
   while(xIter != x.end()){
 
     if(!sameCongruenceClass(*xIter, *yIter)){
@@ -226,9 +238,18 @@ void TheoryUF::merge(){
   }
 }
 
+Node TheoryUF::constructConflict(TNode diseq){
+  NodeBuilder<> nb(kind::AND);
+  nb << diseq;
+  for(unsigned i=0; i<d_pending.size(); ++i)
+    nb << d_pending[i];
+
+  return nb;
+}
+
 void TheoryUF::check(Effort level){
   while(!done()){
-    Node assertion;// = get();
+    Node assertion = get();
 
     switch(assertion.getKind()){
     case EQUAL:
@@ -256,7 +277,9 @@ void TheoryUF::check(Effort level){
       TNode left  = (*diseqIter)[0];
       TNode right = (*diseqIter)[1];
       if(sameCongruenceClass(left, right)){
-        d_out->conflict(*diseqIter, true);
+        Node remakeNeq = (*diseqIter).notNode();
+        Node conflict = constructConflict(remakeNeq);
+        d_out->conflict(conflict, true);
       }
     }
   }
index 4bb18bd43b06e0f83ea575999c5a03370284a393..4fc835223315a69144312d99b31b5476e2a08aab 100644 (file)
@@ -126,6 +126,9 @@ private:
   /** Performs Congruence Closure to reflect the new additions to d_pending. */
   void merge();
 
+  /** Constructs a conflict from an inconsistent disequality. */
+  Node constructConflict(TNode diseq);
+
 };