SMT-LIB language
Since version 2.5.0, Alt-Ergo supports the SMT-LIB language from the SMT community. This support is enabled by the Dolmen library.
Note
In version 2.5.x, the --frontend dolmen option is required to get full
SMT-LIB support. Starting from version 2.6.0, this option became the default
and is no longer necessary.
Alt-Ergo supports the following SMT-LIB theories:
The Core theory of booleans.
The ArraysEx theory of functional arrays with extensionality.
The FixedSizeBitVectors theory of bit-vectors (since version 2.5.0).
The Reals theory of real numbers.
The Reals_Ints theory of real and integer numbers[2].
Bit-vectors
Alt-Ergo supports the FixedSizeBitVectors theory, as well as the additional
symbols from the QF_BV and BV logics.
The non-standard symbols bv2nat and (_ int2bv n) (where n > 0 is a natural number representing the target bit-vector size) for conversion
between integers and bit-vectors are supported.
Floating-Point Arithmetic
Alt-Ergo does not currently support the FloatingPoint SMT-LIB theory.
Instead, Alt-Ergo implements the second and third layers described in the paper
“A Three-tier Strategy for Reasoning about Floating-Point Numbers in
SMT” by Conchon et al.
Alt-Ergo provides the rounding function described in the paper by making
available all functions symbols with declarations of the form below, where
prec and exp are numerals greater than 1 and RoundingMode is defined in
the FloatingPoint SMT-LIB theory.
((_ ae.round prec exp) RoundingMode Real Real)
prec defines the number of bits in the significand, including the hidden bit,
and is equivalent to the sb parameter of the (_ FloatingPoint eb sb) sort
in the FloatingPoint SMT-LIB theory.
exp defines the absolute value of the exponent of the smallest representable
positive number (this is not the same as the emin value defined in IEEE-754,
which is the minimum exponent of the smallest normal positive number). An
appropriate value for exp can be computed from the eb and sb parameters
of the (_ FloatingPoint eb sb) sort as exp = 2^(eb - 1) + sb - 3.
The result of (_ ae.round prec exp) is always of the form (-1)^s * c * 2^q
where s is a sign (0 or 1), c is an integer with at most prec - 1
binary digits (i.e. 0 <= c < 2^(prec - 1)) and q >= -exp is an integer.
The following function symbols are provided as short synonyms for common floating point representations:
ae.float16is a synonym for(_ ae.round 11 24)ae.float32is a synonym for(_ ae.round 24 149)ae.float64is a synonym for(_ ae.round 53 1074)ae.float128is a synonym for(_ ae.round 113 16494)
Examples
Input:
(set-option :produce-models true)
(set-logic ALL)
(declare-const |0.3f32| Real)
(assert (= (ae.float32 RNE 0.3) |0.3f32|))
(declare-const |0.3f16| Real)
(assert (= (ae.float16 RNE 0.3) |0.3f16|))
(check-sat)
(get-model)
Output:
unknown
(
(define-fun |0.3f32| () Real (/ 5033165 16777216))
(define-fun |0.3f16| () Real (/ 1229 4096))
)