3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-07-03 11:25:40 +00:00

fix bugs uncovered from running non-Horn SDV samples

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2012-11-29 14:56:09 -08:00
parent cefa2d7650
commit 646ace6842
4 changed files with 36 additions and 22 deletions

View file

@ -90,21 +90,30 @@ class horn_tactic : public tactic {
m_ctx.register_predicate(to_app(a)->get_decl(), true); m_ctx.register_predicate(to_app(a)->get_decl(), true);
} }
void check_predicate(expr* a) { void check_predicate(ast_mark& mark, expr* a) {
expr* a1 = 0; ptr_vector<expr> todo;
while (true) { todo.push_back(a);
while (!todo.empty()) {
a = todo.back();
todo.pop_back();
if (mark.is_marked(a)) {
continue;
}
mark.mark(a, true);
if (is_quantifier(a)) { if (is_quantifier(a)) {
a = to_quantifier(a)->get_expr(); a = to_quantifier(a)->get_expr();
continue; todo.push_back(a);
} }
if (m.is_not(a, a1)) { else if (m.is_not(a) || m.is_and(a) || m.is_or(a) || m.is_implies(a)) {
a = a1; todo.append(to_app(a)->get_num_args(), to_app(a)->get_args());
continue;
} }
if (is_predicate(a)) { else if (m.is_ite(a)) {
todo.append(to_app(a)->get_arg(1));
todo.append(to_app(a)->get_arg(2));
}
else if (is_predicate(a)) {
register_predicate(a); register_predicate(a);
} }
break;
} }
} }
@ -112,14 +121,15 @@ class horn_tactic : public tactic {
formula_kind get_formula_kind(expr_ref& f) { formula_kind get_formula_kind(expr_ref& f) {
normalize(f); normalize(f);
ast_mark mark;
expr_ref_vector args(m), body(m); expr_ref_vector args(m), body(m);
expr_ref head(m); expr_ref head(m);
expr* a = 0, *a1 = 0; expr* a = 0, *a1 = 0;
datalog::flatten_or(f, args); datalog::flatten_or(f, args);
for (unsigned i = 0; i < args.size(); ++i) { for (unsigned i = 0; i < args.size(); ++i) {
a = args[i].get(); a = args[i].get();
check_predicate(a); check_predicate(mark, a);
if (m.is_not(a, a1) && is_predicate(a1)) { if (m.is_not(a, a1)) {
body.push_back(a1); body.push_back(a1);
} }
else if (is_predicate(a)) { else if (is_predicate(a)) {
@ -128,9 +138,6 @@ class horn_tactic : public tactic {
} }
head = a; head = a;
} }
else if (m.is_not(a, a1)) {
body.push_back(a1);
}
else { else {
body.push_back(m.mk_not(a)); body.push_back(m.mk_not(a));
} }

View file

@ -1827,10 +1827,8 @@ namespace pdr {
proof_ref pr(m); proof_ref pr(m);
pr = m.mk_asserted(m.mk_true()); pr = m.mk_asserted(m.mk_true());
for (unsigned i = 0; i < vars.size(); ++i) { for (unsigned i = 0; i < vars.size(); ++i) {
if (smt::is_value_sort(m, vars[i].get())) { tmp = mev.eval(M, vars[i].get());
tmp = mev.eval(M, vars[i].get()); sub.insert(vars[i].get(), tmp, pr);
sub.insert(vars[i].get(), tmp, pr);
}
} }
if (!rep) rep = mk_expr_simp_replacer(m); if (!rep) rep = mk_expr_simp_replacer(m);
rep->set_substitution(&sub); rep->set_substitution(&sub);

View file

@ -608,6 +608,7 @@ namespace pdr {
best effort evaluator of extensional array equality. best effort evaluator of extensional array equality.
*/ */
void model_evaluator::eval_array_eq(app* e, expr* arg1, expr* arg2) { void model_evaluator::eval_array_eq(app* e, expr* arg1, expr* arg2) {
TRACE("pdr", tout << "array equality: " << mk_pp(e, m) << "\n";);
expr_ref v1(m), v2(m); expr_ref v1(m), v2(m);
m_model->eval(arg1, v1); m_model->eval(arg1, v1);
m_model->eval(arg2, v2); m_model->eval(arg2, v2);
@ -633,7 +634,10 @@ namespace pdr {
if (else1 != else2) { if (else1 != else2) {
if (m.is_value(else1) && m.is_value(else2)) { if (m.is_value(else1) && m.is_value(else2)) {
set_bool(e, false); TRACE("pdr", tout
<< "defaults are different: " << mk_pp(e, m) << " "
<< mk_pp(else1, m) << " " << mk_pp(else2, m) << "\n";);
set_false(e);
} }
else { else {
TRACE("pdr", tout << "equality is unknown: " << mk_pp(e, m) << "\n";); TRACE("pdr", tout << "equality is unknown: " << mk_pp(e, m) << "\n";);
@ -659,7 +663,10 @@ namespace pdr {
continue; continue;
} }
else if (m.is_value(w1) && m.is_value(w2)) { else if (m.is_value(w1) && m.is_value(w2)) {
set_bool(e, false); TRACE("pdr", tout << "Equality evaluation: " << mk_pp(e, m) << "\n";
tout << mk_pp(s1, m) << " |-> " << mk_pp(w1, m) << "\n";
tout << mk_pp(s2, m) << " |-> " << mk_pp(w2, m) << "\n";);
set_false(e);
return; return;
} }
else { else {
@ -668,7 +675,7 @@ namespace pdr {
return; return;
} }
} }
set_bool(e, true); set_true(e);
} }
void model_evaluator::eval_eq(app* e, expr* arg1, expr* arg2) { void model_evaluator::eval_eq(app* e, expr* arg1, expr* arg2) {

View file

@ -102,6 +102,7 @@ template<typename Ext>
bool theory_diff_logic<Ext>::internalize_term(app * term) { bool theory_diff_logic<Ext>::internalize_term(app * term) {
bool result = null_theory_var != mk_term(term); bool result = null_theory_var != mk_term(term);
CTRACE("arith", !result, tout << "Did not internalize " << mk_pp(term, get_manager()) << "\n";); CTRACE("arith", !result, tout << "Did not internalize " << mk_pp(term, get_manager()) << "\n";);
TRACE("non_diff_logic", tout << "Terms may not be internalized\n";);
found_non_diff_logic_expr(term); found_non_diff_logic_expr(term);
return result; return result;
} }
@ -831,6 +832,7 @@ theory_var theory_diff_logic<Ext>::mk_var(app* n) {
v = mk_var(e); v = mk_var(e);
} }
if (is_interpreted(n)) { if (is_interpreted(n)) {
TRACE("non_diff_logic", tout << "Variable should not be interpreted\n";);
found_non_diff_logic_expr(n); found_non_diff_logic_expr(n);
} }
TRACE("arith", tout << mk_pp(n, get_manager()) << " |-> " << v << "\n";); TRACE("arith", tout << mk_pp(n, get_manager()) << " |-> " << v << "\n";);