示例#1
0
 def _search_solver_helper(self, sent, symbols):    
     m = sent.implicit_model()
     unassigned_symbols = sorted(symbols - m.keys())  # TODO: different orders
     if len(unassigned_symbols) == 0:
         if sent.check_model(m):
             return m
         else:
             return None
     else:
         next_symbol = unassigned_symbols[0]
         negative_unit_clause = Clause([Literal(next_symbol, polarity=False)])
         closure = limited_unit_resolution_closure(negative_unit_clause,
                                                   sent.clauses)
         if cnf.c('FALSE') not in closure:
             sat_if_false = self._search_solver_helper(Cnf(closure), symbols) 
             if sat_if_false != None: # early termination if already satisfied
                 return sat_if_false
         positive_unit_clause = Clause([Literal(next_symbol, polarity=True)])
         closure = limited_unit_resolution_closure(positive_unit_clause,
                                                   sent.clauses)
         if cnf.c('FALSE') not in closure:                
             sat_if_true = self._search_solver_helper(Cnf(closure), symbols)
             return sat_if_true 
         else:
             return None
示例#2
0
    def _search_solver_helper(self, sent, symbols):
        def assign(model_so_far, symbol, bool_assignment):
            if bool_assignment:
                assignment = 1
            else:
                assignment = -1
            return {**model_so_far, symbol: assignment}

        self.visited += 1
        if sent is None:
            return None
        m = sent.current_assignment()
        unassigned_symbols = sorted(symbols -
                                    m.keys())  # TODO: different orders
        if len(unassigned_symbols) == 0:
            if sent.check_term(m):
                return m
            else:
                return None
        else:
            next_symbol = unassigned_symbols[0]
            positive_unit_clause = Clause([Literal(next_symbol, neg=False)])
            new_clauses = unit_resolution(positive_unit_clause, sent)
            sat_if_true = self._search_solver_helper(new_clauses, symbols)
            if sat_if_true != None:  # early termination if already satisfied
                return sat_if_true
            negative_unit_clause = Clause([Literal(next_symbol, neg=True)])
            new_clauses = unit_resolution(negative_unit_clause, sent)
            sat_if_false = self._search_solver_helper(new_clauses, symbols)
            return sat_if_false
 def _max_one_color(self, cnf):
   for country in self.G.nodes():
     for color_combos in combinations(self.colors, 2):
       clause = Clause()
       clause.add_literal( -self._convert_to_literal(country, color_combos[0]) )
       clause.add_literal( -self._convert_to_literal(country, color_combos[1]) )
       clause.end()
       cnf.add_clause(clause)
 def _at_leat_one_color(self, cnf):
   for country in self.G.nodes():
     clause = Clause()
     for color in self.colors:
       literal = self._convert_to_literal(country, color)
       clause.add_literal(literal)
     clause.end()
     cnf.add_clause(clause)
示例#5
0
def generate_random_clause(k, N):
    variables = choose(N, k)
    literals = []
    for var in variables:
        neg = random.choice([True, False])
        literal = Literal(str(var), neg)
        literals.append(literal)
    return Clause(literals)
 def _max_one_color(self, cnf):
     for country in self.G.nodes():
         for color_combos in combinations(self.colors, 2):
             clause = Clause()
             clause.add_literal(
                 -self._convert_to_literal(country, color_combos[0]))
             clause.add_literal(
                 -self._convert_to_literal(country, color_combos[1]))
             clause.end()
             cnf.add_clause(clause)
 def _different_colors(self, cnf):
     for country in self.G.nodes():
         for neighbor in self.G.neighbors(country):
             for color in self.colors:
                 clause = Clause()
                 clause.add_literal(
                     -self._convert_to_literal(country, color))
                 clause.add_literal(
                     -self._convert_to_literal(neighbor, color))
                 clause.end()
                 cnf.add_clause(clause)
示例#8
0
 def _search_solver_helper(self, sent, symbols):                       
     m = sent.implicit_model()
     unassigned_symbols = sorted(symbols - m.keys())
     if len(unassigned_symbols) == 0:
         if sent.check_model(m):
             return m, [m]
         else:
             return None, [m]
     else:
         next_symbol = unassigned_symbols[0]
         negative_unit_clause = Clause([Literal(next_symbol, polarity=False)])
         sent_if_false = Cnf(sent.clauses | { negative_unit_clause })            
         sat_if_false, models_if_false = self._search_solver_helper(sent_if_false, symbols)            
         if sat_if_false != None: # early termination if already satisfied
             return sat_if_false, models_if_false
         positive_unit_clause = Clause([Literal(next_symbol, polarity=True)])
         sent_if_true = Cnf(sent.clauses | { positive_unit_clause })
         sat_if_true, models_if_true = self._search_solver_helper(sent_if_true, symbols) 
         return sat_if_true, models_if_false + models_if_true  
 def _different_colors(self, cnf):
   for country in self.G.nodes():
     for neighbor in self.G.neighbors(country):
       for color in self.colors:
         clause = Clause()
         clause.add_literal( -self._convert_to_literal(country, color) )
         clause.add_literal( -self._convert_to_literal(neighbor, color) )
         clause.end()
         cnf.add_clause(clause)
 def _at_leat_one_color(self, cnf):
     for country in self.G.nodes():
         clause = Clause()
         for color in self.colors:
             literal = self._convert_to_literal(country, color)
             clause.add_literal(literal)
         clause.end()
         cnf.add_clause(clause)