mirror of
https://github.com/Z3Prover/z3
synced 2026-06-30 12:28:53 +00:00
Bug fixing with unit replacement
This commit is contained in:
parent
17ca44b351
commit
3b5b53126e
6 changed files with 33 additions and 20 deletions
|
|
@ -37,7 +37,8 @@ namespace smt {
|
|||
m_nielsen(m_sgraph, m_context_solver),
|
||||
m_axioms(m_th_rewriter),
|
||||
m_regex(m_sgraph),
|
||||
m_model(m, m_seq, m_rewriter, m_sgraph)
|
||||
m_model(m, m_seq, m_rewriter, m_sgraph),
|
||||
m_relevant_lengths(m)
|
||||
{
|
||||
std::function<void(expr_ref_vector const&)> add_clause =
|
||||
[&](expr_ref_vector const &clause) {
|
||||
|
|
@ -112,7 +113,7 @@ namespace smt {
|
|||
// -----------------------------------------------------------------------
|
||||
|
||||
bool theory_nseq::internalize_atom(app* atom, bool /*gate_ctx*/) {
|
||||
std::cout << "internalize_atom: " << mk_pp(atom, m) << std::endl;
|
||||
// std::cout << "internalize_atom: " << mk_pp(atom, m) << std::endl;
|
||||
// str.in_re atoms are boolean predicates: register as bool_var
|
||||
// so that assign_eh fires when the SAT solver assigns them.
|
||||
// Following theory_seq: create a bool_var directly without an enode
|
||||
|
|
@ -144,7 +145,7 @@ namespace smt {
|
|||
}
|
||||
|
||||
bool theory_nseq::internalize_term(app* term) {
|
||||
std::cout << "internalize_term: " << mk_pp(term, m) << std::endl;
|
||||
// std::cout << "internalize_term: " << mk_pp(term, m) << std::endl;
|
||||
// ensure ALL children are internalized (following theory_seq pattern)
|
||||
for (auto arg : *term) {
|
||||
mk_var(ensure_enode(arg));
|
||||
|
|
@ -181,6 +182,11 @@ namespace smt {
|
|||
m_ho_terms.push_back(term);
|
||||
ensure_length_var(ho_s);
|
||||
}
|
||||
expr* v;
|
||||
if (m_seq.str.is_length(term, v)) {
|
||||
ctx.push_trail(restore_vector(m_relevant_lengths));
|
||||
m_relevant_lengths.push_back(term);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -605,7 +611,7 @@ namespace smt {
|
|||
auto lit = mk_literal(c.fml);
|
||||
switch (ctx.get_assignment(lit)) {
|
||||
case l_true: break;
|
||||
case l_undef:
|
||||
case l_undef:
|
||||
has_undef = true;
|
||||
ctx.force_phase(lit);
|
||||
IF_VERBOSE(2, verbose_stream() <<
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue