Solução SAT com a biblioteca haskell SBV: como gerar um predicado a partir de uma string analisada?

Eu quero analisar umString que descreve uma fórmula proposicional e, em seguida, encontre todos os modelos da fórmula proposicional com um solucionador SAT.

Agora eu posso analisar uma fórmula proposicional com ohatt pacote; Veja otestParse função abaixo.

Também posso executar uma chamada de solucionador SAT com a biblioteca SBV; Veja otestParse função abaixo.

Pergunta, questão: Como, em tempo de execução, giro um valor do tipoPredicate gostarmyPredicate dentro da biblioteca SBV que representa a fórmula proposicional que acabei de analisar de uma String? Eu só sei digitar manualmente oforSome_ $ \x y z -> ... expressão, mas não como escrever uma função de conversor de umExpr valor para um valor do 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. 
    -}

Informações que podem ser úteis:

Aqui está o link para o BitVectors.Data:http://hackage.haskell.org/package/sbv-3.0/docs/src/Data-SBV-BitVectors-Data.html

Aqui está o exemplo de formulário de código 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

Aqui está o tipo de dados Expr (da biblioteca hatt):

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

questionAnswers(2)

yourAnswerToTheQuestion