verifiable-expressions-0.6.2: An intermediate language for Hoare logic style verification.
Safe HaskellNone
LanguageHaskell2010

Language.Verification

Description

Strongly-typed utilities to aid in automatic verification (e.g. of programs) using an SMT solver.

This is mainly just a wrapper around Data.SBV that allows for inspection and manipulation of symbolic values, especially variable substitution.

Synopsis

The verification monad

data Verifier v a Source #

Instances

Instances details
MonadReader SMTConfig (Verifier v) Source # 
Instance details

Defined in Language.Verification.Core

Methods

ask :: Verifier v SMTConfig #

local :: (SMTConfig -> SMTConfig) -> Verifier v a -> Verifier v a #

reader :: (SMTConfig -> a) -> Verifier v a #

Monad (Verifier v) Source # 
Instance details

Defined in Language.Verification.Core

Methods

(>>=) :: Verifier v a -> (a -> Verifier v b) -> Verifier v b #

(>>) :: Verifier v a -> Verifier v b -> Verifier v b #

return :: a -> Verifier v a #

Functor (Verifier v) Source # 
Instance details

Defined in Language.Verification.Core

Methods

fmap :: (a -> b) -> Verifier v a -> Verifier v b #

(<$) :: a -> Verifier v b -> Verifier v a #

Applicative (Verifier v) Source # 
Instance details

Defined in Language.Verification.Core

Methods

pure :: a -> Verifier v a #

(<*>) :: Verifier v (a -> b) -> Verifier v a -> Verifier v b #

liftA2 :: (a -> b -> c) -> Verifier v a -> Verifier v b -> Verifier v c #

(*>) :: Verifier v a -> Verifier v b -> Verifier v b #

(<*) :: Verifier v a -> Verifier v b -> Verifier v a #

MonadIO (Verifier v) Source # 
Instance details

Defined in Language.Verification.Core

Methods

liftIO :: IO a -> Verifier v a #

MonadError (VerifierError v) (Verifier v) Source # 
Instance details

Defined in Language.Verification.Core

Methods

throwError :: VerifierError v -> Verifier v a #

catchError :: Verifier v a -> (VerifierError v -> Verifier v a) -> Verifier v a #

data VerifierError v Source #

Constructors

VEMismatchedSymbolType (VarKey v)

The same variable was used for two different symbol types

VESbvException String String

When running a query, SBV threw an exception

The query monad

data Query v a Source #

Instances

Instances details
Monad (Query v) Source # 
Instance details

Defined in Language.Verification.Core

Methods

(>>=) :: Query v a -> (a -> Query v b) -> Query v b #

(>>) :: Query v a -> Query v b -> Query v b #

return :: a -> Query v a #

Functor (Query v) Source # 
Instance details

Defined in Language.Verification.Core

Methods

fmap :: (a -> b) -> Query v a -> Query v b #

(<$) :: a -> Query v b -> Query v a #

MonadFail (Query v) Source # 
Instance details

Defined in Language.Verification.Core

Methods

fail :: String -> Query v a #

Applicative (Query v) Source # 
Instance details

Defined in Language.Verification.Core

Methods

pure :: a -> Query v a #

(<*>) :: Query v (a -> b) -> Query v a -> Query v b #

liftA2 :: (a -> b -> c) -> Query v a -> Query v b -> Query v c #

(*>) :: Query v a -> Query v b -> Query v b #

(<*) :: Query v a -> Query v b -> Query v a #

MonadIO (Query v) Source # 
Instance details

Defined in Language.Verification.Core

Methods

liftIO :: IO a -> Query v a #

query :: VerifiableVar v => Query v SBool -> VarEnv v -> Verifier v Bool Source #

Verifiable variables

class (Typeable v, Ord (VarKey v), Show (VarKey v), Typeable (VarKey v)) => VerifiableVar v where Source #

Associated Types

type VarKey v Source #

type VarSym v :: * -> * Source #

type VarEnv v :: * Source #

Methods

symForVar :: v a -> VarEnv v -> Symbolic (VarSym v a) Source #

varKey :: v a -> VarKey v Source #

eqVarTypes :: v a -> v b -> Maybe (a :~: b) Source #

castVarSym :: v a -> VarSym v b -> Maybe (VarSym v a) Source #

Verifier actions

evalProp :: (HMonad expr, HTraversable expr, VerifiableVar v, Exception (VerifierError v), HFoldableAt k expr, HFoldableAt k LogicOp, Monad m) => (forall a. Query v a -> m a) -> (forall a. VarSym v a -> m (k a)) -> Prop (expr v) b -> m (k b) Source #

evalProp' :: (HMonad expr, HTraversable expr, VerifiableVar v, Exception (VerifierError v), HFoldableAt (Compose m k) expr, HFoldableAt (Compose m k) LogicOp, Monad m) => (forall a. Query v a -> m a) -> (forall a. VarSym v a -> m (k a)) -> Prop (expr v) b -> m (k b) Source #

evalPropSimple :: (HMonad expr, HTraversable expr, VerifiableVar v, Exception (VerifierError v), HFoldableAt SBV expr, VarSym v ~ SBV) => Prop (expr v) b -> Query v (SBV b) Source #

Miscellaneous combinators

subVar :: (HPointed expr, VerifiableVar v, Eq (VarKey v)) => expr v a -> v a -> v b -> expr v b Source #

If the two variables match in both type and name, return the given expression. Otherwise, return an expression just containing this variable.

This is substitution into an expression, where the old expression is just a variable.

Expressions

SBV re-exports