sbv-8.7: SMT Based Verification: Symbolic Haskell theorem prover using SMT solving.

Copyright | (c) Levent Erkok
License | BSD3
Maintainer | erkokl@gmail.com
Stability | experimental
Safe Haskell | None
Language | Haskell2010

Data.SBV

Contents

- Symbolic types
  - Booleans
    - Boolean values and functions
    - Logical aggregations
  - Bit-vectors
    - Unsigned bit-vectors
    - Signed bit-vectors
    - Converting between fixed-size and arbitrary bitvectors
  - Unbounded integers
  - Floating point numbers
  - Algebraic reals
  - Characters, Strings and Regular Expressions
  - Symbolic lists
  - Tuples
  - Sum types
  - Sets
- Arrays of symbolic values
- Creating symbolic values
  - Single value
  - List of values
- Symbolic Equality and Comparisons
- Conditionals: Mergeable values
- Symbolic integral numbers
- Division and Modulus
- Bit-vector operations
  - Conversions
  - Shifts and rotates
  - Finite bit-vector operations
  - Splitting, joining, and extending bit-vectors
  - Exponentiation
- IEEE-floating point numbers
  - Rounding modes
  - Conversion to/from floats
  - Bit-pattern conversions
- Enumerations
- Uninterpreted sorts, axioms, constants, and functions
- Properties, proofs, and satisfiability
- Constraints
  - Constraint Vacuity
  - Named constraints and attributes
  - Unsat cores
  - Cardinality constraints
- Checking safety
- Quick-checking
- Optimization
  - Multiple optimization goals
  - Objectives and Metrics
  - Soft assertions
  - Field extensions
- Model extraction
  - Inspecting proof results
  - Observing expressions
  - Programmable model extraction
- SMT Interface
  - Controlling verbosity
  - Solvers
  - Configurations
  - SBV exceptions
- Abstract SBV type
- Module exports

Description

(The sbv library is hosted at http://github.com/LeventErkok/sbv. Comments, bug reports, and patches are always welcome.)

SBV: SMT Based Verification

Express properties about Haskell programs and automatically prove them using SMT solvers.

    >>> prove $ \x -> x `shiftL` 2 .== 4 * (x :: SWord8)
    Q.E.D.

    >>> prove $ \x -> x `shiftL` 2 .== 2 * (x :: SWord8)
    Falsifiable. Counter-example:
      s0 = 32 :: Word8

The function `prove` has the following type:

        prove :: Provable a => a -> IO ThmResult

The class `Provable` comes with instances for n-ary predicates, for arbitrary n. The predicates are just regular Haskell functions over symbolic types listed below. Functions for checking satisfiability (`sat` and `allSat`) are also provided.

The sbv library introduces the following symbolic types:

- `SBool`: Symbolic Booleans (bits).
- `SWord8`, `SWord16`, `SWord32`, `SWord64`: Symbolic Words (unsigned).
- `SInt8`, `SInt16`, `SInt32`, `SInt64`: Symbolic Ints (signed).
- `SWord` `n`: Generalized symbolic words of arbitrary bit-size.
- `SInt` `n`: Generalized symbolic ints of arbitrary bit-size.
- `SInteger`: Unbounded signed integers.
- `SReal`: Algebraic-real numbers
- `SFloat`: IEEE-754 single-precision floating point values
- `SDouble`: IEEE-754 double-precision floating point values
- `SChar`, `SString`, `RegExp`: Characters, strings and regular expressions
- `SList`: Symbolic lists (which can be nested)
- `STuple`, `STuple2`, `STuple3`, .., `STuple8` : Symbolic tuples (upto 8-tuples, can be nested)
- `SEither`: Symbolic sums
- `SMaybe`: Symbolic optional values
- `SSet`: Symbolic sets
- `SArray`, `SFunArray`: Flat arrays of symbolic values.
- Symbolic polynomials over GF(2^n), polynomial arithmetic, and CRCs.
- Uninterpreted constants and functions over symbolic values, with user defined SMT-Lib axioms.
- Uninterpreted sorts, and proofs over such sorts, potentially with axioms.
- Model validation: SBV can validate models returned by solvers, which allows for protection against bugs in SMT solvers and SBV itself. (See the `validateModel` parameter.)

The user can construct ordinary Haskell programs using these types, which behave very similar to their concrete counterparts. In particular these types belong to the standard classes `Num`, `Bits`, custom versions of `Eq` (`EqSymbolic`) and `Ord` (`OrdSymbolic`), along with several other custom classes for simplifying programming with symbolic values. The framework takes full advantage of Haskell's type inference to avoid many common mistakes.

Furthermore, predicates (i.e., functions that return `SBool`) built out of these types can also be:

- proven correct via an external SMT solver (the `prove` function)
- checked for satisfiability (the `sat`, `allSat` functions)
- used in synthesis (the `sat` function with existentials)
- quick-checked

If a predicate is not valid, `prove` will return a counterexample: An assignment to inputs such that the predicate fails. The `sat` function will return a satisfying assignment, if there is one. The `allSat` function returns all satisfying assignments.

The sbv library uses third-party SMT solvers via the standard SMT-Lib interface: http://smtlib.cs.uiowa.edu/

The SBV library is designed to work with any SMT-Lib compliant SMT-solver. Currently, we support the following SMT-Solvers out-of-the box:

- ABC from University of Berkeley: http://www.eecs.berkeley.edu/~alanmi/abc/
- CVC4 from Stanford: https://cvc4.github.io/
- Boolector from Johannes Kepler University: http://fmv.jku.at/boolector/
- MathSAT from Fondazione Bruno Kessler and DISI-University of Trento: http://mathsat.fbk.eu/
- Yices from SRI: http://yices.csl.sri.com/
- Z3 from Microsoft: http://github.com/Z3Prover/z3/wiki

SBV requires recent versions of these solvers; please see the file `SMTSolverVersions.md` in the source distribution for specifics.

SBV also allows calling these solvers in parallel, either getting results from multiple solvers or returning the fastest one. (See `proveWithAll`, `proveWithAny`, etc.)

Support for other compliant solvers can be added relatively easily, please get in touch if there is a solver you'd like to see included.

Synopsis

- type SBool = SBV Bool
- sTrue :: SBool
- sFalse :: SBool
- sNot :: SBool -> SBool
- (.&&) :: SBool -> SBool -> SBool
- (.||) :: SBool -> SBool -> SBool
- (.<+>) :: SBool -> SBool -> SBool
- (.~&) :: SBool -> SBool -> SBool
- (.~|) :: SBool -> SBool -> SBool
- (.=>) :: SBool -> SBool -> SBool
- (.<=>) :: SBool -> SBool -> SBool
- fromBool :: Bool -> SBool
- oneIf :: (Ord a, Num a, SymVal a) => SBool -> SBV a
- sAnd :: [SBool] -> SBool
- sOr :: [SBool] -> SBool
- sAny :: (a -> SBool) -> [a] -> SBool
- sAll :: (a -> SBool) -> [a] -> SBool
- type SWord8 = SBV Word8
- type SWord16 = SBV Word16
- type SWord32 = SBV Word32
- type SWord64 = SBV Word64
- type SWord (n :: Nat) = SBV (WordN n)
- data WordN (n :: Nat)
- type SInt8 = SBV Int8
- type SInt16 = SBV Int16
- type SInt32 = SBV Int32
- type SInt64 = SBV Int64
- type SInt (n :: Nat) = SBV (IntN n)
- data IntN (n :: Nat)
- type family IsNonZero (arg :: Nat) :: Constraint where ...
- type family FromSized (t :: Type) :: Type where ...
- type family ToSized (t :: Type) :: Type where ...
- fromSized :: FromSizedBV a => a -> FromSized a
- toSized :: ToSizedBV a => a -> ToSized a
- type SInteger = SBV Integer
- type SFloat = SBV Float
- type SDouble = SBV Double
- type SReal = SBV AlgReal
- data AlgReal
- sRealToSInteger :: SReal -> SInteger
- algRealToRational :: AlgReal -> Either Rational Rational
- type SChar = SBV Char
- type SString = SBV String
- type SList a = SBV [a]
- class SymTuple a
- type STuple a b = SBV (a, b)
- type STuple2 a b = SBV (a, b)
- type STuple3 a b c = SBV (a, b, c)
- type STuple4 a b c d = SBV (a, b, c, d)
- type STuple5 a b c d e = SBV (a, b, c, d, e)
- type STuple6 a b c d e f = SBV (a, b, c, d, e, f)
- type STuple7 a b c d e f g = SBV (a, b, c, d, e, f, g)
- type STuple8 a b c d e f g h = SBV (a, b, c, d, e, f, g, h)
- type SMaybe a = SBV (Maybe a)
- type SEither a b = SBV (Either a b)
- data RCSet a
  - = RegularSet (Set a)
  - | ComplementSet (Set a)
- type SSet a = SBV (RCSet a)
- class SymArray array where
  - readArray :: array a b -> SBV a -> SBV b
  - writeArray :: SymVal b => array a b -> SBV a -> SBV b -> array a b
  - mergeArrays :: SymVal b => SBV Bool -> array a b -> array a b -> array a b
- newArray_ :: (SymArray array, HasKind a, HasKind b) => Maybe (SBV b) -> Symbolic (array a b)
- newArray :: (SymArray array, HasKind a, HasKind b) => String -> Maybe (SBV b) -> Symbolic (array a b)
- data SArray a b
- data SFunArray a b
- sBool :: String -> Symbolic SBool
- sBool_ :: Symbolic SBool
- sWord8 :: String -> Symbolic SWord8
- sWord8_ :: Symbolic SWord8
- sWord16 :: String -> Symbolic SWord16
- sWord16_ :: Symbolic SWord16
- sWord32 :: String -> Symbolic SWord32
- sWord32_ :: Symbolic SWord32
- sWord64 :: String -> Symbolic SWord64
- sWord64_ :: Symbolic SWord64
- sWord :: (KnownNat n, IsNonZero n) => String -> Symbolic (SWord n)
- sWord_ :: (KnownNat n, IsNonZero n) => Symbolic (SWord n)
- sInt8 :: String -> Symbolic SInt8
- sInt8_ :: Symbolic SInt8
- sInt16 :: String -> Symbolic SInt16
- sInt16_ :: Symbolic SInt16
- sInt32 :: String -> Symbolic SInt32
- sInt32_ :: Symbolic SInt32
- sInt64 :: String -> Symbolic SInt64
- sInt64_ :: Symbolic SInt64
- sInt :: (KnownNat n, IsNonZero n) => String -> Symbolic (SInt n)
- sInt_ :: (KnownNat n, IsNonZero n) => Symbolic (SInt n)
- sInteger :: String -> Symbolic SInteger
- sInteger_ :: Symbolic SInteger
- sReal :: String -> Symbolic SReal
- sReal_ :: Symbolic SReal
- sFloat :: String -> Symbolic SFloat
- sFloat_ :: Symbolic SFloat
- sDouble :: String -> Symbolic SDouble
- sDouble_ :: Symbolic SDouble
- sChar :: String -> Symbolic SChar
- sChar_ :: Symbolic SChar
- sString :: String -> Symbolic SString
- sString_ :: Symbolic SString
- sList :: SymVal a => String -> Symbolic (SList a)
- sList_ :: SymVal a => Symbolic (SList a)
- sTuple :: (SymTuple tup, SymVal tup) => String -> Symbolic (SBV tup)
- sTuple_ :: (SymTuple tup, SymVal tup) => Symbolic (SBV tup)
- sEither :: (SymVal a, SymVal b) => String -> Symbolic (SEither a b)
- sEither_ :: (SymVal a, SymVal b) => Symbolic (SEither a b)
- sMaybe :: SymVal a => String -> Symbolic (SMaybe a)
- sMaybe_ :: SymVal a => Symbolic (SMaybe a)
- sSet :: (Ord a, SymVal a) => String -> Symbolic (SSet a)
- sSet_ :: (Ord a, SymVal a) => Symbolic (SSet a)
- sBools :: [String] -> Symbolic [SBool]
- sWord8s :: [String] -> Symbolic [SWord8]
- sWord16s :: [String] -> Symbolic [SWord16]
- sWord32s :: [String] -> Symbolic [SWord32]
- sWord64s :: [String] -> Symbolic [SWord64]
- sWords :: (KnownNat n, IsNonZero n) => [String] -> Symbolic [SWord n]
- sInt8s :: [String] -> Symbolic [SInt8]
- sInt16s :: [String] -> Symbolic [SInt16]
- sInt32s :: [String] -> Symbolic [SInt32]
- sInt64s :: [String] -> Symbolic [SInt64]
- sInts :: (KnownNat n, IsNonZero n) => [String] -> Symbolic [SInt n]
- sIntegers :: [String] -> Symbolic [SInteger]
- sReals :: [String] -> Symbolic [SReal]
- sFloats :: [String] -> Symbolic [SFloat]
- sDoubles :: [String] -> Symbolic [SDouble]
- sChars :: [String] -> Symbolic [SChar]
- sStrings :: [String] -> Symbolic [SString]
- sLists :: SymVal a => [String] -> Symbolic [SList a]
- sTuples :: (SymTuple tup, SymVal tup) => [String] -> Symbolic [SBV tup]
- sEithers :: (SymVal a, SymVal b) => [String] -> Symbolic [SEither a b]
- sMaybes :: SymVal a => [String] -> Symbolic [SMaybe a]
- sSets :: (Ord a, SymVal a) => [String] -> Symbolic [SSet a]
- class EqSymbolic a where
  - (.==) :: a -> a -> SBool
  - (./=) :: a -> a -> SBool
  - (.===) :: a -> a -> SBool
  - (./==) :: a -> a -> SBool
  - distinct :: [a] -> SBool
  - distinctExcept :: [a] -> [a] -> SBool
  - allEqual :: [a] -> SBool
  - sElem :: a -> [a] -> SBool
  - sNotElem :: a -> [a] -> SBool
- class (Mergeable a, EqSymbolic a) => OrdSymbolic a where
  - (.<) :: a -> a -> SBool
  - (.<=) :: a -> a -> SBool
  - (.>) :: a -> a -> SBool
  - (.>=) :: a -> a -> SBool
  - smin :: a -> a -> a
  - smax :: a -> a -> a
  - inRange :: a -> (a, a) -> SBool
- class Equality a where
  - (===) :: a -> a -> IO ThmResult
- class Mergeable a where
  - symbolicMerge :: Bool -> SBool -> a -> a -> a
  - select :: (Ord b, SymVal b, Num b) => [a] -> a -> SBV b -> a
- ite :: Mergeable a => SBool -> a -> a -> a
- iteLazy :: Mergeable a => SBool -> a -> a -> a
- class (SymVal a, Num a, Bits a, Integral a) => SIntegral a
- class SDivisible a where
  - sQuotRem :: a -> a -> (a, a)
  - sDivMod :: a -> a -> (a, a)
  - sQuot :: a -> a -> a
  - sRem :: a -> a -> a
  - sDiv :: a -> a -> a
  - sMod :: a -> a -> a
- sFromIntegral :: forall a b. (Integral a, HasKind a, Num a, SymVal a, HasKind b, Num b, SymVal b) => SBV a -> SBV b
- sShiftLeft :: (SIntegral a, SIntegral b) => SBV a -> SBV b -> SBV a
- sShiftRight :: (SIntegral a, SIntegral b) => SBV a -> SBV b -> SBV a
- sRotateLeft :: (SIntegral a, SIntegral b) => SBV a -> SBV b -> SBV a
- sBarrelRotateLeft :: (SFiniteBits a, SFiniteBits b) => SBV a -> SBV b -> SBV a
- sRotateRight :: (SIntegral a, SIntegral b) => SBV a -> SBV b -> SBV a
- sBarrelRotateRight :: (SFiniteBits a, SFiniteBits b) => SBV a -> SBV b -> SBV a
- sSignedShiftArithRight :: (SFiniteBits a, SIntegral b) => SBV a -> SBV b -> SBV a
- class (Ord a, SymVal a, Num a, Bits a) => SFiniteBits a where
  - sFiniteBitSize :: SBV a -> Int
  - lsb :: SBV a -> SBool
  - msb :: SBV a -> SBool
  - blastBE :: SBV a -> [SBool]
  - blastLE :: SBV a -> [SBool]
  - fromBitsBE :: [SBool] -> SBV a
  - fromBitsLE :: [SBool] -> SBV a
  - sTestBit :: SBV a -> Int -> SBool
  - sExtractBits :: SBV a -> [Int] -> [SBool]
  - sPopCount :: SBV a -> SWord8
  - setBitTo :: SBV a -> Int -> SBool -> SBV a
  - fullAdder :: SBV a -> SBV a -> (SBool, SBV a)
  - fullMultiplier :: SBV a -> SBV a -> (SBV a, SBV a)
  - sCountLeadingZeros :: SBV a -> SWord8
  - sCountTrailingZeros :: SBV a -> SWord8
- bvExtract :: forall i j n bv proxy. (KnownNat n, IsNonZero n, SymVal (bv n), KnownNat i, KnownNat j, (i + 1) <= n, j <= i, IsNonZero ((i - j) + 1)) => proxy i -> proxy j -> SBV (bv n) -> SBV (bv ((i - j) + 1))
- (#) :: (KnownNat n, IsNonZero n, SymVal (bv n), KnownNat m, IsNonZero m, SymVal (bv m)) => SBV (bv n) -> SBV (bv m) -> SBV (bv (n + m))
- zeroExtend :: forall n m bv. (KnownNat n, IsNonZero n, SymVal (bv n), KnownNat m, IsNonZero m, SymVal (bv m), (n + 1) <= m, SIntegral (bv (m - n)), IsNonZero (m - n)) => SBV (bv n) -> SBV (bv m)
- signExtend :: forall n m bv. (KnownNat n, IsNonZero n, SymVal (bv n), KnownNat m, IsNonZero m, SymVal (bv m), (n + 1) <= m, SFiniteBits (bv n), SIntegral (bv (m - n)), IsNonZero (m - n)) => SBV (bv n) -> SBV (bv m)
- bvDrop :: forall i n m bv proxy. (KnownNat n, IsNonZero n, KnownNat i, (i + 1) <= n, ((i + m) - n) <= 0, IsNonZero (n - i)) => proxy i -> SBV (bv n) -> SBV (bv m)
- bvTake :: forall i n bv proxy. (KnownNat n, IsNonZero n, KnownNat i, IsNonZero i, i <= n) => proxy i -> SBV (bv n) -> SBV (bv i)
- class ByteConverter a where
  - toBytes :: a -> [SWord 8]
  - fromBytes :: [SWord 8] -> a
- (.^) :: (Mergeable b, Num b, SIntegral e) => b -> SBV e -> b
- class (SymVal a, RealFloat a) => IEEEFloating a where
  - fpAbs :: SBV a -> SBV a
  - fpNeg :: SBV a -> SBV a
  - fpAdd :: SRoundingMode -> SBV a -> SBV a -> SBV a
  - fpSub :: SRoundingMode -> SBV a -> SBV a -> SBV a
  - fpMul :: SRoundingMode -> SBV a -> SBV a -> SBV a
  - fpDiv :: SRoundingMode -> SBV a -> SBV a -> SBV a
  - fpFMA :: SRoundingMode -> SBV a -> SBV a -> SBV a -> SBV a
  - fpSqrt :: SRoundingMode -> SBV a -> SBV a
  - fpRem :: SBV a -> SBV a -> SBV a
  - fpRoundToIntegral :: SRoundingMode -> SBV a -> SBV a
  - fpMin :: SBV a -> SBV a -> SBV a
  - fpMax :: SBV a -> SBV a -> SBV a
  - fpIsEqualObject :: SBV a -> SBV a -> SBool
  - fpIsNormal :: SBV a -> SBool
  - fpIsSubnormal :: SBV a -> SBool
  - fpIsZero :: SBV a -> SBool
  - fpIsInfinite :: SBV a -> SBool
  - fpIsNaN :: SBV a -> SBool
  - fpIsNegative :: SBV a -> SBool
  - fpIsPositive :: SBV a -> SBool
  - fpIsNegativeZero :: SBV a -> SBool
  - fpIsPositiveZero :: SBV a -> SBool
  - fpIsPoint :: SBV a -> SBool
- data RoundingMode
  - = RoundNearestTiesToEven
  - | RoundNearestTiesToAway
  - | RoundTowardPositive
  - | RoundTowardNegative
  - | RoundTowardZero
- type SRoundingMode = SBV RoundingMode
- nan :: Floating a => a
- infinity :: Floating a => a
- sNaN :: (Floating a, SymVal a) => SBV a
- sInfinity :: (Floating a, SymVal a) => SBV a
- sRoundNearestTiesToEven :: SRoundingMode
- sRoundNearestTiesToAway :: SRoundingMode
- sRoundTowardPositive :: SRoundingMode
- sRoundTowardNegative :: SRoundingMode
- sRoundTowardZero :: SRoundingMode
- sRNE :: SRoundingMode
- sRNA :: SRoundingMode
- sRTP :: SRoundingMode
- sRTN :: SRoundingMode
- sRTZ :: SRoundingMode
- class SymVal a => IEEEFloatConvertible a where
  - fromSFloat :: SRoundingMode -> SFloat -> SBV a
  - toSFloat :: SRoundingMode -> SBV a -> SFloat
  - fromSDouble :: SRoundingMode -> SDouble -> SBV a
  - toSDouble :: SRoundingMode -> SBV a -> SDouble
- sFloatAsSWord32 :: SFloat -> SWord32
- sWord32AsSFloat :: SWord32 -> SFloat
- sDoubleAsSWord64 :: SDouble -> SWord64
- sWord64AsSDouble :: SWord64 -> SDouble
- blastSFloat :: SFloat -> (SBool, [SBool], [SBool])
- blastSDouble :: SDouble -> (SBool, [SBool], [SBool])
- mkSymbolicEnumeration :: Name -> Q [Dec]
- class Uninterpreted a where
  - uninterpret :: String -> a
  - cgUninterpret :: String -> [String] -> a -> a
  - sbvUninterpret :: Maybe ([String], a) -> String -> a
- addAxiom :: SolverContext m => String -> [String] -> m ()
- type Predicate = Symbolic SBool
- type Goal = Symbolic ()
- type Provable = MProvable IO
- forAll_ :: Provable a => a -> Symbolic SBool
- forAll :: Provable a => [String] -> a -> Symbolic SBool
- forSome_ :: Provable a => a -> Symbolic SBool
- forSome :: Provable a => [String] -> a -> Symbolic SBool
- prove :: Provable a => a -> IO ThmResult
- proveWith :: Provable a => SMTConfig -> a -> IO ThmResult
- sat :: Provable a => a -> IO SatResult
- satWith :: Provable a => SMTConfig -> a -> IO SatResult
- allSat :: Provable a => a -> IO AllSatResult
- allSatWith :: Provable a => SMTConfig -> a -> IO AllSatResult
- optimize :: Provable a => OptimizeStyle -> a -> IO OptimizeResult
- optimizeWith :: Provable a => SMTConfig -> OptimizeStyle -> a -> IO OptimizeResult
- isVacuous :: Provable a => a -> IO Bool
- isVacuousWith :: Provable a => SMTConfig -> a -> IO Bool
- isTheorem :: Provable a => a -> IO Bool
- isTheoremWith :: Provable a => SMTConfig -> a -> IO Bool
- isSatisfiable :: Provable a => a -> IO Bool
- isSatisfiableWith :: Provable a => SMTConfig -> a -> IO Bool
- proveWithAll :: Provable a => [SMTConfig] -> a -> IO [(Solver, NominalDiffTime, ThmResult)]
- proveWithAny :: Provable a => [SMTConfig] -> a -> IO (Solver, NominalDiffTime, ThmResult)
- satWithAll :: Provable a => [SMTConfig] -> a -> IO [(Solver, NominalDiffTime, SatResult)]
- proveConcurrentWithAny :: Provable a => SMTConfig -> [Query b] -> a -> IO (Solver, NominalDiffTime, ThmResult)
- proveConcurrentWithAll :: Provable a => SMTConfig -> [Query b] -> a -> IO [(Solver, NominalDiffTime, ThmResult)]
- satConcurrentWithAny :: Provable a => SMTConfig -> [Query b] -> a -> IO (Solver, NominalDiffTime, SatResult)
- satConcurrentWithAll :: Provable a => SMTConfig -> [Query b] -> a -> IO [(Solver, NominalDiffTime, SatResult)]
- satWithAny :: Provable a => [SMTConfig] -> a -> IO (Solver, NominalDiffTime, SatResult)
- generateSMTBenchmark :: (MonadIO m, MProvable m a) => Bool -> a -> m String
- solve :: [SBool] -> Symbolic SBool
- constrain :: SolverContext m => SBool -> m ()
- softConstrain :: SolverContext m => SBool -> m ()
- namedConstraint :: SolverContext m => String -> SBool -> m ()
- constrainWithAttribute :: SolverContext m => [(String, String)] -> SBool -> m ()
- pbAtMost :: [SBool] -> Int -> SBool
- pbAtLeast :: [SBool] -> Int -> SBool
- pbExactly :: [SBool] -> Int -> SBool
- pbLe :: [(Int, SBool)] -> Int -> SBool
- pbGe :: [(Int, SBool)] -> Int -> SBool
- pbEq :: [(Int, SBool)] -> Int -> SBool
- pbMutexed :: [SBool] -> SBool
- pbStronglyMutexed :: [SBool] -> SBool
- sAssert :: HasKind a => Maybe CallStack -> String -> SBool -> SBV a -> SBV a
- isSafe :: SafeResult -> Bool
- class ExtractIO m => SExecutable m a
- sName_ :: SExecutable IO a => a -> Symbolic ()
- sName :: SExecutable IO a => [String] -> a -> Symbolic ()
- safe :: SExecutable IO a => a -> IO [SafeResult]
- safeWith :: SExecutable IO a => SMTConfig -> a -> IO [SafeResult]
- sbvQuickCheck :: Symbolic SBool -> IO Bool
- data OptimizeStyle
  - = Lexicographic
  - | Independent
  - | Pareto (Maybe Int)
- data Objective a
  - = Minimize String a
  - | Maximize String a
  - | AssertWithPenalty String a Penalty
- class Metric a where
  - type MetricSpace a :: *
  - toMetricSpace :: SBV a -> SBV (MetricSpace a)
  - fromMetricSpace :: SBV (MetricSpace a) -> SBV a
  - msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV a -> m ()
  - msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV a -> m ()
- minimize :: Metric a => String -> SBV a -> Symbolic ()
- maximize :: Metric a => String -> SBV a -> Symbolic ()
- assertWithPenalty :: String -> SBool -> Penalty -> Symbolic ()
- data Penalty
  - = DefaultPenalty
  - | Penalty Rational (Maybe String)
- data ExtCV
  - = Infinite Kind
  - | Epsilon Kind
  - | Interval ExtCV ExtCV
  - | BoundedCV CV
  - | AddExtCV ExtCV ExtCV
  - | MulExtCV ExtCV ExtCV
- data GeneralizedCV
  - = ExtendedCV ExtCV
  - | RegularCV CV
- newtype ThmResult = ThmResult SMTResult
- newtype SatResult = SatResult SMTResult
- newtype AllSatResult = AllSatResult (Bool, Bool, Bool, [SMTResult])
- newtype SafeResult = SafeResult (Maybe String, String, SMTResult)
- data OptimizeResult
  - = LexicographicResult SMTResult
  - | ParetoResult (Bool, [SMTResult])
  - | IndependentResult [(String, SMTResult)]
- data SMTResult
  - = Unsatisfiable SMTConfig (Maybe [String])
  - | Satisfiable SMTConfig SMTModel
  - | SatExtField SMTConfig SMTModel
  - | Unknown SMTConfig SMTReasonUnknown
  - | ProofError SMTConfig [String] (Maybe SMTResult)
- data SMTReasonUnknown
  - = UnknownMemOut
  - | UnknownIncomplete
  - | UnknownTimeOut
  - | UnknownOther String
- observe :: SymVal a => String -> SBV a -> SBV a
- observeIf :: SymVal a => (a -> Bool) -> String -> SBV a -> SBV a
- sObserve :: SymVal a => String -> SBV a -> Symbolic ()
- class SatModel a where
  - parseCVs :: [CV] -> Maybe (a, [CV])
  - cvtModel :: (a -> Maybe b) -> Maybe (a, [CV]) -> Maybe (b, [CV])
- class Modelable a where
  - modelExists :: a -> Bool
  - getModelAssignment :: SatModel b => a -> Either String (Bool, b)
  - getModelDictionary :: a -> Map String CV
  - getModelValue :: SymVal b => String -> a -> Maybe b
  - getModelUninterpretedValue :: String -> a -> Maybe String
  - extractModel :: SatModel b => a -> Maybe b
  - getModelObjectives :: a -> Map String GeneralizedCV
  - getModelObjectiveValue :: String -> a -> Maybe GeneralizedCV
  - getModelUIFuns :: a -> Map String (SBVType, ([([CV], CV)], CV))
  - getModelUIFunValue :: String -> a -> Maybe (SBVType, ([([CV], CV)], CV))
- displayModels :: SatModel a => ([(Bool, a)] -> [(Bool, a)]) -> (Int -> (Bool, a) -> IO ()) -> AllSatResult -> IO Int
- extractModels :: SatModel a => AllSatResult -> [a]
- getModelDictionaries :: AllSatResult -> [Map String CV]
- getModelValues :: SymVal b => String -> AllSatResult -> [Maybe b]
- getModelUninterpretedValues :: String -> AllSatResult -> [Maybe String]
- data SMTConfig = SMTConfig {
  - verbose :: Bool
  - timing :: Timing
  - printBase :: Int
  - printRealPrec :: Int
  - satCmd :: String
  - allSatMaxModelCount :: Maybe Int
  - allSatPrintAlong :: Bool
  - satTrackUFs :: Bool
  - isNonModelVar :: String -> Bool
  - validateModel :: Bool
  - optimizeValidateConstraints :: Bool
  - transcript :: Maybe FilePath
  - smtLibVersion :: SMTLibVersion
  - solver :: SMTSolver
  - allowQuantifiedQueries :: Bool
  - roundingMode :: RoundingMode
  - solverSetOptions :: [SMTOption]
  - ignoreExitCode :: Bool
  - redirectVerbose :: Maybe FilePath
  }
- data Timing
  - = NoTiming
  - | PrintTiming
  - | SaveTiming (IORef NominalDiffTime)
- data SMTLibVersion = SMTLib2
- data Solver
  - = Z3
  - | Yices
  - | Boolector
  - | CVC4
  - | MathSAT
  - | ABC
- data SMTSolver = SMTSolver {
  - name :: Solver
  - executable :: String
  - preprocess :: String -> String
  - options :: SMTConfig -> [String]
  - engine :: SMTEngine
  - capabilities :: SolverCapabilities
  }
- boolector :: SMTConfig
- cvc4 :: SMTConfig
- yices :: SMTConfig
- z3 :: SMTConfig
- mathSAT :: SMTConfig
- abc :: SMTConfig
- defaultSolverConfig :: Solver -> SMTConfig
- defaultSMTCfg :: SMTConfig
- sbvCheckSolverInstallation :: SMTConfig -> IO Bool
- sbvAvailableSolvers :: IO [SMTConfig]
- setLogic :: SolverContext m => Logic -> m ()
- data Logic
  - = AUFLIA
  - | AUFLIRA
  - | AUFNIRA
  - | LRA
  - | QF_ABV
  - | QF_AUFBV
  - | QF_AUFLIA
  - | QF_AX
  - | QF_BV
  - | QF_IDL
  - | QF_LIA
  - | QF_LRA
  - | QF_NIA
  - | QF_NRA
  - | QF_RDL
  - | QF_UF
  - | QF_UFBV
  - | QF_UFIDL
  - | QF_UFLIA
  - | QF_UFLRA
  - | QF_UFNRA
  - | QF_UFNIRA
  - | UFLRA
  - | UFNIA
  - | QF_FPBV
  - | QF_FP
  - | QF_FD
  - | QF_S
  - | Logic_ALL
  - | Logic_NONE
  - | CustomLogic String
- setOption :: SolverContext m => SMTOption -> m ()
- setInfo :: SolverContext m => String -> [String] -> m ()
- setTimeOut :: SolverContext m => Integer -> m ()
- data SBVException = SBVException {
  - sbvExceptionDescription :: String
  - sbvExceptionSent :: Maybe String
  - sbvExceptionExpected :: Maybe String
  - sbvExceptionReceived :: Maybe String
  - sbvExceptionStdOut :: Maybe String
  - sbvExceptionStdErr :: Maybe String
  - sbvExceptionExitCode :: Maybe ExitCode
  - sbvExceptionConfig :: SMTConfig
  - sbvExceptionReason :: Maybe [String]
  - sbvExceptionHint :: Maybe [String]
  }
- data SBV a
- class HasKind a where
  - kindOf :: a -> Kind
  - hasSign :: a -> Bool
  - intSizeOf :: a -> Int
  - isBoolean :: a -> Bool
  - isBounded :: a -> Bool
  - isReal :: a -> Bool
  - isFloat :: a -> Bool
  - isDouble :: a -> Bool
  - isUnbounded :: a -> Bool
  - isUninterpreted :: a -> Bool
  - isChar :: a -> Bool
  - isString :: a -> Bool
  - isList :: a -> Bool
  - isSet :: a -> Bool
  - isTuple :: a -> Bool
  - isMaybe :: a -> Bool
  - isEither :: a -> Bool
  - showType :: a -> String
- data Kind
  - = KBool
  - | KBounded !Bool !Int
  - | KUnbounded
  - | KReal
  - | KUninterpreted String (Either String [String])
  - | KFloat
  - | KDouble
  - | KChar
  - | KString
  - | KList Kind
  - | KSet Kind
  - | KTuple [Kind]
  - | KMaybe Kind
  - | KEither Kind Kind
- class (HasKind a, Typeable a) => SymVal a
- forall :: SymVal a => String -> Symbolic (SBV a)
- forall_ :: SymVal a => Symbolic (SBV a)
- mkForallVars :: SymVal a => Int -> Symbolic [SBV a]
- exists :: SymVal a => String -> Symbolic (SBV a)
- exists_ :: SymVal a => Symbolic (SBV a)
- mkExistVars :: SymVal a => Int -> Symbolic [SBV a]
- free :: SymVal a => String -> Symbolic (SBV a)
- free_ :: SymVal a => Symbolic (SBV a)
- mkFreeVars :: SymVal a => Int -> Symbolic [SBV a]
- symbolic :: SymVal a => String -> Symbolic (SBV a)
- symbolics :: SymVal a => [String] -> Symbolic [SBV a]
- literal :: SymVal a => a -> SBV a
- unliteral :: SymVal a => SBV a -> Maybe a
- fromCV :: SymVal a => CV -> a
- isConcrete :: SymVal a => SBV a -> Bool
- isSymbolic :: SymVal a => SBV a -> Bool
- isConcretely :: SymVal a => SBV a -> (a -> Bool) -> Bool
- mkSymVal :: SymVal a => Maybe Quantifier -> Maybe String -> Symbolic (SBV a)
- class MonadIO m => MonadSymbolic m where
  - symbolicEnv :: m State
- type Symbolic = SymbolicT IO
- data SymbolicT m a
- label :: SymVal a => String -> SBV a -> SBV a
- output :: Outputtable a => a -> Symbolic a
- runSMT :: Symbolic a -> IO a
- runSMTWith :: SMTConfig -> Symbolic a -> IO a

# Documentation

The SBV library is really two things:

- A framework for writing symbolic programs in Haskell, i.e., programs operating on symbolic values along with the usual concrete counterparts.
- A framework for proving properties of such programs using SMT solvers.

The programming goal of SBV is to provide a seamless experience, i.e., let people program in the usual Haskell style without distractions of symbolic coding. While Haskell helps in some aspects (the `Num` and `Bits` classes simplify coding), it makes life harder in others. For instance, `if-then-else` only takes `Bool` as a test in Haskell, and comparisons (`>` etc.) only return `Bool`s. Clearly we would like these values to be symbolic (i.e., `SBool`), thus stopping us from using some native Haskell constructs. When symbolic versions of operators are needed, they are typically obtained by prepending a dot, for instance `==` becomes `.==`. Care has been taken to make the transition painless. In particular, any Haskell program you build out of symbolic components is fully concretely executable within Haskell, without the need for any custom interpreters. (They are truly Haskell programs, not AST's built out of pieces of syntax.) This provides for an integrated feel of the system, one of the original design goals for SBV.

Incremental query mode: SBV provides a wide variety of ways to utilize SMT-solvers, without requiring the user to deal with the solvers themselves. While this mode is convenient, advanced users might need access to the underlying solver at a lower level. For such use cases, SBV allows users to have an interactive session: The user can issue commands to the solver, inspect the values/results, and formulate new constraints. This advanced feature is available through the Data.SBV.Control module, where most SMTLib features are made available via a typed-API.

# Symbolic types

## Booleans

type SBool = SBV Bool Source #

A symbolic boolean/bit

### Boolean values and functions

sTrue :: SBool Source #

Symbolic `True`

sFalse :: SBool Source #

Symbolic `False`

sNot :: SBool -> SBool Source #

Symbolic boolean negation

(.&&) :: SBool -> SBool -> SBool infixr 3 Source #

Symbolic conjunction

(.||) :: SBool -> SBool -> SBool infixr 2 Source #

Symbolic disjunction

(.<+>) :: SBool -> SBool -> SBool infixl 6 Source #

Symbolic logical xor

(.~&) :: SBool -> SBool -> SBool infixr 3 Source #

Symbolic nand

(.~|) :: SBool -> SBool -> SBool infixr 2 Source #

Symbolic nor

(.=>) :: SBool -> SBool -> SBool infixr 1 Source #

Symbolic implication

(.<=>) :: SBool -> SBool -> SBool infixr 1 Source #

Symbolic boolean equivalence

fromBool :: Bool -> SBool Source #

Conversion from `Bool` to `SBool`

oneIf :: (Ord a, Num a, SymVal a) => SBool -> SBV a Source #

Returns 1 if the boolean is `sTrue`, otherwise 0.

### Logical aggregations

sAnd :: [SBool] -> SBool Source #

Generalization of `and`

sOr :: [SBool] -> SBool Source #

Generalization of `or`

sAny :: (a -> SBool) -> [a] -> SBool Source #

Generalization of `any`

sAll :: (a -> SBool) -> [a] -> SBool Source #

Generalization of `all`

## Bit-vectors

### Unsigned bit-vectors

type SWord8 = SBV Word8 Source #

8-bit unsigned symbolic value

type SWord16 = SBV Word16 Source #

16-bit unsigned symbolic value

type SWord32 = SBV Word32 Source #

32-bit unsigned symbolic value

type SWord64 = SBV Word64 Source #

64-bit unsigned symbolic value

type SWord (n :: Nat) = SBV (WordN n) Source #

A symbolic unsigned bit-vector carrying its size info

data WordN (n :: Nat) Source #

An unsigned bit-vector carrying its size info

#### Instances

Instances details

(KnownNat n, IsNonZero n) => Bounded (WordN n) Source # | `Bounded` instance for `WordN`
Instance details Defined in Data.SBV.Core.Sized Methods minBound :: WordN n maxBound :: WordN n
(KnownNat n, IsNonZero n) => Enum (WordN n) Source # | `Enum` instance for `WordN`
Instance details Defined in Data.SBV.Core.Sized Methods succ :: WordN n -> WordN n pred :: WordN n -> WordN n toEnum :: Int -> WordN n fromEnum :: WordN n -> Int enumFrom :: WordN n -> [WordN n] enumFromThen :: WordN n -> WordN n -> [WordN n] enumFromTo :: WordN n -> WordN n -> [WordN n] enumFromThenTo :: WordN n -> WordN n -> WordN n -> [WordN n]
Eq (WordN n) Source # |
Instance details Defined in Data.SBV.Core.Sized Methods (==) :: WordN n -> WordN n -> Bool (/=) :: WordN n -> WordN n -> Bool
(KnownNat n, IsNonZero n) => Integral (WordN n) Source # | `Integral` instance for `WordN`
Instance details Defined in Data.SBV.Core.Sized Methods quot :: WordN n -> WordN n -> WordN n rem :: WordN n -> WordN n -> WordN n div :: WordN n -> WordN n -> WordN n mod :: WordN n -> WordN n -> WordN n quotRem :: WordN n -> WordN n -> (WordN n, WordN n) divMod :: WordN n -> WordN n -> (WordN n, WordN n) toInteger :: WordN n -> Integer
(KnownNat n, IsNonZero n) => Num (WordN n) Source # | `Num` instance for `WordN`
Instance details Defined in Data.SBV.Core.Sized Methods (+) :: WordN n -> WordN n -> WordN n (-) :: WordN n -> WordN n -> WordN n (*) :: WordN n -> WordN n -> WordN n negate :: WordN n -> WordN n abs :: WordN n -> WordN n signum :: WordN n -> WordN n fromInteger :: Integer -> WordN n
Ord (WordN n) Source # |
Instance details Defined in Data.SBV.Core.Sized Methods compare :: WordN n -> WordN n -> Ordering (<) :: WordN n -> WordN n -> Bool (<=) :: WordN n -> WordN n -> Bool (>) :: WordN n -> WordN n -> Bool (>=) :: WordN n -> WordN n -> Bool max :: WordN n -> WordN n -> WordN n min :: WordN n -> WordN n -> WordN n
(KnownNat n, IsNonZero n) => Real (WordN n) Source # | `Real` instance for `WordN`
Instance details Defined in Data.SBV.Core.Sized Methods toRational :: WordN n -> Rational
Show (WordN n) Source # | Show instance for `WordN`
Instance details Defined in Data.SBV.Core.Sized Methods showsPrec :: Int -> WordN n -> ShowS show :: WordN n -> String showList :: [WordN n] -> ShowS
(KnownNat n, IsNonZero n) => Bits (WordN n) Source # |

Instance details

Defined in Data.SBV.Core.Sized

Methods

(.&.) :: WordN n -> WordN n -> WordN n

(.|.) :: WordN n -> WordN n -> WordN n

xor :: WordN n -> WordN n -> WordN n

complement :: WordN n -> WordN n

shift :: WordN n -> Int -> WordN n

rotate :: WordN n -> Int -> WordN n

zeroBits :: WordN n

bit :: Int -> WordN n

setBit :: WordN n -> Int -> WordN n

clearBit :: WordN n -> Int -> WordN n

complementBit :: WordN n -> Int -> WordN n

testBit :: WordN n -> Int -> Bool

bitSizeMaybe :: WordN n -> Maybe Int

bitSize :: WordN n -> Int

isSigned :: WordN n -> Bool

shiftL :: WordN n -> Int -> WordN n

unsafeShiftL :: WordN n -> Int -> WordN n

shiftR :: WordN n -> Int -> WordN n

unsafeShiftR :: WordN n -> Int -> WordN n

rotateL :: WordN n -> Int -> WordN n

rotateR :: WordN n -> Int -> WordN n

popCount :: WordN n -> Int

(KnownNat n, IsNonZero n) => HasKind (WordN n) Source # | `WordN` has a kind

Instance details

Defined in Data.SBV.Core.Sized

Methods

kindOf :: WordN n -> Kind Source #

hasSign :: WordN n -> Bool Source #

intSizeOf :: WordN n -> Int Source #

isBoolean :: WordN n -> Bool Source #

isBounded :: WordN n -> Bool Source #

isReal :: WordN n -> Bool Source #

isFloat :: WordN n -> Bool Source #

isDouble :: WordN n -> Bool Source #

isUnbounded :: WordN n -> Bool Source #

isUninterpreted :: WordN n -> Bool Source #

isChar :: WordN n -> Bool Source #

isString :: WordN n -> Bool Source #

isList :: WordN n -> Bool Source #

isSet :: WordN n -> Bool Source #

isTuple :: WordN n -> Bool Source #

isMaybe :: WordN n -> Bool Source #

isEither :: WordN n -> Bool Source #

showType :: WordN n -> String Source #

(KnownNat n, IsNonZero n) => SymVal (WordN n) Source # | `SymVal` instance for `WordN`

Instance details

Defined in Data.SBV.Core.Sized

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (WordN n)) Source #

literal :: WordN n -> SBV (WordN n) Source #

fromCV :: CV -> WordN n Source #

isConcretely :: SBV (WordN n) -> (WordN n -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (WordN n)) Source #

forall_ :: MonadSymbolic m => m (SBV (WordN n)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (WordN n)] Source #

exists :: MonadSymbolic m => String -> m (SBV (WordN n)) Source #

exists_ :: MonadSymbolic m => m (SBV (WordN n)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (WordN n)] Source #

free :: MonadSymbolic m => String -> m (SBV (WordN n)) Source #

free_ :: MonadSymbolic m => m (SBV (WordN n)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (WordN n)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (WordN n)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (WordN n)] Source #

unliteral :: SBV (WordN n) -> Maybe (WordN n) Source #

isConcrete :: SBV (WordN n) -> Bool Source #

isSymbolic :: SBV (WordN n) -> Bool Source #

(KnownNat n, IsNonZero n) => SatModel (WordN n) Source # | Constructing models for `WordN`
Instance details Defined in Data.SBV.Core.Sized Methods parseCVs :: [CV] -> Maybe (WordN n, [CV]) Source # cvtModel :: (WordN n -> Maybe b) -> Maybe (WordN n, [CV]) -> Maybe (b, [CV]) Source #
(KnownNat n, IsNonZero n) => Metric (WordN n) Source # | Optimizing `WordN`

Instance details

Defined in Data.SBV.Core.Sized

Associated Types

type MetricSpace (WordN n) Source #

Methods

toMetricSpace :: SBV (WordN n) -> SBV (MetricSpace (WordN n)) Source #

fromMetricSpace :: SBV (MetricSpace (WordN n)) -> SBV (WordN n) Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV (WordN n) -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV (WordN n) -> m () Source #

(KnownNat n, IsNonZero n) => SDivisible (SWord n) Source # | `SDivisible` instance for `SWord`
Instance details Defined in Data.SBV.Core.Sized Methods sQuotRem :: SWord n -> SWord n -> (SWord n, SWord n) Source # sDivMod :: SWord n -> SWord n -> (SWord n, SWord n) Source # sQuot :: SWord n -> SWord n -> SWord n Source # sRem :: SWord n -> SWord n -> SWord n Source # sDiv :: SWord n -> SWord n -> SWord n Source # sMod :: SWord n -> SWord n -> SWord n Source #
(KnownNat n, IsNonZero n) => SDivisible (WordN n) Source # | `SDivisible` instance for `WordN`
Instance details Defined in Data.SBV.Core.Sized Methods sQuotRem :: WordN n -> WordN n -> (WordN n, WordN n) Source # sDivMod :: WordN n -> WordN n -> (WordN n, WordN n) Source # sQuot :: WordN n -> WordN n -> WordN n Source # sRem :: WordN n -> WordN n -> WordN n Source # sDiv :: WordN n -> WordN n -> WordN n Source # sMod :: WordN n -> WordN n -> WordN n Source #
(KnownNat n, IsNonZero n) => SFiniteBits (WordN n) Source # | `SFiniteBits` instance for `WordN`

Instance details

Defined in Data.SBV.Core.Sized

Methods

sFiniteBitSize :: SBV (WordN n) -> Int Source #

lsb :: SBV (WordN n) -> SBool Source #

msb :: SBV (WordN n) -> SBool Source #

blastBE :: SBV (WordN n) -> [SBool] Source #

blastLE :: SBV (WordN n) -> [SBool] Source #

fromBitsBE :: [SBool] -> SBV (WordN n) Source #

fromBitsLE :: [SBool] -> SBV (WordN n) Source #

sTestBit :: SBV (WordN n) -> Int -> SBool Source #

sExtractBits :: SBV (WordN n) -> [Int] -> [SBool] Source #

sPopCount :: SBV (WordN n) -> SWord8 Source #

setBitTo :: SBV (WordN n) -> Int -> SBool -> SBV (WordN n) Source #

fullAdder :: SBV (WordN n) -> SBV (WordN n) -> (SBool, SBV (WordN n)) Source #

fullMultiplier :: SBV (WordN n) -> SBV (WordN n) -> (SBV (WordN n), SBV (WordN n)) Source #

sCountLeadingZeros :: SBV (WordN n) -> SWord8 Source #

sCountTrailingZeros :: SBV (WordN n) -> SWord8 Source #

(KnownNat n, IsNonZero n) => SIntegral (WordN n) Source # | `SIntegral` instance for `WordN`
Instance details Defined in Data.SBV.Core.Sized
ByteConverter (SWord 8) Source # | `SWord` 8 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 8 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 8 Source #
ByteConverter (SWord 16) Source # | `SWord` 16 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 16 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 16 Source #
ByteConverter (SWord 32) Source # | `SWord` 32 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 32 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 32 Source #
ByteConverter (SWord 64) Source # | `SWord` 64 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 64 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 64 Source #
ByteConverter (SWord 128) Source # | `SWord` 128 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 128 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 128 Source #
ByteConverter (SWord 256) Source # | `SWord` 256 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 256 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 256 Source #
ByteConverter (SWord 512) Source # | `SWord` 512 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 512 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 512 Source #
ByteConverter (SWord 1024) Source # | `SWord` 1024 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 1024 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 1024 Source #
(KnownNat n, IsNonZero n) => Polynomial (SWord n) Source # |

Instance details

Defined in Data.SBV.Tools.Polynomial

Methods

polynomial :: [Int] -> SWord n Source #

pAdd :: SWord n -> SWord n -> SWord n Source #

pMult :: (SWord n, SWord n, [Int]) -> SWord n Source #

pDiv :: SWord n -> SWord n -> SWord n Source #

pMod :: SWord n -> SWord n -> SWord n Source #

pDivMod :: SWord n -> SWord n -> (SWord n, SWord n) Source #

showPoly :: SWord n -> String Source #

showPolynomial :: Bool -> SWord n -> String Source #

type MetricSpace (WordN n) Source # |
Instance details Defined in Data.SBV.Core.Sized type MetricSpace (WordN n) = WordN n

### Signed bit-vectors

type SInt8 = SBV Int8 Source #

8-bit signed symbolic value, 2's complement representation

type SInt16 = SBV Int16 Source #

16-bit signed symbolic value, 2's complement representation

type SInt32 = SBV Int32 Source #

32-bit signed symbolic value, 2's complement representation

type SInt64 = SBV Int64 Source #

64-bit signed symbolic value, 2's complement representation

type SInt (n :: Nat) = SBV (IntN n) Source #

A symbolic signed bit-vector carrying its size info

data IntN (n :: Nat) Source #

A signed bit-vector carrying its size info

#### Instances

Instances details

(KnownNat n, IsNonZero n) => Bounded (IntN n) Source # | `Bounded` instance for `IntN`
Instance details Defined in Data.SBV.Core.Sized Methods minBound :: IntN n maxBound :: IntN n
(KnownNat n, IsNonZero n) => Enum (IntN n) Source # | `Enum` instance for `IntN`
Instance details Defined in Data.SBV.Core.Sized Methods succ :: IntN n -> IntN n pred :: IntN n -> IntN n toEnum :: Int -> IntN n fromEnum :: IntN n -> Int enumFrom :: IntN n -> [IntN n] enumFromThen :: IntN n -> IntN n -> [IntN n] enumFromTo :: IntN n -> IntN n -> [IntN n] enumFromThenTo :: IntN n -> IntN n -> IntN n -> [IntN n]
Eq (IntN n) Source # |
Instance details Defined in Data.SBV.Core.Sized Methods (==) :: IntN n -> IntN n -> Bool (/=) :: IntN n -> IntN n -> Bool
(KnownNat n, IsNonZero n) => Integral (IntN n) Source # | `Integral` instance for `IntN`
Instance details Defined in Data.SBV.Core.Sized Methods quot :: IntN n -> IntN n -> IntN n rem :: IntN n -> IntN n -> IntN n div :: IntN n -> IntN n -> IntN n mod :: IntN n -> IntN n -> IntN n quotRem :: IntN n -> IntN n -> (IntN n, IntN n) divMod :: IntN n -> IntN n -> (IntN n, IntN n) toInteger :: IntN n -> Integer
(KnownNat n, IsNonZero n) => Num (IntN n) Source # | `Num` instance for `IntN`
Instance details Defined in Data.SBV.Core.Sized Methods (+) :: IntN n -> IntN n -> IntN n (-) :: IntN n -> IntN n -> IntN n (*) :: IntN n -> IntN n -> IntN n negate :: IntN n -> IntN n abs :: IntN n -> IntN n signum :: IntN n -> IntN n fromInteger :: Integer -> IntN n
Ord (IntN n) Source # |
Instance details Defined in Data.SBV.Core.Sized Methods compare :: IntN n -> IntN n -> Ordering (<) :: IntN n -> IntN n -> Bool (<=) :: IntN n -> IntN n -> Bool (>) :: IntN n -> IntN n -> Bool (>=) :: IntN n -> IntN n -> Bool max :: IntN n -> IntN n -> IntN n min :: IntN n -> IntN n -> IntN n
(KnownNat n, IsNonZero n) => Real (IntN n) Source # | `Real` instance for `IntN`
Instance details Defined in Data.SBV.Core.Sized Methods toRational :: IntN n -> Rational
Show (IntN n) Source # | Show instance for `IntN`
Instance details Defined in Data.SBV.Core.Sized Methods showsPrec :: Int -> IntN n -> ShowS show :: IntN n -> String showList :: [IntN n] -> ShowS
(KnownNat n, IsNonZero n) => Bits (IntN n) Source # |

Instance details

Defined in Data.SBV.Core.Sized

Methods

(.&.) :: IntN n -> IntN n -> IntN n

(.|.) :: IntN n -> IntN n -> IntN n

xor :: IntN n -> IntN n -> IntN n

complement :: IntN n -> IntN n

shift :: IntN n -> Int -> IntN n

rotate :: IntN n -> Int -> IntN n

zeroBits :: IntN n

bit :: Int -> IntN n

setBit :: IntN n -> Int -> IntN n

clearBit :: IntN n -> Int -> IntN n

complementBit :: IntN n -> Int -> IntN n

testBit :: IntN n -> Int -> Bool

bitSizeMaybe :: IntN n -> Maybe Int

bitSize :: IntN n -> Int

isSigned :: IntN n -> Bool

shiftL :: IntN n -> Int -> IntN n

unsafeShiftL :: IntN n -> Int -> IntN n

shiftR :: IntN n -> Int -> IntN n

unsafeShiftR :: IntN n -> Int -> IntN n

rotateL :: IntN n -> Int -> IntN n

rotateR :: IntN n -> Int -> IntN n

popCount :: IntN n -> Int

(KnownNat n, IsNonZero n) => HasKind (IntN n) Source # | `IntN` has a kind

Instance details

Defined in Data.SBV.Core.Sized

Methods

kindOf :: IntN n -> Kind Source #

hasSign :: IntN n -> Bool Source #

intSizeOf :: IntN n -> Int Source #

isBoolean :: IntN n -> Bool Source #

isBounded :: IntN n -> Bool Source #

isReal :: IntN n -> Bool Source #

isFloat :: IntN n -> Bool Source #

isDouble :: IntN n -> Bool Source #

isUnbounded :: IntN n -> Bool Source #

isUninterpreted :: IntN n -> Bool Source #

isChar :: IntN n -> Bool Source #

isString :: IntN n -> Bool Source #

isList :: IntN n -> Bool Source #

isSet :: IntN n -> Bool Source #

isTuple :: IntN n -> Bool Source #

isMaybe :: IntN n -> Bool Source #

isEither :: IntN n -> Bool Source #

showType :: IntN n -> String Source #

(KnownNat n, IsNonZero n) => SymVal (IntN n) Source # | `SymVal` instance for `IntN`

Instance details

Defined in Data.SBV.Core.Sized

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (IntN n)) Source #

literal :: IntN n -> SBV (IntN n) Source #

fromCV :: CV -> IntN n Source #

isConcretely :: SBV (IntN n) -> (IntN n -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (IntN n)) Source #

forall_ :: MonadSymbolic m => m (SBV (IntN n)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (IntN n)] Source #

exists :: MonadSymbolic m => String -> m (SBV (IntN n)) Source #

exists_ :: MonadSymbolic m => m (SBV (IntN n)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (IntN n)] Source #

free :: MonadSymbolic m => String -> m (SBV (IntN n)) Source #

free_ :: MonadSymbolic m => m (SBV (IntN n)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (IntN n)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (IntN n)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (IntN n)] Source #

unliteral :: SBV (IntN n) -> Maybe (IntN n) Source #

isConcrete :: SBV (IntN n) -> Bool Source #

isSymbolic :: SBV (IntN n) -> Bool Source #

(KnownNat n, IsNonZero n) => SatModel (IntN n) Source # | Constructing models for `IntN`
Instance details Defined in Data.SBV.Core.Sized Methods parseCVs :: [CV] -> Maybe (IntN n, [CV]) Source # cvtModel :: (IntN n -> Maybe b) -> Maybe (IntN n, [CV]) -> Maybe (b, [CV]) Source #
(KnownNat n, IsNonZero n) => Metric (IntN n) Source # | Optimizing `IntN`

Instance details

Defined in Data.SBV.Core.Sized

Associated Types

type MetricSpace (IntN n) Source #

Methods

toMetricSpace :: SBV (IntN n) -> SBV (MetricSpace (IntN n)) Source #

fromMetricSpace :: SBV (MetricSpace (IntN n)) -> SBV (IntN n) Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV (IntN n) -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV (IntN n) -> m () Source #

(KnownNat n, IsNonZero n) => SDivisible (SInt n) Source # | `SDivisible` instance for `SInt`
Instance details Defined in Data.SBV.Core.Sized Methods sQuotRem :: SInt n -> SInt n -> (SInt n, SInt n) Source # sDivMod :: SInt n -> SInt n -> (SInt n, SInt n) Source # sQuot :: SInt n -> SInt n -> SInt n Source # sRem :: SInt n -> SInt n -> SInt n Source # sDiv :: SInt n -> SInt n -> SInt n Source # sMod :: SInt n -> SInt n -> SInt n Source #
(KnownNat n, IsNonZero n) => SDivisible (IntN n) Source # | `SDivisible` instance for `IntN`
Instance details Defined in Data.SBV.Core.Sized Methods sQuotRem :: IntN n -> IntN n -> (IntN n, IntN n) Source # sDivMod :: IntN n -> IntN n -> (IntN n, IntN n) Source # sQuot :: IntN n -> IntN n -> IntN n Source # sRem :: IntN n -> IntN n -> IntN n Source # sDiv :: IntN n -> IntN n -> IntN n Source # sMod :: IntN n -> IntN n -> IntN n Source #
(KnownNat n, IsNonZero n) => SFiniteBits (IntN n) Source # | `SFiniteBits` instance for `IntN`

Instance details

Defined in Data.SBV.Core.Sized

Methods

sFiniteBitSize :: SBV (IntN n) -> Int Source #

lsb :: SBV (IntN n) -> SBool Source #

msb :: SBV (IntN n) -> SBool Source #

blastBE :: SBV (IntN n) -> [SBool] Source #

blastLE :: SBV (IntN n) -> [SBool] Source #

fromBitsBE :: [SBool] -> SBV (IntN n) Source #

fromBitsLE :: [SBool] -> SBV (IntN n) Source #

sTestBit :: SBV (IntN n) -> Int -> SBool Source #

sExtractBits :: SBV (IntN n) -> [Int] -> [SBool] Source #

sPopCount :: SBV (IntN n) -> SWord8 Source #

setBitTo :: SBV (IntN n) -> Int -> SBool -> SBV (IntN n) Source #

fullAdder :: SBV (IntN n) -> SBV (IntN n) -> (SBool, SBV (IntN n)) Source #

fullMultiplier :: SBV (IntN n) -> SBV (IntN n) -> (SBV (IntN n), SBV (IntN n)) Source #

sCountLeadingZeros :: SBV (IntN n) -> SWord8 Source #

sCountTrailingZeros :: SBV (IntN n) -> SWord8 Source #

(KnownNat n, IsNonZero n) => SIntegral (IntN n) Source # | `SIntegral` instance for `IntN`
Instance details Defined in Data.SBV.Core.Sized
type MetricSpace (IntN n) Source # |
Instance details Defined in Data.SBV.Core.Sized type MetricSpace (IntN n) = WordN n

### Converting between fixed-size and arbitrary bitvectors

type family IsNonZero (arg :: Nat) :: Constraint where ... Source #

Type family to create the appropriate non-zero constraint

Equations

IsNonZero 0 = TypeError ZeroWidth |
IsNonZero n = () |

type family FromSized (t :: Type) :: Type where ... Source #

Capture the correspondence between sized and fixed-sized BVs

Equations

FromSized (WordN 8) = Word8 |
FromSized (WordN 16) = Word16 |
FromSized (WordN 32) = Word32 |
FromSized (WordN 64) = Word64 |
FromSized (IntN 8) = Int8 |
FromSized (IntN 16) = Int16 |
FromSized (IntN 32) = Int32 |
FromSized (IntN 64) = Int64 |
FromSized (SWord 8) = SWord8 |
FromSized (SWord 16) = SWord16 |
FromSized (SWord 32) = SWord32 |
FromSized (SWord 64) = SWord64 |
FromSized (SInt 8) = SInt8 |
FromSized (SInt 16) = SInt16 |
FromSized (SInt 32) = SInt32 |
FromSized (SInt 64) = SInt64 |

type family ToSized (t :: Type) :: Type where ... Source #

Capture the correspondence between fixed-sized and sized BVs

Equations

ToSized Word8 = WordN 8 |
ToSized Word16 = WordN 16 |
ToSized Word32 = WordN 32 |
ToSized Word64 = WordN 64 |
ToSized Int8 = IntN 8 |
ToSized Int16 = IntN 16 |
ToSized Int32 = IntN 32 |
ToSized Int64 = IntN 64 |
ToSized SWord8 = SWord 8 |
ToSized SWord16 = SWord 16 |
ToSized SWord32 = SWord 32 |
ToSized SWord64 = SWord 64 |
ToSized SInt8 = SInt 8 |
ToSized SInt16 = SInt 16 |
ToSized SInt32 = SInt 32 |
ToSized SInt64 = SInt 64 |

fromSized :: FromSizedBV a => a -> FromSized a Source #

Convert a sized bit-vector to the corresponding fixed-sized bit-vector, for instance 'SWord 16' to `SWord16`. See also `toSized`.

toSized :: ToSizedBV a => a -> ToSized a Source #

Convert a fixed-sized bit-vector to the corresponding sized bit-vector, for instance `SWord16` to 'SWord 16'. See also `fromSized`.

## Unbounded integers

The SBV library supports unbounded signed integers with the type `SInteger`, which are not subject to overflow/underflow as it is the case with the bounded types, such as `SWord8`, `SInt16`, etc. However, some bit-vector based operations are not supported for the `SInteger` type while in the verification mode. That is, you can use these operations on `SInteger` values during normal programming/simulation. but the SMT translation will not support these operations since there corresponding operations are not supported in SMT-Lib. Note that this should rarely be a problem in practice, as these operations are mostly meaningful on fixed-size bit-vectors. The operations that are restricted to bounded word/int sizes are:

- Rotations and shifts: `rotateL`, `rotateR`, `shiftL`, `shiftR`
- Bitwise logical ops: `.&.`, `.|.`, `xor`, `complement`
- Extraction and concatenation: `bvExtract`, `#`, `zeroExtend`, `signExtend`, `bvDrop`, and `bvTake`

Usual arithmetic (`+`, `-`, `*`, `sQuotRem`, `sQuot`, `sRem`, `sDivMod`, `sDiv`, `sMod`) and logical operations (`.<`, `.<=`, `.>`, `.>=`, `.==`, `./=`) operations are supported for `SInteger` fully, both in programming and verification modes.

type SInteger = SBV Integer Source #

Infinite precision signed symbolic value

## Floating point numbers

Floating point numbers are defined by the IEEE-754 standard; and correspond to Haskell's `Float` and `Double` types. For SMT support with floating-point numbers, see the paper by Rummer and Wahl: http://www.philipp.ruemmer.org/publications/smt-fpa.pdf.

type SFloat = SBV Float Source #

IEEE-754 single-precision floating point numbers

type SDouble = SBV Double Source #

IEEE-754 double-precision floating point numbers

## Algebraic reals

Algebraic reals are roots of single-variable polynomials with rational coefficients. (See http://en.wikipedia.org/wiki/Algebraic_number.) Note that algebraic reals are infinite precision numbers, but they do not cover all real numbers. (In particular, they cannot represent transcendentals.) Some irrational numbers are algebraic (such as `sqrt 2`), while others are not (such as pi and e).

SBV can deal with real numbers just fine, since the theory of reals is decidable. (See http://smtlib.cs.uiowa.edu/theories-Reals.shtml.) In addition, by leveraging backend solver capabilities, SBV can also represent and solve non-linear equations involving real-variables. (For instance, the Z3 SMT solver, supports polynomial constraints on reals starting with v4.0.)

type SReal = SBV AlgReal Source #

Infinite precision symbolic algebraic real value

data AlgReal Source #

Algebraic reals. Note that the representation is left abstract. We represent rational results explicitly, while the roots-of-polynomials are represented implicitly by their defining equation

#### Instances

Instances details

Eq AlgReal Source # |
Instance details Defined in Data.SBV.Core.AlgReals Methods (==) :: AlgReal -> AlgReal -> Bool (/=) :: AlgReal -> AlgReal -> Bool
Fractional AlgReal Source # | NB: Following the other types we have, we require `a/0` to be `0` for all a.
Instance details Defined in Data.SBV.Core.AlgReals Methods (/) :: AlgReal -> AlgReal -> AlgReal recip :: AlgReal -> AlgReal fromRational :: Rational -> AlgReal
Num AlgReal Source # |
Instance details Defined in Data.SBV.Core.AlgReals Methods (+) :: AlgReal -> AlgReal -> AlgReal (-) :: AlgReal -> AlgReal -> AlgReal (*) :: AlgReal -> AlgReal -> AlgReal negate :: AlgReal -> AlgReal abs :: AlgReal -> AlgReal signum :: AlgReal -> AlgReal fromInteger :: Integer -> AlgReal
Ord AlgReal Source # |
Instance details Defined in Data.SBV.Core.AlgReals Methods compare :: AlgReal -> AlgReal -> Ordering (<) :: AlgReal -> AlgReal -> Bool (<=) :: AlgReal -> AlgReal -> Bool (>) :: AlgReal -> AlgReal -> Bool (>=) :: AlgReal -> AlgReal -> Bool max :: AlgReal -> AlgReal -> AlgReal min :: AlgReal -> AlgReal -> AlgReal
Real AlgReal Source # |
Instance details Defined in Data.SBV.Core.AlgReals Methods toRational :: AlgReal -> Rational
Show AlgReal Source # |
Instance details Defined in Data.SBV.Core.AlgReals Methods showsPrec :: Int -> AlgReal -> ShowS show :: AlgReal -> String showList :: [AlgReal] -> ShowS
Arbitrary AlgReal Source # |
Instance details Defined in Data.SBV.Core.AlgReals Methods arbitrary :: Gen AlgReal Source # shrink :: AlgReal -> [AlgReal] Source #
Random AlgReal Source # |
Instance details Defined in Data.SBV.Core.AlgReals Methods randomR :: RandomGen g => (AlgReal, AlgReal) -> g -> (AlgReal, g) Source # random :: RandomGen g => g -> (AlgReal, g) Source # randomRs :: RandomGen g => (AlgReal, AlgReal) -> g -> [AlgReal] Source # randoms :: RandomGen g => g -> [AlgReal] Source # randomRIO :: (AlgReal, AlgReal) -> IO AlgReal Source # randomIO :: IO AlgReal Source #
HasKind AlgReal Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: AlgReal -> Kind Source #

hasSign :: AlgReal -> Bool Source #

intSizeOf :: AlgReal -> Int Source #

isBoolean :: AlgReal -> Bool Source #

isBounded :: AlgReal -> Bool Source #

isReal :: AlgReal -> Bool Source #

isFloat :: AlgReal -> Bool Source #

isDouble :: AlgReal -> Bool Source #

isUnbounded :: AlgReal -> Bool Source #

isUninterpreted :: AlgReal -> Bool Source #

isChar :: AlgReal -> Bool Source #

isString :: AlgReal -> Bool Source #

isList :: AlgReal -> Bool Source #

isSet :: AlgReal -> Bool Source #

isTuple :: AlgReal -> Bool Source #

isMaybe :: AlgReal -> Bool Source #

isEither :: AlgReal -> Bool Source #

showType :: AlgReal -> String Source #

SymVal AlgReal Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV AlgReal) Source #

literal :: AlgReal -> SBV AlgReal Source #

fromCV :: CV -> AlgReal Source #

isConcretely :: SBV AlgReal -> (AlgReal -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV AlgReal) Source #

forall_ :: MonadSymbolic m => m (SBV AlgReal) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV AlgReal] Source #

exists :: MonadSymbolic m => String -> m (SBV AlgReal) Source #

exists_ :: MonadSymbolic m => m (SBV AlgReal) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV AlgReal] Source #

free :: MonadSymbolic m => String -> m (SBV AlgReal) Source #

free_ :: MonadSymbolic m => m (SBV AlgReal) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV AlgReal] Source #

symbolic :: MonadSymbolic m => String -> m (SBV AlgReal) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV AlgReal] Source #

unliteral :: SBV AlgReal -> Maybe AlgReal Source #

isConcrete :: SBV AlgReal -> Bool Source #

isSymbolic :: SBV AlgReal -> Bool Source #

SatModel AlgReal Source # | `AlgReal` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (AlgReal, [CV]) Source # cvtModel :: (AlgReal -> Maybe b) -> Maybe (AlgReal, [CV]) -> Maybe (b, [CV]) Source #
Metric AlgReal Source # |

Instance details

Defined in Data.SBV.Core.Model

Associated Types

type MetricSpace AlgReal Source #

Methods

toMetricSpace :: SBV AlgReal -> SBV (MetricSpace AlgReal) Source #

fromMetricSpace :: SBV (MetricSpace AlgReal) -> SBV AlgReal Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV AlgReal -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV AlgReal -> m () Source #

IEEEFloatConvertible AlgReal Source # |
Instance details Defined in Data.SBV.Core.Floating Methods fromSFloat :: SRoundingMode -> SFloat -> SBV AlgReal Source # toSFloat :: SRoundingMode -> SBV AlgReal -> SFloat Source # fromSDouble :: SRoundingMode -> SDouble -> SBV AlgReal Source # toSDouble :: SRoundingMode -> SBV AlgReal -> SDouble Source #
type MetricSpace AlgReal Source # |
Instance details Defined in Data.SBV.Core.Model type MetricSpace AlgReal = AlgReal

sRealToSInteger :: SReal -> SInteger Source #

Convert an SReal to an SInteger. That is, it computes the largest integer `n` that satisfies `sIntegerToSReal n <= r` essentially giving us the `floor`.

For instance, `1.3` will be `1`, but `-1.3` will be `-2`.

algRealToRational :: AlgReal -> Either Rational Rational Source #

Convert an `AlgReal` to a `Rational`. If the `AlgReal` is exact, then you get a `Left` value. Otherwise, you get a `Right` value which is simply an approximation.

## Characters, Strings and Regular Expressions

Support for characters, strings, and regular expressions (intial version contributed by Joel Burget) adds support for QF_S logic, described here: http://smtlib.cs.uiowa.edu/theories-UnicodeStrings.shtml and here: http://rise4fun.com/z3/tutorialcontent/sequences. Note that this logic is still not part of official SMTLib (as of March 2018), so it should be considered experimental.

See Data.SBV.Char, Data.SBV.String, Data.SBV.RegExp for related functions.

type SChar = SBV Char Source #

A symbolic character. Note that, as far as SBV's symbolic strings are concerned, a character is currently an 8-bit unsigned value, corresponding to the ISO-8859-1 (Latin-1) character set: http://en.wikipedia.org/wiki/ISO/IEC_8859-1. A Haskell `Char`, on the other hand, is based on unicode. Therefore, there isn't a 1-1 correspondence between a Haskell character and an SBV character for the time being. This limitation is due to the SMT-solvers only supporting this particular subset. However, there is a pending proposal to add support for unicode, and SBV will track these changes to have full unicode support as solvers become available. For details, see: http://smtlib.cs.uiowa.edu/theories-UnicodeStrings.shtml

type SString = SBV String Source #

A symbolic string. Note that a symbolic string is not a list of symbolic characters, that is, it is not the case that `SString = [SChar]`, unlike what one might expect following Haskell strings. An `SString` is a symbolic value of its own, of possibly arbitrary but finite length, and internally processed as one unit as opposed to a fixed-length list of characters.

## Symbolic lists

Support for symbolic lists (intial version contributed by Joel Burget) adds support for sequence support, described here: http://rise4fun.com/z3/tutorialcontent/sequences. Note that this logic is still not part of official SMTLib (as of March 2018), so it should be considered experimental.

See Data.SBV.List for related functions.

type SList a = SBV [a] Source #

A symbolic list of items. Note that a symbolic list is not a list of symbolic items, that is, it is not the case that `SList a = [a]`, unlike what one might expect following haskell lists/sequences. An `SList` is a symbolic value of its own, of possibly arbitrary but finite length, and internally processed as one unit as opposed to a fixed-length list of items. Note that lists can be nested, i.e., we do allow lists of lists of ... items.

## Tuples

Tuples can be used as symbolic values. This is useful in combination with lists, for example `SBV [(Integer, String)]` is a valid type. These types can be arbitrarily nested, eg `SBV [(Integer, [(Char, (Integer, String))])]`. Instances of upto 8-tuples are provided.

class SymTuple a Source #

Identify tuple like things. Note that there are no methods, just instances to control type inference

#### Instances

Instances details

SymTuple () Source # |
Instance details Defined in Data.SBV.Core.Model
SymTuple (a, b) Source # |
Instance details Defined in Data.SBV.Core.Model
SymTuple (a, b, c) Source # |
Instance details Defined in Data.SBV.Core.Model
SymTuple (a, b, c, d) Source # |
Instance details Defined in Data.SBV.Core.Model
SymTuple (a, b, c, d, e) Source # |
Instance details Defined in Data.SBV.Core.Model
SymTuple (a, b, c, d, e, f) Source # |
Instance details Defined in Data.SBV.Core.Model
SymTuple (a, b, c, d, e, f, g) Source # |
Instance details Defined in Data.SBV.Core.Model
SymTuple (a, b, c, d, e, f, g, h) Source # |
Instance details Defined in Data.SBV.Core.Model

type STuple a b = SBV (a, b) Source #

Symbolic 2-tuple. NB. `STuple` and `STuple2` are equivalent.

type STuple2 a b = SBV (a, b) Source #

Symbolic 2-tuple. NB. `STuple` and `STuple2` are equivalent.

type STuple3 a b c = SBV (a, b, c) Source #

Symbolic 3-tuple.

type STuple4 a b c d = SBV (a, b, c, d) Source #

Symbolic 4-tuple.

type STuple5 a b c d e = SBV (a, b, c, d, e) Source #

Symbolic 5-tuple.

type STuple6 a b c d e f = SBV (a, b, c, d, e, f) Source #

Symbolic 6-tuple.

type STuple7 a b c d e f g = SBV (a, b, c, d, e, f, g) Source #

Symbolic 7-tuple.

type STuple8 a b c d e f g h = SBV (a, b, c, d, e, f, g, h) Source #

Symbolic 8-tuple.

## Sum types

type SMaybe a = SBV (Maybe a) Source #

Symbolic `Maybe`

type SEither a b = SBV (Either a b) Source #

Symbolic `Either`

## Sets

data RCSet a Source #

A `RCSet` is either a regular set or a set given by its complement from the corresponding universal set.

Constructors

RegularSet (Set a) |
ComplementSet (Set a) |

#### Instances

Instances details

Show a => Show (RCSet a) Source # | Show instance. Regular sets are shown as usual. Complements are shown "U -" notation.
Instance details Defined in Data.SBV.Core.Concrete Methods showsPrec :: Int -> RCSet a -> ShowS show :: RCSet a -> String showList :: [RCSet a] -> ShowS
HasKind a => HasKind (RCSet a) Source # |

Instance details

Defined in Data.SBV.Core.Concrete

Methods

kindOf :: RCSet a -> Kind Source #

hasSign :: RCSet a -> Bool Source #

intSizeOf :: RCSet a -> Int Source #

isBoolean :: RCSet a -> Bool Source #

isBounded :: RCSet a -> Bool Source #

isReal :: RCSet a -> Bool Source #

isFloat :: RCSet a -> Bool Source #

isDouble :: RCSet a -> Bool Source #

isUnbounded :: RCSet a -> Bool Source #

isUninterpreted :: RCSet a -> Bool Source #

isChar :: RCSet a -> Bool Source #

isString :: RCSet a -> Bool Source #

isList :: RCSet a -> Bool Source #

isSet :: RCSet a -> Bool Source #

isTuple :: RCSet a -> Bool Source #

isMaybe :: RCSet a -> Bool Source #

isEither :: RCSet a -> Bool Source #

showType :: RCSet a -> String Source #

(Ord a, SymVal a) => SymVal (RCSet a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (RCSet a)) Source #

literal :: RCSet a -> SBV (RCSet a) Source #

fromCV :: CV -> RCSet a Source #

isConcretely :: SBV (RCSet a) -> (RCSet a -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (RCSet a)) Source #

forall_ :: MonadSymbolic m => m (SBV (RCSet a)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (RCSet a)] Source #

exists :: MonadSymbolic m => String -> m (SBV (RCSet a)) Source #

exists_ :: MonadSymbolic m => m (SBV (RCSet a)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (RCSet a)] Source #

free :: MonadSymbolic m => String -> m (SBV (RCSet a)) Source #

free_ :: MonadSymbolic m => m (SBV (RCSet a)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (RCSet a)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (RCSet a)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (RCSet a)] Source #

unliteral :: SBV (RCSet a) -> Maybe (RCSet a) Source #

isConcrete :: SBV (RCSet a) -> Bool Source #

isSymbolic :: SBV (RCSet a) -> Bool Source #

type SSet a = SBV (RCSet a) Source #

Symbolic `Set`. Note that we use `RCSet`, which supports both regular sets and complements, i.e., those obtained from the universal set (of the right type) by removing elements.

# Arrays of symbolic values

class SymArray array where Source #

Flat arrays of symbolic values An `array a b` is an array indexed by the type ``SBV` a`, with elements of type ``SBV` b`.

If a default value is supplied, then all the array elements will be initialized to this value. Otherwise, they will be left unspecified, i.e., a read from an unwritten location will produce an uninterpreted constant.

While it's certainly possible for user to create instances of `SymArray`, the `SArray` and `SFunArray` instances already provided should cover most use cases in practice. Note that there are a few differences between these two models in terms of use models:

- `SArray` produces SMTLib arrays, and requires a solver that understands the array theory. `SFunArray` is internally handled, and thus can be used with any solver. (Note that all solvers except `abc` support arrays, so this isn't a big decision factor.)
- For both arrays, if a default value is supplied, then reading from uninitialized cell will return that value. If the default is not given, then reading from uninitialized cells is still OK for both arrays, and will produce an uninterpreted constant in both cases.
- Only `SArray` supports checking equality of arrays. (That is, checking if an entire array is equivalent to another.) `SFunArray`s cannot be checked for equality. In general, checking wholesale equality of arrays is a difficult decision problem and should be avoided if possible.
- Only `SFunArray` supports compilation to C. Programs using `SArray` will not be accepted by the C-code generator.
- You cannot use quickcheck on programs that contain these arrays. (Neither `SArray` nor `SFunArray`.)
- With `SArray`, SBV transfers all array-processing to the SMT-solver. So, it can generate programs more quickly, but they might end up being too hard for the solver to handle. With `SFunArray`, SBV only generates code for individual elements and the array itself never shows up in the resulting SMTLib program. This puts more onus on the SBV side and might have some performance impacts, but it might generate problems that are easier for the SMT solvers to handle.

As a rule of thumb, try `SArray` first. These should generate compact code. However, if the backend solver has hard time solving the generated problems, switch to `SFunArray`. If you still have issues, please report so we can see what the problem might be!

Methods

readArray :: array a b -> SBV a -> SBV b Source #

Read the array element at `a`

writeArray :: SymVal b => array a b -> SBV a -> SBV b -> array a b Source #

Update the element at `a` to be `b`

mergeArrays :: SymVal b => SBV Bool -> array a b -> array a b -> array a b Source #

Merge two given arrays on the symbolic condition Intuitively: `mergeArrays cond a b = if cond then a else b`. Merging pushes the if-then-else choice down on to elements

#### Instances

Instances details

SymArray SFunArray Source # |

Instance details

Defined in Data.SBV.Core.Data

Methods

newArray_ :: (MonadSymbolic m, HasKind a, HasKind b) => Maybe (SBV b) -> m (SFunArray a b) Source #

newArray :: (MonadSymbolic m, HasKind a, HasKind b) => String -> Maybe (SBV b) -> m (SFunArray a b) Source #

readArray :: SFunArray a b -> SBV a -> SBV b Source #

writeArray :: SymVal b => SFunArray a b -> SBV a -> SBV b -> SFunArray a b Source #

mergeArrays :: SymVal b => SBV Bool -> SFunArray a b -> SFunArray a b -> SFunArray a b Source #

newArrayInState :: (HasKind a, HasKind b) => Maybe String -> Maybe (SBV b) -> State -> IO (SFunArray a b) Source #

SymArray SArray Source # |

Instance details

Defined in Data.SBV.Core.Data

Methods

newArray_ :: (MonadSymbolic m, HasKind a, HasKind b) => Maybe (SBV b) -> m (SArray a b) Source #

newArray :: (MonadSymbolic m, HasKind a, HasKind b) => String -> Maybe (SBV b) -> m (SArray a b) Source #

readArray :: SArray a b -> SBV a -> SBV b Source #

writeArray :: SymVal b => SArray a b -> SBV a -> SBV b -> SArray a b Source #

mergeArrays :: SymVal b => SBV Bool -> SArray a b -> SArray a b -> SArray a b Source #

newArrayInState :: (HasKind a, HasKind b) => Maybe String -> Maybe (SBV b) -> State -> IO (SArray a b) Source #

newArray_ :: (SymArray array, HasKind a, HasKind b) => Maybe (SBV b) -> Symbolic (array a b) Source #

Create a new anonymous array, possibly with a default initial value.

NB. For a version which generalizes over the underlying monad, see `newArray_`

newArray :: (SymArray array, HasKind a, HasKind b) => String -> Maybe (SBV b) -> Symbolic (array a b) Source #

Create a named new array, possibly with a default initial value.

NB. For a version which generalizes over the underlying monad, see `newArray`

data SArray a b Source #

Arrays implemented in terms of SMT-arrays: http://smtlib.cs.uiowa.edu/theories-ArraysEx.shtml

- Maps directly to SMT-lib arrays
- Reading from an unintialized value is OK. If the default value is given in `newArray`, it will be the result. Otherwise, the read yields an uninterpreted constant.
- Can check for equality of these arrays
- Cannot be used in code-generation (i.e., compilation to C)
- Cannot quick-check theorems using `SArray` values
- Typically slower as it heavily relies on SMT-solving for the array theory

#### Instances

Instances details

SymArray SArray Source # |

Instance details

Defined in Data.SBV.Core.Data

Methods

newArray_ :: (MonadSymbolic m, HasKind a, HasKind b) => Maybe (SBV b) -> m (SArray a b) Source #

newArray :: (MonadSymbolic m, HasKind a, HasKind b) => String -> Maybe (SBV b) -> m (SArray a b) Source #

readArray :: SArray a b -> SBV a -> SBV b Source #

writeArray :: SymVal b => SArray a b -> SBV a -> SBV b -> SArray a b Source #

mergeArrays :: SymVal b => SBV Bool -> SArray a b -> SArray a b -> SArray a b Source #

newArrayInState :: (HasKind a, HasKind b) => Maybe String -> Maybe (SBV b) -> State -> IO (SArray a b) Source #

(HasKind a, HasKind b, MProvable m p) => MProvable m (SArray a b -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

forAll_ :: (SArray a b -> p) -> SymbolicT m SBool Source #

forAll :: [String] -> (SArray a b -> p) -> SymbolicT m SBool Source #

forSome_ :: (SArray a b -> p) -> SymbolicT m SBool Source #

forSome :: [String] -> (SArray a b -> p) -> SymbolicT m SBool Source #

prove :: (SArray a b -> p) -> m ThmResult Source #

proveWith :: SMTConfig -> (SArray a b -> p) -> m ThmResult Source #

sat :: (SArray a b -> p) -> m SatResult Source #

satWith :: SMTConfig -> (SArray a b -> p) -> m SatResult Source #

allSat :: (SArray a b -> p) -> m AllSatResult Source #

allSatWith :: SMTConfig -> (SArray a b -> p) -> m AllSatResult Source #

optimize :: OptimizeStyle -> (SArray a b -> p) -> m OptimizeResult Source #

optimizeWith :: SMTConfig -> OptimizeStyle -> (SArray a b -> p) -> m OptimizeResult Source #

isVacuous :: (SArray a b -> p) -> m Bool Source #

isVacuousWith :: SMTConfig -> (SArray a b -> p) -> m Bool Source #

isTheorem :: (SArray a b -> p) -> m Bool Source #

isTheoremWith :: SMTConfig -> (SArray a b -> p) -> m Bool Source #

isSatisfiable :: (SArray a b -> p) -> m Bool Source #

isSatisfiableWith :: SMTConfig -> (SArray a b -> p) -> m Bool Source #

validate :: Bool -> SMTConfig -> (SArray a b -> p) -> SMTResult -> m SMTResult Source #

(HasKind a, HasKind b) => Show (SArray a b) Source # |
Instance details Defined in Data.SBV.Core.Data Methods showsPrec :: Int -> SArray a b -> ShowS show :: SArray a b -> String showList :: [SArray a b] -> ShowS
SymVal b => Mergeable (SArray a b) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> SArray a b -> SArray a b -> SArray a b Source # select :: (Ord b0, SymVal b0, Num b0) => [SArray a b] -> SArray a b -> SBV b0 -> SArray a b Source #
EqSymbolic (SArray a b) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: SArray a b -> SArray a b -> SBool Source #

(./=) :: SArray a b -> SArray a b -> SBool Source #

(.===) :: SArray a b -> SArray a b -> SBool Source #

(./==) :: SArray a b -> SArray a b -> SBool Source #

distinct :: [SArray a b] -> SBool Source #

distinctExcept :: [SArray a b] -> [SArray a b] -> SBool Source #

allEqual :: [SArray a b] -> SBool Source #

sElem :: SArray a b -> [SArray a b] -> SBool Source #

sNotElem :: SArray a b -> [SArray a b] -> SBool Source #

data SFunArray a b Source #

Arrays implemented internally, without translating to SMT-Lib functions:

- Internally handled by the library and not mapped to SMT-Lib, hence can be used with solvers that don't support arrays. (Such as abc.)
- Reading from an unintialized value is OK. If the default value is given in `newArray`, it will be the result. Otherwise, the read yields an uninterpreted constant.
- Cannot check for equality of arrays.
- Can be used in code-generation (i.e., compilation to C).
- Can not quick-check theorems using `SFunArray` values
- Typically faster as it gets compiled away during translation.

#### Instances

Instances details

SymArray SFunArray Source # |

Instance details

Defined in Data.SBV.Core.Data

Methods

newArray_ :: (MonadSymbolic m, HasKind a, HasKind b) => Maybe (SBV b) -> m (SFunArray a b) Source #

newArray :: (MonadSymbolic m, HasKind a, HasKind b) => String -> Maybe (SBV b) -> m (SFunArray a b) Source #

readArray :: SFunArray a b -> SBV a -> SBV b Source #

writeArray :: SymVal b => SFunArray a b -> SBV a -> SBV b -> SFunArray a b Source #

mergeArrays :: SymVal b => SBV Bool -> SFunArray a b -> SFunArray a b -> SFunArray a b Source #

newArrayInState :: (HasKind a, HasKind b) => Maybe String -> Maybe (SBV b) -> State -> IO (SFunArray a b) Source #

(HasKind a, HasKind b, MProvable m p) => MProvable m (SFunArray a b -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

forAll_ :: (SFunArray a b -> p) -> SymbolicT m SBool Source #

forAll :: [String] -> (SFunArray a b -> p) -> SymbolicT m SBool Source #

forSome_ :: (SFunArray a b -> p) -> SymbolicT m SBool Source #

forSome :: [String] -> (SFunArray a b -> p) -> SymbolicT m SBool Source #

prove :: (SFunArray a b -> p) -> m ThmResult Source #

proveWith :: SMTConfig -> (SFunArray a b -> p) -> m ThmResult Source #

sat :: (SFunArray a b -> p) -> m SatResult Source #

satWith :: SMTConfig -> (SFunArray a b -> p) -> m SatResult Source #

allSat :: (SFunArray a b -> p) -> m AllSatResult Source #

allSatWith :: SMTConfig -> (SFunArray a b -> p) -> m AllSatResult Source #

optimize :: OptimizeStyle -> (SFunArray a b -> p) -> m OptimizeResult Source #

optimizeWith :: SMTConfig -> OptimizeStyle -> (SFunArray a b -> p) -> m OptimizeResult Source #

isVacuous :: (SFunArray a b -> p) -> m Bool Source #

isVacuousWith :: SMTConfig -> (SFunArray a b -> p) -> m Bool Source #

isTheorem :: (SFunArray a b -> p) -> m Bool Source #

isTheoremWith :: SMTConfig -> (SFunArray a b -> p) -> m Bool Source #

isSatisfiable :: (SFunArray a b -> p) -> m Bool Source #

isSatisfiableWith :: SMTConfig -> (SFunArray a b -> p) -> m Bool Source #

validate :: Bool -> SMTConfig -> (SFunArray a b -> p) -> SMTResult -> m SMTResult Source #

(HasKind a, HasKind b) => Show (SFunArray a b) Source # |
Instance details Defined in Data.SBV.Core.Data Methods showsPrec :: Int -> SFunArray a b -> ShowS show :: SFunArray a b -> String showList :: [SFunArray a b] -> ShowS
SymVal b => Mergeable (SFunArray a b) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> SFunArray a b -> SFunArray a b -> SFunArray a b Source # select :: (Ord b0, SymVal b0, Num b0) => [SFunArray a b] -> SFunArray a b -> SBV b0 -> SFunArray a b Source #

# Creating symbolic values

## Single value

These functions simplify declaring symbolic variables of various types. Strictly speaking, they are just synonyms for `free` (specialized at the given type), but they might be easier to use. We provide both the named and anonymous versions, latter with the underscore suffix.

sBool :: String -> Symbolic SBool Source #

Declare a named `SBool`

NB. For a version which generalizes over the underlying monad, see `sBool`

sBool_ :: Symbolic SBool Source #

Declare an unnamed `SBool`

NB. For a version which generalizes over the underlying monad, see `sBool_`

sWord8 :: String -> Symbolic SWord8 Source #

Declare a named `SWord8`

NB. For a version which generalizes over the underlying monad, see `sWord8`

sWord8_ :: Symbolic SWord8 Source #

Declare an unnamed `SWord8`

NB. For a version which generalizes over the underlying monad, see `sWord8_`

sWord16 :: String -> Symbolic SWord16 Source #

Declare a named `SWord16`

NB. For a version which generalizes over the underlying monad, see `sWord16`

sWord16_ :: Symbolic SWord16 Source #

Declare an unnamed `SWord16`

NB. For a version which generalizes over the underlying monad, see `sWord16_`

sWord32 :: String -> Symbolic SWord32 Source #

Declare a named `SWord32`

NB. For a version which generalizes over the underlying monad, see `sWord32`

sWord32_ :: Symbolic SWord32 Source #

Declare an unamed `SWord32`

NB. For a version which generalizes over the underlying monad, see `sWord32_`

sWord64 :: String -> Symbolic SWord64 Source #

Declare a named `SWord64`

NB. For a version which generalizes over the underlying monad, see `sWord64`

sWord64_ :: Symbolic SWord64 Source #

Declare an unnamed `SWord64`

NB. For a version which generalizes over the underlying monad, see `sWord64_`

sWord :: (KnownNat n, IsNonZero n) => String -> Symbolic (SWord n) Source #

Declare a named `SWord`

NB. For a version which generalizes over the underlying monad, see `sWord`

sWord_ :: (KnownNat n, IsNonZero n) => Symbolic (SWord n) Source #

Declare an unnamed `SWord`

NB. For a version which generalizes over the underlying monad, see `sWord_`

sInt8 :: String -> Symbolic SInt8 Source #

Declare a named `SInt8`

NB. For a version which generalizes over the underlying monad, see `sInt8`

sInt8_ :: Symbolic SInt8 Source #

Declare an unnamed `SInt8`

NB. For a version which generalizes over the underlying monad, see `sInt8_`

sInt16 :: String -> Symbolic SInt16 Source #

Declare a named `SInt16`

NB. For a version which generalizes over the underlying monad, see `sInt16`

sInt16_ :: Symbolic SInt16 Source #

Declare an unnamed `SInt16`

NB. For a version which generalizes over the underlying monad, see `sInt16_`

sInt32 :: String -> Symbolic SInt32 Source #

Declare a named `SInt32`

NB. For a version which generalizes over the underlying monad, see `sInt32`

sInt32_ :: Symbolic SInt32 Source #

Declare an unnamed `SInt32`

NB. For a version which generalizes over the underlying monad, see `sInt32_`

sInt64 :: String -> Symbolic SInt64 Source #

Declare a named `SInt64`

NB. For a version which generalizes over the underlying monad, see `sInt64`

sInt64_ :: Symbolic SInt64 Source #

Declare an unnamed `SInt64`

NB. For a version which generalizes over the underlying monad, see `sInt64_`

sInt :: (KnownNat n, IsNonZero n) => String -> Symbolic (SInt n) Source #

Declare a named `SInt`

NB. For a version which generalizes over the underlying monad, see `sInt`

sInt_ :: (KnownNat n, IsNonZero n) => Symbolic (SInt n) Source #

Declare an unnamed `SInt`

NB. For a version which generalizes over the underlying monad, see `sInt_`

sInteger :: String -> Symbolic SInteger Source #

Declare a named `SInteger`

NB. For a version which generalizes over the underlying monad, see `sInteger`

sInteger_ :: Symbolic SInteger Source #

Declare an unnamed `SInteger`

NB. For a version which generalizes over the underlying monad, see `sInteger_`

sReal :: String -> Symbolic SReal Source #

Declare a named `SReal`

NB. For a version which generalizes over the underlying monad, see `sReal`

sReal_ :: Symbolic SReal Source #

Declare an unnamed `SReal`

NB. For a version which generalizes over the underlying monad, see `sReal_`

sFloat :: String -> Symbolic SFloat Source #

Declare a named `SFloat`

NB. For a version which generalizes over the underlying monad, see `sFloat`

sFloat_ :: Symbolic SFloat Source #

Declare an unnamed `SFloat`

NB. For a version which generalizes over the underlying monad, see `sFloat_`

sDouble :: String -> Symbolic SDouble Source #

Declare a named `SDouble`

NB. For a version which generalizes over the underlying monad, see `sDouble`

sDouble_ :: Symbolic SDouble Source #

Declare an unnamed `SDouble`

NB. For a version which generalizes over the underlying monad, see `sDouble_`

sChar :: String -> Symbolic SChar Source #

Declare a named `SChar`

NB. For a version which generalizes over the underlying monad, see `sChar`

sChar_ :: Symbolic SChar Source #

Declare an unnamed `SChar`

NB. For a version which generalizes over the underlying monad, see `sChar_`

sString :: String -> Symbolic SString Source #

Declare a named `SString`

NB. For a version which generalizes over the underlying monad, see `sString`

sString_ :: Symbolic SString Source #

Declare an unnamed `SString`

NB. For a version which generalizes over the underlying monad, see `sString_`

sList :: SymVal a => String -> Symbolic (SList a) Source #

Declare a named `SList`

NB. For a version which generalizes over the underlying monad, see `sList`

sList_ :: SymVal a => Symbolic (SList a) Source #

Declare an unnamed `SList`

NB. For a version which generalizes over the underlying monad, see `sList_`

sTuple :: (SymTuple tup, SymVal tup) => String -> Symbolic (SBV tup) Source #

Declare a named tuple.

NB. For a version which generalizes over the underlying monad, see `sTuple`

sTuple_ :: (SymTuple tup, SymVal tup) => Symbolic (SBV tup) Source #

Declare an unnamed tuple.

NB. For a version which generalizes over the underlying monad, see `sTuple_`

sEither :: (SymVal a, SymVal b) => String -> Symbolic (SEither a b) Source #

Declare a named `SEither`.

NB. For a version which generalizes over the underlying monad, see `sEither`

sEither_ :: (SymVal a, SymVal b) => Symbolic (SEither a b) Source #

Declare an unnamed `SEither`.

NB. For a version which generalizes over the underlying monad, see `sEither_`

sMaybe :: SymVal a => String -> Symbolic (SMaybe a) Source #

Declare a named `SMaybe`.

NB. For a version which generalizes over the underlying monad, see `sMaybe`

sMaybe_ :: SymVal a => Symbolic (SMaybe a) Source #

Declare an unnamed `SMaybe`.

NB. For a version which generalizes over the underlying monad, see `sMaybe_`

sSet :: (Ord a, SymVal a) => String -> Symbolic (SSet a) Source #

Declare a named `SSet`.

NB. For a version which generalizes over the underlying monad, see `sSet`

sSet_ :: (Ord a, SymVal a) => Symbolic (SSet a) Source #

Declare an unnamed `SSet`.

NB. For a version which generalizes over the underlying monad, see `sSet_`

## List of values

These functions simplify declaring a sequence symbolic variables of various types. Strictly speaking, they are just synonyms for `mapM` `free` (specialized at the given type), but they might be easier to use.

sBools :: [String] -> Symbolic [SBool] Source #

Declare a list of `SBool`s

NB. For a version which generalizes over the underlying monad, see `sBools`

sWord8s :: [String] -> Symbolic [SWord8] Source #

Declare a list of `SWord8`s

NB. For a version which generalizes over the underlying monad, see `sWord8s`

sWord16s :: [String] -> Symbolic [SWord16] Source #

Declare a list of `SWord16`s

NB. For a version which generalizes over the underlying monad, see `sWord16s`

sWord32s :: [String] -> Symbolic [SWord32] Source #

Declare a list of `SWord32`s

NB. For a version which generalizes over the underlying monad, see `sWord32s`

sWord64s :: [String] -> Symbolic [SWord64] Source #

Declare a list of `SWord64`s

NB. For a version which generalizes over the underlying monad, see `sWord64s`

sWords :: (KnownNat n, IsNonZero n) => [String] -> Symbolic [SWord n] Source #

Declare a list of `SWord8`s

NB. For a version which generalizes over the underlying monad, see `sWords`

sInt8s :: [String] -> Symbolic [SInt8] Source #

Declare a list of `SInt8`s

NB. For a version which generalizes over the underlying monad, see `sInt8s`

sInt16s :: [String] -> Symbolic [SInt16] Source #

Declare a list of `SInt16`s

NB. For a version which generalizes over the underlying monad, see `sInt16s`

sInt32s :: [String] -> Symbolic [SInt32] Source #

Declare a list of `SInt32`s

NB. For a version which generalizes over the underlying monad, see `sInt32s`

sInt64s :: [String] -> Symbolic [SInt64] Source #

Declare a list of `SInt64`s

NB. For a version which generalizes over the underlying monad, see `sInt64s`

sInts :: (KnownNat n, IsNonZero n) => [String] -> Symbolic [SInt n] Source #

Declare a list of `SInt`s

NB. For a version which generalizes over the underlying monad, see `sInts`

sIntegers :: [String] -> Symbolic [SInteger] Source #

Declare a list of `SInteger`s

NB. For a version which generalizes over the underlying monad, see `sIntegers`

sReals :: [String] -> Symbolic [SReal] Source #

Declare a list of `SReal`s

NB. For a version which generalizes over the underlying monad, see `sReals`

sFloats :: [String] -> Symbolic [SFloat] Source #

Declare a list of `SFloat`s

NB. For a version which generalizes over the underlying monad, see `sFloats`

sDoubles :: [String] -> Symbolic [SDouble] Source #

Declare a list of `SDouble`s

NB. For a version which generalizes over the underlying monad, see `sDoubles`

sChars :: [String] -> Symbolic [SChar] Source #

Declare a list of `SChar`s

NB. For a version which generalizes over the underlying monad, see `sChars`

sStrings :: [String] -> Symbolic [SString] Source #

Declare a list of `SString`s

NB. For a version which generalizes over the underlying monad, see `sStrings`

sLists :: SymVal a => [String] -> Symbolic [SList a] Source #

Declare a list of `SList`s

NB. For a version which generalizes over the underlying monad, see `sLists`

sTuples :: (SymTuple tup, SymVal tup) => [String] -> Symbolic [SBV tup] Source #

Declare a list of tuples.

NB. For a version which generalizes over the underlying monad, see `sTuples`

sEithers :: (SymVal a, SymVal b) => [String] -> Symbolic [SEither a b] Source #

Declare a list of `SEither` values.

NB. For a version which generalizes over the underlying monad, see `sEithers`

sMaybes :: SymVal a => [String] -> Symbolic [SMaybe a] Source #

Declare a list of `SMaybe` values.

NB. For a version which generalizes over the underlying monad, see `sMaybes`

sSets :: (Ord a, SymVal a) => [String] -> Symbolic [SSet a] Source #

Declare a list of `SSet` values.

NB. For a version which generalizes over the underlying monad, see `sSets`

# Symbolic Equality and Comparisons

class EqSymbolic a where Source #

Symbolic Equality. Note that we can't use Haskell's `Eq` class since Haskell insists on returning Bool Comparing symbolic values will necessarily return a symbolic value.

Minimal complete definition

(.==)

Methods

(.==) :: a -> a -> SBool infix 4 Source #

Symbolic equality.

(./=) :: a -> a -> SBool infix 4 Source #

Symbolic inequality.

(.===) :: a -> a -> SBool infix 4 Source #

Strong equality. On floats (`SFloat`/`SDouble`), strong equality is object equality; that is `NaN == NaN` holds, but `+0 == -0` doesn't. On other types, (.===) is simply (.==). Note that (.==) is the right notion of equality for floats per IEEE754 specs, since by definition `+0 == -0` and `NaN` equals no other value including itself. But occasionally we want to be stronger and state `NaN` equals `NaN` and `+0` and `-0` are different from each other. In a context where your type is concrete, simply use `fpIsEqualObject`. But in a polymorphic context, use the strong equality instead.

NB. If you do not care about or work with floats, simply use (.==) and (./=).

(./==) :: a -> a -> SBool infix 4 Source #

Negation of strong equality. Equaivalent to negation of (.===) on all types.

distinct :: [a] -> SBool Source #

Returns (symbolic) `sTrue` if all the elements of the given list are different.

distinctExcept :: [a] -> [a] -> SBool Source #

Returns (symbolic) `sTrue` if all the elements of the given list are different. The second list contains exceptions, i.e., if an element belongs to that set, it will be considered distinct regardless of repetition.

    >>> prove $ \a -> distinctExcept [a, a] [0::SInteger] .<=> a .== 0
    Q.E.D.
    >>> prove $ \a b -> distinctExcept [a, b] [0::SWord8] .<=> (a .== b .=> a .== 0)
    Q.E.D.
    >>> prove $ \a b c d -> distinctExcept [a, b, c, d] [] .== distinct [a, b, c, (d::SInteger)]
    Q.E.D.

allEqual :: [a] -> SBool Source #

Returns (symbolic) `sTrue` if all the elements of the given list are the same.

sElem :: a -> [a] -> SBool Source #

Symbolic membership test.

sNotElem :: a -> [a] -> SBool Source #

Symbolic negated membership test.

#### Instances

Instances details

EqSymbolic Bool Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: Bool -> Bool -> SBool Source #

(./=) :: Bool -> Bool -> SBool Source #

(.===) :: Bool -> Bool -> SBool Source #

(./==) :: Bool -> Bool -> SBool Source #

distinct :: [Bool] -> SBool Source #

distinctExcept :: [Bool] -> [Bool] -> SBool Source #

allEqual :: [Bool] -> SBool Source #

sElem :: Bool -> [Bool] -> SBool Source #

sNotElem :: Bool -> [Bool] -> SBool Source #

EqSymbolic a => EqSymbolic [a] Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: [a] -> [a] -> SBool Source #

(./=) :: [a] -> [a] -> SBool Source #

(.===) :: [a] -> [a] -> SBool Source #

(./==) :: [a] -> [a] -> SBool Source #

distinct :: [[a]] -> SBool Source #

distinctExcept :: [[a]] -> [[a]] -> SBool Source #

allEqual :: [[a]] -> SBool Source #

sElem :: [a] -> [[a]] -> SBool Source #

sNotElem :: [a] -> [[a]] -> SBool Source #

EqSymbolic a => EqSymbolic (Maybe a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: Maybe a -> Maybe a -> SBool Source #

(./=) :: Maybe a -> Maybe a -> SBool Source #

(.===) :: Maybe a -> Maybe a -> SBool Source #

(./==) :: Maybe a -> Maybe a -> SBool Source #

distinct :: [Maybe a] -> SBool Source #

distinctExcept :: [Maybe a] -> [Maybe a] -> SBool Source #

allEqual :: [Maybe a] -> SBool Source #

sElem :: Maybe a -> [Maybe a] -> SBool Source #

sNotElem :: Maybe a -> [Maybe a] -> SBool Source #

EqSymbolic (SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: SBV a -> SBV a -> SBool Source #

(./=) :: SBV a -> SBV a -> SBool Source #

(.===) :: SBV a -> SBV a -> SBool Source #

(./==) :: SBV a -> SBV a -> SBool Source #

distinct :: [SBV a] -> SBool Source #

distinctExcept :: [SBV a] -> [SBV a] -> SBool Source #

allEqual :: [SBV a] -> SBool Source #

sElem :: SBV a -> [SBV a] -> SBool Source #

sNotElem :: SBV a -> [SBV a] -> SBool Source #

EqSymbolic a => EqSymbolic (S a) Source # | Symbolic equality for `S`.

Instance details

Defined in Documentation.SBV.Examples.ProofTools.BMC

Methods

(.==) :: S a -> S a -> SBool Source #

(./=) :: S a -> S a -> SBool Source #

(.===) :: S a -> S a -> SBool Source #

(./==) :: S a -> S a -> SBool Source #

distinct :: [S a] -> SBool Source #

distinctExcept :: [S a] -> [S a] -> SBool Source #

allEqual :: [S a] -> SBool Source #

sElem :: S a -> [S a] -> SBool Source #

sNotElem :: S a -> [S a] -> SBool Source #

(EqSymbolic a, EqSymbolic b) => EqSymbolic (Either a b) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: Either a b -> Either a b -> SBool Source #

(./=) :: Either a b -> Either a b -> SBool Source #

(.===) :: Either a b -> Either a b -> SBool Source #

(./==) :: Either a b -> Either a b -> SBool Source #

distinct :: [Either a b] -> SBool Source #

distinctExcept :: [Either a b] -> [Either a b] -> SBool Source #

allEqual :: [Either a b] -> SBool Source #

sElem :: Either a b -> [Either a b] -> SBool Source #

sNotElem :: Either a b -> [Either a b] -> SBool Source #

(EqSymbolic a, EqSymbolic b) => EqSymbolic (a, b) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: (a, b) -> (a, b) -> SBool Source #

(./=) :: (a, b) -> (a, b) -> SBool Source #

(.===) :: (a, b) -> (a, b) -> SBool Source #

(./==) :: (a, b) -> (a, b) -> SBool Source #

distinct :: [(a, b)] -> SBool Source #

distinctExcept :: [(a, b)] -> [(a, b)] -> SBool Source #

allEqual :: [(a, b)] -> SBool Source #

sElem :: (a, b) -> [(a, b)] -> SBool Source #

sNotElem :: (a, b) -> [(a, b)] -> SBool Source #

EqSymbolic (SArray a b) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: SArray a b -> SArray a b -> SBool Source #

(./=) :: SArray a b -> SArray a b -> SBool Source #

(.===) :: SArray a b -> SArray a b -> SBool Source #

(./==) :: SArray a b -> SArray a b -> SBool Source #

distinct :: [SArray a b] -> SBool Source #

distinctExcept :: [SArray a b] -> [SArray a b] -> SBool Source #

allEqual :: [SArray a b] -> SBool Source #

sElem :: SArray a b -> [SArray a b] -> SBool Source #

sNotElem :: SArray a b -> [SArray a b] -> SBool Source #

(EqSymbolic a, EqSymbolic b, EqSymbolic c) => EqSymbolic (a, b, c) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: (a, b, c) -> (a, b, c) -> SBool Source #

(./=) :: (a, b, c) -> (a, b, c) -> SBool Source #

(.===) :: (a, b, c) -> (a, b, c) -> SBool Source #

(./==) :: (a, b, c) -> (a, b, c) -> SBool Source #

distinct :: [(a, b, c)] -> SBool Source #

distinctExcept :: [(a, b, c)] -> [(a, b, c)] -> SBool Source #

allEqual :: [(a, b, c)] -> SBool Source #

sElem :: (a, b, c) -> [(a, b, c)] -> SBool Source #

sNotElem :: (a, b, c) -> [(a, b, c)] -> SBool Source #

(EqSymbolic a, EqSymbolic b, EqSymbolic c, EqSymbolic d) => EqSymbolic (a, b, c, d) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: (a, b, c, d) -> (a, b, c, d) -> SBool Source #

(./=) :: (a, b, c, d) -> (a, b, c, d) -> SBool Source #

(.===) :: (a, b, c, d) -> (a, b, c, d) -> SBool Source #

(./==) :: (a, b, c, d) -> (a, b, c, d) -> SBool Source #

distinct :: [(a, b, c, d)] -> SBool Source #

distinctExcept :: [(a, b, c, d)] -> [(a, b, c, d)] -> SBool Source #

allEqual :: [(a, b, c, d)] -> SBool Source #

sElem :: (a, b, c, d) -> [(a, b, c, d)] -> SBool Source #

sNotElem :: (a, b, c, d) -> [(a, b, c, d)] -> SBool Source #

(EqSymbolic a, EqSymbolic b, EqSymbolic c, EqSymbolic d, EqSymbolic e) => EqSymbolic (a, b, c, d, e) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: (a, b, c, d, e) -> (a, b, c, d, e) -> SBool Source #

(./=) :: (a, b, c, d, e) -> (a, b, c, d, e) -> SBool Source #

(.===) :: (a, b, c, d, e) -> (a, b, c, d, e) -> SBool Source #

(./==) :: (a, b, c, d, e) -> (a, b, c, d, e) -> SBool Source #

distinct :: [(a, b, c, d, e)] -> SBool Source #

distinctExcept :: [(a, b, c, d, e)] -> [(a, b, c, d, e)] -> SBool Source #

allEqual :: [(a, b, c, d, e)] -> SBool Source #

sElem :: (a, b, c, d, e) -> [(a, b, c, d, e)] -> SBool Source #

sNotElem :: (a, b, c, d, e) -> [(a, b, c, d, e)] -> SBool Source #

(EqSymbolic a, EqSymbolic b, EqSymbolic c, EqSymbolic d, EqSymbolic e, EqSymbolic f) => EqSymbolic (a, b, c, d, e, f) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: (a, b, c, d, e, f) -> (a, b, c, d, e, f) -> SBool Source #

(./=) :: (a, b, c, d, e, f) -> (a, b, c, d, e, f) -> SBool Source #

(.===) :: (a, b, c, d, e, f) -> (a, b, c, d, e, f) -> SBool Source #

(./==) :: (a, b, c, d, e, f) -> (a, b, c, d, e, f) -> SBool Source #

distinct :: [(a, b, c, d, e, f)] -> SBool Source #

distinctExcept :: [(a, b, c, d, e, f)] -> [(a, b, c, d, e, f)] -> SBool Source #

allEqual :: [(a, b, c, d, e, f)] -> SBool Source #

sElem :: (a, b, c, d, e, f) -> [(a, b, c, d, e, f)] -> SBool Source #

sNotElem :: (a, b, c, d, e, f) -> [(a, b, c, d, e, f)] -> SBool Source #

(EqSymbolic a, EqSymbolic b, EqSymbolic c, EqSymbolic d, EqSymbolic e, EqSymbolic f, EqSymbolic g) => EqSymbolic (a, b, c, d, e, f, g) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) -> SBool Source #

(./=) :: (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) -> SBool Source #

(.===) :: (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) -> SBool Source #

(./==) :: (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) -> SBool Source #

distinct :: [(a, b, c, d, e, f, g)] -> SBool Source #

distinctExcept :: [(a, b, c, d, e, f, g)] -> [(a, b, c, d, e, f, g)] -> SBool Source #

allEqual :: [(a, b, c, d, e, f, g)] -> SBool Source #

sElem :: (a, b, c, d, e, f, g) -> [(a, b, c, d, e, f, g)] -> SBool Source #

sNotElem :: (a, b, c, d, e, f, g) -> [(a, b, c, d, e, f, g)] -> SBool Source #

class (Mergeable a, EqSymbolic a) => OrdSymbolic a where Source #

Symbolic Comparisons. Similar to `Eq`, we cannot implement Haskell's `Ord` class since there is no way to return an `Ordering` value from a symbolic comparison. Furthermore, `OrdSymbolic` requires `Mergeable` to implement if-then-else, for the benefit of implementing symbolic versions of `max` and `min` functions.

Minimal complete definition

(.<)

Methods

(.<) :: a -> a -> SBool infix 4 Source #

Symbolic less than.

(.<=) :: a -> a -> SBool infix 4 Source #

Symbolic less than or equal to.

(.>) :: a -> a -> SBool infix 4 Source #

Symbolic greater than.

(.>=) :: a -> a -> SBool infix 4 Source #

Symbolic greater than or equal to.

smin :: a -> a -> a Source #

Symbolic minimum.

smax :: a -> a -> a Source #

Symbolic maximum.

inRange :: a -> (a, a) -> SBool Source #

Is the value withing the allowed inclusive range?

#### Instances

Instances details

OrdSymbolic a => OrdSymbolic [a] Source # |
Instance details Defined in Data.SBV.Core.Model Methods (.<) :: [a] -> [a] -> SBool Source # (.<=) :: [a] -> [a] -> SBool Source # (.>) :: [a] -> [a] -> SBool Source # (.>=) :: [a] -> [a] -> SBool Source # smin :: [a] -> [a] -> [a] Source # smax :: [a] -> [a] -> [a] Source # inRange :: [a] -> ([a], [a]) -> SBool Source #
OrdSymbolic a => OrdSymbolic (Maybe a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (.<) :: Maybe a -> Maybe a -> SBool Source # (.<=) :: Maybe a -> Maybe a -> SBool Source # (.>) :: Maybe a -> Maybe a -> SBool Source # (.>=) :: Maybe a -> Maybe a -> SBool Source # smin :: Maybe a -> Maybe a -> Maybe a Source # smax :: Maybe a -> Maybe a -> Maybe a Source # inRange :: Maybe a -> (Maybe a, Maybe a) -> SBool Source #
(Ord a, SymVal a) => OrdSymbolic (SBV a) Source # | If comparison is over something SMTLib can handle, just translate it. Otherwise desugar.
Instance details Defined in Data.SBV.Core.Model Methods (.<) :: SBV a -> SBV a -> SBool Source # (.<=) :: SBV a -> SBV a -> SBool Source # (.>) :: SBV a -> SBV a -> SBool Source # (.>=) :: SBV a -> SBV a -> SBool Source # smin :: SBV a -> SBV a -> SBV a Source # smax :: SBV a -> SBV a -> SBV a Source # inRange :: SBV a -> (SBV a, SBV a) -> SBool Source #
(OrdSymbolic a, OrdSymbolic b) => OrdSymbolic (Either a b) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.<) :: Either a b -> Either a b -> SBool Source #

(.<=) :: Either a b -> Either a b -> SBool Source #

(.>) :: Either a b -> Either a b -> SBool Source #

(.>=) :: Either a b -> Either a b -> SBool Source #

smin :: Either a b -> Either a b -> Either a b Source #

smax :: Either a b -> Either a b -> Either a b Source #

inRange :: Either a b -> (Either a b, Either a b) -> SBool Source #

(OrdSymbolic a, OrdSymbolic b) => OrdSymbolic (a, b) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (.<) :: (a, b) -> (a, b) -> SBool Source # (.<=) :: (a, b) -> (a, b) -> SBool Source # (.>) :: (a, b) -> (a, b) -> SBool Source # (.>=) :: (a, b) -> (a, b) -> SBool Source # smin :: (a, b) -> (a, b) -> (a, b) Source # smax :: (a, b) -> (a, b) -> (a, b) Source # inRange :: (a, b) -> ((a, b), (a, b)) -> SBool Source #
(OrdSymbolic a, OrdSymbolic b, OrdSymbolic c) => OrdSymbolic (a, b, c) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.<) :: (a, b, c) -> (a, b, c) -> SBool Source #

(.<=) :: (a, b, c) -> (a, b, c) -> SBool Source #

(.>) :: (a, b, c) -> (a, b, c) -> SBool Source #

(.>=) :: (a, b, c) -> (a, b, c) -> SBool Source #

smin :: (a, b, c) -> (a, b, c) -> (a, b, c) Source #

smax :: (a, b, c) -> (a, b, c) -> (a, b, c) Source #

inRange :: (a, b, c) -> ((a, b, c), (a, b, c)) -> SBool Source #

(OrdSymbolic a, OrdSymbolic b, OrdSymbolic c, OrdSymbolic d) => OrdSymbolic (a, b, c, d) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.<) :: (a, b, c, d) -> (a, b, c, d) -> SBool Source #

(.<=) :: (a, b, c, d) -> (a, b, c, d) -> SBool Source #

(.>) :: (a, b, c, d) -> (a, b, c, d) -> SBool Source #

(.>=) :: (a, b, c, d) -> (a, b, c, d) -> SBool Source #

smin :: (a, b, c, d) -> (a, b, c, d) -> (a, b, c, d) Source #

smax :: (a, b, c, d) -> (a, b, c, d) -> (a, b, c, d) Source #

inRange :: (a, b, c, d) -> ((a, b, c, d), (a, b, c, d)) -> SBool Source #

(OrdSymbolic a, OrdSymbolic b, OrdSymbolic c, OrdSymbolic d, OrdSymbolic e) => OrdSymbolic (a, b, c, d, e) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.<) :: (a, b, c, d, e) -> (a, b, c, d, e) -> SBool Source #

(.<=) :: (a, b, c, d, e) -> (a, b, c, d, e) -> SBool Source #

(.>) :: (a, b, c, d, e) -> (a, b, c, d, e) -> SBool Source #

(.>=) :: (a, b, c, d, e) -> (a, b, c, d, e) -> SBool Source #

smin :: (a, b, c, d, e) -> (a, b, c, d, e) -> (a, b, c, d, e) Source #

smax :: (a, b, c, d, e) -> (a, b, c, d, e) -> (a, b, c, d, e) Source #

inRange :: (a, b, c, d, e) -> ((a, b, c, d, e), (a, b, c, d, e)) -> SBool Source #

(OrdSymbolic a, OrdSymbolic b, OrdSymbolic c, OrdSymbolic d, OrdSymbolic e, OrdSymbolic f) => OrdSymbolic (a, b, c, d, e, f) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.<) :: (a, b, c, d, e, f) -> (a, b, c, d, e, f) -> SBool Source #

(.<=) :: (a, b, c, d, e, f) -> (a, b, c, d, e, f) -> SBool Source #

(.>) :: (a, b, c, d, e, f) -> (a, b, c, d, e, f) -> SBool Source #

(.>=) :: (a, b, c, d, e, f) -> (a, b, c, d, e, f) -> SBool Source #

smin :: (a, b, c, d, e, f) -> (a, b, c, d, e, f) -> (a, b, c, d, e, f) Source #

smax :: (a, b, c, d, e, f) -> (a, b, c, d, e, f) -> (a, b, c, d, e, f) Source #

inRange :: (a, b, c, d, e, f) -> ((a, b, c, d, e, f), (a, b, c, d, e, f)) -> SBool Source #

(OrdSymbolic a, OrdSymbolic b, OrdSymbolic c, OrdSymbolic d, OrdSymbolic e, OrdSymbolic f, OrdSymbolic g) => OrdSymbolic (a, b, c, d, e, f, g) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.<) :: (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) -> SBool Source #

(.<=) :: (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) -> SBool Source #

(.>) :: (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) -> SBool Source #

(.>=) :: (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) -> SBool Source #

smin :: (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) Source #

smax :: (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) Source #

inRange :: (a, b, c, d, e, f, g) -> ((a, b, c, d, e, f, g), (a, b, c, d, e, f, g)) -> SBool Source #

class Equality a where Source #

Equality as a proof method. Allows for very concise construction of equivalence proofs, which is very typical in bit-precise proofs.

Methods

(===) :: a -> a -> IO ThmResult infix 4 Source #

#### Instances

Instances details

(SymVal a, SymVal b, EqSymbolic z) => Equality ((SBV a, SBV b) -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: ((SBV a, SBV b) -> z) -> ((SBV a, SBV b) -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, EqSymbolic z) => Equality ((SBV a, SBV b, SBV c) -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: ((SBV a, SBV b, SBV c) -> z) -> ((SBV a, SBV b, SBV c) -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, EqSymbolic z) => Equality ((SBV a, SBV b, SBV c, SBV d) -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: ((SBV a, SBV b, SBV c, SBV d) -> z) -> ((SBV a, SBV b, SBV c, SBV d) -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, EqSymbolic z) => Equality ((SBV a, SBV b, SBV c, SBV d, SBV e) -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> z) -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, EqSymbolic z) => Equality ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> z) -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, SymVal g, EqSymbolic z) => Equality ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> z) -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, SymVal g, EqSymbolic z) => Equality (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> SBV f -> SBV g -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> SBV f -> SBV g -> z) -> (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> SBV f -> SBV g -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, EqSymbolic z) => Equality (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> SBV f -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> SBV f -> z) -> (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> SBV f -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, EqSymbolic z) => Equality (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> z) -> (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, EqSymbolic z) => Equality (SBV a -> SBV b -> SBV c -> SBV d -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> SBV b -> SBV c -> SBV d -> z) -> (SBV a -> SBV b -> SBV c -> SBV d -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, EqSymbolic z) => Equality (SBV a -> SBV b -> SBV c -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> SBV b -> SBV c -> z) -> (SBV a -> SBV b -> SBV c -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, EqSymbolic z) => Equality (SBV a -> SBV b -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> SBV b -> z) -> (SBV a -> SBV b -> z) -> IO ThmResult Source #
(SymVal a, EqSymbolic z) => Equality (SBV a -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> z) -> (SBV a -> z) -> IO ThmResult Source #

# Conditionals: Mergeable values

class Mergeable a where Source #

Symbolic conditionals are modeled by the `Mergeable` class, describing how to merge the results of an if-then-else call with a symbolic test. SBV provides all basic types as instances of this class, so users only need to declare instances for custom data-types of their programs as needed.

A `Mergeable` instance may be automatically derived for a custom data-type with a single constructor where the type of each field is an instance of `Mergeable`, such as a record of symbolic values. Users only need to add `Generic` and `Mergeable` to the `deriving` clause for the data-type. See `Status` for an example and an illustration of what the instance would look like if written by hand.

The function `select` is a total-indexing function out of a list of choices with a default value, simulating array/list indexing. It's an n-way generalization of the `ite` function.

Minimal complete definition: None, if the type is instance of `Generic`. Otherwise `symbolicMerge`. Note that most types subject to merging are likely to be trivial instances of `Generic`.

Minimal complete definition

Nothing

Methods

symbolicMerge :: Bool -> SBool -> a -> a -> a Source #

Merge two values based on the condition. The first argument states whether we force the then-and-else branches before the merging, at the word level. This is an efficiency concern; one that we'd rather not make but unfortunately necessary for getting symbolic simulation working efficiently.

default symbolicMerge :: (Generic a, GMergeable (Rep a)) => Bool -> SBool -> a -> a -> a Source #

select :: (Ord b, SymVal b, Num b) => [a] -> a -> SBV b -> a Source #

Total indexing operation. `select xs default index` is intuitively the same as `xs !! index`, except it evaluates to `default` if `index` underflows/overflows.

#### Instances

Instances details

Mergeable () Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> () -> () -> () Source # select :: (Ord b, SymVal b, Num b) => [()] -> () -> SBV b -> () Source #
Mergeable Mostek Source # |
Instance details Defined in Documentation.SBV.Examples.BitPrecise.Legato Methods symbolicMerge :: Bool -> SBool -> Mostek -> Mostek -> Mostek Source # select :: (Ord b, SymVal b, Num b) => [Mostek] -> Mostek -> SBV b -> Mostek Source #
Mergeable Status Source # |
Instance details Defined in Documentation.SBV.Examples.Puzzles.U2Bridge Methods symbolicMerge :: Bool -> SBool -> Status -> Status -> Status Source # select :: (Ord b, SymVal b, Num b) => [Status] -> Status -> SBV b -> Status Source #
Mergeable a => Mergeable [a] Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> [a] -> [a] -> [a] Source # select :: (Ord b, SymVal b, Num b) => [[a]] -> [a] -> SBV b -> [a] Source #
Mergeable a => Mergeable (Maybe a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> Maybe a -> Maybe a -> Maybe a Source # select :: (Ord b, SymVal b, Num b) => [Maybe a] -> Maybe a -> SBV b -> Maybe a Source #
Mergeable a => Mergeable (ZipList a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> ZipList a -> ZipList a -> ZipList a Source # select :: (Ord b, SymVal b, Num b) => [ZipList a] -> ZipList a -> SBV b -> ZipList a Source #
SymVal a => Mergeable (SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> SBV a -> SBV a -> SBV a Source # select :: (Ord b, SymVal b, Num b) => [SBV a] -> SBV a -> SBV b -> SBV a Source #
Mergeable a => Mergeable (S a) Source # |
Instance details Defined in Documentation.SBV.Examples.ProofTools.Fibonacci Methods symbolicMerge :: Bool -> SBool -> S a -> S a -> S a Source # select :: (Ord b, SymVal b, Num b) => [S a] -> S a -> SBV b -> S a Source #
Mergeable a => Mergeable (S a) Source # |
Instance details Defined in Documentation.SBV.Examples.ProofTools.Sum Methods symbolicMerge :: Bool -> SBool -> S a -> S a -> S a Source # select :: (Ord b, SymVal b, Num b) => [S a] -> S a -> SBV b -> S a Source #
Mergeable a => Mergeable (Move a) Source # | Mergeable instance for `Move` simply pushes the merging the data after run of each branch starting from the same state.
Instance details Defined in Documentation.SBV.Examples.Puzzles.U2Bridge Methods symbolicMerge :: Bool -> SBool -> Move a -> Move a -> Move a Source # select :: (Ord b, SymVal b, Num b) => [Move a] -> Move a -> SBV b -> Move a Source #
SymVal a => Mergeable (AppS a) Source # |
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.Append Methods symbolicMerge :: Bool -> SBool -> AppS a -> AppS a -> AppS a Source # select :: (Ord b, SymVal b, Num b) => [AppS a] -> AppS a -> SBV b -> AppS a Source #
Mergeable a => Mergeable (IncS a) Source # |
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.Basics Methods symbolicMerge :: Bool -> SBool -> IncS a -> IncS a -> IncS a Source # select :: (Ord b, SymVal b, Num b) => [IncS a] -> IncS a -> SBV b -> IncS a Source #
Mergeable a => Mergeable (FibS a) Source # |
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.Fib Methods symbolicMerge :: Bool -> SBool -> FibS a -> FibS a -> FibS a Source # select :: (Ord b, SymVal b, Num b) => [FibS a] -> FibS a -> SBV b -> FibS a Source #
Mergeable a => Mergeable (GCDS a) Source # |
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.GCD Methods symbolicMerge :: Bool -> SBool -> GCDS a -> GCDS a -> GCDS a Source # select :: (Ord b, SymVal b, Num b) => [GCDS a] -> GCDS a -> SBV b -> GCDS a Source #
Mergeable a => Mergeable (DivS a) Source # |
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.IntDiv Methods symbolicMerge :: Bool -> SBool -> DivS a -> DivS a -> DivS a Source # select :: (Ord b, SymVal b, Num b) => [DivS a] -> DivS a -> SBV b -> DivS a Source #
Mergeable a => Mergeable (SqrtS a) Source # |
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.IntSqrt Methods symbolicMerge :: Bool -> SBool -> SqrtS a -> SqrtS a -> SqrtS a Source # select :: (Ord b, SymVal b, Num b) => [SqrtS a] -> SqrtS a -> SBV b -> SqrtS a Source #
SymVal a => Mergeable (LenS a) Source # |
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.Length Methods symbolicMerge :: Bool -> SBool -> LenS a -> LenS a -> LenS a Source # select :: (Ord b, SymVal b, Num b) => [LenS a] -> LenS a -> SBV b -> LenS a Source #
Mergeable a => Mergeable (SumS a) Source # |
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.Sum Methods symbolicMerge :: Bool -> SBool -> SumS a -> SumS a -> SumS a Source # select :: (Ord b, SymVal b, Num b) => [SumS a] -> SumS a -> SBV b -> SumS a Source #
Mergeable b => Mergeable (a -> b) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> (a -> b) -> (a -> b) -> a -> b Source # select :: (Ord b0, SymVal b0, Num b0) => [a -> b] -> (a -> b) -> SBV b0 -> a -> b Source #
(Mergeable a, Mergeable b) => Mergeable (Either a b) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> Either a b -> Either a b -> Either a b Source # select :: (Ord b0, SymVal b0, Num b0) => [Either a b] -> Either a b -> SBV b0 -> Either a b Source #
(Mergeable a, Mergeable b) => Mergeable (a, b) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> (a, b) -> (a, b) -> (a, b) Source # select :: (Ord b0, SymVal b0, Num b0) => [(a, b)] -> (a, b) -> SBV b0 -> (a, b) Source #
(Ix a, Mergeable b) => Mergeable (Array a b) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> Array a b -> Array a b -> Array a b Source # select :: (Ord b0, SymVal b0, Num b0) => [Array a b] -> Array a b -> SBV b0 -> Array a b Source #
SymVal b => Mergeable (SFunArray a b) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> SFunArray a b -> SFunArray a b -> SFunArray a b Source # select :: (Ord b0, SymVal b0, Num b0) => [SFunArray a b] -> SFunArray a b -> SBV b0 -> SFunArray a b Source #
SymVal b => Mergeable (SArray a b) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> SArray a b -> SArray a b -> SArray a b Source # select :: (Ord b0, SymVal b0, Num b0) => [SArray a b] -> SArray a b -> SBV b0 -> SArray a b Source #
SymVal e => Mergeable (STree i e) Source # |
Instance details Defined in Data.SBV.Tools.STree Methods symbolicMerge :: Bool -> SBool -> STree i e -> STree i e -> STree i e Source # select :: (Ord b, SymVal b, Num b) => [STree i e] -> STree i e -> SBV b -> STree i e Source #
(Mergeable a, Mergeable b, Mergeable c) => Mergeable (a, b, c) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> (a, b, c) -> (a, b, c) -> (a, b, c) Source # select :: (Ord b0, SymVal b0, Num b0) => [(a, b, c)] -> (a, b, c) -> SBV b0 -> (a, b, c) Source #
(Mergeable a, Mergeable b, Mergeable c, Mergeable d) => Mergeable (a, b, c, d) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> (a, b, c, d) -> (a, b, c, d) -> (a, b, c, d) Source # select :: (Ord b0, SymVal b0, Num b0) => [(a, b, c, d)] -> (a, b, c, d) -> SBV b0 -> (a, b, c, d) Source #
(Mergeable a, Mergeable b, Mergeable c, Mergeable d, Mergeable e) => Mergeable (a, b, c, d, e) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> (a, b, c, d, e) -> (a, b, c, d, e) -> (a, b, c, d, e) Source # select :: (Ord b0, SymVal b0, Num b0) => [(a, b, c, d, e)] -> (a, b, c, d, e) -> SBV b0 -> (a, b, c, d, e) Source #
(Mergeable a, Mergeable b, Mergeable c, Mergeable d, Mergeable e, Mergeable f) => Mergeable (a, b, c, d, e, f) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> (a, b, c, d, e, f) -> (a, b, c, d, e, f) -> (a, b, c, d, e, f) Source # select :: (Ord b0, SymVal b0, Num b0) => [(a, b, c, d, e, f)] -> (a, b, c, d, e, f) -> SBV b0 -> (a, b, c, d, e, f) Source #
(Mergeable a, Mergeable b, Mergeable c, Mergeable d, Mergeable e, Mergeable f, Mergeable g) => Mergeable (a, b, c, d, e, f, g) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) -> (a, b, c, d, e, f, g) Source # select :: (Ord b0, SymVal b0, Num b0) => [(a, b, c, d, e, f, g)] -> (a, b, c, d, e, f, g) -> SBV b0 -> (a, b, c, d, e, f, g) Source #

ite :: Mergeable a => SBool -> a -> a -> a Source #

If-then-else. This is by definition `symbolicMerge` with both branches forced. This is typically the desired behavior, but also see `iteLazy` should you need more laziness.

iteLazy :: Mergeable a => SBool -> a -> a -> a Source #

A Lazy version of ite, which does not force its arguments. This might cause issues for symbolic simulation with large thunks around, so use with care.

# Symbolic integral numbers

class (SymVal a, Num a, Bits a, Integral a) => SIntegral a Source #

Symbolic Numbers. This is a simple class that simply incorporates all number like base types together, simplifying writing polymorphic type-signatures that work for all symbolic numbers, such as `SWord8`, `SInt8` etc. For instance, we can write a generic list-minimum function as follows:

       mm :: SIntegral a => [SBV a] -> SBV a
       mm = foldr1 (a b -> ite (a .<= b) a b)

It is similar to the standard `Integral` class, except ranging over symbolic instances.

#### Instances

Instances details

SIntegral Int8 Source # |
Instance details Defined in Data.SBV.Core.Model
SIntegral Int16 Source # |
Instance details Defined in Data.SBV.Core.Model
SIntegral Int32 Source # |
Instance details Defined in Data.SBV.Core.Model
SIntegral Int64 Source # |
Instance details Defined in Data.SBV.Core.Model
SIntegral Integer Source # |
Instance details Defined in Data.SBV.Core.Model
SIntegral Word8 Source # |
Instance details Defined in Data.SBV.Core.Model
SIntegral Word16 Source # |
Instance details Defined in Data.SBV.Core.Model
SIntegral Word32 Source # |
Instance details Defined in Data.SBV.Core.Model
SIntegral Word64 Source # |
Instance details Defined in Data.SBV.Core.Model
(KnownNat n, IsNonZero n) => SIntegral (IntN n) Source # | `SIntegral` instance for `IntN`
Instance details Defined in Data.SBV.Core.Sized
(KnownNat n, IsNonZero n) => SIntegral (WordN n) Source # | `SIntegral` instance for `WordN`
Instance details Defined in Data.SBV.Core.Sized

# Division and Modulus

class SDivisible a where Source #

The `SDivisible` class captures the essence of division. Unfortunately we cannot use Haskell's `Integral` class since the `Real` and `Enum` superclasses are not implementable for symbolic bit-vectors. However, `quotRem` and `divMod` both make perfect sense, and the `SDivisible` class captures this operation. One issue is how division by 0 behaves. The verification technology requires total functions, and there are several design choices here. We follow Isabelle/HOL approach of assigning the value 0 for division by 0. Therefore, we impose the following pair of laws:

         x sQuotRem 0 = (0, x)
         x sDivMod  0 = (0, x)

Note that our instances implement this law even when `x` is `0` itself.

NB. `quot` truncates toward zero, while `div` truncates toward negative infinity.

### C code generation of division operations

In the case of division or modulo of a minimal signed value (e.g. `-128` for `SInt8`) by `-1`, SMTLIB and Haskell agree on what the result should be. Unfortunately the result in C code depends on CPU architecture and compiler settings, as this is undefined behaviour in C. **SBV does not guarantee** what will happen in generated C code in this corner case.

Minimal complete definition

sQuotRem, sDivMod

Methods

sQuotRem :: a -> a -> (a, a) Source #

sDivMod :: a -> a -> (a, a) Source #

sQuot :: a -> a -> a Source #

sRem :: a -> a -> a Source #

sDiv :: a -> a -> a Source #

sMod :: a -> a -> a Source #

#### Instances

Instances details

SDivisible Int8 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: Int8 -> Int8 -> (Int8, Int8) Source # sDivMod :: Int8 -> Int8 -> (Int8, Int8) Source # sQuot :: Int8 -> Int8 -> Int8 Source # sRem :: Int8 -> Int8 -> Int8 Source # sDiv :: Int8 -> Int8 -> Int8 Source # sMod :: Int8 -> Int8 -> Int8 Source #
SDivisible Int16 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: Int16 -> Int16 -> (Int16, Int16) Source # sDivMod :: Int16 -> Int16 -> (Int16, Int16) Source # sQuot :: Int16 -> Int16 -> Int16 Source # sRem :: Int16 -> Int16 -> Int16 Source # sDiv :: Int16 -> Int16 -> Int16 Source # sMod :: Int16 -> Int16 -> Int16 Source #
SDivisible Int32 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: Int32 -> Int32 -> (Int32, Int32) Source # sDivMod :: Int32 -> Int32 -> (Int32, Int32) Source # sQuot :: Int32 -> Int32 -> Int32 Source # sRem :: Int32 -> Int32 -> Int32 Source # sDiv :: Int32 -> Int32 -> Int32 Source # sMod :: Int32 -> Int32 -> Int32 Source #
SDivisible Int64 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: Int64 -> Int64 -> (Int64, Int64) Source # sDivMod :: Int64 -> Int64 -> (Int64, Int64) Source # sQuot :: Int64 -> Int64 -> Int64 Source # sRem :: Int64 -> Int64 -> Int64 Source # sDiv :: Int64 -> Int64 -> Int64 Source # sMod :: Int64 -> Int64 -> Int64 Source #
SDivisible Integer Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: Integer -> Integer -> (Integer, Integer) Source # sDivMod :: Integer -> Integer -> (Integer, Integer) Source # sQuot :: Integer -> Integer -> Integer Source # sRem :: Integer -> Integer -> Integer Source # sDiv :: Integer -> Integer -> Integer Source # sMod :: Integer -> Integer -> Integer Source #
SDivisible Word8 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: Word8 -> Word8 -> (Word8, Word8) Source # sDivMod :: Word8 -> Word8 -> (Word8, Word8) Source # sQuot :: Word8 -> Word8 -> Word8 Source # sRem :: Word8 -> Word8 -> Word8 Source # sDiv :: Word8 -> Word8 -> Word8 Source # sMod :: Word8 -> Word8 -> Word8 Source #
SDivisible Word16 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: Word16 -> Word16 -> (Word16, Word16) Source # sDivMod :: Word16 -> Word16 -> (Word16, Word16) Source # sQuot :: Word16 -> Word16 -> Word16 Source # sRem :: Word16 -> Word16 -> Word16 Source # sDiv :: Word16 -> Word16 -> Word16 Source # sMod :: Word16 -> Word16 -> Word16 Source #
SDivisible Word32 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: Word32 -> Word32 -> (Word32, Word32) Source # sDivMod :: Word32 -> Word32 -> (Word32, Word32) Source # sQuot :: Word32 -> Word32 -> Word32 Source # sRem :: Word32 -> Word32 -> Word32 Source # sDiv :: Word32 -> Word32 -> Word32 Source # sMod :: Word32 -> Word32 -> Word32 Source #
SDivisible Word64 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: Word64 -> Word64 -> (Word64, Word64) Source # sDivMod :: Word64 -> Word64 -> (Word64, Word64) Source # sQuot :: Word64 -> Word64 -> Word64 Source # sRem :: Word64 -> Word64 -> Word64 Source # sDiv :: Word64 -> Word64 -> Word64 Source # sMod :: Word64 -> Word64 -> Word64 Source #
SDivisible CV Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: CV -> CV -> (CV, CV) Source # sDivMod :: CV -> CV -> (CV, CV) Source # sQuot :: CV -> CV -> CV Source # sRem :: CV -> CV -> CV Source # sDiv :: CV -> CV -> CV Source # sMod :: CV -> CV -> CV Source #
SDivisible SInteger Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SInteger -> SInteger -> (SInteger, SInteger) Source # sDivMod :: SInteger -> SInteger -> (SInteger, SInteger) Source # sQuot :: SInteger -> SInteger -> SInteger Source # sRem :: SInteger -> SInteger -> SInteger Source # sDiv :: SInteger -> SInteger -> SInteger Source # sMod :: SInteger -> SInteger -> SInteger Source #
SDivisible SInt64 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SInt64 -> SInt64 -> (SInt64, SInt64) Source # sDivMod :: SInt64 -> SInt64 -> (SInt64, SInt64) Source # sQuot :: SInt64 -> SInt64 -> SInt64 Source # sRem :: SInt64 -> SInt64 -> SInt64 Source # sDiv :: SInt64 -> SInt64 -> SInt64 Source # sMod :: SInt64 -> SInt64 -> SInt64 Source #
SDivisible SInt32 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SInt32 -> SInt32 -> (SInt32, SInt32) Source # sDivMod :: SInt32 -> SInt32 -> (SInt32, SInt32) Source # sQuot :: SInt32 -> SInt32 -> SInt32 Source # sRem :: SInt32 -> SInt32 -> SInt32 Source # sDiv :: SInt32 -> SInt32 -> SInt32 Source # sMod :: SInt32 -> SInt32 -> SInt32 Source #
SDivisible SInt16 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SInt16 -> SInt16 -> (SInt16, SInt16) Source # sDivMod :: SInt16 -> SInt16 -> (SInt16, SInt16) Source # sQuot :: SInt16 -> SInt16 -> SInt16 Source # sRem :: SInt16 -> SInt16 -> SInt16 Source # sDiv :: SInt16 -> SInt16 -> SInt16 Source # sMod :: SInt16 -> SInt16 -> SInt16 Source #
SDivisible SInt8 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SInt8 -> SInt8 -> (SInt8, SInt8) Source # sDivMod :: SInt8 -> SInt8 -> (SInt8, SInt8) Source # sQuot :: SInt8 -> SInt8 -> SInt8 Source # sRem :: SInt8 -> SInt8 -> SInt8 Source # sDiv :: SInt8 -> SInt8 -> SInt8 Source # sMod :: SInt8 -> SInt8 -> SInt8 Source #
SDivisible SWord64 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SWord64 -> SWord64 -> (SWord64, SWord64) Source # sDivMod :: SWord64 -> SWord64 -> (SWord64, SWord64) Source # sQuot :: SWord64 -> SWord64 -> SWord64 Source # sRem :: SWord64 -> SWord64 -> SWord64 Source # sDiv :: SWord64 -> SWord64 -> SWord64 Source # sMod :: SWord64 -> SWord64 -> SWord64 Source #
SDivisible SWord32 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SWord32 -> SWord32 -> (SWord32, SWord32) Source # sDivMod :: SWord32 -> SWord32 -> (SWord32, SWord32) Source # sQuot :: SWord32 -> SWord32 -> SWord32 Source # sRem :: SWord32 -> SWord32 -> SWord32 Source # sDiv :: SWord32 -> SWord32 -> SWord32 Source # sMod :: SWord32 -> SWord32 -> SWord32 Source #
SDivisible SWord16 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SWord16 -> SWord16 -> (SWord16, SWord16) Source # sDivMod :: SWord16 -> SWord16 -> (SWord16, SWord16) Source # sQuot :: SWord16 -> SWord16 -> SWord16 Source # sRem :: SWord16 -> SWord16 -> SWord16 Source # sDiv :: SWord16 -> SWord16 -> SWord16 Source # sMod :: SWord16 -> SWord16 -> SWord16 Source #
SDivisible SWord8 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SWord8 -> SWord8 -> (SWord8, SWord8) Source # sDivMod :: SWord8 -> SWord8 -> (SWord8, SWord8) Source # sQuot :: SWord8 -> SWord8 -> SWord8 Source # sRem :: SWord8 -> SWord8 -> SWord8 Source # sDiv :: SWord8 -> SWord8 -> SWord8 Source # sMod :: SWord8 -> SWord8 -> SWord8 Source #
(KnownNat n, IsNonZero n) => SDivisible (SInt n) Source # | `SDivisible` instance for `SInt`
Instance details Defined in Data.SBV.Core.Sized Methods sQuotRem :: SInt n -> SInt n -> (SInt n, SInt n) Source # sDivMod :: SInt n -> SInt n -> (SInt n, SInt n) Source # sQuot :: SInt n -> SInt n -> SInt n Source # sRem :: SInt n -> SInt n -> SInt n Source # sDiv :: SInt n -> SInt n -> SInt n Source # sMod :: SInt n -> SInt n -> SInt n Source #
(KnownNat n, IsNonZero n) => SDivisible (IntN n) Source # | `SDivisible` instance for `IntN`
Instance details Defined in Data.SBV.Core.Sized Methods sQuotRem :: IntN n -> IntN n -> (IntN n, IntN n) Source # sDivMod :: IntN n -> IntN n -> (IntN n, IntN n) Source # sQuot :: IntN n -> IntN n -> IntN n Source # sRem :: IntN n -> IntN n -> IntN n Source # sDiv :: IntN n -> IntN n -> IntN n Source # sMod :: IntN n -> IntN n -> IntN n Source #
(KnownNat n, IsNonZero n) => SDivisible (SWord n) Source # | `SDivisible` instance for `SWord`
Instance details Defined in Data.SBV.Core.Sized Methods sQuotRem :: SWord n -> SWord n -> (SWord n, SWord n) Source # sDivMod :: SWord n -> SWord n -> (SWord n, SWord n) Source # sQuot :: SWord n -> SWord n -> SWord n Source # sRem :: SWord n -> SWord n -> SWord n Source # sDiv :: SWord n -> SWord n -> SWord n Source # sMod :: SWord n -> SWord n -> SWord n Source #
(KnownNat n, IsNonZero n) => SDivisible (WordN n) Source # | `SDivisible` instance for `WordN`
Instance details Defined in Data.SBV.Core.Sized Methods sQuotRem :: WordN n -> WordN n -> (WordN n, WordN n) Source # sDivMod :: WordN n -> WordN n -> (WordN n, WordN n) Source # sQuot :: WordN n -> WordN n -> WordN n Source # sRem :: WordN n -> WordN n -> WordN n Source # sDiv :: WordN n -> WordN n -> WordN n Source # sMod :: WordN n -> WordN n -> WordN n Source #

# Bit-vector operations

## Conversions

sFromIntegral :: forall a b. (Integral a, HasKind a, Num a, SymVal a, HasKind b, Num b, SymVal b) => SBV a -> SBV b Source #

Conversion between integral-symbolic values, akin to Haskell's `fromIntegral`

## Shifts and rotates

Symbolic words (both signed and unsigned) are an instance of Haskell's `Bits` class, so regular bitwise operations are automatically available for them. Shifts and rotates, however, require specialized type-signatures since Haskell insists on an `Int` second argument for them.

sShiftLeft :: (SIntegral a, SIntegral b) => SBV a -> SBV b -> SBV a Source #

Generalization of `shiftL`, when the shift-amount is symbolic. Since Haskell's `shiftL` only takes an `Int` as the shift amount, it cannot be used when we have a symbolic amount to shift with.

sShiftRight :: (SIntegral a, SIntegral b) => SBV a -> SBV b -> SBV a Source #

Generalization of `shiftR`, when the shift-amount is symbolic. Since Haskell's `shiftR` only takes an `Int` as the shift amount, it cannot be used when we have a symbolic amount to shift with.

NB. If the shiftee is signed, then this is an arithmetic shift; otherwise it's logical, following the usual Haskell convention. See `sSignedShiftArithRight` for a variant that explicitly uses the msb as the sign bit, even for unsigned underlying types.

sRotateLeft :: (SIntegral a, SIntegral b) => SBV a -> SBV b -> SBV a Source #

Generalization of `rotateL`, when the shift-amount is symbolic. Since Haskell's `rotateL` only takes an `Int` as the shift amount, it cannot be used when we have a symbolic amount to shift with. The first argument should be a bounded quantity.

sBarrelRotateLeft :: (SFiniteBits a, SFiniteBits b) => SBV a -> SBV b -> SBV a Source #

An implementation of rotate-left, using a barrel shifter like design. Only works when both arguments are finite bitvectors, and furthermore when the second argument is unsigned. The first condition is enforced by the type, but the second is dynamically checked. We provide this implementation as an alternative to `sRotateLeft` since SMTLib logic does not support variable argument rotates (as opposed to shifts), and thus this implementation can produce better code for verification compared to `sRotateLeft`.

    >>> prove $ \x y -> (x `sBarrelRotateLeft`  y) `sBarrelRotateRight` (y :: SWord32) .== (x :: SWord64)
    Q.E.D.

sRotateRight :: (SIntegral a, SIntegral b) => SBV a -> SBV b -> SBV a Source #

Generalization of `rotateR`, when the shift-amount is symbolic. Since Haskell's `rotateR` only takes an `Int` as the shift amount, it cannot be used when we have a symbolic amount to shift with. The first argument should be a bounded quantity.

sBarrelRotateRight :: (SFiniteBits a, SFiniteBits b) => SBV a -> SBV b -> SBV a Source #

An implementation of rotate-right, using a barrel shifter like design. See comments for `sBarrelRotateLeft` for details.

    >>> prove $ \x y -> (x `sBarrelRotateRight` y) `sBarrelRotateLeft`  (y :: SWord32) .== (x :: SWord64)
    Q.E.D.

sSignedShiftArithRight :: (SFiniteBits a, SIntegral b) => SBV a -> SBV b -> SBV a Source #

Arithmetic shift-right with a symbolic unsigned shift amount. This is equivalent to `sShiftRight` when the argument is signed. However, if the argument is unsigned, then it explicitly treats its msb as a sign-bit, and uses it as the bit that gets shifted in. Useful when using the underlying unsigned bit representation to implement custom signed operations. Note that there is no direct Haskell analogue of this function.

## Finite bit-vector operations

class (Ord a, SymVal a, Num a, Bits a) => SFiniteBits a where Source #

Finite bit-length symbolic values. Essentially the same as `SIntegral`, but further leaves out `Integer`. Loosely based on Haskell's `FiniteBits` class, but with more methods defined and structured differently to fit into the symbolic world view. Minimal complete definition: `sFiniteBitSize`.

Minimal complete definition

sFiniteBitSize

Methods

sFiniteBitSize :: SBV a -> Int Source #

Bit size.

lsb :: SBV a -> SBool Source #

Least significant bit of a word, always stored at index 0.

msb :: SBV a -> SBool Source #

Most significant bit of a word, always stored at the last position.

blastBE :: SBV a -> [SBool] Source #

Big-endian blasting of a word into its bits.

blastLE :: SBV a -> [SBool] Source #

Little-endian blasting of a word into its bits.

fromBitsBE :: [SBool] -> SBV a Source #

Reconstruct from given bits, given in little-endian.

fromBitsLE :: [SBool] -> SBV a Source #

Reconstruct from given bits, given in little-endian.

sTestBit :: SBV a -> Int -> SBool Source #

Replacement for `testBit`, returning `SBool` instead of `Bool`.

sExtractBits :: SBV a -> [Int] -> [SBool] Source #

Variant of `sTestBit`, where we want to extract multiple bit positions.

sPopCount :: SBV a -> SWord8 Source #

Variant of `popCount`, returning a symbolic value.

setBitTo :: SBV a -> Int -> SBool -> SBV a Source #

A combo of `setBit` and `clearBit`, when the bit to be set is symbolic.

fullAdder :: SBV a -> SBV a -> (SBool, SBV a) Source #

Full adder, returns carry-out from the addition. Only for unsigned quantities.

fullMultiplier :: SBV a -> SBV a -> (SBV a, SBV a) Source #

Full multipler, returns both high and low-order bits. Only for unsigned quantities.

sCountLeadingZeros :: SBV a -> SWord8 Source #

Count leading zeros in a word, big-endian interpretation.

sCountTrailingZeros :: SBV a -> SWord8 Source #

Count trailing zeros in a word, big-endian interpretation.

#### Instances

Instances details

SFiniteBits Int8 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

sFiniteBitSize :: SBV Int8 -> Int Source #

lsb :: SBV Int8 -> SBool Source #

msb :: SBV Int8 -> SBool Source #

blastBE :: SBV Int8 -> [SBool] Source #

blastLE :: SBV Int8 -> [SBool] Source #

fromBitsBE :: [SBool] -> SBV Int8 Source #

fromBitsLE :: [SBool] -> SBV Int8 Source #

sTestBit :: SBV Int8 -> Int -> SBool Source #

sExtractBits :: SBV Int8 -> [Int] -> [SBool] Source #

sPopCount :: SBV Int8 -> SWord8 Source #

setBitTo :: SBV Int8 -> Int -> SBool -> SBV Int8 Source #

fullAdder :: SBV Int8 -> SBV Int8 -> (SBool, SBV Int8) Source #

fullMultiplier :: SBV Int8 -> SBV Int8 -> (SBV Int8, SBV Int8) Source #

sCountLeadingZeros :: SBV Int8 -> SWord8 Source #

sCountTrailingZeros :: SBV Int8 -> SWord8 Source #

SFiniteBits Int16 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

sFiniteBitSize :: SBV Int16 -> Int Source #

lsb :: SBV Int16 -> SBool Source #

msb :: SBV Int16 -> SBool Source #

blastBE :: SBV Int16 -> [SBool] Source #

blastLE :: SBV Int16 -> [SBool] Source #

fromBitsBE :: [SBool] -> SBV Int16 Source #

fromBitsLE :: [SBool] -> SBV Int16 Source #

sTestBit :: SBV Int16 -> Int -> SBool Source #

sExtractBits :: SBV Int16 -> [Int] -> [SBool] Source #

sPopCount :: SBV Int16 -> SWord8 Source #

setBitTo :: SBV Int16 -> Int -> SBool -> SBV Int16 Source #

fullAdder :: SBV Int16 -> SBV Int16 -> (SBool, SBV Int16) Source #

fullMultiplier :: SBV Int16 -> SBV Int16 -> (SBV Int16, SBV Int16) Source #

sCountLeadingZeros :: SBV Int16 -> SWord8 Source #

sCountTrailingZeros :: SBV Int16 -> SWord8 Source #

SFiniteBits Int32 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

sFiniteBitSize :: SBV Int32 -> Int Source #

lsb :: SBV Int32 -> SBool Source #

msb :: SBV Int32 -> SBool Source #

blastBE :: SBV Int32 -> [SBool] Source #

blastLE :: SBV Int32 -> [SBool] Source #

fromBitsBE :: [SBool] -> SBV Int32 Source #

fromBitsLE :: [SBool] -> SBV Int32 Source #

sTestBit :: SBV Int32 -> Int -> SBool Source #

sExtractBits :: SBV Int32 -> [Int] -> [SBool] Source #

sPopCount :: SBV Int32 -> SWord8 Source #

setBitTo :: SBV Int32 -> Int -> SBool -> SBV Int32 Source #

fullAdder :: SBV Int32 -> SBV Int32 -> (SBool, SBV Int32) Source #

fullMultiplier :: SBV Int32 -> SBV Int32 -> (SBV Int32, SBV Int32) Source #

sCountLeadingZeros :: SBV Int32 -> SWord8 Source #

sCountTrailingZeros :: SBV Int32 -> SWord8 Source #

SFiniteBits Int64 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

sFiniteBitSize :: SBV Int64 -> Int Source #

lsb :: SBV Int64 -> SBool Source #

msb :: SBV Int64 -> SBool Source #

blastBE :: SBV Int64 -> [SBool] Source #

blastLE :: SBV Int64 -> [SBool] Source #

fromBitsBE :: [SBool] -> SBV Int64 Source #

fromBitsLE :: [SBool] -> SBV Int64 Source #

sTestBit :: SBV Int64 -> Int -> SBool Source #

sExtractBits :: SBV Int64 -> [Int] -> [SBool] Source #

sPopCount :: SBV Int64 -> SWord8 Source #

setBitTo :: SBV Int64 -> Int -> SBool -> SBV Int64 Source #

fullAdder :: SBV Int64 -> SBV Int64 -> (SBool, SBV Int64) Source #

fullMultiplier :: SBV Int64 -> SBV Int64 -> (SBV Int64, SBV Int64) Source #

sCountLeadingZeros :: SBV Int64 -> SWord8 Source #

sCountTrailingZeros :: SBV Int64 -> SWord8 Source #

SFiniteBits Word8 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

sFiniteBitSize :: SBV Word8 -> Int Source #

lsb :: SBV Word8 -> SBool Source #

msb :: SBV Word8 -> SBool Source #

blastBE :: SBV Word8 -> [SBool] Source #

blastLE :: SBV Word8 -> [SBool] Source #

fromBitsBE :: [SBool] -> SBV Word8 Source #

fromBitsLE :: [SBool] -> SBV Word8 Source #

sTestBit :: SBV Word8 -> Int -> SBool Source #

sExtractBits :: SBV Word8 -> [Int] -> [SBool] Source #

sPopCount :: SBV Word8 -> SWord8 Source #

setBitTo :: SBV Word8 -> Int -> SBool -> SBV Word8 Source #

fullAdder :: SBV Word8 -> SBV Word8 -> (SBool, SBV Word8) Source #

fullMultiplier :: SBV Word8 -> SBV Word8 -> (SBV Word8, SBV Word8) Source #

sCountLeadingZeros :: SBV Word8 -> SWord8 Source #

sCountTrailingZeros :: SBV Word8 -> SWord8 Source #

SFiniteBits Word16 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

sFiniteBitSize :: SBV Word16 -> Int Source #

lsb :: SBV Word16 -> SBool Source #

msb :: SBV Word16 -> SBool Source #

blastBE :: SBV Word16 -> [SBool] Source #

blastLE :: SBV Word16 -> [SBool] Source #

fromBitsBE :: [SBool] -> SBV Word16 Source #

fromBitsLE :: [SBool] -> SBV Word16 Source #

sTestBit :: SBV Word16 -> Int -> SBool Source #

sExtractBits :: SBV Word16 -> [Int] -> [SBool] Source #

sPopCount :: SBV Word16 -> SWord8 Source #

setBitTo :: SBV Word16 -> Int -> SBool -> SBV Word16 Source #

fullAdder :: SBV Word16 -> SBV Word16 -> (SBool, SBV Word16) Source #

fullMultiplier :: SBV Word16 -> SBV Word16 -> (SBV Word16, SBV Word16) Source #

sCountLeadingZeros :: SBV Word16 -> SWord8 Source #

sCountTrailingZeros :: SBV Word16 -> SWord8 Source #

SFiniteBits Word32 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

sFiniteBitSize :: SBV Word32 -> Int Source #

lsb :: SBV Word32 -> SBool Source #

msb :: SBV Word32 -> SBool Source #

blastBE :: SBV Word32 -> [SBool] Source #

blastLE :: SBV Word32 -> [SBool] Source #

fromBitsBE :: [SBool] -> SBV Word32 Source #

fromBitsLE :: [SBool] -> SBV Word32 Source #

sTestBit :: SBV Word32 -> Int -> SBool Source #

sExtractBits :: SBV Word32 -> [Int] -> [SBool] Source #

sPopCount :: SBV Word32 -> SWord8 Source #

setBitTo :: SBV Word32 -> Int -> SBool -> SBV Word32 Source #

fullAdder :: SBV Word32 -> SBV Word32 -> (SBool, SBV Word32) Source #

fullMultiplier :: SBV Word32 -> SBV Word32 -> (SBV Word32, SBV Word32) Source #

sCountLeadingZeros :: SBV Word32 -> SWord8 Source #

sCountTrailingZeros :: SBV Word32 -> SWord8 Source #

SFiniteBits Word64 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

sFiniteBitSize :: SBV Word64 -> Int Source #

lsb :: SBV Word64 -> SBool Source #

msb :: SBV Word64 -> SBool Source #

blastBE :: SBV Word64 -> [SBool] Source #

blastLE :: SBV Word64 -> [SBool] Source #

fromBitsBE :: [SBool] -> SBV Word64 Source #

fromBitsLE :: [SBool] -> SBV Word64 Source #

sTestBit :: SBV Word64 -> Int -> SBool Source #

sExtractBits :: SBV Word64 -> [Int] -> [SBool] Source #

sPopCount :: SBV Word64 -> SWord8 Source #

setBitTo :: SBV Word64 -> Int -> SBool -> SBV Word64 Source #

fullAdder :: SBV Word64 -> SBV Word64 -> (SBool, SBV Word64) Source #

fullMultiplier :: SBV Word64 -> SBV Word64 -> (SBV Word64, SBV Word64) Source #

sCountLeadingZeros :: SBV Word64 -> SWord8 Source #

sCountTrailingZeros :: SBV Word64 -> SWord8 Source #

(KnownNat n, IsNonZero n) => SFiniteBits (IntN n) Source # | `SFiniteBits` instance for `IntN`

Instance details

Defined in Data.SBV.Core.Sized

Methods

sFiniteBitSize :: SBV (IntN n) -> Int Source #

lsb :: SBV (IntN n) -> SBool Source #

msb :: SBV (IntN n) -> SBool Source #

blastBE :: SBV (IntN n) -> [SBool] Source #

blastLE :: SBV (IntN n) -> [SBool] Source #

fromBitsBE :: [SBool] -> SBV (IntN n) Source #

fromBitsLE :: [SBool] -> SBV (IntN n) Source #

sTestBit :: SBV (IntN n) -> Int -> SBool Source #

sExtractBits :: SBV (IntN n) -> [Int] -> [SBool] Source #

sPopCount :: SBV (IntN n) -> SWord8 Source #

setBitTo :: SBV (IntN n) -> Int -> SBool -> SBV (IntN n) Source #

fullAdder :: SBV (IntN n) -> SBV (IntN n) -> (SBool, SBV (IntN n)) Source #

fullMultiplier :: SBV (IntN n) -> SBV (IntN n) -> (SBV (IntN n), SBV (IntN n)) Source #

sCountLeadingZeros :: SBV (IntN n) -> SWord8 Source #

sCountTrailingZeros :: SBV (IntN n) -> SWord8 Source #

(KnownNat n, IsNonZero n) => SFiniteBits (WordN n) Source # | `SFiniteBits` instance for `WordN`

Instance details

Defined in Data.SBV.Core.Sized

Methods

sFiniteBitSize :: SBV (WordN n) -> Int Source #

lsb :: SBV (WordN n) -> SBool Source #

msb :: SBV (WordN n) -> SBool Source #

blastBE :: SBV (WordN n) -> [SBool] Source #

blastLE :: SBV (WordN n) -> [SBool] Source #

fromBitsBE :: [SBool] -> SBV (WordN n) Source #

fromBitsLE :: [SBool] -> SBV (WordN n) Source #

sTestBit :: SBV (WordN n) -> Int -> SBool Source #

sExtractBits :: SBV (WordN n) -> [Int] -> [SBool] Source #

sPopCount :: SBV (WordN n) -> SWord8 Source #

setBitTo :: SBV (WordN n) -> Int -> SBool -> SBV (WordN n) Source #

fullAdder :: SBV (WordN n) -> SBV (WordN n) -> (SBool, SBV (WordN n)) Source #

fullMultiplier :: SBV (WordN n) -> SBV (WordN n) -> (SBV (WordN n), SBV (WordN n)) Source #

sCountLeadingZeros :: SBV (WordN n) -> SWord8 Source #

sCountTrailingZeros :: SBV (WordN n) -> SWord8 Source #

## Splitting, joining, and extending bit-vectors

bvExtract Source #

Arguments

:: forall i j n bv proxy. (KnownNat n, IsNonZero n, SymVal (bv n), KnownNat i, KnownNat j, (i + 1) <= n, j <= i, IsNonZero ((i - j) + 1)) |
=> proxy i | `i`: Start position, numbered from `n-1` to `0`
-> proxy j | `j`: End position, numbered from `n-1` to `0`, `j <= i` must hold
-> SBV (bv n) | Input bit vector of size `n`
-> SBV (bv ((i - j) + 1)) | Output is of size `i - j + 1`

Extract a portion of bits to form a smaller bit-vector.

    >>> prove $ \x -> bvExtract (Proxy @7) (Proxy @3) (x :: SWord 12) .== bvDrop (Proxy @4) (bvTake (Proxy @9) x)
    Q.E.D.

(#) infixr 5 Source #

Arguments

:: (KnownNat n, IsNonZero n, SymVal (bv n), KnownNat m, IsNonZero m, SymVal (bv m)) |
=> SBV (bv n) | First input, of size `n`, becomes the left side
-> SBV (bv m) | Second input, of size `m`, becomes the right side
-> SBV (bv (n + m)) | Concatenation, of size `n+m`

Join two bitvectors.

    >>> prove $ \x y -> x .== bvExtract (Proxy @79) (Proxy @71) ((x :: SWord 9) # (y :: SWord 71))
    Q.E.D.

zeroExtend Source #

Arguments

:: forall n m bv. (KnownNat n, IsNonZero n, SymVal (bv n), KnownNat m, IsNonZero m, SymVal (bv m), (n + 1) <= m, SIntegral (bv (m - n)), IsNonZero (m - n)) |
=> SBV (bv n) | Input, of size `n`
-> SBV (bv m) | Output, of size `m`. `n < m` must hold

Zero extend a bit-vector.

    >>> prove $ \x -> bvExtract (Proxy @20) (Proxy @12) (zeroExtend (x :: SInt 12) :: SInt 21) .== 0
    Q.E.D.

signExtend Source #

Arguments

:: forall n m bv. (KnownNat n, IsNonZero n, SymVal (bv n), KnownNat m, IsNonZero m, SymVal (bv m), (n + 1) <= m, SFiniteBits (bv n), SIntegral (bv (m - n)), IsNonZero (m - n)) |
=> SBV (bv n) | Input, of size `n`
-> SBV (bv m) | Output, of size `m`. `n < m` must hold

Sign extend a bit-vector.

    >>> prove $ \x -> sNot (msb x) .=> bvExtract (Proxy @20) (Proxy @12) (signExtend (x :: SInt 12) :: SInt 21) .== 0
    Q.E.D.
    >>> prove $ \x ->       msb x  .=> bvExtract (Proxy @20) (Proxy @12) (signExtend (x :: SInt 12) :: SInt 21) .== complement 0
    Q.E.D.

bvDrop Source #

Arguments

:: forall i n m bv proxy. (KnownNat n, IsNonZero n, KnownNat i, (i + 1) <= n, ((i + m) - n) <= 0, IsNonZero (n - i)) |
=> proxy i | `i`: Number of bits to drop. `i < n` must hold.
-> SBV (bv n) | Input, of size `n`
-> SBV (bv m) | Output, of size `m`. `m = n - i` holds.

Drop bits from the top of a bit-vector.

    >>> prove $ \x -> bvDrop (Proxy @0) (x :: SWord 43) .== x
    Q.E.D.
    >>> prove $ \x -> bvDrop (Proxy @20) (x :: SWord 21) .== ite (lsb x) 1 0
    Q.E.D.

bvTake Source #

Arguments

:: forall i n bv proxy. (KnownNat n, IsNonZero n, KnownNat i, IsNonZero i, i <= n) |
=> proxy i | `i`: Number of bits to take. `0 < i <= n` must hold.
-> SBV (bv n) | Input, of size `n`
-> SBV (bv i) | Output, of size `i`

Take bits from the top of a bit-vector.

    >>> prove $ \x -> bvTake (Proxy @13) (x :: SWord 13) .== x
    Q.E.D.
    >>> prove $ \x -> bvTake (Proxy @1) (x :: SWord 13) .== ite (msb x) 1 0
    Q.E.D.
    >>> prove $ \x -> bvTake (Proxy @4) x # bvDrop (Proxy @4) x .== (x :: SWord 23)
    Q.E.D.

class ByteConverter a where Source #

A helper class to convert sized bit-vectors to/from bytes.

Methods

toBytes :: a -> [SWord 8] Source #

Convert to a sequence of bytes

    >>> prove $ \a b c d -> toBytes ((fromBytes [a, b, c, d]) :: SWord 32) .== [a, b, c, d]
    Q.E.D.

fromBytes :: [SWord 8] -> a Source #

Convert from a sequence of bytes

    >>> prove $ \r -> fromBytes (toBytes r) .== (r :: SWord 64)
    Q.E.D.

#### Instances

Instances details

ByteConverter (SWord 8) Source # | `SWord` 8 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 8 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 8 Source #
ByteConverter (SWord 16) Source # | `SWord` 16 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 16 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 16 Source #
ByteConverter (SWord 32) Source # | `SWord` 32 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 32 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 32 Source #
ByteConverter (SWord 64) Source # | `SWord` 64 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 64 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 64 Source #
ByteConverter (SWord 128) Source # | `SWord` 128 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 128 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 128 Source #
ByteConverter (SWord 256) Source # | `SWord` 256 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 256 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 256 Source #
ByteConverter (SWord 512) Source # | `SWord` 512 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 512 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 512 Source #
ByteConverter (SWord 1024) Source # | `SWord` 1024 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 1024 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 1024 Source #

## Exponentiation

(.^) :: (Mergeable b, Num b, SIntegral e) => b -> SBV e -> b Source #

Symbolic exponentiation using bit blasting and repeated squaring.

N.B. The exponent must be unsigned/bounded if symbolic. Signed exponents will be rejected.

# IEEE-floating point numbers

class (SymVal a, RealFloat a) => IEEEFloating a where Source #

A class of floating-point (IEEE754) operations, some of which behave differently based on rounding modes. Note that unless the rounding mode is concretely RoundNearestTiesToEven, we will not concretely evaluate these, but rather pass down to the SMT solver.

Minimal complete definition

Nothing

Methods

fpAbs :: SBV a -> SBV a Source #

Compute the floating point absolute value.

fpNeg :: SBV a -> SBV a Source #

Compute the unary negation. Note that `0 - x` is not equivalent to `-x` for floating-point, since `-0` and `0` are different.

fpAdd :: SRoundingMode -> SBV a -> SBV a -> SBV a Source #

Add two floating point values, using the given rounding mode

fpSub :: SRoundingMode -> SBV a -> SBV a -> SBV a Source #

Subtract two floating point values, using the given rounding mode

fpMul :: SRoundingMode -> SBV a -> SBV a -> SBV a Source #

Multiply two floating point values, using the given rounding mode

fpDiv :: SRoundingMode -> SBV a -> SBV a -> SBV a Source #

Divide two floating point values, using the given rounding mode

fpFMA :: SRoundingMode -> SBV a -> SBV a -> SBV a -> SBV a Source #

Fused-multiply-add three floating point values, using the given rounding mode. `fpFMA x y z = x*y+z` but with only one rounding done for the whole operation; not two. Note that we will never concretely evaluate this function since Haskell lacks an FMA implementation.

fpSqrt :: SRoundingMode -> SBV a -> SBV a Source #

Compute the square-root of a float, using the given rounding mode

fpRem :: SBV a -> SBV a -> SBV a Source #

Compute the remainder: `x - y * n`, where `n` is the truncated integer nearest to x/y. The rounding mode is implicitly assumed to be `RoundNearestTiesToEven`.

fpRoundToIntegral :: SRoundingMode -> SBV a -> SBV a Source #

Round to the nearest integral value, using the given rounding mode.

fpMin :: SBV a -> SBV a -> SBV a Source #

Compute the minimum of two floats, respects `infinity` and `NaN` values

fpMax :: SBV a -> SBV a -> SBV a Source #

Compute the maximum of two floats, respects `infinity` and `NaN` values

fpIsEqualObject :: SBV a -> SBV a -> SBool Source #

Are the two given floats exactly the same. That is, `NaN` will compare equal to itself, `+0` will not compare equal to `-0` etc. This is the object level equality, as opposed to the semantic equality. (For the latter, just use `.==`.)

fpIsNormal :: SBV a -> SBool Source #

Is the floating-point number a normal value. (i.e., not denormalized.)

fpIsSubnormal :: SBV a -> SBool Source #

Is the floating-point number a subnormal value. (Also known as denormal.)

fpIsZero :: SBV a -> SBool Source #

Is the floating-point number 0? (Note that both +0 and -0 will satisfy this predicate.)

fpIsInfinite :: SBV a -> SBool Source #

Is the floating-point number infinity? (Note that both +oo and -oo will satisfy this predicate.)

fpIsNaN :: SBV a -> SBool Source #

Is the floating-point number a NaN value?

fpIsNegative :: SBV a -> SBool Source #

Is the floating-point number negative? Note that -0 satisfies this predicate but +0 does not.

fpIsPositive :: SBV a -> SBool Source #

Is the floating-point number positive? Note that +0 satisfies this predicate but -0 does not.

fpIsNegativeZero :: SBV a -> SBool Source #

Is the floating point number -0?

fpIsPositiveZero :: SBV a -> SBool Source #

Is the floating point number +0?

fpIsPoint :: SBV a -> SBool Source #

Is the floating-point number a regular floating point, i.e., not NaN, nor +oo, nor -oo. Normals or denormals are allowed.

#### Instances

Instances details

IEEEFloating Double Source # | SDouble instance

Instance details

Defined in Data.SBV.Core.Floating

Methods

fpAbs :: SBV Double -> SBV Double Source #

fpNeg :: SBV Double -> SBV Double Source #

fpAdd :: SRoundingMode -> SBV Double -> SBV Double -> SBV Double Source #

fpSub :: SRoundingMode -> SBV Double -> SBV Double -> SBV Double Source #

fpMul :: SRoundingMode -> SBV Double -> SBV Double -> SBV Double Source #

fpDiv :: SRoundingMode -> SBV Double -> SBV Double -> SBV Double Source #

fpFMA :: SRoundingMode -> SBV Double -> SBV Double -> SBV Double -> SBV Double Source #

fpSqrt :: SRoundingMode -> SBV Double -> SBV Double Source #

fpRem :: SBV Double -> SBV Double -> SBV Double Source #

fpRoundToIntegral :: SRoundingMode -> SBV Double -> SBV Double Source #

fpMin :: SBV Double -> SBV Double -> SBV Double Source #

fpMax :: SBV Double -> SBV Double -> SBV Double Source #

fpIsEqualObject :: SBV Double -> SBV Double -> SBool Source #

fpIsNormal :: SBV Double -> SBool Source #

fpIsSubnormal :: SBV Double -> SBool Source #

fpIsZero :: SBV Double -> SBool Source #

fpIsInfinite :: SBV Double -> SBool Source #

fpIsNaN :: SBV Double -> SBool Source #

fpIsNegative :: SBV Double -> SBool Source #

fpIsPositive :: SBV Double -> SBool Source #

fpIsNegativeZero :: SBV Double -> SBool Source #

fpIsPositiveZero :: SBV Double -> SBool Source #

fpIsPoint :: SBV Double -> SBool Source #

IEEEFloating Float Source # | SFloat instance

Instance details

Defined in Data.SBV.Core.Floating

Methods

fpAbs :: SBV Float -> SBV Float Source #

fpNeg :: SBV Float -> SBV Float Source #

fpAdd :: SRoundingMode -> SBV Float -> SBV Float -> SBV Float Source #

fpSub :: SRoundingMode -> SBV Float -> SBV Float -> SBV Float Source #

fpMul :: SRoundingMode -> SBV Float -> SBV Float -> SBV Float Source #

fpDiv :: SRoundingMode -> SBV Float -> SBV Float -> SBV Float Source #

fpFMA :: SRoundingMode -> SBV Float -> SBV Float -> SBV Float -> SBV Float Source #

fpSqrt :: SRoundingMode -> SBV Float -> SBV Float Source #

fpRem :: SBV Float -> SBV Float -> SBV Float Source #

fpRoundToIntegral :: SRoundingMode -> SBV Float -> SBV Float Source #

fpMin :: SBV Float -> SBV Float -> SBV Float Source #

fpMax :: SBV Float -> SBV Float -> SBV Float Source #

fpIsEqualObject :: SBV Float -> SBV Float -> SBool Source #

fpIsNormal :: SBV Float -> SBool Source #

fpIsSubnormal :: SBV Float -> SBool Source #

fpIsZero :: SBV Float -> SBool Source #

fpIsInfinite :: SBV Float -> SBool Source #

fpIsNaN :: SBV Float -> SBool Source #

fpIsNegative :: SBV Float -> SBool Source #

fpIsPositive :: SBV Float -> SBool Source #

fpIsNegativeZero :: SBV Float -> SBool Source #

fpIsPositiveZero :: SBV Float -> SBool Source #

fpIsPoint :: SBV Float -> SBool Source #

data RoundingMode Source #

Rounding mode to be used for the IEEE floating-point operations. Note that Haskell's default is `RoundNearestTiesToEven`. If you use a different rounding mode, then the counter-examples you get may not match what you observe in Haskell.

Constructors

RoundNearestTiesToEven | Round to nearest representable floating point value. If precisely at half-way, pick the even number. (In this context, even means the lowest-order bit is zero.)
RoundNearestTiesToAway | Round to nearest representable floating point value. If precisely at half-way, pick the number further away from 0. (That is, for positive values, pick the greater; for negative values, pick the smaller.)
RoundTowardPositive | Round towards positive infinity. (Also known as rounding-up or ceiling.)
RoundTowardNegative | Round towards negative infinity. (Also known as rounding-down or floor.)
RoundTowardZero | Round towards zero. (Also known as truncation.)

#### Instances

Instances details

Bounded RoundingMode Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods minBound :: RoundingMode maxBound :: RoundingMode
Enum RoundingMode Source # |

Instance details

Defined in Data.SBV.Core.Symbolic

Methods

succ :: RoundingMode -> RoundingMode

pred :: RoundingMode -> RoundingMode

toEnum :: Int -> RoundingMode

fromEnum :: RoundingMode -> Int

enumFrom :: RoundingMode -> [RoundingMode]

enumFromThen :: RoundingMode -> RoundingMode -> [RoundingMode]

enumFromTo :: RoundingMode -> RoundingMode -> [RoundingMode]

enumFromThenTo :: RoundingMode -> RoundingMode -> RoundingMode -> [RoundingMode]

Eq RoundingMode Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods (==) :: RoundingMode -> RoundingMode -> Bool (/=) :: RoundingMode -> RoundingMode -> Bool
Data RoundingMode Source # |

Instance details

Defined in Data.SBV.Core.Symbolic

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> RoundingMode -> c RoundingMode

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c RoundingMode

toConstr :: RoundingMode -> Constr

dataTypeOf :: RoundingMode -> DataType

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c RoundingMode)

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c RoundingMode)

gmapT :: (forall b. Data b => b -> b) -> RoundingMode -> RoundingMode

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> RoundingMode -> r

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> RoundingMode -> r

gmapQ :: (forall d. Data d => d -> u) -> RoundingMode -> [u]

gmapQi :: Int -> (forall d. Data d => d -> u) -> RoundingMode -> u

gmapM :: Monad m => (forall d. Data d => d -> m d) -> RoundingMode -> m RoundingMode

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> RoundingMode -> m RoundingMode

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> RoundingMode -> m RoundingMode

Ord RoundingMode Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods compare :: RoundingMode -> RoundingMode -> Ordering (<) :: RoundingMode -> RoundingMode -> Bool (<=) :: RoundingMode -> RoundingMode -> Bool (>) :: RoundingMode -> RoundingMode -> Bool (>=) :: RoundingMode -> RoundingMode -> Bool max :: RoundingMode -> RoundingMode -> RoundingMode min :: RoundingMode -> RoundingMode -> RoundingMode
Read RoundingMode Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods readsPrec :: Int -> ReadS RoundingMode readList :: ReadS [RoundingMode] readPrec :: ReadPrec RoundingMode readListPrec :: ReadPrec [RoundingMode]
Show RoundingMode Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods showsPrec :: Int -> RoundingMode -> ShowS show :: RoundingMode -> String showList :: [RoundingMode] -> ShowS
HasKind RoundingMode Source # | `RoundingMode` kind

Instance details

Defined in Data.SBV.Core.Symbolic

Methods

kindOf :: RoundingMode -> Kind Source #

hasSign :: RoundingMode -> Bool Source #

intSizeOf :: RoundingMode -> Int Source #

isBoolean :: RoundingMode -> Bool Source #

isBounded :: RoundingMode -> Bool Source #

isReal :: RoundingMode -> Bool Source #

isFloat :: RoundingMode -> Bool Source #

isDouble :: RoundingMode -> Bool Source #

isUnbounded :: RoundingMode -> Bool Source #

isUninterpreted :: RoundingMode -> Bool Source #

isChar :: RoundingMode -> Bool Source #

isString :: RoundingMode -> Bool Source #

isList :: RoundingMode -> Bool Source #

isSet :: RoundingMode -> Bool Source #

isTuple :: RoundingMode -> Bool Source #

isMaybe :: RoundingMode -> Bool Source #

isEither :: RoundingMode -> Bool Source #

showType :: RoundingMode -> String Source #

SymVal RoundingMode Source # | `RoundingMode` can be used symbolically

Instance details

Defined in Data.SBV.Core.Data

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV RoundingMode) Source #

literal :: RoundingMode -> SBV RoundingMode Source #

fromCV :: CV -> RoundingMode Source #

isConcretely :: SBV RoundingMode -> (RoundingMode -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV RoundingMode) Source #

forall_ :: MonadSymbolic m => m (SBV RoundingMode) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV RoundingMode] Source #

exists :: MonadSymbolic m => String -> m (SBV RoundingMode) Source #

exists_ :: MonadSymbolic m => m (SBV RoundingMode) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV RoundingMode] Source #

free :: MonadSymbolic m => String -> m (SBV RoundingMode) Source #

free_ :: MonadSymbolic m => m (SBV RoundingMode) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV RoundingMode] Source #

symbolic :: MonadSymbolic m => String -> m (SBV RoundingMode) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV RoundingMode] Source #

unliteral :: SBV RoundingMode -> Maybe RoundingMode Source #

isConcrete :: SBV RoundingMode -> Bool Source #

isSymbolic :: SBV RoundingMode -> Bool Source #

SatModel RoundingMode Source # | A rounding mode, extracted from a model. (Default definition suffices)
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (RoundingMode, [CV]) Source # cvtModel :: (RoundingMode -> Maybe b) -> Maybe (RoundingMode, [CV]) -> Maybe (b, [CV]) Source #

type SRoundingMode = SBV RoundingMode Source #

The symbolic variant of `RoundingMode`

nan :: Floating a => a Source #

Not-A-Number for `Double` and `Float`. Surprisingly, Haskell Prelude doesn't have this value defined, so we provide it here.

infinity :: Floating a => a Source #

Infinity for `Double` and `Float`. Surprisingly, Haskell Prelude doesn't have this value defined, so we provide it here.

sNaN :: (Floating a, SymVal a) => SBV a Source #

Symbolic variant of Not-A-Number. This value will inhabit both `SDouble` and `SFloat`.

sInfinity :: (Floating a, SymVal a) => SBV a Source #

Symbolic variant of infinity. This value will inhabit both `SDouble` and `SFloat`.

## Rounding modes

sRoundNearestTiesToEven :: SRoundingMode Source #

Symbolic variant of `RoundNearestTiesToEven`

sRoundNearestTiesToAway :: SRoundingMode Source #

Symbolic variant of `RoundNearestTiesToAway`

sRoundTowardPositive :: SRoundingMode Source #

Symbolic variant of `RoundTowardPositive`

sRoundTowardNegative :: SRoundingMode Source #

Symbolic variant of `RoundTowardNegative`

sRoundTowardZero :: SRoundingMode Source #

Symbolic variant of `RoundTowardZero`

sRNE :: SRoundingMode Source #

Alias for `sRoundNearestTiesToEven`

sRNA :: SRoundingMode Source #

Alias for `sRoundNearestTiesToAway`

sRTP :: SRoundingMode Source #

Alias for `sRoundTowardPositive`

sRTN :: SRoundingMode Source #

Alias for `sRoundTowardNegative`

sRTZ :: SRoundingMode Source #

Alias for `sRoundTowardZero`

## Conversion to/from floats

class SymVal a => IEEEFloatConvertible a where Source #

Capture convertability from/to FloatingPoint representations.

Conversions to float: `toSFloat` and `toSDouble` simply return the nearest representable float from the given type based on the rounding mode provided.

Conversions from float: `fromSFloat` and `fromSDouble` functions do the reverse conversion. However some care is needed when given values that are not representable in the integral target domain. For instance, converting an `SFloat` to an `SInt8` is problematic. The rules are as follows:

If the input value is a finite point and when rounded in the given rounding mode to an integral value lies within the target bounds, then that result is returned. (This is the regular interpretation of rounding in IEEE754.)

Otherwise (i.e., if the integral value in the float or double domain) doesn't fit into the target type, then the result is unspecified. Note that if the input is `+oo`, `-oo`, or `NaN`, then the result is unspecified.

Due to the unspecified nature of conversions, SBV will never constant fold conversions from floats to integral values. That is, you will always get a symbolic value as output. (Conversions from floats to other floats will be constant folded. Conversions from integral values to floats will also be constant folded.)

Note that unspecified really means unspecified: In particular, SBV makes no guarantees about matching the behavior between what you might get in Haskell, via SMT-Lib, or the C-translation. If the input value is out-of-bounds as defined above, or is `NaN` or `oo` or `-oo`, then all bets are off. In particular C and SMTLib are decidedly undefine this case, though that doesn't mean they do the same thing! Same goes for Haskell, which seems to convert via Int64, but we do not model that behavior in SBV as it doesn't seem to be intentional nor well documented.

You can check for `NaN`, `oo` and `-oo`, using the predicates `fpIsNaN`, `fpIsInfinite`, and `fpIsPositive`, `fpIsNegative` predicates, respectively; and do the proper conversion based on your needs. (0 is a good choice, as are min/max bounds of the target type.)

Currently, SBV provides no predicates to check if a value would lie within range for a particular conversion task, as this depends on the rounding mode and the types involved and can be rather tricky to determine. (See http://github.com/LeventErkok/sbv/issues/456 for a discussion of the issues involved.) In a future release, we hope to be able to provide underflow and overflow predicates for these conversions as well.

Minimal complete definition

Nothing

Methods

fromSFloat :: SRoundingMode -> SFloat -> SBV a Source #

Convert from an IEEE74 single precision float.

toSFloat :: SRoundingMode -> SBV a -> SFloat Source #

Convert to an IEEE-754 Single-precision float.

    >>> :{
    roundTrip :: forall a. (Eq a, IEEEFloatConvertible a) => SRoundingMode -> SBV a -> SBool
    roundTrip m x = fromSFloat m (toSFloat m x) .== x
    :}

    >>> prove $ roundTrip @Int8
    Q.E.D.
    >>> prove $ roundTrip @Word8
    Q.E.D.
    >>> prove $ roundTrip @Int16
    Q.E.D.
    >>> prove $ roundTrip @Word16
    Q.E.D.
    >>> prove $ roundTrip @Int32
    Falsifiable. Counter-example:
      s0 = RoundNearestTiesToEven :: RoundingMode
      s1 =             -264306721 :: Int32

Note how we get a failure on `Int32`. The counter-example value is not representable exactly as a single precision float:

    >>> toRational (-264306721 :: Float)
    (-264306720) % 1

Note how the numerator is different, it is off by 1. This is hardly surprising, since floats become sparser as the magnitude increases to be able to cover all the integer values representable.

default toSFloat :: Integral a => SRoundingMode -> SBV a -> SFloat Source #

fromSDouble :: SRoundingMode -> SDouble -> SBV a Source #

Convert from an IEEE74 double precision float.

toSDouble :: SRoundingMode -> SBV a -> SDouble Source #

Convert to an IEEE-754 Double-precision float.

    >>> :{
    roundTrip :: forall a. (Eq a, IEEEFloatConvertible a) => SRoundingMode -> SBV a -> SBool
    roundTrip m x = fromSDouble m (toSDouble m x) .== x
    :}

    >>> prove $ roundTrip @Int8
    Q.E.D.
    >>> prove $ roundTrip @Word8
    Q.E.D.
    >>> prove $ roundTrip @Int16
    Q.E.D.
    >>> prove $ roundTrip @Word16
    Q.E.D.
    >>> prove $ roundTrip @Int32
    Q.E.D.
    >>> prove $ roundTrip @Word32
    Q.E.D.
    >>> prove $ roundTrip @Int64
    Falsifiable. Counter-example:
      s0 =  RoundTowardNegative :: RoundingMode
      s1 = -8069753317450726624 :: Int64

Just like in the `SFloat` case, once we reach 64-bits, we no longer can exactly represent the integer value for all possible values:

    >>> toRational ( -8069753317450726624 :: Double)
    (-8069753317450726400) % 1

In this case the numerator is off by 224!

default toSDouble :: Integral a => SRoundingMode -> SBV a -> SDouble Source #

#### Instances

Instances details

IEEEFloatConvertible Double Source # |
Instance details Defined in Data.SBV.Core.Floating Methods fromSFloat :: SRoundingMode -> SFloat -> SBV Double Source # toSFloat :: SRoundingMode -> SBV Double -> SFloat Source # fromSDouble :: SRoundingMode -> SDouble -> SBV Double Source # toSDouble :: SRoundingMode -> SBV Double -> SDouble Source #
IEEEFloatConvertible Float Source # |
Instance details Defined in Data.SBV.Core.Floating Methods fromSFloat :: SRoundingMode -> SFloat -> SBV Float Source # toSFloat :: SRoundingMode -> SBV Float -> SFloat Source # fromSDouble :: SRoundingMode -> SDouble -> SBV Float Source # toSDouble :: SRoundingMode -> SBV Float -> SDouble Source #
IEEEFloatConvertible Int8 Source # |
Instance details Defined in Data.SBV.Core.Floating Methods fromSFloat :: SRoundingMode -> SFloat -> SBV Int8 Source # toSFloat :: SRoundingMode -> SBV Int8 -> SFloat Source # fromSDouble :: SRoundingMode -> SDouble -> SBV Int8 Source # toSDouble :: SRoundingMode -> SBV Int8 -> SDouble Source #
IEEEFloatConvertible Int16 Source # |
Instance details Defined in Data.SBV.Core.Floating Methods fromSFloat :: SRoundingMode -> SFloat -> SBV Int16 Source # toSFloat :: SRoundingMode -> SBV Int16 -> SFloat Source # fromSDouble :: SRoundingMode -> SDouble -> SBV Int16 Source # toSDouble :: SRoundingMode -> SBV Int16 -> SDouble Source #
IEEEFloatConvertible Int32 Source # |
Instance details Defined in Data.SBV.Core.Floating Methods fromSFloat :: SRoundingMode -> SFloat -> SBV Int32 Source # toSFloat :: SRoundingMode -> SBV Int32 -> SFloat Source # fromSDouble :: SRoundingMode -> SDouble -> SBV Int32 Source # toSDouble :: SRoundingMode -> SBV Int32 -> SDouble Source #
IEEEFloatConvertible Int64 Source # |
Instance details Defined in Data.SBV.Core.Floating Methods fromSFloat :: SRoundingMode -> SFloat -> SBV Int64 Source # toSFloat :: SRoundingMode -> SBV Int64 -> SFloat Source # fromSDouble :: SRoundingMode -> SDouble -> SBV Int64 Source # toSDouble :: SRoundingMode -> SBV Int64 -> SDouble Source #
IEEEFloatConvertible Integer Source # |
Instance details Defined in Data.SBV.Core.Floating Methods fromSFloat :: SRoundingMode -> SFloat -> SBV Integer Source # toSFloat :: SRoundingMode -> SBV Integer -> SFloat Source # fromSDouble :: SRoundingMode -> SDouble -> SBV Integer Source # toSDouble :: SRoundingMode -> SBV Integer -> SDouble Source #
IEEEFloatConvertible Word8 Source # |
Instance details Defined in Data.SBV.Core.Floating Methods fromSFloat :: SRoundingMode -> SFloat -> SBV Word8 Source # toSFloat :: SRoundingMode -> SBV Word8 -> SFloat Source # fromSDouble :: SRoundingMode -> SDouble -> SBV Word8 Source # toSDouble :: SRoundingMode -> SBV Word8 -> SDouble Source #
IEEEFloatConvertible Word16 Source # |
Instance details Defined in Data.SBV.Core.Floating Methods fromSFloat :: SRoundingMode -> SFloat -> SBV Word16 Source # toSFloat :: SRoundingMode -> SBV Word16 -> SFloat Source # fromSDouble :: SRoundingMode -> SDouble -> SBV Word16 Source # toSDouble :: SRoundingMode -> SBV Word16 -> SDouble Source #
IEEEFloatConvertible Word32 Source # |
Instance details Defined in Data.SBV.Core.Floating Methods fromSFloat :: SRoundingMode -> SFloat -> SBV Word32 Source # toSFloat :: SRoundingMode -> SBV Word32 -> SFloat Source # fromSDouble :: SRoundingMode -> SDouble -> SBV Word32 Source # toSDouble :: SRoundingMode -> SBV Word32 -> SDouble Source #
IEEEFloatConvertible Word64 Source # |
Instance details Defined in Data.SBV.Core.Floating Methods fromSFloat :: SRoundingMode -> SFloat -> SBV Word64 Source # toSFloat :: SRoundingMode -> SBV Word64 -> SFloat Source # fromSDouble :: SRoundingMode -> SDouble -> SBV Word64 Source # toSDouble :: SRoundingMode -> SBV Word64 -> SDouble Source #
IEEEFloatConvertible AlgReal Source # |
Instance details Defined in Data.SBV.Core.Floating Methods fromSFloat :: SRoundingMode -> SFloat -> SBV AlgReal Source # toSFloat :: SRoundingMode -> SBV AlgReal -> SFloat Source # fromSDouble :: SRoundingMode -> SDouble -> SBV AlgReal Source # toSDouble :: SRoundingMode -> SBV AlgReal -> SDouble Source #

## Bit-pattern conversions

sFloatAsSWord32 :: SFloat -> SWord32 Source #

Convert an `SFloat` to an `SWord32`, preserving the bit-correspondence. Note that since the representation for `NaN`s are not unique, this function will return a symbolic value when given a concrete `NaN`.

Implementation note: Since there's no corresponding function in SMTLib for conversion to bit-representation due to partiality, we use a translation trick by allocating a new word variable, converting it to float, and requiring it to be equivalent to the input. In code-generation mode, we simply map it to a simple conversion.

sWord32AsSFloat :: SWord32 -> SFloat Source #

Reinterpret the bits in a 32-bit word as a single-precision floating point number

sDoubleAsSWord64 :: SDouble -> SWord64 Source #

Convert an `SDouble` to an `SWord64`, preserving the bit-correspondence. Note that since the representation for `NaN`s are not unique, this function will return a symbolic value when given a concrete `NaN`.

See the implementation note for `sFloatAsSWord32`, as it applies here as well.

sWord64AsSDouble :: SWord64 -> SDouble Source #

Reinterpret the bits in a 32-bit word as a single-precision floating point number

blastSFloat :: SFloat -> (SBool, [SBool], [SBool]) Source #

Extract the sign/exponent/mantissa of a single-precision float. The output will have 8 bits in the second argument for exponent, and 23 in the third for the mantissa.

blastSDouble :: SDouble -> (SBool, [SBool], [SBool]) Source #

Extract the sign/exponent/mantissa of a single-precision float. The output will have 11 bits in the second argument for exponent, and 52 in the third for the mantissa.

# Enumerations

If the uninterpreted sort definition takes the form of an enumeration (i.e., a simple data type with all nullary constructors), then SBV will actually translate that as just such a data-type to SMT-Lib, and will use the constructors as the inhabitants of the said sort. A simple example is:

        data X = A | B | C
        mkSymbolicEnumeration ''X

Note the magic incantation `mkSymbolicEnumeration ''X`. For this to work, you need to have the following options turned on:

      LANGUAGE TemplateHaskell
      LANGUAGE StandaloneDeriving
      LANGUAGE DeriveDataTypeable
      LANGUAGE DeriveAnyClass

Now, the user can define

        type SX = SBV X

and treat `SX` as a regular symbolic type ranging over the values `A`, `B`, and `C`. Such values can be compared for equality, and with the usual other comparison operators, such as `.==`, `./=`, `.>`, `.>=`, `<`, and `<=`.

Note that in this latter case the type is no longer uninterpreted, but is properly represented as a simple enumeration of the said elements. A simple query would look like:

         allSat $ x -> x .== (x :: SX)

which would list all three elements of this domain as satisfying solutions.

         Solution #1:
           s0 = A :: X
         Solution #2:
           s0 = B :: X
         Solution #3:
           s0 = C :: X
         Found 3 different solutions.

Note that the result is properly typed as `X` elements; these are not mere strings. So, in a `getModelAssignment` scenario, the user can recover actual elements of the domain and program further with those values as usual.

See Documentation.SBV.Examples.Misc.Enumerate for an extended example on how to use symbolic enumerations.

mkSymbolicEnumeration :: Name -> Q [Dec] Source #

Make an enumeration a symbolic type.

# Uninterpreted sorts, axioms, constants, and functions

Users can introduce new uninterpreted sorts simply by defining a data-type in Haskell and registering it as such. The following example demonstrates:

        data B = B () deriving (Eq, Ord, Show, Read, Data, SymVal, HasKind, SatModel)

(Note that you'll also need to use the language pragmas `DeriveDataTypeable`, `DeriveAnyClass`, and import `Data.Generics` for the above to work.)

This is all it takes to introduce `B` as an uninterpreted sort in SBV, which makes the type `SBV B` automagically become available as the type of symbolic values that ranges over `B` values. Note that the `()` argument is important to distinguish it from enumerations, which will be translated to proper SMT data-types.

Uninterpreted functions over both uninterpreted and regular sorts can be declared using the facilities introduced by the `Uninterpreted` class.

class Uninterpreted a where Source #

Uninterpreted constants and functions. An uninterpreted constant is a value that is indexed by its name. The only property the prover assumes about these values are that they are equivalent to themselves; i.e., (for functions) they return the same results when applied to same arguments. We support uninterpreted-functions as a general means of black-box'ing operations that are irrelevant for the purposes of the proof; i.e., when the proofs can be performed without any knowledge about the function itself.

Minimal complete definition: `sbvUninterpret`. However, most instances in practice are already provided by SBV, so end-users should not need to define their own instances.

Minimal complete definition

sbvUninterpret

Methods

uninterpret :: String -> a Source #

Uninterpret a value, receiving an object that can be used instead. Use this version when you do not need to add an axiom about this value.

cgUninterpret :: String -> [String] -> a -> a Source #

Uninterpret a value, only for the purposes of code-generation. For execution and verification the value is used as is. For code-generation, the alternate definition is used. This is useful when we want to take advantage of native libraries on the target languages.

sbvUninterpret :: Maybe ([String], a) -> String -> a Source #

Most generalized form of uninterpretation, this function should not be needed by end-user-code, but is rather useful for the library development.

#### Instances

Instances details

HasKind a => Uninterpreted (SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> SBV a Source # cgUninterpret :: String -> [String] -> SBV a -> SBV a Source # sbvUninterpret :: Maybe ([String], SBV a) -> String -> SBV a Source #
(SymVal c, SymVal b, HasKind a) => Uninterpreted ((SBV c, SBV b) -> SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> (SBV c, SBV b) -> SBV a Source # cgUninterpret :: String -> [String] -> ((SBV c, SBV b) -> SBV a) -> (SBV c, SBV b) -> SBV a Source # sbvUninterpret :: Maybe ([String], (SBV c, SBV b) -> SBV a) -> String -> (SBV c, SBV b) -> SBV a Source #
(SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted ((SBV d, SBV c, SBV b) -> SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> (SBV d, SBV c, SBV b) -> SBV a Source # cgUninterpret :: String -> [String] -> ((SBV d, SBV c, SBV b) -> SBV a) -> (SBV d, SBV c, SBV b) -> SBV a Source # sbvUninterpret :: Maybe ([String], (SBV d, SBV c, SBV b) -> SBV a) -> String -> (SBV d, SBV c, SBV b) -> SBV a Source #
(SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted ((SBV e, SBV d, SBV c, SBV b) -> SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> (SBV e, SBV d, SBV c, SBV b) -> SBV a Source # cgUninterpret :: String -> [String] -> ((SBV e, SBV d, SBV c, SBV b) -> SBV a) -> (SBV e, SBV d, SBV c, SBV b) -> SBV a Source # sbvUninterpret :: Maybe ([String], (SBV e, SBV d, SBV c, SBV b) -> SBV a) -> String -> (SBV e, SBV d, SBV c, SBV b) -> SBV a Source #
(SymVal f, SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted ((SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> (SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

cgUninterpret :: String -> [String] -> ((SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) -> (SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

sbvUninterpret :: Maybe ([String], (SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) -> String -> (SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

(SymVal g, SymVal f, SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted ((SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> (SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

cgUninterpret :: String -> [String] -> ((SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) -> (SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

sbvUninterpret :: Maybe ([String], (SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) -> String -> (SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

(SymVal h, SymVal g, SymVal f, SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted ((SBV h, SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> (SBV h, SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

cgUninterpret :: String -> [String] -> ((SBV h, SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) -> (SBV h, SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

sbvUninterpret :: Maybe ([String], (SBV h, SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) -> String -> (SBV h, SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

(SymVal h, SymVal g, SymVal f, SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted (SBV h -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> SBV h -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

cgUninterpret :: String -> [String] -> (SBV h -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> SBV h -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

sbvUninterpret :: Maybe ([String], SBV h -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> String -> SBV h -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

(SymVal g, SymVal f, SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted (SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

cgUninterpret :: String -> [String] -> (SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

sbvUninterpret :: Maybe ([String], SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> String -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

(SymVal f, SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted (SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

cgUninterpret :: String -> [String] -> (SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

sbvUninterpret :: Maybe ([String], SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> String -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

(SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted (SBV e -> SBV d -> SBV c -> SBV b -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

cgUninterpret :: String -> [String] -> (SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

sbvUninterpret :: Maybe ([String], SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> String -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

(SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted (SBV d -> SBV c -> SBV b -> SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> SBV d -> SBV c -> SBV b -> SBV a Source # cgUninterpret :: String -> [String] -> (SBV d -> SBV c -> SBV b -> SBV a) -> SBV d -> SBV c -> SBV b -> SBV a Source # sbvUninterpret :: Maybe ([String], SBV d -> SBV c -> SBV b -> SBV a) -> String -> SBV d -> SBV c -> SBV b -> SBV a Source #
(SymVal c, SymVal b, HasKind a) => Uninterpreted (SBV c -> SBV b -> SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> SBV c -> SBV b -> SBV a Source # cgUninterpret :: String -> [String] -> (SBV c -> SBV b -> SBV a) -> SBV c -> SBV b -> SBV a Source # sbvUninterpret :: Maybe ([String], SBV c -> SBV b -> SBV a) -> String -> SBV c -> SBV b -> SBV a Source #
(SymVal b, HasKind a) => Uninterpreted (SBV b -> SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> SBV b -> SBV a Source # cgUninterpret :: String -> [String] -> (SBV b -> SBV a) -> SBV b -> SBV a Source # sbvUninterpret :: Maybe ([String], SBV b -> SBV a) -> String -> SBV b -> SBV a Source #

addAxiom :: SolverContext m => String -> [String] -> m () Source #

Add a user specified axiom to the generated SMT-Lib file. The first argument is a mere string, use for commenting purposes. The second argument is intended to hold the multiple-lines of the axiom text as expressed in SMT-Lib notation. Note that we perform no checks on the axiom itself, to see whether it's actually well-formed or is sensical by any means. A separate formalization of SMT-Lib would be very useful here.

# Properties, proofs, and satisfiability

The SBV library provides a "push-button" verification system via automated SMT solving. The design goal is to let SMT solvers be used without any knowledge of how SMT solvers work or how different logics operate. The details are hidden behind the SBV framework, providing Haskell programmers with a clean API that is unencumbered by the details of individual solvers. To that end, we use the SMT-Lib standard (http://smtlib.cs.uiowa.edu/) to communicate with arbitrary SMT solvers.

### A note on reasoning in the presence of quantifers

Note that SBV allows reasoning with quantifiers: Inputs can be existentially or universally quantified. Predicates can be built with arbitrary nesting of such quantifiers as well. However, SBV always assumes that the input is in prenex-normal form: http://en.wikipedia.org/wiki/Prenex_normal_form. That is, all the input declarations are treated as happening at the beginning of a predicate, followed by the actual formula. Unfortunately, the way predicates are written can be misleading at times, since symbolic inputs can be created at arbitrary points; interleaving them with other code. The rule is simple, however: All inputs are assumed at the top, in the order declared, regardless of their quantifiers. SBV will apply skolemization to get rid of existentials before sending predicates to backend solvers. However, if you do want nested quantification, you will manually have to first convert to prenex-normal form (which produces an equisatisfiable but not necessarily equivalent formula), and code that explicitly in SBV. See http://github.com/LeventErkok/sbv/issues/256 for a detailed discussion of this issue.

### Using multiple solvers

On a multi-core machine, it might be desirable to try a given property using multiple SMT solvers, using parallel threads. Even with machines with single-cores, threading can be helpful if you want to try out multiple-solvers but do not know which one would work the best for the problem at hand ahead of time.

SBV allows proving/satisfiability-checking with multiple backends at the same time. Each function comes in two variants, one that returns the results from all solvers, the other that returns the fastest one.

The `All` variants, (i.e., `proveWithAll`, `satWithAll`) run all solvers and return all the results. SBV internally makes sure that the result is lazily generated; so, the order of solvers given does not matter. In other words, the order of results will follow the order of the solvers as they finish, not as given by the user. These variants are useful when you want to make sure multiple-solvers agree (or disagree!) on a given problem.

The `Any` variants, (i.e., `proveWithAny`, `satWithAny`) will run all the solvers in parallel, and return the results of the first one finishing. The other threads will then be killed. These variants are useful when you do not care if the solvers produce the same result, but rather want to get the solution as quickly as possible, taking advantage of modern many-core machines.

Note that the function `sbvAvailableSolvers` will return all the installed solvers, which can be used as the first argument to all these functions, if you simply want to try all available solvers on a machine.

type Predicate = Symbolic SBool Source #

A predicate is a symbolic program that returns a (symbolic) boolean value. For all intents and purposes, it can be treated as an n-ary function from symbolic-values to a boolean. The `Symbolic` monad captures the underlying representation, and can/should be ignored by the users of the library, unless you are building further utilities on top of SBV itself. Instead, simply use the `Predicate` type when necessary.

type Goal = Symbolic () Source #

A goal is a symbolic program that returns no values. The idea is that the constraints/min-max goals will serve as appropriate directives for sat/prove calls.

type Provable = MProvable IO Source #

`Provable` is specialization of `MProvable` to the `IO` monad. Unless you are using transformers explicitly, this is the type you should prefer.

forAll_ :: Provable a => a -> Symbolic SBool Source #

Turns a value into a universally quantified predicate, internally naming the inputs. In this case the sbv library will use names of the form `s1, s2`, etc. to name these variables Example:

     forAll_ $ \(x::SWord8) y -> x `shiftL` 2 .== y

is a predicate with two arguments, captured using an ordinary Haskell function. Internally, `x` will be named `s0` and `y` will be named `s1`.

NB. For a version which generalizes over the underlying monad, see `forAll_`

forAll :: Provable a => [String] -> a -> Symbolic SBool Source #

Turns a value into a predicate, allowing users to provide names for the inputs. If the user does not provide enough number of names for the variables, the remaining ones will be internally generated. Note that the names are only used for printing models and has no other significance; in particular, we do not check that they are unique. Example:

     forAll ["x", "y"] $ \(x::SWord8) y -> x `shiftL` 2 .== y

This is the same as above, except the variables will be named `x` and `y` respectively, simplifying the counter-examples when they are printed.

NB. For a version which generalizes over the underlying monad, see `forAll`

forSome_ :: Provable a => a -> Symbolic SBool Source #

Turns a value into an existentially quantified predicate. (Indeed, `exists` would have been a better choice here for the name, but alas it's already taken.)

NB. For a version which generalizes over the underlying monad, see `forSome_`

forSome :: Provable a => [String] -> a -> Symbolic SBool Source #

Version of `forSome` that allows user defined names.

NB. For a version which generalizes over the underlying monad, see `forSome`

prove :: Provable a => a -> IO ThmResult Source #

Prove a predicate, using the default solver.

NB. For a version which generalizes over the underlying monad, see `prove`

proveWith :: Provable a => SMTConfig -> a -> IO ThmResult Source #

Prove the predicate using the given SMT-solver.

NB. For a version which generalizes over the underlying monad, see `proveWith`

sat :: Provable a => a -> IO SatResult Source #

Find a satisfying assignment for a predicate, using the default solver.

NB. For a version which generalizes over the underlying monad, see `sat`

satWith :: Provable a => SMTConfig -> a -> IO SatResult Source #

Find a satisfying assignment using the given SMT-solver.

NB. For a version which generalizes over the underlying monad, see `satWith`

allSat :: Provable a => a -> IO AllSatResult Source #

Find all satisfying assignments, using the default solver. Equivalent to ``allSatWith` `defaultSMTCfg``. See `allSatWith` for details.

NB. For a version which generalizes over the underlying monad, see `allSat`

allSatWith :: Provable a => SMTConfig -> a -> IO AllSatResult Source #

Return all satisfying assignments for a predicate. Note that this call will block until all satisfying assignments are found. If you have a problem with infinitely many satisfying models (consider `SInteger`) or a very large number of them, you might have to wait for a long time. To avoid such cases, use the `allSatMaxModelCount` parameter in the configuration.

NB. Uninterpreted constant/function values and counter-examples for array values are ignored for the purposes of `allSat`. That is, only the satisfying assignments modulo uninterpreted functions and array inputs will be returned. This is due to the limitation of not having a robust means of getting a function counter-example back from the SMT solver. Find all satisfying assignments using the given SMT-solver

NB. For a version which generalizes over the underlying monad, see `allSatWith`

optimize :: Provable a => OptimizeStyle -> a -> IO OptimizeResult Source #

Optimize a given collection of `Objective`s.

NB. For a version which generalizes over the underlying monad, see `optimize`

optimizeWith :: Provable a => SMTConfig -> OptimizeStyle -> a -> IO OptimizeResult Source #

Optimizes the objectives using the given SMT-solver.

NB. For a version which generalizes over the underlying monad, see `optimizeWith`

isVacuous :: Provable a => a -> IO Bool Source #

Check if the constraints given are consistent, using the default solver.

NB. For a version which generalizes over the underlying monad, see `isVacuous`

isVacuousWith :: Provable a => SMTConfig -> a -> IO Bool Source #

Determine if the constraints are vacuous using the given SMT-solver.

NB. For a version which generalizes over the underlying monad, see `isVacuousWith`

isTheorem :: Provable a => a -> IO Bool Source #

Checks theoremhood using the default solver.

NB. For a version which generalizes over the underlying monad, see `isTheorem`

isTheoremWith :: Provable a => SMTConfig -> a -> IO Bool Source #

Check whether a given property is a theorem.

NB. For a version which generalizes over the underlying monad, see `isTheoremWith`

isSatisfiable :: Provable a => a -> IO Bool Source #

Checks satisfiability using the default solver.

NB. For a version which generalizes over the underlying monad, see `isSatisfiable`

isSatisfiableWith :: Provable a => SMTConfig -> a -> IO Bool Source #

Check whether a given property is satisfiable.

NB. For a version which generalizes over the underlying monad, see `isSatisfiableWith`

proveWithAll :: Provable a => [SMTConfig] -> a -> IO [(Solver, NominalDiffTime, ThmResult)] Source #

Prove a property with multiple solvers, running them in separate threads. The results will be returned in the order produced.

proveWithAny :: Provable a => [SMTConfig] -> a -> IO (Solver, NominalDiffTime, ThmResult) Source #

Prove a property with multiple solvers, running them in separate threads. Only the result of the first one to finish will be returned, remaining threads will be killed. Note that we send an exception to the losing processes, but we do *not* actually wait for them to finish. In rare cases this can lead to zombie processes. In previous experiments, we found that some processes take their time to terminate. So, this solution favors quick turnaround.

satWithAll :: Provable a => [SMTConfig] -> a -> IO [(Solver, NominalDiffTime, SatResult)] Source #

Find a satisfying assignment to a property with multiple solvers, running them in separate threads. The results will be returned in the order produced.

proveConcurrentWithAny :: Provable a => SMTConfig -> [Query b] -> a -> IO (Solver, NominalDiffTime, ThmResult) Source #

Prove a property by running many queries each isolated to their own thread concurrently and return the first that finishes, killing the others

proveConcurrentWithAll :: Provable a => SMTConfig -> [Query b] -> a -> IO [(Solver, NominalDiffTime, ThmResult)] Source #

Prove a property by running many queries each isolated to their own thread concurrently and wait for each to finish returning all results

satConcurrentWithAny :: Provable a => SMTConfig -> [Query b] -> a -> IO (Solver, NominalDiffTime, SatResult) Source #

Find a satisfying assignment to a property using a single solver, but providing several query problems of interest, with each query running in a separate thread and return the first one that returns. This can be useful to use symbolic mode to drive to a location in the search space of the solver and then refine the problem in query mode. If the computation is very hard to solve for the solver than running in concurrent mode may provide a large performance benefit.

satConcurrentWithAll :: Provable a => SMTConfig -> [Query b] -> a -> IO [(Solver, NominalDiffTime, SatResult)] Source #

Find a satisfying assignment to a property using a single solver, but run each query problem in a separate isolated thread and wait for each thread to finish. See `satConcurrentWithAny` for more details.

satWithAny :: Provable a => [SMTConfig] -> a -> IO (Solver, NominalDiffTime, SatResult) Source #

Find a satisfying assignment to a property with multiple solvers, running them in separate threads. Only the result of the first one to finish will be returned, remaining threads will be killed. Note that we send an exception to the losing processes, but we do *not* actually wait for them to finish. In rare cases this can lead to zombie processes. In previous experiments, we found that some processes take their time to terminate. So, this solution favors quick turnaround.

generateSMTBenchmark :: (MonadIO m, MProvable m a) => Bool -> a -> m String Source #

Create an SMT-Lib2 benchmark. The `Bool` argument controls whether this is a SAT instance, i.e., translate the query directly, or a PROVE instance, i.e., translate the negated query.

solve :: [SBool] -> Symbolic SBool Source #

Form the symbolic conjunction of a given list of boolean conditions. Useful in expressing problems with constraints, like the following:

      sat $ do [x, y, z] <- sIntegers ["x", "y", "z"]
               solve [x .> 5, y + z .< x]

NB. For a version which generalizes over the underlying monad, see `solve`

# Constraints

A constraint is a means for restricting the input domain of a formula. Here's a simple example:

       do x <- exists "x"
          y <- exists "y"
          constrain $ x .> y
          constrain $ x + y .>= 12
          constrain $ y .>= 3
          ...

The first constraint requires `x` to be larger than `y`. The scond one says that sum of `x` and `y` must be at least `12`, and the final one says that `y` to be at least `3`. Constraints provide an easy way to assert additional properties on the input domain, right at the point of the introduction of variables.

Note that the proper reading of a constraint depends on the context:

- In a `sat` (or `allSat`) call: The constraint added is asserted conjunctively. That is, the resulting satisfying model (if any) will always satisfy all the constraints given.
- In a `prove` call: In this case, the constraint acts as an implication. The property is proved under the assumption that the constraint holds. In other words, the constraint says that we only care about the input space that satisfies the constraint.
- In a `quickCheck` call: The constraint acts as a filter for `quickCheck`; if the constraint does not hold, then the input value is considered to be irrelevant and is skipped. Note that this is similar to `prove`, but is stronger: We do not accept a test case to be valid just because the constraints fail on them, although semantically the implication does hold. We simply skip that test case as a bad test vector.
- In a `genTest` call: Similar to `quickCheck` and `prove`: If a constraint does not hold, the input value is ignored and is not included in the test set.

A good use case (in fact the motivating use case) for `constrain` is attaching a constraint to a `forall` or `exists` variable at the time of its creation. Also, the conjunctive semantics for `sat` and the implicative semantics for `prove` simplify programming by choosing the correct interpretation automatically. However, one should be aware of the semantic difference. For instance, in the presence of constraints, formulas that are provable are not necessarily satisfiable. To wit, consider:

       do x <- exists "x"
          constrain $ x .< x
          return $ x .< (x :: SWord8)

This predicate is unsatisfiable since no element of `SWord8` is less than itself. But it's (vacuously) true, since it excludes the entire domain of values, thus making the proof trivial. Hence, this predicate is provable, but is not satisfiable. To make sure the given constraints are not vacuous, the functions `isVacuous` (and `isVacuousWith`) can be used.

Also note that this semantics imply that test case generation (`genTest`) and quick-check can take arbitrarily long in the presence of constraints, if the random input values generated rarely satisfy the constraints. (As an extreme case, consider ``constrain` `sFalse``.)

constrain :: SolverContext m => SBool -> m () Source #

Add a constraint, any satisfying instance must satisfy this condition.

softConstrain :: SolverContext m => SBool -> m () Source #

Add a soft constraint. The solver will try to satisfy this condition if possible, but won't if it cannot.

## Constraint Vacuity

When adding constraints, one has to be careful about making sure they are not inconsistent. The function `isVacuous` can be use for this purpose. Here is an example. Consider the following predicate:

    >>> let pred = do { x <- free "x"; constrain $ x .< x; return $ x .>= (5 :: SWord8) }

This predicate asserts that all 8-bit values are larger than 5, subject to the constraint that the values considered satisfy `x .< x`, i.e., they are less than themselves. Since there are no values that satisfy this constraint, the proof will pass vacuously:

    >>> prove pred
    Q.E.D.

We can use `isVacuous` to make sure to see that the pass was vacuous:

    >>> isVacuous pred
    True

While the above example is trivial, things can get complicated if there are multiple constraints with non-straightforward relations; so if constraints are used one should make sure to check the predicate is not vacuously true. Here's an example that is not vacuous:

    >>> let pred' = do { x <- free "x"; constrain $ x .> 6; return $ x .>= (5 :: SWord8) }

This time the proof passes as expected:

    >>> prove pred'
    Q.E.D.

And the proof is not vacuous:

    >>> isVacuous pred'
    False

## Named constraints and attributes

Constraints can be given names:

     namedConstraint "a is at least 5" $ a .>= 5

Similarly, arbitrary term attributes can also be associated:

     constrainWithAttribute [(":solver-specific-attribute", "value")] $ a .>= 5

Note that a `namedConstraint` is equivalent to a `constrainWithAttribute` call, setting the `":named"' attribute.

namedConstraint :: SolverContext m => String -> SBool -> m () Source #

Add a named constraint. The name is used in unsat-core extraction.

constrainWithAttribute :: SolverContext m => [(String, String)] -> SBool -> m () Source #

Add a constraint, with arbitrary attributes.

## Unsat cores

Named constraints are useful when used in conjunction with `getUnsatCore` function where the backend solver can be queried to obtain an unsat core in case the constraints are unsatisfiable. See `getUnsatCore` for details and Documentation.SBV.Examples.Queries.UnsatCore for an example use case.

## Cardinality constraints

A pseudo-boolean function (http://en.wikipedia.org/wiki/Pseudo-Boolean_function) is a function from booleans to reals, basically treating `True` as `1` and `False` as `0`. They are typically expressed in polynomial form. Such functions can be used to express cardinality constraints, where we want to count how many things satisfy a certain condition.

One can code such constraints using regular SBV programming: Simply walk over the booleans and the corresponding coefficients, and assert the required relation. For instance:

    [b0, b1, b2, b3] `pbAtMost` 2

is precisely equivalent to:

    sum (map (\b -> ite b 1 0) [b0, b1, b2, b3]) .<= 2

and they both express that at most two of `b0`, `b1`, `b2`, and `b3` can be `sTrue`. However, the equivalent forms give rise to long formulas and the cardinality constraint can get lost in the translation. The idea here is that if you use these functions instead, SBV will produce better translations to SMTLib for more efficient solving of cardinality constraints, assuming the backend solver supports them. Currently, only Z3 supports pseudo-booleans directly. For all other solvers, SBV will translate these to equivalent terms that do not require special functions.

pbAtMost :: [SBool] -> Int -> SBool Source #

`sTrue` if at most `k` of the input arguments are `sTrue`

pbAtLeast :: [SBool] -> Int -> SBool Source #

`sTrue` if at least `k` of the input arguments are `sTrue`

pbExactly :: [SBool] -> Int -> SBool Source #

`sTrue` if exactly `k` of the input arguments are `sTrue`

pbLe :: [(Int, SBool)] -> Int -> SBool Source #

`sTrue` if the sum of coefficients for `sTrue` elements is at most `k`. Generalizes `pbAtMost`.

pbGe :: [(Int, SBool)] -> Int -> SBool Source #

`sTrue` if the sum of coefficients for `sTrue` elements is at least `k`. Generalizes `pbAtLeast`.

pbEq :: [(Int, SBool)] -> Int -> SBool Source #

`sTrue` if the sum of coefficients for `sTrue` elements is exactly least `k`. Useful for coding exactly K-of-N constraints, and in particular mutex constraints.

pbMutexed :: [SBool] -> SBool Source #

`sTrue` if there is at most one set bit

pbStronglyMutexed :: [SBool] -> SBool Source #

`sTrue` if there is exactly one set bit

# Checking safety

The `sAssert` function allows users to introduce invariants to make sure certain properties hold at all times. This is another mechanism to provide further documentation/contract info into SBV code. The functions `safe` and `safeWith` can be used to statically discharge these proof assumptions. If a violation is found, SBV will print a model showing which inputs lead to the invariant being violated.

Here's a simple example. Let's assume we have a function that does subtraction, and requires its first argument to be larger than the second:

    >>> let sub x y = sAssert Nothing "sub: x >= y must hold!" (x .>= y) (x - y)

Clearly, this function is not safe, as there's nothing that stops us from passing it a larger second argument. We can use `safe` to statically see if such a violation is possible before we use this function elsewhere.

    >>> safe (sub :: SInt8 -> SInt8 -> SInt8)
    [sub: x >= y must hold!: Violated. Model:
      s0 = 30 :: Int8
      s1 = 32 :: Int8]

What happens if we make sure to arrange for this invariant? Consider this version:

    >>> let safeSub x y = ite (x .>= y) (sub x y) 0

Clearly, `safeSub` must be safe. And indeed, SBV can prove that:

    >>> safe (safeSub :: SInt8 -> SInt8 -> SInt8)
    [sub: x >= y must hold!: No violations detected]

Note how we used `sub` and `safeSub` polymorphically. We only need to monomorphise our types when a proof attempt is done, as we did in the `safe` calls.

If required, the user can pass a `CallStack` through the first argument to `sAssert`, which will be used by SBV to print a diagnostic info to pinpoint the failure.

Also see Documentation.SBV.Examples.Misc.NoDiv0 for the classic div-by-zero example.

sAssert :: HasKind a => Maybe CallStack -> String -> SBool -> SBV a -> SBV a Source #

Symbolic assert. Check that the given boolean condition is always `sTrue` in the given path. The optional first argument can be used to provide call-stack info via GHC's location facilities.

isSafe :: SafeResult -> Bool Source #

Check if a safe-call was safe or not, turning a `SafeResult` to a Bool.

class ExtractIO m => SExecutable m a Source #

Symbolically executable program fragments. This class is mainly used for `safe` calls, and is sufficently populated internally to cover most use cases. Users can extend it as they wish to allow `safe` checks for SBV programs that return/take types that are user-defined.

Minimal complete definition

sName_, sName

#### Instances

Instances details

ExtractIO m => SExecutable m () Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: () -> SymbolicT m () Source # sName :: [String] -> () -> SymbolicT m () Source # safe :: () -> m [SafeResult] Source # safeWith :: SMTConfig -> () -> m [SafeResult] Source #
ExtractIO m => SExecutable m [SBV a] Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: [SBV a] -> SymbolicT m () Source # sName :: [String] -> [SBV a] -> SymbolicT m () Source # safe :: [SBV a] -> m [SafeResult] Source # safeWith :: SMTConfig -> [SBV a] -> m [SafeResult] Source #
ExtractIO m => SExecutable m (SBV a) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: SBV a -> SymbolicT m () Source # sName :: [String] -> SBV a -> SymbolicT m () Source # safe :: SBV a -> m [SafeResult] Source # safeWith :: SMTConfig -> SBV a -> m [SafeResult] Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, SymVal g, SExecutable m p) => SExecutable m ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

sName_ :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> SymbolicT m () Source #

sName :: [String] -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> SymbolicT m () Source #

safe :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m [SafeResult] Source #

safeWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m [SafeResult] Source #

(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, SExecutable m p) => SExecutable m ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

sName_ :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> SymbolicT m () Source #

sName :: [String] -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> SymbolicT m () Source #

safe :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m [SafeResult] Source #

safeWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m [SafeResult] Source #

(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SExecutable m p) => SExecutable m ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

sName_ :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> SymbolicT m () Source #

sName :: [String] -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> SymbolicT m () Source #

safe :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m [SafeResult] Source #

safeWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m [SafeResult] Source #

(SymVal a, SymVal b, SymVal c, SymVal d, SExecutable m p) => SExecutable m ((SBV a, SBV b, SBV c, SBV d) -> p) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: ((SBV a, SBV b, SBV c, SBV d) -> p) -> SymbolicT m () Source # sName :: [String] -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> SymbolicT m () Source # safe :: ((SBV a, SBV b, SBV c, SBV d) -> p) -> m [SafeResult] Source # safeWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> m [SafeResult] Source #
(SymVal a, SymVal b, SymVal c, SExecutable m p) => SExecutable m ((SBV a, SBV b, SBV c) -> p) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: ((SBV a, SBV b, SBV c) -> p) -> SymbolicT m () Source # sName :: [String] -> ((SBV a, SBV b, SBV c) -> p) -> SymbolicT m () Source # safe :: ((SBV a, SBV b, SBV c) -> p) -> m [SafeResult] Source # safeWith :: SMTConfig -> ((SBV a, SBV b, SBV c) -> p) -> m [SafeResult] Source #
(SymVal a, SymVal b, SExecutable m p) => SExecutable m ((SBV a, SBV b) -> p) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: ((SBV a, SBV b) -> p) -> SymbolicT m () Source # sName :: [String] -> ((SBV a, SBV b) -> p) -> SymbolicT m () Source # safe :: ((SBV a, SBV b) -> p) -> m [SafeResult] Source # safeWith :: SMTConfig -> ((SBV a, SBV b) -> p) -> m [SafeResult] Source #
(SymVal a, SExecutable m p) => SExecutable m (SBV a -> p) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: (SBV a -> p) -> SymbolicT m () Source # sName :: [String] -> (SBV a -> p) -> SymbolicT m () Source # safe :: (SBV a -> p) -> m [SafeResult] Source # safeWith :: SMTConfig -> (SBV a -> p) -> m [SafeResult] Source #
(ExtractIO m, NFData a, SymVal a, NFData b, SymVal b) => SExecutable m (SBV a, SBV b) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: (SBV a, SBV b) -> SymbolicT m () Source # sName :: [String] -> (SBV a, SBV b) -> SymbolicT m () Source # safe :: (SBV a, SBV b) -> m [SafeResult] Source # safeWith :: SMTConfig -> (SBV a, SBV b) -> m [SafeResult] Source #
(ExtractIO m, NFData a) => SExecutable m (SymbolicT m a) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: SymbolicT m a -> SymbolicT m () Source # sName :: [String] -> SymbolicT m a -> SymbolicT m () Source # safe :: SymbolicT m a -> m [SafeResult] Source # safeWith :: SMTConfig -> SymbolicT m a -> m [SafeResult] Source #
(ExtractIO m, NFData a, SymVal a, NFData b, SymVal b, NFData c, SymVal c) => SExecutable m (SBV a, SBV b, SBV c) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: (SBV a, SBV b, SBV c) -> SymbolicT m () Source # sName :: [String] -> (SBV a, SBV b, SBV c) -> SymbolicT m () Source # safe :: (SBV a, SBV b, SBV c) -> m [SafeResult] Source # safeWith :: SMTConfig -> (SBV a, SBV b, SBV c) -> m [SafeResult] Source #
(ExtractIO m, NFData a, SymVal a, NFData b, SymVal b, NFData c, SymVal c, NFData d, SymVal d) => SExecutable m (SBV a, SBV b, SBV c, SBV d) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: (SBV a, SBV b, SBV c, SBV d) -> SymbolicT m () Source # sName :: [String] -> (SBV a, SBV b, SBV c, SBV d) -> SymbolicT m () Source # safe :: (SBV a, SBV b, SBV c, SBV d) -> m [SafeResult] Source # safeWith :: SMTConfig -> (SBV a, SBV b, SBV c, SBV d) -> m [SafeResult] Source #
(ExtractIO m, NFData a, SymVal a, NFData b, SymVal b, NFData c, SymVal c, NFData d, SymVal d, NFData e, SymVal e) => SExecutable m (SBV a, SBV b, SBV c, SBV d, SBV e) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: (SBV a, SBV b, SBV c, SBV d, SBV e) -> SymbolicT m () Source # sName :: [String] -> (SBV a, SBV b, SBV c, SBV d, SBV e) -> SymbolicT m () Source # safe :: (SBV a, SBV b, SBV c, SBV d, SBV e) -> m [SafeResult] Source # safeWith :: SMTConfig -> (SBV a, SBV b, SBV c, SBV d, SBV e) -> m [SafeResult] Source #
(ExtractIO m, NFData a, SymVal a, NFData b, SymVal b, NFData c, SymVal c, NFData d, SymVal d, NFData e, SymVal e, NFData f, SymVal f) => SExecutable m (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

sName_ :: (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> SymbolicT m () Source #

sName :: [String] -> (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> SymbolicT m () Source #

safe :: (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> m [SafeResult] Source #

safeWith :: SMTConfig -> (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> m [SafeResult] Source #

(ExtractIO m, NFData a, SymVal a, NFData b, SymVal b, NFData c, SymVal c, NFData d, SymVal d, NFData e, SymVal e, NFData f, SymVal f, NFData g, SymVal g) => SExecutable m (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

sName_ :: (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> SymbolicT m () Source #

sName :: [String] -> (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> SymbolicT m () Source #

safe :: (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> m [SafeResult] Source #

safeWith :: SMTConfig -> (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> m [SafeResult] Source #

sName_ :: SExecutable IO a => a -> Symbolic () Source #

NB. For a version which generalizes over the underlying monad, see `sName_`

sName :: SExecutable IO a => [String] -> a -> Symbolic () Source #

NB. For a version which generalizes over the underlying monad, see `sName`

safe :: SExecutable IO a => a -> IO [SafeResult] Source #

Check safety using the default solver.

NB. For a version which generalizes over the underlying monad, see `safe`

safeWith :: SExecutable IO a => SMTConfig -> a -> IO [SafeResult] Source #

Check if any of the `sAssert` calls can be violated.

NB. For a version which generalizes over the underlying monad, see `safeWith`

# Quick-checking

sbvQuickCheck :: Symbolic SBool -> IO Bool Source #

Quick check an SBV property. Note that a regular `quickCheck` call will work just as well. Use this variant if you want to receive the boolean result.

# Optimization

SBV can optimize metric functions, i.e., those that generate both bounded `SIntN`, `SWordN`, and unbounded `SInteger` types, along with those produce `SReal`s. That is, it can find models satisfying all the constraints while minimizing or maximizing user given metrics. Currently, optimization requires the use of the z3 SMT solver as the backend, and a good review of these features is given in this paper: http://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/nbjorner-scss2014.pdf.

Goals can be lexicographically (default), independently, or pareto-front optimized. The relevant functions are:

- `minimize`: Minimize a given arithmetic goal
- `maximize`: Minimize a given arithmetic goal

Goals can be optimized at a regular or an extended value: An extended value is either positive or negative infinity (for unbounded integers and reals) or positive or negative epsilon differential from a real value (for reals).

For instance, a call of the form

     minimize "name-of-goal" $ x + 2*y

minimizes the arithmetic goal `x+2*y`, where `x` and `y` can be signed/unsigned bit-vectors, reals, or integers.

## A simple example

Here's an optimization example in action:

    >>> optimize Lexicographic $ \x y -> minimize "goal" (x+2*(y::SInteger))
    Optimal in an extension field:
      goal = -oo :: Integer

We will describe the role of the constructor `Lexicographic` shortly.

Of course, this becomes more useful when the result is not in an extension field:

    >>> :{
        optimize Lexicographic $ do
                      x <- sInteger "x"
                      y <- sInteger "y"
                      constrain $ x .> 0
                      constrain $ x .< 6
                      constrain $ y .> 2
                      constrain $ y .< 12
                      minimize "goal" $ x + 2 * y
        :}
    Optimal model:
      x    = 1 :: Integer
      y    = 3 :: Integer
      goal = 7 :: Integer

As usual, the programmatic API can be used to extract the values of objectives and model-values (`getModelObjectives`, `getModelAssignment`, etc.) to access these values and program with them further.

The following examples illustrate the use of basic optimization routines:

- Documentation.SBV.Examples.Optimization.LinearOpt: Simple linear-optimization example.
- Documentation.SBV.Examples.Optimization.Production: Scheduling machines in a shop
- Documentation.SBV.Examples.Optimization.VM: Scheduling virtual-machines in a data-center

## Multiple optimization goals

Multiple goals can be specified, using the same syntax. In this case, the user gets to pick what style of optimization to perform, by passing the relevant `OptimizeStyle` as the first argument to `optimize`.

- [`Lexicographic`]. The solver will optimize the goals in the given order, optimizing the latter ones under the model that optimizes the previous ones.
- [`Independent`]. The solver will optimize the goals independently of each other. In this case the user will be presented a model for each goal given.
- [`Pareto`]. Finally, the user can query for pareto-fronts. A pareto front is an model such that no goal can be made "better" without making some other goal "worse."

Pareto fronts only make sense when the objectives are bounded. If there are unbounded objective values, then the backend solver can loop infinitely. (This is what z3 does currently.) If you are not sure the objectives are bounded, you should first use `Independent` mode to ensure the objectives are bounded, and then switch to pareto-mode to extract them further.

The optional number argument to `Pareto` specifies the maximum number of pareto-fronts the user is asking to get. If `Nothing`, SBV will query for all pareto-fronts. Note that pareto-fronts can be really large, so if `Nothing` is used, there is a potential for waiting indefinitely for the SBV-solver interaction to finish. (If you suspect this might be the case, run in `verbose` mode to see the interaction and put a limiting factor appropriately.)

data OptimizeStyle Source #

Style of optimization. Note that in the pareto case the user is allowed to specify a max number of fronts to query the solver for, since there might potentially be an infinite number of them and there is no way to know exactly how many ahead of time. If `Nothing` is given, SBV will possibly loop forever if the number is really infinite.

Constructors

Lexicographic | Objectives are optimized in the order given, earlier objectives have higher priority.
Independent | Each objective is optimized independently.
Pareto (Maybe Int) | Objectives are optimized according to pareto front: That is, no objective can be made better without making some other worse.

#### Instances

Instances details

Eq OptimizeStyle Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods (==) :: OptimizeStyle -> OptimizeStyle -> Bool (/=) :: OptimizeStyle -> OptimizeStyle -> Bool
Show OptimizeStyle Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods showsPrec :: Int -> OptimizeStyle -> ShowS show :: OptimizeStyle -> String showList :: [OptimizeStyle] -> ShowS
NFData OptimizeStyle Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods rnf :: OptimizeStyle -> ()

## Objectives and Metrics

data Objective a Source #

Objective of optimization. We can minimize, maximize, or give a soft assertion with a penalty for not satisfying it.

Constructors

Minimize String a | Minimize this metric
Maximize String a | Maximize this metric
AssertWithPenalty String a Penalty | A soft assertion, with an associated penalty

#### Instances

Instances details

Functor Objective Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods fmap :: (a -> b) -> Objective a -> Objective b (<$) :: a -> Objective b -> Objective a
Show a => Show (Objective a) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods showsPrec :: Int -> Objective a -> ShowS show :: Objective a -> String showList :: [Objective a] -> ShowS
NFData a => NFData (Objective a) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods rnf :: Objective a -> ()

class Metric a where Source #

Class of metrics we can optimize for. Currently, booleans, bounded signed/unsigned bit-vectors, unbounded integers, algebraic reals and floats can be optimized. You can add your instances, but bewared that the `MetricSpace` should map your type to something the backend solver understands, which are limited to unsigned bit-vectors, reals, and unbounded integers for z3.

A good reference on these features is given in the following paper: http://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/nbjorner-scss2014.pdf.

Minimal completion: None. However, if `MetricSpace` is not identical to the type, you want to define `toMetricSpace` and possibly `minimize`/`maximize` to add extra constraints as necessary.

Minimal complete definition

Nothing

Associated Types

type MetricSpace a :: * Source #

The metric space we optimize the goal over. Usually the same as the type itself, but not always! For instance, signed bit-vectors are optimized over their unsigned counterparts, floats are optimized over their `Word32` comparable counterparts, etc.

type MetricSpace a = a Source #

Methods

toMetricSpace :: SBV a -> SBV (MetricSpace a) Source #

Compute the metric value to optimize.

default toMetricSpace :: a ~ MetricSpace a => SBV a -> SBV (MetricSpace a) Source #

fromMetricSpace :: SBV (MetricSpace a) -> SBV a Source #

Compute the value itself from the metric corresponding to it.

default fromMetricSpace :: a ~ MetricSpace a => SBV (MetricSpace a) -> SBV a Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV a -> m () Source #

Minimizing a metric space

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV a -> m () Source #

Maximizing a metric space

#### Instances

Instances details

Metric Bool Source # |

Instance details

Defined in Data.SBV.Core.Model

Associated Types

type MetricSpace Bool Source #

Methods

toMetricSpace :: SBV Bool -> SBV (MetricSpace Bool) Source #

fromMetricSpace :: SBV (MetricSpace Bool) -> SBV Bool Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV Bool -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV Bool -> m () Source #

Metric Double Source # | `Double` instance for `Metric` goes through the lexicographic ordering on `Word64`. It implicitly makes sure that the value is not `NaN`.

Instance details

Defined in Data.SBV.Core.Floating

Associated Types

type MetricSpace Double Source #

Methods

toMetricSpace :: SBV Double -> SBV (MetricSpace Double) Source #

fromMetricSpace :: SBV (MetricSpace Double) -> SBV Double Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV Double -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV Double -> m () Source #

Metric Float Source # | `Float` instance for `Metric` goes through the lexicographic ordering on `Word32`. It implicitly makes sure that the value is not `NaN`.

Instance details

Defined in Data.SBV.Core.Floating

Associated Types

type MetricSpace Float Source #

Methods

toMetricSpace :: SBV Float -> SBV (MetricSpace Float) Source #

fromMetricSpace :: SBV (MetricSpace Float) -> SBV Float Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV Float -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV Float -> m () Source #

Metric Int8 Source # |

Instance details

Defined in Data.SBV.Core.Model

Associated Types

type MetricSpace Int8 Source #

Methods

toMetricSpace :: SBV Int8 -> SBV (MetricSpace Int8) Source #

fromMetricSpace :: SBV (MetricSpace Int8) -> SBV Int8 Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV Int8 -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV Int8 -> m () Source #

Metric Int16 Source # |

Instance details

Defined in Data.SBV.Core.Model

Associated Types

type MetricSpace Int16 Source #

Methods

toMetricSpace :: SBV Int16 -> SBV (MetricSpace Int16) Source #

fromMetricSpace :: SBV (MetricSpace Int16) -> SBV Int16 Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV Int16 -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV Int16 -> m () Source #

Metric Int32 Source # |

Instance details

Defined in Data.SBV.Core.Model

Associated Types

type MetricSpace Int32 Source #

Methods

toMetricSpace :: SBV Int32 -> SBV (MetricSpace Int32) Source #

fromMetricSpace :: SBV (MetricSpace Int32) -> SBV Int32 Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV Int32 -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV Int32 -> m () Source #

Metric Int64 Source # |

Instance details

Defined in Data.SBV.Core.Model

Associated Types

type MetricSpace Int64 Source #

Methods

toMetricSpace :: SBV Int64 -> SBV (MetricSpace Int64) Source #

fromMetricSpace :: SBV (MetricSpace Int64) -> SBV Int64 Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV Int64 -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV Int64 -> m () Source #

Metric Integer Source # |

Instance details

Defined in Data.SBV.Core.Model

Associated Types

type MetricSpace Integer Source #

Methods

toMetricSpace :: SBV Integer -> SBV (MetricSpace Integer) Source #

fromMetricSpace :: SBV (MetricSpace Integer) -> SBV Integer Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV Integer -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV Integer -> m () Source #

Metric Word8 Source # |

Instance details

Defined in Data.SBV.Core.Model

Associated Types

type MetricSpace Word8 Source #

Methods

toMetricSpace :: SBV Word8 -> SBV (MetricSpace Word8) Source #

fromMetricSpace :: SBV (MetricSpace Word8) -> SBV Word8 Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV Word8 -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV Word8 -> m () Source #

Metric Word16 Source # |

Instance details

Defined in Data.SBV.Core.Model

Associated Types

type MetricSpace Word16 Source #

Methods

toMetricSpace :: SBV Word16 -> SBV (MetricSpace Word16) Source #

fromMetricSpace :: SBV (MetricSpace Word16) -> SBV Word16 Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV Word16 -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV Word16 -> m () Source #

Metric Word32 Source # |

Instance details

Defined in Data.SBV.Core.Model

Associated Types

type MetricSpace Word32 Source #

Methods

toMetricSpace :: SBV Word32 -> SBV (MetricSpace Word32) Source #

fromMetricSpace :: SBV (MetricSpace Word32) -> SBV Word32 Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV Word32 -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV Word32 -> m () Source #

Metric Word64 Source # |

Instance details

Defined in Data.SBV.Core.Model

Associated Types

type MetricSpace Word64 Source #

Methods

toMetricSpace :: SBV Word64 -> SBV (MetricSpace Word64) Source #

fromMetricSpace :: SBV (MetricSpace Word64) -> SBV Word64 Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV Word64 -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV Word64 -> m () Source #

Metric AlgReal Source # |

Instance details

Defined in Data.SBV.Core.Model

Associated Types

type MetricSpace AlgReal Source #

Methods

toMetricSpace :: SBV AlgReal -> SBV (MetricSpace AlgReal) Source #

fromMetricSpace :: SBV (MetricSpace AlgReal) -> SBV AlgReal Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV AlgReal -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV AlgReal -> m () Source #

Metric Day Source # | Make day an optimizable value, by mapping it to `Word8` in the most obvious way. We can map it to any value the underlying solver can optimize, but `Word8` is the simplest and it'll fit the bill.

Instance details

Defined in Documentation.SBV.Examples.Optimization.Enumerate

Associated Types

type MetricSpace Day Source #

Methods

toMetricSpace :: SBV Day -> SBV (MetricSpace Day) Source #

fromMetricSpace :: SBV (MetricSpace Day) -> SBV Day Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV Day -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV Day -> m () Source #

(KnownNat n, IsNonZero n) => Metric (IntN n) Source # | Optimizing `IntN`

Instance details

Defined in Data.SBV.Core.Sized

Associated Types

type MetricSpace (IntN n) Source #

Methods

toMetricSpace :: SBV (IntN n) -> SBV (MetricSpace (IntN n)) Source #

fromMetricSpace :: SBV (MetricSpace (IntN n)) -> SBV (IntN n) Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV (IntN n) -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV (IntN n) -> m () Source #

(KnownNat n, IsNonZero n) => Metric (WordN n) Source # | Optimizing `WordN`

Instance details

Defined in Data.SBV.Core.Sized

Associated Types

type MetricSpace (WordN n) Source #

Methods

toMetricSpace :: SBV (WordN n) -> SBV (MetricSpace (WordN n)) Source #

fromMetricSpace :: SBV (MetricSpace (WordN n)) -> SBV (WordN n) Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV (WordN n) -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV (WordN n) -> m () Source #

(SymVal a, Metric a, SymVal b, Metric b) => Metric (a, b) Source # |

Instance details

Defined in Data.SBV.Tuple

Associated Types

type MetricSpace (a, b) Source #

Methods

toMetricSpace :: SBV (a, b) -> SBV (MetricSpace (a, b)) Source #

fromMetricSpace :: SBV (MetricSpace (a, b)) -> SBV (a, b) Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b) -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b) -> m () Source #

(SymVal a, Metric a, SymVal b, Metric b, SymVal c, Metric c) => Metric (a, b, c) Source # |

Instance details

Defined in Data.SBV.Tuple

Associated Types

type MetricSpace (a, b, c) Source #

Methods

toMetricSpace :: SBV (a, b, c) -> SBV (MetricSpace (a, b, c)) Source #

fromMetricSpace :: SBV (MetricSpace (a, b, c)) -> SBV (a, b, c) Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b, c) -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b, c) -> m () Source #

(SymVal a, Metric a, SymVal b, Metric b, SymVal c, Metric c, SymVal d, Metric d) => Metric (a, b, c, d) Source # |

Instance details

Defined in Data.SBV.Tuple

Associated Types

type MetricSpace (a, b, c, d) Source #

Methods

toMetricSpace :: SBV (a, b, c, d) -> SBV (MetricSpace (a, b, c, d)) Source #

fromMetricSpace :: SBV (MetricSpace (a, b, c, d)) -> SBV (a, b, c, d) Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b, c, d) -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b, c, d) -> m () Source #

(SymVal a, Metric a, SymVal b, Metric b, SymVal c, Metric c, SymVal d, Metric d, SymVal e, Metric e) => Metric (a, b, c, d, e) Source # |

Instance details

Defined in Data.SBV.Tuple

Associated Types

type MetricSpace (a, b, c, d, e) Source #

Methods

toMetricSpace :: SBV (a, b, c, d, e) -> SBV (MetricSpace (a, b, c, d, e)) Source #

fromMetricSpace :: SBV (MetricSpace (a, b, c, d, e)) -> SBV (a, b, c, d, e) Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b, c, d, e) -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b, c, d, e) -> m () Source #

(SymVal a, Metric a, SymVal b, Metric b, SymVal c, Metric c, SymVal d, Metric d, SymVal e, Metric e, SymVal f, Metric f) => Metric (a, b, c, d, e, f) Source # |

Instance details

Defined in Data.SBV.Tuple

Associated Types

type MetricSpace (a, b, c, d, e, f) Source #

Methods

toMetricSpace :: SBV (a, b, c, d, e, f) -> SBV (MetricSpace (a, b, c, d, e, f)) Source #

fromMetricSpace :: SBV (MetricSpace (a, b, c, d, e, f)) -> SBV (a, b, c, d, e, f) Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b, c, d, e, f) -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b, c, d, e, f) -> m () Source #

(SymVal a, Metric a, SymVal b, Metric b, SymVal c, Metric c, SymVal d, Metric d, SymVal e, Metric e, SymVal f, Metric f, SymVal g, Metric g) => Metric (a, b, c, d, e, f, g) Source # |

Instance details

Defined in Data.SBV.Tuple

Associated Types

type MetricSpace (a, b, c, d, e, f, g) Source #

Methods

toMetricSpace :: SBV (a, b, c, d, e, f, g) -> SBV (MetricSpace (a, b, c, d, e, f, g)) Source #

fromMetricSpace :: SBV (MetricSpace (a, b, c, d, e, f, g)) -> SBV (a, b, c, d, e, f, g) Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b, c, d, e, f, g) -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b, c, d, e, f, g) -> m () Source #

(SymVal a, Metric a, SymVal b, Metric b, SymVal c, Metric c, SymVal d, Metric d, SymVal e, Metric e, SymVal f, Metric f, SymVal g, Metric g, SymVal h, Metric h) => Metric (a, b, c, d, e, f, g, h) Source # |

Instance details

Defined in Data.SBV.Tuple

Associated Types

type MetricSpace (a, b, c, d, e, f, g, h) Source #

Methods

toMetricSpace :: SBV (a, b, c, d, e, f, g, h) -> SBV (MetricSpace (a, b, c, d, e, f, g, h)) Source #

fromMetricSpace :: SBV (MetricSpace (a, b, c, d, e, f, g, h)) -> SBV (a, b, c, d, e, f, g, h) Source #

msMinimize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b, c, d, e, f, g, h) -> m () Source #

msMaximize :: (MonadSymbolic m, SolverContext m) => String -> SBV (a, b, c, d, e, f, g, h) -> m () Source #

minimize :: Metric a => String -> SBV a -> Symbolic () Source #

Minimize a named metric

NB. For a version which generalizes over the underlying monad, see `minimize`

maximize :: Metric a => String -> SBV a -> Symbolic () Source #

Maximize a named metric

NB. For a version which generalizes over the underlying monad, see `maximize`

## Soft assertions

Related to optimization, SBV implements soft-asserts via `assertWithPenalty` calls. A soft assertion is a hint to the SMT solver that we would like a particular condition to hold if **possible*. That is, if there is a solution satisfying it, then we would like it to hold, but it can be violated if there is no way to satisfy it. Each soft-assertion can be associated with a numeric penalty for not satisfying it, hence turning it into an optimization problem.

Note that `assertWithPenalty` works well with optimization goals (`minimize`/`maximize` etc.), and are most useful when we are optimizing a metric and thus some of the constraints can be relaxed with a penalty to obtain a good solution. Again see http://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/nbjorner-scss2014.pdf for a good overview of the features in Z3 that SBV is providing the bridge for.

A soft assertion can be specified in one of the following three main ways:

             assertWithPenalty "bounded_x" (x .< 5) DefaultPenalty
             assertWithPenalty "bounded_x" (x .< 5) (Penalty 2.3 Nothing)
             assertWithPenalty "bounded_x" (x .< 5) (Penalty 4.7 (Just "group-1"))

In the first form, we are saying that the constraint `x .< 5` must be satisfied, if possible, but if this constraint can not be satisfied to find a model, it can be violated with the default penalty of 1.

In the second case, we are associating a penalty value of `2.3`.

Finally in the third case, we are also associating this constraint with a group. The group name is only needed if we have classes of soft-constraints that should be considered together.

assertWithPenalty :: String -> SBool -> Penalty -> Symbolic () Source #

Introduce a soft assertion, with an optional penalty

NB. For a version which generalizes over the underlying monad, see `assertWithPenalty`

data Penalty Source #

Penalty for a soft-assertion. The default penalty is `1`, with all soft-assertions belonging to the same objective goal. A positive weight and an optional group can be provided by using the `Penalty` constructor.

Constructors

DefaultPenalty | Default: Penalty of `1` and no group attached
Penalty Rational (Maybe String) | Penalty with a weight and an optional group

#### Instances

Instances details

Show Penalty Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods showsPrec :: Int -> Penalty -> ShowS show :: Penalty -> String showList :: [Penalty] -> ShowS
NFData Penalty Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods rnf :: Penalty -> ()

## Field extensions

If an optimization results in an infinity/epsilon value, the returned `CV` value will be in the corresponding extension field.

data ExtCV Source #

A simple expression type over extendent values, covering infinity, epsilon and intervals.

Constructors

Infinite Kind |
Epsilon Kind |
Interval ExtCV ExtCV |
BoundedCV CV |
AddExtCV ExtCV ExtCV |
MulExtCV ExtCV ExtCV |

#### Instances

Instances details

Show ExtCV Source # | Show instance, shows with the kind
Instance details Defined in Data.SBV.Core.Concrete Methods showsPrec :: Int -> ExtCV -> ShowS show :: ExtCV -> String showList :: [ExtCV] -> ShowS
HasKind ExtCV Source # | Kind instance for Extended CV

Instance details

Defined in Data.SBV.Core.Concrete

Methods

kindOf :: ExtCV -> Kind Source #

hasSign :: ExtCV -> Bool Source #

intSizeOf :: ExtCV -> Int Source #

isBoolean :: ExtCV -> Bool Source #

isBounded :: ExtCV -> Bool Source #

isReal :: ExtCV -> Bool Source #

isFloat :: ExtCV -> Bool Source #

isDouble :: ExtCV -> Bool Source #

isUnbounded :: ExtCV -> Bool Source #

isUninterpreted :: ExtCV -> Bool Source #

isChar :: ExtCV -> Bool Source #

isString :: ExtCV -> Bool Source #

isList :: ExtCV -> Bool Source #

isSet :: ExtCV -> Bool Source #

isTuple :: ExtCV -> Bool Source #

isMaybe :: ExtCV -> Bool Source #

isEither :: ExtCV -> Bool Source #

showType :: ExtCV -> String Source #

data GeneralizedCV Source #

A generalized CV allows for expressions involving infinite and epsilon values/intervals Used in optimization problems.

Constructors

ExtendedCV ExtCV |
RegularCV CV |

#### Instances

Instances details

Show GeneralizedCV Source # | Show instance for Generalized `CV`
Instance details Defined in Data.SBV.Core.Concrete Methods showsPrec :: Int -> GeneralizedCV -> ShowS show :: GeneralizedCV -> String showList :: [GeneralizedCV] -> ShowS
NFData GeneralizedCV |
Instance details Defined in Data.SBV.Core.Symbolic Methods rnf :: GeneralizedCV -> ()
HasKind GeneralizedCV Source # | `Kind` instance for generalized CV

Instance details

Defined in Data.SBV.Core.Concrete

Methods

kindOf :: GeneralizedCV -> Kind Source #

hasSign :: GeneralizedCV -> Bool Source #

intSizeOf :: GeneralizedCV -> Int Source #

isBoolean :: GeneralizedCV -> Bool Source #

isBounded :: GeneralizedCV -> Bool Source #

isReal :: GeneralizedCV -> Bool Source #

isFloat :: GeneralizedCV -> Bool Source #

isDouble :: GeneralizedCV -> Bool Source #

isUnbounded :: GeneralizedCV -> Bool Source #

isUninterpreted :: GeneralizedCV -> Bool Source #

isChar :: GeneralizedCV -> Bool Source #

isString :: GeneralizedCV -> Bool Source #

isList :: GeneralizedCV -> Bool Source #

isSet :: GeneralizedCV -> Bool Source #

isTuple :: GeneralizedCV -> Bool Source #

isMaybe :: GeneralizedCV -> Bool Source #

isEither :: GeneralizedCV -> Bool Source #

showType :: GeneralizedCV -> String Source #

# Model extraction

The default `Show` instances for prover calls provide all the counter-example information in a human-readable form and should be sufficient for most casual uses of sbv. However, tools built on top of sbv will inevitably need to look into the constructed models more deeply, programmatically extracting their results and performing actions based on them. The API provided in this section aims at simplifying this task.

## Inspecting proof results

`ThmResult`, `SatResult`, and `AllSatResult` are simple newtype wrappers over `SMTResult`. Their main purpose is so that we can provide custom `Show` instances to print results accordingly.

newtype ThmResult Source #

A `prove` call results in a `ThmResult`

Constructors

ThmResult SMTResult |

#### Instances

Instances details

Show ThmResult Source # |
Instance details Defined in Data.SBV.SMT.SMT Methods showsPrec :: Int -> ThmResult -> ShowS show :: ThmResult -> String showList :: [ThmResult] -> ShowS
NFData ThmResult Source # |
Instance details Defined in Data.SBV.SMT.SMT Methods rnf :: ThmResult -> ()
Modelable ThmResult Source # | `ThmResult` as a generic model provider

Instance details

Defined in Data.SBV.SMT.SMT

Methods

modelExists :: ThmResult -> Bool Source #

getModelAssignment :: SatModel b => ThmResult -> Either String (Bool, b) Source #

getModelDictionary :: ThmResult -> Map String CV Source #

getModelValue :: SymVal b => String -> ThmResult -> Maybe b Source #

getModelUninterpretedValue :: String -> ThmResult -> Maybe String Source #

extractModel :: SatModel b => ThmResult -> Maybe b Source #

getModelObjectives :: ThmResult -> Map String GeneralizedCV Source #

getModelObjectiveValue :: String -> ThmResult -> Maybe GeneralizedCV Source #

getModelUIFuns :: ThmResult -> Map String (SBVType, ([([CV], CV)], CV)) Source #

getModelUIFunValue :: String -> ThmResult -> Maybe (SBVType, ([([CV], CV)], CV)) Source #

newtype SatResult Source #

A `sat` call results in a `SatResult` The reason for having a separate `SatResult` is to have a more meaningful `Show` instance.

Constructors

SatResult SMTResult |

#### Instances

Instances details

Show SatResult Source # |
Instance details Defined in Data.SBV.SMT.SMT Methods showsPrec :: Int -> SatResult -> ShowS show :: SatResult -> String showList :: [SatResult] -> ShowS
NFData SatResult Source # |
Instance details Defined in Data.SBV.SMT.SMT Methods rnf :: SatResult -> ()
Modelable SatResult Source # | `SatResult` as a generic model provider

Instance details

Defined in Data.SBV.SMT.SMT

Methods

modelExists :: SatResult -> Bool Source #

getModelAssignment :: SatModel b => SatResult -> Either String (Bool, b) Source #

getModelDictionary :: SatResult -> Map String CV Source #

getModelValue :: SymVal b => String -> SatResult -> Maybe b Source #

getModelUninterpretedValue :: String -> SatResult -> Maybe String Source #

extractModel :: SatModel b => SatResult -> Maybe b Source #

getModelObjectives :: SatResult -> Map String GeneralizedCV Source #

getModelObjectiveValue :: String -> SatResult -> Maybe GeneralizedCV Source #

getModelUIFuns :: SatResult -> Map String (SBVType, ([([CV], CV)], CV)) Source #

getModelUIFunValue :: String -> SatResult -> Maybe (SBVType, ([([CV], CV)], CV)) Source #

newtype AllSatResult Source #

An `allSat` call results in a `AllSatResult`. The first boolean says whether we hit the max-model limit as we searched. The second boolean says whether there were prefix-existentials. The third boolean says whether we stopped because the solver returned `Unknown`.

Constructors

AllSatResult (Bool, Bool, Bool, [SMTResult]) |

#### Instances

Instances details

Show AllSatResult Source # |
Instance details Defined in Data.SBV.SMT.SMT Methods showsPrec :: Int -> AllSatResult -> ShowS show :: AllSatResult -> String showList :: [AllSatResult] -> ShowS

newtype SafeResult Source #

A `safe` call results in a `SafeResult`

Constructors

SafeResult (Maybe String, String, SMTResult) |

#### Instances

Instances details

Show SafeResult Source # |
Instance details Defined in Data.SBV.SMT.SMT Methods showsPrec :: Int -> SafeResult -> ShowS show :: SafeResult -> String showList :: [SafeResult] -> ShowS

data OptimizeResult Source #

An `optimize` call results in a `OptimizeResult`. In the `ParetoResult` case, the boolean is `True` if we reached pareto-query limit and so there might be more unqueried results remaining. If `False`, it means that we have all the pareto fronts returned. See the `Pareto` `OptimizeStyle` for details.

Constructors

LexicographicResult SMTResult |
ParetoResult (Bool, [SMTResult]) |
IndependentResult [(String, SMTResult)] |

#### Instances

Instances details

Show OptimizeResult Source # |
Instance details Defined in Data.SBV.SMT.SMT Methods showsPrec :: Int -> OptimizeResult -> ShowS show :: OptimizeResult -> String showList :: [OptimizeResult] -> ShowS

data SMTResult Source #

The result of an SMT solver call. Each constructor is tagged with the `SMTConfig` that created it so that further tools can inspect it and build layers of results, if needed. For ordinary uses of the library, this type should not be needed, instead use the accessor functions on it. (Custom Show instances and model extractors.)

Constructors

Unsatisfiable SMTConfig (Maybe [String]) | Unsatisfiable. If unsat-cores are enabled, they will be returned in the second parameter.
Satisfiable SMTConfig SMTModel | Satisfiable with model
SatExtField SMTConfig SMTModel | Prover returned a model, but in an extension field containing Infinite/epsilon
Unknown SMTConfig SMTReasonUnknown | Prover returned unknown, with the given reason
ProofError SMTConfig [String] (Maybe SMTResult) | Prover errored out, with possibly a bogus result

#### Instances

Instances details

NFData SMTResult Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods rnf :: SMTResult -> ()
Modelable SMTResult Source # | `SMTResult` as a generic model provider

Instance details

Defined in Data.SBV.SMT.SMT

Methods

modelExists :: SMTResult -> Bool Source #

getModelAssignment :: SatModel b => SMTResult -> Either String (Bool, b) Source #

getModelDictionary :: SMTResult -> Map String CV Source #

getModelValue :: SymVal b => String -> SMTResult -> Maybe b Source #

getModelUninterpretedValue :: String -> SMTResult -> Maybe String Source #

extractModel :: SatModel b => SMTResult -> Maybe b Source #

getModelObjectives :: SMTResult -> Map String GeneralizedCV Source #

getModelObjectiveValue :: String -> SMTResult -> Maybe GeneralizedCV Source #

getModelUIFuns :: SMTResult -> Map String (SBVType, ([([CV], CV)], CV)) Source #

getModelUIFunValue :: String -> SMTResult -> Maybe (SBVType, ([([CV], CV)], CV)) Source #

data SMTReasonUnknown Source #

Reason for reporting unknown.

Constructors

UnknownMemOut |
UnknownIncomplete |
UnknownTimeOut |
UnknownOther String |

#### Instances

Instances details

Show SMTReasonUnknown Source # | Show instance for unknown
Instance details Defined in Data.SBV.Control.Types Methods showsPrec :: Int -> SMTReasonUnknown -> ShowS show :: SMTReasonUnknown -> String showList :: [SMTReasonUnknown] -> ShowS
Generic SMTReasonUnknown Source # |
Instance details Defined in Data.SBV.Control.Types Associated Types type Rep SMTReasonUnknown :: Type -> Type Methods from :: SMTReasonUnknown -> Rep SMTReasonUnknown x to :: Rep SMTReasonUnknown x -> SMTReasonUnknown
NFData SMTReasonUnknown Source # |
Instance details Defined in Data.SBV.Control.Types Methods rnf :: SMTReasonUnknown -> ()
type Rep SMTReasonUnknown Source # |

Instance details

Defined in Data.SBV.Control.Types

type Rep SMTReasonUnknown = D1 ('MetaData "SMTReasonUnknown" "Data.SBV.Control.Types" "sbv-8.7-9mSEXJN8olRBwPWTmi3EMV" 'False) ((C1 ('MetaCons "UnknownMemOut" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "UnknownIncomplete" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "UnknownTimeOut" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "UnknownOther" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String))))

## Observing expressions

The `observe` command can be used to trace values of arbitrary expressions during a `sat`, `prove`, or perhaps more importantly, in a `quickCheck` call with the `sObserve` variant.. This is useful for, for instance, recording expected vs. obtained expressions as a symbolic program is executing.

    >>> :{
    prove $ do a1 <- free "i1"
               a2 <- free "i2"
               let spec, res :: SWord8
                   spec = a1 + a2
                   res  = ite (a1 .== 12 .&& a2 .== 22)   -- insert a malicious bug!
                              1
                              (a1 + a2)
               return $ observe "Expected" spec .== observe "Result" res
    :}
    Falsifiable. Counter-example:
      Expected = 34 :: Word8
      Result   =  1 :: Word8
      i1       = 12 :: Word8
      i2       = 22 :: Word8

The `observeIf` variant allows the user to specify a boolean condition when the value is interesting to observe. Useful when you have lots of "debugging" points, but not all are of interest. Use the `sObserve` variant when you are at the `Symbolic` monad, which also supports quick-check applications.

observe :: SymVal a => String -> SBV a -> SBV a Source #

Observe the value of an expression, uncoditionally. See `observeIf` for a generalized version.

observeIf :: SymVal a => (a -> Bool) -> String -> SBV a -> SBV a Source #

Observe the value of an expression, if the given condition holds. Such values are useful in model construction, as they are printed part of a satisfying model, or a counter-example. The same works for quick-check as well. Useful when we want to see intermediate values, or expected/obtained pairs in a particular run. Note that an observed expression is always symbolic, i.e., it won't be constant folded. Compare this to `label` which is used for putting a label in the generated SMTLib-C code.

sObserve :: SymVal a => String -> SBV a -> Symbolic () Source #

A variant of observe that you can use at the top-level. This is useful with quick-check, for instance.

## Programmable model extraction

While default `Show` instances are sufficient for most use cases, it is sometimes desirable (especially for library construction) that the SMT-models are reinterpreted in terms of domain types. Programmable extraction allows getting arbitrarily typed models out of SMT models.

class SatModel a where Source #

Instances of `SatModel` can be automatically extracted from models returned by the solvers. The idea is that the sbv infrastructure provides a stream of CV's (constant values) coming from the solver, and the type `a` is interpreted based on these constants. Many typical instances are already provided, so new instances can be declared with relative ease.

Minimum complete definition: `parseCVs`

Minimal complete definition

Nothing

Methods

parseCVs :: [CV] -> Maybe (a, [CV]) Source #

Given a sequence of constant-words, extract one instance of the type `a`, returning the remaining elements untouched. If the next element is not what's expected for this type you should return `Nothing`

default parseCVs :: Read a => [CV] -> Maybe (a, [CV]) Source #

cvtModel :: (a -> Maybe b) -> Maybe (a, [CV]) -> Maybe (b, [CV]) Source #

Given a parsed model instance, transform it using `f`, and return the result. The default definition for this method should be sufficient in most use cases.

#### Instances

Instances details

SatModel Bool Source # | `Bool` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (Bool, [CV]) Source # cvtModel :: (Bool -> Maybe b) -> Maybe (Bool, [CV]) -> Maybe (b, [CV]) Source #
SatModel Double Source # | `Double` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (Double, [CV]) Source # cvtModel :: (Double -> Maybe b) -> Maybe (Double, [CV]) -> Maybe (b, [CV]) Source #
SatModel Float Source # | `Float` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (Float, [CV]) Source # cvtModel :: (Float -> Maybe b) -> Maybe (Float, [CV]) -> Maybe (b, [CV]) Source #
SatModel Int8 Source # | `Int8` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (Int8, [CV]) Source # cvtModel :: (Int8 -> Maybe b) -> Maybe (Int8, [CV]) -> Maybe (b, [CV]) Source #
SatModel Int16 Source # | `Int16` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (Int16, [CV]) Source # cvtModel :: (Int16 -> Maybe b) -> Maybe (Int16, [CV]) -> Maybe (b, [CV]) Source #
SatModel Int32 Source # | `Int32` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (Int32, [CV]) Source # cvtModel :: (Int32 -> Maybe b) -> Maybe (Int32, [CV]) -> Maybe (b, [CV]) Source #
SatModel Int64 Source # | `Int64` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (Int64, [CV]) Source # cvtModel :: (Int64 -> Maybe b) -> Maybe (Int64, [CV]) -> Maybe (b, [CV]) Source #
SatModel Integer Source # | `Integer` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (Integer, [CV]) Source # cvtModel :: (Integer -> Maybe b) -> Maybe (Integer, [CV]) -> Maybe (b, [CV]) Source #
SatModel Word8 Source # | `Word8` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (Word8, [CV]) Source # cvtModel :: (Word8 -> Maybe b) -> Maybe (Word8, [CV]) -> Maybe (b, [CV]) Source #
SatModel Word16 Source # | `Word16` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (Word16, [CV]) Source # cvtModel :: (Word16 -> Maybe b) -> Maybe (Word16, [CV]) -> Maybe (b, [CV]) Source #
SatModel Word32 Source # | `Word32` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (Word32, [CV]) Source # cvtModel :: (Word32 -> Maybe b) -> Maybe (Word32, [CV]) -> Maybe (b, [CV]) Source #
SatModel Word64 Source # | `Word64` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (Word64, [CV]) Source # cvtModel :: (Word64 -> Maybe b) -> Maybe (Word64, [CV]) -> Maybe (b, [CV]) Source #
SatModel () Source # | Base case for `SatModel` at unit type. Comes in handy if there are no real variables.
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe ((), [CV]) Source # cvtModel :: (() -> Maybe b) -> Maybe ((), [CV]) -> Maybe (b, [CV]) Source #
SatModel AlgReal Source # | `AlgReal` as extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (AlgReal, [CV]) Source # cvtModel :: (AlgReal -> Maybe b) -> Maybe (AlgReal, [CV]) -> Maybe (b, [CV]) Source #
SatModel CV Source # | `CV` as extracted from a model; trivial definition
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (CV, [CV]) Source # cvtModel :: (CV -> Maybe b) -> Maybe (CV, [CV]) -> Maybe (b, [CV]) Source #
SatModel RoundingMode Source # | A rounding mode, extracted from a model. (Default definition suffices)
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe (RoundingMode, [CV]) Source # cvtModel :: (RoundingMode -> Maybe b) -> Maybe (RoundingMode, [CV]) -> Maybe (b, [CV]) Source #
SatModel State Source # | Make `State` a symbolic enumeration
Instance details Defined in Documentation.SBV.Examples.Lists.BoundedMutex Methods parseCVs :: [CV] -> Maybe (State, [CV]) Source # cvtModel :: (State -> Maybe b) -> Maybe (State, [CV]) -> Maybe (b, [CV]) Source #
SatModel E Source # | Make `E` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Misc.Enumerate Methods parseCVs :: [CV] -> Maybe (E, [CV]) Source # cvtModel :: (E -> Maybe b) -> Maybe (E, [CV]) -> Maybe (b, [CV]) Source #
SatModel Day Source # | Make `Day` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Optimization.Enumerate Methods parseCVs :: [CV] -> Maybe (Day, [CV]) Source # cvtModel :: (Day -> Maybe b) -> Maybe (Day, [CV]) -> Maybe (b, [CV]) Source #
SatModel Color Source # | Make `Color` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Puzzles.Fish Methods parseCVs :: [CV] -> Maybe (Color, [CV]) Source # cvtModel :: (Color -> Maybe b) -> Maybe (Color, [CV]) -> Maybe (b, [CV]) Source #
SatModel Nationality Source # | Make `Nationality` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Puzzles.Fish Methods parseCVs :: [CV] -> Maybe (Nationality, [CV]) Source # cvtModel :: (Nationality -> Maybe b) -> Maybe (Nationality, [CV]) -> Maybe (b, [CV]) Source #
SatModel Beverage Source # | Make `Beverage` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Puzzles.Fish Methods parseCVs :: [CV] -> Maybe (Beverage, [CV]) Source # cvtModel :: (Beverage -> Maybe b) -> Maybe (Beverage, [CV]) -> Maybe (b, [CV]) Source #
SatModel Pet Source # | Make `Pet` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Puzzles.Fish Methods parseCVs :: [CV] -> Maybe (Pet, [CV]) Source # cvtModel :: (Pet -> Maybe b) -> Maybe (Pet, [CV]) -> Maybe (b, [CV]) Source #
SatModel Sport Source # | Make `Sport` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Puzzles.Fish Methods parseCVs :: [CV] -> Maybe (Sport, [CV]) Source # cvtModel :: (Sport -> Maybe b) -> Maybe (Sport, [CV]) -> Maybe (b, [CV]) Source #
SatModel Color Source # | Make `Color` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Puzzles.Garden Methods parseCVs :: [CV] -> Maybe (Color, [CV]) Source # cvtModel :: (Color -> Maybe b) -> Maybe (Color, [CV]) -> Maybe (b, [CV]) Source #
SatModel Color Source # | Make `Color` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Puzzles.HexPuzzle Methods parseCVs :: [CV] -> Maybe (Color, [CV]) Source # cvtModel :: (Color -> Maybe b) -> Maybe (Color, [CV]) -> Maybe (b, [CV]) Source #
SatModel U2Member Source # | Make `U2Member` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Puzzles.U2Bridge Methods parseCVs :: [CV] -> Maybe (U2Member, [CV]) Source # cvtModel :: (U2Member -> Maybe b) -> Maybe (U2Member, [CV]) -> Maybe (b, [CV]) Source #
SatModel Location Source # | Make `Location` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Puzzles.U2Bridge Methods parseCVs :: [CV] -> Maybe (Location, [CV]) Source # cvtModel :: (Location -> Maybe b) -> Maybe (Location, [CV]) -> Maybe (b, [CV]) Source #
SatModel Day Source # | Make `Day` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Queries.Enums Methods parseCVs :: [CV] -> Maybe (Day, [CV]) Source # cvtModel :: (Day -> Maybe b) -> Maybe (Day, [CV]) -> Maybe (b, [CV]) Source #
SatModel BinOp Source # | Make `BinOp` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Queries.FourFours Methods parseCVs :: [CV] -> Maybe (BinOp, [CV]) Source # cvtModel :: (BinOp -> Maybe b) -> Maybe (BinOp, [CV]) -> Maybe (b, [CV]) Source #
SatModel UnOp Source # | Make `UnOp` a symbolic value.
Instance details Defined in Documentation.SBV.Examples.Queries.FourFours Methods parseCVs :: [CV] -> Maybe (UnOp, [CV]) Source # cvtModel :: (UnOp -> Maybe b) -> Maybe (UnOp, [CV]) -> Maybe (b, [CV]) Source #
SatModel a => SatModel [a] Source # | A list of values as extracted from a model. When reading a list, we go as long as we can (maximal-munch). Note that this never fails, as we can always return the empty list!
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe ([a], [CV]) Source # cvtModel :: ([a] -> Maybe b) -> Maybe ([a], [CV]) -> Maybe (b, [CV]) Source #
(KnownNat n, IsNonZero n) => SatModel (IntN n) Source # | Constructing models for `IntN`
Instance details Defined in Data.SBV.Core.Sized Methods parseCVs :: [CV] -> Maybe (IntN n, [CV]) Source # cvtModel :: (IntN n -> Maybe b) -> Maybe (IntN n, [CV]) -> Maybe (b, [CV]) Source #
(KnownNat n, IsNonZero n) => SatModel (WordN n) Source # | Constructing models for `WordN`
Instance details Defined in Data.SBV.Core.Sized Methods parseCVs :: [CV] -> Maybe (WordN n, [CV]) Source # cvtModel :: (WordN n -> Maybe b) -> Maybe (WordN n, [CV]) -> Maybe (b, [CV]) Source #
(SatModel a, SatModel b) => SatModel (a, b) Source # | Tuples extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe ((a, b), [CV]) Source # cvtModel :: ((a, b) -> Maybe b0) -> Maybe ((a, b), [CV]) -> Maybe (b0, [CV]) Source #
(SatModel a, SatModel b, SatModel c) => SatModel (a, b, c) Source # | 3-Tuples extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe ((a, b, c), [CV]) Source # cvtModel :: ((a, b, c) -> Maybe b0) -> Maybe ((a, b, c), [CV]) -> Maybe (b0, [CV]) Source #
(SatModel a, SatModel b, SatModel c, SatModel d) => SatModel (a, b, c, d) Source # | 4-Tuples extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe ((a, b, c, d), [CV]) Source # cvtModel :: ((a, b, c, d) -> Maybe b0) -> Maybe ((a, b, c, d), [CV]) -> Maybe (b0, [CV]) Source #
(SatModel a, SatModel b, SatModel c, SatModel d, SatModel e) => SatModel (a, b, c, d, e) Source # | 5-Tuples extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe ((a, b, c, d, e), [CV]) Source # cvtModel :: ((a, b, c, d, e) -> Maybe b0) -> Maybe ((a, b, c, d, e), [CV]) -> Maybe (b0, [CV]) Source #
(SatModel a, SatModel b, SatModel c, SatModel d, SatModel e, SatModel f) => SatModel (a, b, c, d, e, f) Source # | 6-Tuples extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe ((a, b, c, d, e, f), [CV]) Source # cvtModel :: ((a, b, c, d, e, f) -> Maybe b0) -> Maybe ((a, b, c, d, e, f), [CV]) -> Maybe (b0, [CV]) Source #
(SatModel a, SatModel b, SatModel c, SatModel d, SatModel e, SatModel f, SatModel g) => SatModel (a, b, c, d, e, f, g) Source # | 7-Tuples extracted from a model
Instance details Defined in Data.SBV.SMT.SMT Methods parseCVs :: [CV] -> Maybe ((a, b, c, d, e, f, g), [CV]) Source # cvtModel :: ((a, b, c, d, e, f, g) -> Maybe b0) -> Maybe ((a, b, c, d, e, f, g), [CV]) -> Maybe (b0, [CV]) Source #

class Modelable a where Source #

Various SMT results that we can extract models out of.

Minimal complete definition

modelExists, getModelAssignment, getModelDictionary, getModelObjectives, getModelUIFuns

Methods

modelExists :: a -> Bool Source #

Is there a model?

getModelAssignment :: SatModel b => a -> Either String (Bool, b) Source #

Extract assignments of a model, the result is a tuple where the first argument (if True) indicates whether the model was "probable". (i.e., if the solver returned unknown.)

getModelDictionary :: a -> Map String CV Source #

Extract a model dictionary. Extract a dictionary mapping the variables to their respective values as returned by the SMT solver. Also see `getModelDictionaries`.

getModelValue :: SymVal b => String -> a -> Maybe b Source #

Extract a model value for a given element. Also see `getModelValues`.

getModelUninterpretedValue :: String -> a -> Maybe String Source #

Extract a representative name for the model value of an uninterpreted kind. This is supposed to correspond to the value as computed internally by the SMT solver; and is unportable from solver to solver. Also see `getModelUninterpretedValues`.

extractModel :: SatModel b => a -> Maybe b Source #

A simpler variant of `getModelAssignment` to get a model out without the fuss.

getModelObjectives :: a -> Map String GeneralizedCV Source #

Extract model objective values, for all optimization goals.

getModelObjectiveValue :: String -> a -> Maybe GeneralizedCV Source #

Extract the value of an objective

getModelUIFuns :: a -> Map String (SBVType, ([([CV], CV)], CV)) Source #

Extract model uninterpreted-functions

getModelUIFunValue :: String -> a -> Maybe (SBVType, ([([CV], CV)], CV)) Source #

Extract the value of an uninterpreted-function as an association list

#### Instances

Instances details

Modelable SMTResult Source # | `SMTResult` as a generic model provider

Instance details

Defined in Data.SBV.SMT.SMT

Methods

modelExists :: SMTResult -> Bool Source #

getModelAssignment :: SatModel b => SMTResult -> Either String (Bool, b) Source #

getModelDictionary :: SMTResult -> Map String CV Source #

getModelValue :: SymVal b => String -> SMTResult -> Maybe b Source #

getModelUninterpretedValue :: String -> SMTResult -> Maybe String Source #

extractModel :: SatModel b => SMTResult -> Maybe b Source #

getModelObjectives :: SMTResult -> Map String GeneralizedCV Source #

getModelObjectiveValue :: String -> SMTResult -> Maybe GeneralizedCV Source #

getModelUIFuns :: SMTResult -> Map String (SBVType, ([([CV], CV)], CV)) Source #

getModelUIFunValue :: String -> SMTResult -> Maybe (SBVType, ([([CV], CV)], CV)) Source #

Modelable SatResult Source # | `SatResult` as a generic model provider

Instance details

Defined in Data.SBV.SMT.SMT

Methods

modelExists :: SatResult -> Bool Source #

getModelAssignment :: SatModel b => SatResult -> Either String (Bool, b) Source #

getModelDictionary :: SatResult -> Map String CV Source #

getModelValue :: SymVal b => String -> SatResult -> Maybe b Source #

getModelUninterpretedValue :: String -> SatResult -> Maybe String Source #

extractModel :: SatModel b => SatResult -> Maybe b Source #

getModelObjectives :: SatResult -> Map String GeneralizedCV Source #

getModelObjectiveValue :: String -> SatResult -> Maybe GeneralizedCV Source #

getModelUIFuns :: SatResult -> Map String (SBVType, ([([CV], CV)], CV)) Source #

getModelUIFunValue :: String -> SatResult -> Maybe (SBVType, ([([CV], CV)], CV)) Source #

Modelable ThmResult Source # | `ThmResult` as a generic model provider

Instance details

Defined in Data.SBV.SMT.SMT

Methods

modelExists :: ThmResult -> Bool Source #

getModelAssignment :: SatModel b => ThmResult -> Either String (Bool, b) Source #

getModelDictionary :: ThmResult -> Map String CV Source #

getModelValue :: SymVal b => String -> ThmResult -> Maybe b Source #

getModelUninterpretedValue :: String -> ThmResult -> Maybe String Source #

extractModel :: SatModel b => ThmResult -> Maybe b Source #

getModelObjectives :: ThmResult -> Map String GeneralizedCV Source #

getModelObjectiveValue :: String -> ThmResult -> Maybe GeneralizedCV Source #

getModelUIFuns :: ThmResult -> Map String (SBVType, ([([CV], CV)], CV)) Source #

getModelUIFunValue :: String -> ThmResult -> Maybe (SBVType, ([([CV], CV)], CV)) Source #

displayModels :: SatModel a => ([(Bool, a)] -> [(Bool, a)]) -> (Int -> (Bool, a) -> IO ()) -> AllSatResult -> IO Int Source #

Given an `allSat` call, we typically want to iterate over it and print the results in sequence. The `displayModels` function automates this task by calling `disp` on each result, consecutively. The first `Int` argument to `disp` 'is the current model number. The second argument is a tuple, where the first element indicates whether the model is alleged (i.e., if the solver is not sure, returing Unknown). The arrange argument can sort the results in any way you like, if necessary.

extractModels :: SatModel a => AllSatResult -> [a] Source #

Return all the models from an `allSat` call, similar to `extractModel` but is suitable for the case of multiple results.

getModelDictionaries :: AllSatResult -> [Map String CV] Source #

Get dictionaries from an all-sat call. Similar to `getModelDictionary`.

getModelValues :: SymVal b => String -> AllSatResult -> [Maybe b] Source #

Extract value of a variable from an all-sat call. Similar to `getModelValue`.

getModelUninterpretedValues :: String -> AllSatResult -> [Maybe String] Source #

Extract value of an uninterpreted variable from an all-sat call. Similar to `getModelUninterpretedValue`.

# SMT Interface

data SMTConfig Source #

Solver configuration. See also `z3`, `yices`, `cvc4`, `boolector`, `mathSAT`, etc. which are instantiations of this type for those solvers, with reasonable defaults. In particular, custom configuration can be created by varying those values. (Such as `z3{verbose=True}`.)

Most fields are self explanatory. The notion of precision for printing algebraic reals stems from the fact that such values does not necessarily have finite decimal representations, and hence we have to stop printing at some depth. It is important to emphasize that such values always have infinite precision internally. The issue is merely with how we print such an infinite precision value on the screen. The field `printRealPrec` controls the printing precision, by specifying the number of digits after the decimal point. The default value is 16, but it can be set to any positive integer.

When printing, SBV will add the suffix `...` at the and of a real-value, if the given bound is not sufficient to represent the real-value exactly. Otherwise, the number will be written out in standard decimal notation. Note that SBV will always print the whole value if it is precise (i.e., if it fits in a finite number of digits), regardless of the precision limit. The limit only applies if the representation of the real value is not finite, i.e., if it is not rational.

The `printBase` field can be used to print numbers in base 2, 10, or 16. If base 2 or 16 is used, then floating-point values will be printed in their internal memory-layout format as well, which can come in handy for bit-precise analysis.

Constructors

SMTConfig |

Fields

- verbose :: Bool

  Debug mode

- timing :: Timing

  Print timing information on how long different phases took (construction, solving, etc.)

- printBase :: Int

  Print integral literals in this base (2, 10, and 16 are supported.)

- printRealPrec :: Int

  Print algebraic real values with this precision. (SReal, default: 16)

- satCmd :: String

  Usually "(check-sat)". However, users might tweak it based on solver characteristics.

- allSatMaxModelCount :: Maybe Int

  In a `allSat` call, return at most this many models. If nothing, return all.

- allSatPrintAlong :: Bool

  In a `allSat` call, print models as they are found.

- satTrackUFs :: Bool

  In a `sat` call, should we try to extract values of uninterpreted functions?

- isNonModelVar :: String -> Bool

  When constructing a model, ignore variables whose name satisfy this predicate. (Default: (const False), i.e., don't ignore anything)

- validateModel :: Bool

  If set, SBV will attempt to validate the model it gets back from the solver.

- optimizeValidateConstraints :: Bool

  Validate optimization results. NB: Does NOT make sure the model is optimal, just checks they satisfy the constraints.

- transcript :: Maybe FilePath

  If Just, the entire interaction will be recorded as a playable file (for debugging purposes mostly)

- smtLibVersion :: SMTLibVersion

  What version of SMT-lib we use for the tool

- solver :: SMTSolver

  The actual SMT solver.

- allowQuantifiedQueries :: Bool

  Should we permit use of quantifiers in the query mode? (Default: False. See http://github.com/LeventErkok/sbv/issues/459 for why.)

- roundingMode :: RoundingMode

  Rounding mode to use for floating-point conversions

- solverSetOptions :: [SMTOption]

  Options to set as we start the solver

- ignoreExitCode :: Bool

  If true, we shall ignore the exit code upon exit. Otherwise we require ExitSuccess.

- redirectVerbose :: Maybe FilePath

  Redirect the verbose output to this file if given. If Nothing, stdout is implied.

#### Instances

Instances details

NFData SMTConfig Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods rnf :: SMTConfig -> ()

data Timing Source #

Specify how to save timing information, if at all.

Constructors

NoTiming |
PrintTiming |
SaveTiming (IORef NominalDiffTime) |

data SMTLibVersion Source #

Representation of SMTLib Program versions. As of June 2015, we're dropping support for SMTLib1, and supporting SMTLib2 only. We keep this data-type around in case SMTLib3 comes along and we want to support 2 and 3 simultaneously.

Constructors

SMTLib2 |

#### Instances

Instances details

Bounded SMTLibVersion Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods minBound :: SMTLibVersion maxBound :: SMTLibVersion
Enum SMTLibVersion Source # |

Instance details

Defined in Data.SBV.Core.Symbolic

Methods

succ :: SMTLibVersion -> SMTLibVersion

pred :: SMTLibVersion -> SMTLibVersion

toEnum :: Int -> SMTLibVersion

fromEnum :: SMTLibVersion -> Int

enumFrom :: SMTLibVersion -> [SMTLibVersion]

enumFromThen :: SMTLibVersion -> SMTLibVersion -> [SMTLibVersion]

enumFromTo :: SMTLibVersion -> SMTLibVersion -> [SMTLibVersion]

enumFromThenTo :: SMTLibVersion -> SMTLibVersion -> SMTLibVersion -> [SMTLibVersion]

Eq SMTLibVersion Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods (==) :: SMTLibVersion -> SMTLibVersion -> Bool (/=) :: SMTLibVersion -> SMTLibVersion -> Bool
Show SMTLibVersion Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods showsPrec :: Int -> SMTLibVersion -> ShowS show :: SMTLibVersion -> String showList :: [SMTLibVersion] -> ShowS
NFData SMTLibVersion Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods rnf :: SMTLibVersion -> ()

data Solver Source #

Solvers that SBV is aware of

Constructors

Z3 |
Yices |
Boolector |
CVC4 |
MathSAT |
ABC |

#### Instances

Instances details

Bounded Solver Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods minBound :: Solver maxBound :: Solver
Enum Solver Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods succ :: Solver -> Solver pred :: Solver -> Solver toEnum :: Int -> Solver fromEnum :: Solver -> Int enumFrom :: Solver -> [Solver] enumFromThen :: Solver -> Solver -> [Solver] enumFromTo :: Solver -> Solver -> [Solver] enumFromThenTo :: Solver -> Solver -> Solver -> [Solver]
Show Solver Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods showsPrec :: Int -> Solver -> ShowS show :: Solver -> String showList :: [Solver] -> ShowS

data SMTSolver Source #

An SMT solver

Constructors

SMTSolver |

Fields

- name :: Solver

  The solver in use

- executable :: String

  The path to its executable

- preprocess :: String -> String

  Each line sent to the solver will be passed through this function (typically id)

- options :: SMTConfig -> [String]

  Options to provide to the solver

- engine :: SMTEngine

  The solver engine, responsible for interpreting solver output

- capabilities :: SolverCapabilities

  Various capabilities of the solver

## Controlling verbosity

SBV provides various levels of verbosity to aid in debugging, by using the `SMTConfig` fields:

- [`verbose`] Print on stdout a shortened account of what is sent/received. This is specifically trimmed to reduce noise and is good for quick debugging. The output is not supposed to be machine-readable.
- [`redirectVerbose`] Send the verbose output to a file. Note that you still have to set `verbose=True` for redirection to take effect. Otherwise, the output is the same as what you would see in `verbose`.
- [`transcript`] Produce a file that is valid SMTLib2 format, containing everything sent and received. In particular, one can directly feed this file to the SMT-solver outside of the SBV since it is machine-readable. This is good for offline analysis situations, where you want to have a full account of what happened. For instance, it will print time-stamps at every interaction point, so you can see how long each command took.

## Solvers

boolector :: SMTConfig Source #

Default configuration for the Boolector SMT solver

cvc4 :: SMTConfig Source #

Default configuration for the CVC4 SMT Solver.

yices :: SMTConfig Source #

Default configuration for the Yices SMT Solver.

z3 :: SMTConfig Source #

Default configuration for the Z3 SMT solver

mathSAT :: SMTConfig Source #

Default configuration for the MathSAT SMT solver

abc :: SMTConfig Source #

Default configuration for the ABC synthesis and verification tool.

## Configurations

defaultSolverConfig :: Solver -> SMTConfig Source #

The default configs corresponding to supported SMT solvers

defaultSMTCfg :: SMTConfig Source #

The default solver used by SBV. This is currently set to z3.

sbvCheckSolverInstallation :: SMTConfig -> IO Bool Source #

Check whether the given solver is installed and is ready to go. This call does a simple call to the solver to ensure all is well.

sbvAvailableSolvers :: IO [SMTConfig] Source #

Return the known available solver configs, installed on your machine.

setLogic :: SolverContext m => Logic -> m () Source #

Set the logic.

data Logic Source #

SMT-Lib logics. If left unspecified SBV will pick the logic based on what it determines is needed. However, the user can override this choice using a call to `setLogic` This is especially handy if one is experimenting with custom logics that might be supported on new solvers. See http://smtlib.cs.uiowa.edu/logics.shtml for the official list.

Constructors

AUFLIA | Formulas over the theory of linear integer arithmetic and arrays extended with free sort and function symbols but restricted to arrays with integer indices and values.
AUFLIRA | Linear formulas with free sort and function symbols over one- and two-dimentional arrays of integer index and real value.
AUFNIRA | Formulas with free function and predicate symbols over a theory of arrays of arrays of integer index and real value.
LRA | Linear formulas in linear real arithmetic.
QF_ABV | Quantifier-free formulas over the theory of bitvectors and bitvector arrays.
QF_AUFBV | Quantifier-free formulas over the theory of bitvectors and bitvector arrays extended with free sort and function symbols.
QF_AUFLIA | Quantifier-free linear formulas over the theory of integer arrays extended with free sort and function symbols.
QF_AX | Quantifier-free formulas over the theory of arrays with extensionality.
QF_BV | Quantifier-free formulas over the theory of fixed-size bitvectors.
QF_IDL | Difference Logic over the integers. Boolean combinations of inequations of the form x - y < b where x and y are integer variables and b is an integer constant.
QF_LIA | Unquantified linear integer arithmetic. In essence, Boolean combinations of inequations between linear polynomials over integer variables.
QF_LRA | Unquantified linear real arithmetic. In essence, Boolean combinations of inequations between linear polynomials over real variables.
QF_NIA | Quantifier-free integer arithmetic.
QF_NRA | Quantifier-free real arithmetic.
QF_RDL | Difference Logic over the reals. In essence, Boolean combinations of inequations of the form x - y < b where x and y are real variables and b is a rational constant.
QF_UF | Unquantified formulas built over a signature of uninterpreted (i.e., free) sort and function symbols.
QF_UFBV | Unquantified formulas over bitvectors with uninterpreted sort function and symbols.
QF_UFIDL | Difference Logic over the integers (in essence) but with uninterpreted sort and function symbols.
QF_UFLIA | Unquantified linear integer arithmetic with uninterpreted sort and function symbols.
QF_UFLRA | Unquantified linear real arithmetic with uninterpreted sort and function symbols.
QF_UFNRA | Unquantified non-linear real arithmetic with uninterpreted sort and function symbols.
QF_UFNIRA | Unquantified non-linear real integer arithmetic with uninterpreted sort and function symbols.
UFLRA | Linear real arithmetic with uninterpreted sort and function symbols.
UFNIA | Non-linear integer arithmetic with uninterpreted sort and function symbols.
QF_FPBV | Quantifier-free formulas over the theory of floating point numbers, arrays, and bit-vectors.
QF_FP | Quantifier-free formulas over the theory of floating point numbers.
QF_FD | Quantifier-free finite domains.
QF_S | Quantifier-free formulas over the theory of strings.
Logic_ALL | The catch-all value.
Logic_NONE | Use this value when you want SBV to simply not set the logic.
CustomLogic String | In case you need a really custom string!

#### Instances

Instances details

Show Logic Source # |
Instance details Defined in Data.SBV.Control.Types Methods showsPrec :: Int -> Logic -> ShowS show :: Logic -> String showList :: [Logic] -> ShowS
Generic Logic Source # |
Instance details Defined in Data.SBV.Control.Types Associated Types type Rep Logic :: Type -> Type Methods from :: Logic -> Rep Logic x to :: Rep Logic x -> Logic
GShow Logic Source # |
Instance details Defined in Data.SBV.Control.Types Methods gshowsPrec :: Int -> Logic -> ShowS Source # gshows :: Logic -> ShowS Source # gshow :: Logic -> String Source # gshowList :: [Logic] -> ShowS Source #
NFData Logic Source # |
Instance details Defined in Data.SBV.Control.Types Methods rnf :: Logic -> ()
type Rep Logic Source # |

Instance details

Defined in Data.SBV.Control.Types

type Rep Logic = D1 ('MetaData "Logic" "Data.SBV.Control.Types" "sbv-8.7-9mSEXJN8olRBwPWTmi3EMV" 'False) ((((C1 ('MetaCons "AUFLIA" 'PrefixI 'False) (U1 :: Type -> Type) :+: (C1 ('MetaCons "AUFLIRA" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "AUFNIRA" 'PrefixI 'False) (U1 :: Type -> Type))) :+: ((C1 ('MetaCons "LRA" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "QF_ABV" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "QF_AUFBV" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "QF_AUFLIA" 'PrefixI 'False) (U1 :: Type -> Type)))) :+: (((C1 ('MetaCons "QF_AX" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "QF_BV" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "QF_IDL" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "QF_LIA" 'PrefixI 'False) (U1 :: Type -> Type))) :+: ((C1 ('MetaCons "QF_LRA" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "QF_NIA" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "QF_NRA" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "QF_RDL" 'PrefixI 'False) (U1 :: Type -> Type))))) :+: ((((C1 ('MetaCons "QF_UF" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "QF_UFBV" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "QF_UFIDL" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "QF_UFLIA" 'PrefixI 'False) (U1 :: Type -> Type))) :+: ((C1 ('MetaCons "QF_UFLRA" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "QF_UFNRA" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "QF_UFNIRA" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "UFLRA" 'PrefixI 'False) (U1 :: Type -> Type)))) :+: (((C1 ('MetaCons "UFNIA" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "QF_FPBV" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "QF_FP" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "QF_FD" 'PrefixI 'False) (U1 :: Type -> Type))) :+: ((C1 ('MetaCons "QF_S" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Logic_ALL" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "Logic_NONE" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "CustomLogic" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String)))))))

setOption :: SolverContext m => SMTOption -> m () Source #

Set an option.

setInfo :: SolverContext m => String -> [String] -> m () Source #

Set info. Example: `setInfo ":status" ["unsat"]`.

setTimeOut :: SolverContext m => Integer -> m () Source #

Set a solver time-out value, in milli-seconds. This function essentially translates to the SMTLib call `(set-info :timeout val)`, and your backend solver may or may not support it! The amount given is in milliseconds. Also see the function `timeOut` for finer level control of time-outs, directly from SBV.

## SBV exceptions

data SBVException Source #

An exception thrown from SBV. If the solver ever responds with a non-success value for a command, SBV will throw an `SBVException`, it so the user can process it as required. The provided `Show` instance will render the failure nicely. Note that if you ever catch this exception, the solver is no longer alive: You should either -- throw the exception up, or do other proper clean-up before continuing.

Constructors

SBVException |

Fields

- sbvExceptionDescription :: String
- sbvExceptionSent :: Maybe String
- sbvExceptionExpected :: Maybe String
- sbvExceptionReceived :: Maybe String
- sbvExceptionStdOut :: Maybe String
- sbvExceptionStdErr :: Maybe String
- sbvExceptionExitCode :: Maybe ExitCode
- sbvExceptionConfig :: SMTConfig
- sbvExceptionReason :: Maybe [String]
- sbvExceptionHint :: Maybe [String]

#### Instances

Instances details

Show SBVException Source # | A fairly nice rendering of the exception, for display purposes.
Instance details Defined in Data.SBV.SMT.Utils Methods showsPrec :: Int -> SBVException -> ShowS show :: SBVException -> String showList :: [SBVException] -> ShowS
Exception SBVException Source # | SBVExceptions are throwable. A simple "show" will render this exception nicely though of course you can inspect the individual fields as necessary.
Instance details Defined in Data.SBV.SMT.Utils Methods toException :: SBVException -> SomeException fromException :: SomeException -> Maybe SBVException displayException :: SBVException -> String

# Abstract SBV type

data SBV a Source #

The Symbolic value. The parameter `a` is phantom, but is extremely important in keeping the user interface strongly typed.

#### Instances

Instances details

IsString SString |
Instance details Defined in Data.SBV.Core.Model Methods fromString :: String -> SString
Testable SBool Source # |
Instance details Defined in Data.SBV.Core.Model Methods property :: SBool -> Property Source # propertyForAllShrinkShow :: Gen a -> (a -> [a]) -> (a -> [String]) -> (a -> SBool) -> Property Source #
SDivisible SInteger Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SInteger -> SInteger -> (SInteger, SInteger) Source # sDivMod :: SInteger -> SInteger -> (SInteger, SInteger) Source # sQuot :: SInteger -> SInteger -> SInteger Source # sRem :: SInteger -> SInteger -> SInteger Source # sDiv :: SInteger -> SInteger -> SInteger Source # sMod :: SInteger -> SInteger -> SInteger Source #
SDivisible SInt64 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SInt64 -> SInt64 -> (SInt64, SInt64) Source # sDivMod :: SInt64 -> SInt64 -> (SInt64, SInt64) Source # sQuot :: SInt64 -> SInt64 -> SInt64 Source # sRem :: SInt64 -> SInt64 -> SInt64 Source # sDiv :: SInt64 -> SInt64 -> SInt64 Source # sMod :: SInt64 -> SInt64 -> SInt64 Source #
SDivisible SInt32 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SInt32 -> SInt32 -> (SInt32, SInt32) Source # sDivMod :: SInt32 -> SInt32 -> (SInt32, SInt32) Source # sQuot :: SInt32 -> SInt32 -> SInt32 Source # sRem :: SInt32 -> SInt32 -> SInt32 Source # sDiv :: SInt32 -> SInt32 -> SInt32 Source # sMod :: SInt32 -> SInt32 -> SInt32 Source #
SDivisible SInt16 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SInt16 -> SInt16 -> (SInt16, SInt16) Source # sDivMod :: SInt16 -> SInt16 -> (SInt16, SInt16) Source # sQuot :: SInt16 -> SInt16 -> SInt16 Source # sRem :: SInt16 -> SInt16 -> SInt16 Source # sDiv :: SInt16 -> SInt16 -> SInt16 Source # sMod :: SInt16 -> SInt16 -> SInt16 Source #
SDivisible SInt8 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SInt8 -> SInt8 -> (SInt8, SInt8) Source # sDivMod :: SInt8 -> SInt8 -> (SInt8, SInt8) Source # sQuot :: SInt8 -> SInt8 -> SInt8 Source # sRem :: SInt8 -> SInt8 -> SInt8 Source # sDiv :: SInt8 -> SInt8 -> SInt8 Source # sMod :: SInt8 -> SInt8 -> SInt8 Source #
SDivisible SWord64 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SWord64 -> SWord64 -> (SWord64, SWord64) Source # sDivMod :: SWord64 -> SWord64 -> (SWord64, SWord64) Source # sQuot :: SWord64 -> SWord64 -> SWord64 Source # sRem :: SWord64 -> SWord64 -> SWord64 Source # sDiv :: SWord64 -> SWord64 -> SWord64 Source # sMod :: SWord64 -> SWord64 -> SWord64 Source #
SDivisible SWord32 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SWord32 -> SWord32 -> (SWord32, SWord32) Source # sDivMod :: SWord32 -> SWord32 -> (SWord32, SWord32) Source # sQuot :: SWord32 -> SWord32 -> SWord32 Source # sRem :: SWord32 -> SWord32 -> SWord32 Source # sDiv :: SWord32 -> SWord32 -> SWord32 Source # sMod :: SWord32 -> SWord32 -> SWord32 Source #
SDivisible SWord16 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SWord16 -> SWord16 -> (SWord16, SWord16) Source # sDivMod :: SWord16 -> SWord16 -> (SWord16, SWord16) Source # sQuot :: SWord16 -> SWord16 -> SWord16 Source # sRem :: SWord16 -> SWord16 -> SWord16 Source # sDiv :: SWord16 -> SWord16 -> SWord16 Source # sMod :: SWord16 -> SWord16 -> SWord16 Source #
SDivisible SWord8 Source # |
Instance details Defined in Data.SBV.Core.Model Methods sQuotRem :: SWord8 -> SWord8 -> (SWord8, SWord8) Source # sDivMod :: SWord8 -> SWord8 -> (SWord8, SWord8) Source # sQuot :: SWord8 -> SWord8 -> SWord8 Source # sRem :: SWord8 -> SWord8 -> SWord8 Source # sDiv :: SWord8 -> SWord8 -> SWord8 Source # sMod :: SWord8 -> SWord8 -> SWord8 Source #
ArithOverflow SInt64 Source # |
Instance details Defined in Data.SBV.Tools.Overflow Methods bvAddO :: SInt64 -> SInt64 -> (SBool, SBool) Source # bvSubO :: SInt64 -> SInt64 -> (SBool, SBool) Source # bvMulO :: SInt64 -> SInt64 -> (SBool, SBool) Source # bvMulOFast :: SInt64 -> SInt64 -> (SBool, SBool) Source # bvDivO :: SInt64 -> SInt64 -> (SBool, SBool) Source # bvNegO :: SInt64 -> (SBool, SBool) Source #
ArithOverflow SInt32 Source # |
Instance details Defined in Data.SBV.Tools.Overflow Methods bvAddO :: SInt32 -> SInt32 -> (SBool, SBool) Source # bvSubO :: SInt32 -> SInt32 -> (SBool, SBool) Source # bvMulO :: SInt32 -> SInt32 -> (SBool, SBool) Source # bvMulOFast :: SInt32 -> SInt32 -> (SBool, SBool) Source # bvDivO :: SInt32 -> SInt32 -> (SBool, SBool) Source # bvNegO :: SInt32 -> (SBool, SBool) Source #
ArithOverflow SInt16 Source # |
Instance details Defined in Data.SBV.Tools.Overflow Methods bvAddO :: SInt16 -> SInt16 -> (SBool, SBool) Source # bvSubO :: SInt16 -> SInt16 -> (SBool, SBool) Source # bvMulO :: SInt16 -> SInt16 -> (SBool, SBool) Source # bvMulOFast :: SInt16 -> SInt16 -> (SBool, SBool) Source # bvDivO :: SInt16 -> SInt16 -> (SBool, SBool) Source # bvNegO :: SInt16 -> (SBool, SBool) Source #
ArithOverflow SInt8 Source # |
Instance details Defined in Data.SBV.Tools.Overflow Methods bvAddO :: SInt8 -> SInt8 -> (SBool, SBool) Source # bvSubO :: SInt8 -> SInt8 -> (SBool, SBool) Source # bvMulO :: SInt8 -> SInt8 -> (SBool, SBool) Source # bvMulOFast :: SInt8 -> SInt8 -> (SBool, SBool) Source # bvDivO :: SInt8 -> SInt8 -> (SBool, SBool) Source # bvNegO :: SInt8 -> (SBool, SBool) Source #
ArithOverflow SWord64 Source # |
Instance details Defined in Data.SBV.Tools.Overflow Methods bvAddO :: SWord64 -> SWord64 -> (SBool, SBool) Source # bvSubO :: SWord64 -> SWord64 -> (SBool, SBool) Source # bvMulO :: SWord64 -> SWord64 -> (SBool, SBool) Source # bvMulOFast :: SWord64 -> SWord64 -> (SBool, SBool) Source # bvDivO :: SWord64 -> SWord64 -> (SBool, SBool) Source # bvNegO :: SWord64 -> (SBool, SBool) Source #
ArithOverflow SWord32 Source # |
Instance details Defined in Data.SBV.Tools.Overflow Methods bvAddO :: SWord32 -> SWord32 -> (SBool, SBool) Source # bvSubO :: SWord32 -> SWord32 -> (SBool, SBool) Source # bvMulO :: SWord32 -> SWord32 -> (SBool, SBool) Source # bvMulOFast :: SWord32 -> SWord32 -> (SBool, SBool) Source # bvDivO :: SWord32 -> SWord32 -> (SBool, SBool) Source # bvNegO :: SWord32 -> (SBool, SBool) Source #
ArithOverflow SWord16 Source # |
Instance details Defined in Data.SBV.Tools.Overflow Methods bvAddO :: SWord16 -> SWord16 -> (SBool, SBool) Source # bvSubO :: SWord16 -> SWord16 -> (SBool, SBool) Source # bvMulO :: SWord16 -> SWord16 -> (SBool, SBool) Source # bvMulOFast :: SWord16 -> SWord16 -> (SBool, SBool) Source # bvDivO :: SWord16 -> SWord16 -> (SBool, SBool) Source # bvNegO :: SWord16 -> (SBool, SBool) Source #
ArithOverflow SWord8 Source # |
Instance details Defined in Data.SBV.Tools.Overflow Methods bvAddO :: SWord8 -> SWord8 -> (SBool, SBool) Source # bvSubO :: SWord8 -> SWord8 -> (SBool, SBool) Source # bvMulO :: SWord8 -> SWord8 -> (SBool, SBool) Source # bvMulOFast :: SWord8 -> SWord8 -> (SBool, SBool) Source # bvDivO :: SWord8 -> SWord8 -> (SBool, SBool) Source # bvNegO :: SWord8 -> (SBool, SBool) Source #
Polynomial SWord64 Source # |

Instance details

Defined in Data.SBV.Tools.Polynomial

Methods

polynomial :: [Int] -> SWord64 Source #

pAdd :: SWord64 -> SWord64 -> SWord64 Source #

pMult :: (SWord64, SWord64, [Int]) -> SWord64 Source #

pDiv :: SWord64 -> SWord64 -> SWord64 Source #

pMod :: SWord64 -> SWord64 -> SWord64 Source #

pDivMod :: SWord64 -> SWord64 -> (SWord64, SWord64) Source #

showPoly :: SWord64 -> String Source #

showPolynomial :: Bool -> SWord64 -> String Source #

Polynomial SWord32 Source # |

Instance details

Defined in Data.SBV.Tools.Polynomial

Methods

polynomial :: [Int] -> SWord32 Source #

pAdd :: SWord32 -> SWord32 -> SWord32 Source #

pMult :: (SWord32, SWord32, [Int]) -> SWord32 Source #

pDiv :: SWord32 -> SWord32 -> SWord32 Source #

pMod :: SWord32 -> SWord32 -> SWord32 Source #

pDivMod :: SWord32 -> SWord32 -> (SWord32, SWord32) Source #

showPoly :: SWord32 -> String Source #

showPolynomial :: Bool -> SWord32 -> String Source #

Polynomial SWord16 Source # |

Instance details

Defined in Data.SBV.Tools.Polynomial

Methods

polynomial :: [Int] -> SWord16 Source #

pAdd :: SWord16 -> SWord16 -> SWord16 Source #

pMult :: (SWord16, SWord16, [Int]) -> SWord16 Source #

pDiv :: SWord16 -> SWord16 -> SWord16 Source #

pMod :: SWord16 -> SWord16 -> SWord16 Source #

pDivMod :: SWord16 -> SWord16 -> (SWord16, SWord16) Source #

showPoly :: SWord16 -> String Source #

showPolynomial :: Bool -> SWord16 -> String Source #

Polynomial SWord8 Source # |

Instance details

Defined in Data.SBV.Tools.Polynomial

Methods

polynomial :: [Int] -> SWord8 Source #

pAdd :: SWord8 -> SWord8 -> SWord8 Source #

pMult :: (SWord8, SWord8, [Int]) -> SWord8 Source #

pDiv :: SWord8 -> SWord8 -> SWord8 Source #

pMod :: SWord8 -> SWord8 -> SWord8 Source #

pDivMod :: SWord8 -> SWord8 -> (SWord8, SWord8) Source #

showPoly :: SWord8 -> String Source #

showPolynomial :: Bool -> SWord8 -> String Source #

RegExpMatchable SString Source # | Matching symbolic strings.
Instance details Defined in Data.SBV.RegExp Methods match :: SString -> RegExp -> SBool Source #
RegExpMatchable SChar Source # | Matching a character simply means the singleton string matches the regex.
Instance details Defined in Data.SBV.RegExp Methods match :: SChar -> RegExp -> SBool Source #
ExtractIO m => MProvable m SBool Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

forAll_ :: SBool -> SymbolicT m SBool Source #

forAll :: [String] -> SBool -> SymbolicT m SBool Source #

forSome_ :: SBool -> SymbolicT m SBool Source #

forSome :: [String] -> SBool -> SymbolicT m SBool Source #

prove :: SBool -> m ThmResult Source #

proveWith :: SMTConfig -> SBool -> m ThmResult Source #

sat :: SBool -> m SatResult Source #

satWith :: SMTConfig -> SBool -> m SatResult Source #

allSat :: SBool -> m AllSatResult Source #

allSatWith :: SMTConfig -> SBool -> m AllSatResult Source #

optimize :: OptimizeStyle -> SBool -> m OptimizeResult Source #

optimizeWith :: SMTConfig -> OptimizeStyle -> SBool -> m OptimizeResult Source #

isVacuous :: SBool -> m Bool Source #

isVacuousWith :: SMTConfig -> SBool -> m Bool Source #

isTheorem :: SBool -> m Bool Source #

isTheoremWith :: SMTConfig -> SBool -> m Bool Source #

isSatisfiable :: SBool -> m Bool Source #

isSatisfiableWith :: SMTConfig -> SBool -> m Bool Source #

validate :: Bool -> SMTConfig -> SBool -> SMTResult -> m SMTResult Source #

Fresh IO (S SInteger) Source # | `Fresh` instance for our state
Instance details Defined in Documentation.SBV.Examples.ProofTools.BMC Methods fresh :: QueryT IO (S SInteger) Source #
Fresh IO (S SInteger) Source # | `Fresh` instance for our state
Instance details Defined in Documentation.SBV.Examples.ProofTools.Fibonacci Methods fresh :: QueryT IO (S SInteger) Source #
Fresh IO (S SInteger) Source # | `Fresh` instance for our state
Instance details Defined in Documentation.SBV.Examples.ProofTools.Strengthen Methods fresh :: QueryT IO (S SInteger) Source #
Fresh IO (S SInteger) Source # | `Fresh` instance for our state
Instance details Defined in Documentation.SBV.Examples.ProofTools.Sum Methods fresh :: QueryT IO (S SInteger) Source #
SymVal a => Fresh IO (IncS (SBV a)) Source # | `Fresh` instance for the program state
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.Basics Methods fresh :: QueryT IO (IncS (SBV a)) Source #
SymVal a => Fresh IO (FibS (SBV a)) Source # | `Fresh` instance for the program state
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.Fib Methods fresh :: QueryT IO (FibS (SBV a)) Source #
SymVal a => Fresh IO (GCDS (SBV a)) Source # | `Fresh` instance for the program state
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.GCD Methods fresh :: QueryT IO (GCDS (SBV a)) Source #
SymVal a => Fresh IO (DivS (SBV a)) Source # | `Fresh` instance for the program state
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.IntDiv Methods fresh :: QueryT IO (DivS (SBV a)) Source #
SymVal a => Fresh IO (SqrtS (SBV a)) Source # | `Fresh` instance for the program state
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.IntSqrt Methods fresh :: QueryT IO (SqrtS (SBV a)) Source #
SymVal a => Fresh IO (SumS (SBV a)) Source # | `Fresh` instance for the program state
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.Sum Methods fresh :: QueryT IO (SumS (SBV a)) Source #
ExtractIO m => SExecutable m [SBV a] Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: [SBV a] -> SymbolicT m () Source # sName :: [String] -> [SBV a] -> SymbolicT m () Source # safe :: [SBV a] -> m [SafeResult] Source # safeWith :: SMTConfig -> [SBV a] -> m [SafeResult] Source #
ExtractIO m => SExecutable m (SBV a) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: SBV a -> SymbolicT m () Source # sName :: [String] -> SBV a -> SymbolicT m () Source # safe :: SBV a -> m [SafeResult] Source # safeWith :: SMTConfig -> SBV a -> m [SafeResult] Source #
(MonadIO m, SymVal a) => Queriable m (SBV a) a Source # | Generic `Queriable` instance for `SymVal`/`SMTValue` values
Instance details Defined in Data.SBV.Control.Utils Methods create :: QueryT m (SBV a) Source # project :: SBV a -> QueryT m a Source # embed :: a -> QueryT m (SBV a) Source #
(MonadIO m, SymVal a, Foldable t, Traversable t, Fresh m (t (SBV a))) => Queriable m (t (SBV a)) (t a) Source # | Generic `Queriable` instance for things that are `Fresh` and look like containers:
Instance details Defined in Data.SBV.Control.Utils Methods create :: QueryT m (t (SBV a)) Source # project :: t (SBV a) -> QueryT m (t a) Source # embed :: t a -> QueryT m (t (SBV a)) Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, SymVal g, SExecutable m p) => SExecutable m ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

sName_ :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> SymbolicT m () Source #

sName :: [String] -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> SymbolicT m () Source #

safe :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m [SafeResult] Source #

safeWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m [SafeResult] Source #

(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, SExecutable m p) => SExecutable m ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

sName_ :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> SymbolicT m () Source #

sName :: [String] -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> SymbolicT m () Source #

safe :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m [SafeResult] Source #

safeWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m [SafeResult] Source #

(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SExecutable m p) => SExecutable m ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

sName_ :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> SymbolicT m () Source #

sName :: [String] -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> SymbolicT m () Source #

safe :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m [SafeResult] Source #

safeWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m [SafeResult] Source #

(SymVal a, SymVal b, SymVal c, SymVal d, SExecutable m p) => SExecutable m ((SBV a, SBV b, SBV c, SBV d) -> p) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: ((SBV a, SBV b, SBV c, SBV d) -> p) -> SymbolicT m () Source # sName :: [String] -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> SymbolicT m () Source # safe :: ((SBV a, SBV b, SBV c, SBV d) -> p) -> m [SafeResult] Source # safeWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> m [SafeResult] Source #
(SymVal a, SymVal b, SymVal c, SExecutable m p) => SExecutable m ((SBV a, SBV b, SBV c) -> p) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: ((SBV a, SBV b, SBV c) -> p) -> SymbolicT m () Source # sName :: [String] -> ((SBV a, SBV b, SBV c) -> p) -> SymbolicT m () Source # safe :: ((SBV a, SBV b, SBV c) -> p) -> m [SafeResult] Source # safeWith :: SMTConfig -> ((SBV a, SBV b, SBV c) -> p) -> m [SafeResult] Source #
(SymVal a, SymVal b, SExecutable m p) => SExecutable m ((SBV a, SBV b) -> p) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: ((SBV a, SBV b) -> p) -> SymbolicT m () Source # sName :: [String] -> ((SBV a, SBV b) -> p) -> SymbolicT m () Source # safe :: ((SBV a, SBV b) -> p) -> m [SafeResult] Source # safeWith :: SMTConfig -> ((SBV a, SBV b) -> p) -> m [SafeResult] Source #
(SymVal a, SExecutable m p) => SExecutable m (SBV a -> p) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: (SBV a -> p) -> SymbolicT m () Source # sName :: [String] -> (SBV a -> p) -> SymbolicT m () Source # safe :: (SBV a -> p) -> m [SafeResult] Source # safeWith :: SMTConfig -> (SBV a -> p) -> m [SafeResult] Source #
(ExtractIO m, NFData a, SymVal a, NFData b, SymVal b) => SExecutable m (SBV a, SBV b) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: (SBV a, SBV b) -> SymbolicT m () Source # sName :: [String] -> (SBV a, SBV b) -> SymbolicT m () Source # safe :: (SBV a, SBV b) -> m [SafeResult] Source # safeWith :: SMTConfig -> (SBV a, SBV b) -> m [SafeResult] Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, SymVal g, MProvable m p) => MProvable m ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

forAll_ :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> SymbolicT m SBool Source #

forAll :: [String] -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> SymbolicT m SBool Source #

forSome_ :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> SymbolicT m SBool Source #

forSome :: [String] -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> SymbolicT m SBool Source #

prove :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m ThmResult Source #

proveWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m ThmResult Source #

sat :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m SatResult Source #

satWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m SatResult Source #

allSat :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m AllSatResult Source #

allSatWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m AllSatResult Source #

optimize :: OptimizeStyle -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m OptimizeResult Source #

optimizeWith :: SMTConfig -> OptimizeStyle -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m OptimizeResult Source #

isVacuous :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m Bool Source #

isVacuousWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m Bool Source #

isTheorem :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m Bool Source #

isTheoremWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m Bool Source #

isSatisfiable :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m Bool Source #

isSatisfiableWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> m Bool Source #

validate :: Bool -> SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> p) -> SMTResult -> m SMTResult Source #

(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, MProvable m p) => MProvable m ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

forAll_ :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> SymbolicT m SBool Source #

forAll :: [String] -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> SymbolicT m SBool Source #

forSome_ :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> SymbolicT m SBool Source #

forSome :: [String] -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> SymbolicT m SBool Source #

prove :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m ThmResult Source #

proveWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m ThmResult Source #

sat :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m SatResult Source #

satWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m SatResult Source #

allSat :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m AllSatResult Source #

allSatWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m AllSatResult Source #

optimize :: OptimizeStyle -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m OptimizeResult Source #

optimizeWith :: SMTConfig -> OptimizeStyle -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m OptimizeResult Source #

isVacuous :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m Bool Source #

isVacuousWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m Bool Source #

isTheorem :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m Bool Source #

isTheoremWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m Bool Source #

isSatisfiable :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m Bool Source #

isSatisfiableWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> m Bool Source #

validate :: Bool -> SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> p) -> SMTResult -> m SMTResult Source #

(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, MProvable m p) => MProvable m ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

forAll_ :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> SymbolicT m SBool Source #

forAll :: [String] -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> SymbolicT m SBool Source #

forSome_ :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> SymbolicT m SBool Source #

forSome :: [String] -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> SymbolicT m SBool Source #

prove :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m ThmResult Source #

proveWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m ThmResult Source #

sat :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m SatResult Source #

satWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m SatResult Source #

allSat :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m AllSatResult Source #

allSatWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m AllSatResult Source #

optimize :: OptimizeStyle -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m OptimizeResult Source #

optimizeWith :: SMTConfig -> OptimizeStyle -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m OptimizeResult Source #

isVacuous :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m Bool Source #

isVacuousWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m Bool Source #

isTheorem :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m Bool Source #

isTheoremWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m Bool Source #

isSatisfiable :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m Bool Source #

isSatisfiableWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> m Bool Source #

validate :: Bool -> SMTConfig -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> p) -> SMTResult -> m SMTResult Source #

(SymVal a, SymVal b, SymVal c, SymVal d, MProvable m p) => MProvable m ((SBV a, SBV b, SBV c, SBV d) -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

forAll_ :: ((SBV a, SBV b, SBV c, SBV d) -> p) -> SymbolicT m SBool Source #

forAll :: [String] -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> SymbolicT m SBool Source #

forSome_ :: ((SBV a, SBV b, SBV c, SBV d) -> p) -> SymbolicT m SBool Source #

forSome :: [String] -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> SymbolicT m SBool Source #

prove :: ((SBV a, SBV b, SBV c, SBV d) -> p) -> m ThmResult Source #

proveWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> m ThmResult Source #

sat :: ((SBV a, SBV b, SBV c, SBV d) -> p) -> m SatResult Source #

satWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> m SatResult Source #

allSat :: ((SBV a, SBV b, SBV c, SBV d) -> p) -> m AllSatResult Source #

allSatWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> m AllSatResult Source #

optimize :: OptimizeStyle -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> m OptimizeResult Source #

optimizeWith :: SMTConfig -> OptimizeStyle -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> m OptimizeResult Source #

isVacuous :: ((SBV a, SBV b, SBV c, SBV d) -> p) -> m Bool Source #

isVacuousWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> m Bool Source #

isTheorem :: ((SBV a, SBV b, SBV c, SBV d) -> p) -> m Bool Source #

isTheoremWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> m Bool Source #

isSatisfiable :: ((SBV a, SBV b, SBV c, SBV d) -> p) -> m Bool Source #

isSatisfiableWith :: SMTConfig -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> m Bool Source #

validate :: Bool -> SMTConfig -> ((SBV a, SBV b, SBV c, SBV d) -> p) -> SMTResult -> m SMTResult Source #

(SymVal a, SymVal b, SymVal c, MProvable m p) => MProvable m ((SBV a, SBV b, SBV c) -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

forAll_ :: ((SBV a, SBV b, SBV c) -> p) -> SymbolicT m SBool Source #

forAll :: [String] -> ((SBV a, SBV b, SBV c) -> p) -> SymbolicT m SBool Source #

forSome_ :: ((SBV a, SBV b, SBV c) -> p) -> SymbolicT m SBool Source #

forSome :: [String] -> ((SBV a, SBV b, SBV c) -> p) -> SymbolicT m SBool Source #

prove :: ((SBV a, SBV b, SBV c) -> p) -> m ThmResult Source #

proveWith :: SMTConfig -> ((SBV a, SBV b, SBV c) -> p) -> m ThmResult Source #

sat :: ((SBV a, SBV b, SBV c) -> p) -> m SatResult Source #

satWith :: SMTConfig -> ((SBV a, SBV b, SBV c) -> p) -> m SatResult Source #

allSat :: ((SBV a, SBV b, SBV c) -> p) -> m AllSatResult Source #

allSatWith :: SMTConfig -> ((SBV a, SBV b, SBV c) -> p) -> m AllSatResult Source #

optimize :: OptimizeStyle -> ((SBV a, SBV b, SBV c) -> p) -> m OptimizeResult Source #

optimizeWith :: SMTConfig -> OptimizeStyle -> ((SBV a, SBV b, SBV c) -> p) -> m OptimizeResult Source #

isVacuous :: ((SBV a, SBV b, SBV c) -> p) -> m Bool Source #

isVacuousWith :: SMTConfig -> ((SBV a, SBV b, SBV c) -> p) -> m Bool Source #

isTheorem :: ((SBV a, SBV b, SBV c) -> p) -> m Bool Source #

isTheoremWith :: SMTConfig -> ((SBV a, SBV b, SBV c) -> p) -> m Bool Source #

isSatisfiable :: ((SBV a, SBV b, SBV c) -> p) -> m Bool Source #

isSatisfiableWith :: SMTConfig -> ((SBV a, SBV b, SBV c) -> p) -> m Bool Source #

validate :: Bool -> SMTConfig -> ((SBV a, SBV b, SBV c) -> p) -> SMTResult -> m SMTResult Source #

(SymVal a, SymVal b, MProvable m p) => MProvable m ((SBV a, SBV b) -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

forAll_ :: ((SBV a, SBV b) -> p) -> SymbolicT m SBool Source #

forAll :: [String] -> ((SBV a, SBV b) -> p) -> SymbolicT m SBool Source #

forSome_ :: ((SBV a, SBV b) -> p) -> SymbolicT m SBool Source #

forSome :: [String] -> ((SBV a, SBV b) -> p) -> SymbolicT m SBool Source #

prove :: ((SBV a, SBV b) -> p) -> m ThmResult Source #

proveWith :: SMTConfig -> ((SBV a, SBV b) -> p) -> m ThmResult Source #

sat :: ((SBV a, SBV b) -> p) -> m SatResult Source #

satWith :: SMTConfig -> ((SBV a, SBV b) -> p) -> m SatResult Source #

allSat :: ((SBV a, SBV b) -> p) -> m AllSatResult Source #

allSatWith :: SMTConfig -> ((SBV a, SBV b) -> p) -> m AllSatResult Source #

optimize :: OptimizeStyle -> ((SBV a, SBV b) -> p) -> m OptimizeResult Source #

optimizeWith :: SMTConfig -> OptimizeStyle -> ((SBV a, SBV b) -> p) -> m OptimizeResult Source #

isVacuous :: ((SBV a, SBV b) -> p) -> m Bool Source #

isVacuousWith :: SMTConfig -> ((SBV a, SBV b) -> p) -> m Bool Source #

isTheorem :: ((SBV a, SBV b) -> p) -> m Bool Source #

isTheoremWith :: SMTConfig -> ((SBV a, SBV b) -> p) -> m Bool Source #

isSatisfiable :: ((SBV a, SBV b) -> p) -> m Bool Source #

isSatisfiableWith :: SMTConfig -> ((SBV a, SBV b) -> p) -> m Bool Source #

validate :: Bool -> SMTConfig -> ((SBV a, SBV b) -> p) -> SMTResult -> m SMTResult Source #

(SymVal a, MProvable m p) => MProvable m (SBV a -> p) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

forAll_ :: (SBV a -> p) -> SymbolicT m SBool Source #

forAll :: [String] -> (SBV a -> p) -> SymbolicT m SBool Source #

forSome_ :: (SBV a -> p) -> SymbolicT m SBool Source #

forSome :: [String] -> (SBV a -> p) -> SymbolicT m SBool Source #

prove :: (SBV a -> p) -> m ThmResult Source #

proveWith :: SMTConfig -> (SBV a -> p) -> m ThmResult Source #

sat :: (SBV a -> p) -> m SatResult Source #

satWith :: SMTConfig -> (SBV a -> p) -> m SatResult Source #

allSat :: (SBV a -> p) -> m AllSatResult Source #

allSatWith :: SMTConfig -> (SBV a -> p) -> m AllSatResult Source #

optimize :: OptimizeStyle -> (SBV a -> p) -> m OptimizeResult Source #

optimizeWith :: SMTConfig -> OptimizeStyle -> (SBV a -> p) -> m OptimizeResult Source #

isVacuous :: (SBV a -> p) -> m Bool Source #

isVacuousWith :: SMTConfig -> (SBV a -> p) -> m Bool Source #

isTheorem :: (SBV a -> p) -> m Bool Source #

isTheoremWith :: SMTConfig -> (SBV a -> p) -> m Bool Source #

isSatisfiable :: (SBV a -> p) -> m Bool Source #

isSatisfiableWith :: SMTConfig -> (SBV a -> p) -> m Bool Source #

validate :: Bool -> SMTConfig -> (SBV a -> p) -> SMTResult -> m SMTResult Source #

ExtractIO m => MProvable m (SymbolicT m SBool) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

forAll_ :: SymbolicT m SBool -> SymbolicT m SBool Source #

forAll :: [String] -> SymbolicT m SBool -> SymbolicT m SBool Source #

forSome_ :: SymbolicT m SBool -> SymbolicT m SBool Source #

forSome :: [String] -> SymbolicT m SBool -> SymbolicT m SBool Source #

prove :: SymbolicT m SBool -> m ThmResult Source #

proveWith :: SMTConfig -> SymbolicT m SBool -> m ThmResult Source #

sat :: SymbolicT m SBool -> m SatResult Source #

satWith :: SMTConfig -> SymbolicT m SBool -> m SatResult Source #

allSat :: SymbolicT m SBool -> m AllSatResult Source #

allSatWith :: SMTConfig -> SymbolicT m SBool -> m AllSatResult Source #

optimize :: OptimizeStyle -> SymbolicT m SBool -> m OptimizeResult Source #

optimizeWith :: SMTConfig -> OptimizeStyle -> SymbolicT m SBool -> m OptimizeResult Source #

isVacuous :: SymbolicT m SBool -> m Bool Source #

isVacuousWith :: SMTConfig -> SymbolicT m SBool -> m Bool Source #

isTheorem :: SymbolicT m SBool -> m Bool Source #

isTheoremWith :: SMTConfig -> SymbolicT m SBool -> m Bool Source #

isSatisfiable :: SymbolicT m SBool -> m Bool Source #

isSatisfiableWith :: SMTConfig -> SymbolicT m SBool -> m Bool Source #

validate :: Bool -> SMTConfig -> SymbolicT m SBool -> SMTResult -> m SMTResult Source #

(ExtractIO m, NFData a, SymVal a, NFData b, SymVal b, NFData c, SymVal c) => SExecutable m (SBV a, SBV b, SBV c) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: (SBV a, SBV b, SBV c) -> SymbolicT m () Source # sName :: [String] -> (SBV a, SBV b, SBV c) -> SymbolicT m () Source # safe :: (SBV a, SBV b, SBV c) -> m [SafeResult] Source # safeWith :: SMTConfig -> (SBV a, SBV b, SBV c) -> m [SafeResult] Source #
(ExtractIO m, NFData a, SymVal a, NFData b, SymVal b, NFData c, SymVal c, NFData d, SymVal d) => SExecutable m (SBV a, SBV b, SBV c, SBV d) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: (SBV a, SBV b, SBV c, SBV d) -> SymbolicT m () Source # sName :: [String] -> (SBV a, SBV b, SBV c, SBV d) -> SymbolicT m () Source # safe :: (SBV a, SBV b, SBV c, SBV d) -> m [SafeResult] Source # safeWith :: SMTConfig -> (SBV a, SBV b, SBV c, SBV d) -> m [SafeResult] Source #
(ExtractIO m, NFData a, SymVal a, NFData b, SymVal b, NFData c, SymVal c, NFData d, SymVal d, NFData e, SymVal e) => SExecutable m (SBV a, SBV b, SBV c, SBV d, SBV e) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: (SBV a, SBV b, SBV c, SBV d, SBV e) -> SymbolicT m () Source # sName :: [String] -> (SBV a, SBV b, SBV c, SBV d, SBV e) -> SymbolicT m () Source # safe :: (SBV a, SBV b, SBV c, SBV d, SBV e) -> m [SafeResult] Source # safeWith :: SMTConfig -> (SBV a, SBV b, SBV c, SBV d, SBV e) -> m [SafeResult] Source #
(ExtractIO m, NFData a, SymVal a, NFData b, SymVal b, NFData c, SymVal c, NFData d, SymVal d, NFData e, SymVal e, NFData f, SymVal f) => SExecutable m (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

sName_ :: (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> SymbolicT m () Source #

sName :: [String] -> (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> SymbolicT m () Source #

safe :: (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> m [SafeResult] Source #

safeWith :: SMTConfig -> (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> m [SafeResult] Source #

(ExtractIO m, NFData a, SymVal a, NFData b, SymVal b, NFData c, SymVal c, NFData d, SymVal d, NFData e, SymVal e, NFData f, SymVal f, NFData g, SymVal g) => SExecutable m (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

sName_ :: (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> SymbolicT m () Source #

sName :: [String] -> (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> SymbolicT m () Source #

safe :: (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> m [SafeResult] Source #

safeWith :: SMTConfig -> (SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> m [SafeResult] Source #

SymVal [a] => IsList (SList a) Source # | IsList instance allows list literals to be written compactly.
Instance details Defined in Data.SBV.Core.Data Associated Types type Item (SList a) Methods fromList :: [Item (SList a)] -> SList a fromListN :: Int -> [Item (SList a)] -> SList a toList :: SList a -> [Item (SList a)]
(SymVal a, Bounded a) => Bounded (SBV a) |
Instance details Defined in Data.SBV.Core.Model Methods minBound :: SBV a maxBound :: SBV a
(Show a, Bounded a, Integral a, Num a, SymVal a) => Enum (SBV a) |
Instance details Defined in Data.SBV.Core.Model Methods succ :: SBV a -> SBV a pred :: SBV a -> SBV a toEnum :: Int -> SBV a fromEnum :: SBV a -> Int enumFrom :: SBV a -> [SBV a] enumFromThen :: SBV a -> SBV a -> [SBV a] enumFromTo :: SBV a -> SBV a -> [SBV a] enumFromThenTo :: SBV a -> SBV a -> SBV a -> [SBV a]
Eq (SBV a) Source # | This instance is only defined so that we can define an instance for `Bits`. `==` and `/=` simply throw an error. Use `EqSymbolic` instead.
Instance details Defined in Data.SBV.Core.Data Methods (==) :: SBV a -> SBV a -> Bool (/=) :: SBV a -> SBV a -> Bool
(Ord a, SymVal a, Fractional a, Floating a) => Floating (SBV a) | Define Floating instance on SBV's; only for base types that are already floating; i.e., SFloat and SDouble Note that most of the fields are "undefined" for symbolic values, we add methods as they are supported by SMTLib. Currently, the only symbolicly available function in this class is sqrt.

Instance details

Defined in Data.SBV.Core.Model

Methods

pi :: SBV a

exp :: SBV a -> SBV a

log :: SBV a -> SBV a

sqrt :: SBV a -> SBV a

(**) :: SBV a -> SBV a -> SBV a

logBase :: SBV a -> SBV a -> SBV a

sin :: SBV a -> SBV a

cos :: SBV a -> SBV a

tan :: SBV a -> SBV a

asin :: SBV a -> SBV a

acos :: SBV a -> SBV a

atan :: SBV a -> SBV a

sinh :: SBV a -> SBV a

cosh :: SBV a -> SBV a

tanh :: SBV a -> SBV a

asinh :: SBV a -> SBV a

acosh :: SBV a -> SBV a

atanh :: SBV a -> SBV a

log1p :: SBV a -> SBV a

expm1 :: SBV a -> SBV a

log1pexp :: SBV a -> SBV a

log1mexp :: SBV a -> SBV a

(Ord a, SymVal a, Fractional a) => Fractional (SBV a) |
Instance details Defined in Data.SBV.Core.Model Methods (/) :: SBV a -> SBV a -> SBV a recip :: SBV a -> SBV a fromRational :: Rational -> SBV a
(Ord a, Num a, SymVal a) => Num (SBV a) |
Instance details Defined in Data.SBV.Core.Model Methods (+) :: SBV a -> SBV a -> SBV a (-) :: SBV a -> SBV a -> SBV a (*) :: SBV a -> SBV a -> SBV a negate :: SBV a -> SBV a abs :: SBV a -> SBV a signum :: SBV a -> SBV a fromInteger :: Integer -> SBV a
Show (SBV a) Source # | A `Show` instance is not particularly "desirable," when the value is symbolic, but we do need this instance as otherwise we cannot simply evaluate Haskell functions that return symbolic values and have their constant values printed easily!
Instance details Defined in Data.SBV.Core.Data Methods showsPrec :: Int -> SBV a -> ShowS show :: SBV a -> String showList :: [SBV a] -> ShowS
(SymVal a, Show a) => Show (IncS (SBV a)) | Show instance for `IncS`. The above deriving clause would work just as well, but we want it to be a little prettier here, and hence the `OVERLAPS` directive.
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.Basics Methods showsPrec :: Int -> IncS (SBV a) -> ShowS show :: IncS (SBV a) -> String showList :: [IncS (SBV a)] -> ShowS
(SymVal a, Show a) => Show (FibS (SBV a)) | Show instance for `FibS`. The above deriving clause would work just as well, but we want it to be a little prettier here, and hence the `OVERLAPS` directive.
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.Fib Methods showsPrec :: Int -> FibS (SBV a) -> ShowS show :: FibS (SBV a) -> String showList :: [FibS (SBV a)] -> ShowS
(SymVal a, Show a) => Show (GCDS (SBV a)) | Show instance for `GCDS`. The above deriving clause would work just as well, but we want it to be a little prettier here, and hence the `OVERLAPS` directive.
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.GCD Methods showsPrec :: Int -> GCDS (SBV a) -> ShowS show :: GCDS (SBV a) -> String showList :: [GCDS (SBV a)] -> ShowS
(SymVal a, Show a) => Show (DivS (SBV a)) | Show instance for `DivS`. The above deriving clause would work just as well, but we want it to be a little prettier here, and hence the `OVERLAPS` directive.
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.IntDiv Methods showsPrec :: Int -> DivS (SBV a) -> ShowS show :: DivS (SBV a) -> String showList :: [DivS (SBV a)] -> ShowS
(SymVal a, Show a) => Show (SqrtS (SBV a)) | Show instance for `SqrtS`. The above deriving clause would work just as well, but we want it to be a little prettier here, and hence the `OVERLAPS` directive.
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.IntSqrt Methods showsPrec :: Int -> SqrtS (SBV a) -> ShowS show :: SqrtS (SBV a) -> String showList :: [SqrtS (SBV a)] -> ShowS
(SymVal a, Show a) => Show (SumS (SBV a)) | Show instance for `SumS`. The above deriving clause would work just as well, but we want it to be a little prettier here, and hence the `OVERLAPS` directive.
Instance details Defined in Documentation.SBV.Examples.WeakestPreconditions.Sum Methods showsPrec :: Int -> SumS (SBV a) -> ShowS show :: SumS (SBV a) -> String showList :: [SumS (SBV a)] -> ShowS
Generic (SBV a) Source # |
Instance details Defined in Data.SBV.Core.Data Associated Types type Rep (SBV a) :: Type -> Type Methods from :: SBV a -> Rep (SBV a) x to :: Rep (SBV a) x -> SBV a
Testable (Symbolic SBool) Source # |
Instance details Defined in Data.SBV.Core.Model Methods property :: Symbolic SBool -> Property Source # propertyForAllShrinkShow :: Gen a -> (a -> [a]) -> (a -> [String]) -> (a -> Symbolic SBool) -> Property Source #
(SymVal a, Arbitrary a) => Arbitrary (SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods arbitrary :: Gen (SBV a) Source # shrink :: SBV a -> [SBV a] Source #
(Random a, SymVal a) => Random (SBV a) Source # |
Instance details Defined in Data.SBV.Core.Data Methods randomR :: RandomGen g => (SBV a, SBV a) -> g -> (SBV a, g) Source # random :: RandomGen g => g -> (SBV a, g) Source # randomRs :: RandomGen g => (SBV a, SBV a) -> g -> [SBV a] Source # randoms :: RandomGen g => g -> [SBV a] Source # randomRIO :: (SBV a, SBV a) -> IO (SBV a) Source # randomIO :: IO (SBV a) Source #
NFData (SBV a) Source # |
Instance details Defined in Data.SBV.Core.Data Methods rnf :: SBV a -> ()
(Ord a, Num a, Bits a, SymVal a) => Bits (SBV a) | Using `popCount` or `testBit` on non-concrete values will result in an error. Use `sPopCount` or `sTestBit` instead.

Instance details

Defined in Data.SBV.Core.Model

Methods

(.&.) :: SBV a -> SBV a -> SBV a

(.|.) :: SBV a -> SBV a -> SBV a

xor :: SBV a -> SBV a -> SBV a

complement :: SBV a -> SBV a

shift :: SBV a -> Int -> SBV a

rotate :: SBV a -> Int -> SBV a

zeroBits :: SBV a

bit :: Int -> SBV a

setBit :: SBV a -> Int -> SBV a

clearBit :: SBV a -> Int -> SBV a

complementBit :: SBV a -> Int -> SBV a

testBit :: SBV a -> Int -> Bool

bitSizeMaybe :: SBV a -> Maybe Int

bitSize :: SBV a -> Int

isSigned :: SBV a -> Bool

shiftL :: SBV a -> Int -> SBV a

unsafeShiftL :: SBV a -> Int -> SBV a

shiftR :: SBV a -> Int -> SBV a

unsafeShiftR :: SBV a -> Int -> SBV a

rotateL :: SBV a -> Int -> SBV a

rotateR :: SBV a -> Int -> SBV a

popCount :: SBV a -> Int

HasKind a => HasKind (SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Data

Methods

kindOf :: SBV a -> Kind Source #

hasSign :: SBV a -> Bool Source #

intSizeOf :: SBV a -> Int Source #

isBoolean :: SBV a -> Bool Source #

isBounded :: SBV a -> Bool Source #

isReal :: SBV a -> Bool Source #

isFloat :: SBV a -> Bool Source #

isDouble :: SBV a -> Bool Source #

isUnbounded :: SBV a -> Bool Source #

isUninterpreted :: SBV a -> Bool Source #

isChar :: SBV a -> Bool Source #

isString :: SBV a -> Bool Source #

isList :: SBV a -> Bool Source #

isSet :: SBV a -> Bool Source #

isTuple :: SBV a -> Bool Source #

isMaybe :: SBV a -> Bool Source #

isEither :: SBV a -> Bool Source #

showType :: SBV a -> String Source #

Outputtable (SBV a) Source # |
Instance details Defined in Data.SBV.Core.Data Methods output :: MonadSymbolic m => SBV a -> m (SBV a) Source #
(SymVal a, PrettyNum a) => PrettyNum (SBV a) Source # |
Instance details Defined in Data.SBV.Utils.PrettyNum Methods hexS :: SBV a -> String Source # binS :: SBV a -> String Source # hexP :: SBV a -> String Source # binP :: SBV a -> String Source # hex :: SBV a -> String Source # bin :: SBV a -> String Source #
HasKind a => Uninterpreted (SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> SBV a Source # cgUninterpret :: String -> [String] -> SBV a -> SBV a Source # sbvUninterpret :: Maybe ([String], SBV a) -> String -> SBV a Source #
SymVal a => Mergeable (SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods symbolicMerge :: Bool -> SBool -> SBV a -> SBV a -> SBV a Source # select :: (Ord b, SymVal b, Num b) => [SBV a] -> SBV a -> SBV b -> SBV a Source #
(KnownNat n, IsNonZero n) => SDivisible (SInt n) Source # | `SDivisible` instance for `SInt`
Instance details Defined in Data.SBV.Core.Sized Methods sQuotRem :: SInt n -> SInt n -> (SInt n, SInt n) Source # sDivMod :: SInt n -> SInt n -> (SInt n, SInt n) Source # sQuot :: SInt n -> SInt n -> SInt n Source # sRem :: SInt n -> SInt n -> SInt n Source # sDiv :: SInt n -> SInt n -> SInt n Source # sMod :: SInt n -> SInt n -> SInt n Source #
(KnownNat n, IsNonZero n) => SDivisible (SWord n) Source # | `SDivisible` instance for `SWord`
Instance details Defined in Data.SBV.Core.Sized Methods sQuotRem :: SWord n -> SWord n -> (SWord n, SWord n) Source # sDivMod :: SWord n -> SWord n -> (SWord n, SWord n) Source # sQuot :: SWord n -> SWord n -> SWord n Source # sRem :: SWord n -> SWord n -> SWord n Source # sDiv :: SWord n -> SWord n -> SWord n Source # sMod :: SWord n -> SWord n -> SWord n Source #
(Ord a, SymVal a) => OrdSymbolic (SBV a) Source # | If comparison is over something SMTLib can handle, just translate it. Otherwise desugar.
Instance details Defined in Data.SBV.Core.Model Methods (.<) :: SBV a -> SBV a -> SBool Source # (.<=) :: SBV a -> SBV a -> SBool Source # (.>) :: SBV a -> SBV a -> SBool Source # (.>=) :: SBV a -> SBV a -> SBool Source # smin :: SBV a -> SBV a -> SBV a Source # smax :: SBV a -> SBV a -> SBV a Source # inRange :: SBV a -> (SBV a, SBV a) -> SBool Source #
EqSymbolic (SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

(.==) :: SBV a -> SBV a -> SBool Source #

(./=) :: SBV a -> SBV a -> SBool Source #

(.===) :: SBV a -> SBV a -> SBool Source #

(./==) :: SBV a -> SBV a -> SBool Source #

distinct :: [SBV a] -> SBool Source #

distinctExcept :: [SBV a] -> [SBV a] -> SBool Source #

allEqual :: [SBV a] -> SBool Source #

sElem :: SBV a -> [SBV a] -> SBool Source #

sNotElem :: SBV a -> [SBV a] -> SBool Source #

ByteConverter (SWord 8) Source # | `SWord` 8 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 8 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 8 Source #
ByteConverter (SWord 16) Source # | `SWord` 16 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 16 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 16 Source #
ByteConverter (SWord 32) Source # | `SWord` 32 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 32 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 32 Source #
ByteConverter (SWord 64) Source # | `SWord` 64 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 64 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 64 Source #
ByteConverter (SWord 128) Source # | `SWord` 128 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 128 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 128 Source #
ByteConverter (SWord 256) Source # | `SWord` 256 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 256 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 256 Source #
ByteConverter (SWord 512) Source # | `SWord` 512 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 512 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 512 Source #
ByteConverter (SWord 1024) Source # | `SWord` 1024 instance for `ByteConverter`
Instance details Defined in Data.SBV.Core.Sized Methods toBytes :: SWord 1024 -> [SWord 8] Source # fromBytes :: [SWord 8] -> SWord 1024 Source #
(KnownNat n, IsNonZero n) => Polynomial (SWord n) Source # |

Instance details

Defined in Data.SBV.Tools.Polynomial

Methods

polynomial :: [Int] -> SWord n Source #

pAdd :: SWord n -> SWord n -> SWord n Source #

pMult :: (SWord n, SWord n, [Int]) -> SWord n Source #

pDiv :: SWord n -> SWord n -> SWord n Source #

pMod :: SWord n -> SWord n -> SWord n Source #

pDivMod :: SWord n -> SWord n -> (SWord n, SWord n) Source #

showPoly :: SWord n -> String Source #

showPolynomial :: Bool -> SWord n -> String Source #

(SymVal a, SymVal b, EqSymbolic z) => Equality ((SBV a, SBV b) -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: ((SBV a, SBV b) -> z) -> ((SBV a, SBV b) -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, EqSymbolic z) => Equality ((SBV a, SBV b, SBV c) -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: ((SBV a, SBV b, SBV c) -> z) -> ((SBV a, SBV b, SBV c) -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, EqSymbolic z) => Equality ((SBV a, SBV b, SBV c, SBV d) -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: ((SBV a, SBV b, SBV c, SBV d) -> z) -> ((SBV a, SBV b, SBV c, SBV d) -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, EqSymbolic z) => Equality ((SBV a, SBV b, SBV c, SBV d, SBV e) -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: ((SBV a, SBV b, SBV c, SBV d, SBV e) -> z) -> ((SBV a, SBV b, SBV c, SBV d, SBV e) -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, EqSymbolic z) => Equality ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> z) -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f) -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, SymVal g, EqSymbolic z) => Equality ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> z) -> ((SBV a, SBV b, SBV c, SBV d, SBV e, SBV f, SBV g) -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, SymVal g, EqSymbolic z) => Equality (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> SBV f -> SBV g -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> SBV f -> SBV g -> z) -> (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> SBV f -> SBV g -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, EqSymbolic z) => Equality (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> SBV f -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> SBV f -> z) -> (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> SBV f -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, EqSymbolic z) => Equality (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> z) -> (SBV a -> SBV b -> SBV c -> SBV d -> SBV e -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, SymVal d, EqSymbolic z) => Equality (SBV a -> SBV b -> SBV c -> SBV d -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> SBV b -> SBV c -> SBV d -> z) -> (SBV a -> SBV b -> SBV c -> SBV d -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, SymVal c, EqSymbolic z) => Equality (SBV a -> SBV b -> SBV c -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> SBV b -> SBV c -> z) -> (SBV a -> SBV b -> SBV c -> z) -> IO ThmResult Source #
(SymVal a, SymVal b, EqSymbolic z) => Equality (SBV a -> SBV b -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> SBV b -> z) -> (SBV a -> SBV b -> z) -> IO ThmResult Source #
(SymVal a, EqSymbolic z) => Equality (SBV a -> z) Source # |
Instance details Defined in Data.SBV.Core.Model Methods (===) :: (SBV a -> z) -> (SBV a -> z) -> IO ThmResult Source #
(SymVal c, SymVal b, HasKind a) => Uninterpreted ((SBV c, SBV b) -> SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> (SBV c, SBV b) -> SBV a Source # cgUninterpret :: String -> [String] -> ((SBV c, SBV b) -> SBV a) -> (SBV c, SBV b) -> SBV a Source # sbvUninterpret :: Maybe ([String], (SBV c, SBV b) -> SBV a) -> String -> (SBV c, SBV b) -> SBV a Source #
(SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted ((SBV d, SBV c, SBV b) -> SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> (SBV d, SBV c, SBV b) -> SBV a Source # cgUninterpret :: String -> [String] -> ((SBV d, SBV c, SBV b) -> SBV a) -> (SBV d, SBV c, SBV b) -> SBV a Source # sbvUninterpret :: Maybe ([String], (SBV d, SBV c, SBV b) -> SBV a) -> String -> (SBV d, SBV c, SBV b) -> SBV a Source #
(SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted ((SBV e, SBV d, SBV c, SBV b) -> SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> (SBV e, SBV d, SBV c, SBV b) -> SBV a Source # cgUninterpret :: String -> [String] -> ((SBV e, SBV d, SBV c, SBV b) -> SBV a) -> (SBV e, SBV d, SBV c, SBV b) -> SBV a Source # sbvUninterpret :: Maybe ([String], (SBV e, SBV d, SBV c, SBV b) -> SBV a) -> String -> (SBV e, SBV d, SBV c, SBV b) -> SBV a Source #
(SymVal f, SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted ((SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> (SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

cgUninterpret :: String -> [String] -> ((SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) -> (SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

sbvUninterpret :: Maybe ([String], (SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) -> String -> (SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

(SymVal g, SymVal f, SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted ((SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> (SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

cgUninterpret :: String -> [String] -> ((SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) -> (SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

sbvUninterpret :: Maybe ([String], (SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) -> String -> (SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

(SymVal h, SymVal g, SymVal f, SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted ((SBV h, SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> (SBV h, SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

cgUninterpret :: String -> [String] -> ((SBV h, SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) -> (SBV h, SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

sbvUninterpret :: Maybe ([String], (SBV h, SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a) -> String -> (SBV h, SBV g, SBV f, SBV e, SBV d, SBV c, SBV b) -> SBV a Source #

(SymVal h, SymVal g, SymVal f, SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted (SBV h -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> SBV h -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

cgUninterpret :: String -> [String] -> (SBV h -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> SBV h -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

sbvUninterpret :: Maybe ([String], SBV h -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> String -> SBV h -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

(SymVal g, SymVal f, SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted (SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

cgUninterpret :: String -> [String] -> (SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

sbvUninterpret :: Maybe ([String], SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> String -> SBV g -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

(SymVal f, SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted (SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

cgUninterpret :: String -> [String] -> (SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

sbvUninterpret :: Maybe ([String], SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> String -> SBV f -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

(SymVal e, SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted (SBV e -> SBV d -> SBV c -> SBV b -> SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

uninterpret :: String -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

cgUninterpret :: String -> [String] -> (SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

sbvUninterpret :: Maybe ([String], SBV e -> SBV d -> SBV c -> SBV b -> SBV a) -> String -> SBV e -> SBV d -> SBV c -> SBV b -> SBV a Source #

(SymVal d, SymVal c, SymVal b, HasKind a) => Uninterpreted (SBV d -> SBV c -> SBV b -> SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> SBV d -> SBV c -> SBV b -> SBV a Source # cgUninterpret :: String -> [String] -> (SBV d -> SBV c -> SBV b -> SBV a) -> SBV d -> SBV c -> SBV b -> SBV a Source # sbvUninterpret :: Maybe ([String], SBV d -> SBV c -> SBV b -> SBV a) -> String -> SBV d -> SBV c -> SBV b -> SBV a Source #
(SymVal c, SymVal b, HasKind a) => Uninterpreted (SBV c -> SBV b -> SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> SBV c -> SBV b -> SBV a Source # cgUninterpret :: String -> [String] -> (SBV c -> SBV b -> SBV a) -> SBV c -> SBV b -> SBV a Source # sbvUninterpret :: Maybe ([String], SBV c -> SBV b -> SBV a) -> String -> SBV c -> SBV b -> SBV a Source #
(SymVal b, HasKind a) => Uninterpreted (SBV b -> SBV a) Source # |
Instance details Defined in Data.SBV.Core.Model Methods uninterpret :: String -> SBV b -> SBV a Source # cgUninterpret :: String -> [String] -> (SBV b -> SBV a) -> SBV b -> SBV a Source # sbvUninterpret :: Maybe ([String], SBV b -> SBV a) -> String -> SBV b -> SBV a Source #
SymVal e => Mergeable (STree i e) Source # |
Instance details Defined in Data.SBV.Tools.STree Methods symbolicMerge :: Bool -> SBool -> STree i e -> STree i e -> STree i e Source # select :: (Ord b, SymVal b, Num b) => [STree i e] -> STree i e -> SBV b -> STree i e Source #
type Rep (SBV a) Source # |
Instance details Defined in Data.SBV.Core.Data type Rep (SBV a) = D1 ('MetaData "SBV" "Data.SBV.Core.Data" "sbv-8.7-9mSEXJN8olRBwPWTmi3EMV" 'True) (C1 ('MetaCons "SBV" 'PrefixI 'True) (S1 ('MetaSel ('Just "unSBV") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 SVal)))
type Item (SList a) Source # |
Instance details Defined in Data.SBV.Core.Data type Item (SList a) = a

class HasKind a where Source #

A class for capturing values that have a sign and a size (finite or infinite) minimal complete definition: kindOf, unless you can take advantage of the default signature: This class can be automatically derived for data-types that have a `Data` instance; this is useful for creating uninterpreted sorts. So, in reality, end users should almost never need to define any methods.

Minimal complete definition

Nothing

Methods

kindOf :: a -> Kind Source #

default kindOf :: (Read a, Data a) => a -> Kind Source #

hasSign :: a -> Bool Source #

intSizeOf :: a -> Int Source #

isBoolean :: a -> Bool Source #

isBounded :: a -> Bool Source #

isReal :: a -> Bool Source #

isFloat :: a -> Bool Source #

isDouble :: a -> Bool Source #

isUnbounded :: a -> Bool Source #

isUninterpreted :: a -> Bool Source #

isChar :: a -> Bool Source #

isString :: a -> Bool Source #

isList :: a -> Bool Source #

isSet :: a -> Bool Source #

isTuple :: a -> Bool Source #

isMaybe :: a -> Bool Source #

isEither :: a -> Bool Source #

showType :: a -> String Source #

#### Instances

Instances details

HasKind Bool Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Bool -> Kind Source #

hasSign :: Bool -> Bool Source #

intSizeOf :: Bool -> Int Source #

isBoolean :: Bool -> Bool Source #

isBounded :: Bool -> Bool Source #

isReal :: Bool -> Bool Source #

isFloat :: Bool -> Bool Source #

isDouble :: Bool -> Bool Source #

isUnbounded :: Bool -> Bool Source #

isUninterpreted :: Bool -> Bool Source #

isChar :: Bool -> Bool Source #

isString :: Bool -> Bool Source #

isList :: Bool -> Bool Source #

isSet :: Bool -> Bool Source #

isTuple :: Bool -> Bool Source #

isMaybe :: Bool -> Bool Source #

isEither :: Bool -> Bool Source #

showType :: Bool -> String Source #

HasKind Char Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Char -> Kind Source #

hasSign :: Char -> Bool Source #

intSizeOf :: Char -> Int Source #

isBoolean :: Char -> Bool Source #

isBounded :: Char -> Bool Source #

isReal :: Char -> Bool Source #

isFloat :: Char -> Bool Source #

isDouble :: Char -> Bool Source #

isUnbounded :: Char -> Bool Source #

isUninterpreted :: Char -> Bool Source #

isChar :: Char -> Bool Source #

isString :: Char -> Bool Source #

isList :: Char -> Bool Source #

isSet :: Char -> Bool Source #

isTuple :: Char -> Bool Source #

isMaybe :: Char -> Bool Source #

isEither :: Char -> Bool Source #

showType :: Char -> String Source #

HasKind Double Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Double -> Kind Source #

hasSign :: Double -> Bool Source #

intSizeOf :: Double -> Int Source #

isBoolean :: Double -> Bool Source #

isBounded :: Double -> Bool Source #

isReal :: Double -> Bool Source #

isFloat :: Double -> Bool Source #

isDouble :: Double -> Bool Source #

isUnbounded :: Double -> Bool Source #

isUninterpreted :: Double -> Bool Source #

isChar :: Double -> Bool Source #

isString :: Double -> Bool Source #

isList :: Double -> Bool Source #

isSet :: Double -> Bool Source #

isTuple :: Double -> Bool Source #

isMaybe :: Double -> Bool Source #

isEither :: Double -> Bool Source #

showType :: Double -> String Source #

HasKind Float Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Float -> Kind Source #

hasSign :: Float -> Bool Source #

intSizeOf :: Float -> Int Source #

isBoolean :: Float -> Bool Source #

isBounded :: Float -> Bool Source #

isReal :: Float -> Bool Source #

isFloat :: Float -> Bool Source #

isDouble :: Float -> Bool Source #

isUnbounded :: Float -> Bool Source #

isUninterpreted :: Float -> Bool Source #

isChar :: Float -> Bool Source #

isString :: Float -> Bool Source #

isList :: Float -> Bool Source #

isSet :: Float -> Bool Source #

isTuple :: Float -> Bool Source #

isMaybe :: Float -> Bool Source #

isEither :: Float -> Bool Source #

showType :: Float -> String Source #

HasKind Int8 Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Int8 -> Kind Source #

hasSign :: Int8 -> Bool Source #

intSizeOf :: Int8 -> Int Source #

isBoolean :: Int8 -> Bool Source #

isBounded :: Int8 -> Bool Source #

isReal :: Int8 -> Bool Source #

isFloat :: Int8 -> Bool Source #

isDouble :: Int8 -> Bool Source #

isUnbounded :: Int8 -> Bool Source #

isUninterpreted :: Int8 -> Bool Source #

isChar :: Int8 -> Bool Source #

isString :: Int8 -> Bool Source #

isList :: Int8 -> Bool Source #

isSet :: Int8 -> Bool Source #

isTuple :: Int8 -> Bool Source #

isMaybe :: Int8 -> Bool Source #

isEither :: Int8 -> Bool Source #

showType :: Int8 -> String Source #

HasKind Int16 Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Int16 -> Kind Source #

hasSign :: Int16 -> Bool Source #

intSizeOf :: Int16 -> Int Source #

isBoolean :: Int16 -> Bool Source #

isBounded :: Int16 -> Bool Source #

isReal :: Int16 -> Bool Source #

isFloat :: Int16 -> Bool Source #

isDouble :: Int16 -> Bool Source #

isUnbounded :: Int16 -> Bool Source #

isUninterpreted :: Int16 -> Bool Source #

isChar :: Int16 -> Bool Source #

isString :: Int16 -> Bool Source #

isList :: Int16 -> Bool Source #

isSet :: Int16 -> Bool Source #

isTuple :: Int16 -> Bool Source #

isMaybe :: Int16 -> Bool Source #

isEither :: Int16 -> Bool Source #

showType :: Int16 -> String Source #

HasKind Int32 Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Int32 -> Kind Source #

hasSign :: Int32 -> Bool Source #

intSizeOf :: Int32 -> Int Source #

isBoolean :: Int32 -> Bool Source #

isBounded :: Int32 -> Bool Source #

isReal :: Int32 -> Bool Source #

isFloat :: Int32 -> Bool Source #

isDouble :: Int32 -> Bool Source #

isUnbounded :: Int32 -> Bool Source #

isUninterpreted :: Int32 -> Bool Source #

isChar :: Int32 -> Bool Source #

isString :: Int32 -> Bool Source #

isList :: Int32 -> Bool Source #

isSet :: Int32 -> Bool Source #

isTuple :: Int32 -> Bool Source #

isMaybe :: Int32 -> Bool Source #

isEither :: Int32 -> Bool Source #

showType :: Int32 -> String Source #

HasKind Int64 Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Int64 -> Kind Source #

hasSign :: Int64 -> Bool Source #

intSizeOf :: Int64 -> Int Source #

isBoolean :: Int64 -> Bool Source #

isBounded :: Int64 -> Bool Source #

isReal :: Int64 -> Bool Source #

isFloat :: Int64 -> Bool Source #

isDouble :: Int64 -> Bool Source #

isUnbounded :: Int64 -> Bool Source #

isUninterpreted :: Int64 -> Bool Source #

isChar :: Int64 -> Bool Source #

isString :: Int64 -> Bool Source #

isList :: Int64 -> Bool Source #

isSet :: Int64 -> Bool Source #

isTuple :: Int64 -> Bool Source #

isMaybe :: Int64 -> Bool Source #

isEither :: Int64 -> Bool Source #

showType :: Int64 -> String Source #

HasKind Integer Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Integer -> Kind Source #

hasSign :: Integer -> Bool Source #

intSizeOf :: Integer -> Int Source #

isBoolean :: Integer -> Bool Source #

isBounded :: Integer -> Bool Source #

isReal :: Integer -> Bool Source #

isFloat :: Integer -> Bool Source #

isDouble :: Integer -> Bool Source #

isUnbounded :: Integer -> Bool Source #

isUninterpreted :: Integer -> Bool Source #

isChar :: Integer -> Bool Source #

isString :: Integer -> Bool Source #

isList :: Integer -> Bool Source #

isSet :: Integer -> Bool Source #

isTuple :: Integer -> Bool Source #

isMaybe :: Integer -> Bool Source #

isEither :: Integer -> Bool Source #

showType :: Integer -> String Source #

HasKind Word8 Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Word8 -> Kind Source #

hasSign :: Word8 -> Bool Source #

intSizeOf :: Word8 -> Int Source #

isBoolean :: Word8 -> Bool Source #

isBounded :: Word8 -> Bool Source #

isReal :: Word8 -> Bool Source #

isFloat :: Word8 -> Bool Source #

isDouble :: Word8 -> Bool Source #

isUnbounded :: Word8 -> Bool Source #

isUninterpreted :: Word8 -> Bool Source #

isChar :: Word8 -> Bool Source #

isString :: Word8 -> Bool Source #

isList :: Word8 -> Bool Source #

isSet :: Word8 -> Bool Source #

isTuple :: Word8 -> Bool Source #

isMaybe :: Word8 -> Bool Source #

isEither :: Word8 -> Bool Source #

showType :: Word8 -> String Source #

HasKind Word16 Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Word16 -> Kind Source #

hasSign :: Word16 -> Bool Source #

intSizeOf :: Word16 -> Int Source #

isBoolean :: Word16 -> Bool Source #

isBounded :: Word16 -> Bool Source #

isReal :: Word16 -> Bool Source #

isFloat :: Word16 -> Bool Source #

isDouble :: Word16 -> Bool Source #

isUnbounded :: Word16 -> Bool Source #

isUninterpreted :: Word16 -> Bool Source #

isChar :: Word16 -> Bool Source #

isString :: Word16 -> Bool Source #

isList :: Word16 -> Bool Source #

isSet :: Word16 -> Bool Source #

isTuple :: Word16 -> Bool Source #

isMaybe :: Word16 -> Bool Source #

isEither :: Word16 -> Bool Source #

showType :: Word16 -> String Source #

HasKind Word32 Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Word32 -> Kind Source #

hasSign :: Word32 -> Bool Source #

intSizeOf :: Word32 -> Int Source #

isBoolean :: Word32 -> Bool Source #

isBounded :: Word32 -> Bool Source #

isReal :: Word32 -> Bool Source #

isFloat :: Word32 -> Bool Source #

isDouble :: Word32 -> Bool Source #

isUnbounded :: Word32 -> Bool Source #

isUninterpreted :: Word32 -> Bool Source #

isChar :: Word32 -> Bool Source #

isString :: Word32 -> Bool Source #

isList :: Word32 -> Bool Source #

isSet :: Word32 -> Bool Source #

isTuple :: Word32 -> Bool Source #

isMaybe :: Word32 -> Bool Source #

isEither :: Word32 -> Bool Source #

showType :: Word32 -> String Source #

HasKind Word64 Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Word64 -> Kind Source #

hasSign :: Word64 -> Bool Source #

intSizeOf :: Word64 -> Int Source #

isBoolean :: Word64 -> Bool Source #

isBounded :: Word64 -> Bool Source #

isReal :: Word64 -> Bool Source #

isFloat :: Word64 -> Bool Source #

isDouble :: Word64 -> Bool Source #

isUnbounded :: Word64 -> Bool Source #

isUninterpreted :: Word64 -> Bool Source #

isChar :: Word64 -> Bool Source #

isString :: Word64 -> Bool Source #

isList :: Word64 -> Bool Source #

isSet :: Word64 -> Bool Source #

isTuple :: Word64 -> Bool Source #

isMaybe :: Word64 -> Bool Source #

isEither :: Word64 -> Bool Source #

showType :: Word64 -> String Source #

HasKind () Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: () -> Kind Source #

hasSign :: () -> Bool Source #

intSizeOf :: () -> Int Source #

isBoolean :: () -> Bool Source #

isBounded :: () -> Bool Source #

isReal :: () -> Bool Source #

isFloat :: () -> Bool Source #

isDouble :: () -> Bool Source #

isUnbounded :: () -> Bool Source #

isUninterpreted :: () -> Bool Source #

isChar :: () -> Bool Source #

isString :: () -> Bool Source #

isList :: () -> Bool Source #

isSet :: () -> Bool Source #

isTuple :: () -> Bool Source #

isMaybe :: () -> Bool Source #

isEither :: () -> Bool Source #

showType :: () -> String Source #

HasKind AlgReal Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: AlgReal -> Kind Source #

hasSign :: AlgReal -> Bool Source #

intSizeOf :: AlgReal -> Int Source #

isBoolean :: AlgReal -> Bool Source #

isBounded :: AlgReal -> Bool Source #

isReal :: AlgReal -> Bool Source #

isFloat :: AlgReal -> Bool Source #

isDouble :: AlgReal -> Bool Source #

isUnbounded :: AlgReal -> Bool Source #

isUninterpreted :: AlgReal -> Bool Source #

isChar :: AlgReal -> Bool Source #

isString :: AlgReal -> Bool Source #

isList :: AlgReal -> Bool Source #

isSet :: AlgReal -> Bool Source #

isTuple :: AlgReal -> Bool Source #

isMaybe :: AlgReal -> Bool Source #

isEither :: AlgReal -> Bool Source #

showType :: AlgReal -> String Source #

HasKind Kind Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Kind -> Kind Source #

hasSign :: Kind -> Bool Source #

intSizeOf :: Kind -> Int Source #

isBoolean :: Kind -> Bool Source #

isBounded :: Kind -> Bool Source #

isReal :: Kind -> Bool Source #

isFloat :: Kind -> Bool Source #

isDouble :: Kind -> Bool Source #

isUnbounded :: Kind -> Bool Source #

isUninterpreted :: Kind -> Bool Source #

isChar :: Kind -> Bool Source #

isString :: Kind -> Bool Source #

isList :: Kind -> Bool Source #

isSet :: Kind -> Bool Source #

isTuple :: Kind -> Bool Source #

isMaybe :: Kind -> Bool Source #

isEither :: Kind -> Bool Source #

showType :: Kind -> String Source #

HasKind ExtCV Source # | Kind instance for Extended CV

Instance details

Defined in Data.SBV.Core.Concrete

Methods

kindOf :: ExtCV -> Kind Source #

hasSign :: ExtCV -> Bool Source #

intSizeOf :: ExtCV -> Int Source #

isBoolean :: ExtCV -> Bool Source #

isBounded :: ExtCV -> Bool Source #

isReal :: ExtCV -> Bool Source #

isFloat :: ExtCV -> Bool Source #

isDouble :: ExtCV -> Bool Source #

isUnbounded :: ExtCV -> Bool Source #

isUninterpreted :: ExtCV -> Bool Source #

isChar :: ExtCV -> Bool Source #

isString :: ExtCV -> Bool Source #

isList :: ExtCV -> Bool Source #

isSet :: ExtCV -> Bool Source #

isTuple :: ExtCV -> Bool Source #

isMaybe :: ExtCV -> Bool Source #

isEither :: ExtCV -> Bool Source #

showType :: ExtCV -> String Source #

HasKind GeneralizedCV Source # | `Kind` instance for generalized CV

Instance details

Defined in Data.SBV.Core.Concrete

Methods

kindOf :: GeneralizedCV -> Kind Source #

hasSign :: GeneralizedCV -> Bool Source #

intSizeOf :: GeneralizedCV -> Int Source #

isBoolean :: GeneralizedCV -> Bool Source #

isBounded :: GeneralizedCV -> Bool Source #

isReal :: GeneralizedCV -> Bool Source #

isFloat :: GeneralizedCV -> Bool Source #

isDouble :: GeneralizedCV -> Bool Source #

isUnbounded :: GeneralizedCV -> Bool Source #

isUninterpreted :: GeneralizedCV -> Bool Source #

isChar :: GeneralizedCV -> Bool Source #

isString :: GeneralizedCV -> Bool Source #

isList :: GeneralizedCV -> Bool Source #

isSet :: GeneralizedCV -> Bool Source #

isTuple :: GeneralizedCV -> Bool Source #

isMaybe :: GeneralizedCV -> Bool Source #

isEither :: GeneralizedCV -> Bool Source #

showType :: GeneralizedCV -> String Source #

HasKind CV Source # | `Kind` instance for CV

Instance details

Defined in Data.SBV.Core.Concrete

Methods

kindOf :: CV -> Kind Source #

hasSign :: CV -> Bool Source #

intSizeOf :: CV -> Int Source #

isBoolean :: CV -> Bool Source #

isBounded :: CV -> Bool Source #

isReal :: CV -> Bool Source #

isFloat :: CV -> Bool Source #

isDouble :: CV -> Bool Source #

isUnbounded :: CV -> Bool Source #

isUninterpreted :: CV -> Bool Source #

isChar :: CV -> Bool Source #

isString :: CV -> Bool Source #

isList :: CV -> Bool Source #

isSet :: CV -> Bool Source #

isTuple :: CV -> Bool Source #

isMaybe :: CV -> Bool Source #

isEither :: CV -> Bool Source #

showType :: CV -> String Source #

HasKind RoundingMode Source # | `RoundingMode` kind

Instance details

Defined in Data.SBV.Core.Symbolic

Methods

kindOf :: RoundingMode -> Kind Source #

hasSign :: RoundingMode -> Bool Source #

intSizeOf :: RoundingMode -> Int Source #

isBoolean :: RoundingMode -> Bool Source #

isBounded :: RoundingMode -> Bool Source #

isReal :: RoundingMode -> Bool Source #

isFloat :: RoundingMode -> Bool Source #

isDouble :: RoundingMode -> Bool Source #

isUnbounded :: RoundingMode -> Bool Source #

isUninterpreted :: RoundingMode -> Bool Source #

isChar :: RoundingMode -> Bool Source #

isString :: RoundingMode -> Bool Source #

isList :: RoundingMode -> Bool Source #

isSet :: RoundingMode -> Bool Source #

isTuple :: RoundingMode -> Bool Source #

isMaybe :: RoundingMode -> Bool Source #

isEither :: RoundingMode -> Bool Source #

showType :: RoundingMode -> String Source #

HasKind SVal Source # |

Instance details

Defined in Data.SBV.Core.Symbolic

Methods

kindOf :: SVal -> Kind Source #

hasSign :: SVal -> Bool Source #

intSizeOf :: SVal -> Int Source #

isBoolean :: SVal -> Bool Source #

isBounded :: SVal -> Bool Source #

isReal :: SVal -> Bool Source #

isFloat :: SVal -> Bool Source #

isDouble :: SVal -> Bool Source #

isUnbounded :: SVal -> Bool Source #

isUninterpreted :: SVal -> Bool Source #

isChar :: SVal -> Bool Source #

isString :: SVal -> Bool Source #

isList :: SVal -> Bool Source #

isSet :: SVal -> Bool Source #

isTuple :: SVal -> Bool Source #

isMaybe :: SVal -> Bool Source #

isEither :: SVal -> Bool Source #

showType :: SVal -> String Source #

HasKind SV Source # |

Instance details

Defined in Data.SBV.Core.Symbolic

Methods

kindOf :: SV -> Kind Source #

hasSign :: SV -> Bool Source #

intSizeOf :: SV -> Int Source #

isBoolean :: SV -> Bool Source #

isBounded :: SV -> Bool Source #

isReal :: SV -> Bool Source #

isFloat :: SV -> Bool Source #

isDouble :: SV -> Bool Source #

isUnbounded :: SV -> Bool Source #

isUninterpreted :: SV -> Bool Source #

isChar :: SV -> Bool Source #

isString :: SV -> Bool Source #

isList :: SV -> Bool Source #

isSet :: SV -> Bool Source #

isTuple :: SV -> Bool Source #

isMaybe :: SV -> Bool Source #

isEither :: SV -> Bool Source #

showType :: SV -> String Source #

HasKind State Source # |

Instance details

Defined in Documentation.SBV.Examples.Lists.BoundedMutex

Methods

kindOf :: State -> Kind Source #

hasSign :: State -> Bool Source #

intSizeOf :: State -> Int Source #

isBoolean :: State -> Bool Source #

isBounded :: State -> Bool Source #

isReal :: State -> Bool Source #

isFloat :: State -> Bool Source #

isDouble :: State -> Bool Source #

isUnbounded :: State -> Bool Source #

isUninterpreted :: State -> Bool Source #

isChar :: State -> Bool Source #

isString :: State -> Bool Source #

isList :: State -> Bool Source #

isSet :: State -> Bool Source #

isTuple :: State -> Bool Source #

isMaybe :: State -> Bool Source #

isEither :: State -> Bool Source #

showType :: State -> String Source #

HasKind E Source # |

Instance details

Defined in Documentation.SBV.Examples.Misc.Enumerate

Methods

kindOf :: E -> Kind Source #

hasSign :: E -> Bool Source #

intSizeOf :: E -> Int Source #

isBoolean :: E -> Bool Source #

isBounded :: E -> Bool Source #

isReal :: E -> Bool Source #

isFloat :: E -> Bool Source #

isDouble :: E -> Bool Source #

isUnbounded :: E -> Bool Source #

isUninterpreted :: E -> Bool Source #

isChar :: E -> Bool Source #

isString :: E -> Bool Source #

isList :: E -> Bool Source #

isSet :: E -> Bool Source #

isTuple :: E -> Bool Source #

isMaybe :: E -> Bool Source #

isEither :: E -> Bool Source #

showType :: E -> String Source #

HasKind HumanHeightInCm Source # | Symbolic instance simply follows the underlying type, just like `Metres`.

Instance details

Defined in Documentation.SBV.Examples.Misc.Newtypes

Methods

kindOf :: HumanHeightInCm -> Kind Source #

hasSign :: HumanHeightInCm -> Bool Source #

intSizeOf :: HumanHeightInCm -> Int Source #

isBoolean :: HumanHeightInCm -> Bool Source #

isBounded :: HumanHeightInCm -> Bool Source #

isReal :: HumanHeightInCm -> Bool Source #

isFloat :: HumanHeightInCm -> Bool Source #

isDouble :: HumanHeightInCm -> Bool Source #

isUnbounded :: HumanHeightInCm -> Bool Source #

isUninterpreted :: HumanHeightInCm -> Bool Source #

isChar :: HumanHeightInCm -> Bool Source #

isString :: HumanHeightInCm -> Bool Source #

isList :: HumanHeightInCm -> Bool Source #

isSet :: HumanHeightInCm -> Bool Source #

isTuple :: HumanHeightInCm -> Bool Source #

isMaybe :: HumanHeightInCm -> Bool Source #

isEither :: HumanHeightInCm -> Bool Source #

showType :: HumanHeightInCm -> String Source #

HasKind Metres Source # | To use `Metres` symbolically, we associate it with the underlying symbolic type's kind.

Instance details

Defined in Documentation.SBV.Examples.Misc.Newtypes

Methods

kindOf :: Metres -> Kind Source #

hasSign :: Metres -> Bool Source #

intSizeOf :: Metres -> Int Source #

isBoolean :: Metres -> Bool Source #

isBounded :: Metres -> Bool Source #

isReal :: Metres -> Bool Source #

isFloat :: Metres -> Bool Source #

isDouble :: Metres -> Bool Source #

isUnbounded :: Metres -> Bool Source #

isUninterpreted :: Metres -> Bool Source #

isChar :: Metres -> Bool Source #

isString :: Metres -> Bool Source #

isList :: Metres -> Bool Source #

isSet :: Metres -> Bool Source #

isTuple :: Metres -> Bool Source #

isMaybe :: Metres -> Bool Source #

isEither :: Metres -> Bool Source #

showType :: Metres -> String Source #

HasKind Day Source # |

Instance details

Defined in Documentation.SBV.Examples.Optimization.Enumerate

Methods

kindOf :: Day -> Kind Source #

hasSign :: Day -> Bool Source #

intSizeOf :: Day -> Int Source #

isBoolean :: Day -> Bool Source #

isBounded :: Day -> Bool Source #

isReal :: Day -> Bool Source #

isFloat :: Day -> Bool Source #

isDouble :: Day -> Bool Source #

isUnbounded :: Day -> Bool Source #

isUninterpreted :: Day -> Bool Source #

isChar :: Day -> Bool Source #

isString :: Day -> Bool Source #

isList :: Day -> Bool Source #

isSet :: Day -> Bool Source #

isTuple :: Day -> Bool Source #

isMaybe :: Day -> Bool Source #

isEither :: Day -> Bool Source #

showType :: Day -> String Source #

HasKind Color Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.Fish

Methods

kindOf :: Color -> Kind Source #

hasSign :: Color -> Bool Source #

intSizeOf :: Color -> Int Source #

isBoolean :: Color -> Bool Source #

isBounded :: Color -> Bool Source #

isReal :: Color -> Bool Source #

isFloat :: Color -> Bool Source #

isDouble :: Color -> Bool Source #

isUnbounded :: Color -> Bool Source #

isUninterpreted :: Color -> Bool Source #

isChar :: Color -> Bool Source #

isString :: Color -> Bool Source #

isList :: Color -> Bool Source #

isSet :: Color -> Bool Source #

isTuple :: Color -> Bool Source #

isMaybe :: Color -> Bool Source #

isEither :: Color -> Bool Source #

showType :: Color -> String Source #

HasKind Nationality Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.Fish

Methods

kindOf :: Nationality -> Kind Source #

hasSign :: Nationality -> Bool Source #

intSizeOf :: Nationality -> Int Source #

isBoolean :: Nationality -> Bool Source #

isBounded :: Nationality -> Bool Source #

isReal :: Nationality -> Bool Source #

isFloat :: Nationality -> Bool Source #

isDouble :: Nationality -> Bool Source #

isUnbounded :: Nationality -> Bool Source #

isUninterpreted :: Nationality -> Bool Source #

isChar :: Nationality -> Bool Source #

isString :: Nationality -> Bool Source #

isList :: Nationality -> Bool Source #

isSet :: Nationality -> Bool Source #

isTuple :: Nationality -> Bool Source #

isMaybe :: Nationality -> Bool Source #

isEither :: Nationality -> Bool Source #

showType :: Nationality -> String Source #

HasKind Beverage Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.Fish

Methods

kindOf :: Beverage -> Kind Source #

hasSign :: Beverage -> Bool Source #

intSizeOf :: Beverage -> Int Source #

isBoolean :: Beverage -> Bool Source #

isBounded :: Beverage -> Bool Source #

isReal :: Beverage -> Bool Source #

isFloat :: Beverage -> Bool Source #

isDouble :: Beverage -> Bool Source #

isUnbounded :: Beverage -> Bool Source #

isUninterpreted :: Beverage -> Bool Source #

isChar :: Beverage -> Bool Source #

isString :: Beverage -> Bool Source #

isList :: Beverage -> Bool Source #

isSet :: Beverage -> Bool Source #

isTuple :: Beverage -> Bool Source #

isMaybe :: Beverage -> Bool Source #

isEither :: Beverage -> Bool Source #

showType :: Beverage -> String Source #

HasKind Pet Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.Fish

Methods

kindOf :: Pet -> Kind Source #

hasSign :: Pet -> Bool Source #

intSizeOf :: Pet -> Int Source #

isBoolean :: Pet -> Bool Source #

isBounded :: Pet -> Bool Source #

isReal :: Pet -> Bool Source #

isFloat :: Pet -> Bool Source #

isDouble :: Pet -> Bool Source #

isUnbounded :: Pet -> Bool Source #

isUninterpreted :: Pet -> Bool Source #

isChar :: Pet -> Bool Source #

isString :: Pet -> Bool Source #

isList :: Pet -> Bool Source #

isSet :: Pet -> Bool Source #

isTuple :: Pet -> Bool Source #

isMaybe :: Pet -> Bool Source #

isEither :: Pet -> Bool Source #

showType :: Pet -> String Source #

HasKind Sport Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.Fish

Methods

kindOf :: Sport -> Kind Source #

hasSign :: Sport -> Bool Source #

intSizeOf :: Sport -> Int Source #

isBoolean :: Sport -> Bool Source #

isBounded :: Sport -> Bool Source #

isReal :: Sport -> Bool Source #

isFloat :: Sport -> Bool Source #

isDouble :: Sport -> Bool Source #

isUnbounded :: Sport -> Bool Source #

isUninterpreted :: Sport -> Bool Source #

isChar :: Sport -> Bool Source #

isString :: Sport -> Bool Source #

isList :: Sport -> Bool Source #

isSet :: Sport -> Bool Source #

isTuple :: Sport -> Bool Source #

isMaybe :: Sport -> Bool Source #

isEither :: Sport -> Bool Source #

showType :: Sport -> String Source #

HasKind Color Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.Garden

Methods

kindOf :: Color -> Kind Source #

hasSign :: Color -> Bool Source #

intSizeOf :: Color -> Int Source #

isBoolean :: Color -> Bool Source #

isBounded :: Color -> Bool Source #

isReal :: Color -> Bool Source #

isFloat :: Color -> Bool Source #

isDouble :: Color -> Bool Source #

isUnbounded :: Color -> Bool Source #

isUninterpreted :: Color -> Bool Source #

isChar :: Color -> Bool Source #

isString :: Color -> Bool Source #

isList :: Color -> Bool Source #

isSet :: Color -> Bool Source #

isTuple :: Color -> Bool Source #

isMaybe :: Color -> Bool Source #

isEither :: Color -> Bool Source #

showType :: Color -> String Source #

HasKind Color Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.HexPuzzle

Methods

kindOf :: Color -> Kind Source #

hasSign :: Color -> Bool Source #

intSizeOf :: Color -> Int Source #

isBoolean :: Color -> Bool Source #

isBounded :: Color -> Bool Source #

isReal :: Color -> Bool Source #

isFloat :: Color -> Bool Source #

isDouble :: Color -> Bool Source #

isUnbounded :: Color -> Bool Source #

isUninterpreted :: Color -> Bool Source #

isChar :: Color -> Bool Source #

isString :: Color -> Bool Source #

isList :: Color -> Bool Source #

isSet :: Color -> Bool Source #

isTuple :: Color -> Bool Source #

isMaybe :: Color -> Bool Source #

isEither :: Color -> Bool Source #

showType :: Color -> String Source #

HasKind U2Member Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.U2Bridge

Methods

kindOf :: U2Member -> Kind Source #

hasSign :: U2Member -> Bool Source #

intSizeOf :: U2Member -> Int Source #

isBoolean :: U2Member -> Bool Source #

isBounded :: U2Member -> Bool Source #

isReal :: U2Member -> Bool Source #

isFloat :: U2Member -> Bool Source #

isDouble :: U2Member -> Bool Source #

isUnbounded :: U2Member -> Bool Source #

isUninterpreted :: U2Member -> Bool Source #

isChar :: U2Member -> Bool Source #

isString :: U2Member -> Bool Source #

isList :: U2Member -> Bool Source #

isSet :: U2Member -> Bool Source #

isTuple :: U2Member -> Bool Source #

isMaybe :: U2Member -> Bool Source #

isEither :: U2Member -> Bool Source #

showType :: U2Member -> String Source #

HasKind Location Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.U2Bridge

Methods

kindOf :: Location -> Kind Source #

hasSign :: Location -> Bool Source #

intSizeOf :: Location -> Int Source #

isBoolean :: Location -> Bool Source #

isBounded :: Location -> Bool Source #

isReal :: Location -> Bool Source #

isFloat :: Location -> Bool Source #

isDouble :: Location -> Bool Source #

isUnbounded :: Location -> Bool Source #

isUninterpreted :: Location -> Bool Source #

isChar :: Location -> Bool Source #

isString :: Location -> Bool Source #

isList :: Location -> Bool Source #

isSet :: Location -> Bool Source #

isTuple :: Location -> Bool Source #

isMaybe :: Location -> Bool Source #

isEither :: Location -> Bool Source #

showType :: Location -> String Source #

HasKind Day Source # |

Instance details

Defined in Documentation.SBV.Examples.Queries.Enums

Methods

kindOf :: Day -> Kind Source #

hasSign :: Day -> Bool Source #

intSizeOf :: Day -> Int Source #

isBoolean :: Day -> Bool Source #

isBounded :: Day -> Bool Source #

isReal :: Day -> Bool Source #

isFloat :: Day -> Bool Source #

isDouble :: Day -> Bool Source #

isUnbounded :: Day -> Bool Source #

isUninterpreted :: Day -> Bool Source #

isChar :: Day -> Bool Source #

isString :: Day -> Bool Source #

isList :: Day -> Bool Source #

isSet :: Day -> Bool Source #

isTuple :: Day -> Bool Source #

isMaybe :: Day -> Bool Source #

isEither :: Day -> Bool Source #

showType :: Day -> String Source #

HasKind BinOp Source # |

Instance details

Defined in Documentation.SBV.Examples.Queries.FourFours

Methods

kindOf :: BinOp -> Kind Source #

hasSign :: BinOp -> Bool Source #

intSizeOf :: BinOp -> Int Source #

isBoolean :: BinOp -> Bool Source #

isBounded :: BinOp -> Bool Source #

isReal :: BinOp -> Bool Source #

isFloat :: BinOp -> Bool Source #

isDouble :: BinOp -> Bool Source #

isUnbounded :: BinOp -> Bool Source #

isUninterpreted :: BinOp -> Bool Source #

isChar :: BinOp -> Bool Source #

isString :: BinOp -> Bool Source #

isList :: BinOp -> Bool Source #

isSet :: BinOp -> Bool Source #

isTuple :: BinOp -> Bool Source #

isMaybe :: BinOp -> Bool Source #

isEither :: BinOp -> Bool Source #

showType :: BinOp -> String Source #

HasKind UnOp Source # |

Instance details

Defined in Documentation.SBV.Examples.Queries.FourFours

Methods

kindOf :: UnOp -> Kind Source #

hasSign :: UnOp -> Bool Source #

intSizeOf :: UnOp -> Int Source #

isBoolean :: UnOp -> Bool Source #

isBounded :: UnOp -> Bool Source #

isReal :: UnOp -> Bool Source #

isFloat :: UnOp -> Bool Source #

isDouble :: UnOp -> Bool Source #

isUnbounded :: UnOp -> Bool Source #

isUninterpreted :: UnOp -> Bool Source #

isChar :: UnOp -> Bool Source #

isString :: UnOp -> Bool Source #

isList :: UnOp -> Bool Source #

isSet :: UnOp -> Bool Source #

isTuple :: UnOp -> Bool Source #

isMaybe :: UnOp -> Bool Source #

isEither :: UnOp -> Bool Source #

showType :: UnOp -> String Source #

HasKind B Source # |

Instance details

Defined in Documentation.SBV.Examples.Uninterpreted.Deduce

Methods

kindOf :: B -> Kind Source #

hasSign :: B -> Bool Source #

intSizeOf :: B -> Int Source #

isBoolean :: B -> Bool Source #

isBounded :: B -> Bool Source #

isReal :: B -> Bool Source #

isFloat :: B -> Bool Source #

isDouble :: B -> Bool Source #

isUnbounded :: B -> Bool Source #

isUninterpreted :: B -> Bool Source #

isChar :: B -> Bool Source #

isString :: B -> Bool Source #

isList :: B -> Bool Source #

isSet :: B -> Bool Source #

isTuple :: B -> Bool Source #

isMaybe :: B -> Bool Source #

isEither :: B -> Bool Source #

showType :: B -> String Source #

HasKind Q Source # |

Instance details

Defined in Documentation.SBV.Examples.Uninterpreted.Sort

Methods

kindOf :: Q -> Kind Source #

hasSign :: Q -> Bool Source #

intSizeOf :: Q -> Int Source #

isBoolean :: Q -> Bool Source #

isBounded :: Q -> Bool Source #

isReal :: Q -> Bool Source #

isFloat :: Q -> Bool Source #

isDouble :: Q -> Bool Source #

isUnbounded :: Q -> Bool Source #

isUninterpreted :: Q -> Bool Source #

isChar :: Q -> Bool Source #

isString :: Q -> Bool Source #

isList :: Q -> Bool Source #

isSet :: Q -> Bool Source #

isTuple :: Q -> Bool Source #

isMaybe :: Q -> Bool Source #

isEither :: Q -> Bool Source #

showType :: Q -> String Source #

HasKind L Source # | Similarly, `HasKind`s default implementation is sufficient.

Instance details

Defined in Documentation.SBV.Examples.Uninterpreted.UISortAllSat

Methods

kindOf :: L -> Kind Source #

hasSign :: L -> Bool Source #

intSizeOf :: L -> Int Source #

isBoolean :: L -> Bool Source #

isBounded :: L -> Bool Source #

isReal :: L -> Bool Source #

isFloat :: L -> Bool Source #

isDouble :: L -> Bool Source #

isUnbounded :: L -> Bool Source #

isUninterpreted :: L -> Bool Source #

isChar :: L -> Bool Source #

isString :: L -> Bool Source #

isList :: L -> Bool Source #

isSet :: L -> Bool Source #

isTuple :: L -> Bool Source #

isMaybe :: L -> Bool Source #

isEither :: L -> Bool Source #

showType :: L -> String Source #

(Typeable a, HasKind a) => HasKind [a] Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: [a] -> Kind Source #

hasSign :: [a] -> Bool Source #

intSizeOf :: [a] -> Int Source #

isBoolean :: [a] -> Bool Source #

isBounded :: [a] -> Bool Source #

isReal :: [a] -> Bool Source #

isFloat :: [a] -> Bool Source #

isDouble :: [a] -> Bool Source #

isUnbounded :: [a] -> Bool Source #

isUninterpreted :: [a] -> Bool Source #

isChar :: [a] -> Bool Source #

isString :: [a] -> Bool Source #

isList :: [a] -> Bool Source #

isSet :: [a] -> Bool Source #

isTuple :: [a] -> Bool Source #

isMaybe :: [a] -> Bool Source #

isEither :: [a] -> Bool Source #

showType :: [a] -> String Source #

HasKind a => HasKind (Maybe a) Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Maybe a -> Kind Source #

hasSign :: Maybe a -> Bool Source #

intSizeOf :: Maybe a -> Int Source #

isBoolean :: Maybe a -> Bool Source #

isBounded :: Maybe a -> Bool Source #

isReal :: Maybe a -> Bool Source #

isFloat :: Maybe a -> Bool Source #

isDouble :: Maybe a -> Bool Source #

isUnbounded :: Maybe a -> Bool Source #

isUninterpreted :: Maybe a -> Bool Source #

isChar :: Maybe a -> Bool Source #

isString :: Maybe a -> Bool Source #

isList :: Maybe a -> Bool Source #

isSet :: Maybe a -> Bool Source #

isTuple :: Maybe a -> Bool Source #

isMaybe :: Maybe a -> Bool Source #

isEither :: Maybe a -> Bool Source #

showType :: Maybe a -> String Source #

HasKind a => HasKind (RCSet a) Source # |

Instance details

Defined in Data.SBV.Core.Concrete

Methods

kindOf :: RCSet a -> Kind Source #

hasSign :: RCSet a -> Bool Source #

intSizeOf :: RCSet a -> Int Source #

isBoolean :: RCSet a -> Bool Source #

isBounded :: RCSet a -> Bool Source #

isReal :: RCSet a -> Bool Source #

isFloat :: RCSet a -> Bool Source #

isDouble :: RCSet a -> Bool Source #

isUnbounded :: RCSet a -> Bool Source #

isUninterpreted :: RCSet a -> Bool Source #

isChar :: RCSet a -> Bool Source #

isString :: RCSet a -> Bool Source #

isList :: RCSet a -> Bool Source #

isSet :: RCSet a -> Bool Source #

isTuple :: RCSet a -> Bool Source #

isMaybe :: RCSet a -> Bool Source #

isEither :: RCSet a -> Bool Source #

showType :: RCSet a -> String Source #

HasKind a => HasKind (SBV a) Source # |

Instance details

Defined in Data.SBV.Core.Data

Methods

kindOf :: SBV a -> Kind Source #

hasSign :: SBV a -> Bool Source #

intSizeOf :: SBV a -> Int Source #

isBoolean :: SBV a -> Bool Source #

isBounded :: SBV a -> Bool Source #

isReal :: SBV a -> Bool Source #

isFloat :: SBV a -> Bool Source #

isDouble :: SBV a -> Bool Source #

isUnbounded :: SBV a -> Bool Source #

isUninterpreted :: SBV a -> Bool Source #

isChar :: SBV a -> Bool Source #

isString :: SBV a -> Bool Source #

isList :: SBV a -> Bool Source #

isSet :: SBV a -> Bool Source #

isTuple :: SBV a -> Bool Source #

isMaybe :: SBV a -> Bool Source #

isEither :: SBV a -> Bool Source #

showType :: SBV a -> String Source #

(KnownNat n, IsNonZero n) => HasKind (IntN n) Source # | `IntN` has a kind

Instance details

Defined in Data.SBV.Core.Sized

Methods

kindOf :: IntN n -> Kind Source #

hasSign :: IntN n -> Bool Source #

intSizeOf :: IntN n -> Int Source #

isBoolean :: IntN n -> Bool Source #

isBounded :: IntN n -> Bool Source #

isReal :: IntN n -> Bool Source #

isFloat :: IntN n -> Bool Source #

isDouble :: IntN n -> Bool Source #

isUnbounded :: IntN n -> Bool Source #

isUninterpreted :: IntN n -> Bool Source #

isChar :: IntN n -> Bool Source #

isString :: IntN n -> Bool Source #

isList :: IntN n -> Bool Source #

isSet :: IntN n -> Bool Source #

isTuple :: IntN n -> Bool Source #

isMaybe :: IntN n -> Bool Source #

isEither :: IntN n -> Bool Source #

showType :: IntN n -> String Source #

(KnownNat n, IsNonZero n) => HasKind (WordN n) Source # | `WordN` has a kind

Instance details

Defined in Data.SBV.Core.Sized

Methods

kindOf :: WordN n -> Kind Source #

hasSign :: WordN n -> Bool Source #

intSizeOf :: WordN n -> Int Source #

isBoolean :: WordN n -> Bool Source #

isBounded :: WordN n -> Bool Source #

isReal :: WordN n -> Bool Source #

isFloat :: WordN n -> Bool Source #

isDouble :: WordN n -> Bool Source #

isUnbounded :: WordN n -> Bool Source #

isUninterpreted :: WordN n -> Bool Source #

isChar :: WordN n -> Bool Source #

isString :: WordN n -> Bool Source #

isList :: WordN n -> Bool Source #

isSet :: WordN n -> Bool Source #

isTuple :: WordN n -> Bool Source #

isMaybe :: WordN n -> Bool Source #

isEither :: WordN n -> Bool Source #

showType :: WordN n -> String Source #

(HasKind a, HasKind b) => HasKind (Either a b) Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Either a b -> Kind Source #

hasSign :: Either a b -> Bool Source #

intSizeOf :: Either a b -> Int Source #

isBoolean :: Either a b -> Bool Source #

isBounded :: Either a b -> Bool Source #

isReal :: Either a b -> Bool Source #

isFloat :: Either a b -> Bool Source #

isDouble :: Either a b -> Bool Source #

isUnbounded :: Either a b -> Bool Source #

isUninterpreted :: Either a b -> Bool Source #

isChar :: Either a b -> Bool Source #

isString :: Either a b -> Bool Source #

isList :: Either a b -> Bool Source #

isSet :: Either a b -> Bool Source #

isTuple :: Either a b -> Bool Source #

isMaybe :: Either a b -> Bool Source #

isEither :: Either a b -> Bool Source #

showType :: Either a b -> String Source #

(HasKind a, HasKind b) => HasKind (a, b) Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: (a, b) -> Kind Source #

hasSign :: (a, b) -> Bool Source #

intSizeOf :: (a, b) -> Int Source #

isBoolean :: (a, b) -> Bool Source #

isBounded :: (a, b) -> Bool Source #

isReal :: (a, b) -> Bool Source #

isFloat :: (a, b) -> Bool Source #

isDouble :: (a, b) -> Bool Source #

isUnbounded :: (a, b) -> Bool Source #

isUninterpreted :: (a, b) -> Bool Source #

isChar :: (a, b) -> Bool Source #

isString :: (a, b) -> Bool Source #

isList :: (a, b) -> Bool Source #

isSet :: (a, b) -> Bool Source #

isTuple :: (a, b) -> Bool Source #

isMaybe :: (a, b) -> Bool Source #

isEither :: (a, b) -> Bool Source #

showType :: (a, b) -> String Source #

HasKind a => HasKind (Proxy a) Source # | This instance allows us to use the `kindOf (Proxy @a)` idiom instead of the `kindOf (undefined :: a)`, which is safer and looks more idiomatic.

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Proxy a -> Kind Source #

hasSign :: Proxy a -> Bool Source #

intSizeOf :: Proxy a -> Int Source #

isBoolean :: Proxy a -> Bool Source #

isBounded :: Proxy a -> Bool Source #

isReal :: Proxy a -> Bool Source #

isFloat :: Proxy a -> Bool Source #

isDouble :: Proxy a -> Bool Source #

isUnbounded :: Proxy a -> Bool Source #

isUninterpreted :: Proxy a -> Bool Source #

isChar :: Proxy a -> Bool Source #

isString :: Proxy a -> Bool Source #

isList :: Proxy a -> Bool Source #

isSet :: Proxy a -> Bool Source #

isTuple :: Proxy a -> Bool Source #

isMaybe :: Proxy a -> Bool Source #

isEither :: Proxy a -> Bool Source #

showType :: Proxy a -> String Source #

(HasKind a, HasKind b, HasKind c) => HasKind (a, b, c) Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: (a, b, c) -> Kind Source #

hasSign :: (a, b, c) -> Bool Source #

intSizeOf :: (a, b, c) -> Int Source #

isBoolean :: (a, b, c) -> Bool Source #

isBounded :: (a, b, c) -> Bool Source #

isReal :: (a, b, c) -> Bool Source #

isFloat :: (a, b, c) -> Bool Source #

isDouble :: (a, b, c) -> Bool Source #

isUnbounded :: (a, b, c) -> Bool Source #

isUninterpreted :: (a, b, c) -> Bool Source #

isChar :: (a, b, c) -> Bool Source #

isString :: (a, b, c) -> Bool Source #

isList :: (a, b, c) -> Bool Source #

isSet :: (a, b, c) -> Bool Source #

isTuple :: (a, b, c) -> Bool Source #

isMaybe :: (a, b, c) -> Bool Source #

isEither :: (a, b, c) -> Bool Source #

showType :: (a, b, c) -> String Source #

(HasKind a, HasKind b, HasKind c, HasKind d) => HasKind (a, b, c, d) Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: (a, b, c, d) -> Kind Source #

hasSign :: (a, b, c, d) -> Bool Source #

intSizeOf :: (a, b, c, d) -> Int Source #

isBoolean :: (a, b, c, d) -> Bool Source #

isBounded :: (a, b, c, d) -> Bool Source #

isReal :: (a, b, c, d) -> Bool Source #

isFloat :: (a, b, c, d) -> Bool Source #

isDouble :: (a, b, c, d) -> Bool Source #

isUnbounded :: (a, b, c, d) -> Bool Source #

isUninterpreted :: (a, b, c, d) -> Bool Source #

isChar :: (a, b, c, d) -> Bool Source #

isString :: (a, b, c, d) -> Bool Source #

isList :: (a, b, c, d) -> Bool Source #

isSet :: (a, b, c, d) -> Bool Source #

isTuple :: (a, b, c, d) -> Bool Source #

isMaybe :: (a, b, c, d) -> Bool Source #

isEither :: (a, b, c, d) -> Bool Source #

showType :: (a, b, c, d) -> String Source #

(HasKind a, HasKind b, HasKind c, HasKind d, HasKind e) => HasKind (a, b, c, d, e) Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: (a, b, c, d, e) -> Kind Source #

hasSign :: (a, b, c, d, e) -> Bool Source #

intSizeOf :: (a, b, c, d, e) -> Int Source #

isBoolean :: (a, b, c, d, e) -> Bool Source #

isBounded :: (a, b, c, d, e) -> Bool Source #

isReal :: (a, b, c, d, e) -> Bool Source #

isFloat :: (a, b, c, d, e) -> Bool Source #

isDouble :: (a, b, c, d, e) -> Bool Source #

isUnbounded :: (a, b, c, d, e) -> Bool Source #

isUninterpreted :: (a, b, c, d, e) -> Bool Source #

isChar :: (a, b, c, d, e) -> Bool Source #

isString :: (a, b, c, d, e) -> Bool Source #

isList :: (a, b, c, d, e) -> Bool Source #

isSet :: (a, b, c, d, e) -> Bool Source #

isTuple :: (a, b, c, d, e) -> Bool Source #

isMaybe :: (a, b, c, d, e) -> Bool Source #

isEither :: (a, b, c, d, e) -> Bool Source #

showType :: (a, b, c, d, e) -> String Source #

(HasKind a, HasKind b, HasKind c, HasKind d, HasKind e, HasKind f) => HasKind (a, b, c, d, e, f) Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: (a, b, c, d, e, f) -> Kind Source #

hasSign :: (a, b, c, d, e, f) -> Bool Source #

intSizeOf :: (a, b, c, d, e, f) -> Int Source #

isBoolean :: (a, b, c, d, e, f) -> Bool Source #

isBounded :: (a, b, c, d, e, f) -> Bool Source #

isReal :: (a, b, c, d, e, f) -> Bool Source #

isFloat :: (a, b, c, d, e, f) -> Bool Source #

isDouble :: (a, b, c, d, e, f) -> Bool Source #

isUnbounded :: (a, b, c, d, e, f) -> Bool Source #

isUninterpreted :: (a, b, c, d, e, f) -> Bool Source #

isChar :: (a, b, c, d, e, f) -> Bool Source #

isString :: (a, b, c, d, e, f) -> Bool Source #

isList :: (a, b, c, d, e, f) -> Bool Source #

isSet :: (a, b, c, d, e, f) -> Bool Source #

isTuple :: (a, b, c, d, e, f) -> Bool Source #

isMaybe :: (a, b, c, d, e, f) -> Bool Source #

isEither :: (a, b, c, d, e, f) -> Bool Source #

showType :: (a, b, c, d, e, f) -> String Source #

(HasKind a, HasKind b, HasKind c, HasKind d, HasKind e, HasKind f, HasKind g) => HasKind (a, b, c, d, e, f, g) Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: (a, b, c, d, e, f, g) -> Kind Source #

hasSign :: (a, b, c, d, e, f, g) -> Bool Source #

intSizeOf :: (a, b, c, d, e, f, g) -> Int Source #

isBoolean :: (a, b, c, d, e, f, g) -> Bool Source #

isBounded :: (a, b, c, d, e, f, g) -> Bool Source #

isReal :: (a, b, c, d, e, f, g) -> Bool Source #

isFloat :: (a, b, c, d, e, f, g) -> Bool Source #

isDouble :: (a, b, c, d, e, f, g) -> Bool Source #

isUnbounded :: (a, b, c, d, e, f, g) -> Bool Source #

isUninterpreted :: (a, b, c, d, e, f, g) -> Bool Source #

isChar :: (a, b, c, d, e, f, g) -> Bool Source #

isString :: (a, b, c, d, e, f, g) -> Bool Source #

isList :: (a, b, c, d, e, f, g) -> Bool Source #

isSet :: (a, b, c, d, e, f, g) -> Bool Source #

isTuple :: (a, b, c, d, e, f, g) -> Bool Source #

isMaybe :: (a, b, c, d, e, f, g) -> Bool Source #

isEither :: (a, b, c, d, e, f, g) -> Bool Source #

showType :: (a, b, c, d, e, f, g) -> String Source #

(HasKind a, HasKind b, HasKind c, HasKind d, HasKind e, HasKind f, HasKind g, HasKind h) => HasKind (a, b, c, d, e, f, g, h) Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: (a, b, c, d, e, f, g, h) -> Kind Source #

hasSign :: (a, b, c, d, e, f, g, h) -> Bool Source #

intSizeOf :: (a, b, c, d, e, f, g, h) -> Int Source #

isBoolean :: (a, b, c, d, e, f, g, h) -> Bool Source #

isBounded :: (a, b, c, d, e, f, g, h) -> Bool Source #

isReal :: (a, b, c, d, e, f, g, h) -> Bool Source #

isFloat :: (a, b, c, d, e, f, g, h) -> Bool Source #

isDouble :: (a, b, c, d, e, f, g, h) -> Bool Source #

isUnbounded :: (a, b, c, d, e, f, g, h) -> Bool Source #

isUninterpreted :: (a, b, c, d, e, f, g, h) -> Bool Source #

isChar :: (a, b, c, d, e, f, g, h) -> Bool Source #

isString :: (a, b, c, d, e, f, g, h) -> Bool Source #

isList :: (a, b, c, d, e, f, g, h) -> Bool Source #

isSet :: (a, b, c, d, e, f, g, h) -> Bool Source #

isTuple :: (a, b, c, d, e, f, g, h) -> Bool Source #

isMaybe :: (a, b, c, d, e, f, g, h) -> Bool Source #

isEither :: (a, b, c, d, e, f, g, h) -> Bool Source #

showType :: (a, b, c, d, e, f, g, h) -> String Source #

data Kind Source #

Kind of symbolic value

Constructors

KBool |
KBounded !Bool !Int |
KUnbounded |
KReal |
KUninterpreted String (Either String [String]) |
KFloat |
KDouble |
KChar |
KString |
KList Kind |
KSet Kind |
KTuple [Kind] |
KMaybe Kind |
KEither Kind Kind |

#### Instances

Instances details

Eq Kind Source # |
Instance details Defined in Data.SBV.Core.Kind Methods (==) :: Kind -> Kind -> Bool (/=) :: Kind -> Kind -> Bool
Ord Kind Source # |
Instance details Defined in Data.SBV.Core.Kind Methods compare :: Kind -> Kind -> Ordering (<) :: Kind -> Kind -> Bool (<=) :: Kind -> Kind -> Bool (>) :: Kind -> Kind -> Bool (>=) :: Kind -> Kind -> Bool max :: Kind -> Kind -> Kind min :: Kind -> Kind -> Kind
Show Kind Source # | The interesting about the show instance is that it can tell apart two kinds nicely; since it conveniently ignores the enumeration constructors. Also, when we construct a `KUninterpreted`, we make sure we don't use any of the reserved names; see `constructUKind` for details.
Instance details Defined in Data.SBV.Core.Kind Methods showsPrec :: Int -> Kind -> ShowS show :: Kind -> String showList :: [Kind] -> ShowS
NFData Kind |
Instance details Defined in Data.SBV.Core.Symbolic Methods rnf :: Kind -> ()
HasKind Kind Source # |

Instance details

Defined in Data.SBV.Core.Kind

Methods

kindOf :: Kind -> Kind Source #

hasSign :: Kind -> Bool Source #

intSizeOf :: Kind -> Int Source #

isBoolean :: Kind -> Bool Source #

isBounded :: Kind -> Bool Source #

isReal :: Kind -> Bool Source #

isFloat :: Kind -> Bool Source #

isDouble :: Kind -> Bool Source #

isUnbounded :: Kind -> Bool Source #

isUninterpreted :: Kind -> Bool Source #

isChar :: Kind -> Bool Source #

isString :: Kind -> Bool Source #

isList :: Kind -> Bool Source #

isSet :: Kind -> Bool Source #

isTuple :: Kind -> Bool Source #

isMaybe :: Kind -> Bool Source #

isEither :: Kind -> Bool Source #

showType :: Kind -> String Source #

class (HasKind a, Typeable a) => SymVal a Source #

A `SymVal` is a potential symbolic value that can be created instances of to be fed to a symbolic program.

#### Instances

Instances details

SymVal Bool Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Bool) Source #

literal :: Bool -> SBV Bool Source #

fromCV :: CV -> Bool Source #

isConcretely :: SBV Bool -> (Bool -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Bool) Source #

forall_ :: MonadSymbolic m => m (SBV Bool) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Bool] Source #

exists :: MonadSymbolic m => String -> m (SBV Bool) Source #

exists_ :: MonadSymbolic m => m (SBV Bool) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Bool] Source #

free :: MonadSymbolic m => String -> m (SBV Bool) Source #

free_ :: MonadSymbolic m => m (SBV Bool) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Bool] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Bool) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Bool] Source #

unliteral :: SBV Bool -> Maybe Bool Source #

isConcrete :: SBV Bool -> Bool Source #

isSymbolic :: SBV Bool -> Bool Source #

SymVal Char Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Char) Source #

literal :: Char -> SBV Char Source #

fromCV :: CV -> Char Source #

isConcretely :: SBV Char -> (Char -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Char) Source #

forall_ :: MonadSymbolic m => m (SBV Char) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Char] Source #

exists :: MonadSymbolic m => String -> m (SBV Char) Source #

exists_ :: MonadSymbolic m => m (SBV Char) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Char] Source #

free :: MonadSymbolic m => String -> m (SBV Char) Source #

free_ :: MonadSymbolic m => m (SBV Char) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Char] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Char) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Char] Source #

unliteral :: SBV Char -> Maybe Char Source #

isConcrete :: SBV Char -> Bool Source #

isSymbolic :: SBV Char -> Bool Source #

SymVal Double Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Double) Source #

literal :: Double -> SBV Double Source #

fromCV :: CV -> Double Source #

isConcretely :: SBV Double -> (Double -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Double) Source #

forall_ :: MonadSymbolic m => m (SBV Double) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Double] Source #

exists :: MonadSymbolic m => String -> m (SBV Double) Source #

exists_ :: MonadSymbolic m => m (SBV Double) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Double] Source #

free :: MonadSymbolic m => String -> m (SBV Double) Source #

free_ :: MonadSymbolic m => m (SBV Double) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Double] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Double) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Double] Source #

unliteral :: SBV Double -> Maybe Double Source #

isConcrete :: SBV Double -> Bool Source #

isSymbolic :: SBV Double -> Bool Source #

SymVal Float Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Float) Source #

literal :: Float -> SBV Float Source #

fromCV :: CV -> Float Source #

isConcretely :: SBV Float -> (Float -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Float) Source #

forall_ :: MonadSymbolic m => m (SBV Float) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Float] Source #

exists :: MonadSymbolic m => String -> m (SBV Float) Source #

exists_ :: MonadSymbolic m => m (SBV Float) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Float] Source #

free :: MonadSymbolic m => String -> m (SBV Float) Source #

free_ :: MonadSymbolic m => m (SBV Float) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Float] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Float) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Float] Source #

unliteral :: SBV Float -> Maybe Float Source #

isConcrete :: SBV Float -> Bool Source #

isSymbolic :: SBV Float -> Bool Source #

SymVal Int8 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Int8) Source #

literal :: Int8 -> SBV Int8 Source #

fromCV :: CV -> Int8 Source #

isConcretely :: SBV Int8 -> (Int8 -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Int8) Source #

forall_ :: MonadSymbolic m => m (SBV Int8) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Int8] Source #

exists :: MonadSymbolic m => String -> m (SBV Int8) Source #

exists_ :: MonadSymbolic m => m (SBV Int8) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Int8] Source #

free :: MonadSymbolic m => String -> m (SBV Int8) Source #

free_ :: MonadSymbolic m => m (SBV Int8) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Int8] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Int8) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Int8] Source #

unliteral :: SBV Int8 -> Maybe Int8 Source #

isConcrete :: SBV Int8 -> Bool Source #

isSymbolic :: SBV Int8 -> Bool Source #

SymVal Int16 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Int16) Source #

literal :: Int16 -> SBV Int16 Source #

fromCV :: CV -> Int16 Source #

isConcretely :: SBV Int16 -> (Int16 -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Int16) Source #

forall_ :: MonadSymbolic m => m (SBV Int16) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Int16] Source #

exists :: MonadSymbolic m => String -> m (SBV Int16) Source #

exists_ :: MonadSymbolic m => m (SBV Int16) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Int16] Source #

free :: MonadSymbolic m => String -> m (SBV Int16) Source #

free_ :: MonadSymbolic m => m (SBV Int16) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Int16] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Int16) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Int16] Source #

unliteral :: SBV Int16 -> Maybe Int16 Source #

isConcrete :: SBV Int16 -> Bool Source #

isSymbolic :: SBV Int16 -> Bool Source #

SymVal Int32 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Int32) Source #

literal :: Int32 -> SBV Int32 Source #

fromCV :: CV -> Int32 Source #

isConcretely :: SBV Int32 -> (Int32 -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Int32) Source #

forall_ :: MonadSymbolic m => m (SBV Int32) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Int32] Source #

exists :: MonadSymbolic m => String -> m (SBV Int32) Source #

exists_ :: MonadSymbolic m => m (SBV Int32) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Int32] Source #

free :: MonadSymbolic m => String -> m (SBV Int32) Source #

free_ :: MonadSymbolic m => m (SBV Int32) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Int32] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Int32) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Int32] Source #

unliteral :: SBV Int32 -> Maybe Int32 Source #

isConcrete :: SBV Int32 -> Bool Source #

isSymbolic :: SBV Int32 -> Bool Source #

SymVal Int64 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Int64) Source #

literal :: Int64 -> SBV Int64 Source #

fromCV :: CV -> Int64 Source #

isConcretely :: SBV Int64 -> (Int64 -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Int64) Source #

forall_ :: MonadSymbolic m => m (SBV Int64) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Int64] Source #

exists :: MonadSymbolic m => String -> m (SBV Int64) Source #

exists_ :: MonadSymbolic m => m (SBV Int64) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Int64] Source #

free :: MonadSymbolic m => String -> m (SBV Int64) Source #

free_ :: MonadSymbolic m => m (SBV Int64) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Int64] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Int64) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Int64] Source #

unliteral :: SBV Int64 -> Maybe Int64 Source #

isConcrete :: SBV Int64 -> Bool Source #

isSymbolic :: SBV Int64 -> Bool Source #

SymVal Integer Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Integer) Source #

literal :: Integer -> SBV Integer Source #

fromCV :: CV -> Integer Source #

isConcretely :: SBV Integer -> (Integer -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Integer) Source #

forall_ :: MonadSymbolic m => m (SBV Integer) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Integer] Source #

exists :: MonadSymbolic m => String -> m (SBV Integer) Source #

exists_ :: MonadSymbolic m => m (SBV Integer) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Integer] Source #

free :: MonadSymbolic m => String -> m (SBV Integer) Source #

free_ :: MonadSymbolic m => m (SBV Integer) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Integer] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Integer) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Integer] Source #

unliteral :: SBV Integer -> Maybe Integer Source #

isConcrete :: SBV Integer -> Bool Source #

isSymbolic :: SBV Integer -> Bool Source #

SymVal Word8 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Word8) Source #

literal :: Word8 -> SBV Word8 Source #

fromCV :: CV -> Word8 Source #

isConcretely :: SBV Word8 -> (Word8 -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Word8) Source #

forall_ :: MonadSymbolic m => m (SBV Word8) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Word8] Source #

exists :: MonadSymbolic m => String -> m (SBV Word8) Source #

exists_ :: MonadSymbolic m => m (SBV Word8) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Word8] Source #

free :: MonadSymbolic m => String -> m (SBV Word8) Source #

free_ :: MonadSymbolic m => m (SBV Word8) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Word8] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Word8) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Word8] Source #

unliteral :: SBV Word8 -> Maybe Word8 Source #

isConcrete :: SBV Word8 -> Bool Source #

isSymbolic :: SBV Word8 -> Bool Source #

SymVal Word16 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Word16) Source #

literal :: Word16 -> SBV Word16 Source #

fromCV :: CV -> Word16 Source #

isConcretely :: SBV Word16 -> (Word16 -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Word16) Source #

forall_ :: MonadSymbolic m => m (SBV Word16) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Word16] Source #

exists :: MonadSymbolic m => String -> m (SBV Word16) Source #

exists_ :: MonadSymbolic m => m (SBV Word16) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Word16] Source #

free :: MonadSymbolic m => String -> m (SBV Word16) Source #

free_ :: MonadSymbolic m => m (SBV Word16) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Word16] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Word16) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Word16] Source #

unliteral :: SBV Word16 -> Maybe Word16 Source #

isConcrete :: SBV Word16 -> Bool Source #

isSymbolic :: SBV Word16 -> Bool Source #

SymVal Word32 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Word32) Source #

literal :: Word32 -> SBV Word32 Source #

fromCV :: CV -> Word32 Source #

isConcretely :: SBV Word32 -> (Word32 -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Word32) Source #

forall_ :: MonadSymbolic m => m (SBV Word32) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Word32] Source #

exists :: MonadSymbolic m => String -> m (SBV Word32) Source #

exists_ :: MonadSymbolic m => m (SBV Word32) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Word32] Source #

free :: MonadSymbolic m => String -> m (SBV Word32) Source #

free_ :: MonadSymbolic m => m (SBV Word32) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Word32] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Word32) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Word32] Source #

unliteral :: SBV Word32 -> Maybe Word32 Source #

isConcrete :: SBV Word32 -> Bool Source #

isSymbolic :: SBV Word32 -> Bool Source #

SymVal Word64 Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Word64) Source #

literal :: Word64 -> SBV Word64 Source #

fromCV :: CV -> Word64 Source #

isConcretely :: SBV Word64 -> (Word64 -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Word64) Source #

forall_ :: MonadSymbolic m => m (SBV Word64) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Word64] Source #

exists :: MonadSymbolic m => String -> m (SBV Word64) Source #

exists_ :: MonadSymbolic m => m (SBV Word64) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Word64] Source #

free :: MonadSymbolic m => String -> m (SBV Word64) Source #

free_ :: MonadSymbolic m => m (SBV Word64) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Word64] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Word64) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Word64] Source #

unliteral :: SBV Word64 -> Maybe Word64 Source #

isConcrete :: SBV Word64 -> Bool Source #

isSymbolic :: SBV Word64 -> Bool Source #

SymVal () Source # | SymVal for 0-tuple (i.e., unit)

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV ()) Source #

literal :: () -> SBV () Source #

fromCV :: CV -> () Source #

isConcretely :: SBV () -> (() -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV ()) Source #

forall_ :: MonadSymbolic m => m (SBV ()) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV ()] Source #

exists :: MonadSymbolic m => String -> m (SBV ()) Source #

exists_ :: MonadSymbolic m => m (SBV ()) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV ()] Source #

free :: MonadSymbolic m => String -> m (SBV ()) Source #

free_ :: MonadSymbolic m => m (SBV ()) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV ()] Source #

symbolic :: MonadSymbolic m => String -> m (SBV ()) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV ()] Source #

unliteral :: SBV () -> Maybe () Source #

isConcrete :: SBV () -> Bool Source #

isSymbolic :: SBV () -> Bool Source #

SymVal AlgReal Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV AlgReal) Source #

literal :: AlgReal -> SBV AlgReal Source #

fromCV :: CV -> AlgReal Source #

isConcretely :: SBV AlgReal -> (AlgReal -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV AlgReal) Source #

forall_ :: MonadSymbolic m => m (SBV AlgReal) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV AlgReal] Source #

exists :: MonadSymbolic m => String -> m (SBV AlgReal) Source #

exists_ :: MonadSymbolic m => m (SBV AlgReal) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV AlgReal] Source #

free :: MonadSymbolic m => String -> m (SBV AlgReal) Source #

free_ :: MonadSymbolic m => m (SBV AlgReal) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV AlgReal] Source #

symbolic :: MonadSymbolic m => String -> m (SBV AlgReal) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV AlgReal] Source #

unliteral :: SBV AlgReal -> Maybe AlgReal Source #

isConcrete :: SBV AlgReal -> Bool Source #

isSymbolic :: SBV AlgReal -> Bool Source #

SymVal RoundingMode Source # | `RoundingMode` can be used symbolically

Instance details

Defined in Data.SBV.Core.Data

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV RoundingMode) Source #

literal :: RoundingMode -> SBV RoundingMode Source #

fromCV :: CV -> RoundingMode Source #

isConcretely :: SBV RoundingMode -> (RoundingMode -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV RoundingMode) Source #

forall_ :: MonadSymbolic m => m (SBV RoundingMode) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV RoundingMode] Source #

exists :: MonadSymbolic m => String -> m (SBV RoundingMode) Source #

exists_ :: MonadSymbolic m => m (SBV RoundingMode) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV RoundingMode] Source #

free :: MonadSymbolic m => String -> m (SBV RoundingMode) Source #

free_ :: MonadSymbolic m => m (SBV RoundingMode) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV RoundingMode] Source #

symbolic :: MonadSymbolic m => String -> m (SBV RoundingMode) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV RoundingMode] Source #

unliteral :: SBV RoundingMode -> Maybe RoundingMode Source #

isConcrete :: SBV RoundingMode -> Bool Source #

isSymbolic :: SBV RoundingMode -> Bool Source #

SymVal State Source # |

Instance details

Defined in Documentation.SBV.Examples.Lists.BoundedMutex

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV State) Source #

literal :: State -> SBV State Source #

fromCV :: CV -> State Source #

isConcretely :: SBV State -> (State -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV State) Source #

forall_ :: MonadSymbolic m => m (SBV State) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV State] Source #

exists :: MonadSymbolic m => String -> m (SBV State) Source #

exists_ :: MonadSymbolic m => m (SBV State) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV State] Source #

free :: MonadSymbolic m => String -> m (SBV State) Source #

free_ :: MonadSymbolic m => m (SBV State) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV State] Source #

symbolic :: MonadSymbolic m => String -> m (SBV State) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV State] Source #

unliteral :: SBV State -> Maybe State Source #

isConcrete :: SBV State -> Bool Source #

isSymbolic :: SBV State -> Bool Source #

SymVal E Source # |

Instance details

Defined in Documentation.SBV.Examples.Misc.Enumerate

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV E) Source #

literal :: E -> SBV E Source #

fromCV :: CV -> E Source #

isConcretely :: SBV E -> (E -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV E) Source #

forall_ :: MonadSymbolic m => m (SBV E) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV E] Source #

exists :: MonadSymbolic m => String -> m (SBV E) Source #

exists_ :: MonadSymbolic m => m (SBV E) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV E] Source #

free :: MonadSymbolic m => String -> m (SBV E) Source #

free_ :: MonadSymbolic m => m (SBV E) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV E] Source #

symbolic :: MonadSymbolic m => String -> m (SBV E) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV E] Source #

unliteral :: SBV E -> Maybe E Source #

isConcrete :: SBV E -> Bool Source #

isSymbolic :: SBV E -> Bool Source #

SymVal HumanHeightInCm Source # | Similarly here, for the `SymVal` instance.

Instance details

Defined in Documentation.SBV.Examples.Misc.Newtypes

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV HumanHeightInCm) Source #

literal :: HumanHeightInCm -> SBV HumanHeightInCm Source #

fromCV :: CV -> HumanHeightInCm Source #

isConcretely :: SBV HumanHeightInCm -> (HumanHeightInCm -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV HumanHeightInCm) Source #

forall_ :: MonadSymbolic m => m (SBV HumanHeightInCm) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV HumanHeightInCm] Source #

exists :: MonadSymbolic m => String -> m (SBV HumanHeightInCm) Source #

exists_ :: MonadSymbolic m => m (SBV HumanHeightInCm) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV HumanHeightInCm] Source #

free :: MonadSymbolic m => String -> m (SBV HumanHeightInCm) Source #

free_ :: MonadSymbolic m => m (SBV HumanHeightInCm) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV HumanHeightInCm] Source #

symbolic :: MonadSymbolic m => String -> m (SBV HumanHeightInCm) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV HumanHeightInCm] Source #

unliteral :: SBV HumanHeightInCm -> Maybe HumanHeightInCm Source #

isConcrete :: SBV HumanHeightInCm -> Bool Source #

isSymbolic :: SBV HumanHeightInCm -> Bool Source #

SymVal Metres Source # | The `SymVal` instance simply uses stock definitions. This is always possible for newtypes that simply wrap over an existing symbolic type.

Instance details

Defined in Documentation.SBV.Examples.Misc.Newtypes

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Metres) Source #

literal :: Metres -> SBV Metres Source #

fromCV :: CV -> Metres Source #

isConcretely :: SBV Metres -> (Metres -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Metres) Source #

forall_ :: MonadSymbolic m => m (SBV Metres) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Metres] Source #

exists :: MonadSymbolic m => String -> m (SBV Metres) Source #

exists_ :: MonadSymbolic m => m (SBV Metres) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Metres] Source #

free :: MonadSymbolic m => String -> m (SBV Metres) Source #

free_ :: MonadSymbolic m => m (SBV Metres) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Metres] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Metres) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Metres] Source #

unliteral :: SBV Metres -> Maybe Metres Source #

isConcrete :: SBV Metres -> Bool Source #

isSymbolic :: SBV Metres -> Bool Source #

SymVal Day Source # |

Instance details

Defined in Documentation.SBV.Examples.Optimization.Enumerate

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Day) Source #

literal :: Day -> SBV Day Source #

fromCV :: CV -> Day Source #

isConcretely :: SBV Day -> (Day -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Day) Source #

forall_ :: MonadSymbolic m => m (SBV Day) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Day] Source #

exists :: MonadSymbolic m => String -> m (SBV Day) Source #

exists_ :: MonadSymbolic m => m (SBV Day) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Day] Source #

free :: MonadSymbolic m => String -> m (SBV Day) Source #

free_ :: MonadSymbolic m => m (SBV Day) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Day] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Day) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Day] Source #

unliteral :: SBV Day -> Maybe Day Source #

isConcrete :: SBV Day -> Bool Source #

isSymbolic :: SBV Day -> Bool Source #

SymVal Color Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.Fish

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Color) Source #

literal :: Color -> SBV Color Source #

fromCV :: CV -> Color Source #

isConcretely :: SBV Color -> (Color -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Color) Source #

forall_ :: MonadSymbolic m => m (SBV Color) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Color] Source #

exists :: MonadSymbolic m => String -> m (SBV Color) Source #

exists_ :: MonadSymbolic m => m (SBV Color) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Color] Source #

free :: MonadSymbolic m => String -> m (SBV Color) Source #

free_ :: MonadSymbolic m => m (SBV Color) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Color] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Color) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Color] Source #

unliteral :: SBV Color -> Maybe Color Source #

isConcrete :: SBV Color -> Bool Source #

isSymbolic :: SBV Color -> Bool Source #

SymVal Nationality Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.Fish

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Nationality) Source #

literal :: Nationality -> SBV Nationality Source #

fromCV :: CV -> Nationality Source #

isConcretely :: SBV Nationality -> (Nationality -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Nationality) Source #

forall_ :: MonadSymbolic m => m (SBV Nationality) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Nationality] Source #

exists :: MonadSymbolic m => String -> m (SBV Nationality) Source #

exists_ :: MonadSymbolic m => m (SBV Nationality) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Nationality] Source #

free :: MonadSymbolic m => String -> m (SBV Nationality) Source #

free_ :: MonadSymbolic m => m (SBV Nationality) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Nationality] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Nationality) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Nationality] Source #

unliteral :: SBV Nationality -> Maybe Nationality Source #

isConcrete :: SBV Nationality -> Bool Source #

isSymbolic :: SBV Nationality -> Bool Source #

SymVal Beverage Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.Fish

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Beverage) Source #

literal :: Beverage -> SBV Beverage Source #

fromCV :: CV -> Beverage Source #

isConcretely :: SBV Beverage -> (Beverage -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Beverage) Source #

forall_ :: MonadSymbolic m => m (SBV Beverage) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Beverage] Source #

exists :: MonadSymbolic m => String -> m (SBV Beverage) Source #

exists_ :: MonadSymbolic m => m (SBV Beverage) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Beverage] Source #

free :: MonadSymbolic m => String -> m (SBV Beverage) Source #

free_ :: MonadSymbolic m => m (SBV Beverage) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Beverage] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Beverage) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Beverage] Source #

unliteral :: SBV Beverage -> Maybe Beverage Source #

isConcrete :: SBV Beverage -> Bool Source #

isSymbolic :: SBV Beverage -> Bool Source #

SymVal Pet Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.Fish

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Pet) Source #

literal :: Pet -> SBV Pet Source #

fromCV :: CV -> Pet Source #

isConcretely :: SBV Pet -> (Pet -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Pet) Source #

forall_ :: MonadSymbolic m => m (SBV Pet) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Pet] Source #

exists :: MonadSymbolic m => String -> m (SBV Pet) Source #

exists_ :: MonadSymbolic m => m (SBV Pet) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Pet] Source #

free :: MonadSymbolic m => String -> m (SBV Pet) Source #

free_ :: MonadSymbolic m => m (SBV Pet) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Pet] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Pet) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Pet] Source #

unliteral :: SBV Pet -> Maybe Pet Source #

isConcrete :: SBV Pet -> Bool Source #

isSymbolic :: SBV Pet -> Bool Source #

SymVal Sport Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.Fish

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Sport) Source #

literal :: Sport -> SBV Sport Source #

fromCV :: CV -> Sport Source #

isConcretely :: SBV Sport -> (Sport -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Sport) Source #

forall_ :: MonadSymbolic m => m (SBV Sport) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Sport] Source #

exists :: MonadSymbolic m => String -> m (SBV Sport) Source #

exists_ :: MonadSymbolic m => m (SBV Sport) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Sport] Source #

free :: MonadSymbolic m => String -> m (SBV Sport) Source #

free_ :: MonadSymbolic m => m (SBV Sport) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Sport] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Sport) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Sport] Source #

unliteral :: SBV Sport -> Maybe Sport Source #

isConcrete :: SBV Sport -> Bool Source #

isSymbolic :: SBV Sport -> Bool Source #

SymVal Color Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.Garden

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Color) Source #

literal :: Color -> SBV Color Source #

fromCV :: CV -> Color Source #

isConcretely :: SBV Color -> (Color -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Color) Source #

forall_ :: MonadSymbolic m => m (SBV Color) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Color] Source #

exists :: MonadSymbolic m => String -> m (SBV Color) Source #

exists_ :: MonadSymbolic m => m (SBV Color) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Color] Source #

free :: MonadSymbolic m => String -> m (SBV Color) Source #

free_ :: MonadSymbolic m => m (SBV Color) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Color] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Color) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Color] Source #

unliteral :: SBV Color -> Maybe Color Source #

isConcrete :: SBV Color -> Bool Source #

isSymbolic :: SBV Color -> Bool Source #

SymVal Color Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.HexPuzzle

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Color) Source #

literal :: Color -> SBV Color Source #

fromCV :: CV -> Color Source #

isConcretely :: SBV Color -> (Color -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Color) Source #

forall_ :: MonadSymbolic m => m (SBV Color) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Color] Source #

exists :: MonadSymbolic m => String -> m (SBV Color) Source #

exists_ :: MonadSymbolic m => m (SBV Color) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Color] Source #

free :: MonadSymbolic m => String -> m (SBV Color) Source #

free_ :: MonadSymbolic m => m (SBV Color) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Color] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Color) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Color] Source #

unliteral :: SBV Color -> Maybe Color Source #

isConcrete :: SBV Color -> Bool Source #

isSymbolic :: SBV Color -> Bool Source #

SymVal U2Member Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.U2Bridge

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV U2Member) Source #

literal :: U2Member -> SBV U2Member Source #

fromCV :: CV -> U2Member Source #

isConcretely :: SBV U2Member -> (U2Member -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV U2Member) Source #

forall_ :: MonadSymbolic m => m (SBV U2Member) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV U2Member] Source #

exists :: MonadSymbolic m => String -> m (SBV U2Member) Source #

exists_ :: MonadSymbolic m => m (SBV U2Member) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV U2Member] Source #

free :: MonadSymbolic m => String -> m (SBV U2Member) Source #

free_ :: MonadSymbolic m => m (SBV U2Member) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV U2Member] Source #

symbolic :: MonadSymbolic m => String -> m (SBV U2Member) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV U2Member] Source #

unliteral :: SBV U2Member -> Maybe U2Member Source #

isConcrete :: SBV U2Member -> Bool Source #

isSymbolic :: SBV U2Member -> Bool Source #

SymVal Location Source # |

Instance details

Defined in Documentation.SBV.Examples.Puzzles.U2Bridge

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Location) Source #

literal :: Location -> SBV Location Source #

fromCV :: CV -> Location Source #

isConcretely :: SBV Location -> (Location -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Location) Source #

forall_ :: MonadSymbolic m => m (SBV Location) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Location] Source #

exists :: MonadSymbolic m => String -> m (SBV Location) Source #

exists_ :: MonadSymbolic m => m (SBV Location) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Location] Source #

free :: MonadSymbolic m => String -> m (SBV Location) Source #

free_ :: MonadSymbolic m => m (SBV Location) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Location] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Location) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Location] Source #

unliteral :: SBV Location -> Maybe Location Source #

isConcrete :: SBV Location -> Bool Source #

isSymbolic :: SBV Location -> Bool Source #

SymVal Day Source # |

Instance details

Defined in Documentation.SBV.Examples.Queries.Enums

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Day) Source #

literal :: Day -> SBV Day Source #

fromCV :: CV -> Day Source #

isConcretely :: SBV Day -> (Day -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Day) Source #

forall_ :: MonadSymbolic m => m (SBV Day) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Day] Source #

exists :: MonadSymbolic m => String -> m (SBV Day) Source #

exists_ :: MonadSymbolic m => m (SBV Day) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Day] Source #

free :: MonadSymbolic m => String -> m (SBV Day) Source #

free_ :: MonadSymbolic m => m (SBV Day) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Day] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Day) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Day] Source #

unliteral :: SBV Day -> Maybe Day Source #

isConcrete :: SBV Day -> Bool Source #

isSymbolic :: SBV Day -> Bool Source #

SymVal BinOp Source # |

Instance details

Defined in Documentation.SBV.Examples.Queries.FourFours

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV BinOp) Source #

literal :: BinOp -> SBV BinOp Source #

fromCV :: CV -> BinOp Source #

isConcretely :: SBV BinOp -> (BinOp -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV BinOp) Source #

forall_ :: MonadSymbolic m => m (SBV BinOp) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV BinOp] Source #

exists :: MonadSymbolic m => String -> m (SBV BinOp) Source #

exists_ :: MonadSymbolic m => m (SBV BinOp) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV BinOp] Source #

free :: MonadSymbolic m => String -> m (SBV BinOp) Source #

free_ :: MonadSymbolic m => m (SBV BinOp) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV BinOp] Source #

symbolic :: MonadSymbolic m => String -> m (SBV BinOp) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV BinOp] Source #

unliteral :: SBV BinOp -> Maybe BinOp Source #

isConcrete :: SBV BinOp -> Bool Source #

isSymbolic :: SBV BinOp -> Bool Source #

SymVal UnOp Source # |

Instance details

Defined in Documentation.SBV.Examples.Queries.FourFours

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV UnOp) Source #

literal :: UnOp -> SBV UnOp Source #

fromCV :: CV -> UnOp Source #

isConcretely :: SBV UnOp -> (UnOp -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV UnOp) Source #

forall_ :: MonadSymbolic m => m (SBV UnOp) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV UnOp] Source #

exists :: MonadSymbolic m => String -> m (SBV UnOp) Source #

exists_ :: MonadSymbolic m => m (SBV UnOp) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV UnOp] Source #

free :: MonadSymbolic m => String -> m (SBV UnOp) Source #

free_ :: MonadSymbolic m => m (SBV UnOp) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV UnOp] Source #

symbolic :: MonadSymbolic m => String -> m (SBV UnOp) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV UnOp] Source #

unliteral :: SBV UnOp -> Maybe UnOp Source #

isConcrete :: SBV UnOp -> Bool Source #

isSymbolic :: SBV UnOp -> Bool Source #

SymVal B Source # |

Instance details

Defined in Documentation.SBV.Examples.Uninterpreted.Deduce

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV B) Source #

literal :: B -> SBV B Source #

fromCV :: CV -> B Source #

isConcretely :: SBV B -> (B -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV B) Source #

forall_ :: MonadSymbolic m => m (SBV B) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV B] Source #

exists :: MonadSymbolic m => String -> m (SBV B) Source #

exists_ :: MonadSymbolic m => m (SBV B) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV B] Source #

free :: MonadSymbolic m => String -> m (SBV B) Source #

free_ :: MonadSymbolic m => m (SBV B) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV B] Source #

symbolic :: MonadSymbolic m => String -> m (SBV B) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV B] Source #

unliteral :: SBV B -> Maybe B Source #

isConcrete :: SBV B -> Bool Source #

isSymbolic :: SBV B -> Bool Source #

SymVal Q Source # |

Instance details

Defined in Documentation.SBV.Examples.Uninterpreted.Sort

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV Q) Source #

literal :: Q -> SBV Q Source #

fromCV :: CV -> Q Source #

isConcretely :: SBV Q -> (Q -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV Q) Source #

forall_ :: MonadSymbolic m => m (SBV Q) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV Q] Source #

exists :: MonadSymbolic m => String -> m (SBV Q) Source #

exists_ :: MonadSymbolic m => m (SBV Q) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV Q] Source #

free :: MonadSymbolic m => String -> m (SBV Q) Source #

free_ :: MonadSymbolic m => m (SBV Q) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV Q] Source #

symbolic :: MonadSymbolic m => String -> m (SBV Q) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV Q] Source #

unliteral :: SBV Q -> Maybe Q Source #

isConcrete :: SBV Q -> Bool Source #

isSymbolic :: SBV Q -> Bool Source #

SymVal L Source # | Declare instances to make `L` a usable uninterpreted sort. First we need the `SymVal` instance, with the default definition sufficing.

Instance details

Defined in Documentation.SBV.Examples.Uninterpreted.UISortAllSat

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV L) Source #

literal :: L -> SBV L Source #

fromCV :: CV -> L Source #

isConcretely :: SBV L -> (L -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV L) Source #

forall_ :: MonadSymbolic m => m (SBV L) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV L] Source #

exists :: MonadSymbolic m => String -> m (SBV L) Source #

exists_ :: MonadSymbolic m => m (SBV L) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV L] Source #

free :: MonadSymbolic m => String -> m (SBV L) Source #

free_ :: MonadSymbolic m => m (SBV L) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV L] Source #

symbolic :: MonadSymbolic m => String -> m (SBV L) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV L] Source #

unliteral :: SBV L -> Maybe L Source #

isConcrete :: SBV L -> Bool Source #

isSymbolic :: SBV L -> Bool Source #

SymVal a => SymVal [a] Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV [a]) Source #

literal :: [a] -> SBV [a] Source #

fromCV :: CV -> [a] Source #

isConcretely :: SBV [a] -> ([a] -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV [a]) Source #

forall_ :: MonadSymbolic m => m (SBV [a]) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV [a]] Source #

exists :: MonadSymbolic m => String -> m (SBV [a]) Source #

exists_ :: MonadSymbolic m => m (SBV [a]) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV [a]] Source #

free :: MonadSymbolic m => String -> m (SBV [a]) Source #

free_ :: MonadSymbolic m => m (SBV [a]) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV [a]] Source #

symbolic :: MonadSymbolic m => String -> m (SBV [a]) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV [a]] Source #

unliteral :: SBV [a] -> Maybe [a] Source #

isConcrete :: SBV [a] -> Bool Source #

isSymbolic :: SBV [a] -> Bool Source #

SymVal a => SymVal (Maybe a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (Maybe a)) Source #

literal :: Maybe a -> SBV (Maybe a) Source #

fromCV :: CV -> Maybe a Source #

isConcretely :: SBV (Maybe a) -> (Maybe a -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (Maybe a)) Source #

forall_ :: MonadSymbolic m => m (SBV (Maybe a)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (Maybe a)] Source #

exists :: MonadSymbolic m => String -> m (SBV (Maybe a)) Source #

exists_ :: MonadSymbolic m => m (SBV (Maybe a)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (Maybe a)] Source #

free :: MonadSymbolic m => String -> m (SBV (Maybe a)) Source #

free_ :: MonadSymbolic m => m (SBV (Maybe a)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (Maybe a)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (Maybe a)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (Maybe a)] Source #

unliteral :: SBV (Maybe a) -> Maybe (Maybe a) Source #

isConcrete :: SBV (Maybe a) -> Bool Source #

isSymbolic :: SBV (Maybe a) -> Bool Source #

(Ord a, SymVal a) => SymVal (RCSet a) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (RCSet a)) Source #

literal :: RCSet a -> SBV (RCSet a) Source #

fromCV :: CV -> RCSet a Source #

isConcretely :: SBV (RCSet a) -> (RCSet a -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (RCSet a)) Source #

forall_ :: MonadSymbolic m => m (SBV (RCSet a)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (RCSet a)] Source #

exists :: MonadSymbolic m => String -> m (SBV (RCSet a)) Source #

exists_ :: MonadSymbolic m => m (SBV (RCSet a)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (RCSet a)] Source #

free :: MonadSymbolic m => String -> m (SBV (RCSet a)) Source #

free_ :: MonadSymbolic m => m (SBV (RCSet a)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (RCSet a)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (RCSet a)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (RCSet a)] Source #

unliteral :: SBV (RCSet a) -> Maybe (RCSet a) Source #

isConcrete :: SBV (RCSet a) -> Bool Source #

isSymbolic :: SBV (RCSet a) -> Bool Source #

(KnownNat n, IsNonZero n) => SymVal (IntN n) Source # | `SymVal` instance for `IntN`

Instance details

Defined in Data.SBV.Core.Sized

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (IntN n)) Source #

literal :: IntN n -> SBV (IntN n) Source #

fromCV :: CV -> IntN n Source #

isConcretely :: SBV (IntN n) -> (IntN n -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (IntN n)) Source #

forall_ :: MonadSymbolic m => m (SBV (IntN n)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (IntN n)] Source #

exists :: MonadSymbolic m => String -> m (SBV (IntN n)) Source #

exists_ :: MonadSymbolic m => m (SBV (IntN n)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (IntN n)] Source #

free :: MonadSymbolic m => String -> m (SBV (IntN n)) Source #

free_ :: MonadSymbolic m => m (SBV (IntN n)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (IntN n)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (IntN n)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (IntN n)] Source #

unliteral :: SBV (IntN n) -> Maybe (IntN n) Source #

isConcrete :: SBV (IntN n) -> Bool Source #

isSymbolic :: SBV (IntN n) -> Bool Source #

(KnownNat n, IsNonZero n) => SymVal (WordN n) Source # | `SymVal` instance for `WordN`

Instance details

Defined in Data.SBV.Core.Sized

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (WordN n)) Source #

literal :: WordN n -> SBV (WordN n) Source #

fromCV :: CV -> WordN n Source #

isConcretely :: SBV (WordN n) -> (WordN n -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (WordN n)) Source #

forall_ :: MonadSymbolic m => m (SBV (WordN n)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (WordN n)] Source #

exists :: MonadSymbolic m => String -> m (SBV (WordN n)) Source #

exists_ :: MonadSymbolic m => m (SBV (WordN n)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (WordN n)] Source #

free :: MonadSymbolic m => String -> m (SBV (WordN n)) Source #

free_ :: MonadSymbolic m => m (SBV (WordN n)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (WordN n)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (WordN n)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (WordN n)] Source #

unliteral :: SBV (WordN n) -> Maybe (WordN n) Source #

isConcrete :: SBV (WordN n) -> Bool Source #

isSymbolic :: SBV (WordN n) -> Bool Source #

(SymVal a, SymVal b) => SymVal (Either a b) Source # |

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (Either a b)) Source #

literal :: Either a b -> SBV (Either a b) Source #

fromCV :: CV -> Either a b Source #

isConcretely :: SBV (Either a b) -> (Either a b -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (Either a b)) Source #

forall_ :: MonadSymbolic m => m (SBV (Either a b)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (Either a b)] Source #

exists :: MonadSymbolic m => String -> m (SBV (Either a b)) Source #

exists_ :: MonadSymbolic m => m (SBV (Either a b)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (Either a b)] Source #

free :: MonadSymbolic m => String -> m (SBV (Either a b)) Source #

free_ :: MonadSymbolic m => m (SBV (Either a b)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (Either a b)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (Either a b)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (Either a b)] Source #

unliteral :: SBV (Either a b) -> Maybe (Either a b) Source #

isConcrete :: SBV (Either a b) -> Bool Source #

isSymbolic :: SBV (Either a b) -> Bool Source #

(SymVal a, SymVal b) => SymVal (a, b) Source # | SymVal for 2-tuples

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (a, b)) Source #

literal :: (a, b) -> SBV (a, b) Source #

fromCV :: CV -> (a, b) Source #

isConcretely :: SBV (a, b) -> ((a, b) -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (a, b)) Source #

forall_ :: MonadSymbolic m => m (SBV (a, b)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (a, b)] Source #

exists :: MonadSymbolic m => String -> m (SBV (a, b)) Source #

exists_ :: MonadSymbolic m => m (SBV (a, b)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (a, b)] Source #

free :: MonadSymbolic m => String -> m (SBV (a, b)) Source #

free_ :: MonadSymbolic m => m (SBV (a, b)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (a, b)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (a, b)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (a, b)] Source #

unliteral :: SBV (a, b) -> Maybe (a, b) Source #

isConcrete :: SBV (a, b) -> Bool Source #

isSymbolic :: SBV (a, b) -> Bool Source #

(SymVal a, SymVal b, SymVal c) => SymVal (a, b, c) Source # | SymVal for 3-tuples

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (a, b, c)) Source #

literal :: (a, b, c) -> SBV (a, b, c) Source #

fromCV :: CV -> (a, b, c) Source #

isConcretely :: SBV (a, b, c) -> ((a, b, c) -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (a, b, c)) Source #

forall_ :: MonadSymbolic m => m (SBV (a, b, c)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (a, b, c)] Source #

exists :: MonadSymbolic m => String -> m (SBV (a, b, c)) Source #

exists_ :: MonadSymbolic m => m (SBV (a, b, c)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (a, b, c)] Source #

free :: MonadSymbolic m => String -> m (SBV (a, b, c)) Source #

free_ :: MonadSymbolic m => m (SBV (a, b, c)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (a, b, c)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (a, b, c)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (a, b, c)] Source #

unliteral :: SBV (a, b, c) -> Maybe (a, b, c) Source #

isConcrete :: SBV (a, b, c) -> Bool Source #

isSymbolic :: SBV (a, b, c) -> Bool Source #

(SymVal a, SymVal b, SymVal c, SymVal d) => SymVal (a, b, c, d) Source # | SymVal for 4-tuples

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (a, b, c, d)) Source #

literal :: (a, b, c, d) -> SBV (a, b, c, d) Source #

fromCV :: CV -> (a, b, c, d) Source #

isConcretely :: SBV (a, b, c, d) -> ((a, b, c, d) -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (a, b, c, d)) Source #

forall_ :: MonadSymbolic m => m (SBV (a, b, c, d)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d)] Source #

exists :: MonadSymbolic m => String -> m (SBV (a, b, c, d)) Source #

exists_ :: MonadSymbolic m => m (SBV (a, b, c, d)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d)] Source #

free :: MonadSymbolic m => String -> m (SBV (a, b, c, d)) Source #

free_ :: MonadSymbolic m => m (SBV (a, b, c, d)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (a, b, c, d)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (a, b, c, d)] Source #

unliteral :: SBV (a, b, c, d) -> Maybe (a, b, c, d) Source #

isConcrete :: SBV (a, b, c, d) -> Bool Source #

isSymbolic :: SBV (a, b, c, d) -> Bool Source #

(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e) => SymVal (a, b, c, d, e) Source # | SymVal for 5-tuples

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (a, b, c, d, e)) Source #

literal :: (a, b, c, d, e) -> SBV (a, b, c, d, e) Source #

fromCV :: CV -> (a, b, c, d, e) Source #

isConcretely :: SBV (a, b, c, d, e) -> ((a, b, c, d, e) -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e)) Source #

forall_ :: MonadSymbolic m => m (SBV (a, b, c, d, e)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d, e)] Source #

exists :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e)) Source #

exists_ :: MonadSymbolic m => m (SBV (a, b, c, d, e)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d, e)] Source #

free :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e)) Source #

free_ :: MonadSymbolic m => m (SBV (a, b, c, d, e)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d, e)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (a, b, c, d, e)] Source #

unliteral :: SBV (a, b, c, d, e) -> Maybe (a, b, c, d, e) Source #

isConcrete :: SBV (a, b, c, d, e) -> Bool Source #

isSymbolic :: SBV (a, b, c, d, e) -> Bool Source #

(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f) => SymVal (a, b, c, d, e, f) Source # | SymVal for 6-tuples

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (a, b, c, d, e, f)) Source #

literal :: (a, b, c, d, e, f) -> SBV (a, b, c, d, e, f) Source #

fromCV :: CV -> (a, b, c, d, e, f) Source #

isConcretely :: SBV (a, b, c, d, e, f) -> ((a, b, c, d, e, f) -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e, f)) Source #

forall_ :: MonadSymbolic m => m (SBV (a, b, c, d, e, f)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d, e, f)] Source #

exists :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e, f)) Source #

exists_ :: MonadSymbolic m => m (SBV (a, b, c, d, e, f)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d, e, f)] Source #

free :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e, f)) Source #

free_ :: MonadSymbolic m => m (SBV (a, b, c, d, e, f)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d, e, f)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e, f)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (a, b, c, d, e, f)] Source #

unliteral :: SBV (a, b, c, d, e, f) -> Maybe (a, b, c, d, e, f) Source #

isConcrete :: SBV (a, b, c, d, e, f) -> Bool Source #

isSymbolic :: SBV (a, b, c, d, e, f) -> Bool Source #

(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, SymVal g) => SymVal (a, b, c, d, e, f, g) Source # | SymVal for 7-tuples

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (a, b, c, d, e, f, g)) Source #

literal :: (a, b, c, d, e, f, g) -> SBV (a, b, c, d, e, f, g) Source #

fromCV :: CV -> (a, b, c, d, e, f, g) Source #

isConcretely :: SBV (a, b, c, d, e, f, g) -> ((a, b, c, d, e, f, g) -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e, f, g)) Source #

forall_ :: MonadSymbolic m => m (SBV (a, b, c, d, e, f, g)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d, e, f, g)] Source #

exists :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e, f, g)) Source #

exists_ :: MonadSymbolic m => m (SBV (a, b, c, d, e, f, g)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d, e, f, g)] Source #

free :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e, f, g)) Source #

free_ :: MonadSymbolic m => m (SBV (a, b, c, d, e, f, g)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d, e, f, g)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e, f, g)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (a, b, c, d, e, f, g)] Source #

unliteral :: SBV (a, b, c, d, e, f, g) -> Maybe (a, b, c, d, e, f, g) Source #

isConcrete :: SBV (a, b, c, d, e, f, g) -> Bool Source #

isSymbolic :: SBV (a, b, c, d, e, f, g) -> Bool Source #

(SymVal a, SymVal b, SymVal c, SymVal d, SymVal e, SymVal f, SymVal g, SymVal h) => SymVal (a, b, c, d, e, f, g, h) Source # | SymVal for 8-tuples

Instance details

Defined in Data.SBV.Core.Model

Methods

mkSymVal :: MonadSymbolic m => Maybe Quantifier -> Maybe String -> m (SBV (a, b, c, d, e, f, g, h)) Source #

literal :: (a, b, c, d, e, f, g, h) -> SBV (a, b, c, d, e, f, g, h) Source #

fromCV :: CV -> (a, b, c, d, e, f, g, h) Source #

isConcretely :: SBV (a, b, c, d, e, f, g, h) -> ((a, b, c, d, e, f, g, h) -> Bool) -> Bool Source #

forall :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e, f, g, h)) Source #

forall_ :: MonadSymbolic m => m (SBV (a, b, c, d, e, f, g, h)) Source #

mkForallVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d, e, f, g, h)] Source #

exists :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e, f, g, h)) Source #

exists_ :: MonadSymbolic m => m (SBV (a, b, c, d, e, f, g, h)) Source #

mkExistVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d, e, f, g, h)] Source #

free :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e, f, g, h)) Source #

free_ :: MonadSymbolic m => m (SBV (a, b, c, d, e, f, g, h)) Source #

mkFreeVars :: MonadSymbolic m => Int -> m [SBV (a, b, c, d, e, f, g, h)] Source #

symbolic :: MonadSymbolic m => String -> m (SBV (a, b, c, d, e, f, g, h)) Source #

symbolics :: MonadSymbolic m => [String] -> m [SBV (a, b, c, d, e, f, g, h)] Source #

unliteral :: SBV (a, b, c, d, e, f, g, h) -> Maybe (a, b, c, d, e, f, g, h) Source #

isConcrete :: SBV (a, b, c, d, e, f, g, h) -> Bool Source #

isSymbolic :: SBV (a, b, c, d, e, f, g, h) -> Bool Source #

forall :: SymVal a => String -> Symbolic (SBV a) Source #

Create a user named input (universal)

NB. For a version which generalizes over the underlying monad, see `forall`

forall_ :: SymVal a => Symbolic (SBV a) Source #

Create an automatically named input

NB. For a version which generalizes over the underlying monad, see `forall_`

mkForallVars :: SymVal a => Int -> Symbolic [SBV a] Source #

Get a bunch of new words

NB. For a version which generalizes over the underlying monad, see `mkForallVars`

exists :: SymVal a => String -> Symbolic (SBV a) Source #

Create an existential variable

NB. For a version which generalizes over the underlying monad, see `exists`

exists_ :: SymVal a => Symbolic (SBV a) Source #

Create an automatically named existential variable

NB. For a version which generalizes over the underlying monad, see `exists_`

mkExistVars :: SymVal a => Int -> Symbolic [SBV a] Source #

Create a bunch of existentials

NB. For a version which generalizes over the underlying monad, see `mkExistVars`

free :: SymVal a => String -> Symbolic (SBV a) Source #

Create a free variable, universal in a proof, existential in sat

NB. For a version which generalizes over the underlying monad, see `free`

free_ :: SymVal a => Symbolic (SBV a) Source #

Create an unnamed free variable, universal in proof, existential in sat

NB. For a version which generalizes over the underlying monad, see `free_`

mkFreeVars :: SymVal a => Int -> Symbolic [SBV a] Source #

Create a bunch of free vars

NB. For a version which generalizes over the underlying monad, see `mkFreeVars`

symbolic :: SymVal a => String -> Symbolic (SBV a) Source #

Similar to free; Just a more convenient name

NB. For a version which generalizes over the underlying monad, see `symbolic`

symbolics :: SymVal a => [String] -> Symbolic [SBV a] Source #

Similar to mkFreeVars; but automatically gives names based on the strings

NB. For a version which generalizes over the underlying monad, see `symbolics`

literal :: SymVal a => a -> SBV a Source #

Turn a literal constant to symbolic

unliteral :: SymVal a => SBV a -> Maybe a Source #

Extract a literal, if the value is concrete

fromCV :: SymVal a => CV -> a Source #

Extract a literal, from a CV representation

isConcrete :: SymVal a => SBV a -> Bool Source #

Is the symbolic word concrete?

isSymbolic :: SymVal a => SBV a -> Bool Source #

Is the symbolic word really symbolic?

isConcretely :: SymVal a => SBV a -> (a -> Bool) -> Bool Source #

Does it concretely satisfy the given predicate?

mkSymVal :: SymVal a => Maybe Quantifier -> Maybe String -> Symbolic (SBV a) Source #

One stop allocator

NB. For a version which generalizes over the underlying monad, see `mkSymVal`

class MonadIO m => MonadSymbolic m where Source #

A Symbolic computation. Represented by a reader monad carrying the state of the computation, layered on top of IO for creating unique references to hold onto intermediate results.

Computations which support symbolic operations

Minimal complete definition

Nothing

Methods

symbolicEnv :: m State Source #

default symbolicEnv :: (MonadTrans t, MonadSymbolic m', m ~ t m') => m State Source #

#### Instances

Instances details

MonadSymbolic Query Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods symbolicEnv :: Query State Source #
MonadSymbolic SBVCodeGen Source # |
Instance details Defined in Data.SBV.Compilers.CodeGen Methods symbolicEnv :: SBVCodeGen State Source #
MonadSymbolic Alloc Source # |
Instance details Defined in Documentation.SBV.Examples.Transformers.SymbolicEval Methods symbolicEnv :: Alloc State Source #
MonadSymbolic m => MonadSymbolic (MaybeT m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods symbolicEnv :: MaybeT m State Source #
MonadIO m => MonadSymbolic (SymbolicT m) Source # | `MonadSymbolic` instance for `SymbolicT m`
Instance details Defined in Data.SBV.Core.Symbolic Methods symbolicEnv :: SymbolicT m State Source #
MonadSymbolic m => MonadSymbolic (ExceptT e m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods symbolicEnv :: ExceptT e m State Source #
(MonadSymbolic m, Monoid w) => MonadSymbolic (WriterT w m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods symbolicEnv :: WriterT w m State Source #
(MonadSymbolic m, Monoid w) => MonadSymbolic (WriterT w m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods symbolicEnv :: WriterT w m State Source #
MonadSymbolic m => MonadSymbolic (ReaderT r m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods symbolicEnv :: ReaderT r m State Source #
MonadSymbolic m => MonadSymbolic (StateT s m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods symbolicEnv :: StateT s m State Source #
MonadSymbolic m => MonadSymbolic (StateT s m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods symbolicEnv :: StateT s m State Source #

type Symbolic = SymbolicT IO Source #

`Symbolic` is specialization of `SymbolicT` to the `IO` monad. Unless you are using transformers explicitly, this is the type you should prefer.

data SymbolicT m a Source #

A generalization of `Symbolic`.

#### Instances

Instances details

MonadTrans SymbolicT Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods lift :: Monad m => m a -> SymbolicT m a
MonadError e m => MonadError e (SymbolicT m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods throwError :: e -> SymbolicT m a catchError :: SymbolicT m a -> (e -> SymbolicT m a) -> SymbolicT m a
MonadWriter w m => MonadWriter w (SymbolicT m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods writer :: (a, w) -> SymbolicT m a tell :: w -> SymbolicT m () listen :: SymbolicT m a -> SymbolicT m (a, w) pass :: SymbolicT m (a, w -> w) -> SymbolicT m a
MonadReader r m => MonadReader r (SymbolicT m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods ask :: SymbolicT m r local :: (r -> r) -> SymbolicT m a -> SymbolicT m a reader :: (r -> a) -> SymbolicT m a
MonadState s m => MonadState s (SymbolicT m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods get :: SymbolicT m s put :: s -> SymbolicT m () state :: (s -> (a, s)) -> SymbolicT m a
(ExtractIO m, NFData a) => SExecutable m (SymbolicT m a) Source # |
Instance details Defined in Data.SBV.Provers.Prover Methods sName_ :: SymbolicT m a -> SymbolicT m () Source # sName :: [String] -> SymbolicT m a -> SymbolicT m () Source # safe :: SymbolicT m a -> m [SafeResult] Source # safeWith :: SMTConfig -> SymbolicT m a -> m [SafeResult] Source #
ExtractIO m => MProvable m (SymbolicT m SBool) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

forAll_ :: SymbolicT m SBool -> SymbolicT m SBool Source #

forAll :: [String] -> SymbolicT m SBool -> SymbolicT m SBool Source #

forSome_ :: SymbolicT m SBool -> SymbolicT m SBool Source #

forSome :: [String] -> SymbolicT m SBool -> SymbolicT m SBool Source #

prove :: SymbolicT m SBool -> m ThmResult Source #

proveWith :: SMTConfig -> SymbolicT m SBool -> m ThmResult Source #

sat :: SymbolicT m SBool -> m SatResult Source #

satWith :: SMTConfig -> SymbolicT m SBool -> m SatResult Source #

allSat :: SymbolicT m SBool -> m AllSatResult Source #

allSatWith :: SMTConfig -> SymbolicT m SBool -> m AllSatResult Source #

optimize :: OptimizeStyle -> SymbolicT m SBool -> m OptimizeResult Source #

optimizeWith :: SMTConfig -> OptimizeStyle -> SymbolicT m SBool -> m OptimizeResult Source #

isVacuous :: SymbolicT m SBool -> m Bool Source #

isVacuousWith :: SMTConfig -> SymbolicT m SBool -> m Bool Source #

isTheorem :: SymbolicT m SBool -> m Bool Source #

isTheoremWith :: SMTConfig -> SymbolicT m SBool -> m Bool Source #

isSatisfiable :: SymbolicT m SBool -> m Bool Source #

isSatisfiableWith :: SMTConfig -> SymbolicT m SBool -> m Bool Source #

validate :: Bool -> SMTConfig -> SymbolicT m SBool -> SMTResult -> m SMTResult Source #

ExtractIO m => MProvable m (SymbolicT m ()) Source # |

Instance details

Defined in Data.SBV.Provers.Prover

Methods

forAll_ :: SymbolicT m () -> SymbolicT m SBool Source #

forAll :: [String] -> SymbolicT m () -> SymbolicT m SBool Source #

forSome_ :: SymbolicT m () -> SymbolicT m SBool Source #

forSome :: [String] -> SymbolicT m () -> SymbolicT m SBool Source #

prove :: SymbolicT m () -> m ThmResult Source #

proveWith :: SMTConfig -> SymbolicT m () -> m ThmResult Source #

sat :: SymbolicT m () -> m SatResult Source #

satWith :: SMTConfig -> SymbolicT m () -> m SatResult Source #

allSat :: SymbolicT m () -> m AllSatResult Source #

allSatWith :: SMTConfig -> SymbolicT m () -> m AllSatResult Source #

optimize :: OptimizeStyle -> SymbolicT m () -> m OptimizeResult Source #

optimizeWith :: SMTConfig -> OptimizeStyle -> SymbolicT m () -> m OptimizeResult Source #

isVacuous :: SymbolicT m () -> m Bool Source #

isVacuousWith :: SMTConfig -> SymbolicT m () -> m Bool Source #

isTheorem :: SymbolicT m () -> m Bool Source #

isTheoremWith :: SMTConfig -> SymbolicT m () -> m Bool Source #

isSatisfiable :: SymbolicT m () -> m Bool Source #

isSatisfiableWith :: SMTConfig -> SymbolicT m () -> m Bool Source #

validate :: Bool -> SMTConfig -> SymbolicT m () -> SMTResult -> m SMTResult Source #

Monad m => Monad (SymbolicT m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods (>>=) :: SymbolicT m a -> (a -> SymbolicT m b) -> SymbolicT m b (>>) :: SymbolicT m a -> SymbolicT m b -> SymbolicT m b return :: a -> SymbolicT m a
Functor m => Functor (SymbolicT m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods fmap :: (a -> b) -> SymbolicT m a -> SymbolicT m b (<$) :: a -> SymbolicT m b -> SymbolicT m a
MonadFail m => MonadFail (SymbolicT m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods fail :: String -> SymbolicT m a
Applicative m => Applicative (SymbolicT m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods pure :: a -> SymbolicT m a (<*>) :: SymbolicT m (a -> b) -> SymbolicT m a -> SymbolicT m b liftA2 :: (a -> b -> c) -> SymbolicT m a -> SymbolicT m b -> SymbolicT m c (*>) :: SymbolicT m a -> SymbolicT m b -> SymbolicT m b (<*) :: SymbolicT m a -> SymbolicT m b -> SymbolicT m a
Testable (Symbolic SVal) Source # |
Instance details Defined in Data.SBV.Core.Model Methods property :: Symbolic SVal -> Property Source # propertyForAllShrinkShow :: Gen a -> (a -> [a]) -> (a -> [String]) -> (a -> Symbolic SVal) -> Property Source #
Testable (Symbolic SBool) Source # |
Instance details Defined in Data.SBV.Core.Model Methods property :: Symbolic SBool -> Property Source # propertyForAllShrinkShow :: Gen a -> (a -> [a]) -> (a -> [String]) -> (a -> Symbolic SBool) -> Property Source #
MonadIO m => MonadIO (SymbolicT m) Source # |
Instance details Defined in Data.SBV.Core.Symbolic Methods liftIO :: IO a -> SymbolicT m a
MonadIO m => MonadSymbolic (SymbolicT m) Source # | `MonadSymbolic` instance for `SymbolicT m`
Instance details Defined in Data.SBV.Core.Symbolic Methods symbolicEnv :: SymbolicT m State Source #
MonadIO m => SolverContext (SymbolicT m) Source # | Symbolic computations provide a context for writing symbolic programs.

Instance details

Defined in Data.SBV.Core.Model

Methods

constrain :: SBool -> SymbolicT m () Source #

softConstrain :: SBool -> SymbolicT m () Source #

namedConstraint :: String -> SBool -> SymbolicT m () Source #

constrainWithAttribute :: [(String, String)] -> SBool -> SymbolicT m () Source #

setInfo :: String -> [String] -> SymbolicT m () Source #

setOption :: SMTOption -> SymbolicT m () Source #

setLogic :: Logic -> SymbolicT m () Source #

addAxiom :: String -> [String] -> SymbolicT m () Source #

setTimeOut :: Integer -> SymbolicT m () Source #

contextState :: SymbolicT m State Source #

label :: SymVal a => String -> SBV a -> SBV a Source #

label: Label the result of an expression. This is essentially a no-op, but useful as it generates a comment in the generated C/SMT-Lib code. Note that if the argument is a constant, then the label is dropped completely, per the usual constant folding strategy. Compare this to `observe` which is good for printing counter-examples.

output :: Outputtable a => a -> Symbolic a Source #

Mark an interim result as an output. Useful when constructing Symbolic programs that return multiple values, or when the result is programmatically computed.

NB. For a version which generalizes over the underlying monad, see `output`

runSMT :: Symbolic a -> IO a Source #

Run an arbitrary symbolic computation, equivalent to ``runSMTWith` `defaultSMTCfg``

NB. For a version which generalizes over the underlying monad, see `runSMT`

runSMTWith :: SMTConfig -> Symbolic a -> IO a Source #

Runs an arbitrary symbolic computation, exposed to the user in SAT mode

NB. For a version which generalizes over the underlying monad, see `runSMTWith`

# Module exports

The SBV library exports the following modules wholesale, as user programs will have to import these modules to make any sensible use of the SBV functionality.