Exemple #1
0
void clause_list_insert(samp_clause_t *clause, samp_clause_list_t *list,
		samp_clause_t *ptr) {
	assert(valid_clause_list(list));
	clause->link = ptr->link;
	ptr->link = clause;
	if (list->tail == ptr) { /* insert at the end */
		list->tail = clause;
	}
	list->length++;
	assert(valid_clause_list(list));
}
Exemple #2
0
samp_clause_t *clause_list_pop(samp_clause_list_t *list, samp_clause_t *ptr) {
	assert(valid_clause_list(list));
	assert(ptr != list->tail); /* pointer cannot be the tail */
	samp_clause_t *clause = ptr->link;
	if (list->tail == clause) {
		list->tail = ptr;
	}
	ptr->link = clause->link;
	clause->link = NULL;
	list->length--;
	assert(valid_clause_list(list));
	return clause;
}
Exemple #3
0
void clause_list_concat(samp_clause_list_t *list_src, samp_clause_list_t *list_dst) {
	assert(valid_clause_list(list_src));
	assert(valid_clause_list(list_dst));
	list_dst->tail->link = list_src->head->link;
	if (!is_empty_clause_list(list_src)) {
		list_dst->tail = list_src->tail;
	}
	list_dst->length += list_src->length;
	list_src->head->link = NULL;
	list_src->tail = list_src->head;
	list_src->length = 0;
	assert(valid_clause_list(list_src));
	assert(valid_clause_list(list_dst));
}
Exemple #4
0
void init_clause_list(samp_clause_list_t *list) {
	/* sentinel */
	list->head = (samp_clause_t *) safe_malloc(sizeof(samp_clause_t));
	list->head->link = NULL;
	list->tail = list->head;
	list->length = 0;
	assert(valid_clause_list(list));
}
Exemple #5
0
static bool valid_watched_lit(rule_inst_table_t *rule_inst_table, samp_literal_t lit,
		atom_table_t *atom_table) {
	valid_clause_list(&rule_inst_table->watched[lit]);

	bool lit_true = (is_pos(lit) && assigned_true(atom_table->assignment[var_of(lit)]))
	             || (is_neg(lit) && assigned_false(atom_table->assignment[var_of(lit)]));
	assert(is_empty_clause_list(&rule_inst_table->watched[lit]) || lit_true);
	if (!is_empty_clause_list(&rule_inst_table->watched[lit]) && !lit_true) {
		return false;
	}

	samp_clause_t *ptr;
	samp_clause_t *cls;
	for (ptr = rule_inst_table->watched[lit].head;
			ptr != rule_inst_table->watched[lit].tail;
			ptr = next_clause_ptr(ptr)) {
		cls = ptr->link;
		assert(clause_contains_lit(cls, lit));
		if (!clause_contains_lit(cls, lit))
			return false;
	}
	return true;
}
Exemple #6
0
/*
 * Validate all the lists in the clause table
 */
bool valid_rule_inst_table(rule_inst_table_t *rule_inst_table, atom_table_t *atom_table){
	samp_clause_t *ptr;
	samp_clause_t *cls;
	int32_t lit, i;
	assert(rule_inst_table->size >= 0);
	assert(rule_inst_table->num_rule_insts >= 0);
	assert(rule_inst_table->num_rule_insts <= rule_inst_table->size);
	if (rule_inst_table->size < 0) return false;
	if (rule_inst_table->num_rule_insts < 0 
			|| rule_inst_table->num_rule_insts > rule_inst_table->size)
		return false;

	/* check that every clause in the unsat list is unsat */
	valid_clause_list(&rule_inst_table->unsat_clauses);
	for (ptr = rule_inst_table->unsat_clauses.head;
			ptr != rule_inst_table->unsat_clauses.tail;
			ptr = next_clause_ptr(ptr)) {
		cls = ptr->link;
		assert(eval_clause(atom_table->assignment, cls) == -1);
		if (eval_clause(atom_table->assignment, cls) != -1)
			return false;
	}

	///* check negative_or_unit_clauses */
	//valid_clause_list(&rule_inst_table->negative_or_unit_clauses);
	//for (ptr = rule_inst_table->negative_or_unit_clauses.head;
	//		ptr != rule_inst_table->negative_or_unit_clauses.tail;
	//		ptr = next_clause_ptr(ptr)) {
	//	cls = ptr->link;
	//	assert(cls->weight < 0 || cls->numlits == 1);
	//	if (cls->weight >= 0 && cls->numlits != 1) 
	//		return false;
	//}

	///* check dead_negative_or_unit_clauses */
	//valid_clause_list(&rule_inst_table->dead_negative_or_unit_clauses);
	//for (ptr = rule_inst_table->dead_negative_or_unit_clauses.head;
	//		ptr != rule_inst_table->dead_negative_or_unit_clauses.tail;
	//		ptr = next_clause_ptr(ptr)) {
	//	cls = ptr->link;
	//	assert(cls->weight < 0 || cls->numlits == 1);
	//	if (cls->weight >= 0 && cls->numlits != 1) 
	//		return false;
	//}

	/* check that every watched clause is satisfied */
	for (i = 0; i < atom_table->num_vars; i++) {
		lit = pos_lit(i);
		valid_watched_lit(rule_inst_table, lit, atom_table);

		lit = neg_lit(i);
		valid_watched_lit(rule_inst_table, lit, atom_table);
	}

	/* check the sat_clauses to see if the first disjunct is fixed true */
	valid_clause_list(&rule_inst_table->sat_clauses);
	for (ptr = rule_inst_table->sat_clauses.head;
			ptr != rule_inst_table->sat_clauses.tail;
			ptr = next_clause_ptr(ptr)) {
		cls = ptr->link;
		assert(clause_contains_fixed_true_lit(cls, atom_table->assignment));
		if (!clause_contains_fixed_true_lit(cls, atom_table->assignment))
			return false;
	}
	
	/* check the live_clauses */
	valid_clause_list(&rule_inst_table->sat_clauses);

	/* check all the clauses to see if they are properly indexed */
	rule_inst_t *rinst;
	for (i = 0; i < rule_inst_table->num_rule_insts; i++){
		rinst = rule_inst_table->rule_insts[i];
		assert(rinst->num_clauses >= 0);
		if (rinst->num_clauses < 0) 
			return false;
		//for (j = 0; j < clause->numlits; j++){
		//	assert(var_of(clause->disjunct[j]) >= 0);
		//	assert(var_of(clause->disjunct[j]) < atom_table->num_vars);
		//	if (var_of(clause->disjunct[j]) < 0 ||
		//			var_of(clause->disjunct[j]) >= atom_table->num_vars)
		//		return false;
		//}
	}
	return true;
}