<!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>Satisfiability Modulo Theories, August</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>User-Propagation for Custom Theories in SMT Solving</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Nikolaj Bjørner</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Clemens Eisenhofer</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Laura Kovács</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Microsoft Research Lab</institution>
          ,
          <addr-line>Microsoft Building 99, 14820 NE 36th Street, Redmond, Washington, 98052</addr-line>
          ,
          <country country="US">USA</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>TU Wien, Institut für Logic and Computation</institution>
          ,
          <addr-line>Favoritenstraße 9-11, 1040 Wien</addr-line>
          ,
          <country country="AT">Austria</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2022</year>
      </pub-date>
      <volume>1</volume>
      <fpage>1</fpage>
      <lpage>12</lpage>
      <abstract>
        <p>We present ongoing work on developing a user-propagator framework in SMT solving. We argue that the integration of user-propagators in SMT solving yields an eficient approach towards custom theory reasoning, without bringing fundamental changes in the underlining SMT architecture. We showcase our approach in the SMT solver Z3, provide practical evidence of our work, and also discuss potential venues for further improvements.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;theory reasoning</kwd>
        <kwd>lazy encoding</kwd>
        <kwd>SMT callbacks</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        Over the past years, domain-specific proving procedures have been proposed, for example, to
solve constraints in non-linear arithmetic [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], string theory [
        <xref ref-type="bibr" rid="ref2 ref3 ref4 ref5">2, 3, 4, 5</xref>
        ], term algebras [
        <xref ref-type="bibr" rid="ref6 ref7">6, 7</xref>
        ], or
bitvectors [
        <xref ref-type="bibr" rid="ref8 ref9">8, 9</xref>
        ]. While it would be possible to provide pages with lists of heuristics and encoding
practices in these and similar reasoning approaches over (first-order) theory constraints, the
summary is as simple as follows: diferent theories need diferent reasoning approaches tailored
to the respective theories. In this extended abstract we argue that by using so-called
userpropagators as extensions to existing reasoning engines, in particular SMT solvers, we gain
custom support for new theories without destroying the already eficient and highly-optimized
reasoning infrastructure of the respective solvers. While in our work we focus on the eficient
addition of user-propagators to the Z3 SMT solver [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ], we believe our approach can be beneficial
for improving theory reasoning in SMT solving in general.
      </p>
      <p>In a nutshell, a user-propagator implements a set of functions, called callbacks, that are called
whenever a potentially relevant action is performed by the solver. Intuitively, the callbacks of
a user-propagator enable the on demand addition of theory formulas (lemmas) to the solver,
which is especially important for theories that do not yet have a native reasoning support in the
respective solver but support lazy clause generation [11, 12]. Thanks to on demand activation of
theory lemmas, user-propagators help to restrict the search space of SMT solving with minimal
overhead, as evidenced by our initial results (see Section 2). In this extended abstract we discuss
our approach towards a tailored integration of user-propagators with Z3 (Section 3), and outline
ideas for further improvements (Section 4).</p>
    </sec>
    <sec id="sec-2">
      <title>2. Motivating Example</title>
      <p>We illustrate the benefits of user-propagators via solving the -queens problem. Recall that
the -queens problem asks for a placement of  mutually non-threatening queens on an  × 
chessboard, with  ≥ 1. That is, the placement should ensure that none of the queens can
attack any of the other ones, where queens may attack along rows, columns, and diagonals on
the chessboards. An example of a placement solution for the -queens problem, when  = 6, is
shown in Figure 1.</p>
      <p>One way to formalize the -queens problem is to use (bit-vector) linear arithmetic, and assert
a constraint problem (CP) as the following formula
(1, . . . , ) ∧</p>
      <p>⋀︁  &lt;  ∧
1≤ ≤</p>
      <p>⋀︁
1≤ &lt;≤ 
| −  | ̸= | − |,
(1)
where  represents the numerical position of a queen in the ℎ row. A solution to (1) gives a
valid placement of  queens on the chessboard.</p>
      <p>
        User-Propagator for Lazy Encoding in SMT. We note that SAT/SMT approaches over
bit-vector arithmetic, such as [
        <xref ref-type="bibr" rid="ref10 ref9">9, 10</xref>
        ], can be used to solve (1), by reasoning in the full
theory of bit-vector arithmetic. In this paper, we argue and show that implementing a
user-propagator on top of SMT solving may outperform such approaches. The main benefit of
a user-propagator comes with adding theory-constraints on demand; we therefore refer to
SMT solving with user-propagators as lazy encoding in SMT, as also advocated in [11, 12]. In
more detail, when using a user-propagator in the SMT solver to solve (1), the user-propagator
tracks/watches the variable assignments made during SMT decisions, and adds conflicts to
the SMT problem in case (1) is (partially) violated. This way, the formula (1) is solved by
resolving the conflicts added by the user-propagator, avoiding the potential overhead of
bit-blasting the whole formula. A pseudo code showing the general idea can be found in Listing 1.
      </p>
      <p>Listing 1: Lazy Bit-Vector Encoding of -Queens
f i x e d ( a s t , v a l u e ) :
queenY = queenToY ( a s t )
queenX = v a l u e
i f ( queenX ≥ b o a r d )
/ / C o n s t r a i n t : q u e e n s mu st b e on t h e b o a r d
c o n f l i c t ( { a s t } )
r e t u r n
f o r e a c h ( f i x e d in a l r e a d y F i x e d V a r s )
o t h e r X = model [ f i x e d ]
o t h e r Y = queenToY ( f i x e d )
i f ( queenX = o t h e r X )
/ / C o n s t r a i n t : q u e e n s may n o t a t t a c k v e r t i c a l l y
c o n f l i c t ( { a s t , f i x e d } )
e l s e i f ( | queenX − o t h e r X | = | queenY − o t h e r Y | )
/ / C o n s t r a i n t : q u e e n s may n o t a t t a c k d i a g o n a l l y
c o n f l i c t ( { a s t , f i x e d } )
Experimental Results. To showcase the practical benefits of user-propagators in SMT solving,
we carried out experiments on generating all solutions to the -queens problem1. That is, we
generate all valid placements of  queens on an  ×  chessboard. To this end, we used the
following experimental setup:
(i) We used a standard SMT approach to solve and enumerate all solutions to the -queens
problem, by reasoning over (1) in bit-vector arithmetic. In this setting, the formula will
be bit-blasted completely by the solver before the actual reasoning starts. We refer to
this experiment as an eager encoding with externally added conflicts , as each solution is
generated by a new SMT run (using an incremental solver). Once a solution is generated,
the negation of this solution is used as a blocking clause to generate a new solution, via
another SMT solving process.
(ii) When using a standard SMT approach as in (i) to generate all solutions to the -queens
problem, there is a significant burden in extracting and revising (new) models by
generating and storing so-called blocking clauses (clauses that resolve decision conflicts), even if
an incremental solver is used. To mitigate this burden, we added a conflict between all
queen variables every time the SMT solver consistently fixed the last previously
unassigned variable. This allows the SMT solver to enumerate all models within a single query,
rather than enumerating solutions one-by-one as in case (i). The conflicts (i.e. blocking
clauses) added through the user-propagator are considered as learned clauses, and can</p>
      <sec id="sec-2-1">
        <title>1 See https://github.com/Z3Prover/z3/tree/master/examples/userPropagator for the code.</title>
        <p>be disposed by the solver. As clauses that are still relevant might be disposed as well,
the user-propagator has to keep track of all solutions found so far and block them again
in case required as the solver may find the same model multiple times. We refer to this
experiment as an eager encoding with internally added conflicts .
(iii) We used a user-propagator for lazy encoding in SMT solving, as described above. That
is, we on demand add theory-constraints generated by the user-propagator as blocking
clauses to the SMT solver; in other words, we lazily instantiate theory-constraints using
the user-propagator. We refer to this experiment as lazy encoding with internally added
conflicts .
(iv) Finally, we used an answer set programming (ASP) approach [13, 14] to generate all
solutions to the -queens problem (1). We considered this experimental comparison, as
answer set programming allows a similar syntactic encoding, and is considered to be
eficient at enumerating all possible solutions to a given problem of a finite domain.</p>
        <p>For performing our experiments, we used the SMT solver Z3 in (i)-(iii), and the ASP solver
clingo [14] in (iv). Our experimental results from (i)-(iv) are plotted on Figure 2, showcasing
that our user-propagator approach (iii) to lazy encoding in SMT outperforms the other settings.
Although the ASP encoding is very fast compared to the other encodings for small , it performs
worse than (ii) and (iii) when  &gt; 13 and  &gt; 12, respectively.</p>
        <p>We note that there are other more eficient encodings for the -queens problem as well.
For example, a direct translation to SAT is possible by stating that there has to be a queen in
every row and manually forbidding all pairs of positions that cannot be both occupied at the
same time by respective clauses. Our experimental results using this completely propositional
encoding, together with eager and lazy encodings are summarized in Figure 3, showcasing
again that user-propagation in SMT can be used to speed up reasoning. Although, finding all
solutions by this completely propositional approach shows that lazy encodings do not give
a generic approach that decrease reasoning time in all cases, user-propagators can also be
used to implement custom variable selection/assignment heuristic to improve performance.
Our evaluation includes the results of using an eager propositional encoding together with a
heuristic implemented through the user-propagator’s. The heuristic first puts queens on tiles
where they attack the most squares not previously attacked, possibly increasing the number of
subsequent assignments that can be done by constraint propagation. An eager propositional
encoding together with this heuristic turned out to be the most eficient variant.</p>
        <p>Figure 4 shows that, although finding all solutions to the -queens problem by a lazy
propositional approach does not perform well, the same approach strongly reduces the time of finding a
single solution. In addition, the required amount of memory has been greatly reduced: Finding a
solution to  = 60 required 84 megabytes with the eager bit-vector encoding and 128 with the
eager propositional one. The lazy encodings, however, both required only about 19 megabytes.</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. User-Propagator in SMT Solving with Z3</title>
      <p>As mentioned, a user-propagator implements a set of callbacks, where callbacks are
customdefined by the user. When using a user-propagator, the CDCL(  ) engine of the SMT solver will
call the respective callback if some of the later described events occur, in order to allow the
client to observe the solvers actions and interfere if required. To keep the overhead because of
the additional callbacks low and to get only callbacks that are relevant for the user-propagator,
the SMT solver tracks only events that are related to expressions that were previously registered
by the user-propagator.</p>
      <p>As shown in Section 2, user-propagators in SMT solving can be used to solve constraint
problems by ofering a way to implement lazy clause generation [ 11, 12]. Moreover, proper
implementations of user-propagators may significantly increase the eficiency of the solving
process. This is mainly due to the fact that the SMT solver does not have to keep a large number
of (potentially irrelevant) clauses in its memory, while tracking a specific variable assignment
order, or by detecting invalid variable assignments early.</p>
      <p>In what follows, we describe our approach to support user-propagator callbacks in SMT
solving, by focusing on the direct integration of these callbacks with Z3. Our experiments
showed that the integration comes with minimal overhead on the solver side, which can be easily
compensated by its amenities. We note that user-propagators have already been supported in
another form in Z3, by using theory plug-ins that allowed extending Z3’s native theory support
with so-called user-theories [15]. Based on this theory plug-in interface of Z3, a general purpose
string solver was developed in [16]. Similar ideas for extending theory support in SMT have
also been exploited in the SMT solver OpenSMT [17].</p>
      <p>More recently, in [18] custom user propagators through the API of Z3 have been reintroduced
for booleans and bit-vectors to solve a configuration problem in the context of large-scale
constraint problems. The approach of [18] shows how manually introduced conflicts can be
used to enforce some pseudo-boolean constraints during SMT solving. In extension of [18],
in our work we employ user-propagators not only to solve satisfiability, but to also eficiently
generate all models/solutions of a constraint problem by adequately integrating user-propagator
callbacks in the SMT solving process. In particular, we support the following callbacks in the
CDCL( ) engine of Z3:
Push and Pop – are invoked when Z3 branches (Push) on a boolean decision, respectively,
backtracks (Pop).</p>
      <p>Fixed – is invoked when a registered boolean/bit-vector expression is assigned a fixed value.</p>
      <p>A bit-vector expression is fixed, when all involved bits are fixed.</p>
      <p>Eq and Diseq – are invoked when two registered expressions are inferred equal (Eq) or
disequal (Diseq). In contrast to the Eq callback, Diseq is incomplete, as it only reports the
disequality if there is a formula in Z3’s internal formula representation containing a
respective equality atom that was set to false.</p>
      <sec id="sec-3-1">
        <title>Final – is invoked when there are no more decisions to make.</title>
        <p>Decide – is invoked when Z3 branches on a registered expression. The function may decline
the chosen variable to branch on and its value by providing an alternative. Custom
variable selection/assignment heuristics can be implemented through this callback.
Created – is invoked when an instance of a user-function is encountered the first time. This
callback is especially relevant in case a function occurs within the scope of a quantifier;
in this case, Z3 may instantiate the function several times with diferent arguments.
Fresh – is invoked when a solver creates a new sub-solver instance for doing subqueries. This
is done, for example, in course of model based quantifier instantiation (MBQI).</p>
        <p>We conclude by noting that most of the above callbacks may propagate arbitrary new formulas
to the CDCL( ) engine of Z3, add conflicts between already fixed variables within Z3, or set
the variable to split on next (similar to the decide-callback). For example, when generating
all solutions of the -queens problem in Section 2, we enforced some global constraints by
lazy clause generation, while observing bit-vector assignments and introducing conflicts. As
evidenced in Figures 2–4, we believe that a properly integrated user-propagator in SMT solving
can strongly reduce memory consumption and reasoning time by adding theory constraints on
demand.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Conclusion and Future Work</title>
      <p>We discuss user-propagators in SMT solving with the aim of providing eficient and on
demand theory-reasoning. Our initial experiments in this respect are encouraging. Beyond our
motivating example using the -queens problem, we are currently applying user-propagators
in Z3 to improve performance of software verification tools, such as the alive2 verification
framework [19]. In particular we try to delay axiom instantiations that are very unlikely to
influence the SMT solver’s outcome. For example, we want to ensure that diferent memory
allocations yield disjoint memory addresses. Reasoning about such and similar properties, encoded
in bit-vector arithmetic, yields a quadratic number of instances when eagerly instantiating
bit-vector axioms. Instead, by using a user-propagator, we lazily instantiate bit-vector axioms
only in cases when their absence would result in unsound results.</p>
      <p>One of the main challenges related to user-propagation in general is that several SMT solving
optimizations are not compatible with our lazy encoding approach. For example, pure literal
elimination cannot be applied lazily, as it is unknown whether a literal is actually pure or not.
Another line of further work comes with applying user-propagators in SMT over quantified
formulas, in order to improve model-based quantifier instantiation, for example in combination
with functions over booleans or bit-vectors. Supporting further theories directly in the
userpropagator, like floating-points or algebraic datatypes, would a further extension that may be
worth considering.</p>
      <p>We finally note, that although we mainly discussed lazy clause generation and focused on
investigated how custom boolean-based theories can be utilized, more complex non-finite
theories can be modeled as well in using user-propagators on top of SMT solving, by observing
(dis-)equality constraints and checking the consistency of the theory-specific atoms in the fixed
and final callbacks. However, further callbacks may be required to eficiently implement such
more complex theories.</p>
    </sec>
    <sec id="sec-5">
      <title>Acknowledgments</title>
      <p>We thank Nuno Lopes (U. Lisbon) for valuable discussion on potential applications of
userpropagators in alive2 benchmarks. The work described in this extended abstract was partially
supported by the ERC Consolidator Grant ARTIST 101002685 and the Austrian FWF project
W1255-N23.
[11] O. Ohrimenko, P. J. Stuckey, M. Codish, Propagation via Lazy Clause Generation,
Constraints An Int. J. 14 (2009) 357–391. doi:10.1007/s10601-008-9064-x.
[12] T. Feydy, P. J. Stuckey, Lazy Clause Generation Reengineered, in: CP, 2009, pp. 352–366.</p>
      <p>doi:10.1007/978-3-642-04244-7\_29.
[13] E. Giunchiglia, Y. Lierler, M. Maratea, Answer Set Programming Based on Propositional</p>
      <p>Satisfiability, J. Autom. Reason. 36 (2006) 345–377. doi: 10.1007/s10817-006-9033-2.
[14] R. Kaminski, T. Schaub, P. Wanko, A Tutorial on Hybrid Answer Set Solving with clingo,
in: Proc. of Reasoning Web, 2017, pp. 167–203. doi:10.1007/978-3-319-61033-7\_6.
[15] N. Bjørner, Engineering theories with Z3, in: Proc. of APLAS, 2011, pp. 4–16. doi:10.</p>
      <p>1007/978-3-642-25318-8\_3.
[16] Y. Zheng, X. Zhang, V. Ganesh, Z3-str: a Z3-Based String Solver for Web Application</p>
      <p>Analysis, in: FSE, 2013, pp. 114–124. doi:10.1145/2491411.2491456.
[17] R. Bruttomesso, E. Pek, N. Sharygina, A. Tsitovich, The OpenSmt Solver, in: TACAS, 2010,
pp. 150–153. doi:10.1007/978-3-642-12002-2\_12.
[18] N. Bjørner, M. Levatich, N. P. Lopes, A. Rybalchenko, C. Vuppalapati, Supercharging Plant
Configurations Using Z3, in: P. J. Stuckey (Ed.), CPAIOR, 2021, pp. 1–25. doi: 10.1007/
978-3-030-78230-6\_1.
[19] J. Lee, C. Hur, R. Jung, Z. Liu, J. Regehr, N. P. Lopes, Reconciling High-Level
Optimizations and Low-Level Code in LLVM, in: OOPSLA, 2018, pp. 125:1–125:28. doi:10.1145/
3276495.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>D.</given-names>
            <surname>Jovanovic</surname>
          </string-name>
          , L. de Moura, Solving
          <string-name>
            <surname>Non-Linear</surname>
            <given-names>Arithmetic</given-names>
          </string-name>
          ,
          <source>ACM Commun. Comput. Algebra</source>
          <volume>46</volume>
          (
          <year>2012</year>
          )
          <fpage>104</fpage>
          -
          <lpage>105</lpage>
          . doi:
          <volume>10</volume>
          .1145/2429135.2429155.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>M.</given-names>
            <surname>Berzish</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Ganesh</surname>
          </string-name>
          ,
          <string-name>
            <surname>Y. Zheng,</surname>
          </string-name>
          <article-title>Z3str3: A String Solver with Theory-aware Heuristics</article-title>
          , in: FMCAD,
          <year>2017</year>
          , pp.
          <fpage>55</fpage>
          -
          <lpage>59</lpage>
          . doi:
          <volume>10</volume>
          .23919/FMCAD.
          <year>2017</year>
          .
          <volume>8102241</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Zheng</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Ganesh</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Subramanian</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Tripp</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Berzish</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Dolby</surname>
          </string-name>
          ,
          <string-name>
            <surname>X. Zhang,</surname>
          </string-name>
          <article-title>Z3str2: an Eficient Solver for Strings, Regular Expressions, and Length Constraints, Formal Methods Syst</article-title>
          . Des.
          <volume>50</volume>
          (
          <year>2017</year>
          )
          <fpage>249</fpage>
          -
          <lpage>288</lpage>
          . doi:
          <volume>10</volume>
          .1007/s10703-016-0263-6.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>A.</given-names>
            <surname>Reynolds</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Nötzli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C. W.</given-names>
            <surname>Barrett</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Tinelli</surname>
          </string-name>
          ,
          <article-title>A Decision Procedure for String to Code Point Conversion</article-title>
          , in: IJCAR,
          <year>2020</year>
          , pp.
          <fpage>218</fpage>
          -
          <lpage>237</lpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>030</fpage>
          -51074-9\ _
          <fpage>13</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>S.</given-names>
            <surname>Kan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. W.</given-names>
            <surname>Lin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Rümmer</surname>
          </string-name>
          , M. Schrader,
          <article-title>CertiStr: a Certified String Solver</article-title>
          , in: CPP,
          <year>2022</year>
          , pp.
          <fpage>210</fpage>
          -
          <lpage>224</lpage>
          . doi:
          <volume>10</volume>
          .1145/3497775.3503691.
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>L.</given-names>
            <surname>Kovács</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Robillard</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Voronkov</surname>
          </string-name>
          ,
          <article-title>Coming to Terms with Quantified Reasoning</article-title>
          , in: POPL,
          <year>2017</year>
          , pp.
          <fpage>260</fpage>
          -
          <lpage>270</lpage>
          . doi:
          <volume>10</volume>
          .1145/3009837.3009887.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>A.</given-names>
            <surname>Reynolds</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Kuncak</surname>
          </string-name>
          ,
          <article-title>Induction for SMT Solvers</article-title>
          , in: VMCAI,
          <year>2015</year>
          , pp.
          <fpage>80</fpage>
          -
          <lpage>98</lpage>
          . doi:
          <volume>10</volume>
          . 1007/978-3-
          <fpage>662</fpage>
          -46081-8\_5.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>A.</given-names>
            <surname>Niemetz</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>Zohar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C. W.</given-names>
            <surname>Barrett</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Tinelli</surname>
          </string-name>
          ,
          <string-name>
            <surname>Towards Satisfiability Modulo Parametric</surname>
          </string-name>
          Bit-vectors,
          <source>J. Autom. Reason</source>
          .
          <volume>65</volume>
          (
          <year>2021</year>
          )
          <fpage>1001</fpage>
          -
          <lpage>1025</lpage>
          . doi:
          <volume>10</volume>
          .1007/s10817-021-09598-9.
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>A.</given-names>
            <surname>Niemetz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Preiner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Wolf</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Biere</surname>
          </string-name>
          , Btor2 ,
          <source>BtorMC and Boolector 3</source>
          .0, in: CAV,
          <year>2018</year>
          , pp.
          <fpage>587</fpage>
          -
          <lpage>595</lpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>319</fpage>
          -96145-3\_
          <fpage>32</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>L. M. ça de Moura</surname>
          </string-name>
          , N. Bjørner,
          <article-title>Z3: An Eficient SMT Solver</article-title>
          , in: TACAS,
          <year>2008</year>
          , pp.
          <fpage>337</fpage>
          -
          <lpage>340</lpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>540</fpage>
          -78800-3\_
          <fpage>24</fpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>