Haskellで充足可能性問題

ライブドアブログ(livedoor Blog)| 読みたいブログが見つかるより。リンク先のコメントにもありますが、sequenceを使うとこんな感じでしょうか?

module Main (main) where

sat :: Int -> ([Bool] -> Bool) -> [[Bool]]
sat n f = [xs | xs <- sequence $ replicate n [True, False], f xs]

f :: [Bool] -> Bool
f (a : b : c : []) = (a && b) || c

main :: IO ()
main = mapM_ print $ sat 3 f
-- => [True,True,True]
--    [True,True,False]
--    [True,False,True]
--    [False,True,True]
--    [False,False,True]