mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 12:08:18 +00:00
parent
b1cdb3e451
commit
78a1f53ac9
|
@ -80,14 +80,29 @@ namespace smt {
|
||||||
}
|
}
|
||||||
|
|
||||||
expr * model_checker::get_type_compatible_term(expr * val) {
|
expr * model_checker::get_type_compatible_term(expr * val) {
|
||||||
for (expr* f : m_fresh_exprs) {
|
app* fresh_term;
|
||||||
if (m.get_sort(f) == m.get_sort(val)) {
|
if (is_app(val) && to_app(val)->get_num_args() > 0) {
|
||||||
return f;
|
ptr_buffer<expr> args;
|
||||||
|
for (expr* arg : *to_app(val)) {
|
||||||
|
args.push_back(get_type_compatible_term(arg));
|
||||||
}
|
}
|
||||||
|
fresh_term = m.mk_app(to_app(val)->get_decl(), args.size(), args.c_ptr());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
expr * sk_term = get_term_from_ctx(val);
|
||||||
|
if (sk_term != nullptr) {
|
||||||
|
return sk_term;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (expr* f : m_fresh_exprs) {
|
||||||
|
if (m.get_sort(f) == m.get_sort(val)) {
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fresh_term = m.mk_fresh_const("sk", m.get_sort(val));
|
||||||
}
|
}
|
||||||
app* fresh_term = m.mk_fresh_const("sk", m.get_sort(val));
|
|
||||||
m_context->ensure_internalized(fresh_term);
|
|
||||||
m_fresh_exprs.push_back(fresh_term);
|
m_fresh_exprs.push_back(fresh_term);
|
||||||
|
m_context->ensure_internalized(fresh_term);
|
||||||
return fresh_term;
|
return fresh_term;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,7 +294,6 @@ namespace smt {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool model_checker::add_blocking_clause(model * cex, expr_ref_vector & sks) {
|
bool model_checker::add_blocking_clause(model * cex, expr_ref_vector & sks) {
|
||||||
SASSERT(cex != nullptr);
|
SASSERT(cex != nullptr);
|
||||||
expr_ref_buffer diseqs(m);
|
expr_ref_buffer diseqs(m);
|
||||||
|
@ -287,6 +301,7 @@ namespace smt {
|
||||||
func_decl * sk_d = to_app(sk)->get_decl();
|
func_decl * sk_d = to_app(sk)->get_decl();
|
||||||
expr_ref sk_value(cex->get_some_const_interp(sk_d), m);
|
expr_ref sk_value(cex->get_some_const_interp(sk_d), m);
|
||||||
if (!sk_value) {
|
if (!sk_value) {
|
||||||
|
TRACE("model_checker", tout << "no constant interpretation for " << mk_pp(sk, m) << "\n";);
|
||||||
return false; // get_some_value failed... aborting add_blocking_clause
|
return false; // get_some_value failed... aborting add_blocking_clause
|
||||||
}
|
}
|
||||||
diseqs.push_back(m.mk_not(m.mk_eq(sk, sk_value)));
|
diseqs.push_back(m.mk_not(m.mk_eq(sk, sk_value)));
|
||||||
|
|
|
@ -390,7 +390,7 @@ final_check_status theory_seq::final_check_eh() {
|
||||||
}
|
}
|
||||||
if (branch_unit_variable()) {
|
if (branch_unit_variable()) {
|
||||||
++m_stats.m_branch_variable;
|
++m_stats.m_branch_variable;
|
||||||
TRACEFIN("ranch_unit_variable");
|
TRACEFIN("branch_unit_variable");
|
||||||
return FC_CONTINUE;
|
return FC_CONTINUE;
|
||||||
}
|
}
|
||||||
if (branch_binary_variable()) {
|
if (branch_binary_variable()) {
|
||||||
|
@ -3321,7 +3321,7 @@ bool theory_seq::solve_nc(unsigned idx) {
|
||||||
expr_ref c = canonize(n.contains(), deps);
|
expr_ref c = canonize(n.contains(), deps);
|
||||||
expr* a = nullptr, *b = nullptr;
|
expr* a = nullptr, *b = nullptr;
|
||||||
|
|
||||||
CTRACE("seq", c != n.contains(), tout << n.contains() << " =>\n" << c << "\n";);
|
CTRACE("seq", c != n.contains(), tout << n.contains() << " =>\n" << c << "\n";);
|
||||||
|
|
||||||
|
|
||||||
if (m.is_true(c)) {
|
if (m.is_true(c)) {
|
||||||
|
|
|
@ -1045,6 +1045,17 @@ namespace smtfd {
|
||||||
expr* abs(expr* e) { return m_context.get_abs().abs(e); }
|
expr* abs(expr* e) { return m_context.get_abs().abs(e); }
|
||||||
expr_ref eval_abs(expr* t) { return (*m_model)(abs(t)); }
|
expr_ref eval_abs(expr* t) { return (*m_model)(abs(t)); }
|
||||||
|
|
||||||
|
|
||||||
|
void restrict_to_universe(expr * sk, ptr_vector<expr> const & universe) {
|
||||||
|
SASSERT(!universe.empty());
|
||||||
|
expr_ref_vector eqs(m);
|
||||||
|
for (expr * e : universe) {
|
||||||
|
eqs.push_back(m.mk_eq(sk, e));
|
||||||
|
}
|
||||||
|
expr_ref fml = mk_or(eqs);
|
||||||
|
m_solver->assert_expr(fml);
|
||||||
|
}
|
||||||
|
|
||||||
// !Ex P(x) => !P(t)
|
// !Ex P(x) => !P(t)
|
||||||
// Ax P(x) => P(t)
|
// Ax P(x) => P(t)
|
||||||
// l_true: new instance
|
// l_true: new instance
|
||||||
|
@ -1056,13 +1067,17 @@ namespace smtfd {
|
||||||
if (!m_model->eval_expr(q->get_expr(), tmp, true)) {
|
if (!m_model->eval_expr(q->get_expr(), tmp, true)) {
|
||||||
return l_undef;
|
return l_undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_solver->push();
|
||||||
expr_ref_vector vars(m), vals(m);
|
expr_ref_vector vars(m), vals(m);
|
||||||
vars.resize(sz, nullptr);
|
vars.resize(sz, nullptr);
|
||||||
vals.resize(sz, nullptr);
|
vals.resize(sz, nullptr);
|
||||||
for (unsigned i = 0; i < sz; ++i) {
|
for (unsigned i = 0; i < sz; ++i) {
|
||||||
vars[sz - i - 1] = m.mk_fresh_const(q->get_decl_name(i), q->get_decl_sort(i));
|
sort* s = q->get_decl_sort(i);
|
||||||
|
vars[i] = m.mk_fresh_const(q->get_decl_name(i), s);
|
||||||
// TBD: finite domain variables
|
if (m_model->has_uninterpreted_sort(s)) {
|
||||||
|
restrict_to_universe(vars.get(i), m_model->get_universe(s));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var_subst subst(m);
|
var_subst subst(m);
|
||||||
expr_ref body = subst(tmp, vars.size(), vars.c_ptr());
|
expr_ref body = subst(tmp, vars.size(), vars.c_ptr());
|
||||||
|
@ -1070,7 +1085,6 @@ namespace smtfd {
|
||||||
body = m.mk_not(body);
|
body = m.mk_not(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_solver->push();
|
|
||||||
m_solver->assert_expr(body);
|
m_solver->assert_expr(body);
|
||||||
lbool r = m_solver->check_sat(0, nullptr);
|
lbool r = m_solver->check_sat(0, nullptr);
|
||||||
model_ref mdl;
|
model_ref mdl;
|
||||||
|
@ -1115,12 +1129,8 @@ namespace smtfd {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_enforced(quantifier* q) {
|
|
||||||
return m_enforced.contains(q);
|
|
||||||
}
|
|
||||||
|
|
||||||
lbool check_exists(quantifier* q) {
|
lbool check_exists(quantifier* q) {
|
||||||
if (is_enforced(q)) {
|
if (m_enforced.contains(q)) {
|
||||||
return l_true;
|
return l_true;
|
||||||
}
|
}
|
||||||
expr_ref tmp(m);
|
expr_ref tmp(m);
|
||||||
|
@ -1504,7 +1514,7 @@ namespace smtfd {
|
||||||
lbool r;
|
lbool r;
|
||||||
expr_ref_vector core(m);
|
expr_ref_vector core(m);
|
||||||
while (true) {
|
while (true) {
|
||||||
IF_VERBOSE(1, verbose_stream() << "(smtfd-check-sat " << m_stats.m_num_rounds << " " << m_stats.m_num_lemmas << ")\n");
|
IF_VERBOSE(1, verbose_stream() << "(smtfd-check-sat " << m_stats.m_num_rounds << " " << m_stats.m_num_lemmas << " " << m_stats.m_num_mbqi << ")\n");
|
||||||
m_stats.m_num_rounds++;
|
m_stats.m_num_rounds++;
|
||||||
checkpoint();
|
checkpoint();
|
||||||
|
|
||||||
|
@ -1542,7 +1552,7 @@ namespace smtfd {
|
||||||
case l_undef:
|
case l_undef:
|
||||||
break;
|
break;
|
||||||
case l_false:
|
case l_false:
|
||||||
m_max_conflicts = UINT_MAX;
|
// m_max_conflicts = UINT_MAX;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -249,7 +249,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
element_ref & operator=(T * n) {
|
element_ref & operator=(T * n) {
|
||||||
SASSERT(n);
|
|
||||||
m_manager.inc_ref(n);
|
m_manager.inc_ref(n);
|
||||||
m_manager.dec_ref(m_ref);
|
m_manager.dec_ref(m_ref);
|
||||||
m_ref = n;
|
m_ref = n;
|
||||||
|
|
Loading…
Reference in a new issue