簡體   English   中英

如何在haskell中生成隨機命題公式(CNF)?

[英]How to generate a random propositional formula (CNF) in haskell?

如何在haskell中獲得隨機命題公式? 我最好在CNF需要配方,但我願意

我想使用也涉及SAT求解器的性能測試公式。 請注意,我的目標不是測試SAT求解器的性能! 我也對非常困難的公式不感興趣,所以難度應該是隨機的,否則只包括簡單的公式。

我知道我的真實世界數據導致了SAT求解器並不困難的命題公式。

目前,我使用hattSBV庫作為數據結構來處理命題公式。 我也查看了hGen庫,也許它可以用來生成隨機公式。 但是沒有文檔,我沒有看到hGen的源代碼。

我的目標是選擇n並返回包含n布爾變量的公式。

如果你想隨機生成一些東西,我建議使用一個非確定性monad,其中MonadRandom是一個受歡迎的選擇。

我建議對此過程提供兩個輸入: vars ,變量數,以及clauses數的子句。 當然,您也可以使用相同的想法隨機生成子句數量。 這是一個草圖:

import Control.Monad.Random (Rand, StdGen, uniform)
import Control.Applicative ((<$>))
import Control.Monad (replicateM)

type Cloud = Rand StdGen  -- for "probability cloud"

newtype Var = Var Int
data Atom = Positive Var   -- X
          | Negative Var   -- not X

type CNF = [[Atom]]  -- conjunction of disjunctions

genCNF :: Int -> Int -> Cloud CNF
genCNF vars clauses = replicateM clauses genClause
    where
    genClause :: Could [Atom]
    genClause = replicateM 3 genAtom  -- for CNF-3

    genAtom :: Cloud Atom
    genAtom = do
        f <- uniform [Positive, Negative]
        v <- Var <$> uniform [0..vars-1]
        return (f v)

我在where子句中包含了可選類型簽名,以便更容易遵循該結構。

從本質上講,遵循你想要產生的“語法”; 每個非終結符與gen*函數。

我不知道如何判斷CNF表達是容易還是困難。

使用hatt的類型:

import Data.Logic.Propositional
import System.Random
import Control.Monad.State 
import Data.Maybe
import Data.SBV

type Rand = State StdGen 

rand :: Random a => (a, a) -> Rand a 
rand = state . randomR 

runRand :: Rand a -> IO a 
runRand r = randomIO >>= return . fst . runState r . mkStdGen 

randFormula :: Rand Expr 
randFormula = rand (3, 10) >>= randFormulaN 50  

randFormulaN :: Int -> Int -> Rand Expr 
randFormulaN negC n = replicateM n clause >>= return . foldl1 Conjunction 
  where vars = take n (map (Variable . Var) ['a'..])

        clause = rand (1, n) >>= mapM f . flip take vars >>= return . foldl1 Disjunction 

        f v = rand (0,100) >>= \neg -> return (if neg <= negC then Negation v else v)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM