def SAT_solver_brute_force(CNF_formula, dictionary): """ Solves SAT problem by trying all the possibilities for variables in formula. """ if isinstance(CNF_formula, bf.Tru): #Formula is Tru / satisfiable - return dictionary with given values of variables return dictionary elif isinstance(CNF_formula, bf.Fls): # Formula is Fls -/ not satisfiable - return None return None else: # Take first variable and set its value to True variables = au.extract_variables(CNF_formula) dictionary[variables[0]] = bf.Tru() simplified_formula = CNF_formula.replace(dictionary) simplified_formula = au.simplify(simplified_formula) result = SAT_solver_brute_force(simplified_formula, dictionary) if result is not None: # Return dictionary if formula is satisfiable return result else: # Set same variable to False and try to solve again again dictionary[variables[0]] = bf.Fls() # replace and simplify formula simplified_formula = au.simplify(CNF_formula.replace(dictionary) ) return SAT_solver_brute_force(simplified_formula, dictionary)
def test_complex_extraction_of_values(self): """ Tests extracting values from a simple formula. Result must be [a, b, c]. """ a = bf.Var("a") b = bf.Var("b") c = bf.Var("c") formula = bf.And([bf.Or([b, a, c]), bf.Or([bf.Not(a), bf.Not(c)]), bf.Not(b)]) self.assertEqual(["a", "b", "c"], au.extract_variables(formula), "Invalid variables extracted, expected [a, b, c].")
def test_extracting_no_values(self): """ Tests extracting values where no values are present. Result must be empty list ([]). """ formula = bf.And([bf.Or([bf.Tru(), bf.Tru(), bf.Tru()]), bf.Or([bf.Not(bf.Tru()), bf.Not(bf.Tru())]), bf.Not(bf.Tru())]) self.assertEqual([], au.extract_variables(formula), "Invalid variables extracted, expected [].")
def test_extracting_one_value(self): """ Tests extracting values where only one value is present. Result must be [b]. """ self.assertEqual(["b"], au.extract_variables(bf.Var("b")), "Invalid variables extracted, expected [b].")
def test_simple_extraction_of_values(self): """ Tests extracting values from a simple formula. Result must be [a, b]. """ self.assertEqual(["a", "b"], au.extract_variables(bf.And([bf.Var("b"), bf.Var("a")])), "Invalid variables extracted, expected [a, b].")