summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Noetzli <noetzli@stanford.edu>2019-05-14 12:06:41 -0700
committerAndres Noetzli <noetzli@stanford.edu>2019-05-14 13:41:46 -0700
commitb6dbe3d31271bd7aaccd3d0bb1ea748b323a715a (patch)
treed8d3bf0bbbb244ea1349f6035594afeb67fc100c
parent3b407342c06d89910e19373e3c486155464843a7 (diff)
Fix model of Boolean vars with eager bit-blaster
When bit-blasting eagerly, we were not assigning values to the Boolean variables in the `TheoryModel`. With eager bit-blasting, the BV SAT solver gets all (converted) terms, including the Boolean ones, so `EagerBitblaster::collectModelInfo()` is responsible for assigning values to Boolean variables. However, it has only been assigning values to bit-vector variables, which lead to wrong models. This commit fixes the issue by asking the `CnfStream` for the Boolean variables, querying the SAT solver for their value, and assigning them in the `TheoryModel`.
-rw-r--r--src/theory/bv/bitblast/eager_bitblaster.cpp32
-rw-r--r--test/regress/CMakeLists.txt1
-rw-r--r--test/regress/regress0/bv/bool-model.smt27
3 files changed, 40 insertions, 0 deletions
diff --git a/src/theory/bv/bitblast/eager_bitblaster.cpp b/src/theory/bv/bitblast/eager_bitblaster.cpp
index 77ff6f885..3527f3855 100644
--- a/src/theory/bv/bitblast/eager_bitblaster.cpp
+++ b/src/theory/bv/bitblast/eager_bitblaster.cpp
@@ -241,6 +241,9 @@ Node EagerBitblaster::getModelFromSatSolver(TNode a, bool fullModel) {
bool EagerBitblaster::collectModelInfo(TheoryModel* m, bool fullModel)
{
+ NodeManager* nm = NodeManager::currentNM();
+
+ // Collect the values for the bit-vector variables
TNodeSet::iterator it = d_variables.begin();
for (; it != d_variables.end(); ++it) {
TNode var = *it;
@@ -262,6 +265,35 @@ bool EagerBitblaster::collectModelInfo(TheoryModel* m, bool fullModel)
}
}
}
+
+ // Collect the values for the Boolean variables
+ std::vector<TNode> vars;
+ d_cnfStream->getBooleanVariables(vars);
+ for (TNode var : vars)
+ {
+ Node const_value;
+
+ if (d_cnfStream->hasLiteral(var))
+ {
+ prop::SatLiteral bit = d_cnfStream->getLiteral(var);
+ prop::SatValue bit_value = d_satSolver->value(bit);
+ Assert(bit_value != prop::SAT_VALUE_UNKNOWN);
+ const_value = nm->mkConst(bit_value == prop::SAT_VALUE_TRUE);
+ }
+ else
+ {
+ if (!fullModel)
+ {
+ continue;
+ }
+ const_value = nm->mkConst(false);
+ }
+
+ if (!m->assertEquality(var, const_value, true))
+ {
+ return false;
+ }
+ }
return true;
}
diff --git a/test/regress/CMakeLists.txt b/test/regress/CMakeLists.txt
index 2f39bbb59..98b12e1a6 100644
--- a/test/regress/CMakeLists.txt
+++ b/test/regress/CMakeLists.txt
@@ -161,6 +161,7 @@ set(regress_0_tests
regress0/bv/ackermann4.smt2
regress0/bv/bool-to-bv-all.smt2
regress0/bv/bool-to-bv-ite.smt2
+ regress0/bv/bool-model.smt2
regress0/bv/bug260a.smt
regress0/bv/bug260b.smt
regress0/bv/bug440.smt
diff --git a/test/regress/regress0/bv/bool-model.smt2 b/test/regress/regress0/bv/bool-model.smt2
new file mode 100644
index 000000000..30531418c
--- /dev/null
+++ b/test/regress/regress0/bv/bool-model.smt2
@@ -0,0 +1,7 @@
+; COMMAND-LINE: --bitblast=eager
+(set-info :status sat)
+(set-logic QF_BV)
+(declare-fun x () Bool)
+(declare-fun y () Bool)
+(assert (xor y x))
+(check-sat)
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback