mirror of
https://github.com/Z3Prover/z3
synced 2025-08-09 12:50:32 +00:00
add clause proof module, small improvements to bapa
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
4d30639fd7
commit
48fc3d752e
36 changed files with 722 additions and 250 deletions
|
@ -29,15 +29,15 @@ namespace smt {
|
|||
qi_queue::qi_queue(quantifier_manager & qm, context & ctx, qi_params & params):
|
||||
m_qm(qm),
|
||||
m_context(ctx),
|
||||
m_manager(m_context.get_manager()),
|
||||
m(m_context.get_manager()),
|
||||
m_params(params),
|
||||
m_checker(m_context),
|
||||
m_cost_function(m_manager),
|
||||
m_new_gen_function(m_manager),
|
||||
m_parser(m_manager),
|
||||
m_evaluator(m_manager),
|
||||
m_subst(m_manager),
|
||||
m_instances(m_manager) {
|
||||
m_cost_function(m),
|
||||
m_new_gen_function(m),
|
||||
m_parser(m),
|
||||
m_evaluator(m),
|
||||
m_subst(m),
|
||||
m_instances(m) {
|
||||
init_parser_vars();
|
||||
m_vals.resize(15, 0.0f);
|
||||
}
|
||||
|
@ -158,11 +158,11 @@ namespace smt {
|
|||
}
|
||||
else if (m_params.m_qi_promote_unsat && m_checker.is_unsat(qa->get_expr(), f->get_num_args(), f->get_args())) {
|
||||
// do not delay instances that produce a conflict.
|
||||
TRACE("qi_unsat", tout << "promoting instance that produces a conflict\n" << mk_pp(qa, m_manager) << "\n";);
|
||||
TRACE("qi_unsat", tout << "promoting instance that produces a conflict\n" << mk_pp(qa, m) << "\n";);
|
||||
instantiate(curr);
|
||||
}
|
||||
else {
|
||||
TRACE("qi_queue", tout << "delaying quantifier instantiation... " << f << "\n" << mk_pp(qa, m_manager) << "\ncost: " << curr.m_cost << "\n";);
|
||||
TRACE("qi_queue", tout << "delaying quantifier instantiation... " << f << "\n" << mk_pp(qa, m) << "\ncost: " << curr.m_cost << "\n";);
|
||||
m_delayed_entries.push_back(curr);
|
||||
}
|
||||
|
||||
|
@ -179,13 +179,13 @@ namespace smt {
|
|||
}
|
||||
|
||||
void qi_queue::display_instance_profile(fingerprint * f, quantifier * q, unsigned num_bindings, enode * const * bindings, unsigned proof_id, unsigned generation) {
|
||||
if (m_manager.has_trace_stream()) {
|
||||
m_manager.trace_stream() << "[instance] ";
|
||||
m_manager.trace_stream() << static_cast<void*>(f);
|
||||
if (m_manager.proofs_enabled())
|
||||
m_manager.trace_stream() << " #" << proof_id;
|
||||
m_manager.trace_stream() << " ; " << generation;
|
||||
m_manager.trace_stream() << "\n";
|
||||
if (m.has_trace_stream()) {
|
||||
m.trace_stream() << "[instance] ";
|
||||
m.trace_stream() << static_cast<void*>(f);
|
||||
if (m.proofs_enabled())
|
||||
m.trace_stream() << " #" << proof_id;
|
||||
m.trace_stream() << " ; " << generation;
|
||||
m.trace_stream() << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -204,21 +204,21 @@ namespace smt {
|
|||
TRACE("checker", tout << "instance already satisfied\n";);
|
||||
return;
|
||||
}
|
||||
expr_ref instance(m_manager);
|
||||
expr_ref instance(m);
|
||||
m_subst(q, num_bindings, bindings, instance);
|
||||
|
||||
TRACE("qi_queue", tout << "new instance:\n" << mk_pp(instance, m_manager) << "\n";);
|
||||
TRACE("qi_queue_instance", tout << "new instance:\n" << mk_pp(instance, m_manager) << "\n";);
|
||||
expr_ref s_instance(m_manager);
|
||||
proof_ref pr(m_manager);
|
||||
TRACE("qi_queue", tout << "new instance:\n" << mk_pp(instance, m) << "\n";);
|
||||
TRACE("qi_queue_instance", tout << "new instance:\n" << mk_pp(instance, m) << "\n";);
|
||||
expr_ref s_instance(m);
|
||||
proof_ref pr(m);
|
||||
m_context.get_rewriter()(instance, s_instance, pr);
|
||||
TRACE("qi_queue_bug", tout << "new instance after simplification:\n" << s_instance << "\n";);
|
||||
if (m_manager.is_true(s_instance)) {
|
||||
TRACE("checker", tout << "reduced to true, before:\n" << mk_ll_pp(instance, m_manager););
|
||||
if (m.is_true(s_instance)) {
|
||||
TRACE("checker", tout << "reduced to true, before:\n" << mk_ll_pp(instance, m););
|
||||
|
||||
if (m_manager.has_trace_stream()) {
|
||||
if (m.has_trace_stream()) {
|
||||
display_instance_profile(f, q, num_bindings, bindings, pr->get_id(), generation);
|
||||
m_manager.trace_stream() << "[end-of-instance]\n";
|
||||
m.trace_stream() << "[end-of-instance]\n";
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -228,51 +228,51 @@ namespace smt {
|
|||
if (stat->get_num_instances() % m_params.m_qi_profile_freq == 0) {
|
||||
m_qm.display_stats(verbose_stream(), q);
|
||||
}
|
||||
expr_ref lemma(m_manager);
|
||||
if (m_manager.is_or(s_instance)) {
|
||||
expr_ref lemma(m);
|
||||
if (m.is_or(s_instance)) {
|
||||
ptr_vector<expr> args;
|
||||
args.push_back(m_manager.mk_not(q));
|
||||
args.push_back(m.mk_not(q));
|
||||
args.append(to_app(s_instance)->get_num_args(), to_app(s_instance)->get_args());
|
||||
lemma = m_manager.mk_or(args.size(), args.c_ptr());
|
||||
lemma = m.mk_or(args.size(), args.c_ptr());
|
||||
}
|
||||
else if (m_manager.is_false(s_instance)) {
|
||||
lemma = m_manager.mk_not(q);
|
||||
else if (m.is_false(s_instance)) {
|
||||
lemma = m.mk_not(q);
|
||||
}
|
||||
else if (m_manager.is_true(s_instance)) {
|
||||
else if (m.is_true(s_instance)) {
|
||||
lemma = s_instance;
|
||||
}
|
||||
else {
|
||||
lemma = m_manager.mk_or(m_manager.mk_not(q), s_instance);
|
||||
lemma = m.mk_or(m.mk_not(q), s_instance);
|
||||
}
|
||||
m_instances.push_back(lemma);
|
||||
proof_ref pr1(m_manager);
|
||||
proof_ref pr1(m);
|
||||
unsigned proof_id = 0;
|
||||
if (m_manager.proofs_enabled()) {
|
||||
expr_ref_vector bindings_e(m_manager);
|
||||
if (m.proofs_enabled()) {
|
||||
expr_ref_vector bindings_e(m);
|
||||
for (unsigned i = 0; i < num_bindings; ++i) {
|
||||
bindings_e.push_back(bindings[i]->get_owner());
|
||||
}
|
||||
app * bare_lemma = m_manager.mk_or(m_manager.mk_not(q), instance);
|
||||
proof * qi_pr = m_manager.mk_quant_inst(bare_lemma, num_bindings, bindings_e.c_ptr());
|
||||
app * bare_lemma = m.mk_or(m.mk_not(q), instance);
|
||||
proof * qi_pr = m.mk_quant_inst(bare_lemma, num_bindings, bindings_e.c_ptr());
|
||||
proof_id = qi_pr->get_id();
|
||||
if (bare_lemma == lemma) {
|
||||
pr1 = qi_pr;
|
||||
}
|
||||
else if (instance == s_instance) {
|
||||
proof * rw = m_manager.mk_rewrite(bare_lemma, lemma);
|
||||
pr1 = m_manager.mk_modus_ponens(qi_pr, rw);
|
||||
proof * rw = m.mk_rewrite(bare_lemma, lemma);
|
||||
pr1 = m.mk_modus_ponens(qi_pr, rw);
|
||||
}
|
||||
else {
|
||||
app * bare_s_lemma = m_manager.mk_or(m_manager.mk_not(q), s_instance);
|
||||
app * bare_s_lemma = m.mk_or(m.mk_not(q), s_instance);
|
||||
proof * prs[1] = { pr.get() };
|
||||
proof * cg = m_manager.mk_congruence(bare_lemma, bare_s_lemma, 1, prs);
|
||||
proof * rw = m_manager.mk_rewrite(bare_s_lemma, lemma);
|
||||
proof * tr = m_manager.mk_transitivity(cg, rw);
|
||||
pr1 = m_manager.mk_modus_ponens(qi_pr, tr);
|
||||
proof * cg = m.mk_congruence(bare_lemma, bare_s_lemma, 1, prs);
|
||||
proof * rw = m.mk_rewrite(bare_s_lemma, lemma);
|
||||
proof * tr = m.mk_transitivity(cg, rw);
|
||||
pr1 = m.mk_modus_ponens(qi_pr, tr);
|
||||
}
|
||||
m_instances.push_back(pr1);
|
||||
}
|
||||
TRACE("qi_queue", tout << mk_pp(lemma, m_manager) << "\n#" << lemma->get_id() << ":=\n" << mk_ll_pp(lemma, m_manager););
|
||||
TRACE("qi_queue", tout << mk_pp(lemma, m) << "\n#" << lemma->get_id() << ":=\n" << mk_ll_pp(lemma, m););
|
||||
m_stats.m_num_instances++;
|
||||
unsigned gen = get_new_gen(q, generation, ent.m_cost);
|
||||
display_instance_profile(f, q, num_bindings, bindings, proof_id, gen);
|
||||
|
@ -282,7 +282,7 @@ namespace smt {
|
|||
}
|
||||
TRACE_CODE({
|
||||
static unsigned num_useless = 0;
|
||||
if (m_manager.is_or(lemma)) {
|
||||
if (m.is_or(lemma)) {
|
||||
app * n = to_app(lemma);
|
||||
bool has_unassigned = false;
|
||||
expr * true_child = 0;
|
||||
|
@ -296,7 +296,7 @@ namespace smt {
|
|||
}
|
||||
}
|
||||
if (true_child && has_unassigned) {
|
||||
TRACE("qi_queue_profile_detail", tout << "missed:\n" << mk_ll_pp(s_instance, m_manager) << "\n#" << true_child->get_id() << "\n";);
|
||||
TRACE("qi_queue_profile_detail", tout << "missed:\n" << mk_ll_pp(s_instance, m) << "\n#" << true_child->get_id() << "\n";);
|
||||
num_useless++;
|
||||
if (num_useless % 10 == 0) {
|
||||
TRACE("qi_queue_profile", tout << "num useless: " << num_useless << "\n";);
|
||||
|
@ -305,8 +305,8 @@ namespace smt {
|
|||
}
|
||||
});
|
||||
|
||||
if (m_manager.has_trace_stream())
|
||||
m_manager.trace_stream() << "[end-of-instance]\n";
|
||||
if (m.has_trace_stream())
|
||||
m.trace_stream() << "[end-of-instance]\n";
|
||||
|
||||
}
|
||||
|
||||
|
@ -368,7 +368,7 @@ namespace smt {
|
|||
TRACE("qi_queue", tout << e.m_qb << ", cost: " << e.m_cost << ", instantiated: " << e.m_instantiated << "\n";);
|
||||
if (!e.m_instantiated && e.m_cost <= min_cost) {
|
||||
TRACE("qi_queue",
|
||||
tout << "lazy quantifier instantiation...\n" << mk_pp(static_cast<quantifier*>(e.m_qb->get_data()), m_manager) << "\ncost: " << e.m_cost << "\n";);
|
||||
tout << "lazy quantifier instantiation...\n" << mk_pp(static_cast<quantifier*>(e.m_qb->get_data()), m) << "\ncost: " << e.m_cost << "\n";);
|
||||
result = false;
|
||||
m_instantiated_trail.push_back(i);
|
||||
m_stats.m_num_lazy_instances++;
|
||||
|
@ -384,7 +384,7 @@ namespace smt {
|
|||
TRACE("qi_queue", tout << e.m_qb << ", cost: " << e.m_cost << ", instantiated: " << e.m_instantiated << "\n";);
|
||||
if (!e.m_instantiated && e.m_cost <= m_params.m_qi_lazy_threshold) {
|
||||
TRACE("qi_queue",
|
||||
tout << "lazy quantifier instantiation...\n" << mk_pp(static_cast<quantifier*>(e.m_qb->get_data()), m_manager) << "\ncost: " << e.m_cost << "\n";);
|
||||
tout << "lazy quantifier instantiation...\n" << mk_pp(static_cast<quantifier*>(e.m_qb->get_data()), m) << "\ncost: " << e.m_cost << "\n";);
|
||||
result = false;
|
||||
m_instantiated_trail.push_back(i);
|
||||
m_stats.m_num_lazy_instances++;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue