3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-05-03 22:05:45 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2019-10-13 20:24:05 -07:00
parent 224cc8f8dd
commit 71d68b8fe0
5 changed files with 157 additions and 120 deletions

View file

@ -1912,6 +1912,19 @@ void cmd_context::validate_model() {
}
void cmd_context::analyze_failure(model_evaluator& ev, expr* a, bool expected_value) {
expr* c = nullptr, *t = nullptr, *e = nullptr;
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_true(arg)) {
analyze_failure(ev, arg, false);
return;
}
}
}
if (expected_value && m().is_and(a)) {
for (expr* arg : *to_app(a)) {
if (ev.is_false(arg)) {
@ -1920,36 +1933,27 @@ void cmd_context::analyze_failure(model_evaluator& ev, expr* a, bool expected_va
}
}
}
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);
if (!m().is_true(c)) analyze_failure(ev, c, false);
if (!m().is_false(t)) analyze_failure(ev, t, true);
return;
}
if (ev.is_false(c) && ev.is_false(e)) {
analyze_failure(ev, e, true);
if (!m().is_false(c)) analyze_failure(ev, c, true);
if (!m().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);
if (!m().is_true(c)) analyze_failure(ev, c, false);
if (!m().is_true(t)) analyze_failure(ev, t, false);
return;
}
if (ev.is_false(c) && ev.is_true(e)) {
analyze_failure(ev, e, false);
if (!m().is_false(c)) analyze_failure(ev, c, true);
if (!m().is_true(e)) analyze_failure(ev, e, false);
return;
}
}