mirror of
https://github.com/Z3Prover/z3
synced 2026-07-19 21:45:49 +00:00
improve logging
Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
parent
ebecfb8e6f
commit
fe6b777638
6 changed files with 99 additions and 40 deletions
|
|
@ -1159,67 +1159,89 @@ namespace upolynomial {
|
|||
}
|
||||
}
|
||||
|
||||
static void display_smt2_var_power(std::ostream & out, char const * var_name, unsigned k, bool allow_power) {
|
||||
SASSERT(k > 0);
|
||||
if (k == 1) {
|
||||
out << var_name;
|
||||
}
|
||||
else if (allow_power) {
|
||||
out << "(^ " << var_name << " " << k << ")";
|
||||
}
|
||||
else {
|
||||
out << "(*";
|
||||
for (unsigned i = 0; i < k; ++i)
|
||||
out << " " << var_name;
|
||||
out << ")";
|
||||
}
|
||||
}
|
||||
|
||||
static void display_smt2_monomial(std::ostream & out, numeral_manager & m, mpz const & n,
|
||||
unsigned k, char const * var_name) {
|
||||
unsigned k, char const * var_name, bool allow_power) {
|
||||
if (k == 0) {
|
||||
display_smt2_mumeral(out, m, n);
|
||||
}
|
||||
else if (m.is_one(n)) {
|
||||
if (k == 1)
|
||||
out << var_name;
|
||||
else
|
||||
out << "(^ " << var_name << " " << k << ")";
|
||||
display_smt2_var_power(out, var_name, k, allow_power);
|
||||
}
|
||||
else {
|
||||
out << "(* ";
|
||||
display_smt2_mumeral(out, m, n);
|
||||
out << " ";
|
||||
if (k == 1)
|
||||
out << var_name;
|
||||
else
|
||||
out << "(^ " << var_name << " " << k << ")";
|
||||
display_smt2_var_power(out, var_name, k, allow_power);
|
||||
out << ")";
|
||||
}
|
||||
}
|
||||
|
||||
// Display p as an s-expression
|
||||
std::ostream& core_manager::display_smt2(std::ostream & out, unsigned sz, numeral const * p, char const * var_name) const {
|
||||
static std::ostream& display_smt2_core(std::ostream & out, core_manager const& cm, unsigned sz, numeral const * p, char const * var_name, bool allow_power) {
|
||||
if (sz == 0) {
|
||||
out << "0";
|
||||
return out;
|
||||
}
|
||||
|
||||
if (sz == 1) {
|
||||
display_smt2_mumeral(out, m(), p[0]);
|
||||
display_smt2_mumeral(out, cm.m(), p[0]);
|
||||
return out;
|
||||
}
|
||||
|
||||
unsigned non_zero_idx = UINT_MAX;
|
||||
unsigned num_non_zeros = 0;
|
||||
for (unsigned i = 0; i < sz; i++) {
|
||||
if (m().is_zero(p[i]))
|
||||
if (cm.m().is_zero(p[i]))
|
||||
continue;
|
||||
non_zero_idx = i;
|
||||
num_non_zeros ++;
|
||||
}
|
||||
|
||||
if (num_non_zeros == 1) {
|
||||
SASSERT(non_zero_idx != UINT_MAX && non_zero_idx >= 1);
|
||||
display_smt2_monomial(out, m(), p[non_zero_idx], non_zero_idx, var_name);
|
||||
if (num_non_zeros == 1 && non_zero_idx != UINT_MAX) {
|
||||
if (non_zero_idx == 0) {
|
||||
display_smt2_mumeral(out, cm.m(), p[0]);
|
||||
return out;
|
||||
}
|
||||
display_smt2_monomial(out, cm.m(), p[non_zero_idx], non_zero_idx, var_name, allow_power);
|
||||
return out;
|
||||
}
|
||||
|
||||
out << "(+";
|
||||
unsigned i = sz;
|
||||
while (i > 0) {
|
||||
--i;
|
||||
if (!m().is_zero(p[i])) {
|
||||
if (!cm.m().is_zero(p[i])) {
|
||||
out << " ";
|
||||
display_smt2_monomial(out, m(), p[i], i, var_name);
|
||||
display_smt2_monomial(out, cm.m(), p[i], i, var_name, allow_power);
|
||||
}
|
||||
}
|
||||
return out << ")";
|
||||
}
|
||||
|
||||
// Display p as an s-expression
|
||||
std::ostream& core_manager::display_smt2(std::ostream & out, unsigned sz, numeral const * p, char const * var_name) const {
|
||||
return display_smt2_core(out, *this, sz, p, var_name, true);
|
||||
}
|
||||
|
||||
std::ostream& core_manager::display_smt2_no_power(std::ostream & out, unsigned sz, numeral const * p, char const * var_name) const {
|
||||
return display_smt2_core(out, *this, sz, p, var_name, false);
|
||||
}
|
||||
|
||||
bool core_manager::eq(unsigned sz1, numeral const * p1, unsigned sz2, numeral const * p2) {
|
||||
if (sz1 != sz2)
|
||||
return false;
|
||||
|
|
@ -3117,4 +3139,3 @@ namespace upolynomial {
|
|||
return out;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue