Skip to content

Commit

Permalink
fix negative contains bug (#6312)
Browse files Browse the repository at this point in the history
  • Loading branch information
JohnLyu2 committed Sep 2, 2022
1 parent e4ef171 commit 9dca8d1
Showing 1 changed file with 13 additions and 6 deletions.
19 changes: 13 additions & 6 deletions src/smt/theory_str.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8436,6 +8436,14 @@ namespace smt {
}
}

bool existNegativeContains = false;
expr_ref_vector assignments(m);
ctx.get_assignments(assignments);
for (expr * a : assignments) {
expr * subterm;
if (m.is_not(a, subterm) && u.str.is_contains(subterm)) existNegativeContains = true;
}

if (!needToAssignFreeVars) {

// check string-int terms
Expand Down Expand Up @@ -8506,9 +8514,11 @@ namespace smt {
// we're not done if some variable in a regex membership predicate was unassigned
if (regexOK) {
if (unused_internal_variables.empty()) {
TRACE("str", tout << "All variables are assigned. Done!" << std::endl;);
m_stats.m_solved_by = 2;
return FC_DONE;
if (!existNegativeContains) {
TRACE("str", tout << "All variables are assigned. Done!" << std::endl;);
m_stats.m_solved_by = 2;
return FC_DONE;
}
} else {
TRACE("str", tout << "Assigning decoy values to free internal variables." << std::endl;);
for (auto const &var : unused_internal_variables) {
Expand Down Expand Up @@ -8561,9 +8571,6 @@ namespace smt {
}
TRACE("str", tout << "arithmetic solver done in final check" << std::endl;);

expr_ref_vector assignments(m);
ctx.get_assignments(assignments);

expr_ref_vector precondition(m);
expr_ref_vector cex(m);
lbool model_status = fixed_length_model_construction(assignments, precondition, free_variables, candidate_model, cex);
Expand Down

0 comments on commit 9dca8d1

Please sign in to comment.