diff options
author | Morgan Deters <mdeters@cs.nyu.edu> | 2014-11-07 16:59:09 -0500 |
---|---|---|
committer | Morgan Deters <mdeters@cs.nyu.edu> | 2014-11-07 16:59:09 -0500 |
commit | 0b1e8fb1f4676a950f017319d76019876a39cffc (patch) | |
tree | 3298dace622af0939883cae2ef6845a4f2db25fb /src | |
parent | 86e687cb9566e8623d2e842e383e3a09db609739 (diff) | |
parent | ab3850a71f83f783981e105e154a0a3fceb87b74 (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.cpp | 32 | ||||
-rw-r--r-- | src/smt/model_postprocessor.cpp | 9 |
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; |