mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 09:05:31 +00:00
some adjustments for stack use on large strings
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
e8cfbb41d3
commit
ab5905cf7f
4 changed files with 47 additions and 25 deletions
|
@ -4275,13 +4275,17 @@ model_value_proc * theory_seq::mk_value(enode * n, model_generator & mg) {
|
|||
TRACE("seq", tout << mk_pp(n->get_owner(), m) << "\n";);
|
||||
e = get_ite_value(e);
|
||||
if (m_util.is_seq(e)) {
|
||||
ptr_vector<expr> concats;
|
||||
get_ite_concat(e, concats);
|
||||
unsigned start = m_concat.size();
|
||||
SASSERT(m_todo.empty());
|
||||
m_todo.push_back(e);
|
||||
get_ite_concat(m_concat, m_todo);
|
||||
sort* srt = m.get_sort(e);
|
||||
seq_value_proc* sv = alloc(seq_value_proc, *this, srt);
|
||||
|
||||
unsigned end = m_concat.size();
|
||||
TRACE("seq", tout << mk_pp(e, m) << "\n";);
|
||||
for (expr* c : concats) {
|
||||
for (unsigned i = start; i < end; ++i) {
|
||||
expr* c = m_concat[i];
|
||||
expr *c1;
|
||||
TRACE("seq", tout << mk_pp(c, m) << "\n";);
|
||||
if (m_util.str.is_unit(c, c1)) {
|
||||
|
@ -4301,6 +4305,7 @@ model_value_proc * theory_seq::mk_value(enode * n, model_generator & mg) {
|
|||
sv->add_string(mk_value(to_app(c)));
|
||||
}
|
||||
}
|
||||
m_concat.shrink(start);
|
||||
return sv;
|
||||
}
|
||||
else {
|
||||
|
@ -4308,7 +4313,6 @@ model_value_proc * theory_seq::mk_value(enode * n, model_generator & mg) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
app* theory_seq::mk_value(app* e) {
|
||||
expr_ref result(m);
|
||||
e = get_ite_value(e);
|
||||
|
@ -6407,17 +6411,18 @@ bool theory_seq::canonizes(bool sign, expr* e) {
|
|||
}
|
||||
|
||||
|
||||
void theory_seq::get_ite_concat(expr* e, ptr_vector<expr>& concats) {
|
||||
void theory_seq::get_ite_concat(ptr_vector<expr>& concats, ptr_vector<expr>& todo) {
|
||||
expr* e1 = nullptr, *e2 = nullptr;
|
||||
while (true) {
|
||||
while (!todo.empty()) {
|
||||
expr* e = todo.back();
|
||||
todo.pop_back();
|
||||
e = m_rep.find(e);
|
||||
e = get_ite_value(e);
|
||||
if (m_util.str.is_concat(e, e1, e2)) {
|
||||
get_ite_concat(e1, concats);
|
||||
e = e2;
|
||||
continue;
|
||||
todo.push_back(e2, e1);
|
||||
}
|
||||
concats.push_back(e);
|
||||
return;
|
||||
else {
|
||||
concats.push_back(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -383,7 +383,7 @@ namespace smt {
|
|||
symbol m_prefix, m_suffix, m_accept, m_reject;
|
||||
symbol m_tail, m_seq_first, m_seq_last, m_indexof_left, m_indexof_right, m_aut_step;
|
||||
symbol m_pre, m_post, m_eq, m_seq_align;
|
||||
ptr_vector<expr> m_todo;
|
||||
ptr_vector<expr> m_todo, m_concat;
|
||||
unsigned m_internalize_depth;
|
||||
expr_ref_vector m_ls, m_rs, m_lhs, m_rhs;
|
||||
|
||||
|
@ -432,7 +432,7 @@ namespace smt {
|
|||
|
||||
void init_model(expr_ref_vector const& es);
|
||||
app* get_ite_value(expr* a);
|
||||
void get_ite_concat(expr* e, ptr_vector<expr>& concats);
|
||||
void get_ite_concat(ptr_vector<expr>& head, ptr_vector<expr>& tail);
|
||||
|
||||
void len_offset(expr* e, rational val);
|
||||
void prop_arith_to_len_offset();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue