<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta>
      <journal-title-group>
        <journal-title>SMT</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Constraint Propagation for Bit-Vectors in Alt-Ergo⋆</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Hichem Rami Ait-El-Hara</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Guillaume Bury</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Basile Clément</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Pierre Villemot</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>OCamlPro SAS</institution>
          ,
          <addr-line>21 Rue de Chatillon, 75014, Paris</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Université Paris-Saclay, CEA, List</institution>
          ,
          <addr-line>F-91120, Palaiseau</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2025</year>
      </pub-date>
      <volume>23</volume>
      <fpage>10</fpage>
      <lpage>11</lpage>
      <abstract>
        <p>Alt-Ergo is an SMT solver with strong ties to the deductive program verification framework Why3. It is used by industrial program verification tools such as Frama-C, TIS-Analyzer and SPARK. In this paper, we present recent developments to Alt-Ergo and its frontend, Dolmen. We describe a new bit-vector solver currently under development in Alt-Ergo that supports the arithmetic and logic operators from the SMT-LIB “BV” logic. We also describe the changes made to Dolmen to support version 2.7 of the SMT-LIB standard. Alt-Ergo's new bit-vector solver leverages a new constraint propagation architecture, a rewritten interval module, and standard propagators adapted to Alt-Ergo's Shostak-like combination procedure. We provide some preliminary benchmark results, and report on our experience and ongoing challenges.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;SMT-LIB</kwd>
        <kwd>Bit-Vectors</kwd>
        <kwd>Constraint Propagation</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
    </sec>
    <sec id="sec-2">
      <title>2. General Architecture</title>
      <p>Alt-Ergo historically used a purely functional Tableaux-like solver for boolean constraints, which guided
most of the design. The Tableaux solver is still present, but Alt-Ergo now includes a CDCL solver with
Tableaux-like extensions that is now used as the default solver. The theory modules are shared between
both solvers, and combined by a Shostak-like combination procedure.
the SMT-LIB v2
standard</p>
      <p>Alt-Ergo’s
native language
Dolmen Parser</p>
      <p>API</p>
      <p>Dolmen Typer
Creation of the hashconsed
internal ASTs</p>
      <p>Solvers
unknown
unsat
front end
back end</p>
      <sec id="sec-2-1">
        <title>2.1. Shostak</title>
        <p>
          One of Alt-Ergo’s central modules is the one implementing equational reasoning for convex theories.
The original algorithm, called CC(X) [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ], is heavily inspired by the Shostak decision procedure: it
maintains a union-find data structure modulo a theory X, equipped with a solver and a canonizer, from
which implied equalities are used for congruence closure. The algorithm has later been extended into
another algorithm, AC(X) [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ], to also handle associative and commutative user-defined symbols. AC(X)
is obtained by augmenting ground AC completion with the canonizer and solver for the theory X.
        </p>
        <p>It is also at this level that case splits coming from theories (rather than from boolean disjunctions in
the input formula) are handled.</p>
      </sec>
      <sec id="sec-2-2">
        <title>2.2. Theories</title>
        <p>Alt-Ergo supplements the core (“Shostak”) algorithm used to decide equality with theory-specific solvers
to deal with the non-equational parts of theories. Each solver is responsible for storing the relevant
information in its own module. Theory solvers communicate through equalities (that are processed by
the CC(X) algorithm to produce substitutions that are then propagated to all theories) and predicates.
Each theory is also able to provide the solver with case-splits to deal with non-convex theories.</p>
        <p>
          Alt-Ergo provides theory modules for linear arithmetic over integers and rationals, fragments of
nonlinear arithmetic, polymorphic functional arrays with extensionality, algebraic data types, associative
and commutative symbols (built into the AC(X) algorithm), floating-point arithmetic [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ], and fixed-size
bit-vectors.
        </p>
        <p>
          Non-linear arithmetic Alt-Ergo uses a combination of the AC(X) framework and interval calculus
to handle non-linear integer arithmetic in a built-in way [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ]. The AC(X) framework is instantiated
with linear integer arithmetic (LIA) to handle linear equalities and the associativity and commutativity
properties of non-linear multiplication. NIA axioms are integrated into the interval calculus module
of Alt-Ergo in order to propagate the bounds of non-linear terms and to suggest case splits on finite
domains.
        </p>
        <p>ADTs Alt-Ergo supports algebraic data types. This is handled through the native combination of
Shostak solvers for the theory of records and of enumerated data types. The theory of enumerated data
types, and by extension of records, is not convex, so the Shostak solver is not complete. We supplement
the Shostak solver with a relational theory that keeps track of possible constructors and then uses the
case split mechanism. Within a case split the Shostak solver for records is used.
Floating-point arithmetic Alt-Ergo does not (yet) support the theory of floating-point numbers.
Instead, Alt-Ergo supports a theory of a round function which returns the rational closest to a real
according to a given floating point specification (bits of exponent, bits of mantissa, and rounding mode).</p>
        <p>This theory is currently used by tools such as Why3 by wrapping it in an algebraic data type to
represent the extra values (infinites, not-a-number, negative zero). We plan on integrating these
wrappers in Alt-Ergo itself to provide direct support for the SMT-LIB theory of floats.</p>
      </sec>
      <sec id="sec-2-3">
        <title>2.3. Constraint Propagation</title>
        <p>Many theories in Alt-Ergo make use of constraint propagation and store domains on the variables in
the problem; however, until recently, each theory solver had its own ad-hoc implementation of domains
(intervals for arithmetic, finite sets for enumerated types) and propagators (simplex and additional
non-linear propagators for arithmetic, intersection on equality for enumerated types).</p>
        <p>In Alt-Ergo 2.6, we introduced a new generic constraint propagation architecture and made it available
to theories. Domains are now stored within the same union-find data structure that is used for equational
reasoning, while propagators are implemented within each theory’s module.</p>
        <p>This new architecture allowed us to simplify the existing experimental theory of algebraic data
types and merge it with the existing theories for enumerated data types and records while preserving
reasoning power. The constraint-based implementation of arithmetic and logic bit-vector operators,
described in Section 3, also uses these new capabilities. The linear arithmetic module is the only
remaining module that has not been converted to this new architecture yet.</p>
        <p>One limitation of the current implementation is that each theory is responsible for performing its own
propagations, restricting opportunities for cross-theory propagations: there is currently no mechanism
for notifying a theory when a diferent theory’s domain shrinks. Work is ongoing to integrate constraint
propagation into Alt-Ergo’s main equality and predicate processing loop, opening the path to more
lfexible scheduling opportunities.</p>
      </sec>
      <sec id="sec-2-4">
        <title>2.4. Dolmen and SMT-LIB 2.7</title>
        <p>
          Alt-Ergo supports the SMT-LIB language as input since Alt-Ergo 2.2 [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]. This support was greatly
improved in Alt-Ergo 2.4 with the switch to Dolmen as a frontend, and the development version has
recently also added support for the newly released version 2.7 of SMT-LIB, which adds interesting
features such as prenex first order polymorphism, higher-order functions (aka maps), and new bit-vector
operations. Alt-Ergo has supported polymorphism from the beginning, and there are no current plans
to support higher-order functions, so only the new bit-vector operations needed new code to reason
about, see Section 3.
        </p>
        <p>
          That means that most of the changes to support SMT-LIB 2.7 (except for bit-vectors), are in the
frontend of Alt-Ergo, where we use the library from the Dolmen project [
          <xref ref-type="bibr" rid="ref6 ref7 ref8">6, 7, 8</xref>
          ] to handle parsing
and typechecking of input problems. We will discuss here the changes that were needed in Dolmen to
handle the new features of SMT-LIB 2.7.
        </p>
        <p>
          Polymorphism Alt-Ergo and Dolmen already support polymorphism, through both Alt-Ergo’s native
language and a polmoyphic extension of SMT-LIB 2.6 [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ], so the only work needed was adding the
support of sort parameters: while the current code supports locally bound type variables, SMT-LIB 2.7
uses sort/type variables that are declared once with a global scope, but that are then implicitly locally
bound in each statement.
        </p>
        <p>Higher-order SMT-LIB 2.7 adds maps, which are encodings of higher-order functions in first-order
logic. While this can be easily handled by a regular theory that defines an abstract type (for maps)
and the function application operator, there is one part of the specification that makes support for
higher-order application a bit tricky: the syntax for regular application is overloaded to also represent
application of the higher-order application operator. Correctly handling this requires a fair bit of care
to properly distinguish the regular first-order applications from the higher-order applications using
the first-order syntax, which is also made more complex by the presence of polymorphic maps (i.e.,
polymorphic functions with no term arguments and that return a map).</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. Bit-vectors</title>
      <p>We now describe the implementation of the bit-vector theory in Alt-Ergo. The bit-vector theory is
implemented by the combination of:
• An existing solver for the core bit-vector theory (concatenations and extractions), extended to
support negation – not described in this paper;
• A constraint propagation mechanism (described in this paper) for other operators, providing full
support for the SMT-LIB theory of fixed-size bit-vectors.</p>
      <p>
        The implementation of domains and propagators follows Chihani et al. [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] and uses a combination of
bit-patterns (“bitlists”) and interval domains. This combination is also used by Zeljić et al. [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] in an
mcSAT context.
      </p>
      <sec id="sec-3-1">
        <title>3.1. Core Bit-Vector Theory</title>
        <p>
          The core bit-vector theory with concat and extract is integrated in the Shostak solver, and was recently
updated to also support negation. While it is possible to further extend the solver to represent arbitrary
bitwise operators as in Cyrluk et al. [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ], this approach uses binary decision diagrams to represent
the canonical form of bit-vector expressions and is likely to quickly blow up for large expressions. In
addition, such an approach would have non-trivial interactions with extensions to the Shostak method
used in Alt-Ergo (namely, support for associative-commutative operators [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ]).
        </p>
      </sec>
      <sec id="sec-3-2">
        <title>3.2. Bitlists and Interval Domains</title>
        <p>The propagators for bit-vectors rely on two types of domains: bitlists and intervals. These are integrated
into the new constraint propagation interface introduced in Alt-Ergo 2.6.</p>
        <p>Bitlists Bitlists are domains used to represent the three possible states of bits in a bit-vector: a bit
is either set (known to be 1), cleared (known to be 0), or unknown. The concrete representation of
bitlists in a computer system is crucial for performance. In Alt-Ergo, we use arbitrary-size integers
(provided by the Zarith library, itself using GMP) to represent the domain of  as a pair ⟨1, ⟩ where
1 represents the bits known to be set in  and  represents the bits that are not known in  (could be
either set or cleared).</p>
        <p>
          The use of big integers to represent bitlists allows very eficient implementations for logical bit-vector
operations, which we adapt from Chihani et al. [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ] and Michel and Van Hentenryck [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ].
        </p>
        <p>
          For addition and subtraction, we use the algorithms from Dougall [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ]. These rely on the fact that
addition and subtraction have single-bit carries to provide an eficient and precise implementation of
the propagators from Michel and Van Hentenryck [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ].
        </p>
        <p>The propagator shown in Figure 2 is used for addition (logic operators are extended to bit-vectors by
operating independently on each bit). 1 (resp. 1) is a mask of the bits known to be 1 in  (resp. ),
and  is a mask of the bits whose value in  (resp. ) is unknown.  is the result of the addition when
all unknown bits are 0, and  is the result when all unknown bits are 1.  is a mask of the unknown
bits in the result, and 1 is a mask of the bits known to be 1 in the result.</p>
        <p>The crucial step is in Equation (3): because the carry in a binary addition is at most one bit, overflow
is only possible on the bits where  and  disagree, which are added to the unknown bits of  and .</p>
        <p>We do not implement precise propagators for multiplication as that would have a quadratic complexity.
Instead, we simply compute the known low bits (efectively providing an implementation of congruence
modulo powers of two), and rely on case splits or other integer reasoning to deal with multiplication.
1 =  ∧ ¬
smallest (unsigned) result
largest (unsigned) result
overflow is possible where  and  disagree
bits set in both  and  are set if known</p>
        <p>Although the SMT-LIB bit-vector theory uses bit-vectors with a specific (parametric) width, our
bitlists do not encode the width explicitly, relying on the types to encode this information instead.
Intervals Alt-Ergo already included a module to represent union of intervals, with explanations
(justifications) for each of the gaps between intervals. However, this module was found to be hard to
extend to properly support bit-vector operations, notably concatenation and extraction. We rewrote
the interval module with a parametric implementation providing basic building blocks to manipulate
intervals while correctly preserving explanations. Preserving correct explanations is critical for the
soundness of the whole solver, and isolating the code that needs to deal with them makes the code
easier to reason about and maintain. Those basic building blocks are then used to safely lift high-level
operations such as addition, multiplication, and extraction from intervals to unions of intervals. This
new interval module is now used for both the bit-vector solver and the arithmetic solver, although we
do not yet have direct communication between the intervals stored by both solvers (see Section 2.3).</p>
        <p>Note that using union of intervals (rather than just intervals) allows representing precisely intervals
for bit-vectors, without loss of precision in case of overflows or underflows. Instead, we simply
implement an operator (using the API described below) to implement an extract function that returns
the  low bits of an interval. For instance, when using 8-bit arithmetic, subtracting 4 from the interval
[0, 241] yields [− 4, 237]; we then call extract for the low bits of this interval to obtain the union
[0, 237] ∪ [251, 255].</p>
        <p>
          The use of unions in the representation is relatively controlled. In particular, we do not create holes
in the union from information coming from the (low) bits of a variable. For instance, if  is an 8-bit
variable that is known to have its least-significant bit set, its interval is obtained by doubling [0, 127]
then adding 1, and so is [
          <xref ref-type="bibr" rid="ref1">1, 255</xref>
          ] – not an union of 128 singleton intervals. The cross-domain propagators
(see Section 3.3) would be able to create such holes – Chihani et al. [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ] found that allowing a single hole
per interval was optimal, but we have not implemented this logic in Alt-Ergo.
        </p>
        <p>Ordered Types The interval module is parametric over an ordered type. An ordered type extends a
type of “finite values” (typically integers or rationals) with a positive and negative innfiites, and also
provide a successor and a predecessor funtion.</p>
        <p>The successor and predecessor functions do not exist on rationals: we use the well-known trick of
infinitesimals, i.e., we use pairs  +  where  is a rational,  is an integer, and  is an infinitesimal
considered smaller than any rational.</p>
        <p>This allows the representation of open rational intervals such as (3.5, 7) by closed intervals such as
[3.5 + , 7 −  ]. In practice, infinitesimals are not exposed by the ordered type interface, and the rest of
the interval module only makes use of a few documented axioms (e.g., pred(succ()) =  if  is finite)
on the predecessor and successor functions, providing flexibility in the actual implementation of the
ordered type interface.</p>
        <p>Core Intervals The core of the interval module is a functor taking an ordered type and returning
a “core interval” module. We use two representations of intervals: a normalized representation, with
type union (represented as a sequence of disjoint intervals with an explanation for the gaps) and an
unnormalized one, with type set (represented as an arbitrary set of intervals). Intervals are stored in
the normalized representation, but the unnormalized representation can be used to implement complex
operations.</p>
        <p>The core interval API exposes higher order functions to convert from operations on intervals or
bounds without explanations to core intervals (union and set types) with explanations. Some examples
of such functions include:
• The function map_to_set computes the image of an union by an arbitrary isotone function f
over intervals, i.e., a function monotone with respect to inclusion (if 1 ⊆ 2 then  (1) ⊆  (2)).
• The function partial_map_inc computes the image of a partial increasing function such as
the conversion from reals to integers.
• The function trisection_map_to_set is provided to split a union between the values strictly
smaller than a central value , the singleton {} (if within the union) and the values strictly
larger than . This is used to provide piecewise definitions of multiplication, division.
Interval Algebra The rest of the interval module is concerned with lifting arithmetic operations from
values to intervals, using the functions provided by the core interval module. Crucially, this does not need
to care about explanations: implementers only need to make sure to use the appropriate function from
the core interval module (depending on e.g., monotony of the implemented function). This principled
design makes the code for interval operations clearer and easier to read, as it is not interleaved with
concerns about explanations. The design made it possible to implement the new functions related
to euclidean division that were required for bit-vector operations with reasonable confidence. This
also allowed us to improve the precision of explanations in the implementation of multiplication: the
existing implementation used coarser explanations than necessary out of an abundance of caution, but
the generic implementation of monotone functions in the core interval module is able to preserve more
precise explanations.</p>
      </sec>
      <sec id="sec-3-3">
        <title>3.3. Intra-Domain and Cross-Domain Propagations</title>
        <p>Propagators are registered on specific domains of the variables. When the corresponding domain is
reduced and changes, all the propagators that are watching this specific domain fire and add added to a
queue for further propagation. Depending on the constraint, propagators are registered either only on
the bitlist domains (this is the case for bit-wise operators such as bvor or bvand), only on the interval
domains (this is the case for division and remainder), or both bitlist and interval domains.</p>
        <p>
          In addition, special “cross-domain” propagators are used to perform reductions between the bitlist
and interval domains. These are taken from Chihani et al. [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ], in particular to refine interval bounds
from bitlists.
        </p>
        <p>We currently use a simple scheduling strategy, repeated until a fixpoint is reached: first we saturate
same-domain propagators separately for each domain, then we saturate cross-domain propagators.</p>
      </sec>
      <sec id="sec-3-4">
        <title>3.4. Case Splits</title>
        <p>The bit-vector module is integrated into the case-split mechanism for completeness and model generation.
We perform case splits on bit-vectors by selecting a value for the most significant unknown bit from
one of the variables in the problem with minimal, non-fully-known, domain size. This is the simplest
heuristic that we found to perform reasonably well.</p>
        <p>
          The use of case splits for bit-vectors revealed that the current implementation in Alt-Ergo is too
aggressive, and Alt-Ergo can end up spending a lot of time performing unnecessary bit-vector case
splits when making a single boolean decision would allow to conclude quickly. Currently, control
does not return to the outer CDCL solver until a satisfying bit-vector assignment has been found. We
plan on tackling this issue by better integrating the case split mechanism with the outer CDCL solver,
and exploring strategies for selecting case splits along the lines of the labelling strategies described in
Chihani et al. [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ].
        </p>
      </sec>
      <sec id="sec-3-5">
        <title>3.5. Diference Logic</title>
        <p>
          Alt-Ergo uses a simplex algorithm for linear arithmetic, but does not have a solver for diference logic.
Chihani et al. [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ] reported making successful use of a diference logic solver to implement a global delta
domain.
        </p>
        <p>
          We implemented an incremental solver for diference logic following Feydy et al. [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ]. The solver is
currently instantiated for unsigned bit-vector comparisons only; however, we plan on adding support
both unsigned and signed bit-vector comparisons and to detect when conversions between signed and
unsigned comparisons are possible based on intervals.
        </p>
        <p>The diference logic solver is still experimental and has not been integrated into the main development
branch of Alt-Ergo yet. It has not been used for the benchmarks in the experimental evaluation section.</p>
      </sec>
      <sec id="sec-3-6">
        <title>3.6. Conversions Into and From Integers</title>
        <p>In order to leverage the simplex algorithm for integer variables, and to better handle conversions
between bit-vectors and integers (either using the non-standard bv2nat and int2bv functions, or the
new conversion operators from the SMT-LIB standard version 2.7), we maintain two maps between
canonical representatives of bit-vector and integer variables.</p>
        <p>Note that theory solvers in Alt-Ergo are mostly independent; hence, we alternate between runs of
the constraint propagation described in this paper and runs of the simplex algorithm for pure integer
problems. We plan on later improving the integration of the simplex into the constraint propagation
mechanism.</p>
        <p>
          This conversion is currently only performed for bit-vector expressions that appear within a bv2nat
constructor, or within a (bit-vector) comparison such as bvule, bvult, etc. We are interested in
investigating whether performing this conversion for all bit-vector terms, as in int-blasting [
          <xref ref-type="bibr" rid="ref15">15</xref>
          ] approaches,
could be beneficial.
        </p>
        <p>Map from bit-vectors to integers For a bit-vector variable , we maintain a map from all the
right-shifts of  (defined below) to a corresponding integer variable. If  has type (_ BitVec w), i.e.,
a bit-vector of width , we create an integer constant  to represent the integer value of the extraction
of bits ,  + 1, ...,  − 1 of  (using a little-endian convention, so bit  − 1 is the most significant bit). If
we denote bv2nat() the value of a bit-vector  as an integer (as defined in the SMT-LIB specification),
the value bv2nat() is also equal to ⌊bv2nat()/2⌋, i.e., the right arithmetic shift of bv2nat() by .
Appropriate inequalities to encode this (floored) division are also added to the simplex.</p>
        <p>For an extraction [,] of bits ,  + 1, ...,  − 1, we then compute bv2nat([,]) as  − 2−  .
Concatenations are similarly represented by multiplying by the appropriate power of 2.</p>
        <p>Using right-shift in this way allows to limit the number of integer variables created to represent
extractions to be linear (rather than quadratic) in the bit-vector width.</p>
        <p>This map is updated when the canonical representative of a bit-vector equivalence class changes,
propagating relevant information on the integer variables for consumption by the simplex.
Map from integers to bit-vectors Integer variables are represented in Alt-Ergo’s Shostak solver by
a polynomial. We maintain a similar map from polynomials to the corresponding bit-vector variable,
which may have been introduced to represent a right-shift.</p>
        <p>When the canonical representative of an integer variable changes, updating the map allows to
propagate new equalities learned by the simplex (in the integers) to corresponding equalities in the
bit-vectors, which can cause further propagations on bit-vector domains.</p>
        <p>Conversion of bit-vector arithmetic operators Furthermore, we also convert arithmetic
expressions on bit-vectors (in the same context as previously, either in bv2nat operations or bit-vector
comparisons) into arithmetic expressions on the corresponding integer variables. Unlike int-blasting
approaches, we only convert arithmetic operation, not bitwise operations.</p>
        <p>For a bit-vector polynomial (using e.g., bvadd, bvmul, etc.) we keep a canonical version with
coeficients computed modulo 2 (where  is the bit-width). For each distinct bit-vector with the same
canonical polynomial we also have a constant  defined so that bv2nat() =  + 2 (where  is
the canonical polynomial of  and  is the bit-width of ). We also record appropriate bounds for
bv2nat().</p>
        <p>When there is a relation between bit-vectors (e.g., an equality or a comparison), we replicate the
relation on the integer variables using the stored polynomial and ofset, which is then picked up by the
simplex.</p>
        <p>
          Note that this design is quite diferent from that in Chihani et al. [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ], where only a single type
(integers) is used to represent bit-vectors. In Alt-Ergo, we currently use two types because the use of a
Shostak-like combination procedure requires having a canonical form per term, but we want to be able
to have both integer (polynomial) and bit-vector (concatenation) canonical forms. This is important so
that Alt-Ergo does not lose existing reasoning capabilities around bit-vectors, but requires more work
for conversion between the two representations.
        </p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Experimental Evaluation</title>
      <p>In this section, we evaluate Alt-Ergo’s bit-vector capabilities on a set of benchmarks coming from
program verification, on a subset of the SMT-LIB QF_BV benchmarks, and on some manually crafted
examples. Note that on these benchmarks our implementation still sufers from the “agressive case splits”
problem described in Section 3.4 and locks us into a naive strategy. We expect further improvements
from re-architecting around the issue.</p>
      <p>
        All the benchmarks below use a time limit of 20 seconds. We only report unsat results.
QF_BV subset We first compare the new solver against other solvers on a random subset of 10498
problems from the QF_BV category of the SMT-LIB benchmarks library [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] (the 2022 version of the
benchmarks has been used). This subset has been generated using the provided selection.py1 script
with a seed of 42, a ratio of 25% and a minimum of 300 benchmarks.
      </p>
      <p>The QF_BV category only contains quantifier-free bit-vector problems. It is a good proxy to evaluate
the strength of the ground bit-vector solver in isolation, but does not necessarily presume of the
performance of real-world usage for more complex program verification tasks typically involving
quantifiers and multiple theories.</p>
      <p>
        We compare Alt-Ergo with the bit-vector solver against Z3 4.14.1 [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ], CVC5 1.2.1 [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ], Bitwuzla
0.7.0 [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ], Yices 2.6.5 [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ] and COLIBRI 2025.02 [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ] (COLIBRI implements a similar propagators-based
approach) in Table 1. The unique column indicates the number of problems for which a solver is the
only one that returned unsat. In wtime unsat column, we focused on the subset of 3,208 problems solved
as unsatisfiable by all solvers in Table 1. The wtime unsat is the wall time (in seconds) spent by the
solver over this specific subset.
1The script is available in the SMT-COMP repository:
https://github.com/SMT-COMP/smt-comp/blob/master/tools/selection/selection.py
      </p>
      <p>
        The new solver’s performance is slightly below that of COLIBRI, which is expected – while Alt-Ergo’s
new solver is inspired by the one in COLIBRI, some architectural constraints in Alt-Ergo prevents us
from implementing some crucial reasoning steps. Bitwuzla dominates the competition, especially in
terms of unique problems solved, but does not support the same range of theories as the other solvers.
Benchmarks from program verification Since Alt-Ergo is frequently used within the Why3
toolchain, it is relevant to compare the performance of the new solver against other solvers using this
toolchain. We now focus on an internal benchmark set of 9,038 industrial problems provided by one of
our partners in the DéCySif project. These problems have been generated from verification conditions
of C programs using the J3 tool. They are translated into SMT-LIB by Why3 [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ] using solver-specific
drivers, so that all solvers do not get the exact same SMT-LIB input.
      </p>
      <p>Unlike the QF_BV category of SMT-LIB benchmarks that only compares the ground bit-vector solvers,
this benchmark set provides a more contextual comparison. The problems involve bit-vectors and other
SMT features such as uninterpreted functions, uninterpreted sorts, floats and integers and are more
representative of real-world program verification workflows.</p>
      <p>For Alt-Ergo, two diferent drivers are used: a legacy driver using a Why3-provided axiomatization
of bit-vectors, and a new driver using the SMT-LIB BV primitives developed in this work (shown as
“Alt-Ergo + BV” in the tables).</p>
      <p>We compare the performance of solvers on the J3 dataset in Table 2. The “Alt-Ergo (ax)” solver is
the development version of Alt-Ergo without the new bit-vector solver, and instead uses the Why3
axiomatization. The “Alt-Ergo + BV” solver is the new bit-vector solver described in this paper. The table
shows that the new bit-vector solver provides a significant improvement to Alt-Ergo’s reasoning abilities
on this dataset. We also compare the performance of Z3 4.14.1 and CVC5 1.2.1 on this benchmark
set. We did not take Bitwuzla and Yices on because they do not support all the theories used in these
benchmarks: Bitwuzla does not support uninterpreted sorts and Yices does not support FP theory. We
are not retaining results for COLIBRI because it encountered errors on most of these files. The unique
column provides the number of benchmarks that are only solved by a specific solver. In wtime unsat
column, we focused on the subset of 5,335 problems solved as unsatisfiable by all solvers in Table 2.
The wtime unsat is the wall time (in seconds) spent by the solver over this specific subset.</p>
      <p>The new solver solves more problems than Z3. It also solves less problems than CVC5 overall, but is
still able to provide a reasonable contribution in terms of unique results, providing complementarity.
Manually crafted examples Finally, we examine the behavior of diferent solvers on some simple
problems with bit-vector-to-int conversions. We compare Alt-Ergo (with the bit-vector solver) to Z3
4.13.4 and CVC5. Note that we use the non-standard bv2nat rather than the new ubv_to_int function
from SMT-LIB 2.7 as ubv_to_int is not supported by all solvers.</p>
      <p>The first two examples, shown in Figure 3, state a simple property relating the conversion to integers
of the low and high bits of a bit-vector of width 64. These examples illustrate a strength of integration
with the existing core bit-vector solver and the Shostak combination procedure in Alt-Ergo: while
Z3 is able to quickly prove the first example with concat, it fails to do so when using the logically
equivalent formulation using extract. On the other hand, the Shostak-based solver in Alt-Ergo
efectively normalizes the second example to the first, and Alt-Ergo is able to prove both.
(declare-const x (_ BitVec 64))
(declare-const hi (_ BitVec 32))
(declare-const lo (_ BitVec 32))
(assert (not
(=&gt; (= x (concat hi lo))
(= (bv2nat x)
(+ (* 4294967296 (bv2nat hi))</p>
      <p>(bv2nat lo))))))
(check-sat)</p>
      <p>The last example, shown in Figure 4, is another simple property regarding the absence of overflow of
integers when computing a bit-vector addition. As the bvuaddo operator from SMT-LIB 2.7 (used to
detect when an addition overflows) is not supported by all solvers, we use a straightforward encoding
using bv2nat instead using the standard’s definition of the operator. This simple example is only
proved by Alt-Ergo thanks to the communication between the integer and bit-vector theories.</p>
      <p>The results on the handcrafted examples are summarised in Table 3.</p>
    </sec>
    <sec id="sec-5">
      <title>5. Conclusion and Future Work</title>
      <p>We have presented in this paper recent developments in the Alt-Ergo SMT solver. The main
improvements are support for arithmetic and logical bit-vector operators from the SMT-LIB theory “BV”, and
the support for the SMT-LIB standard version 2.7 through Dolmen.</p>
      <p>
        The implementation of arithmetic and logical bit-vector operators follows closely Chihani et al. [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ],
adapted to the context of a Shostak-style combination procedure. This was an opportunity to integrate a
constraint propagation mechanism into Alt-Ergo’s core solver, and a full rewrite of the intervals module
for better modularity and readability.
      </p>
      <p>
        In the near future, we plan to improve direct cross-theory propagations (notably between bit-vectors
and arithmetic), and integrate the diference logic solver (called the global Delta domain in Chihani
et al. [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]) in Alt-Ergo’s main development branch. We also plan on reworking the case split mechanism
in Alt-Ergo to better integrate with the CDCL solver, and on integrating Alt-Ergo’s floating-point and
bit-vector theories to provide a full implementation of the SMT-LIB floating-point theory.
      </p>
    </sec>
    <sec id="sec-6">
      <title>Declaration on Generative AI</title>
      <p>During the preparation of this work, the authors used Gemini 2.5 in order to: Peer review simulation.
Further, the authors used ChatGPT for the abstract in order to: Improve writing style. After using
this tool, the authors reviewed and edited the content as needed and take full responsibility for the
publication’s content.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>M.</given-names>
            <surname>Preiner</surname>
          </string-name>
          , H.
          <article-title>-</article-title>
          <string-name>
            <surname>J. Schurr</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          <string-name>
            <surname>Barrett</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          <string-name>
            <surname>Fontaine</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Niemetz</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          <article-title>Tinelli, SMT-LIB release 2023 (nonincremental benchmarks</article-title>
          ),
          <year>2024</year>
          . URL: https://doi.org/10.5281/zenodo.10607722. doi:
          <volume>10</volume>
          .5281/ zenodo.10607722.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>S.</given-names>
            <surname>Conchon</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E.</given-names>
            <surname>Contejean</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Kanig</surname>
          </string-name>
          ,
          <string-name>
            <surname>S. Lescuyer,</surname>
          </string-name>
          <article-title>CC(X): Semantical combination of congruence closure with solvable theories</article-title>
          ,
          <source>in: Post-proceedings of the 5th International Workshop on Satisfiability Modulo Theories (SMT</source>
          <year>2007</year>
          ), volume
          <volume>198</volume>
          (
          <article-title>2</article-title>
          ) of Electronic Notes in Computer Science, Elsevier Science Publishers,
          <year>2008</year>
          , pp.
          <fpage>51</fpage>
          -
          <lpage>69</lpage>
          . doi:
          <volume>10</volume>
          .1016/j.entcs.
          <year>2008</year>
          .
          <volume>04</volume>
          .080.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>S.</given-names>
            <surname>Conchon</surname>
          </string-name>
          , E. Contejean,
          <string-name>
            <given-names>M.</given-names>
            <surname>Iguernelala</surname>
          </string-name>
          ,
          <article-title>Canonized rewriting and ground AC completion modulo Shostak theories : Design and implementation</article-title>
          ,
          <source>Logical Methods in Computer Science</source>
          <volume>8</volume>
          (
          <year>2012</year>
          )
          <fpage>1</fpage>
          -
          <lpage>29</lpage>
          . URL: http://www.lmcs-online.org/ojs/viewarticle.php?id=1037&amp;layout=abstract&amp;iid= 40. doi:
          <volume>10</volume>
          .2168/LMCS-8(
          <issue>3</issue>
          :16)
          <year>2012</year>
          ,
          <article-title>selected Papers of the Conference Tools and Algorithms for the Construction and Analysis of Systems (TACAS</article-title>
          <year>2011</year>
          ), Saarbrücken, Germany,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>S.</given-names>
            <surname>Conchon</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Iguernelala</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Ji</surname>
          </string-name>
          , G. Melquiond,
          <string-name>
            <given-names>C.</given-names>
            <surname>Fumex</surname>
          </string-name>
          ,
          <article-title>A Three-tier Strategy for Reasoning about Floating-Point Numbers in SMT</article-title>
          , in: V.
          <string-name>
            <surname>Kuncak</surname>
          </string-name>
          , R. Majumdar (Eds.),
          <source>Lecture Notes in Computer Science</source>
          , volume
          <volume>10427</volume>
          of Lecture Notes in Computer Science, Springer, Heidelberg, Germany,
          <year>2017</year>
          , pp.
          <fpage>419</fpage>
          -
          <lpage>435</lpage>
          . URL: https://inria.hal.science/hal-01522770. doi:
          <volume>10</volume>
          .1007/ 978-3-
          <fpage>319</fpage>
          -63390-9\_
          <fpage>22</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>S.</given-names>
            <surname>Conchon</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Coquereau</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Iguernlala</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Mebsout</surname>
          </string-name>
          ,
          <article-title>Alt-ergo 2.2</article-title>
          , in: SMT Workshop: International Workshop on Satisfiability Modulo Theories,
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>G.</given-names>
            <surname>Bury</surname>
          </string-name>
          ,
          <article-title>Dolmen: A validator for SMT-LIB and much more</article-title>
          .,
          <source>in: SMT</source>
          ,
          <year>2021</year>
          , pp.
          <fpage>32</fpage>
          -
          <lpage>39</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>G.</given-names>
            <surname>Bury</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Bobot</surname>
          </string-name>
          ,
          <article-title>Verifying models with dolmen</article-title>
          .,
          <source>in: SMT</source>
          ,
          <year>2023</year>
          , pp.
          <fpage>62</fpage>
          -
          <lpage>70</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>G.</given-names>
            <surname>Bury</surname>
          </string-name>
          ,
          <article-title>Minimal logic detection and exporting SMT-LIB problems with dolmen (</article-title>
          <year>2024</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>Z.</given-names>
            <surname>Chihani</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Marre</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Bobot</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Bardin</surname>
          </string-name>
          ,
          <article-title>Sharpening Constraint Programming approaches for Bit-Vector Theory, in: Integration of AI and OR Techniques in Constraint Programming, Integration of AI and OR Techniques in Constraint Programming, Padova</article-title>
          , Italy,
          <year>2017</year>
          . URL: https://cea.hal.science/cea-01795779.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>A.</given-names>
            <surname>Zeljić</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C. M.</given-names>
            <surname>Wintersteiger</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Rümmer</surname>
          </string-name>
          ,
          <article-title>Deciding bit-vector formulas with mcsat</article-title>
          , in: N.
          <string-name>
            <surname>Creignou</surname>
          </string-name>
          , D. Le Berre (Eds.),
          <source>Theory and Applications of Satisfiability Testing - SAT 2016</source>
          , Springer International Publishing, Cham,
          <year>2016</year>
          , pp.
          <fpage>249</fpage>
          -
          <lpage>266</lpage>
          . URL: http://www.philipp.
          <source>ruemmer.org/publications/ mcbv2016.pdf.</source>
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>D.</given-names>
            <surname>Cyrluk</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. O.</given-names>
            <surname>Möller</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Rueß</surname>
          </string-name>
          ,
          <article-title>An eficient decision procedure for the theory of fixed-sized bit-vectors</article-title>
          ,
          <source>in: Proceedings of the 9th International Conference on Computer Aided Verification, CAV '97</source>
          , Springer-Verlag, Berlin, Heidelberg,
          <year>1997</year>
          , p.
          <fpage>60</fpage>
          -
          <lpage>71</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>L. D.</given-names>
            <surname>Michel</surname>
          </string-name>
          ,
          <string-name>
            <surname>P. Van Hentenryck</surname>
          </string-name>
          ,
          <article-title>Constraint satisfaction over bit-vectors</article-title>
          , in: M.
          <string-name>
            <surname>Milano</surname>
          </string-name>
          (Ed.),
          <source>Principles and Practice of Constraint Programming</source>
          , Springer Berlin Heidelberg, Berlin, Heidelberg,
          <year>2012</year>
          , pp.
          <fpage>527</fpage>
          -
          <lpage>543</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>J.</given-names>
            <surname>Dougall</surname>
          </string-name>
          ,
          <article-title>Bit-twiddling: Addition with unknown bits</article-title>
          ,
          <year>2020</year>
          . URL: https://dougallj.wordpress.com/
          <year>2020</year>
          /01/13/bit-twiddling
          <article-title>-addition-with-unknown-bits/.</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>T.</given-names>
            <surname>Feydy</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Schutt</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P. J.</given-names>
            <surname>Stuckey</surname>
          </string-name>
          ,
          <article-title>Global diference constraint propagation for finite domain solvers</article-title>
          ,
          <source>in: Proceedings of the 10th International ACM SIGPLAN Conference on Principles and Practice of Declarative Programming</source>
          ,
          <source>PPDP '08</source>
          ,
          <string-name>
            <surname>Association</surname>
          </string-name>
          for Computing Machinery, New York, NY, USA,
          <year>2008</year>
          , p.
          <fpage>226</fpage>
          -
          <lpage>235</lpage>
          . URL: https://doi.org/10.1145/1389449.1389478. doi:
          <volume>10</volume>
          .1145/1389449. 1389478.
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Zohar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Irfan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Mann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Niemetz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Nötzli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Preiner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Reynolds</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Barrett</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Tinelli</surname>
          </string-name>
          ,
          <article-title>Bit-precise reasoning via int-blasting</article-title>
          , in: B.
          <string-name>
            <surname>Finkbeiner</surname>
          </string-name>
          , T. Wies (Eds.),
          <source>Proceedings of the 23rd International Conference on Verification, Model Checking, and Abstract Interpretion (VMCAI'22)</source>
          , volume
          <volume>13182</volume>
          of Lecture Notes in Computer Science, Springer,
          <year>2022</year>
          , pp.
          <fpage>496</fpage>
          -
          <lpage>518</lpage>
          . URL: http://theory. stanford.edu/~barrett/pubs/ZIM+22.pdf. doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>030</fpage>
          -94583-1\_
          <fpage>24</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <surname>L. de Moura</surname>
          </string-name>
          , N. Bjørner,
          <article-title>Z3: an eficient smt solver</article-title>
          ,
          <source>in: 2008 Tools and Algorithms for Construction and Analysis of Systems</source>
          , Springer, Berlin, Heidelberg,
          <year>2008</year>
          , pp.
          <fpage>337</fpage>
          -
          <lpage>340</lpage>
          . URL: https://www. microsoft.com/en-us/research/publication/z3
          <article-title>-an-eficient-smt-solver/.</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>H.</given-names>
            <surname>Barbosa</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C. W.</given-names>
            <surname>Barrett</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Brain</surname>
          </string-name>
          , G. Kremer,
          <string-name>
            <given-names>H.</given-names>
            <surname>Lachnitt</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Mann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Mohamed</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Mohamed</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Niemetz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Nötzli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Ozdemir</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Preiner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Reynolds</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Sheng</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Tinelli</surname>
          </string-name>
          ,
          <string-name>
            <surname>Y. Zohar,</surname>
          </string-name>
          <article-title>cvc5: A versatile and industrial-strength SMT solver</article-title>
          , in: D.
          <string-name>
            <surname>Fisman</surname>
          </string-name>
          , G. Rosu (Eds.),
          <article-title>Tools and Algorithms for the Construction and Analysis of Systems -</article-title>
          28th International Conference, TACAS 2022,
          <article-title>Held as Part of the European Joint Conferences on Theory and Practice of Software, ETAPS 2022</article-title>
          , Munich, Germany, April 2-
          <issue>7</issue>
          ,
          <year>2022</year>
          , Proceedings,
          <string-name>
            <surname>Part</surname>
            <given-names>I</given-names>
          </string-name>
          , volume
          <volume>13243</volume>
          of Lecture Notes in Computer Science, Springer,
          <year>2022</year>
          , pp.
          <fpage>415</fpage>
          -
          <lpage>442</lpage>
          . URL: https://doi.org/10.1007/978-3-
          <fpage>030</fpage>
          -99524-9_
          <fpage>24</fpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>030</fpage>
          -99524-9\_
          <fpage>24</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>A.</given-names>
            <surname>Niemetz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Preiner</surname>
          </string-name>
          , Bitwuzla, in: C.
          <string-name>
            <surname>Enea</surname>
            ,
            <given-names>A</given-names>
          </string-name>
          . Lal (Eds.),
          <source>Computer Aided Verification - 35th International Conference, CAV 2023</source>
          , Paris, France,
          <source>July 17-22</source>
          ,
          <year>2023</year>
          , Proceedings,
          <string-name>
            <surname>Part</surname>
            <given-names>II</given-names>
          </string-name>
          , volume
          <volume>13965</volume>
          of Lecture Notes in Computer Science, Springer,
          <year>2023</year>
          , pp.
          <fpage>3</fpage>
          -
          <lpage>17</lpage>
          . URL: https://doi.org/10.1007/ 978-3-
          <fpage>031</fpage>
          -37703-
          <issue>7</issue>
          _1. doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>031</fpage>
          -37703-7\_1.
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>B.</given-names>
            <surname>Dutertre</surname>
          </string-name>
          , Yices
          <volume>2</volume>
          .2, in: A.
          <string-name>
            <surname>Biere</surname>
          </string-name>
          , R. Bloem (Eds.), Computer-Aided
          <string-name>
            <surname>Verification</surname>
          </string-name>
          (CAV'
          <year>2014</year>
          ), volume
          <volume>8559</volume>
          of Lecture Notes in Computer Science, Springer,
          <year>2014</year>
          , pp.
          <fpage>737</fpage>
          -
          <lpage>744</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>B.</given-names>
            <surname>Marre</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Bobot</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Chihani</surname>
          </string-name>
          ,
          <article-title>Real Behavior of Floating Point Numbers</article-title>
          , in: The SMT Workshop,
          <year>SMT 2017</year>
          , 15th International Workshop on Satisfiability Modulo Theories, Heidelberg, Germany,
          <year>2017</year>
          . URL: https://cea.hal.science/cea-01795760.
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>F.</given-names>
            <surname>Bobot</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.-C.</given-names>
            <surname>Filliâtre</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Marché</surname>
          </string-name>
          ,
          <string-name>
            <surname>A. Paskevich,</surname>
          </string-name>
          <article-title>Why3: Shepherd your herd of provers</article-title>
          ,
          <source>in: Boogie</source>
          <year>2011</year>
          : First International Workshop on Intermediate Verification Languages, Wrocław, Poland,
          <year>2011</year>
          , pp.
          <fpage>53</fpage>
          -
          <lpage>64</lpage>
          . https://hal.inria.fr/hal-00790310.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>