nodemanager robust skolem numbering
authorKshitij Bansal <kshitij@cs.nyu.edu>
Mon, 28 Apr 2014 22:18:07 +0000 (18:18 -0400)
committerKshitij Bansal <kshitij@cs.nyu.edu>
Mon, 28 Apr 2014 22:18:07 +0000 (18:18 -0400)
src/expr/node_manager.cpp
src/expr/node_manager.h
src/theory/sets/theory_sets_private.cpp
src/theory/sets/theory_sets_private.h

index ecd3df084804b766851fdba89ba00d5fd4c64811..4c61550b9a4e7f57e62902f14069decba99f0fdf 100644 (file)
@@ -89,7 +89,8 @@ NodeManager::NodeManager(context::Context* ctxt,
   d_exprManager(exprManager),
   d_nodeUnderDeletion(NULL),
   d_inReclaimZombies(false),
-  d_abstractValueCount(0) {
+  d_abstractValueCount(0),
+  d_skolemCounter(0) {
   init();
 }
 
@@ -103,7 +104,8 @@ NodeManager::NodeManager(context::Context* ctxt,
   d_exprManager(exprManager),
   d_nodeUnderDeletion(NULL),
   d_inReclaimZombies(false),
-  d_abstractValueCount(0) {
+  d_abstractValueCount(0),
+  d_skolemCounter(0) {
   init();
 }
 
@@ -310,7 +312,7 @@ Node NodeManager::mkSkolem(const std::string& prefix, const TypeNode& type, cons
   setAttribute(n, TypeCheckedAttr(), true);
   if((flags & SKOLEM_EXACT_NAME) == 0) {
     stringstream name;
-    name << prefix << '_' << n.getId();
+    name << prefix << '_' << ++d_skolemCounter;
     setAttribute(n, expr::VarNameAttr(), name.str());
   } else {
     setAttribute(n, expr::VarNameAttr(), prefix);
index f533d3ab9e8f6cf98e840be46bf704352182e4c9..f75ed95592a51ec4e061f3902bae545553ddf643 100644 (file)
@@ -163,6 +163,15 @@ class NodeManager {
    */
   unsigned d_abstractValueCount;
 
+  /**
+   * A counter used to produce unique skolem names.
+   *
+   * Note that it is NOT incremented when skolems are created using
+   * SKOLEM_EXACT_NAME, so it is NOT a count of the skolems produced
+   * by this node manager.
+   */
+  unsigned d_skolemCounter;
+
   /**
    * Look up a NodeValue in the pool associated to this NodeManager.
    * The NodeValue argument need not be a "completely-constructed"
@@ -425,10 +434,10 @@ public:
    * Create a skolem constant with the given name, type, and comment.
    *
    * @param prefix the name of the new skolem variable is the prefix
-   * appended with the Node ID.  This way a family of skolem variables
+   * appended with a unique ID.  This way a family of skolem variables
    * can be made with unique identifiers, used in dump, tracing, and
    * debugging output.  Use SKOLEM_EXECT_NAME flag if you don't want
-   * Node ID appended and use prefix as the name.
+   * a unique ID appended and use prefix as the name.
    *
    * @param type the type of the skolem variable to create
    *
index edb245d999a327d39ac119a53c3e79f20bcd8ae8..9d00cde7b82e115a7013764eec019c3e75097571 100644 (file)
@@ -760,12 +760,6 @@ bool TheorySetsPrivate::isComplete() {
   return d_pending.empty() && d_pendingDisequal.empty();
 }
 
-Node TheorySetsPrivate::newSkolem(TypeNode t) {
-  ostringstream oss;
-  oss << "sde_" << (++d_skolemCounter);
-  return NodeManager::currentNM()->mkSkolem(oss.str(), t, "", NodeManager::SKOLEM_EXACT_NAME);
-}
-
 Node TheorySetsPrivate::getLemma() {
   Assert(!d_pending.empty() || !d_pendingDisequal.empty());
 
@@ -786,7 +780,7 @@ Node TheorySetsPrivate::getLemma() {
     d_pendingEverInserted.insert(n);
 
     Assert(n.getKind() == kind::EQUAL && n[0].getType().isSet());
-    Node x = newSkolem( n[0].getType().getSetElementType() );
+    Node x = NodeManager::currentNM()->mkSkolem("sde_", n[0].getType().getSetElementType() );
     Node l1 = MEMBER(x, n[0]), l2 = MEMBER(x, n[1]);
 
     lemma = OR(n, AND(l1, NOT(l2)), AND(NOT(l1), l2));
@@ -812,7 +806,6 @@ TheorySetsPrivate::TheorySetsPrivate(TheorySets& external,
   d_pending(u),
   d_pendingDisequal(u),
   d_pendingEverInserted(u),
-  d_skolemCounter(0),
   d_scrutinize(NULL)
 {
   d_termInfoManager = new TermInfoManager(*this, c, &d_equalityEngine);
index 4f2c3c173ef32a69e4f4d6da12deaea76518b8e2..7e9d609053081027f8921759311aba55a4a813bc 100644 (file)
@@ -158,11 +158,9 @@ private:
   context::CDQueue <TNode> d_pending;
   context::CDQueue <TNode> d_pendingDisequal;
   context::CDHashSet <Node, NodeHashFunction> d_pendingEverInserted;
-  int d_skolemCounter;
 
   void addToPending(Node n);
   bool isComplete();
-  Node newSkolem(TypeNode);
   Node getLemma();
 
   /** model generation and helper function */