3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 09:35:32 +00:00
This commit is contained in:
Nikolaj Bjorner 2021-09-20 10:10:28 -07:00
parent 426306376f
commit 6f31d83633
11 changed files with 62 additions and 34 deletions

View file

@ -21,6 +21,7 @@ Revision History:
#include "ast/ast_util.h"
#include "ast/ast_pp.h"
#include "ast/pb_decl_plugin.h"
#include "ast/recfun_decl_plugin.h"
#include "ast/rewriter/th_rewriter.h"
#include "ast/rewriter/rewriter_def.h"
#include "ast/rewriter/hoist_rewriter.h"
@ -407,6 +408,9 @@ class solve_eqs_tactic : public tactic {
}
void insert_solution(goal const& g, unsigned idx, expr* f, app* var, expr* def, proof* pr) {
if (!is_safe(var))
return;
m_vars.push_back(var);
m_candidates.push_back(f);
m_candidate_set.mark(f);
@ -707,8 +711,21 @@ class solve_eqs_tactic : public tactic {
pr1 = m().mk_transitivity(pr1, pr2);
if (!pr1) pr1 = g.pr(idx); else pr1 = m().mk_modus_ponens(g.pr(idx), pr1);
g.update(idx, tmp2, pr1, g.dep(idx));
}
}
}
expr_mark m_unsafe_vars;
void filter_unsafe_vars() {
m_unsafe_vars.reset();
recfun::util rec(m());
for (func_decl* f : rec.get_rec_funs())
for (expr* term : subterms::all(expr_ref(rec.get_def(f).get_rhs(), m())))
m_unsafe_vars.mark(term);
}
bool is_safe(expr* f) {
return !m_unsafe_vars.is_marked(f);
}
void sort_vars() {
@ -1020,6 +1037,8 @@ class solve_eqs_tactic : public tactic {
m_subst = alloc(expr_substitution, m(), m_produce_unsat_cores, m_produce_proofs);
m_norm_subst = alloc(expr_substitution, m(), m_produce_unsat_cores, m_produce_proofs);
unsigned rounds = 0;
filter_unsafe_vars();
while (rounds < 20) {
++rounds;
if (!m_produce_proofs && m_context_solve && rounds < 3) {

View file

@ -619,7 +619,7 @@ namespace smtfd {
return false;
}
else if (round < max_rounds) {
for (expr* t : subterms(core)) {
for (expr* t : subterms::ground(core)) {
for (theory_plugin* p : m_plugins) {
p->check_term(t, round);
}
@ -863,7 +863,7 @@ namespace smtfd {
}
mdl->register_decl(fn, fi);
}
for (expr* t : subterms(terms)) {
for (expr* t : subterms::ground(terms)) {
if (is_uninterp_const(t) && sort_covered(t->get_sort())) {
expr_ref val = model_value(t);
mdl->register_decl(to_app(t)->get_decl(), val);
@ -1305,7 +1305,7 @@ namespace smtfd {
void populate_model(model_ref& mdl, expr_ref_vector const& terms) override {
for (expr* t : subterms(terms)) {
for (expr* t : subterms::ground(terms)) {
if (is_uninterp_const(t) && m_autil.is_array(t)) {
mdl->register_decl(to_app(t)->get_decl(), model_value_core(t));
}
@ -1317,7 +1317,7 @@ namespace smtfd {
void global_check(expr_ref_vector const& core) override {
expr_mark seen;
expr_ref_vector shared(m), sharedvals(m);
for (expr* t : subterms(core)) {
for (expr* t : subterms::ground(core)) {
if (!is_app(t)) continue;
app* a = to_app(t);
unsigned offset = 0;
@ -1463,7 +1463,7 @@ namespace smtfd {
if (r == l_true) {
expr_ref qq(q->get_expr(), m);
for (expr* t : subterms(qq)) {
for (expr* t : subterms::ground(qq)) {
init_term(t);
}
m_solver->get_model(mdl);
@ -1558,10 +1558,10 @@ namespace smtfd {
void init_val2term(expr_ref_vector const& fmls, expr_ref_vector const& core) {
m_val2term_trail.reset();
m_val2term.reset();
for (expr* t : subterms(core)) {
for (expr* t : subterms::ground(core)) {
init_term(t);
}
for (expr* t : subterms(fmls)) {
for (expr* t : subterms::ground(fmls)) {
init_term(t);
}
}
@ -1719,12 +1719,12 @@ namespace smtfd {
m_context.reset(m_model);
expr_ref_vector terms(core);
terms.append(m_axioms);
for (expr* t : subterms(core)) {
for (expr* t : subterms::ground(core)) {
if (is_forall(t) || is_exists(t)) {
has_q = true;
}
}
for (expr* t : subterms(terms)) {
for (expr* t : subterms::ground(terms)) {
if (!is_forall(t) && !is_exists(t) && (!m_context.term_covered(t) || !m_context.sort_covered(t->get_sort()))) {
is_decided = l_false;
}
@ -1733,7 +1733,7 @@ namespace smtfd {
TRACE("smtfd",
tout << "axioms: " << m_axioms << "\n";
for (expr* a : subterms(terms)) {
for (expr* a : subterms::ground(terms)) {
expr_ref val0 = (*m_model)(a);
expr_ref val1 = (*m_model)(abs(a));
if (is_ground(a) && val0 != val1 && val0->get_sort() == val1->get_sort()) {
@ -1750,7 +1750,7 @@ namespace smtfd {
DEBUG_CODE(
bool found_bad = false;
for (expr* a : subterms(core)) {
for (expr* a : subterms::ground(core)) {
expr_ref val0 = (*m_model)(a);
expr_ref val1 = (*m_model)(abs(a));
if (is_ground(a) && val0 != val1 && val0->get_sort() == val1->get_sort()) {