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:
parent
224cc8f8dd
commit
71d68b8fe0
5 changed files with 157 additions and 120 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue