summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMorgan Deters <mdeters@cs.nyu.edu>2014-11-07 16:59:09 -0500
committerMorgan Deters <mdeters@cs.nyu.edu>2014-11-07 16:59:09 -0500
commit0b1e8fb1f4676a950f017319d76019876a39cffc (patch)
tree3298dace622af0939883cae2ef6845a4f2db25fb /src
parent86e687cb9566e8623d2e842e383e3a09db609739 (diff)
parentab3850a71f83f783981e105e154a0a3fceb87b74 (diff)
Merge branch '1.4.x'
Conflicts: src/smt/model_postprocessor.cpp test/regress/regress0/Makefile.am
Diffstat (limited to 'src')
-rw-r--r--src/smt/boolean_terms.cpp32
-rw-r--r--src/smt/model_postprocessor.cpp9
2 files changed, 41 insertions, 0 deletions
diff --git a/src/smt/boolean_terms.cpp b/src/smt/boolean_terms.cpp
index 29caa92b3..ba3845d7a 100644
--- a/src/smt/boolean_terms.cpp
+++ b/src/smt/boolean_terms.cpp
@@ -132,6 +132,38 @@ Node BooleanTermConverter::rewriteAs(TNode in, TypeNode as) throw() {
if(as.isBoolean() && in.getType().isBitVector() && in.getType().getBitVectorSize() == 1) {
return NodeManager::currentNM()->mkNode(kind::EQUAL, NodeManager::currentNM()->mkConst(BitVector(1u, 1u)), in);
}
+ if(in.getType().isRecord()) {
+ Assert(as.isRecord());
+ const Record& inRec = in.getType().getConst<Record>();
+ const Record& asRec = as.getConst<Record>();
+ Assert(inRec.getNumFields() == asRec.getNumFields());
+ NodeBuilder<> nb(kind::RECORD);
+ nb << NodeManager::currentNM()->mkConst(asRec);
+ for(size_t i = 0; i < asRec.getNumFields(); ++i) {
+ Assert(inRec[i].first == asRec[i].first);
+ Node arg = NodeManager::currentNM()->mkNode(NodeManager::currentNM()->mkConst(RecordSelect(inRec[i].first)), in);
+ if(inRec[i].second != asRec[i].second) {
+ arg = rewriteAs(arg, TypeNode::fromType(asRec[i].second));
+ }
+ nb << arg;
+ }
+ Node out = nb;
+ return out;
+ }
+ if(in.getType().isTuple()) {
+ Assert(as.isTuple());
+ Assert(in.getType().getNumChildren() == as.getNumChildren());
+ NodeBuilder<> nb(kind::TUPLE);
+ for(size_t i = 0; i < as.getNumChildren(); ++i) {
+ Node arg = NodeManager::currentNM()->mkNode(NodeManager::currentNM()->mkConst(TupleSelect(i)), in);
+ if(in.getType()[i] != as[i]) {
+ arg = rewriteAs(arg, as[i]);
+ }
+ nb << arg;
+ }
+ Node out = nb;
+ return out;
+ }
if(in.getType().isDatatype()) {
if(as.isBoolean() && in.getType().hasAttribute(BooleanTermAttr())) {
return NodeManager::currentNM()->mkNode(kind::EQUAL, d_ttDt, in);
diff --git a/src/smt/model_postprocessor.cpp b/src/smt/model_postprocessor.cpp
index db0ce3487..44b56fdd4 100644
--- a/src/smt/model_postprocessor.cpp
+++ b/src/smt/model_postprocessor.cpp
@@ -27,6 +27,15 @@ Node ModelPostprocessor::rewriteAs(TNode n, TypeNode asType) {
// good to go, we have the right type
return n;
}
+ if(n.getKind() == kind::LAMBDA) {
+ Assert(asType.isFunction());
+ Node rhs = rewriteAs(n[1], asType[1]);
+ Node out = NodeManager::currentNM()->mkNode(kind::LAMBDA, n[0], rhs);
+ Debug("boolean-terms") << "rewrote " << n << " as " << out << std::endl;
+ Debug("boolean-terms") << "need type " << asType << endl;
+ // Assert(out.getType() == asType);
+ return out;
+ }
if(!n.isConst()) {
// we don't handle non-const right now
return n;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback