summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMorgan Deters <mdeters@cs.nyu.edu>2012-12-11 18:29:31 -0500
committerMorgan Deters <mdeters@cs.nyu.edu>2012-12-11 18:29:31 -0500
commit0e3dc441641c64e6137d85f8d7eaeb78ee562e51 (patch)
treeaa3d913f5d7a883f87509659fa219bf8ef21bc9c
parent5eaeeb2156a9d035250ed8ec5af6391995bb10f5 (diff)
SMT-LIB compliance fix to get-assignment; resolves bug 480
-rw-r--r--src/smt/smt_engine.cpp23
-rw-r--r--test/regress/regress0/Makefile.am3
-rw-r--r--test/regress/regress0/bug480.smt211
3 files changed, 28 insertions, 9 deletions
diff --git a/src/smt/smt_engine.cpp b/src/smt/smt_engine.cpp
index c82b7ca2c..77e43d518 100644
--- a/src/smt/smt_engine.cpp
+++ b/src/smt/smt_engine.cpp
@@ -631,6 +631,11 @@ void SmtEngine::finalOptionsAreSet() {
}
}
+ if(options::produceAssignments() && !options::produceModels()) {
+ Notice() << "SmtEngine: turning on produce-models to support produce-assignments" << std::endl;
+ setOption("produce-models", SExpr("true"));
+ }
+
if(! d_logic.isLocked()) {
// ensure that our heuristics are properly set up
setLogicInternal();
@@ -2705,20 +2710,22 @@ CVC4::SExpr SmtEngine::getAssignment() throw(ModalException) {
vector<SExpr> sexprs;
TypeNode boolType = d_nodeManager->booleanType();
+ TheoryModel* m = d_theoryEngine->getModel();
for(AssignmentSet::const_iterator i = d_assignments->begin(),
iend = d_assignments->end();
i != iend;
++i) {
Assert((*i).getType() == boolType);
- // Normalize
- Node n = Rewriter::rewrite(*i);
+ // Expand, then normalize
+ hash_map<Node, Node, NodeHashFunction> cache;
+ Node n = d_private->expandDefinitions(*i, cache);
+ n = Rewriter::rewrite(n);
Trace("smt") << "--- getting value of " << n << endl;
- TheoryModel* m = d_theoryEngine->getModel();
Node resultNode;
- if( m ){
- resultNode = m->getValue( n );
+ if(m != NULL) {
+ resultNode = m->getValue(n);
}
// type-check the result we got
@@ -2727,12 +2734,12 @@ CVC4::SExpr SmtEngine::getAssignment() throw(ModalException) {
vector<SExpr> v;
if((*i).getKind() == kind::APPLY) {
Assert((*i).getNumChildren() == 0);
- v.push_back((*i).getOperator().toString());
+ v.push_back(SExpr::Keyword((*i).getOperator().toString()));
} else {
Assert((*i).isVar());
- v.push_back((*i).toString());
+ v.push_back(SExpr::Keyword((*i).toString()));
}
- v.push_back(resultNode.toString());
+ v.push_back(SExpr::Keyword(resultNode.toString()));
sexprs.push_back(v);
}
return SExpr(sexprs);
diff --git a/test/regress/regress0/Makefile.am b/test/regress/regress0/Makefile.am
index 0f6c11be9..3b30a8d9e 100644
--- a/test/regress/regress0/Makefile.am
+++ b/test/regress/regress0/Makefile.am
@@ -142,7 +142,8 @@ BUG_TESTS = \
bug411.smt2 \
bug421.smt2 \
bug421b.smt2 \
- bug425.cvc
+ bug425.cvc \
+ bug480.smt2
TESTS = $(SMT_TESTS) $(SMT2_TESTS) $(CVC_TESTS) $(TPTP_TESTS) $(BUG_TESTS)
diff --git a/test/regress/regress0/bug480.smt2 b/test/regress/regress0/bug480.smt2
new file mode 100644
index 000000000..ba58f354b
--- /dev/null
+++ b/test/regress/regress0/bug480.smt2
@@ -0,0 +1,11 @@
+; EXPECT: sat
+; EXPECT: ((foo true) (bar false) (baz true))
+; EXIT: 10
+(set-logic QF_LIA)
+(set-option :produce-assignments true)
+(declare-fun x () Int)
+(declare-fun y () Int)
+(assert (! (or (! (= x (+ y 5)) :named foo) (! (= x (- y 5)) :named bar)) :named baz))
+(assert (and (> x 0) (<= y 5)))
+(check-sat)
+(get-assignment)
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback