Beispiel #1
0
 def __help_fun(c1, c2, sos_new, sos_stage, clauses, clause_to_number,
                steps):
     # TODO refactor
     if c1 == c2:
         return [False, steps]
     for resolvent in Clause.pl_resolve(c1, c2):
         if resolvent and Clause.cnf_tautology(resolvent):
             continue
         if Clause.simplify_sets_by_clause_for_subsets(
                 resolvent, sos_new, sos_stage, clauses):
             break
         if resolvent not in clause_to_number:
             n1 = clause_to_number[c1]
             n2 = clause_to_number[c2]
             n1, n2 = (n2, n1) if (n1 > n2) else (n1, n2)
             steps += "{}. {} ({}, {})\n".format(
                 Resolution.clause_counter,
                 Clause.clause_to_string(resolvent) if resolvent else "NIL",
                 n1, n2)
             clause_to_number[resolvent] = Resolution.clause_counter
             Resolution.clause_counter += 1
             sos_new.add(resolvent)
         if not resolvent:
             return tuple([True, steps])
     return [False, steps]
Beispiel #2
0
    def evaluate(self):
        # return self._evaluate()
        result_clean = set()
        for clause in self._evaluate():
            if not Clause.cnf_tautology(clause) and clause != frozenset():
                result_clean.add(clause)

        if not result_clean:
            return {frozenset()}
        else:
            return result_clean
Beispiel #3
0
    def _refute_by_resolution(facts, goal) -> (bool, str):
        steps = ""
        Resolution.clause_counter = 1
        clause_to_number = {}

        goal_negated = Clause.cnf_negated(goal)

        clauses = set()
        clauses.update([x for x in facts if not Clause.cnf_tautology(x)])
        for clause in itertools.chain(facts, ["yolo"], goal_negated):
            if clause == "yolo":
                steps += Resolution.horizontal_line
                continue
            if clause not in clause_to_number:
                steps += "{}. {}\n".format(Resolution.clause_counter,
                                           Clause.clause_to_string(clause))
                clause_to_number[clause] = Resolution.clause_counter
                Resolution.clause_counter += 1
        steps += Resolution.horizontal_line

        sos = set()
        sos_stage = set()
        sos_stage.update(goal_negated)
        sos_new = set()

        Clause.simplify_within_set_for_subsets(clauses)
        Clause.simplify_within_set_for_subsets(sos_stage)
        Clause.simplify_among_two_sets_for_subsets(sos_stage, clauses)

        while True:
            # # I'm sorry for this for loop. TODO refactor later
            # for (c1, c2) in itertools.product(sos_stage, sos_stage):
            #     x, steps = Resolution.__help_fun(c1, c2, sos_new, sos_stage, clauses, clause_to_number, steps)
            #     if x:
            #         return [x, steps]
            # if sos_new:
            #     sos_stage.update(sos_new)
            #     sos_new = set()
            #     continue
            #
            # for (c1, c2) in itertools.product(sos_stage, sos):
            #     x, steps = Resolution.__help_fun(c1, c2, sos_new, sos_stage, clauses, clause_to_number, steps)
            #     if x:
            #         return [x, steps]
            # if sos_new:
            #     sos_stage.update(sos_new)
            #     sos_new = set()
            #     continue
            #
            # for (c1, c2) in itertools.product(sos_stage, clauses):
            #     x, steps = Resolution.__help_fun(c1, c2, sos_new, sos_stage, clauses, clause_to_number, steps)
            #     if x:
            #         return [x, steps]
            # if not sos_new:
            #     if not clauses:
            #         return tuple([False, steps])
            #     else:
            #         clauses, sos_new = set(), clauses
            # sos.update(sos_stage)
            # sos_stage, sos_new = sos_new, set()

            for (c1, c2) in itertools.chain(
                    itertools.product(sos_stage, sos_stage),
                    itertools.product(sos_stage, sos),
                    itertools.product(sos_stage, clauses)):
                x, steps = Resolution.__help_fun(c1, c2, sos_new, sos_stage,
                                                 clauses, clause_to_number,
                                                 steps)
                if x:
                    return [x, steps]
            if not sos_new:
                # if not clauses:
                return tuple([False, steps])
                # else:
                #     clauses, sos_new = set(), clauses
            sos.update(sos_stage)
            sos_stage, sos_new = sos_new, set()