module RandomCNF (randomLiteral, randomClause, randomCNF ) where import System.Random randomLiteral :: Int -> Double -> IO Int randomLiteral num_vars negp = do s <- randomRIO(0.0, 1.0) let sign = if s < negp then -1 else 1 n <- randomRIO(1, num_vars) return $ sign * n randomClause :: Int -> Double -> Int -> IO [Int] randomClause num_vars negp clause_size = mapM (\_ -> randomLiteral num_vars negp) [1..clause_size] randomCNF :: Int -> Double -> Int -> Int -> IO [[Int]] randomCNF num_vars negp clause_size num_clauses = mapM (\_ -> randomClause num_vars negp clause_size) [1..num_clauses]