13static bool no_all_negative_clauses (
struct kissat *
solver) {
14 clause *last_irredundant = kissat_last_irredundant_clause (
solver);
16 if (last_irredundant && last_irredundant < c)
24 goto CONTINUE_WITH_NEXT_CLAUSE;
27 CONTINUE_WITH_NEXT_CLAUSE:;
33 const unsigned lit =
LIT (idx);
34 const unsigned not_lit =
NOT (
lit);
49static bool no_all_positive_clauses (
struct kissat *
solver) {
50 clause *last_irredundant = kissat_last_irredundant_clause (
solver);
52 if (last_irredundant && last_irredundant < c)
60 goto CONTINUE_WITH_NEXT_CLAUSE;
63 CONTINUE_WITH_NEXT_CLAUSE:;
69 const unsigned lit =
LIT (idx);
84static int forward_false_satisfiable (
struct kissat *
solver) {
87 unsigned conflicts = 0;
92 if (
import.eliminated)
94 const unsigned lit =
import.lit;
95 const unsigned idx =
IDX (
lit);
100 const unsigned not_lit =
NOT (
lit);
115 "inconsistency after %u conflicts "
116 "forward assigning %u variables to false",
117 conflicts,
solver->level);
121 LOG (
"failed literal %s",
LOGLIT (not_lit));
129 "lucky inconsistency forward assigning to false");
139static int forward_true_satisfiable (
struct kissat *
solver) {
142 unsigned conflicts = 0;
145 if (!
import.imported)
147 if (
import.eliminated)
149 const unsigned lit =
import.lit;
150 const unsigned idx =
IDX (
lit);
164 const unsigned not_lit =
NOT (
lit);
170 "inconsistency after %u conflicts "
171 "forward assigning %u variables to true",
172 conflicts,
solver->level);
184 "lucky inconsistency forward assigning to true");
193static int backward_false_satisfiable (
struct kissat *
solver) {
196 unsigned conflicts = 0;
198 import *begin = BEGIN_STACK (solver->import);
199 import *end = END_STACK (solver->import);
202 const import import = *--p;
203 if (!
import.imported)
205 if (
import.eliminated)
207 const unsigned lit =
import.lit;
208 const unsigned idx =
IDX (
lit);
213 const unsigned not_lit =
NOT (
lit);
228 "inconsistency after %u conflicts "
229 "backward assigning %u variables to false",
230 conflicts,
solver->level);
234 LOG (
"failed literal %s",
LOGLIT (not_lit));
242 "lucky inconsistency backward assigning to false");
251static int backward_true_satisfiable (
struct kissat *
solver) {
254 unsigned conflicts = 0;
256 import *begin = BEGIN_STACK (solver->import);
257 import *end = END_STACK (solver->import);
260 const import import = *--p;
261 if (!
import.imported)
263 if (
import.eliminated)
265 const unsigned lit =
import.lit;
266 const unsigned idx =
IDX (
lit);
280 const unsigned not_lit =
NOT (
lit);
286 "inconsistency after %u conflicts "
287 "backward assigning %u variables to true",
288 conflicts,
solver->level);
300 "lucky inconsistency backward assigning to true");
325 if (no_all_negative_clauses (
solver)) {
329 const unsigned lit =
LIT (idx);
345 if (!res && no_all_positive_clauses (
solver)) {
349 const unsigned lit =
LIT (idx);
352 const unsigned not_lit =
NOT (
lit);
366 const unsigned active_before =
solver->active;
369 res = forward_false_satisfiable (
solver);
372 res = forward_true_satisfiable (
solver);
375 res = backward_false_satisfiable (
solver);
378 res = backward_true_satisfiable (
solver);
380 const unsigned active_after =
solver->active;
381 const unsigned units = active_before - active_after;
387 bool success = res || units;
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int kissat_analyze(kissat *solver, clause *conflict)
void kissat_backtrack_without_updating_phases(kissat *solver, unsigned new_level)
#define all_stack(T, E, S)
void kissat_internal_assume(kissat *solver, unsigned lit)
#define all_variables(IDX)
#define all_literals_in_clause(LIT, C)
#define KISSAT_assert(ignore)
int kissat_lucky(struct kissat *solver)
#define kissat_message(...)
#define kissat_verbose(...)
clause * kissat_probing_propagate(kissat *solver, clause *ignore, bool flush)
#define all_binary_blocking_watches(WATCH, WATCHES)