summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>2021-03-08 14:11:24 -0600
committerGitHub <noreply@github.com>2021-03-08 14:11:24 -0600
commit4e2afa2282965f3f54033d43cd990cc0b0a8b200 (patch)
tree6fc4b0f3f345b519dcfb1bcc5b1b37edeb1b3b93
parentbcbf146f0786035b0228eb4bcd13eb2bc6ca5f9b (diff)
Fix handling of negation of Boolean bound variables in FMF (#6066)
Fixes #5922. We were not correctly handling when a Boolean bound variable was negated.
-rw-r--r--src/theory/quantifiers/fmf/full_model_check.cpp11
-rw-r--r--test/regress/CMakeLists.txt1
-rw-r--r--test/regress/regress0/fmf/issue5922-fmf-not-x.smt28
3 files changed, 18 insertions, 2 deletions
diff --git a/src/theory/quantifiers/fmf/full_model_check.cpp b/src/theory/quantifiers/fmf/full_model_check.cpp
index 053174d07..3a444df93 100644
--- a/src/theory/quantifiers/fmf/full_model_check.cpp
+++ b/src/theory/quantifiers/fmf/full_model_check.cpp
@@ -982,8 +982,15 @@ void FullModelChecker::doCheck(FirstOrderModelFmc * fm, Node f, Def & d, Node n
void FullModelChecker::doNegate( Def & dc ) {
for (unsigned i=0; i<dc.d_cond.size(); i++) {
- if (!dc.d_value[i].isNull()) {
- dc.d_value[i] = dc.d_value[i]==d_true ? d_false : ( dc.d_value[i]==d_false ? d_true : dc.d_value[i] );
+ Node v = dc.d_value[i];
+ if (!v.isNull())
+ {
+ // In the case that the value is not-constant, we cannot reason about
+ // its value (since the range of this must be a constant or variable).
+ // In particular, returning null here is important if we have (not x)
+ // where x is a bound variable.
+ dc.d_value[i] =
+ v == d_true ? d_false : (v == d_false ? d_true : Node::null());
}
}
}
diff --git a/test/regress/CMakeLists.txt b/test/regress/CMakeLists.txt
index 140978d3d..a29c7a9a4 100644
--- a/test/regress/CMakeLists.txt
+++ b/test/regress/CMakeLists.txt
@@ -555,6 +555,7 @@ set(regress_0_tests
regress0/fmf/issue4850-force-card.smt2
regress0/fmf/issue4872-qf_ufc.smt2
regress0/fmf/issue5239-uf-ss-tot.smt2
+ regress0/fmf/issue5922-fmf-not-x.smt2
regress0/fmf/krs-sat.smt2
regress0/fmf/no-minimal-sat.smt2
regress0/fmf/QEpres-uf.855035.smtv1.smt2
diff --git a/test/regress/regress0/fmf/issue5922-fmf-not-x.smt2 b/test/regress/regress0/fmf/issue5922-fmf-not-x.smt2
new file mode 100644
index 000000000..085f58a26
--- /dev/null
+++ b/test/regress/regress0/fmf/issue5922-fmf-not-x.smt2
@@ -0,0 +1,8 @@
+; COMMAND-LINE: --finite-model-find
+; EXPECT: unsat
+(set-logic ALL)
+(set-info :status unsat)
+(declare-fun f (Bool) Bool)
+(assert (forall ((x Bool)) (f (not x))))
+(assert (=> (f true) false))
+(check-sat)
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback