3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-20 21:03:39 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2018-12-09 12:56:21 -08:00
parent 559f57470e
commit 604e5dd0bb
3 changed files with 34 additions and 19 deletions

View file

@ -501,7 +501,7 @@ br_status seq_rewriter::mk_app_core(func_decl * f, unsigned num_args, expr * con
case _OP_STRING_STRIDOF: case _OP_STRING_STRIDOF:
UNREACHABLE(); UNREACHABLE();
} }
TRACE("seq", tout << result << "\n";); CTRACE("seq", st != BR_FAILED, tout << result << "\n";);
return st; return st;
} }

View file

@ -3767,6 +3767,8 @@ void theory_seq::finalize_model(model_generator& mg) {
} }
void theory_seq::init_model(model_generator & mg) { void theory_seq::init_model(model_generator & mg) {
enable_trace("seq");
TRACE("seq", display(tout << "level: " << get_context().get_scope_level() << "\n"););
m_rep.push_scope(); m_rep.push_scope();
m_factory = alloc(seq_factory, get_manager(), get_family_id(), mg.get_model()); m_factory = alloc(seq_factory, get_manager(), get_family_id(), mg.get_model());
mg.register_factory(m_factory); mg.register_factory(m_factory);
@ -3884,28 +3886,35 @@ public:
th.m_rewrite(result); th.m_rewrite(result);
} }
th.m_factory->add_trail(result); th.m_factory->add_trail(result);
TRACE("seq", tout << result << "\n";);
return to_app(result); return to_app(result);
} }
}; };
app* theory_seq::get_ite_value(expr* e) {
expr* e1, *e2, *e3;
while (m.is_ite(e, e1, e2, e3)) {
if (get_root(e2) == get_root(e)) {
e = e2;
}
else if (get_root(e3) == get_root(e)) {
e = e3;
}
else {
break;
}
}
return to_app(e);
}
model_value_proc * theory_seq::mk_value(enode * n, model_generator & mg) { model_value_proc * theory_seq::mk_value(enode * n, model_generator & mg) {
app* e = n->get_owner(); app* e = n->get_owner();
context& ctx = get_context(); context& ctx = get_context();
expr* e1, *e2, *e3; TRACE("seq", tout << mk_pp(n->get_owner(), m) << "\n";);
if (m.is_ite(e, e1, e2, e3) && ctx.e_internalized(e2) && ctx.e_internalized(e3) && e = get_ite_value(e);
(get_root(e2) == n->get_root() || if (m_util.is_seq(e)) {
get_root(e3) == n->get_root())) {
if (ctx.get_enode(e2)->get_root() == n->get_root()) {
return mk_value(ctx.get_enode(e2), mg);
}
else {
return mk_value(ctx.get_enode(e3), mg);
}
}
else if (m_util.is_seq(e)) {
ptr_vector<expr> concats; ptr_vector<expr> concats;
get_concat(e, concats); get_ite_concat(e, concats);
sort* srt = m.get_sort(e); sort* srt = m.get_sort(e);
seq_value_proc* sv = alloc(seq_value_proc, *this, srt); seq_value_proc* sv = alloc(seq_value_proc, *this, srt);
@ -3940,11 +3949,16 @@ model_value_proc * theory_seq::mk_value(enode * n, model_generator & mg) {
app* theory_seq::mk_value(app* e) { app* theory_seq::mk_value(app* e) {
expr_ref result(m); expr_ref result(m);
context& ctx = get_context();
e = get_ite_value(e);
result = m_rep.find(e); result = m_rep.find(e);
if (is_var(result)) { if (is_var(result)) {
SASSERT(m_factory); SASSERT(m_factory);
expr_ref val(m); expr_ref val(m);
val = m_factory->get_some_value(m.get_sort(result)); val = m_factory->get_some_value(m.get_sort(result));
std::cout << "is-var " << result << "\n";
std::cout << "val " << val << "\n";
if (val) { if (val) {
result = val; result = val;
} }
@ -5643,15 +5657,16 @@ bool theory_seq::canonizes(bool sign, expr* e) {
} }
void theory_seq::get_concat(expr* e, ptr_vector<expr>& concats) { void theory_seq::get_ite_concat(expr* e, ptr_vector<expr>& concats) {
expr* e1 = nullptr, *e2 = nullptr; expr* e1 = nullptr, *e2 = nullptr;
while (true) { while (true) {
e = m_rep.find(e); e = m_rep.find(e);
e = get_ite_value(e);
if (m_util.str.is_concat(e, e1, e2)) { if (m_util.str.is_concat(e, e1, e2)) {
get_concat(e1, concats); get_ite_concat(e1, concats);
e = e2; e = e2;
continue; continue;
} }
concats.push_back(e); concats.push_back(e);
return; return;
} }

View file

@ -404,6 +404,8 @@ namespace smt {
void init_search_eh() override; void init_search_eh() override;
void init_model(expr_ref_vector const& es); 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 len_offset(expr* e, rational val); void len_offset(expr* e, rational val);
void prop_arith_to_len_offset(); void prop_arith_to_len_offset();
@ -539,8 +541,6 @@ namespace smt {
expr_ref expand1(expr* e, dependency*& eqs); expr_ref expand1(expr* e, dependency*& eqs);
expr_ref try_expand(expr* e, dependency*& eqs); expr_ref try_expand(expr* e, dependency*& eqs);
void add_dependency(dependency*& dep, enode* a, enode* b); void add_dependency(dependency*& dep, enode* a, enode* b);
void get_concat(expr* e, ptr_vector<expr>& concats);
// terms whose meaning are encoded using axioms. // terms whose meaning are encoded using axioms.
void enque_axiom(expr* e); void enque_axiom(expr* e);