Example #1
0
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].")