268 {
271#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS) || defined(LOGGING)
272 const int checking = kissat_checking (
solver);
273 const bool logging = kissat_logging (
solver);
274 const bool proving = kissat_proving (
solver);
275#endif
276 if (elit) {
278#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS) || defined(LOGGING)
279 if (checking || logging || proving)
281#endif
283
288 if (!
solver->clause_satisfied) {
289 LOG (
"adding root level satisfied literal %u(%d)@0=1", ilit,
290 elit);
291 solver->clause_satisfied =
true;
292 }
293 }
else if (
value < 0) {
294 LOG (
"adding root level falsified literal %u(%d)@0=-1", ilit, elit);
295 if (!
solver->clause_shrink) {
296 solver->clause_shrink =
true;
297 LOG (
"thus original clause needs shrinking");
298 }
299 } else {
304 }
305 }
else if (
mark < 0) {
307 if (!
solver->clause_trivial) {
308 LOG (
"adding dual literal %u(%d) and %u(%d)",
NOT (ilit), -elit,
309 ilit, elit);
310 solver->clause_trivial =
true;
311 }
312 } else {
314 LOG (
"adding duplicated literal %u(%d)", ilit, elit);
315 if (!
solver->clause_shrink) {
316 solver->clause_shrink =
true;
317 LOG (
"thus original clause needs shrinking");
318 }
319 }
320 } else {
321#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS) || defined(LOGGING)
322 const size_t offset =
solver->offset_of_last_original_clause;
326#endif
331
333 LOG (
"inconsistent thus skipping original clause");
334 else if (
solver->clause_satisfied)
335 LOG (
"skipping satisfied original clause");
336 else if (
solver->clause_trivial)
337 LOG (
"skipping trivial original clause");
338 else {
340
341 if (!isize) {
342 if (
solver->clause_shrink)
343 LOG (
"all original clause literals root level falsified");
344 else
345 LOG (
"found empty original clause");
346
347 if (!
solver->inconsistent) {
348 LOG (
"thus solver becomes inconsistent");
349 solver->inconsistent =
true;
352 }
353 } else if (isize == 1) {
355
356 if (
solver->clause_shrink)
357 LOGUNARY (unit,
"original clause shrinks to");
358 else
360
362
366 } else {
368
369 const unsigned a = ilits[0];
370 const unsigned b = ilits[1];
371
374
375 const unsigned k = u ?
LEVEL (a) : UINT_MAX;
376 const unsigned l = v ?
LEVEL (b) : UINT_MAX;
377
378 bool assign = false;
379
380 if (!u && v < 0) {
381 LOG (
"original clause immediately forcing");
382 assign = true;
383 } else if (u < 0 && k == l) {
384 LOG (
"both watches falsified at level @%u", k);
388 } else if (u < 0) {
389 LOG (
"watches falsified at levels @%u and @%u", k, l);
393 assign = true;
394 } else if (u > 0 && v < 0) {
395 LOG (
"first watch satisfied at level @%u "
396 "second falsified at level @%u",
397 k, l);
399 } else if (!u && v > 0) {
400 LOG (
"first watch unassigned "
401 "second falsified at level @%u",
402 l);
403 assign = true;
404 } else {
407 }
408
409 if (assign) {
411
412 if (isize == 2) {
415 } else {
419 }
420 }
421 }
422 }
423
424#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS)
425 if (
solver->clause_satisfied ||
solver->clause_trivial) {
426#ifndef KISSAT_NDEBUG
427 if (checking > 1)
428 kissat_remove_checker_external (
solver, esize, elits);
429#endif
430#ifndef KISSAT_NPROOFS
431 if (proving) {
432 if (esize == 1)
433 LOG (
"skipping deleting unit from proof");
434 else
435 kissat_delete_external_from_proof (
solver, esize, elits);
436 }
437#endif
438 }
else if (!
solver->inconsistent &&
solver->clause_shrink) {
439#ifndef KISSAT_NDEBUG
440 if (checking > 1) {
441 kissat_check_and_add_internal (
solver, isize, ilits);
442 kissat_remove_checker_external (
solver, esize, elits);
443 }
444#endif
445#ifndef KISSAT_NPROOFS
446 if (proving) {
447 kissat_add_lits_to_proof (
solver, isize, ilits);
448 kissat_delete_external_from_proof (
solver, esize, elits);
449 }
450#endif
451 }
452#endif
453
454#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS) || defined(LOGGING)
455 if (checking) {
456 LOGINTS (esize, elits,
"saved original");
458 solver->offset_of_last_original_clause =
460 } else if (logging || proving) {
461 LOGINTS (esize, elits,
"reset original");
463 solver->offset_of_last_original_clause = 0;
464 }
465#endif
468
470
471 solver->clause_satisfied =
false;
472 solver->clause_trivial =
false;
473 solver->clause_shrink =
false;
474 }
475}
void kissat_original_unit(kissat *solver, unsigned lit)
void kissat_assign_binary(kissat *solver, unsigned lit, unsigned other)
void kissat_assign_reference(kissat *solver, unsigned lit, reference ref, clause *reason)
void kissat_backtrack_without_updating_phases(kissat *solver, unsigned new_level)
ABC_NAMESPACE_IMPL_START typedef signed char value
#define CHECK_AND_ADD_EMPTY(...)
#define ADD_UNCHECKED_EXTERNAL(...)
reference kissat_new_original_clause(kissat *solver)
void kissat_activate_literals(kissat *solver, unsigned size, unsigned *lits)
unsigned kissat_import_literal(kissat *solver, int elit)
#define KISSAT_assert(ignore)
#define ADD_EMPTY_TO_PROOF(...)
clause * kissat_search_propagate(kissat *solver)
ABC_NAMESPACE_HEADER_START typedef unsigned reference
#define kissat_require(COND,...)
#define kissat_require_valid_external_internal(LIT)
#define kissat_require_initialized(SOLVER)