mirror of
https://github.com/Z3Prover/z3
synced 2025-05-11 09:44:43 +00:00
z3str3: add smt.str.fixed_length_naive_cex option for naive length-based counterexamples
This commit is contained in:
parent
c1e7d7788e
commit
cf3f271f5b
4 changed files with 39 additions and 21 deletions
|
@ -875,29 +875,36 @@ namespace smt {
|
|||
|
||||
return l_true;
|
||||
} else if (subproblem_status == l_false) {
|
||||
// TODO replace this with something simpler for now
|
||||
NOT_IMPLEMENTED_YET();
|
||||
TRACE("str_fl", tout << "subsolver found UNSAT; reconstructing unsat core" << std::endl;);
|
||||
TRACE("str_fl", tout << "unsat core has size " << subsolver.get_unsat_core_size() << std::endl;);
|
||||
bool negate_pre = false;
|
||||
for (unsigned i = 0; i < subsolver.get_unsat_core_size(); ++i) {
|
||||
TRACE("str", tout << "entry " << i << " = " << mk_pp(subsolver.get_unsat_core_expr(i), m) << std::endl;);
|
||||
rational index;
|
||||
expr* lhs;
|
||||
expr* rhs;
|
||||
std::tie(index, lhs, rhs) = fixed_length_lesson.find(subsolver.get_unsat_core_expr(i));
|
||||
TRACE("str_fl", tout << "lesson: " << mk_pp(lhs, m) << " == " << mk_pp(rhs, m) << " at index " << index << std::endl;);
|
||||
cex.push_back(refine(lhs, rhs, index));
|
||||
if (index < rational(0)) {
|
||||
negate_pre = true;
|
||||
if (m_params.m_FixedLengthNaiveCounterexamples) {
|
||||
TRACE("str_fl", tout << "subsolver found UNSAT; constructing length counterexample" << std::endl;);
|
||||
for (auto e : fixed_length_used_len_terms) {
|
||||
expr * var = &e.get_key();
|
||||
cex.push_back(m.mk_eq(u.str.mk_length(var), mk_int(e.get_value())));
|
||||
}
|
||||
}
|
||||
if (negate_pre){
|
||||
for (auto ex : precondition) {
|
||||
cex.push_back(ex);
|
||||
return l_false;
|
||||
} else {
|
||||
TRACE("str_fl", tout << "subsolver found UNSAT; reconstructing unsat core" << std::endl;);
|
||||
TRACE("str_fl", tout << "unsat core has size " << subsolver.get_unsat_core_size() << std::endl;);
|
||||
bool negate_pre = false;
|
||||
for (unsigned i = 0; i < subsolver.get_unsat_core_size(); ++i) {
|
||||
TRACE("str", tout << "entry " << i << " = " << mk_pp(subsolver.get_unsat_core_expr(i), m) << std::endl;);
|
||||
rational index;
|
||||
expr* lhs;
|
||||
expr* rhs;
|
||||
std::tie(index, lhs, rhs) = fixed_length_lesson.find(subsolver.get_unsat_core_expr(i));
|
||||
TRACE("str_fl", tout << "lesson: " << mk_pp(lhs, m) << " == " << mk_pp(rhs, m) << " at index " << index << std::endl;);
|
||||
cex.push_back(refine(lhs, rhs, index));
|
||||
if (index < rational(0)) {
|
||||
negate_pre = true;
|
||||
}
|
||||
}
|
||||
if (negate_pre){
|
||||
for (auto ex : precondition) {
|
||||
cex.push_back(ex);
|
||||
}
|
||||
}
|
||||
return l_false;
|
||||
}
|
||||
return l_false;
|
||||
} else { // l_undef
|
||||
TRACE("str_fl", tout << "WARNING: subsolver found UNKNOWN" << std::endl;);
|
||||
return l_undef;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue