mirror of
https://github.com/Z3Prover/z3
synced 2025-04-24 17:45:32 +00:00
na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
366e3dbb52
commit
2b6ae0070f
3 changed files with 24 additions and 18 deletions
|
@ -10,6 +10,17 @@ Author:
|
|||
Nikolaj Bjorner (nbjorner) 2021-03-19
|
||||
Jakob Rath 2021-04-6
|
||||
|
||||
Notes:
|
||||
|
||||
TODO: constraints containing v could be tracked incrementally when constraints are added/removed using an index.
|
||||
|
||||
TODO: try a final core reduction step or other core minimization
|
||||
|
||||
|
||||
TODO: maybe implement by marking literals instead (like SAT solvers are doing); if we need to iterate, keep an indexed_uint_set (from util/uint_set.h)
|
||||
(i.e., instead of keeping an explicit list of constraints as core, we just mark them.)
|
||||
(we still need the list though, for new/temporary constraints.)
|
||||
|
||||
--*/
|
||||
|
||||
#include "math/polysat/conflict_core.h"
|
||||
|
@ -124,9 +135,6 @@ namespace polysat {
|
|||
SASSERT((core_has_pos && clause_has_pos) || (core_has_neg && clause_has_neg));
|
||||
});
|
||||
|
||||
// TODO: maybe implement by marking literals instead (like SAT solvers are doing); if we need to iterate, keep an indexed_uint_set (from util/uint_set.h)
|
||||
// (i.e., instead of keeping an explicit list of constraints as core, we just mark them.)
|
||||
// (we still need the list though, for new/temporary constraints.)
|
||||
int j = 0;
|
||||
for (auto c : m_constraints)
|
||||
if (c->bvar() != var)
|
||||
|
@ -196,14 +204,14 @@ namespace polysat {
|
|||
LOG("model_level: " << model_level);
|
||||
clause_builder lemma(*m_solver);
|
||||
|
||||
// TODO: try a final core reduction step?
|
||||
|
||||
for (auto c : m_constraints) {
|
||||
if (!c->has_bvar())
|
||||
keep(c);
|
||||
lemma.push(~c);
|
||||
}
|
||||
|
||||
|
||||
// TODO: need to revisit this for when there are literals obtained by semantic propagation
|
||||
if (m_needs_model) {
|
||||
// TODO: add equalities corresponding to current model.
|
||||
// until we properly track variables (use marks from solver?), we just use all of them (reverted decision and the following ones should have been popped from the stack)
|
||||
|
@ -270,7 +278,7 @@ namespace polysat {
|
|||
return true;
|
||||
|
||||
// No value resolution method was successful => fall back to saturation and variable elimination
|
||||
while (true) { // TODO: limit?
|
||||
while (s().inc()) {
|
||||
// TODO: as a last resort, substitute v by m_value[v]?
|
||||
if (!try_saturate(v))
|
||||
break;
|
||||
|
@ -280,19 +288,12 @@ namespace polysat {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool conflict_core::try_eliminate(pvar v) {
|
||||
// TODO: could be tracked incrementally when constraints are added/removed
|
||||
vector<signed_constraint> v_constraints;
|
||||
bool conflict_core::try_eliminate(pvar v) {
|
||||
bool has_v = false;
|
||||
for (auto c : *this)
|
||||
if (c->contains_var(v)) {
|
||||
v_constraints.push_back(c);
|
||||
break;
|
||||
}
|
||||
|
||||
// Variable already eliminated trivially (does this ever happen?)
|
||||
if (v_constraints.empty())
|
||||
has_v |= c->contains_var(v);
|
||||
if (!has_v)
|
||||
return true;
|
||||
|
||||
for (auto* engine : ve_engines)
|
||||
if (engine->perform(*m_solver, v, *this))
|
||||
return true;
|
||||
|
|
|
@ -23,6 +23,11 @@ TODO: when we check that 'x' is "unary":
|
|||
- in principle, 'x' could be any polynomial. However, we need to divide the lhs by x, and we don't have general polynomial division yet.
|
||||
so for now we just allow the form 'value*variable'.
|
||||
(extension to arbitrary monomials for 'x' should be fairly easy too)
|
||||
|
||||
TODO:
|
||||
- resolve away the "problematic" premise (non-linear inequality etc) that is reduced by a saturation rule.
|
||||
- it would work by adding the explanations for the resolved premises to the reason clause
|
||||
- and removing the literal from the core
|
||||
--*/
|
||||
#include "math/polysat/saturation.h"
|
||||
#include "math/polysat/solver.h"
|
||||
|
|
|
@ -228,7 +228,7 @@ namespace polysat {
|
|||
void new_constraint(signed_constraint c, unsigned dep, bool activate);
|
||||
static void insert_constraint(signed_constraints& cs, signed_constraint c);
|
||||
|
||||
viable& get_viable() { return m_viable; }
|
||||
bool inc() { return m_lim.inc(); }
|
||||
|
||||
bool invariant();
|
||||
static bool invariant(signed_constraints const& cs);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue