3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-23 09:05:31 +00:00

consolidate literals

This commit is contained in:
Nikolaj Bjorner 2021-05-20 12:58:27 -07:00
parent c959e28d4a
commit 03d2c5f3d0
9 changed files with 299 additions and 323 deletions

View file

@ -101,7 +101,7 @@ namespace smt {
out << "(clause";
for (unsigned i = 0; i < m_num_literals; i++) {
out << " ";
m_lits[i].display(out, m, bool_var2expr_map);
smt::display(out, m_lits[i], m, bool_var2expr_map);
}
return out << ")";
}
@ -110,7 +110,7 @@ namespace smt {
out << "(clause";
for (unsigned i = 0; i < m_num_literals; i++) {
out << " ";
m_lits[i].display_compact(out, bool_var2expr_map);
smt::display_compact(out, m_lits[i], bool_var2expr_map);
}
return out << ")";
}

View file

@ -3081,7 +3081,7 @@ namespace smt {
literal l2 = *set_it;
if (l2 != l) {
b_justification js(l);
TRACE("theory_case_split", tout << "case split literal "; l2.display(tout, m, m_bool_var2expr.data()); tout << std::endl;);
TRACE("theory_case_split", tout << "case split literal "; smt::display(tout, l2, m, m_bool_var2expr.data()); tout << std::endl;);
if (l2 == true_literal || l2 == false_literal || l2 == null_literal) continue;
assign(~l2, js);
if (inconsistent()) {
@ -4188,7 +4188,7 @@ namespace smt {
for (unsigned i = 0; i < num_lits; i++) {
display_literal(tout, v[i]);
tout << "\n";
v[i].display(tout, m, m_bool_var2expr.data());
smt::display(tout, v[i], m, m_bool_var2expr.data());
tout << "\n\n";
}
tout << "\n";);

View file

@ -1357,7 +1357,7 @@ namespace smt {
std::ostream& display_literal(std::ostream & out, literal l) const;
std::ostream& display_detailed_literal(std::ostream & out, literal l) const { l.display(out, m, m_bool_var2expr.data()); return out; }
std::ostream& display_detailed_literal(std::ostream & out, literal l) const { return smt::display(out, l, m, m_bool_var2expr.data()); }
void display_literal_info(std::ostream & out, literal l) const;

View file

@ -89,7 +89,7 @@ namespace smt {
}
std::ostream& context::display_literal(std::ostream & out, literal l) const {
l.display_compact(out, m_bool_var2expr.data()); return out;
smt::display_compact(out, l, m_bool_var2expr.data()); return out;
}
std::ostream& context::display_literals(std::ostream & out, unsigned num_lits, literal const * lits) const {
@ -120,7 +120,7 @@ namespace smt {
}
void context::display_literal_info(std::ostream & out, literal l) const {
l.display_compact(out, m_bool_var2expr.data());
smt::display_compact(out, l, m_bool_var2expr.data());
display_literal_smt2(out, l);
out << "relevant: " << is_relevant(bool_var2expr(l.var())) << ", val: " << get_assignment(l) << "\n";
}

View file

@ -22,41 +22,44 @@ Revision History:
namespace smt {
void literal::display(std::ostream & out, ast_manager & m, expr * const * bool_var2expr_map) const {
if (*this == true_literal)
std::ostream& display(std::ostream & out, literal lit, ast_manager & m, expr * const * bool_var2expr_map) {
if (lit == true_literal)
out << "true";
else if (*this == false_literal)
else if (lit == false_literal)
out << "false";
else if (*this == null_literal)
else if (lit == null_literal)
out << "null";
else if (sign())
out << "(not " << mk_bounded_pp(bool_var2expr_map[var()], m, 3) << ")";
else if (lit.sign())
out << "(not " << mk_bounded_pp(bool_var2expr_map[lit.var()], m, 3) << ")";
else
out << mk_bounded_pp(bool_var2expr_map[var()], m, 3);
out << mk_bounded_pp(bool_var2expr_map[lit.var()], m, 3);
return out;
}
void literal::display_smt2(std::ostream & out, ast_manager & m, expr * const * bool_var2expr_map) const {
if (*this == true_literal)
std::ostream& display_smt2(std::ostream & out, literal lit, ast_manager & m, expr * const * bool_var2expr_map) {
if (lit == true_literal)
out << "true";
else if (*this == false_literal)
else if (lit == false_literal)
out << "false";
else if (*this == null_literal)
else if (lit == null_literal)
out << "null";
else if (sign())
out << "(not " << mk_pp(bool_var2expr_map[var()], m, 3) << ")";
else if (lit.sign())
out << "(not " << mk_pp(bool_var2expr_map[lit.var()], m, 3) << ")";
else
out << mk_pp(bool_var2expr_map[var()], m, 3);
out << mk_pp(bool_var2expr_map[lit.var()], m, 3);
return out;
}
void literal::display_compact(std::ostream & out, expr * const * bool_var2expr_map) const {
if (*this == true_literal)
std::ostream& display_compact(std::ostream & out, literal lit, expr * const * bool_var2expr_map) {
if (lit == true_literal)
out << "true";
else if (*this == false_literal)
else if (lit == false_literal)
out << "false";
else if (sign())
out << "(not #" << bool_var2expr_map[var()]->get_id() << ")";
else if (lit.sign())
out << "(not #" << bool_var2expr_map[lit.var()]->get_id() << ")";
else
out << "#" << bool_var2expr_map[var()]->get_id();
out << "#" << bool_var2expr_map[lit.var()]->get_id();
return out;
}
std::ostream & operator<<(std::ostream & out, literal l) {
@ -72,24 +75,26 @@ namespace smt {
}
std::ostream & operator<<(std::ostream & out, const literal_vector & v) {
display(out, v.begin(), v.end());
::display(out, v.begin(), v.end());
return out;
}
void display_compact(std::ostream & out, unsigned num_lits, literal const * lits, expr * const * bool_var2expr_map) {
std::ostream& display_compact(std::ostream & out, unsigned num_lits, literal const * lits, expr * const * bool_var2expr_map) {
for (unsigned i = 0; i < num_lits; i++) {
if (i > 0)
out << " ";
lits[i].display_compact(out, bool_var2expr_map);
display_compact(out, lits[i], bool_var2expr_map);
}
return out;
}
void display_verbose(std::ostream & out, ast_manager& m, unsigned num_lits, literal const * lits, expr * const * bool_var2expr_map, char const* sep) {
std::ostream& display_verbose(std::ostream & out, ast_manager& m, unsigned num_lits, literal const * lits, expr * const * bool_var2expr_map, char const* sep) {
for (unsigned i = 0; i < num_lits; i++) {
if (i > 0)
out << sep;
lits[i].display(out, m, bool_var2expr_map);
display(out, lits[i], m, bool_var2expr_map);
}
return out;
}
/**

View file

@ -21,90 +21,30 @@ Revision History:
#include "ast/ast.h"
#include "smt/smt_types.h"
#include "util/approx_set.h"
#include "util/sat_literal.h"
namespace smt {
/**
\brief The literal b is represented by the value 2*b, and
the literal (not b) by the value 2*b + 1
*/
class literal {
int m_val;
public:
literal():m_val(-2) {
SASSERT(var() == null_bool_var && !sign());
}
explicit literal(bool_var v, bool sign = false):
m_val((v << 1) + static_cast<int>(sign)) {
}
bool_var var() const {
return m_val >> 1;
}
bool sign() const {
return m_val & 1;
}
int index() const {
return m_val;
}
void neg() {
m_val = m_val ^ 1;
}
friend literal operator~(literal l);
friend literal to_literal(int x);
void display(std::ostream & out, ast_manager & m, expr * const * bool_var2expr_map) const;
typedef sat::literal literal;
inline literal to_literal(int x) { return sat::to_literal(x); }
void display_smt2(std::ostream & out, ast_manager & m, expr * const * bool_var2expr_map) const;
void display_compact(std::ostream & out, expr * const * bool_var2expr_map) const;
unsigned hash() const { return m_val; }
};
inline bool operator==(literal l1, literal l2) {
return l1.index() == l2.index();
}
inline bool operator!=(literal l1, literal l2) {
return l1.index() != l2.index();
}
inline bool operator<(literal l1, literal l2) {
return l1.index() < l2.index();
}
inline literal operator~(literal l) {
literal r;
r.m_val = l.m_val ^ 1;
return r;
}
inline literal to_literal(int x) {
literal l;
l.m_val = x;
return l;
}
const literal null_literal;
const literal true_literal(true_bool_var, false);
const literal false_literal(true_bool_var, true);
typedef svector<literal> literal_vector;
typedef sbuffer<literal> literal_buffer;
std::ostream & operator<<(std::ostream & out, literal l);
std::ostream & operator<<(std::ostream & out, const literal_vector & v);
void display_compact(std::ostream & out, unsigned num_lits, literal const * lits, expr * const * bool_var2expr_map);
std::ostream& display(std::ostream & out, literal lit, ast_manager & m, expr * const * bool_var2expr_map);
std::ostream& display_smt2(std::ostream & out, literal lit, ast_manager & m, expr * const * bool_var2expr_map);
std::ostream& display_compact(std::ostream & out, literal lit, expr * const * bool_var2expr_map);
void display_verbose(std::ostream & out, ast_manager& m, unsigned num_lits, literal const * lits, expr * const * bool_var2expr_map, char const* sep = "\n");
std::ostream& display_compact(std::ostream & out, unsigned num_lits, literal const * lits, expr * const * bool_var2expr_map);
std::ostream& display_verbose(std::ostream & out, ast_manager& m, unsigned num_lits, literal const * lits, expr * const * bool_var2expr_map, char const* sep = "\n");
template<typename T>
void neg_literals(unsigned num_lits, literal const * lits, T & result) {
@ -112,9 +52,6 @@ namespace smt {
result.push_back(~lits[i]);
}
struct literal2unsigned { unsigned operator()(literal l) const { return l.index(); } };
typedef approx_set_tpl<literal, literal2unsigned> literal_approx_set;
bool backward_subsumption(unsigned num_lits1, literal const * lits1, unsigned num_lits2, literal const * lits2);
};