mirror of
https://github.com/Z3Prover/z3
synced 2025-08-24 03:57:51 +00:00
Polysat: forbidden intervals updates (#5230)
* Pop assign_eh * Fix scoped_ptr_vector constructors, add detach() * Need to copy the returned lemma * Add test * Basic inequality tests * Return disjunctive lemma to caller
This commit is contained in:
parent
d6e41de344
commit
0c4824f194
9 changed files with 189 additions and 24 deletions
|
@ -16,7 +16,7 @@ namespace polysat {
|
|||
lbool result = check_sat();
|
||||
if (result != l_undef)
|
||||
return result;
|
||||
auto const& new_lemma = get_lemma();
|
||||
auto const new_lemma = get_lemma();
|
||||
// Empty lemma => check_sat() terminated for another reason, e.g., resource limits
|
||||
if (new_lemma.empty())
|
||||
return l_undef;
|
||||
|
@ -46,6 +46,24 @@ namespace polysat {
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Testing the solver's internal state.
|
||||
*/
|
||||
|
||||
/// Creates two separate conflicts (from narrowing) before solving loop is started.
|
||||
static void test_add_conflicts() {
|
||||
scoped_solver s;
|
||||
auto a = s.var(s.add_var(3));
|
||||
auto b = s.var(s.add_var(3));
|
||||
s.add_eq(a + 1);
|
||||
s.add_eq(a + 2);
|
||||
s.add_eq(b + 1);
|
||||
s.add_eq(b + 2);
|
||||
s.check();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* most basic linear equation solving.
|
||||
* they should be solvable.
|
||||
|
@ -125,6 +143,73 @@ namespace polysat {
|
|||
s.check();
|
||||
}
|
||||
|
||||
// Unique solution: u = 5
|
||||
static void test_ineq_basic1() {
|
||||
scoped_solver s;
|
||||
auto u = s.var(s.add_var(4));
|
||||
auto zero = u - u;
|
||||
s.add_ule(u, zero + 5);
|
||||
s.add_ule(zero + 5, u);
|
||||
s.check();
|
||||
}
|
||||
|
||||
// Unsatisfiable
|
||||
static void test_ineq_basic2() {
|
||||
scoped_solver s;
|
||||
auto u = s.var(s.add_var(4));
|
||||
auto zero = u - u;
|
||||
s.add_ult(u, zero + 5);
|
||||
s.add_ule(zero + 5, u);
|
||||
s.check();
|
||||
}
|
||||
|
||||
// Solutions with u = v = w
|
||||
static void test_ineq_basic3() {
|
||||
scoped_solver s;
|
||||
auto u = s.var(s.add_var(4));
|
||||
auto v = s.var(s.add_var(4));
|
||||
auto w = s.var(s.add_var(4));
|
||||
s.add_ule(u, v);
|
||||
s.add_ule(v, w);
|
||||
s.add_ule(w, u);
|
||||
s.check();
|
||||
}
|
||||
|
||||
// Unsatisfiable
|
||||
static void test_ineq_basic4() {
|
||||
scoped_solver s;
|
||||
auto u = s.var(s.add_var(4));
|
||||
auto v = s.var(s.add_var(4));
|
||||
auto w = s.var(s.add_var(4));
|
||||
s.add_ule(u, v);
|
||||
s.add_ult(v, w);
|
||||
s.add_ule(w, u);
|
||||
s.check();
|
||||
}
|
||||
|
||||
// Satisfiable
|
||||
// Without forbidden intervals, we just try values for u until it works
|
||||
static void test_ineq_basic5() {
|
||||
scoped_solver s;
|
||||
auto u = s.var(s.add_var(4));
|
||||
auto v = s.var(s.add_var(4));
|
||||
auto zero = u - u;
|
||||
s.add_ule(zero + 12, u + v);
|
||||
s.add_ule(v, zero + 2);
|
||||
s.check();
|
||||
}
|
||||
|
||||
// Like 5 but the other forbidden interval will be the longest
|
||||
static void test_ineq_basic6() {
|
||||
scoped_solver s;
|
||||
auto u = s.var(s.add_var(4));
|
||||
auto v = s.var(s.add_var(4));
|
||||
auto zero = u - u;
|
||||
s.add_ule(zero + 14, u + v);
|
||||
s.add_ule(v, zero + 2);
|
||||
s.check();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check unsat of:
|
||||
|
@ -290,6 +375,7 @@ namespace polysat {
|
|||
|
||||
|
||||
void tst_polysat() {
|
||||
polysat::test_add_conflicts();
|
||||
polysat::test_l1();
|
||||
polysat::test_l2();
|
||||
polysat::test_l3();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue