1234567891011121314151617181920212223242526272829303132333435363738394041 |
- 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)
|