mirror of
https://github.com/Z3Prover/z3
synced 2025-05-03 22:05:45 +00:00
fixes for #2513
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
de69b01e92
commit
a337a51374
28 changed files with 486 additions and 144 deletions
|
@ -36,6 +36,7 @@ Notes:
|
|||
#include "ast/rewriter/var_subst.h"
|
||||
#include "ast/pp.h"
|
||||
#include "ast/ast_smt2_pp.h"
|
||||
#include "ast/ast_ll_pp.h"
|
||||
#include "ast/decl_collector.h"
|
||||
#include "ast/well_sorted.h"
|
||||
#include "ast/for_each_expr.h"
|
||||
|
@ -1896,7 +1897,7 @@ void cmd_context::validate_model() {
|
|||
continue;
|
||||
}
|
||||
TRACE("model_validate", model_smt2_pp(tout, *this, *md, 0););
|
||||
IF_VERBOSE(10, verbose_stream() << "model check failed on: " << mk_pp(a, m()) << "\n";);
|
||||
analyze_failure(evaluator, a, true);
|
||||
IF_VERBOSE(11, model_smt2_pp(verbose_stream(), *this, *md, 0););
|
||||
invalid_model = true;
|
||||
}
|
||||
|
@ -1907,6 +1908,73 @@ void cmd_context::validate_model() {
|
|||
}
|
||||
}
|
||||
|
||||
void cmd_context::analyze_failure(model_evaluator& ev, expr* a, bool expected_value) {
|
||||
if (expected_value && m().is_and(a)) {
|
||||
for (expr* arg : *to_app(a)) {
|
||||
if (ev.is_false(arg)) {
|
||||
analyze_failure(ev, arg, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
expr* c = nullptr, *t = nullptr, *e = nullptr;
|
||||
if (expected_value && m().is_ite(a, c, t, e)) {
|
||||
if (ev.is_true(c) && ev.is_false(t)) {
|
||||
analyze_failure(ev, t, true);
|
||||
return;
|
||||
}
|
||||
if (ev.is_false(c) && ev.is_false(e)) {
|
||||
analyze_failure(ev, e, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (m().is_not(a, e)) {
|
||||
analyze_failure(ev, e, !expected_value);
|
||||
return;
|
||||
}
|
||||
if (!expected_value && m().is_or(a)) {
|
||||
for (expr* arg : *to_app(a)) {
|
||||
if (ev.is_false(arg)) {
|
||||
analyze_failure(ev, arg, false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!expected_value && m().is_ite(a, c, t, e)) {
|
||||
if (ev.is_true(c) && ev.is_true(t)) {
|
||||
analyze_failure(ev, t, false);
|
||||
return;
|
||||
}
|
||||
if (ev.is_false(c) && ev.is_true(e)) {
|
||||
analyze_failure(ev, e, false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
IF_VERBOSE(10, verbose_stream() << "model check failed on: " << " " << mk_pp(a, m()) << "\n";);
|
||||
IF_VERBOSE(10, verbose_stream() << "expected value: " << (expected_value?"true":"false") << "\n";);
|
||||
|
||||
IF_VERBOSE(10, display_detailed_analysis(verbose_stream(), ev, a));
|
||||
}
|
||||
|
||||
void cmd_context::display_detailed_analysis(std::ostream& out, model_evaluator& ev, expr* e) {
|
||||
ptr_vector<expr> es;
|
||||
es.push_back(e);
|
||||
expr_mark visited;
|
||||
for (unsigned i = 0; i < es.size(); ++i) {
|
||||
e = es[i];
|
||||
if (visited.is_marked(e)) {
|
||||
continue;
|
||||
}
|
||||
visited.mark(e, true);
|
||||
expr_ref val = ev(e);
|
||||
out << "#" << e->get_id() << ": " << mk_bounded_pp(e, m(), 1) << " " << val << "\n";
|
||||
if (is_app(e)) {
|
||||
for (expr* arg : *to_app(e)) {
|
||||
es.push_back(arg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cmd_context::mk_solver() {
|
||||
bool proofs_enabled, models_enabled, unsat_core_enabled;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue