mirror of
https://github.com/Z3Prover/z3
synced 2025-04-28 19:35:50 +00:00
parent
8af245a410
commit
44d2f6da6c
8 changed files with 232 additions and 100 deletions
|
@ -17,22 +17,24 @@ namespace nla {
|
|||
|
||||
class mon_eq {
|
||||
// fields
|
||||
bool m_sign;
|
||||
lp::var_index m_v;
|
||||
svector<lp::var_index> m_vs;
|
||||
public:
|
||||
// constructors
|
||||
mon_eq(lp::var_index v, unsigned sz, lp::var_index const* vs):
|
||||
m_v(v), m_vs(sz, vs) {
|
||||
mon_eq(bool sign, lp::var_index v, unsigned sz, lp::var_index const* vs):
|
||||
m_sign(sign), m_v(v), m_vs(sz, vs) {
|
||||
std::sort(m_vs.begin(), m_vs.end());
|
||||
}
|
||||
mon_eq(lp::var_index v, const svector<lp::var_index> &vs):
|
||||
m_v(v), m_vs(vs) {
|
||||
mon_eq(bool sign, lp::var_index v, const svector<lp::var_index> &vs):
|
||||
m_sign(sign), m_v(v), m_vs(vs) {
|
||||
std::sort(m_vs.begin(), m_vs.end());
|
||||
}
|
||||
mon_eq() {}
|
||||
mon_eq():m_sign(false), m_v(UINT_MAX) {}
|
||||
|
||||
unsigned var() const { return m_v; }
|
||||
unsigned size() const { return m_vs.size(); }
|
||||
bool sign() const { return m_sign; }
|
||||
const svector<lp::var_index>& vars() const { return m_vs; }
|
||||
svector<lp::var_index>& vars() { return m_vs; }
|
||||
bool empty() const { return m_vs.empty(); }
|
||||
|
@ -41,30 +43,30 @@ public:
|
|||
// support the congruence
|
||||
class monic: public mon_eq {
|
||||
// fields
|
||||
svector<lpvar> m_rvars;
|
||||
bool m_rsign;
|
||||
svector<lpvar> m_rvars;
|
||||
bool m_rsign;
|
||||
mutable unsigned m_visited;
|
||||
public:
|
||||
// constructors
|
||||
monic(lpvar v, unsigned sz, lpvar const* vs, unsigned idx): monic(v, svector<lpvar>(sz, vs), idx) {
|
||||
monic(bool sign, lpvar v, unsigned sz, lpvar const* vs, unsigned idx):
|
||||
monic(sign, v, svector<lpvar>(sz, vs), idx) {
|
||||
}
|
||||
monic(lpvar v, const svector<lpvar> &vs, unsigned idx) : mon_eq(v, vs), m_rsign(false), m_visited(0) {
|
||||
monic(bool sign, lpvar v, const svector<lpvar> &vs, unsigned idx):
|
||||
mon_eq(sign, v, vs), m_rsign(false), m_visited(0) {
|
||||
std::sort(vars().begin(), vars().end());
|
||||
}
|
||||
|
||||
unsigned visited() const { return m_visited; }
|
||||
unsigned& visited() { return m_visited; }
|
||||
void set_visited(unsigned v) { m_visited = v; }
|
||||
svector<lpvar> const& rvars() const { return m_rvars; }
|
||||
bool rsign() const { return m_rsign; }
|
||||
void reset_rfields() { m_rsign = false; m_rvars.reset(); SASSERT(m_rvars.size() == 0); }
|
||||
void reset_rfields() { m_rsign = sign(); m_rvars.reset(); SASSERT(m_rvars.size() == 0); }
|
||||
void push_rvar(signed_var sv) { m_rsign ^= sv.sign(); m_rvars.push_back(sv.var()); }
|
||||
void sort_rvars() {
|
||||
std::sort(m_rvars.begin(), m_rvars.end());
|
||||
}
|
||||
void sort_rvars() { std::sort(m_rvars.begin(), m_rvars.end()); }
|
||||
};
|
||||
|
||||
inline std::ostream& operator<<(std::ostream& out, monic const& m) {
|
||||
return out << m.var() << " := " << m.vars() << " r ( " << sign_to_rat(m.rsign()) << " * " << m.rvars() << ")";
|
||||
return out << m.var() << " := " << (m.sign()?"- ":"") << m.vars() << " r ( " << (m.rsign()?"- ":"") << m.rvars() << ")";
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue