mirror of
https://github.com/Z3Prover/z3
synced 2025-04-24 09:35:32 +00:00
fix fourth bug produced by repros by Mark Dunlop
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
1297eeb817
commit
94dae2da3a
6 changed files with 36 additions and 20 deletions
|
@ -1372,7 +1372,7 @@ namespace smt {
|
|||
}
|
||||
|
||||
while (true) {
|
||||
TRACE("unsat_core_bug", tout << consequent << " js.get_kind(): " << js.get_kind() << ", idx: " << idx << "\n";);
|
||||
TRACE("unsat_core_bug", tout << consequent << ", idx: " << idx << " " << js.get_kind() << "\n";);
|
||||
switch (js.get_kind()) {
|
||||
case b_justification::CLAUSE: {
|
||||
clause * cls = js.get_clause();
|
||||
|
@ -1417,7 +1417,7 @@ namespace smt {
|
|||
}
|
||||
while (idx >= 0) {
|
||||
literal l = m_assigned_literals[idx];
|
||||
TRACE("unsat_core_bug", tout << "l: " << l << ", get_assign_level(l): " << m_ctx.get_assign_level(l) << ", is_marked(l): " << m_ctx.is_marked(l.var()) << "\n";);
|
||||
CTRACE("unsat_core_bug", m_ctx.is_marked(l.var()), tout << "l: " << l << ", get_assign_level(l): " << m_ctx.get_assign_level(l) << "\n";);
|
||||
if (m_ctx.get_assign_level(l) < search_lvl)
|
||||
goto end_unsat_core;
|
||||
if (m_ctx.is_marked(l.var()))
|
||||
|
|
|
@ -1358,7 +1358,7 @@ namespace smt {
|
|||
|
||||
void display_profile(std::ostream & out) const;
|
||||
|
||||
void display(std::ostream& out, b_justification j) const;
|
||||
std::ostream& display(std::ostream& out, b_justification j) const;
|
||||
|
||||
// -----------------------------------
|
||||
//
|
||||
|
|
|
@ -356,9 +356,9 @@ namespace smt {
|
|||
}
|
||||
|
||||
void context::display_unsat_core(std::ostream & out) const {
|
||||
unsigned sz = m_unsat_core.size();
|
||||
for (unsigned i = 0; i < sz; i++)
|
||||
out << mk_pp(m_unsat_core.get(i), m_manager) << "\n";
|
||||
for (expr* c : m_unsat_core) {
|
||||
out << mk_pp(c, m_manager) << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
void context::collect_statistics(::statistics & st) const {
|
||||
|
@ -563,13 +563,14 @@ namespace smt {
|
|||
}
|
||||
out << "\n";
|
||||
if (is_app(n)) {
|
||||
for (unsigned i = 0; i < to_app(n)->get_num_args(); i++)
|
||||
todo.push_back(to_app(n)->get_arg(i));
|
||||
for (expr* arg : *to_app(n)) {
|
||||
todo.push_back(arg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void context::display(std::ostream& out, b_justification j) const {
|
||||
std::ostream& context::display(std::ostream& out, b_justification j) const {
|
||||
switch (j.get_kind()) {
|
||||
case b_justification::AXIOM:
|
||||
out << "axiom";
|
||||
|
@ -593,7 +594,7 @@ namespace smt {
|
|||
UNREACHABLE();
|
||||
break;
|
||||
}
|
||||
out << "\n";
|
||||
return out << "\n";
|
||||
}
|
||||
|
||||
void context::trace_assign(literal l, b_justification j, bool decision) const {
|
||||
|
|
|
@ -1924,6 +1924,7 @@ namespace smt {
|
|||
process_antecedent(~js.get_literal(), offset);
|
||||
break;
|
||||
case b_justification::AXIOM:
|
||||
bound = 0;
|
||||
break;
|
||||
case b_justification::JUSTIFICATION: {
|
||||
justification* j = js.get_justification();
|
||||
|
@ -1934,6 +1935,7 @@ namespace smt {
|
|||
}
|
||||
if (pbj == nullptr) {
|
||||
TRACE("pb", tout << "skip justification for " << conseq << "\n";);
|
||||
bound = 0;
|
||||
// this is possible when conseq is an assumption.
|
||||
// The justification of conseq is itself,
|
||||
// don't increment the cofficient here because it assumes
|
||||
|
|
|
@ -2905,17 +2905,26 @@ bool theory_seq::get_length(expr* e, expr_ref& len, literal_vector& lits) {
|
|||
TRACE("seq", ctx.display_literals_verbose(tout, 2, _lits); tout << "\n";);
|
||||
}
|
||||
else if (is_skolem(m_tail, e)) {
|
||||
// e = tail(s, l), len(s) > l =>
|
||||
// len(tail(s, l)) = len(s) - l - 1
|
||||
// e = tail(s, l), len(s) > l => len(tail(s, l)) = len(s) - l - 1
|
||||
// e = tail(s, l), len(s) <= l => len(tail(s, l)) = 0
|
||||
|
||||
s = to_app(e)->get_arg(0);
|
||||
l = to_app(e)->get_arg(1);
|
||||
expr_ref len_s = mk_len(s);
|
||||
literal len_s_gt_l = mk_simplified_literal(m_autil.mk_ge(mk_sub(len_s, l), m_autil.mk_int(1)));
|
||||
if (ctx.get_assignment(len_s_gt_l) == l_true) {
|
||||
switch (ctx.get_assignment(len_s_gt_l)) {
|
||||
case l_true:
|
||||
len = mk_sub(len_s, mk_sub(l, m_autil.mk_int(1)));
|
||||
TRACE("seq", tout << len_s << " " << len << " " << len_s_gt_l << "\n";);
|
||||
lits.push_back(len_s_gt_l);
|
||||
return true;
|
||||
case l_false:
|
||||
len = m_autil.mk_int(0);
|
||||
TRACE("seq", tout << len_s << " " << len << " " << len_s_gt_l << "\n";);
|
||||
lits.push_back(~len_s_gt_l);
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (m_util.str.is_unit(e)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue