d_exprManager(exprManager),
d_nodeUnderDeletion(NULL),
d_inReclaimZombies(false),
- d_abstractValueCount(0) {
+ d_abstractValueCount(0),
+ d_skolemCounter(0) {
init();
}
d_exprManager(exprManager),
d_nodeUnderDeletion(NULL),
d_inReclaimZombies(false),
- d_abstractValueCount(0) {
+ d_abstractValueCount(0),
+ d_skolemCounter(0) {
init();
}
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);
*/
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"
* 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
*
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());
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));
d_pending(u),
d_pendingDisequal(u),
d_pendingEverInserted(u),
- d_skolemCounter(0),
d_scrutinize(NULL)
{
d_termInfoManager = new TermInfoManager(*this, c, &d_equalityEngine);
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 */