我想解析一个String
描述命题公式的 a,然后使用 SAT 求解器找到命题公式的所有模型。
现在我可以用hatt包解析命题公式了;请参阅testParse
下面的功能。
我还可以使用 SBV 库运行 SAT 求解器调用;请参阅testParse
下面的功能。
问题:
在运行时,我如何在 SBV 库中生成一个类型的值,该值Predicate
表示myPredicate
我刚刚从字符串中解析的命题公式?我只知道如何手动键入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
这是示例代码形式 Examples.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