Chcę przetworzyć String
, który przedstawia formułę zdaniową, a następnie znaleźć wszystkie modele formuły zdaniowej z solver SAT.Rozwiązywanie sat z biblioteką SBK haskell: jak wygenerować predykat z analizowanego łańcucha?
Teraz mogę przeanalizować formułę propositional z pakietem hatt; zobacz poniżej funkcję testParse
.
Mogę również uruchomić wywołanie funkcji solwera SAT z biblioteką SBV; zobacz poniżej funkcję testParse
.
Pytanie: jaki sposób, przy starcie, generują wartość typu Predicate
jak myPredicate
w bibliotece SBV który reprezentuje formułę zdaniową właśnie analizowany z łańcucha? Wiem tylko, jak ręcznie wpisać wyrażenie forSome_ $ \x y z -> ...
, ale nie wiem, jak napisać funkcję konwertera z wartości Expr
do wartości typu 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.
-}
informacje, które mogą być pomocne:
Oto link do BitVectors.Data: http://hackage.haskell.org/package/sbv-3.0/docs/src/Data-SBV-BitVectors-Data.html
Oto przykład kodu Examples.Puzzles.PowerSet forma:
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
Oto typ danych Expr (z biblioteki hatt):
data Expr = Variable Var
| Negation Expr
| Conjunction Expr Expr
| Disjunction Expr Expr
| Conditional Expr Expr
| Biconditional Expr Expr
deriving Eq
PS: proszę wziąć pod uwagę, że jestem w innej strefie czasowej, a moje odpowiedzi na komentarze mogą zająć do 24 godzin. – mrsteve