def deductions_post_paris(clauses, v, c, polarite_unique=True, verbose=False): global val global pile global niv poursuivre = True # Ajout rendu 3 : on répète les déductions tant qu'elles changent quelque # chose while poursuivre: poursuivre = False if polarite_unique: # On ne fait de déduction par polarité unique que si ce mode est activé for i in deduction.cherche_polarite_unique(clauses, v): if val[abs(i)] == 0: poursuivre = True val[abs(i)] = i // abs(i) if verbose: print(verbstr.format(niv, "Déduc", "Litt. {0} par pol. uniq.".format(i))) nouv_valide(clauses, pile, val, i, c, verbose) pile.append(Action("deduc_polarite_unique", abs(i), niv, [])) for i in range(c): if clauses[i].active: j, ind = deduction.unitaire(clauses[i], val) if j: poursuivre = True pile.append(Action("deduc_unitaire", abs(j), niv, [-x for x in clauses[i] if x != j])) if verbose: print(verbstr.format(niv, "Déduc", "Litt. {0} dans {1} par cl. unit.".format(j, i))) nouv_valide(clauses, pile, val, j, c, verbose) val[abs(j)] = j // abs(j) clauses[i].active = False
def pre_traite(clauses, c, v, verbose=False): global val global pile for cl in clauses : truc = deduction.pre_trait(cl, v) if truc == 0: raise IndexError # Clause vide -> blocage elif truc == 1: cl.active = False for i in deduction.cherche_polarite_unique(clauses, v): if verbose: print(verbstr.format(niv, "Déduc", "Litt. {0} par pol. uniq.".format(i))) val[abs(i)] = i // abs(i) nouv_valide(clauses, pile, val, i, c, verbose) pile = []