You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
from sympy.assumptions.cnf import EncodedCNF
def pycosat_satisfiable(expr, all_models=False): import pycosat if not isinstance(expr, EncodedCNF): exprs = EncodedCNF() exprs.add_prop(expr) expr = exprs
# Return UNSAT when False (encoded as 0) is present in the CNF if {0} in expr.data: if all_models: return (f for f in [False]) return False
if not all_models: r = pycosat.solve(expr.data) result = (r != "UNSAT") if not result: return result return {expr.symbols[abs(lit) - 1]: lit > 0 for lit in r} else: r = pycosat.itersolve(expr.data) result = (r != "UNSAT") if not result: return result
# Make solutions SymPy compatible by creating a generator def _gen(results): satisfiable = False try: while True: sol = next(results) yield {expr.symbols[abs(lit) - 1]: lit > 0 for lit in sol} satisfiable = True except StopIteration: if not satisfiable: yield False
return _gen(r)
|