# sbv: Symbolic bit vectors: Bit-precise verification and automatic C-code generation.

Express properties about bit-precise Haskell programs and automatically prove them using SMT solvers. Automatically generate C programs from Haskell functions. The SBV library adds support for symbolic bit vectors, allowing formal models of bit-precise programs to be created.

  $ghci -XScopedTypeVariables Prelude> :m Data.SBV Prelude Data.SBV> prove$ \(x::SWord8) -> x shiftL 2 .== 4*x
Q.E.D.
Prelude Data.SBV> prove $forAll ["x"]$ \(x::SWord8) -> x shiftL 2 .== x
Falsifiable. Counter-example:
x = 128 :: SWord8

The library introduces the following types and concepts:

• SBool: Symbolic Booleans (bits)

• SWord8, SWord16, SWord32, SWord64: Symbolic Words (unsigned)

• SInt8, SInt16, SInt32, SInt64: Symbolic Ints (signed)

• SInteger: Symbolic unbounded integers (signed)

• SArray, SFunArray: Flat arrays of symbolic values

• STree: Full binary trees of symbolic values (for fast symbolic access)

• Symbolic polynomials over GF(2^n), and polynomial arithmetic

• Uninterpreted constants and functions over symbolic values, with user defined SMT-Lib axioms

Functions built out of these types can be:

• proven correct via an external SMT solver (the prove function)

• checked for satisfiability (the sat, and allSat functions)

• used in synthesis (the sat function with existential variables)

• optimized with respect to cost functions (the optimize, maximize, and minimize functions)

• quick-checked

• used in concrete test case generation (the genTest function)

Predicates can have both existential and universal variables. Use of alternating quantifiers provides considerable expressive power. Furthermore, existential variables allow synthesis via model generation.

The SBV library can also compile Haskell functions that manipulate symbolic values directly to C, rendering them as straight-line C programs.

In addition to the library, the installation will create the executable SBVUnitTests. You should run it once the installation is complete, to make sure the unit tests are run and all is well.

SBV is hosted at GitHub: http://github.com/LeventErkok/sbv. Comments, bug reports, and patches are always welcome.

The following people reported bugs, provided comments/feedback, or contributed to the development of SBV in various ways: Ian Blumenfeld, Ian Calvert, Iavor Diatchki, Tom Hawkins, Lee Pike, Austin Seipp, Don Stewart, Josef Svenningsson, and Nis Wegmann.

Release notes can be seen at: http://github.com/LeventErkok/sbv/blob/master/RELEASENOTES.

Versions [faq] 0.9, 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5, 0.9.6, 0.9.7, 0.9.8, 0.9.9, 0.9.10, 0.9.11, 0.9.12, 0.9.13, 0.9.14, 0.9.15, 0.9.16, 0.9.17, 0.9.18, 0.9.19, 0.9.20, 0.9.21, 0.9.22, 0.9.23, 0.9.24, 1.0, 1.1, 1.2, 1.3, 1.4, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 2.10, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 4.0, 4.1, 4.2, 4.3, 4.4, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 5.10, 5.11, 5.12, 5.13, 5.14, 5.15, 6.0, 6.1, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 7.10, 7.11, 7.12, 7.13, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9 (info) array (>=0.3.0.1), base (>=3 && <5), containers (>=0.3.0.0), deepseq (>=1.1.0.2), directory (>=1.0.1.1), filepath (>=1.1.0.4), HUnit (>=1.2.4.2), mtl (>=2.0.1.0), old-time (>=1.0.0.5), pretty (>=1.0.1.1), process (>=1.0.1.3), QuickCheck (>=2.4.0.1), random (>=1.0.1.1), strict-concurrency (>=0.2.4.1) [details] BSD-3-Clause Levent Erkok, 2010-2011 Levent Erkok Levent Erkok (erkokl@gmail.com) Formal Methods, Theorem Provers, Bit vectors, Symbolic Computation, Math, SMT http://github.com/LeventErkok/sbv http://github.com/LeventErkok/sbv/issues head: git clone git://github.com/LeventErkok/sbv.git by LeventErkok at 2011-12-28T08:34:12Z Arch:8.9, Debian:7.12, LTSHaskell:7.13, NixOS:8.9, Stackage:8.3 SBVUnitTests 53160 total (280 in the last 30 days) 2.75 (votes: 9) [estimated by Bayesian average] λ λ λ Docs uploaded by userBuild status unknown

#### Maintainer's Corner

For package maintainers and hackage trustees

[back to package description]
SBV: Symbolic Bit Vectors in Haskell
====================================

them using SMT solvers.

haskell
$ghci -XScopedTypeVariables Prelude> :m Data.SBV Prelude Data.SBV> prove$ \(x::SWord8) -> x shiftL 2 .== 4*x
Q.E.D.
Prelude Data.SBV> prove $forAll ["x"]$ \(x::SWord8) -> x shiftL 2 .== x
Falsifiable. Counter-example:
x = 128 :: SWord8


The function prove has the following type:

haskell
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 signed and unsigned
bit-vectors. Functions for checking satisfiability (sat and allSat) are also provided.
In addition, functions using the SBV library can be compiled to C automatically.

Resources
=========
The sbv library is hosted at [http://github.com/LeventErkok/sbv](http://github.com/LeventErkok/sbv).

The hackage site
for details on the API and the example use cases.

Comments, bug reports, and patches are always welcome.

Overview
========
The Haskell sbv library provides support for dealing with Symbolic Bit Vectors
in Haskell. It introduces the types:

- SBool: Symbolic Booleans (bits)
- SWord8, SWord16, SWord32, SWord64: Symbolic Words (unsigned)
- SInt8,  SInt16,  SInt32,  SInt64: Symbolic Ints (signed)
- SInteger: Symbolic unbounded integers (signed)
- 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

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 and Ord, along with several
other custom classes for simplifying bit-precise programming with symbolic values. The
framework takes full advantage of Haskell's type inference to avoid many common mistakes.

Furthermore, functions built out of these types can also be:

- proven correct via an external SMT solver (the prove function)
- checked for satisfiability (the sat, and allSat functions)
- used in synthesis (the sat function with existentials)
- optimized with respect to cost functions (the 'optimize', 'maximize', and 'minimize' functions)
- quick-checked
- used in concrete test case generation (the 'genTest' function)

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, lazily.

The SBV library can also compile Haskell functions that manipulate symbolic
values directly to C, rendering them as straight-line C programs.

Use of SMT solvers
==================
The sbv library uses third-party SMT solvers via the standard SMT-Lib interface:
[http://goedel.cs.uiowa.edu/smtlib/](http://goedel.cs.uiowa.edu/smtlib/)

The SBV library is designed to work with any SMT-Lib compliant SMT-solver, although integration with
individual solvers require some library work.
Currently, we fully support the [Yices](http://yices.csl.sri.com) SMT solver from SRI,
and the [Z3](http://research.microsoft.com/en-us/um/redmond/projects/z3/)
SMT solver from Microsoft.
Both solvers are available for Windows, Linux, and Mac OSX.

Prerequisites
=============
and install Yices (version 2.X) on your machine, and
make sure the "yices" executable is in your path before using the sbv library,
as it is the current default solver. Alternatively, you can specify the location
of yices executable in the environment variable SBV_YICES and the options to yices
in SBV_YICES_OPTIONS. The default for the latter is "-m -f".

SBV can also use Microsoft's Z3 SMT solver as a
The environment variables SBV_Z3 and SBV_Z3_OPTIONS can be used for choosing executable location
and custom options.  The default for the latter is "/in /smt2" on Windows and "-in -smt2"
on Mac and Linux. You should download Z3 version 3.2 or later.

Examples
=========
Please see the files under the
[Examples](http://github.com/LeventErkok/sbv/tree/master/Data/SBV/Examples)
directory for a number of interesting applications and use cases. Amongst others,
it contains solvers for Sudoku and N-Queens puzzles as mandatory SMT solver examples in
the Puzzles directory.

Installation
============
The sbv library is cabalized. Assuming you have cabal/ghc installed, it should merely
be a matter of running

cabal install sbv

Please see [INSTALL](http://github.com/LeventErkok/sbv/tree/master/INSTALL) for installation details.

Once the installation is done, you can run the executable SBVUnitTests which will
execute the regression test suite for sbv on your machine to ensure all is well.