Ejemplo n.º 1
0
//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;
}
Ejemplo n.º 2
0
//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;
}
Ejemplo n.º 3
0
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);
		}
	}
}
Ejemplo n.º 4
0
//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;
}