mirror of
https://github.com/Z3Prover/z3
synced 2025-04-28 11:25:51 +00:00
71 lines
1.8 KiB
C++
71 lines
1.8 KiB
C++
/*++
|
|
Copyright (c) 2017 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ba_constraint.cpp
|
|
|
|
Abstract:
|
|
|
|
Interface for constraints.
|
|
|
|
Author:
|
|
|
|
Nikolaj Bjorner (nbjorner) 2017-01-30
|
|
|
|
--*/
|
|
|
|
#include "sat/smt/pb_constraint.h"
|
|
|
|
namespace pb {
|
|
|
|
unsigned constraint::fold_max_var(unsigned w) const {
|
|
if (lit() != sat::null_literal) w = std::max(w, lit().var());
|
|
for (unsigned i = 0; i < size(); ++i) w = std::max(w, get_lit(i).var());
|
|
return w;
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& out, constraint const& cnstr) {
|
|
if (cnstr.lit() != sat::null_literal) out << cnstr.lit() << " == ";
|
|
return cnstr.display(out);
|
|
}
|
|
|
|
bool constraint::is_watched(solver_interface const& s, literal lit) const {
|
|
return s.get_wlist(~lit).contains(sat::watched(cindex()));
|
|
}
|
|
|
|
void constraint::unwatch_literal(solver_interface& s, literal lit) {
|
|
sat::watched w(cindex());
|
|
s.get_wlist(~lit).erase(w);
|
|
SASSERT(!is_watched(s, lit));
|
|
}
|
|
|
|
void constraint::watch_literal(solver_interface& s, literal lit) {
|
|
if (is_pure() && lit == ~this->lit()) return;
|
|
SASSERT(!is_watched(s, lit));
|
|
sat::watched w(cindex());
|
|
s.get_wlist(~lit).push_back(w);
|
|
}
|
|
|
|
void constraint::nullify_tracking_literal(solver_interface& s) {
|
|
if (lit() != sat::null_literal) {
|
|
unwatch_literal(s, lit());
|
|
unwatch_literal(s, ~lit());
|
|
nullify_literal();
|
|
}
|
|
}
|
|
|
|
bool constraint::well_formed() const {
|
|
uint_set vars;
|
|
if (lit() != sat::null_literal) vars.insert(lit().var());
|
|
for (unsigned i = 0; i < size(); ++i) {
|
|
bool_var v = get_lit(i).var();
|
|
if (vars.contains(v)) return false;
|
|
if (get_coeff(i) > k()) return false;
|
|
vars.insert(v);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
}
|