hasmtlib-1.1.1: A monad for interfacing with external SMT solvers
Safe HaskellSafe-Inferred
LanguageGHC2021

Language.Hasmtlib.Type.Solver

Synopsis

Documentation

class WithSolver a where Source #

Data that can have a Solver.

Methods

withSolver :: Solver -> a Source #

Instances

Instances details
WithSolver Pipe Source # 
Instance details

Defined in Language.Hasmtlib.Type.Solver

solveWith :: (Monad m, Default s, Codec a) => Solver s m -> StateT s m a -> m (Result, Maybe (Decoded a)) Source #

solveWith solver prob solves a SMT problem prob with the given solver. It returns a pair consisting of:

  1. A Result that indicates if prob is satisfiable (Sat), unsatisfiable (Unsat), or if the solver could not determine any results (Unknown).
  2. A Decoded answer that was decoded using the solution to prob. Note that this answer is only meaningful if the Result is Sat or Unknown and the answer value is in a Just.

Here is a small example of how to use solveWith:

import Language.Hasmtlib

main :: IO ()
main = do
  res <- solveWith (solver cvc5) $ do
    setLogic "QF_LIA"

    x <- var @IntSort

    assert $ x >? 0
    
    return x

  print res

interactiveWith :: (MonadIO m, WithSolver s) => (Solver, Handle) -> StateT s m () -> m () Source #

Pipes an SMT-problem interactively to the solver. Enables incremental solving by default. Here is a small example of how to use it for solving a problem utilizing the solvers incremental stack:

import Language.Hasmtlib
import Control.Monad.IO.Class

main :: IO ()
main = do
  cvc5Living <- interactiveSolver cvc5
  interactiveWith cvc5Living $ do
    setOption $ ProduceModels True
    setLogic "QF_LIA"

    x <- var IntSort

    assert $ x >? 0

    (res, sol) <- solve
    liftIO $ print res
    liftIO $ print $ decode sol x

    push
    y <- var IntSort

    assert $ y <? 0
    assert $ x === y

    res' <- checkSat
    liftIO $ print res'
    pop

    res'' <- checkSat
    liftIO $ print res''

  return ()