70 lines
1.9 KiB
C
70 lines
1.9 KiB
C
#include "inline.h"
|
|
#include "weaken.h"
|
|
|
|
static void
|
|
push_witness_literal (kissat * solver, unsigned ilit)
|
|
{
|
|
assert (!VALUE (ilit));
|
|
int elit = kissat_export_literal (solver, ilit);
|
|
assert (elit);
|
|
LOG2 ("pushing external witness literal %d on extension stack", elit);
|
|
const extension ext = kissat_extension (true, elit);
|
|
PUSH_STACK (solver->extend, ext);
|
|
}
|
|
|
|
static void
|
|
push_clause_literal (kissat * solver, unsigned ilit)
|
|
{
|
|
const value value = VALUE (ilit);
|
|
assert (value <= 0);
|
|
if (value < 0)
|
|
LOG ("not pushing internal falsified clause literal %s "
|
|
"on extension stack", LOGLIT (ilit));
|
|
else
|
|
{
|
|
int elit = kissat_export_literal (solver, ilit);
|
|
assert (elit);
|
|
LOG2 ("pushing external clause literal %d on extension stack", elit);
|
|
const extension ext = kissat_extension (false, elit);
|
|
PUSH_STACK (solver->extend, ext);
|
|
}
|
|
}
|
|
|
|
#define LOGPUSHED(SIZE) \
|
|
do { \
|
|
LOGEXT ((SIZE), END_STACK (solver->extend) - (SIZE), \
|
|
"pushed size %zu witness labelled clause at", (size_t) (SIZE)); \
|
|
} while (0)
|
|
|
|
void
|
|
kissat_weaken_clause (kissat * solver, unsigned lit, clause * c)
|
|
{
|
|
INC (weakened);
|
|
LOGCLS (c, "blocking on %s and weakening", LOGLIT (lit));
|
|
push_witness_literal (solver, lit);
|
|
for (all_literals_in_clause (other, c))
|
|
if (lit != other)
|
|
push_clause_literal (solver, other);
|
|
LOGPUSHED (c->size);
|
|
}
|
|
|
|
void
|
|
kissat_weaken_binary (kissat * solver, unsigned lit, unsigned other)
|
|
{
|
|
INC (weakened);
|
|
LOGBINARY (lit, other, "blocking on %s and weakening", LOGLIT (lit));
|
|
push_witness_literal (solver, lit);
|
|
push_clause_literal (solver, other);
|
|
LOGPUSHED (2);
|
|
}
|
|
|
|
void
|
|
kissat_weaken_unit (kissat * solver, unsigned lit)
|
|
{
|
|
INC (weakened);
|
|
LOG ("blocking and weakening unit %s", LOGLIT (lit));
|
|
push_witness_literal (solver, lit);
|
|
LOGEXT (1, END_STACK (solver->extend) - 1,
|
|
"pushed witness labelled unit clause at");
|
|
}
|