Solución SAT con la biblioteca haskell SBV: ¿cómo generar un predicado a partir de una cadena analizada?

Quiero analizar unString que representa una fórmula proposicional y luego encuentra todos los modelos de la fórmula proposicional con un solucionador SAT.

Ahora puedo analizar una fórmula proposicional con elhatt paquete; ver eltestParse Funcionan a continuación.

También puedo ejecutar una llamada de solucionador SAT con la biblioteca SBV; ver eltestParse Funcionan a continuación.

Pregunta: ¿Cómo, en tiempo de ejecución, genero un valor de tipoPredicate me gustamyPredicate dentro de la biblioteca SBV que representa la fórmula proposicional que acabo de analizar de una cadena? Solo sé cómo escribir manualmenteforSome_ $ \x y z -> ... expresión, pero no cómo escribir una función de conversión desde unExpr valor a un valor de tipoPredicate.

-- 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. 
    -}

Información que puede ser útil:

Aquí está el enlace a los BitVectors.Data:http://hackage.haskell.org/package/sbv-3.0/docs/src/Data-SBV-BitVectors-Data.html

Aquí hay un ejemplo de forma de código Ejemplos.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

Aquí está el tipo de datos Expr (de la biblioteca hatt):

data Expr = Variable      Var
          | Negation      Expr
          | Conjunction   Expr Expr
          | Disjunction   Expr Expr
          | Conditional   Expr Expr
          | Biconditional Expr Expr
          deriving Eq

Respuestas a la pregunta(2)

Su respuesta a la pregunta