//returns 1 if all the clauses mentioning the variable are subsumed, 0 otherwise BOOLEAN sat_irrelevant_var(const Var* var) { for (c2dSize i = 0; i < sat_var_occurences(var); i++) { if (!sat_subsumed_clause(var->clauses[i])) return 0; } return 1; }
//returns 1 if all the clauses mentioning the variable are subsumed, 0 otherwise BOOLEAN sat_irrelevant_var(const Var* var) { c2dSize occurences = sat_var_occurences(var); for (c2dSize i = 0; i < occurences; i++) { Clause* clause = sat_clause_of_var(i, var); if (!sat_subsumed_clause(clause)) return 0; } return 1; }
void sat_restore_literal(SatState* sat_state, Lit* lit) { lit->implied = 0; Var* var = sat_literal_var(lit); for (c2dSize i = 0; i < sat_var_occurences(var); i++) { Clause* clause = sat_clause_of_var(i, var); if (sat_subsumed_clause(clause)) { clause->subsumed = sat_check_subsumed_clause(clause); if (!sat_subsumed_clause(clause)) vector_push(&sat_state->q, clause); } } for (c2dSize i = 0; i < vector_size(&var->mentions_lc); i++) { Clause* clause = vector_get(&var->mentions_lc, i); if (sat_subsumed_clause(clause)) { clause->subsumed = sat_check_subsumed_clause(clause); if (!sat_subsumed_clause(clause)) vector_push(&sat_state->q, clause); } } }
//applies unit resolution to the cnf of sat state //returns 1 if unit resolution succeeds, 0 if it finds a contradiction BOOLEAN sat_unit_resolution(SatState* sat_state) { BOOLEAN more = 1; while (more) { more = 0; for (c2dSize i = vector_size(&sat_state->q); i >= 1; i--) { Clause* clause = vector_get(&sat_state->q, i - 1); clause->subsumed = sat_check_subsumed_clause(clause); if (sat_subsumed_clause(clause)) { vector_erase(&sat_state->q, i - 1); continue; } BOOLEAN flag = 0; c2dSize pos; for (c2dSize j = 0; j < sat_clause_size(clause); j++) { Lit* lit = vector_get(&clause->lits, j); if (!sat_implied_literal(sat_opp_literal(lit))) { flag++; pos = j; if (flag == 2) break; } } if (flag == 0) { sat_state->ac = malloc(sizeof(Clause)); vector_init(&sat_state->ac->lits); sat_state->ac->subsumed = 0; sat_state->ac->mark = 0; if (vector_size(&sat_state->ds) > 0) { for (c2dSize j = 0; j < sat_var_count(sat_state); j++) { Var* var = vector_get(&sat_state->vars, j); var->u = var->level <= 1; } sat_get_assert_clause(sat_state, sat_state->ac, clause->index - 1, 0, vector_size(&sat_state->s) - 1); } return 0; } if (flag == 1) { Lit* lit = vector_get(&clause->lits, pos); lit->implied = 1; lit->locate = clause->index - 1; lit->var->level = vector_size(&sat_state->ds) + 1; vector_push(&sat_state->il, lit); vector_push(&sat_state->s, lit); clause->subsumed = 1; vector_erase(&sat_state->q, i - 1); more = 1; } } } return 1; }