Example #1
0
bool Solveur_cl::backtrack(vector<Clause*>& clauses, vector<Literal>& literals, vector<int>& paris){
	//On r?cup?re l'uip et on apprend la nouvelle clause + affichage du graphe.
	Literal& uip = literals[learn_clause(clauses, literals, paris)];

	//Si l'uip est 0 on ne peut pas backtrack.
	if(uip.getId() == 0)
		return false;

	Clause* last = clauses.back();
	int max = 0;

	//On cherche le rang maximum de la nouvelle clause.
	for(int var : last->getVariables()){
		if(abs(var) == uip.getId()){
			if(var<0)
				uip.setValue(false);
			else
				uip.setValue(true);
		}
		else if(literals[abs(var)].getLevel() > max)
			max = literals[abs(var)].getLevel();
	}

	//On d?truit toutes les d?ductions et les paris fait apr?s ce rang.
	while(paris.size() > (unsigned int)max+1){
		Solveur_deduction::backtrack(clauses, literals, paris);
	}

	Literal &lit = literals[paris.back()];
	paris.pop_back();

	for(int deduction : lit.getDeductions()){
	        Literal &ded = literals[deduction];
	        ded.setFixed(false);
	}

    lit.clearDeduct();
    lit.setFixed(false);
    lit.setPari(false);

    Literal &precedent = literals[paris.back()];
    precedent.addDeduct(uip.getId());
    uip.setLevel(precedent.getLevel());
    uip.clearValidate_Clauses();
    uip.addValidate_Clause(last);


    return true;
}