summaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorMorgan Deters <mdeters@gmail.com>2012-08-24 23:23:34 +0000
committerMorgan Deters <mdeters@gmail.com>2012-08-24 23:23:34 +0000
commit80afd586eb0865efcc38aa14833d682f1b7cc27f (patch)
treeaac37b28e0330bf3b72083e979ae94ee71918771 /src/util
parent3619c784bd5dd4b91ab0a2ad429ea145636d3424 (diff)
* disallow internal uses of mkVar() (you have to mkSkolem())
* add support for mkBoundVar() (BOUND_VAR_LISTs in quantifiers must be bound vars)
Diffstat (limited to 'src/util')
-rw-r--r--src/util/datatype.cpp33
-rw-r--r--src/util/datatype.h5
-rw-r--r--src/util/ite_removal.cpp2
3 files changed, 27 insertions, 13 deletions
diff --git a/src/util/datatype.cpp b/src/util/datatype.cpp
index 86a43c878..bdefe6755 100644
--- a/src/util/datatype.cpp
+++ b/src/util/datatype.cpp
@@ -392,6 +392,12 @@ void DatatypeConstructor::resolve(ExprManager* em, DatatypeType self,
"cannot resolve a Datatype constructor twice; "
"perhaps the same constructor was added twice, "
"or to two datatypes?");
+
+ // we're using some internals, so we have to set up this library context
+ ExprManagerScope ems(*em);
+
+ NodeManager* nm = NodeManager::fromExprManager(em);
+ TypeNode selfTypeNode = TypeNode::fromType(self);
size_t index = 0;
for(iterator i = begin(), i_end = end(); i != i_end; ++i) {
if((*i).d_selector.isNull()) {
@@ -399,7 +405,7 @@ void DatatypeConstructor::resolve(ExprManager* em, DatatypeType self,
string typeName = (*i).d_name.substr((*i).d_name.find('\0') + 1);
(*i).d_name.resize((*i).d_name.find('\0'));
if(typeName == "") {
- (*i).d_selector = em->mkVar((*i).d_name, em->mkSelectorType(self, self));
+ (*i).d_selector = nm->mkSkolem((*i).d_name, nm->mkSelectorType(selfTypeNode, selfTypeNode)).toExpr();
} else {
map<string, DatatypeType>::const_iterator j = resolutions.find(typeName);
if(j == resolutions.end()) {
@@ -409,7 +415,7 @@ void DatatypeConstructor::resolve(ExprManager* em, DatatypeType self,
<< "of constructor \"" << d_name << "\"";
throw DatatypeResolutionException(msg.str());
} else {
- (*i).d_selector = em->mkVar((*i).d_name, em->mkSelectorType(self, (*j).second));
+ (*i).d_selector = nm->mkSkolem((*i).d_name, nm->mkSelectorType(selfTypeNode, TypeNode::fromType((*j).second))).toExpr();
}
}
} else {
@@ -422,7 +428,7 @@ void DatatypeConstructor::resolve(ExprManager* em, DatatypeType self,
if(!paramTypes.empty() ) {
range = doParametricSubstitution( range, paramTypes, paramReplacements );
}
- (*i).d_selector = em->mkVar((*i).d_name, em->mkSelectorType(self, range));
+ (*i).d_selector = nm->mkSkolem((*i).d_name, nm->mkSelectorType(selfTypeNode, TypeNode::fromType(range))).toExpr();
}
Node::fromExpr((*i).d_selector).setAttribute(DatatypeIndexAttr(), index++);
(*i).d_resolved = true;
@@ -435,9 +441,8 @@ void DatatypeConstructor::resolve(ExprManager* em, DatatypeType self,
// fails above, we want Constuctor::isResolved() to remain "false".
// Further, mkConstructorType() iterates over the selectors, so
// should get the results of any resolutions we did above.
- d_tester = em->mkVar(d_name.substr(d_name.find('\0') + 1), em->mkTesterType(self));
- d_name.resize(d_name.find('\0'));
- d_constructor = em->mkVar(d_name, em->mkConstructorType(*this, self));
+ d_tester = nm->mkSkolem(getTesterName(), nm->mkTesterType(selfTypeNode)).toExpr();
+ d_constructor = nm->mkSkolem(getName(), nm->mkConstructorType(*this, selfTypeNode)).toExpr();
// associate constructor with all selectors
for(iterator i = begin(), i_end = end(); i != i_end; ++i) {
(*i).d_constructor = d_constructor;
@@ -503,7 +508,11 @@ void DatatypeConstructor::addArg(std::string selectorName, Type selectorType) {
// create the proper selector type)
CheckArgument(!isResolved(), this, "cannot modify a finalized Datatype constructor");
CheckArgument(!selectorType.isNull(), selectorType, "cannot add a null selector type");
- Expr type = selectorType.getExprManager()->mkVar(selectorType);
+
+ // we're using some internals, so we have to set up this library context
+ ExprManagerScope ems(selectorType);
+
+ Expr type = NodeManager::currentNM()->mkSkolem(TypeNode::fromType(selectorType)).toExpr();
Debug("datatypes") << type << endl;
d_args.push_back(DatatypeConstructorArg(selectorName, type));
}
@@ -529,11 +538,11 @@ void DatatypeConstructor::addArg(std::string selectorName, DatatypeSelfType) {
}
std::string DatatypeConstructor::getName() const throw() {
- string name = d_name;
- if(!isResolved()) {
- name.resize(name.find('\0'));
- }
- return name;
+ return d_name.substr(0, d_name.find('\0'));
+}
+
+std::string DatatypeConstructor::getTesterName() const throw() {
+ return d_name.substr(d_name.find('\0') + 1);
}
Expr DatatypeConstructor::getConstructor() const {
diff --git a/src/util/datatype.h b/src/util/datatype.h
index c7631ae7b..60d2c7acd 100644
--- a/src/util/datatype.h
+++ b/src/util/datatype.h
@@ -233,6 +233,11 @@ public:
Expr getTester() const;
/**
+ * Get the tester name for this Datatype constructor.
+ */
+ std::string getTesterName() const throw();
+
+ /**
* Get the number of arguments (so far) of this Datatype constructor.
*/
inline size_t getNumArgs() const throw();
diff --git a/src/util/ite_removal.cpp b/src/util/ite_removal.cpp
index 9a4fc8dc2..50713e2b4 100644
--- a/src/util/ite_removal.cpp
+++ b/src/util/ite_removal.cpp
@@ -55,7 +55,7 @@ Node RemoveITE::run(TNode node, std::vector<Node>& output,
TypeNode nodeType = node.getType();
if(!nodeType.isBoolean()) {
// Make the skolem to represent the ITE
- Node skolem = nodeManager->mkVar(nodeType);
+ Node skolem = nodeManager->mkSkolem(nodeType);
Dump.declareVar(skolem.toExpr(), "a variable introduced due to term-level ITE removal");
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback