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; }