Copyright | (c) Brian Schroeder Levent Erkok |
---|---|
License | BSD3 |
Maintainer | erkokl@gmail.com |
Stability | experimental |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
- User queries
- Create a fresh variable
- Create a fresh array
- Checking satisfiability
- Querying the solver
- Getting solver information
- Entering and exiting assertion stack
- Higher level tactics
- Resetting the solver state
- Constructing assignments
- Terminating the query
- Controlling the solver behavior
- Miscellaneous
- Solver options
More generalized alternative to Data.SBV.Control
for advanced client use
Synopsis
- class MonadIO m => ExtractIO m where
- class Monad m => MonadQuery m where
- queryState :: m State
- data QueryT m a
- type Query = QueryT IO
- query :: ExtractIO m => QueryT m a -> SymbolicT m a
- freshVar_ :: forall a m. (MonadIO m, MonadQuery m, SymVal a) => m (SBV a)
- freshVar :: forall a m. (MonadIO m, MonadQuery m, SymVal a) => String -> m (SBV a)
- freshArray_ :: (MonadIO m, MonadQuery m, SymArray array, HasKind a, HasKind b) => Maybe (SBV b) -> m (array a b)
- freshArray :: (MonadIO m, MonadQuery m, SymArray array, HasKind a, HasKind b) => String -> Maybe (SBV b) -> m (array a b)
- data CheckSatResult
- checkSat :: (MonadIO m, MonadQuery m) => m CheckSatResult
- ensureSat :: (MonadIO m, MonadQuery m) => m ()
- checkSatUsing :: (MonadIO m, MonadQuery m) => String -> m CheckSatResult
- checkSatAssuming :: (MonadIO m, MonadQuery m) => [SBool] -> m CheckSatResult
- checkSatAssumingWithUnsatisfiableSet :: (MonadIO m, MonadQuery m) => [SBool] -> m (CheckSatResult, Maybe [SBool])
- getValue :: (MonadIO m, MonadQuery m, SymVal a) => SBV a -> m a
- getFunction :: (MonadIO m, MonadQuery m, SolverContext m, MonadSymbolic m, SymVal a, SymVal r, SMTFunction fun a r) => fun -> m ([(a, r)], r)
- getUninterpretedValue :: (MonadIO m, MonadQuery m, HasKind a) => SBV a -> m String
- getModel :: (MonadIO m, MonadQuery m) => m SMTModel
- getAssignment :: (MonadIO m, MonadQuery m) => m [(String, Bool)]
- getSMTResult :: (MonadIO m, MonadQuery m) => m SMTResult
- getUnknownReason :: (MonadIO m, MonadQuery m) => m SMTReasonUnknown
- getObservables :: (MonadIO m, MonadQuery m) => m [(Name, CV)]
- getUnsatCore :: (MonadIO m, MonadQuery m) => m [String]
- getProof :: (MonadIO m, MonadQuery m) => m String
- getInterpolantMathSAT :: (MonadIO m, MonadQuery m) => [String] -> m String
- getInterpolantZ3 :: (MonadIO m, MonadQuery m) => [SBool] -> m String
- getAssertions :: (MonadIO m, MonadQuery m) => m [String]
- data SMTInfoFlag
- data SMTErrorBehavior
- data SMTInfoResponse
- getInfo :: (MonadIO m, MonadQuery m) => SMTInfoFlag -> m SMTInfoResponse
- getOption :: (MonadIO m, MonadQuery m) => (a -> SMTOption) -> m (Maybe SMTOption)
- getAssertionStackDepth :: (MonadIO m, MonadQuery m) => m Int
- push :: (MonadIO m, MonadQuery m) => Int -> m ()
- pop :: (MonadIO m, MonadQuery m) => Int -> m ()
- inNewAssertionStack :: (MonadIO m, MonadQuery m) => m a -> m a
- caseSplit :: (MonadIO m, MonadQuery m) => Bool -> [(String, SBool)] -> m (Maybe (String, SMTResult))
- resetAssertions :: (MonadIO m, MonadQuery m) => m ()
- (|->) :: SymVal a => SBV a -> a -> Assignment
- mkSMTResult :: (MonadIO m, MonadQuery m) => [Assignment] -> m SMTResult
- exit :: (MonadIO m, MonadQuery m) => m ()
- ignoreExitCode :: SMTConfig -> Bool
- timeout :: (MonadIO m, MonadQuery m) => Int -> m a -> m a
- queryDebug :: (MonadIO m, MonadQuery m) => [String] -> m ()
- echo :: (MonadIO m, MonadQuery m) => String -> m ()
- io :: MonadIO m => IO a -> m a
- data SMTOption
- = DiagnosticOutputChannel FilePath
- | ProduceAssertions Bool
- | ProduceAssignments Bool
- | ProduceProofs Bool
- | ProduceInterpolants Bool
- | ProduceUnsatAssumptions Bool
- | ProduceUnsatCores Bool
- | RandomSeed Integer
- | ReproducibleResourceLimit Integer
- | SMTVerbosity Integer
- | OptionKeyword String [String]
- | SetLogic Logic
- | SetInfo String [String]
User queries
class MonadIO m => ExtractIO m where Source #
Monads which support IO
operations and can extract all IO
behavior for
interoperation with functions like catches
, which takes
an IO
action in negative position. This function can not be implemented
for transformers like ReaderT r
or StateT s
, whose resultant IO
actions are a function of some environment or state.
Instances
ExtractIO IO Source # | Trivial IO extraction for |
ExtractIO m => ExtractIO (MaybeT m) Source # | IO extraction for |
ExtractIO m => ExtractIO (ExceptT e m) Source # | IO extraction for |
(Monoid w, ExtractIO m) => ExtractIO (WriterT w m) Source # | IO extraction for lazy |
(Monoid w, ExtractIO m) => ExtractIO (WriterT w m) Source # | IO extraction for strict |
class Monad m => MonadQuery m where Source #
Computations which support query operations.
Nothing
queryState :: m State Source #
default queryState :: (MonadTrans t, MonadQuery m', m ~ t m') => m State Source #
Instances
A query is a user-guided mechanism to directly communicate and extract
results from the solver. A generalization of Query
.
Instances
type Query = QueryT IO Source #
A query is a user-guided mechanism to directly communicate and extract results from the solver.
Create a fresh variable
freshVar_ :: forall a m. (MonadIO m, MonadQuery m, SymVal a) => m (SBV a) Source #
Generalization of freshVar_
freshVar :: forall a m. (MonadIO m, MonadQuery m, SymVal a) => String -> m (SBV a) Source #
Generalization of freshVar
Create a fresh array
freshArray_ :: (MonadIO m, MonadQuery m, SymArray array, HasKind a, HasKind b) => Maybe (SBV b) -> m (array a b) Source #
Generalization of freshArray_
freshArray :: (MonadIO m, MonadQuery m, SymArray array, HasKind a, HasKind b) => String -> Maybe (SBV b) -> m (array a b) Source #
Generalization of freshArray
Checking satisfiability
data CheckSatResult Source #
Result of a checkSat
or checkSatAssuming
call.
Sat | Satisfiable: A model is available, which can be queried with |
DSat (Maybe String) | Delta-satisfiable: A delta-sat model is available. String is the precision info, if available. |
Unsat | Unsatisfiable: No model is available. Unsat cores might be obtained via |
Unk | Unknown: Use |
Instances
Show CheckSatResult Source # | |
Defined in Data.SBV.Control.Types showsPrec :: Int -> CheckSatResult -> ShowS # show :: CheckSatResult -> String # showList :: [CheckSatResult] -> ShowS # | |
Eq CheckSatResult Source # | |
Defined in Data.SBV.Control.Types (==) :: CheckSatResult -> CheckSatResult -> Bool # (/=) :: CheckSatResult -> CheckSatResult -> Bool # |
checkSat :: (MonadIO m, MonadQuery m) => m CheckSatResult Source #
Generalization of checkSat
checkSatUsing :: (MonadIO m, MonadQuery m) => String -> m CheckSatResult Source #
Generalization of checkSatUsing
checkSatAssuming :: (MonadIO m, MonadQuery m) => [SBool] -> m CheckSatResult Source #
Generalization of checkSatAssuming
checkSatAssumingWithUnsatisfiableSet :: (MonadIO m, MonadQuery m) => [SBool] -> m (CheckSatResult, Maybe [SBool]) Source #
Generalization of checkSatAssumingWithUnsatisfiableSet
Querying the solver
Extracting values
getFunction :: (MonadIO m, MonadQuery m, SolverContext m, MonadSymbolic m, SymVal a, SymVal r, SMTFunction fun a r) => fun -> m ([(a, r)], r) Source #
Generalization of getFunction
getUninterpretedValue :: (MonadIO m, MonadQuery m, HasKind a) => SBV a -> m String Source #
Generalization of getUninterpretedValue
getAssignment :: (MonadIO m, MonadQuery m) => m [(String, Bool)] Source #
Generalization of getAssignment
getSMTResult :: (MonadIO m, MonadQuery m) => m SMTResult Source #
Generalization of getSMTResult
getUnknownReason :: (MonadIO m, MonadQuery m) => m SMTReasonUnknown Source #
Generalization of getUnknownReason
getObservables :: (MonadIO m, MonadQuery m) => m [(Name, CV)] Source #
Get observables, i.e., those explicitly labeled by the user with a call to observe
.
Extracting the unsat core
getUnsatCore :: (MonadIO m, MonadQuery m) => m [String] Source #
Generalization of getUnsatCore
Extracting a proof
Extracting interpolants
getInterpolantMathSAT :: (MonadIO m, MonadQuery m) => [String] -> m String Source #
Generalization of getInterpolantMathSAT
. Use this version with MathSAT.
getInterpolantZ3 :: (MonadIO m, MonadQuery m) => [SBool] -> m String Source #
Generalization of getInterpolantZ3
. Use this version with Z3.
Extracting assertions
getAssertions :: (MonadIO m, MonadQuery m) => m [String] Source #
Generalization of getAssertions
Getting solver information
data SMTInfoFlag Source #
Collectable information from the solver.
AllStatistics | |
AssertionStackLevels | |
Authors | |
ErrorBehavior | |
Name | |
ReasonUnknown | |
Version | |
InfoKeyword String |
Instances
Show SMTInfoFlag Source # | |
Defined in Data.SBV.Control.Types showsPrec :: Int -> SMTInfoFlag -> ShowS # show :: SMTInfoFlag -> String # showList :: [SMTInfoFlag] -> ShowS # |
data SMTErrorBehavior Source #
Behavior of the solver for errors.
Instances
Show SMTErrorBehavior Source # | |
Defined in Data.SBV.Control.Types showsPrec :: Int -> SMTErrorBehavior -> ShowS # show :: SMTErrorBehavior -> String # showList :: [SMTErrorBehavior] -> ShowS # |
data SMTInfoResponse Source #
Collectable information from the solver.
Instances
Show SMTInfoResponse Source # | |
Defined in Data.SBV.Control.Types showsPrec :: Int -> SMTInfoResponse -> ShowS # show :: SMTInfoResponse -> String # showList :: [SMTInfoResponse] -> ShowS # |
getInfo :: (MonadIO m, MonadQuery m) => SMTInfoFlag -> m SMTInfoResponse Source #
Generalization of getInfo
getOption :: (MonadIO m, MonadQuery m) => (a -> SMTOption) -> m (Maybe SMTOption) Source #
Generalization of getInfo
Entering and exiting assertion stack
getAssertionStackDepth :: (MonadIO m, MonadQuery m) => m Int Source #
Generalization of getAssertionStackDepth
inNewAssertionStack :: (MonadIO m, MonadQuery m) => m a -> m a Source #
Generalization of inNewAssertionStack
Higher level tactics
caseSplit :: (MonadIO m, MonadQuery m) => Bool -> [(String, SBool)] -> m (Maybe (String, SMTResult)) Source #
Generalization of caseSplit
Resetting the solver state
resetAssertions :: (MonadIO m, MonadQuery m) => m () Source #
Generalization of resetAssertions
Constructing assignments
(|->) :: SymVal a => SBV a -> a -> Assignment infix 1 Source #
Make an assignment. The type Assignment
is abstract, the result is typically passed
to mkSMTResult
:
mkSMTResult [ a |-> 332 , b |-> 2.3 , c |-> True ]
End users should use getModel
for automatically constructing models from the current solver state.
However, an explicit Assignment
might be handy in complex scenarios where a model needs to be
created manually.
Terminating the query
mkSMTResult :: (MonadIO m, MonadQuery m) => [Assignment] -> m SMTResult Source #
Generalization of mkSMTResult
NB. This function does not allow users to create interpretations for UI-Funs. But that's
probably not a good idea anyhow. Also, if you use the validateModel
or optimizeValidateConstraints
features, SBV will
fail on models returned via this function.
Controlling the solver behavior
ignoreExitCode :: SMTConfig -> Bool Source #
If true, we shall ignore the exit code upon exit. Otherwise we require ExitSuccess.
Miscellaneous
queryDebug :: (MonadIO m, MonadQuery m) => [String] -> m () Source #
Generalization of queryDebug
Solver options
Option values that can be set in the solver, following the SMTLib specification http://smtlib.cs.uiowa.edu/language.shtml.
Note that not all solvers may support all of these!
Furthermore, SBV doesn't support the following options allowed by SMTLib.
:interactive-mode
(Deprecated in SMTLib, useProduceAssertions
instead.):print-success
(SBV critically needs this to be True in query mode.):produce-models
(SBV always sets this option so it can extract models.):regular-output-channel
(SBV always requires regular output to come on stdout for query purposes.):global-declarations
(SBV always uses global declarations since definitions are accumulative.)
Note that SetLogic
and SetInfo
are, strictly speaking, not SMTLib options. However, we treat it as such here
uniformly, as it fits better with how options work.