packages feed

minisat-solver-0.1: SAT/MiniSat/Functional.hs

-- Copyright (C) 2016 Peter Selinger.
--
-- This file is free software and may be distributed under the terms
-- of the MIT license. Please see the file LICENSE for details.

-- | A functional (non-monadic) interface to the functions of
-- "SAT.MiniSat.Monadic". This layer:
--
-- * hides the existence of a solver object by providing a function
--   mapping SAT instances to a lazy list of solutions.

module SAT.MiniSat.Functional where

import SAT.MiniSat.Monadic
import SAT.MiniSat.Literals

-- | Input a CNF and output the a (lazily generated) list of
-- solutions. Variables are represented as integers, which should be
-- consecutive and start from 0.
m_solve :: [[Lit Int]] -> [[Maybe Bool]]
m_solve clauses = m_run $ do
  r <- m_solver_addclauses clauses
  if r == False then do
    return []
    else do
    m_solver_solve_start
    sols <- m_solver_next_solutions
    return sols