mirror of
https://github.com/Z3Prover/z3
synced 2025-04-22 16:45:31 +00:00
fix gen_assign_unroll_reg so that it does not assert a contradiction
This commit is contained in:
parent
a2d6149df5
commit
b53da182b6
2 changed files with 9 additions and 22 deletions
|
@ -461,7 +461,9 @@ app * theory_str::mk_unroll_bound_var() {
|
|||
}
|
||||
|
||||
app * theory_str::mk_unroll_test_var() {
|
||||
return mk_str_var("unrollTest"); // was uRt
|
||||
app * v = mk_str_var("unrollTest"); // was uRt
|
||||
internal_unrollTest_vars.insert(v);
|
||||
return v;
|
||||
}
|
||||
|
||||
app * theory_str::mk_str_var(std::string name) {
|
||||
|
@ -4159,6 +4161,8 @@ bool theory_str::free_var_attempt(expr * nn1, expr * nn2) {
|
|||
more_value_tests(nn1, nn2_str);
|
||||
}
|
||||
return true;
|
||||
} else if (internal_unrollTest_vars.contains(nn1)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
@ -4366,26 +4370,7 @@ void theory_str::handle_equality(expr * lhs, expr * rhs) {
|
|||
}
|
||||
|
||||
// regex unroll
|
||||
/*
|
||||
Z3_ast nn1EqConst = NULL;
|
||||
std::set<Z3_ast> nn1EqUnrollFuncs;
|
||||
get_eqc_allUnroll(t, nn1, nn1EqConst, nn1EqUnrollFuncs);
|
||||
Z3_ast nn2EqConst = NULL;
|
||||
std::set<Z3_ast> nn2EqUnrollFuncs;
|
||||
get_eqc_allUnroll(t, nn2, nn2EqConst, nn2EqUnrollFuncs);
|
||||
|
||||
if (nn2EqConst != NULL) {
|
||||
for (std::set<Z3_ast>::iterator itor1 = nn1EqUnrollFuncs.begin(); itor1 != nn1EqUnrollFuncs.end(); itor1++) {
|
||||
processUnrollEqConstStr(t, *itor1, nn2EqConst);
|
||||
}
|
||||
}
|
||||
|
||||
if (nn1EqConst != NULL) {
|
||||
for (std::set<Z3_ast>::iterator itor2 = nn2EqUnrollFuncs.begin(); itor2 != nn2EqUnrollFuncs.end(); itor2++) {
|
||||
processUnrollEqConstStr(t, *itor2, nn1EqConst);
|
||||
}
|
||||
}
|
||||
*/
|
||||
expr * nn1EqConst = NULL;
|
||||
std::set<expr*> nn1EqUnrollFuncs;
|
||||
get_eqc_allUnroll(lhs, nn1EqConst, nn1EqUnrollFuncs);
|
||||
|
@ -6157,8 +6142,9 @@ void theory_str::gen_assign_unroll_reg(std::set<expr*> & unrolls) {
|
|||
// unroll(r1, t1) = newVar1 . newVar2
|
||||
items.push_back(ctx.mk_eq_atom(unrFunc, concatAst));
|
||||
items.push_back(ctx.mk_eq_atom(mk_strlen(unrFunc), m_autil.mk_add(mk_strlen(newVar1), mk_strlen(newVar2))));
|
||||
items.push_back(ctx.mk_eq_atom(mk_strlen(unrFunc), mk_strlen(newVar1)));
|
||||
items.push_back(ctx.mk_eq_atom(mk_strlen(unrFunc), mk_strlen(newVar2)));
|
||||
// mk_strlen(unrFunc) >= mk_strlen(newVar{1,2})
|
||||
items.push_back(m_autil.mk_ge(m_autil.mk_add(mk_strlen(unrFunc), m_autil.mk_mul(mk_int(-1), mk_strlen(newVar1))), mk_int(0)));
|
||||
items.push_back(m_autil.mk_ge(m_autil.mk_add(mk_strlen(unrFunc), m_autil.mk_mul(mk_int(-1), mk_strlen(newVar2))), mk_int(0)));
|
||||
// newVar1 \in r1
|
||||
reduce_virtual_regex_in(newVar1, regexInUnr, items);
|
||||
items.push_back(ctx.mk_eq_atom(cntInUnr, m_autil.mk_add(newCnt, mk_int(1))));
|
||||
|
|
|
@ -146,6 +146,7 @@ namespace smt {
|
|||
|
||||
obj_hashtable<expr> internal_lenTest_vars;
|
||||
obj_hashtable<expr> internal_valTest_vars;
|
||||
obj_hashtable<expr> internal_unrollTest_vars;
|
||||
|
||||
std::set<expr*> input_var_in_len;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue