Я хочу проанализировать String
, который изображает пропозициональную формулу, а затем найти все модели формулы предложения с решателем SAT.
Теперь я могу проанализировать пропозициональную формулу с пакетом hatt; см. ниже testParse
.
Я также могу запустить вызов SAT-solver с библиотекой SBV; см. ниже testParse
.
Вопрос:
Как мне во время выполнения генерировать значение типа Predicate
как myPredicate
в библиотеке SBV, которая представляет формулу пропозиции, которую я просто анализировал из строки? Я знаю только, как вручную набирать выражение forSome_ $ \x y z -> ...
, но не как написать функцию преобразователя из значения Expr
в значение типа Predicate
.
-- cabal install sbv hatt
import Data.Logic.Propositional
import Data.SBV
-- Random test formula:
-- (x or ~z) and (y or ~z)
-- graphical depiction, see: https://www.wolframalpha.com/input/?i=%28x+or+~z%29+and+%28y+or+~z%29
testParse = parseExpr "test source" "((X | ~Z) & (Y | ~Z))"
myPredicate :: Predicate
myPredicate = forSome_ $ \x y z -> ((x :: SBool) ||| (bnot z)) &&& (y ||| (bnot z))
testSat = do
x <- allSat $ myPredicate
putStrLn $ show x
main = do
putStrLn $ show $ testParse
testSat
{-
Need a function that dynamically creates a Predicate
(as I did with the function (like "\x y z -> ..") for an arbitrary expression of type "Expr" that is parsed from String.
-}
Информация, которая может быть полезна:
Вот ссылка на BitVectors.Data: http://hackage.haskell.org/package/sbv-3.0/docs/src/Data-SBV-BitVectors-Data.html
Вот пример формы кода Примеры .Puzzles.PowerSet:
import Data.SBV
genPowerSet :: [SBool] -> SBool
genPowerSet = bAll isBool
where isBool x = x .== true ||| x .== false
powerSet :: [Word8] -> IO ()
powerSet xs = do putStrLn $ "Finding all subsets of " ++ show xs
res <- allSat $ genPowerSet `fmap` mkExistVars n
Вот тип данных Expr (из библиотеки hatt):
data Expr = Variable Var
| Negation Expr
| Conjunction Expr Expr
| Disjunction Expr Expr
| Conditional Expr Expr
| Biconditional Expr Expr
deriving Eq