mirror of
https://github.com/Z3Prover/z3
synced 2025-06-03 12:51:22 +00:00
parent
8b5627e361
commit
66e61b8a31
3 changed files with 64 additions and 9 deletions
|
@ -60,7 +60,12 @@ expr_ref sym_expr::accept(expr* e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ostream& sym_expr::display(std::ostream& out) const {
|
std::ostream& sym_expr::display(std::ostream& out) const {
|
||||||
return out << m_t;
|
switch (m_ty) {
|
||||||
|
case t_char: return out << m_t;
|
||||||
|
case t_range: return out << m_t << ":" << m_s;
|
||||||
|
case t_pred: return out << m_t;
|
||||||
|
}
|
||||||
|
return out << "expression type not recognized";
|
||||||
}
|
}
|
||||||
|
|
||||||
struct display_expr1 {
|
struct display_expr1 {
|
||||||
|
@ -237,6 +242,7 @@ eautomaton* re2automaton::re2aut(expr* e) {
|
||||||
unsigned nb = s1.num_bits();
|
unsigned nb = s1.num_bits();
|
||||||
expr_ref _start(bv.mk_numeral(start, nb), m);
|
expr_ref _start(bv.mk_numeral(start, nb), m);
|
||||||
expr_ref _stop(bv.mk_numeral(stop, nb), m);
|
expr_ref _stop(bv.mk_numeral(stop, nb), m);
|
||||||
|
TRACE("seq", tout << "Range: " << start << " " << stop << "\n";);
|
||||||
a = alloc(eautomaton, sm, sym_expr::mk_range(_start, _stop));
|
a = alloc(eautomaton, sm, sym_expr::mk_range(_start, _stop));
|
||||||
return a.detach();
|
return a.detach();
|
||||||
}
|
}
|
||||||
|
@ -646,6 +652,29 @@ br_status seq_rewriter::mk_seq_contains(expr* a, expr* b, expr_ref& result) {
|
||||||
result = m().mk_true();
|
result = m().mk_true();
|
||||||
return BR_DONE;
|
return BR_DONE;
|
||||||
}
|
}
|
||||||
|
bool all_units = true;
|
||||||
|
for (unsigned i = 0; i < bs.size(); ++i) {
|
||||||
|
all_units = m_util.str.is_unit(bs[i].get());
|
||||||
|
}
|
||||||
|
for (unsigned i = 0; i < as.size(); ++i) {
|
||||||
|
all_units = m_util.str.is_unit(as[i].get());
|
||||||
|
}
|
||||||
|
if (all_units) {
|
||||||
|
if (as.size() < bs.size()) {
|
||||||
|
result = m().mk_false();
|
||||||
|
return BR_DONE;
|
||||||
|
}
|
||||||
|
expr_ref_vector ors(m());
|
||||||
|
for (unsigned i = 0; i < as.size() - bs.size() + 1; ++i) {
|
||||||
|
expr_ref_vector ands(m());
|
||||||
|
for (unsigned j = 0; j < bs.size(); ++j) {
|
||||||
|
ands.push_back(m().mk_eq(as[i + j].get(), bs[j].get()));
|
||||||
|
}
|
||||||
|
ors.push_back(::mk_and(ands));
|
||||||
|
}
|
||||||
|
result = ::mk_or(ors);
|
||||||
|
return BR_REWRITE_FULL;
|
||||||
|
}
|
||||||
|
|
||||||
return BR_FAILED;
|
return BR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -255,6 +255,11 @@ final_check_status theory_seq::final_check_eh() {
|
||||||
TRACE("seq", tout << ">>solve_eqs\n";);
|
TRACE("seq", tout << ">>solve_eqs\n";);
|
||||||
return FC_CONTINUE;
|
return FC_CONTINUE;
|
||||||
}
|
}
|
||||||
|
if (check_contains()) {
|
||||||
|
++m_stats.m_propagate_contains;
|
||||||
|
TRACE("seq", tout << ">>propagate_contains\n";);
|
||||||
|
return FC_CONTINUE;
|
||||||
|
}
|
||||||
if (solve_nqs(0)) {
|
if (solve_nqs(0)) {
|
||||||
++m_stats.m_solve_nqs;
|
++m_stats.m_solve_nqs;
|
||||||
TRACE("seq", tout << ">>solve_nqs\n";);
|
TRACE("seq", tout << ">>solve_nqs\n";);
|
||||||
|
@ -290,11 +295,6 @@ final_check_status theory_seq::final_check_eh() {
|
||||||
TRACE("seq", tout << ">>propagate_automata\n";);
|
TRACE("seq", tout << ">>propagate_automata\n";);
|
||||||
return FC_CONTINUE;
|
return FC_CONTINUE;
|
||||||
}
|
}
|
||||||
if (check_contains()) {
|
|
||||||
++m_stats.m_propagate_contains;
|
|
||||||
TRACE("seq", tout << ">>propagate_contains\n";);
|
|
||||||
return FC_CONTINUE;
|
|
||||||
}
|
|
||||||
if (is_solved()) {
|
if (is_solved()) {
|
||||||
TRACE("seq", tout << ">>is_solved\n";);
|
TRACE("seq", tout << ">>is_solved\n";);
|
||||||
return FC_DONE;
|
return FC_DONE;
|
||||||
|
@ -1159,7 +1159,7 @@ bool theory_seq::check_extensionality() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
\brief check negated contains constriants.
|
\brief check negated contains constraints.
|
||||||
*/
|
*/
|
||||||
bool theory_seq::check_contains() {
|
bool theory_seq::check_contains() {
|
||||||
context & ctx = get_context();
|
context & ctx = get_context();
|
||||||
|
@ -1199,6 +1199,11 @@ bool theory_seq::is_solved() {
|
||||||
IF_VERBOSE(10, display_disequation(verbose_stream() << "(seq.giveup ", m_nqs[0]); verbose_stream() << " is unsolved)\n";);
|
IF_VERBOSE(10, display_disequation(verbose_stream() << "(seq.giveup ", m_nqs[0]); verbose_stream() << " is unsolved)\n";);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!m_ncs.empty()) {
|
||||||
|
TRACE("seq", display_nc(tout << "(seq.giveup ", m_ncs[0]); tout << " is unsolved)\n";);
|
||||||
|
IF_VERBOSE(10, display_nc(verbose_stream() << "(seq.giveup ", m_ncs[0]); verbose_stream() << " is unsolved)\n";);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1984,6 +1989,22 @@ bool theory_seq::solve_nc(unsigned idx) {
|
||||||
m_new_propagation = true;
|
m_new_propagation = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expr* e1, *e2;
|
||||||
|
if (m.is_eq(c, e1, e2)) {
|
||||||
|
literal eq = mk_eq(e1, e2, false);
|
||||||
|
propagate_lit(deps, 0, 0, ~eq);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m.is_or(c)) {
|
||||||
|
for (unsigned i = 0; i < to_app(c)->get_num_args(); ++i) {
|
||||||
|
expr_ref ci(to_app(c)->get_arg(i), m);
|
||||||
|
m_ncs.push_back(nc(ci, deps));
|
||||||
|
}
|
||||||
|
m_new_propagation = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2418,13 +2439,17 @@ void theory_seq::display(std::ostream & out) const {
|
||||||
if (!m_ncs.empty()) {
|
if (!m_ncs.empty()) {
|
||||||
out << "Non contains:\n";
|
out << "Non contains:\n";
|
||||||
for (unsigned i = 0; i < m_ncs.size(); ++i) {
|
for (unsigned i = 0; i < m_ncs.size(); ++i) {
|
||||||
out << "not " << mk_pp(m_ncs[i].contains(), m) << "\n";
|
display_nc(out, m_ncs[i]);
|
||||||
display_deps(out << " <- ", m_ncs[i].deps()); out << "\n";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void theory_seq::display_nc(std::ostream& out, nc const& nc) const {
|
||||||
|
out << "not " << mk_pp(nc.contains(), m) << "\n";
|
||||||
|
display_deps(out << " <- ", nc.deps()); out << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
void theory_seq::display_equations(std::ostream& out) const {
|
void theory_seq::display_equations(std::ostream& out) const {
|
||||||
for (unsigned i = 0; i < m_eqs.size(); ++i) {
|
for (unsigned i = 0; i < m_eqs.size(); ++i) {
|
||||||
display_equation(out, m_eqs[i]);
|
display_equation(out, m_eqs[i]);
|
||||||
|
|
|
@ -570,6 +570,7 @@ namespace smt {
|
||||||
void display_disequation(std::ostream& out, ne const& e) const;
|
void display_disequation(std::ostream& out, ne const& e) const;
|
||||||
void display_deps(std::ostream& out, dependency* deps) const;
|
void display_deps(std::ostream& out, dependency* deps) const;
|
||||||
void display_deps(std::ostream& out, literal_vector const& lits, enode_pair_vector const& eqs) const;
|
void display_deps(std::ostream& out, literal_vector const& lits, enode_pair_vector const& eqs) const;
|
||||||
|
void display_nc(std::ostream& out, nc const& nc) const;
|
||||||
public:
|
public:
|
||||||
theory_seq(ast_manager& m);
|
theory_seq(ast_manager& m);
|
||||||
virtual ~theory_seq();
|
virtual ~theory_seq();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue