<!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 />
    <article-meta>
      <title-group>
        <article-title>Lemmas on Demand for Lambdas</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Mathias Preiner</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Aina Niemetz</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Armin Biere</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Institute for Formal Models and Verification Johannes Kepler University</institution>
          ,
          <addr-line>Linz</addr-line>
          ,
          <country country="AT">Austria</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>-We generalize the lemmas on demand de- proposed [10], which uses l -terms similarly to UCLID. cBiosioolnectporrotcoedhuarnedlfeornoanr-rraeycurlosgiviec aansd imnopnle-emxetenntesidonianl This extension provides support for modeling memset, lambda terms. We focus on the implementation aspects memcpy and loop summarizations. However, it does of our new approach and discuss the involved algorithms not make use of native support of l -terms provided aarnrdayosp,tiamrrizaaytioonpseriantimonosreadnedtaSilM.FTu- LrtIhBerv,2wemsahcorwoshaorwe by an SMT solver. Instead, it reduces instances in the represented as lambda terms and lazily handled with theory of arrays with l -terms to a theory combination lemmas on demand. We provide experimental results that supported by solvers such as Boolector [3] (without demonstrate the effect of native lambda support within an SMT solver and give an outlook on future work. native support for l -terms), CVC4, STP [12], and Z3 [6]. In this paper, we generalize the decision procedure I. INTRODUCTION for the theory of arrays with bit vectors as introduced in [3] to lazily handle non-recursive and nonextensional l -terms. We show how arrays, array operations and SMT-LIB v2 macros are represented in Boolector as l -terms and introduce a lemmas on demand procedure for lazily handling l -terms in Boolector in detail. We summarize an experimental evaluation and compare our results to solvers with SMT-LIB v2 macro support (CVC4, MathSAT [5], SONOLAR [13] and Z3) and finally, give an outlook on future work.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        The theory of arrays as axiomatized by
McCarthy [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] enables us to reason about memory
(components) in software and hardware verification, and
is particularly important in the context of deciding
satisfiability of first order formulas w.r.t. first order
theories, also known as Satisfiability Modulo Theories
(SMT). However, it is restricted to array operations on
single array indices and lacks support for efficiently
modeling operations such as memory initialization and
parallel updates (memset and memcpy in the standard
C library).
      </p>
      <p>
        In 2002, Seshia et al. [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] introduced an approach to
overcome these limitations by using restricted l -terms
to model array expressions (such as memset and
memcpy), ordered data structures and partially interpreted
functions within the SMT solver UCLID [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]. The
SMT solver UCLID employs an eager SMT solving
approach and therefore eliminates all l -terms through
b -reduction, which replaces each argument variable
with the corresponding argument term as a preliminary
rewriting step. Other SMT solvers that employ a lazy
SMT solving approach and natively support l -terms
such as CVC4 [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] or Yices [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] also treat them eagerly,
similarly to UCLID, and eliminate all occurrences of
l -terms by substituting them with their instantiated
function body (cf. C-style macros). Eagerly eliminating
l -terms via b -reduction, however, may result in an
exponential blow-up in the size of the formula [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ].
Recently, an extension of the theory of arrays was
      </p>
      <p>This work was funded by the Austrian Science Fund (FWF)
under NFN Grant S11408-N23 (RiSE).</p>
    </sec>
    <sec id="sec-2">
      <title>II. PRELIMINARIES</title>
      <p>We assume the usual notions and terminology of first
order logic and are mainly interested in many-sorted
languages, where bit vectors of different bit width
correspond to different sorts and array sorts correspond to a
mapping (ti ) te) from index sort ti to element sort te.</p>
      <p>Our approach is focused primarily on the quantifier-free
first order theories of fixed size bit vectors, arrays and
equality with uninterpreted functions, but not restricted
to the above.</p>
      <p>We call 0-arity function symbols constant symbols
and a, b, i, j, and e denote constants, where a and b are
used for array constants, i and j for array indices, and
e for an array value. For each bit vector of size n, the
equality =n is interpreted as the identity relation over bit
vectors of size n. We further interpret the if-then-else bit
vector term iten as ite(&gt;;t; e) =n t and ite(?;t; e) =n e.</p>
      <p>
        As a notational convention, the subscript might be
omitted in the following. We identify read and write
as basic operations on array elements, where read(a; i)
denotes the value of array a at index i, and write(a; i; e)
denotes the modified array a overwritten at position i III. l -TERMS IN BOOLECTOR
with value e. The theory of arrays (without
extensionality) is axiomatized by the following axioms, originally In contrast to l -term handling in other SMT solvers
introduced by McCarthy in [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]: such as e.g. UCLID or CVC4, where l -terms are
i = j ! read(a; i) = read(a; j) (A1)
teeargmerhlyanedlilminignwatietdh,leinmBmoaosloecntodremwaenpdr.oWviedgeeanelarazlyizledi = j ! read(write(a; i; e); j) = e (A2) the lemmas on demand decision procedure for the
i 6= j ! read(write(a; i; e); j) = read(a; j) (A3) extensional theory of arrays introduced in [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] to handle
The array congruence axiom A1 asserts that accessing lemmas on demand for l -terms as follows.
array a at two equal indices i and j produces the In order to provide a uniform handling of arrays
same element. The read-over-write Axioms A2 and A3 and l -terms within Boolector, we generalized all arrays
ensure a basic characteristic of arrays: A2 asserts that (and array operations) to l -terms (and operations on l
accessing a modification to an array a at the index it terms) by representing array variables as uninterpreted
has most recently been updated (i), produces the value it functions (UF), read operations as function
applicahas been updated with (e). A3 captures the case when tions, and write and if-then-else operations on arrays
a modification to an array a is accessed at an index as l -terms. We further interpret macros (as provided
other than the one it has most recently been updated at by the command define-fun in the SMT-LIB v2 format)
( j), which produces the unchanged value of the original as (curried) l -terms. Note that in contrast to [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], our
array a at position j. Note that we assume that all implementation currently does not support
extensionalvariables a, i, j and e in axioms A1, A2 and A3 are ity (equality) over arrays (l -terms).
universally quantified. We represent an array as exactly one l -term with
      </p>
      <p>From the theory of equality with uninterpreted func- exactly one bound variable (parameter) and define its
tions we primarily focus on the following axiom: representation as l j : t( j). Given an array of sort (ti )
8x¯; y¯: ^n xi = yi ! f (x¯) = f (y¯) (EUF) te) and its l -term representation l j : t( j), we require
i=1 that bound variable j is of sort index ti and term t( j) is
The function congruence axiom (EUF) asserts that a of sort element te. Term t( j) is not required to contain
function evaluates to the same value for the same j and if it does not contain j, it represents a constant l
argument values. term (e.g. l j : 0). In contrast to SMT-LIB v2 macros,</p>
      <p>
        We only consider a non-recursive l -calculus, as- it is not required to represent arrays with curried l
suming the usual notation and terminology, includ- chains, as arrays are accessed at one single index at a
ing the notion of function application, currying and time (cf. read and write operations on arrays).
b -reduction. In general, we denote a l -term lx as We treat array variables as UF with exactly one
l x:t(x), where x is a variable bound by lx and t(x) argument and represent them as fa for array variable a.
is a term in which x may or might not occur. We We interpret read operations as function
applicainterpret t(x) as defining the scope of bound variable tions on either UF or l -terms with read index i as
x. Without loss of generality, the number of bound argument and represent them as read(a; i) fa(i) and
variables per l -term is restricted to exactly one. Func- read(l j : t( j); i) (l j : t( j))(i), respectively.
tions with more than one parameter are transformed We interpret write operations as l -terms
modelinto a chain of nested l -terms by means of currying ing the result of the write operation on array a
(e.g. f (x; y) := x + y is rewritten as l x : l y : x + y). As at index i with value e, and represent them as
a notational convention, we will use lx¯ as a shorthand write(a; i; e) l j : ite(i = j; e; fa( j)). A function
applifor l x0 : : : l xk : t(x0; : : : ; xk) for k 0. We identify the cation on a l -term lw representing a write operation
function application as an explicit operation on l -terms yields value e if j is equal to the modified index
and interpret it as instantiating a bound variable (all i, and the unmodified value fa( j), otherwise. Note
bound variables) of a l -term (a curried l -chain). We that applying b -reduction to a l -term lw yields the
interpret b -reduction as a form of function application, same behaviour described by array axioms A2 and
where all formal parameter variables (bound variables) A3. Consider a function application on lw(k), where
are substituted with their actual parameter terms. We k represents the position to be read from. If k = i
will use lx¯[x0na0; : : : ; xnnan] to indicate b -reduction of (A2), b -reduction yields the written value e, whereas if
a l -term lx¯, where the formal parameters x0; : : : ; xn are k 6= i (A3), b -reduction returns the unmodified value of
substituted with the actual argument terms a0; : : : ; an. array a at position k represented by fa(k). Hence, these
axioms do not need to be explicitly checked during
consistency checking. This is in essence the approach
to handle arrays taken by UCLID [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ].
      </p>
      <p>We interpret if-then-else operations on arrays
a and b as l -terms, and represent them as
ite(c; a; b) l j : ite(c; fa( j); fb( j)). Condition c yields
either function application fa( j) or fb( j), which
represent the values of arrays a and b at index j, respectively.</p>
      <p>In addition to the base array operations introduced
above, l -terms enable us to succinctly model array
operations like e.g. memcpy and memset from the
standard C library, which we previously were not able
to efficiently express by means of read, write and ite
operations on arrays. In particular, both memcpy and
memset could only be represented by a fixed sequence
of read and write operations within a constant index
range, such as copying exactly 5 words etc. It was
not possible to express a variable range, e.g. copying n
words, where n is a symbolic (bit vector) variable.</p>
      <p>With l -terms however, we do not require a sequence
of array operations as it usually suffices to model a
parallel array operation by means of exactly one l -term.</p>
      <p>
        Further, the index range does not have to be fixed and
can therefore be within a variable range. This type of
high level modeling turned out to be useful for
applications in software model checking [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]. See also [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ] for
more examples. For instance, the memset with signature
memset (a; i; n; e), which sets each element of array a
within the range [i; i + n[ to value e, can be represented
as l j : ite(i j ^ j &lt; i + n; e; fa( j)). Note, n can be
symbolic, and does not have to be a constant. In the
same way, memcpy with signature memcpy (a; b; i; k; n),
which copies all elements of array a within the range
[i; i + n[ to array b, starting from index k, is represented
as l j : ite(k j ^ j &lt; k + n; fa(i + j k); fb( j)). As a
special case of memset, we represent array initialization
operations, where all elements of an array are initialized
with some (constant or symbolic) value e, as l j : e.
      </p>
      <p>Introducing l -terms does not only enable us to model
arrays and array operations, but further provides support
for arbitrary functions (macros) by means of currying,
with the following restrictions: (1) functions may not
be recursive and (2) arguments to functions may not be
functions. The first restriction enables keeping the
implementation of l -term handling in Boolector as simple
as possible, whereas the second restriction limits l -term
handling in Boolector to non-higher order functions.</p>
      <p>Relaxing these restrictions will turn the considered l
calculus to be Turing-complete and in general render
the decision problem to be undecidable. As future work
it might be interesting to consider some relaxations.
lambda
1 2
paryam
apply
1 2
args</p>
      <p>args
vajr</p>
      <p>In contrast to treating SMT-LIB v2 macros as C-style
macros, i.e., substituting every function application with
the instantiated function body, in Boolector, we directly
translate SMT-LIB v2 macros into l -terms, which are
then handled lazily via lemmas on demand. Formulas
are represented as directed acyclic graphs (DAG) of
bit vector and array expressions. Further, in this paper,
we propose to treat arrays and array operations as l
terms and operations on l -terms, which results in an
expression graph with no expressions of sort array (ti )
te). Instead, we introduce the following four additional
expression types of sort bit vector:
a param expression serves as a placeholder variable
for a variable bound by a l -term
a lambda expression binds exactly one param
expression, which may occur in a bit vector expression
that represents the body of the l -term
an args expression is a list of function arguments
an apply expression represents a function application
that applies arguments args to a lambda expression</p>
      <p>Example 1: Consider y1 f (i) = f ( j) ^ i 6= j with
functions f (x) := ite(x &lt; 0; g(x); x), g(y) := y as
depicted in Fig. 1. Both functions are represented as l
terms, where function g(y) returns the negation of y
and is used in function f (x), which computes the
absolute value of x. Dotted nodes indicate parameterized
expressions, i.e., expressions that depend on param
expressions, and serve as templates that are instantiated
as soon as b -reduction is applied.</p>
      <p>In order to lazily evaluate l -terms in Boolector we
implemented two b -reduction approaches, which we
will discuss in the next section in more detail.</p>
    </sec>
    <sec id="sec-3">
      <title>IV. b -REDUCTION In this section we discuss how concepts from the l -calculus have been adapted and implemented in</title>
      <p>2 apply
1
2
lambda
apply
1
1
2
args
vear
our SMT solver Boolector. We focus on reduction
algorithms for the non-recursive l -calculus, which is
rather atypical for the (vast) literature on l -calculus.
In the context of Boolector, we distinguish between
full and partial b -reduction. They mainly differ in
their application and the depth up to which l -terms
are expanded. In essence, given a function application
lx¯(a0; : : : ; an) partial b -reduction reduces only the
topmost l -term lx¯, whereas full b -reduction reduces lx¯
and every l -term in the scope of lx¯.</p>
      <p>Full b -reduction of a function application on l -term
lx¯ consists of a series of b -reductions, where l -term
lx¯ and every l -term ly¯ within the scope of lx¯ are
instantiated, substituting all formal parameters with actual
parameter terms. Since we do not allow partial function
applications, full b -reduction guarantees to yield a term
which is free of l -terms. Given a formula with l -terms,
we usually employ full b -reduction in order to eliminate
all l -terms by substituting every function application
with the term obtained by applying full b -reduction
on that function application. In the worst case, full b
reduction results in an exponential blow-up. However,
in practice, it is often beneficial to employ full b
reduction, since it usually leads to significant
simplifications through rewriting. In Boolector, we incorporate
this method as an optional rewriting step. We will use
lx¯[x0na0; : : : ; xnnan]f as a shorthand for applying full
b -reduction to lx¯ with arguments a0; : : : ; an.</p>
      <p>Partial b -reduction of a l -term lx¯, on the other
hand, essentially works in the same way as what is
referred to as b -reduction in the l -calculus. Given a
function application lx¯(a0; : : : ; an), partial b -reduction
substitutes formal parameters x0; : : : ; xn with the actual
argument terms a0; : : : ; an without applying b -reduction
to other l -terms within the scope of lx¯. This has the
effect that l -terms are expanded function-wise, which
we require for consistency checking. In the following,
we use lx¯[x0na0; : : : ; xnnan]p to denote the application
of partial b -reduction to lx¯ with arguments a0; : : : ; an.</p>
      <sec id="sec-3-1">
        <title>A. Full b -reduction</title>
        <p>Given a function application lx¯(a0; : : : ; an) and a
DAG representation of lx¯. Full b -reduction of lx¯
consecutively substitutes formal parameters with actual
argument terms while traversing and rebuilding the
DAG in depth-first-search (DFS) post-order as follows.
1) Initially, we instantiate lx¯ by assigning arguments
a0; : : : ; an to the formal parameters x0; : : : ; xn.
2) While traversing down, for any l -term ly¯ in the
scope of lx¯, we need special handling for each
function application ly¯(b0; : : : ; bm) as follows.
args
1 2
var
k
valr
args
1 2</p>
        <p>vajr
eq
1 2
vair
1 a2nd
eq
2 1 1 2 1 mul 2 1
ult
eq mul 1 eq 2 mul</p>
        <p>2 2 1 2 1
vajr vair const valr vkar
(b) Formula y20 after full b -reduction of y2.</p>
        <p>vear
Fig. 2: Full b -reduction of formula y2.
a) Visit arguments b0; : : : ; bm first, and obtain rebuilt
arguments b00; : : : ; b0m.
b) Assign rebuilt arguments b00; : : : ; b0m to ly¯ and
apply b -reduction to ly¯(b00; : : : ; b0m).</p>
        <p>This ensures a bottom-up construction of the b
reduced DAG (see step 3.), since all arguments
b00; : : : ; b0m passed to a l -term ly¯ are b -reduced and
rebuilt prior to applying b -reduction to ly¯.
3) During up-traversal of the DAG we rebuild all
visited expressions bottom-up and require special
handling for the following expressions:
param: substitute param expression yi with
current instantiation b0</p>
        <p>i
apply: substitute expression ly¯(b0; : : : ; bm) with
ly¯[y0nb00; : : : ; ymnb0m]f
We further employ following optimizations to improve
the performance of the full b -reduction algorithm.</p>
      </sec>
      <sec id="sec-3-2">
        <title>Skip expressions that do not need rebuilding</title>
        <p>Given an expression e within the scope of a l -term
lx¯. If e is not parameterized and does not contain
any l -term, e is not dependent on arguments passed
to lx¯ and may therefore be skipped.
l -scope caching
We cache rebuilt expressions in a l -scope to prevent
rebuilding parameterized expressions several times.</p>
        <p>Example 2: Given a formula y2 f (i; j) = f (k; l)
and two functions g(x) := ite(x = i; e; 2 x) and
f (x; y) := ite(y &lt; x; g(x); g(y)) as depicted in Fig. 2a.
Applying full b -reduction to formula y2 yields formula
y 20 as illustrated in Fig. 2b. Function application f (i; j)
has been reduced to ite( j i ^ i 6= j; 2 j; e) and f (k; l)
to ite(l &lt; k; ite(k = i; e; 2 k); ite(l = i; e; 2 l)).</p>
      </sec>
      <sec id="sec-3-3">
        <title>B. Partial b -reduction</title>
        <p>Given a function application lx¯(a0; : : : ; an) and a
DAG representation of lx¯. The scope of a partial b
reduction bp(lx¯) is defined as the sub-DAG obtained
by cutting off all l -terms in the scope of lx¯. Assume
that we have an assignment for arguments a0; : : : ; an,
and for all non-parameterized expressions in the scope
of bp(lx¯). The partial b -reduction algorithm
substitutes param expressions x0; : : : ; xn with a0; : : : ; an and
rebuilds lx¯. Similar to full b -reduction, we perform a
DFS post-order traversal of the DAG as follows.
1) Initially, we instantiate lx¯ by assigning arguments
a0; : : : ; an to the formal parameters x0; : : : ; xn.
2) While traversing down the DAG, we require special
handling for the following expressions:
function applications ly¯(b0; : : : ; bm)
a) Visit arguments b0; : : : ; bm, obtain rebuilt
arguments b00; : : : ; b0m.
b) Do not assign rebuilt arguments b00; : : : ; b0m to
ly¯ and stop down-traversal at ly¯.
ite(c; t1; t2)
Since we have an assignment for all
nonparameterized expressions within the scope of
bp(lx¯), we are able to evaluate condition c. Based
on that we either select t1 or t2 to further traverse
down (the other branch is omitted).
3) During up-traversal of the DAG we rebuild all
visited expressions bottom-up and require special
handling for the following expressions:
param: substitute param expression yi with
current instantiation b0i
args
valr</p>
        <p>apply
2</p>
        <p>1
if-then-else: substitute expression ite(c; t1; t2) with
t1 if c = &gt;, and t2 otherwise</p>
        <p>For partial b -reduction, we have to modify the first of
the two optimizations introduced for full b -reduction.</p>
      </sec>
      <sec id="sec-3-4">
        <title>Skip expressions that do not need rebuilding</title>
        <p>Given an expression e in the scope of partial b
reduction bp(lx¯). If e is not parameterized, in the
context of partial b -reduction, e is not dependent
on arguments passed to lx¯ and may be skipped.</p>
        <p>Example 3: Consider y2 from Ex. 2. Applying partial
b -reduction to y2 yields the formula depicted in Fig. 3,
where function application f (i; j) has been reduced to
ite( j &lt; i; e; g( j)) and f (k; l) to ite(l &lt; k; g(k); g(l)).</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>V. DECISION PROCEDURE</title>
      <p>
        The idea of lemmas on demand goes back to [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]
and actually represents one extreme variant of the lazy
SMT approach [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ]. Around the same time, a related
technique was developed in the context of bounded
model checking [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], which lazily encodes all-different
constraints over bit vectors (see also [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]). In constraint
programming the related technique of lazy clause
generation [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] is effective too.
      </p>
      <p>
        In this section, we introduce lemmas on demand for
non-recursive l -terms based on the algorithm
introduced in [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. A top-level view of our lemmas on demand
decision procedure for l -terms (DPl ) is illustrated in
Fig. 4 and proceeds as follows. Given a formula f ,
DPl uses a bit vector skeleton of the preprocessed
formula p as formula abstraction al (p ). In each
iteration, an underlying decision procedure DPB determines
the satisfiability of the formula abstraction refined by
formula refinement x , i.e., in DPB, we eagerly encode
the refined formula abstraction G to SAT and determine
procedure DPl ( f )
p preprocess(f )
xl o o p&gt;
vair
vajr
eq
1 2
al(applyi) al(applyj)
      </p>
      <p>Example 4: Consider formula y1 from Ex. 1, which
has two roots. The abstraction function al performs a
consecutive down-traversal of the DAG from both roots.</p>
      <p>The resulting abstraction is a mapping of all bit vector
terms encountered during traversal, according to the
rules 1-3 above. For function applications (e.g. applyi)
fresh bit vector variables (e.g. al (applyi)) are
introduced, where the remaining sub-DAGs are therefore cut
off. The resulting abstraction al (y1) is given in Fig. 5.
its satisfiability by means of a SAT solver. As G is
an over-approximation of f , we immediately conclude
with unsatisfiable if G is unsatisfiable. If G is satisfiable,
we have to check if the current satisfying
assignment s (as provided by procedure DPB) is consistent
w.r.t. preprocessed formula p. If s is consistent, i.e., if
it can be extended to a valid satisfying assignment for
the preprocessed formula p, we immediately conclude
with satisfiable. Otherwise, assignment s is spurious,
consistentl (p; s ) identifies a violation of the function
congruence axiom EUF, and we generate a symbolic
lemma lemmal (p; s ) which is added to formula
refinement x in its abstracted form al (lemmal (p; s )).</p>
      <p>
        Note that in f , in contrast to the decision procedure
introduced in [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], all array variables and array
operations in the original input have been abstracted away
and replaced by corresponding l -terms and operations
on l -terms. Hence, various integral components of the
original procedure (al , consistentl , lemmal ) have been
adapted to handle l -terms as follows.
      </p>
      <p>
        In this section, we introduce a consistency checking
algorithm consistentl as a generalization of the
consistency checking approach presented in [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. However,
in contrast to [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], we do not propagate so-called access
nodes but function applications and further check axiom
EUF (while applying partial b -reduction to evaluate
function applications under a current assignment)
instead of checking array axioms A1 and A2. Given a
satisfiable over-approximated and refined formula G,
procedure consistentl determines whether a current
satisfying assignment s (as provided by the
underlying decision procedure DPB) is spurious, or if it
can be extended to a valid satisfying assignment for
the preprocessed input formula p. Therefore, for each
      </p>
      <p>
        VI. FORMULA ABSTRACTION function application in p, we have to check both if
In this section, we introduce a partial formula ab- the assignment of the corresponding abstraction
varistraction function al as a generalization of the ab- able is consistent with the value obtained by applying
straction approach presented in [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. Analogous to [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], partial b -reduction, and if axiom EUF is violated. If
we replace function applications by fresh bit vector consistentl does not find any conflict, we immediately
variables and generate a bit vector skeleton as for- conclude that formula p is satisfiable. However, if
mula abstraction. Given p as the preprocessed input current assignment s is spurious w.r.t. preprocessed
formula f , our abstraction function al traverses down formula p, either axiom EUF is violated or partial b
the DAG structure starting from the roots, and generates reduction yields a conflicting value for some function
an over-approximation of p as follows. application in p. In both cases, we generate a lemma
1) Each bit vector variable and symbolic constant is as formula refinement. In the following we will equally
mapped to itself. use function symbols f , g, and h for UF symbols and
2) Each function application lx¯(a0; : : : ; an) is mapped l -terms.
      </p>
      <p>to a fresh bit vector variable. In order to check axiom EUF, for each l -term and UF
3) Each bit vector term t(y0; : : : ; ym) is mapped to symbol we maintain a hash table r, which maps l
t(al (y0); : : : ; al (ym)). terms and UF symbols to function applications. We
Note that by introducing fresh variables for function check consistency w.r.t. p by applying the following
applications, we essentially cut off l -terms and UF rules.
and therefore yield a pure bit vector skeleton, which I: For each f (a¯), if a¯ is not parameterized,
is subsequently eagerly encoded to SAT. add f (a¯) to r( f )
C: For any pair s := g(a¯); t := h(b¯) 2 r( f ) check
n
^ s (al (ai)) = s (al (bi)) ! s (al (s)) = s (al (t))
i=0
B: For any s := ly¯(a0; : : : ; an) 2 r(lx¯) with
t := lx¯[x0na0; : : : ; xnnan]p,
check rule P, if P fails, check eval(t) = s (al (s))
P: For any s := ly¯(a0; : : : ; an) 2 r(lx¯) with
t := g(b0; : : : ; bm) = lx¯[x0na0; : : : ; xnnan]p,</p>
      <p>n
if n = m ^ ^ ai = bi, propagate s to r(g)</p>
      <p>i=0</p>
      <p>Given a l -term (UF symbol) f and a
corresponding hash table r( f ). Rule I, the initialization rule,
initializes r( f ) with all non-parameterized function
applications on f . Rule C corresponds to the function
congruence axiom and is applied whenever we add
a function application g(a0; : : : ; an) to r( f ). Rule B
is a consistency check w.r.t. the current assignment
s , i.e., for every function application s in r( f ), we
check if the assignment of s (al (s)) corresponds to
the assignment evaluated by the partially b -reduced
term lx¯[x0na0; : : : ; xnnan]p. Finally, rule P represents a
crucial optimization of consistentl , as it avoids
unnecessary conflicts while checking B. If P applies, both
function applications s and t have the same arguments.</p>
      <p>As function application s 2 r(lx¯), rule C implies
that s = lx¯(a0; : : : ; an). Therefore, function applications
s and t must produce the same function value as
t := lx¯[x0na0; : : : ; xnnan]p = ly¯[x0na0; : : : ; xnnan]p, i.e.,
function application t must be equal to the result of
applying partial b -reduction to function application s.</p>
      <p>Assume we encode t and add it to the formula. If DPB
guesses an assignment s.t. s (al (t)) 6= s (al (s)) holds,
we have a conflict and need to add a lemma. However,
this conflict is unnecessary, as we know from the start
that both function applications must map to the same
function value in order to be consistent. We avoid this
conflict by propagating s to r(g).</p>
      <p>Figure 6 illustrates our consistency checking
algorithm consistentl , which takes the preprocessed input
formula p and a current assignment s as arguments, and
proceeds as follows. First, we initialize stack S with all
non-parameterized function applications in formula p
(cf. nonparam_apps(p)) and order them top-down,
according to their appearance in the DAG
representation of p. The top-most function application then
represents the top of stack S, which consists of tuples
(g; f (a0; : : : ; an)), where f and g are initially equal and
f (a0; : : : ; an) denotes the function application
propagated to function g. In the main consistency checking
procedure consistentl (p; s )</p>
      <p>S nonparam_apps ( p )
w h i l(eg;Sf6 =(a00/; : : : ; an)) pop ( S )
encode ( f (a0; : : : ; an) )
/ c h e c k r u l e C /
i f not congruent ( g; f (a0; : : : ; an) )</p>
      <p>r e t u r n ?
add ( f (a0; : : : ; an); r(g) )
i f is_UF ( g ) c o n t i n u e
encode ( g )
/ c h e c k r u l e B /
t g[x0na0; : : : ; xnnan]p
i f assigned ( t )</p>
      <p>i f s (t) 6= s (al ( f (a0; : : : ; an)))
e l i f t = hr(ae0t;u: :r:n; an?) / c h e c k r u l e P /
push ( S; (h; f (a0; : : : ; an)) )
c o n t i n u e
e l s e
apps f resh apps(t)
f o r a 2 apps</p>
      <p>encode ( a )
i f eval ( t ) 6= s (al ( f (a0; : : : ; an)))</p>
      <p>r e t u r n ?
f o r h(b0; : : : ; bm) 2 apps</p>
      <p>push ( S; (h; h(b0; : : : ; bm)) )
r e t u r n &gt;</p>
      <p>Fig. 6: Procedure consistentl in pseudo-code.
loop, we check rules C and B for each tuple as follows.</p>
      <p>First we check if f (a0; : : : ; an) violates the function
congruence axiom EUF w.r.t. function g and return ? if this
is the case. Note that for checking rule C, we require an
assignment for arguments a0; : : : ; an, hence we encode
them on-the-fly. If rule C is not violated and function f
is an uninterpreted function, we continue to check the
next tuple on stack S. However, if f is a l -term we
still need to check rule B, i.e., we need to check if the
assignment s (al ( f (a0; : : : ; an))) is consistent with the
value produced by g[x0na0; : : : ; xnnan]p. Therefore, we
first encode all non-parameterized expressions in the
scope of partial b -reduction bp(g) (cf. encode(g))
before applying partial b -reduction with arguments
a0; : : : ; an, which yields term t. If term t has an
assignment, we can immediately check if it differs from
assignment s (al ( f (a0; : : : ; an))) and return ? if this is
the case. However, if term t does not have an
assignment, which is the case when t has been instantiated
from a parameterized expression, we have to compute
the value for term t. Note that we could also encode
term t to get an assignment s (t), but this might add a
considerable amount of superfluous clauses to the SAT
solver. Before computing a value for t we check if rule
P applies and propagate f (a0; : : : ; an) to h if applicable.</p>
      <p>Otherwise, we need to compute a value for t and
check if t contains any function applications that were
instantiated and not yet encoded (cf. fresh_apps(t))
and encode them if necessary. Finally, we compute
the value for t (cf. eval(t)) and compare it to the we run DPB on al (y1) and it returns a satisfying
assignment of al ( f (a0; : : : ; an)). If the values differ, assignment s such that s (i) 6= s ( j), s (ai) = s (a j),
we found an inconsistency and return ?. Otherwise, s (i) &lt; 0 and s (ai) 6= s ( i). First, we check
conwe continue consistency checking the newly encoded sistency for lx(i) and check rule C, which is not
function applications apps. We conclude with &gt;, if all rvuiolelaBte.dWase sap(pi)ly6=psar(tija)l, ban-rdedcuocnttiionnueanwditohbtcahinectkeirnmg
function applications have been checked successfully t := lx[x=i]p = ly(i) (since s (i) &lt; 0) for which rule P
and no inconsistencies have been found. is applicable. We propagate lx(i) to ly, check if lx(i)
is consistent w.r.t. ly, apply partial b -reduction, obtain
A. Lemma generation t := ly[y=i]p = i and find an inconsistency according</p>
      <p>
        Following [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], we introduce a lemma generation tso( ruil)e. WB:e sge(naei)ra6 =te sle(m mi)a biu&lt;t w0e!oabita=inedi. sA(sasiu)m=e
procedure lemmal , which generates a symbolic lemma that in the next iteration DBP returns a new satisfying
whenever our consistency checker detects an inconsis- assignment s such that s (i) 6= s ( j), s (ai) = s (a j),
tency. Depending on whether rule C or B was violated, s (i) &lt; 0, s (ai) = s ( i) and s ( j) &gt; s ( i). We first
we generate a symbolic lemma as follows. Assume check consistency for lx(i), which is consistent due to
that rule C was violated by function applications s := the lemma we previously generated. Next, we check
g(a0; : : : ; an); t := h(b0; : : : ; bn) 2 r( f ). We first collect rule C for lx( j), which is not violated since s (i) 6=
all conditions that lead to the conflict as follows. s ( j), and continue with checking rule B. We apply
1) Find the shortest possible propagation path ps (pt ) (psairntciael sb(-jr)ed&gt;ucsti(oni)anadndosbt(aii)n&lt;te0r)mantd:=finldx[axn= ji]npc=on-j
from function application s (t) to function f . sistency as s (ai) = s ( i), s (ai) = s (a j) and s ( j) &gt;
2) Collect all ite conditions cs0; : : : ; csj (ct0; : : : ; ctl) on s ( i), but s (a j) = s ( j). We then generate lemma
path ps (pt ) that were &gt; under given assignment s . j &gt; 0 ! a j = j.
3) Collect all ite conditions cs0; : : : ; csk (ct0; : : : ; ctm) on
      </p>
      <p>path ps (pt ) that were ? under given assignment s .</p>
      <p>We generate the following (in general symbolic)
lemma:
j k
^ cis ^ ^
i=0 i=0</p>
      <p>l m
:cis ^ ^ cti ^ ^
i=0 i=0</p>
      <p>n
:cti ^ ^ ai = bi ! s = t</p>
      <p>i=0</p>
      <p>Assume that rule B was violated by a function
application s := ly¯(a0; : : : ; an) 2 r(lx¯). We obtained
t := lx¯[x0na0; : : : ; xnnan]p and collect all conditions that
lead to the conflict as follows.
1) Collect ite conditions cs0; : : : ; csj and cs0; : : : ; csk for s</p>
      <p>as in steps 1-3 above.
2) Collect all ite conditions ct0; : : : ; ctl that evaluated to
&gt; under current assignment s when partially b
reducing lx¯ to obtain t.
3) Collect all ite conditions ct0; : : : ; ctm that evaluated
to ? under current assignment s when partially b
reducing lx¯ to obtain t.</p>
      <p>We generate the following (in general symbolic)
lemma: j</p>
      <p>k
^ cis ^ ^
i=0 i=0</p>
      <p>l m
:cis ^ ^ cti ^ ^ :cti ! s = t</p>
      <p>i=0 i=0</p>
      <p>Example 5: Consider formula y1 and its
preprocessed formula abstraction al (y1) from Ex. 1. For the
sake of better readability, we will use lx and ly to
denote functions f and g, and further use ai and a j
as a shorthand for al (applyi) and al (applyj). Assume</p>
    </sec>
    <sec id="sec-5">
      <title>VIII. EXPERIMENTS</title>
      <p>We applied our lemmas on demand approach for
l -terms on three different benchmark categories: (1)
crafted, (2) SMT’12, and (3) application. For the crafted
category, we generated benchmarks using SMT-LIB v2
macros, where the instances of the first benchmark set
(macro blow-up) tend to blow up in formula size if
SMT-LIB v2 macros are treated as C-style macros.</p>
      <sec id="sec-5-1">
        <title>The benchmark sets fisher-yates SAT and fisher-yates</title>
        <p>
          UNSAT encode an incorrect and correct but naive
implementation of the Fisher-Yates shuffle algorithm [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ],
where the instances of the fisher-yates SAT also tend
to blow up in the size of the formula if SMT-LIB
v2 macros are treated as C-style macros. The SMT’12
category consists of all non-extensional QF AUFBV
benchmarks used in the SMT competition 2012. For
the application category, we considered the
instantiation benchmarks1 generated with LLBMC as presented
in [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ]. The authors also kindly provided the same
benchmark family using l -terms as arrays, which is
denoted as lambda.
        </p>
        <p>
          We performed all experiments on 2.83GHz Intel Core
2 Quad machines with 8GB of memory running Ubuntu
12.04.2 setting a memory limit of 7GB and a time limit
for the crafted and the SMT’12 benchmarks of 1200
seconds. For the application benchmarks, as in [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ]
        </p>
        <p>1http://llbmc.org/files/downloads/vstte-2013.tgz
’12 BBoooolleeccttoorrnop
T Boolectorb
SM Boolectorsc12
l-bopuw CBBBoooVoooCllleee4ccctttooorrrnbop
rcao SMOaNthOSALTAR
m Z3</p>
        <p>Boolector
tse BBoooolleeccttoorrnbop
-raeyh STA CVC4
sfi SMOaNthOSALTAR</p>
        <p>Z3</p>
        <p>Boolector
s Boolectornop
t-eay STA BCoVoCle4ctorb
r
seh UN SMOaNthOSALTAR
fi</p>
        <p>Z3</p>
        <p>mark set is SONOLAR. However, it is not clear how
SONOLAR handles SMT-LIB v2 macros. Surprisingly,
on these benchmarks Boolectornop performs better than
Boolector with optimization rule P, which needs
further investigation. On the fisher-yates SAT benchmarks
Boolector not only solves the most instances, but
requires 107 seconds for the first 6 instances, for which
Boolectorb , MathSAT and Z3 need more than 300
seconds each. Boolectornop does not perform as well
as Boolector due to the fact that on these benchmarks
optimization rule P is heavily applied. In fact, on these
benchmarks, rule P applies to approx. 90% of all
propagated function applications on average. On the
fisheryates UNSAT benchmarks Z3 and Boolectorb solve the
most instances, whereas Boolector and Boolectornop do
not perform so well. This is mostly due to the fact
that these benchmarks can be simplified significantly
when macros are eagerly eliminated, whereas partial
b -reduction does not yield as much simplifications.</p>
        <p>We measured overhead of b -reduction in Boolector on
these benchmarks and it turned out that for the macro
blow-up and fisher-yates UNSAT instances the overhead
is negligible (max. 3% of total run time), whereas for
the fisher-yates SAT instances b -reduction requires over
50% of total run time.
we used a time limit of 60 seconds. We evaluated
four different versions of Boolector: (1) our lemmas
on demand for l -terms approach DPl (Boolector),
(2) DPl without optimization rule P (Boolectornop),
(3) DPl with full b -reduction (Boolectorb ), and (4)
the version submitted to the SMT competition 2012
(Boolectorsc12). For comparison we used the following
SMT solvers: CVC4 1.2, MathSAT 5.2.6, SONOLAR
2013-05-15, STP 1673 (svn revision), and Z3 4.3.1.</p>
        <p>Note that we limited the set of solvers to those which
currently support SMT-LIB v2 macros and the theory
of fixed-size bit vectors. As a consequence, we did not
compare our approach to UCLID (no bit vector support)
and Yices, which both have native l -term support, but Table II summarizes the results of running all
lack support for the SMT-LIB v2 standard. four Boolector versions on the SMT’12 benchmark</p>
        <p>As indicated in Tables I, II and III, we measured the set. We compared our three approaches Boolector,
number of solved instances (Solved), timeouts (TO), Boolectornop, and Boolectorb to Boolectorsc12, which
memory outs (MO), total CPU time (Time), and total won the QF AUFBV track in the SMT competition
memory consumption (Space) required by each solver 2012. In comparison to Boolectorb , Boolector solves 5
for solving an instance. If a solver ran into a timeout, unique instances, whereas Boolectorb solves 3 unique
1200 seconds (60 seconds for category application) instances. In comparison to Boolectorsc12, both solvers
were added to the total time as a penalty. In case of a combined solve 2 unique instances. Overall, on the
memory out, 1200 seconds (60 seconds for application) SMT’12 benchmarks Boolectorsc12 still outperforms
and 7GB were added to the total CPU time and total the other approaches. However, our results still look
memory consumption, respectively. promising since none of the approaches Boolector,</p>
        <p>
          Table I summarizes the results of the crafted bench- Boolectornop and Boolectorb are heavily optimized yet.
mark category. On the macro blow-up benchmarks, On these benchmarks, the overhead of b -reduction in
Boolector and Boolectornop benefit from lazy l -term Boolector is around 7% of the total run time.
handling and thus, outperform all those solvers which Finally, Table III summarizes the results of the
applitry to eagerly eliminate SMT-LIB v2 macros with a cation category. We used the benchmarks obtained from
very high memory consumption as a result. The only the instantiation-based reduction approach presented
solver not having memory problems on this bench- in [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ] (instantiation benchmarks) and compared our
n Boolector
ito Boolectornop
ita Boolectorb
ta Boolectorsc12
n
in STP
s
        </p>
        <p>Boolector
a Boolectornop
bd Boolectorb
am Boolectorsc12
l</p>
        <p>
          STP
new approaches to STP, the same version of the solver
that outperformed all other solvers on these benchmarks
in the experimental evaluation of [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ]. On the
instantiation benchmarks Boolectorb and STP solve the same
number of instances in roughly the same time. However,
Boolectorb requires less memory for solving those
instances. Boolector, Boolectornop and Boolectorsc12
did not perform so well on these benchmarks because
in contrast to Boolectorb and STP, they do not
eagerly eliminate read operations, which is beneficial on
these benchmarks. The lambda benchmarks consist of
the same problems as instantiation, using l -terms for
representing arrays. On these benchmarks, Boolectorb
clearly outperforms Boolector and Boolectornop and
solves all 45 instances within a fraction of time.
        </p>
        <p>Boolectorsc12 and STP do not support l -terms as arrays
and therefore were not able to participate on this
benchmark set. By exploiting the native l -term support for
arrays in Boolectorb , in comparison to the instantiation
benchmarks we achieve even better results. Note that on
the lambda (instantiation) benchmarks, the overhead in
Boolectorb for applying full b -reduction was around
15% (less than 2%) of the total run time.</p>
        <p>Benchmarks, binaries of Boolector and all log files
of our experiments can be found at: http://fmv.jku.at/</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>IX. CONCLUSION</title>
      <p>
        In this paper, we introduced a new decision procedure
for handling non-recursive and non-extensional l -terms
as a generalization of the array decision procedure
presented in [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. We showed how arrays, array
operations and SMT-LIB v2 macros are represented in
Boolector and evaluated our new approach with 3
different benchmark categories: crafted, SMT’12 and
application. The crafted category showed the benefit
of lazily handling SMT-LIB v2 macros where eager
macro elimination tends to blow-up the formula in size.
We further compared our new implementation to the
version of Boolector that won the QF AUFBV track
in the SMT competition 2012. With the application
benchmarks, we demonstrated the potential of native
l -term support within an SMT solver. Our experiments
look promising even though we employ a rather naive
implementation of b -reduction in Boolector and also
do not incorporate any l -term specific rewriting rules
except full b -reduction.
      </p>
      <p>In future work we will address the performance
bottleneck of the b -reduction implementation and will
further add l -term specific rewriting rules. We will
analyze the impact of various b -reduction strategies on
our lemmas on demand procedure and will further add
support for extensionality over l -terms. Finally, with
the recent and ongoing discussion within the SMT-LIB
community to add support for recursive functions, we
consider extending our approach to recursive l -terms.</p>
    </sec>
    <sec id="sec-7">
      <title>X. ACKNOWLEDGEMENTS</title>
      <p>We would like to thank Stephan Falke, Florian Merz
Duterte for explaining the implementation and limits
of lambdas in SMT solvers, and more specifically in</p>
    </sec>
    <sec id="sec-8">
      <title>Yices.</title>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>C.</given-names>
            <surname>Barrett</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C. L.</given-names>
            <surname>Conway</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Deters</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Hadarean</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Jovanovic</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>King</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Reynolds</surname>
          </string-name>
          , and
          <string-name>
            <given-names>C.</given-names>
            <surname>Tinelli. CVC4. In</surname>
          </string-name>
          <string-name>
            <surname>CAV</surname>
          </string-name>
          , volume
          <volume>6806</volume>
          <source>of LNCS</source>
          , pages
          <fpage>171</fpage>
          -
          <lpage>177</lpage>
          . Springer,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>A.</given-names>
            <surname>Biere</surname>
          </string-name>
          and
          <string-name>
            <given-names>R.</given-names>
            <surname>Brummayer</surname>
          </string-name>
          .
          <article-title>Consistency Checking of All Different Constraints over Bit-Vectors within a SAT Solver</article-title>
          .
          <source>In FMCAD</source>
          , pages
          <fpage>1</fpage>
          -
          <lpage>4</lpage>
          . IEEE,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>R.</given-names>
            <surname>Brummayer</surname>
          </string-name>
          and
          <string-name>
            <surname>A. Biere.</surname>
          </string-name>
          <article-title>Lemmas on Demand for the Extensional Theory of Arrays</article-title>
          . JSAT,
          <volume>6</volume>
          (
          <issue>1</issue>
          -3):
          <fpage>165</fpage>
          -
          <lpage>201</lpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>R. E.</given-names>
            <surname>Bryant</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S. K.</given-names>
            <surname>Lahiri</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S. A.</given-names>
            <surname>Seshia</surname>
          </string-name>
          .
          <article-title>Modeling and Verifying Systems Using a Logic of Counter Arithmetic with Lambda Expressions and Uninterpreted Functions</article-title>
          .
          <source>In CAV</source>
          , volume
          <volume>2404</volume>
          <source>of LNCS</source>
          , pages
          <fpage>78</fpage>
          -
          <lpage>92</lpage>
          . Springer,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>A.</given-names>
            <surname>Cimatti</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Griggio</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B. J.</given-names>
            <surname>Schaafsma</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Sebastiani</surname>
          </string-name>
          .
          <article-title>The MathSAT5 SMT Solver</article-title>
          .
          <source>In TACAS</source>
          , volume
          <volume>7795</volume>
          <source>of LNCS</source>
          , pages
          <fpage>93</fpage>
          -
          <lpage>107</lpage>
          . Springer,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>L.</given-names>
            <surname>De Moura</surname>
          </string-name>
          and
          <string-name>
            <surname>N. Bjørner.</surname>
          </string-name>
          <article-title>Z3: an efficient SMT solver</article-title>
          .
          <source>In Proc. ETAPS'08</source>
          , pages
          <fpage>337</fpage>
          -
          <lpage>340</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <surname>L. M. de Moura</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          <string-name>
            <surname>Rueß</surname>
            , and
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Sorea</surname>
          </string-name>
          .
          <article-title>Lazy Theorem Proving for Bounded Model Checking over Infinite Domains</article-title>
          .
          <source>In CADE</source>
          , volume
          <volume>2392</volume>
          <source>of LNCS</source>
          . Springer,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>B.</given-names>
            <surname>Dutertre</surname>
          </string-name>
          and L. de Moura.
          <article-title>The Yices SMT solver</article-title>
          . Tool paper at http://yices.csl.sri.com/tool-paper.pdf, Aug.
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>N.</given-names>
            <surname>Ee</surname>
          </string-name>
          <article-title>´n and N. So¨rensson. Temporal induction by incremental SAT solving</article-title>
          .
          <source>ENTCS</source>
          ,
          <volume>89</volume>
          (
          <issue>4</issue>
          ):
          <fpage>543</fpage>
          -
          <lpage>560</lpage>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>S.</given-names>
            <surname>Falke</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Merz</surname>
          </string-name>
          , and
          <string-name>
            <given-names>C.</given-names>
            <surname>Sinz</surname>
          </string-name>
          .
          <article-title>Extending the Theory of Arrays: memset, memcpy, and Beyond</article-title>
          .
          <source>In Proc. VSTTE'13.</source>
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>R.</given-names>
            <surname>Fisher</surname>
          </string-name>
          and
          <string-name>
            <given-names>F.</given-names>
            <surname>Yates</surname>
          </string-name>
          .
          <article-title>Statistical tables for biological, agricultural and medical research</article-title>
          .
          <source>Oliver and Boyd</source>
          ,
          <year>1953</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>V.</given-names>
            <surname>Ganesh</surname>
          </string-name>
          and
          <string-name>
            <given-names>D. L.</given-names>
            <surname>Dill</surname>
          </string-name>
          .
          <article-title>A Decision Procedure for BitVectors and Arrays</article-title>
          .
          <source>In Proc. CAV'07</source>
          . Springer-Verlag,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>F.</given-names>
            <surname>Lapschies</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Peleska</surname>
          </string-name>
          , E. Gorbachuk, and
          <string-name>
            <given-names>T.</given-names>
            <surname>Mangels</surname>
          </string-name>
          .
          <source>SONOLAR SMT-Solver. System Desc. SMT-COMP'12</source>
          . http: //smtcomp.sourceforge.net/2012/reports/sonolar.pdf,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>J.</given-names>
            <surname>McCarthy</surname>
          </string-name>
          .
          <article-title>Towards a Mathematical Science of Computation</article-title>
          .
          <source>In IFIP Congress</source>
          , pages
          <fpage>21</fpage>
          -
          <lpage>28</lpage>
          ,
          <year>1962</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>O.</given-names>
            <surname>Ohrimenko</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P. J.</given-names>
            <surname>Stuckey</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Codish</surname>
          </string-name>
          .
          <article-title>Propagation via lazy clause generation</article-title>
          .
          <source>Constraints</source>
          ,
          <volume>14</volume>
          (
          <issue>3</issue>
          ):
          <fpage>357</fpage>
          -
          <lpage>391</lpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>R.</given-names>
            <surname>Sebastiani</surname>
          </string-name>
          .
          <source>Lazy Satisability Modulo Theories. JSAT</source>
          ,
          <volume>3</volume>
          (
          <issue>3</issue>
          - 4):
          <fpage>141</fpage>
          -
          <lpage>224</lpage>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>S. A.</given-names>
            <surname>Seshia</surname>
          </string-name>
          .
          <article-title>Adaptive Eager Boolean Encoding for Arithmetic Reasoning in Verification</article-title>
          .
          <source>PhD thesis</source>
          , CMU,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>