mirror of
https://github.com/Z3Prover/z3
synced 2025-05-04 06:15:46 +00:00
smul no overflow
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
89d6f1c191
commit
8c9835bca6
24 changed files with 376 additions and 63 deletions
|
@ -80,6 +80,40 @@ namespace polysat {
|
|||
SASSERT(well_formed(m_units[v]));
|
||||
m_trail.pop_back();
|
||||
}
|
||||
|
||||
bool viable::intersect(pdd const & p, pdd const & q, signed_constraint const& sc) {
|
||||
pvar v = null_var;
|
||||
bool first = true;
|
||||
bool prop = false;
|
||||
if (p.is_unilinear())
|
||||
v = p.var();
|
||||
else if (q.is_unilinear())
|
||||
v = q.var(), first = false;
|
||||
else
|
||||
return prop;
|
||||
|
||||
try_viable:
|
||||
if (s.m_viable.intersect(v, sc)) {
|
||||
rational val;
|
||||
switch (s.m_viable.find_viable(v, val)) {
|
||||
case dd::find_t::singleton:
|
||||
s.propagate(v, val, sc); // TBD why is sc used as justification? It should be all of viable
|
||||
prop = true;
|
||||
break;
|
||||
case dd::find_t::empty:
|
||||
s.set_conflict(v);
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (first && q.is_unilinear() && q.var() != v) {
|
||||
v = q.var();
|
||||
first = false;
|
||||
goto try_viable;
|
||||
}
|
||||
return prop;
|
||||
}
|
||||
|
||||
bool viable::intersect(pvar v, signed_constraint const& c) {
|
||||
auto& fi = s.m_forbidden_intervals;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue