Beispiel #1
0
class PropagatingFormula:

    SATISFIED: State = Formula.SATISFIED
    UNRESOLVED: State = Formula.UNRESOLVED
    UNSATISFIED: State = Formula.UNSATISFIED

    def __init__(self: PropagatingFormula, file_object: TextIO) -> None:
        self.formula = Formula(file_object)
        self.decision_level: DecisionLevel = 0
        self.propagate()
        self.decision_history: List[Optional[Tuple[Variable, Value]]] = [None]

    def _sat_variable_value_from_unit_clause(
            self: PropagatingFormula,
            clause: Clause) -> Tuple[Variable, Value]:
        head_lit, _ = clause.get_head_tail_lit()
        return abs(head_lit), 0 if head_lit < 0 else 1

    def propagate(self: PropagatingFormula) -> None:
        while self.formula.get_unit_clauses() and self.formula.UNRESOLVED:
            clause = next(iter(self.formula.get_unit_clauses()))
            variable, value = self._sat_variable_value_from_unit_clause(clause)
            self.formula.assign(self.decision_level, variable, value, clause)

    def add_clause(self: PropagatingFormula, clause: List[int]) -> None:
        self.formula.add_clause(clause)
        self.propagate()

    def assign(self: PropagatingFormula, variable: Variable,
               value: Value) -> None:
        self.decision_level += 1
        self.formula.assign(self.decision_level, variable, value, None)
        self.decision_history.append((variable, value))
        self.propagate()

    def get_current_state(self: PropagatingFormula) -> State:
        return self.formula.get_current_state()

    def get_current_decision_level(self: PropagatingFormula) -> DecisionLevel:
        return self.decision_level

    def backtrack(self: PropagatingFormula, d: DecisionLevel) -> None:
        self.decision_level = d
        self.formula.backtrack(d)
        while len(self.decision_history) > d:
            self.decision_history.pop()

    def get_partial_assignment(self: PropagatingFormula) -> Assignment:
        return self.formula.get_partial_assignment()

    def get_unit_clauses(self: PropagatingFormula) -> Set[Clause]:
        return self.formula.get_unit_clauses()

    def get_unsat_clauses(self: PropagatingFormula) -> Set[Clause]:
        return self.formula.get_unsat_clauses()

    def get_decision_level(self: PropagatingFormula) -> DecisionLevel:
        return self.formula.get_decision_level()
def prog_28(fname):

    # TODO:::::::::::::::::::::::::::
    from formula import Formula
    import solver

    formulas = {}

    f = open(fname)

    ns = eval(f.readline().strip())
    f.readline()

    for i in xrange(ns):
        formula = Formula()


        line = f.readline().strip()
        cnt = 0
        while line:
            if cnt == 0:
                line = f.readline().strip()
                cnt +=1
                continue
            e1,e2 = map(int, line.split())
            formula.add_clause((e1,e2))
            line = f.readline().strip()

        formulas[i] = formula


    f.close()

    # print random_formula(2,6)

    for i in xrange(ns):
        formula = formulas[i]
        # print formula
        flg = solver.satisfiable(formula)
        if flg:
            print 1,
            sg = max(solver.find_component(formula), key=len)

            for n in sorted(sg):
                print n,



        else:
            print 0,

        print