mirror of
https://github.com/Z3Prover/z3
synced 2025-06-17 11:26:17 +00:00
variables of sort String should now correctly be identified as Very Relevant to the string solver
This commit is contained in:
parent
1d324877cd
commit
6dfc2dd910
1 changed files with 22 additions and 6 deletions
|
@ -212,7 +212,8 @@ bool theory_str::internalize_term(app * term) {
|
||||||
else {
|
else {
|
||||||
e = ctx.mk_enode(term, false, m.is_bool(term), true);
|
e = ctx.mk_enode(term, false, m.is_bool(term), true);
|
||||||
}
|
}
|
||||||
mk_var(e);
|
theory_var v = mk_var(e);
|
||||||
|
TRACE("t_str_detail", tout << "term " << mk_ismt2_pp(term, get_manager()) << " = v#" << v << std::endl;);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -228,9 +229,16 @@ enode* theory_str::ensure_enode(expr* e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
theory_var theory_str::mk_var(enode* n) {
|
theory_var theory_str::mk_var(enode* n) {
|
||||||
|
/*
|
||||||
if (!m_strutil.is_string(n->get_owner())) {
|
if (!m_strutil.is_string(n->get_owner())) {
|
||||||
return null_theory_var;
|
return null_theory_var;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
// TODO this may require an overhaul of m_strutil.is_string() if things suddenly start working after the following change:
|
||||||
|
ast_manager & m = get_manager();
|
||||||
|
if (!(is_sort_of(m.get_sort(n->get_owner()), m_strutil.get_fid(), STRING_SORT))) {
|
||||||
|
return null_theory_var;
|
||||||
|
}
|
||||||
if (is_attached_to_var(n)) {
|
if (is_attached_to_var(n)) {
|
||||||
return n->get_th_var(get_id());
|
return n->get_th_var(get_id());
|
||||||
}
|
}
|
||||||
|
@ -416,6 +424,8 @@ app * theory_str::mk_str_var(std::string name) {
|
||||||
ctx.internalize(a, false);
|
ctx.internalize(a, false);
|
||||||
SASSERT(ctx.get_enode(a) != NULL);
|
SASSERT(ctx.get_enode(a) != NULL);
|
||||||
SASSERT(ctx.e_internalized(a));
|
SASSERT(ctx.e_internalized(a));
|
||||||
|
// this might help??
|
||||||
|
mk_var(ctx.get_enode(a));
|
||||||
m_basicstr_axiom_todo.push_back(ctx.get_enode(a));
|
m_basicstr_axiom_todo.push_back(ctx.get_enode(a));
|
||||||
|
|
||||||
m_trail.push_back(a);
|
m_trail.push_back(a);
|
||||||
|
@ -442,6 +452,9 @@ app * theory_str::mk_nonempty_str_var() {
|
||||||
|
|
||||||
ctx.internalize(a, false);
|
ctx.internalize(a, false);
|
||||||
SASSERT(ctx.get_enode(a) != NULL);
|
SASSERT(ctx.get_enode(a) != NULL);
|
||||||
|
// this might help??
|
||||||
|
mk_var(ctx.get_enode(a));
|
||||||
|
|
||||||
// assert a variation of the basic string axioms that ensures this string is nonempty
|
// assert a variation of the basic string axioms that ensures this string is nonempty
|
||||||
{
|
{
|
||||||
// build LHS
|
// build LHS
|
||||||
|
@ -2496,11 +2509,11 @@ void theory_str::handle_equality(expr * lhs, expr * rhs) {
|
||||||
);
|
);
|
||||||
|
|
||||||
// step 1: Concat == Concat
|
// step 1: Concat == Concat
|
||||||
// I'm disabling this entire code block for now. It may no longer be useful.
|
// This code block may no longer be useful.
|
||||||
// Z3 seems to be putting LHS and RHS into the same equivalence class extremely early.
|
// Z3 seems to be putting LHS and RHS into the same equivalence class extremely early.
|
||||||
// As a result, simplify_concat_equality() is never getting called,
|
// As a result, simplify_concat_equality() is never getting called,
|
||||||
// and if it were called, it would probably get called with the same element on both sides.
|
// and if it were called, it would probably get called with the same element on both sides.
|
||||||
/*
|
|
||||||
bool hasCommon = false;
|
bool hasCommon = false;
|
||||||
if (eqc_lhs_concat.size() != 0 && eqc_rhs_concat.size() != 0) {
|
if (eqc_lhs_concat.size() != 0 && eqc_rhs_concat.size() != 0) {
|
||||||
std::set<expr*>::iterator itor1 = eqc_lhs_concat.begin();
|
std::set<expr*>::iterator itor1 = eqc_lhs_concat.begin();
|
||||||
|
@ -2521,7 +2534,7 @@ void theory_str::handle_equality(expr * lhs, expr * rhs) {
|
||||||
simplify_concat_equality(*(eqc_lhs_concat.begin()), *(eqc_rhs_concat.begin()));
|
simplify_concat_equality(*(eqc_lhs_concat.begin()), *(eqc_rhs_concat.begin()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
if (eqc_lhs_concat.size() != 0 && eqc_rhs_concat.size() != 0) {
|
if (eqc_lhs_concat.size() != 0 && eqc_rhs_concat.size() != 0) {
|
||||||
// let's pick the first concat in the LHS's eqc
|
// let's pick the first concat in the LHS's eqc
|
||||||
// and find some concat in the RHS's eqc that is
|
// and find some concat in the RHS's eqc that is
|
||||||
|
@ -2591,6 +2604,10 @@ void theory_str::set_up_axioms(expr * ex) {
|
||||||
// if ex is a variable, add it to our list of variables
|
// if ex is a variable, add it to our list of variables
|
||||||
TRACE("t_str_detail", tout << "tracking variable " << mk_ismt2_pp(ap, get_manager()) << std::endl;);
|
TRACE("t_str_detail", tout << "tracking variable " << mk_ismt2_pp(ap, get_manager()) << std::endl;);
|
||||||
variable_set.insert(ex);
|
variable_set.insert(ex);
|
||||||
|
ctx.mark_as_relevant(ex);
|
||||||
|
// this might help??
|
||||||
|
theory_var v = mk_var(n);
|
||||||
|
TRACE("t_str_detail", tout << "variable " << mk_ismt2_pp(ap, get_manager()) << " is #" << v << std::endl;);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -2637,7 +2654,7 @@ void theory_str::init_search_eh() {
|
||||||
* This is done to find equalities between terms, etc. that we otherwise
|
* This is done to find equalities between terms, etc. that we otherwise
|
||||||
* might not get a chance to see.
|
* might not get a chance to see.
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
expr_ref_vector assignments(m);
|
expr_ref_vector assignments(m);
|
||||||
ctx.get_assignments(assignments);
|
ctx.get_assignments(assignments);
|
||||||
for (expr_ref_vector::iterator i = assignments.begin(); i != assignments.end(); ++i) {
|
for (expr_ref_vector::iterator i = assignments.begin(); i != assignments.end(); ++i) {
|
||||||
|
@ -2659,7 +2676,6 @@ void theory_str::init_search_eh() {
|
||||||
<< ": expr ignored" << std::endl;);
|
<< ": expr ignored" << std::endl;);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
TRACE("t_str", tout << "search started" << std::endl;);
|
TRACE("t_str", tout << "search started" << std::endl;);
|
||||||
search_started = true;
|
search_started = true;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue