mirror of
https://github.com/Z3Prover/z3
synced 2025-05-11 09:44:43 +00:00
fix performance for model construction, recognize concats of values as a value for pre-processing
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
72ec6dc8e1
commit
45fdb95f53
9 changed files with 163 additions and 244 deletions
|
@ -607,27 +607,25 @@ void asserted_formulas::propagate_values() {
|
|||
expr_ref n(m_asserted_formulas.get(i), m_manager);
|
||||
proof_ref pr(m_asserted_formula_prs.get(i, 0), m_manager);
|
||||
TRACE("simplifier", tout << mk_pp(n, m_manager) << "\n";);
|
||||
if (m_manager.is_eq(n)) {
|
||||
expr * lhs = to_app(n)->get_arg(0);
|
||||
expr * rhs = to_app(n)->get_arg(1);
|
||||
if (m_manager.is_value(lhs) || m_manager.is_value(rhs)) {
|
||||
if (m_manager.is_value(lhs)) {
|
||||
std::swap(lhs, rhs);
|
||||
n = m_manager.mk_eq(lhs, rhs);
|
||||
pr = m_manager.mk_symmetry(pr);
|
||||
}
|
||||
if (!m_manager.is_value(lhs) && !m_simplifier.is_cached(lhs)) {
|
||||
if (i >= m_asserted_qhead) {
|
||||
new_exprs1.push_back(n);
|
||||
if (m_manager.proofs_enabled())
|
||||
new_prs1.push_back(pr);
|
||||
}
|
||||
TRACE("propagate_values", tout << "found:\n" << mk_pp(lhs, m_manager) << "\n->\n" << mk_pp(rhs, m_manager) << "\n";
|
||||
if (pr) tout << "proof: " << mk_pp(pr, m_manager) << "\n";);
|
||||
m_simplifier.cache_result(lhs, rhs, pr);
|
||||
found = true;
|
||||
continue;
|
||||
expr* lhs, *rhs;
|
||||
if (m_manager.is_eq(n, lhs, rhs) &&
|
||||
(m_manager.is_value(lhs) || m_manager.is_value(rhs))) {
|
||||
if (m_manager.is_value(lhs)) {
|
||||
std::swap(lhs, rhs);
|
||||
n = m_manager.mk_eq(lhs, rhs);
|
||||
pr = m_manager.mk_symmetry(pr);
|
||||
}
|
||||
if (!m_manager.is_value(lhs) && !m_simplifier.is_cached(lhs)) {
|
||||
if (i >= m_asserted_qhead) {
|
||||
new_exprs1.push_back(n);
|
||||
if (m_manager.proofs_enabled())
|
||||
new_prs1.push_back(pr);
|
||||
}
|
||||
TRACE("propagate_values", tout << "found:\n" << mk_pp(lhs, m_manager) << "\n->\n" << mk_pp(rhs, m_manager) << "\n";
|
||||
if (pr) tout << "proof: " << mk_pp(pr, m_manager) << "\n";);
|
||||
m_simplifier.cache_result(lhs, rhs, pr);
|
||||
found = true;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (i >= m_asserted_qhead) {
|
||||
|
|
|
@ -2028,29 +2028,36 @@ public:
|
|||
expr_ref_vector args(th.m);
|
||||
unsigned j = 0, k = 0;
|
||||
bool is_string = th.m_util.is_string(m_sort);
|
||||
for (unsigned i = 0; i < m_source.size(); ++i) {
|
||||
if (m_source[i] && is_string) {
|
||||
bv_util bv(th.m);
|
||||
rational val;
|
||||
unsigned sz;
|
||||
VERIFY(bv.is_numeral(values[j++], val, sz));
|
||||
svector<bool> val_as_bits;
|
||||
unsigned v = val.get_unsigned();
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
val_as_bits.push_back(1 == v % 2);
|
||||
v = v / 2;
|
||||
svector<unsigned> sbuffer;
|
||||
expr_ref result(th.m);
|
||||
if (is_string) {
|
||||
bv_util bv(th.m);
|
||||
rational val;
|
||||
unsigned sz;
|
||||
|
||||
for (unsigned i = 0; i < m_source.size(); ++i) {
|
||||
if (m_source[i]) {
|
||||
VERIFY(bv.is_numeral(values[j++], val, sz));
|
||||
}
|
||||
args.push_back(th.m_util.str.mk_string(zstring(sz, val_as_bits.c_ptr())));
|
||||
}
|
||||
else if (m_source[i]) {
|
||||
args.push_back(th.m_util.str.mk_unit(values[j++]));
|
||||
}
|
||||
else {
|
||||
args.push_back(m_strings[k++]);
|
||||
else {
|
||||
VERIFY(bv.is_numeral(m_strings[k++], val, sz));
|
||||
}
|
||||
sbuffer.push_back(val.get_unsigned());
|
||||
}
|
||||
result = th.m_util.str.mk_string(zstring(sbuffer.size(), sbuffer.c_ptr()));
|
||||
}
|
||||
else {
|
||||
for (unsigned i = 0; i < m_source.size(); ++i) {
|
||||
if (m_source[i]) {
|
||||
args.push_back(th.m_util.str.mk_unit(values[j++]));
|
||||
}
|
||||
else {
|
||||
args.push_back(m_strings[k++]);
|
||||
}
|
||||
}
|
||||
result = th.mk_concat(args, m_sort);
|
||||
th.m_rewrite(result);
|
||||
}
|
||||
expr_ref result = th.mk_concat(args, m_sort);
|
||||
th.m_rewrite(result);
|
||||
th.m_factory->add_trail(result);
|
||||
return to_app(result);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue