3
0
Fork 0
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:
Jakob Rath 2021-04-30 17:41:50 +02:00 committed by GitHub
parent d6e41de344
commit 0c4824f194
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 189 additions and 24 deletions

View file

@ -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();