<!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>
      <issn pub-type="ppub">1613-0073</issn>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Towards Producing Shorter Congruence Closure Proofs in a State-of-the-art SMT Solver (Extended Abstract)</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>BrunoAndreot t</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>i HanielBarbosa</string-name>
          <email>barbosa@dcc.ufmg.br</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>OliverFlat</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Workshop</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>PAAR'24: 9th Workshop on Practical Aspects of Automated Reasoning</institution>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Universidade Federal de Minas Gerais (UFMG)</institution>
          ,
          <addr-line>Belo Horizonte</addr-line>
          ,
          <country country="BR">Brazil</country>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>University of Washington</institution>
          ,
          <addr-line>Seattle</addr-line>
          ,
          <country country="US">USA</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>The satisfiability of constraints in the theory of equality and uninterpreted functions, a core component of SMT solving, can be decided via a congruence closure algorithm. Classical congruence closure algorithms can provide machine checkable proofs when explaining why terms are equal. Recently, Flatt et al. at FMCAD'22 presented a modified congruence closure algorithm producing demonstrably shorter proofs. The algorithm was implemented and evaluated in the context of equality saturation tools. In this extended abstract we present initial work on implementing this new congruence closure algorithm in cvc5, a state-of-the-art SMT solver. We discuss the challenges from adapting a high-performance implementation and how to address them efectively. We evaluate the implementation on a large set of SMT-LIB benchmarks, and demonstrate experimentally how this new algorithm results in smaller proofs in real-world scenarios. Moreover, we evaluate the performance impact of the new algorithm and determine whether the smaller explanations that can be generated from the shorter proofs are worth the performance overhead of the more expensive algorithm.</p>
      </abstract>
      <kwd-group>
        <kwd>SMT solvers</kwd>
        <kwd>Congruence closure</kwd>
        <kwd>SMT proofs</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>Proof-producing SMT solvers have a large potential for increasing the trustworthiness of formal methods
applications that rely on solvers to discharge proof obligations. SMT solvers however can produce large
proof certificates that can be challenging to check quickly, specially in tools with limited performance,
such as formally verified checkers or proof assistants. One way to mitigate this issue is to employ
solving techniques that can lead to shorter proofs within the same proof calculus, which will therefore
be simpler to check. Flatt et a1]l.p[roposed such a procedure for the classical congruence closure
algorithm in the context of equality saturation. In this paper we present an initial implementation of
this approach in the congruence closure engine of the state-of-the-art SMT solve2r]. cEvxct5e[nding
the core component of state-of-the-art SMT solvers is notoriously challe3]n,gaindg [we discuss the
several challenges specific to this setting that we had to face, such as considering backtracking and
avoiding cyclic explanations. We also present an evaluation of the current implementation, which
indicates a number of future directions of improvements and some encouraging proof compression
rates in proofs from the congruence closure algorithm.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Context</title>
      <p>Congruence is the property of equality that states that if two atnerdmsare equal, then, for any
function ,  () =  ()</p>
      <p>. For a given set of equalities, we say that the corresponding congruence closure
is the minimal equivalence relation that satisfies these equalities as well as the properties of reflexivity,
symmetry, transitivity and congruence.</p>
      <p>Eficient algorithms for computing congruence closure were first described by Downey et4a]la. n[ d
Nelson and Oppen 5[], where the main application was determining the equivalence of expressions</p>
      <p>CEUR</p>
      <p>ceur-ws.org
in a program, for the purpose of program verification. This algorithm is basedUonnioan-find data
structure6[], where each term is a vertex in a graph (calledeqtuhaelity graph, or e-graph), and each
equivalence class forms a rooted tree, whose root is called threepcrleassesntative. The graph is built by
processing equalities sequentially. At the start, each term is part of an equivalence class containing
only itself. When the algorithm processes an equa=lity, if the terms are not already equivalent, it
mustmerge their equivalence classes. First it finds the representativeasnodf  and then adds an edge
between them, with one of them becoming the representative of the merged class.</p>
      <p>Then, the algorithm must merge all classes that have become equivalent due to the congruence
property. For example, when t h=e  is asserted, the ter m()s and () are now also equivalent, so
the algorithm must also merge their classes. We call edges added in tchoinsgsrtueepnce edges, and
the terms that caused them to be added tjuhsetificration . In our example, the congruence edge that
merged the classes o (f) and () will have the term{,s} as its justification.</p>
      <p>Once the equality graph is built, whether two terms are equal is determined by finding their class
representatives and checking if they are the same. However, for many applications, responding to these
queries with a “yes” or “no” answer is not suficient. In some cases, like for SMT solverse,xapnlanation
of why two terms are equal is also necessary. These explanations take the form of a set of equalities
suficient to ensure that the terms are equivalent. In SMT solvers, producing explanations is crucial
since they are used to build conflict clauses in the solver. In the CD)CaLl(gorithm7[] used by most
SMT solvers, the solver will make a series of assumptions and use the theory solvers to determine
whether they are consistent. If they are not, the theory solver will provide a conflict clause — a subset of
the assumptions that is by itself inconsistent, which is used to prune part of the search space. Note that
a smaller clause will increase the pruning, and is thus more useful to the solver. Thus, a congruence
closure algorithm that can provide explanations (and ideally, short explanations) is crucial for a high
performance SMT solver. However, it is well known that finding the smallest possible explanation for
the equivalence of two terms is an NP-complete probl8e]m. [
Congruence closure and proofs. Some congruence closure algorithms are also capable of producing
proofs. While an explanation is just a set of equalities, a proof is a derivation that uses these equalities
and the properties of reflexivity, symmetry, transitivity and congruence to show that the two terms are
equivalent.</p>
      <p>
        Proofs from a congruence closure algorithm are also useful for SMT solvers, since they allow the
solver to provide a proof for the unsatisfiability of a formula as a whole. Proof-producing SMT
solvers have become increasingly important in the last few years, and are already used in many
applications9[
        <xref ref-type="bibr" rid="ref10 ref11 ref12 ref13">, 10, 11, 12, 13</xref>
        ]. As an example, they are used for proof automation in interactive theorem
provers [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]. In this technique, SMT solvers are used to prove a theorem or a lemma in an interactive
theorem prover, by showing that its negation is unsatisfiable. Then, they must produce a well-formed
proof that will be reconstructed in the langauge of the theorem prover. Since congruence closure
reasoning will often be a part of this proof, the congruence closure algorithm used by this SMT solver
must be able to produce well formed proofs.
      </p>
      <p>A proof-producing congruence closure algorithm is described by Nieuwenhuis et a1l5.].inW[hen
asked to explain two equivalent terms, this algorithm traverses the path between them in the equality
graph. When encountering a non-congruence edge, the algorithm simply stores the equality that
caused that edge to be merged. When encountering a congruence edge with justific{a1t, io2}n, the
algorithm recursively explains the equivalence of the t1eramnds 2, and adds all returned equalities to
the explanation. Figur1eshows the pseudocode for this algorithm.</p>
      <p>While the explanations returned by this algorithm are minimal, they are not nemciensismaurmil,y
meaning a shorter explanation may often exist. A property of these algorithms that allows this to
happen is the fact that they ignore equalities between terms that were already determined to be equal
(calledredundant equalities). For example, if an algorithm has already determined that the atnerdms
 are equivalent due to some long series of equalities, if it then encounters the e=qua,liittywill
discard it. Later, when queried for an explanation of these terms’ equivalence, it would provide a long
function get_explanation(start, end):
let explanation = []
let lca = find_lowest_common_ancestor(start, end)
explanation += explain_along_path(start, lca)
explanation += explain_along_path(end, lca)
return explanation
function explain_along_path(lower, upper):
let explanation = []
let current = lower
while current != upper:
let edge = current.edge_to_parent()
if edge.is_congruence_edge():
let (j1, j2) = edge.justification()
explanation += get_explanation(j1, j2)
else:</p>
      <p>explanation += edge
current = current.parent()
return explanation
set of equalities, where the singleton explana{t=io}n would sufice. Observing this limitation, Flatt
et al. 1[] developed two new congruence closure algorithms, caTlrleedOpt andGreedy, that do not
discard redundant equalities, and instead use them to provide shorter proofs and potentially smaller
explanations.</p>
      <p>When encountering a redundant equal=ity , these algorithms add the ed(g,e) to the equality
graph, not triggering any merges (as the terms were already in the same equivalence class). Now, each
equivalence class is not necessarily a tree anymore, so there may be more than one path between two
terms in it. Naturally, when queried for an explanation, the goal of these algorithms is to find the path
between the terms that represents the shortest proof. This is where the strategies used by the two
algorithms diverge. In the following sections, we give a high-level description of the two algorithms
introduced by Flatt et a1]l,. b[ut a detailed description, as well as pseudocode, can be found in the
original paper.</p>
      <sec id="sec-2-1">
        <title>2.1. TreeOpt</title>
        <p>As mentioned earlier, finding the path between two equivalent terms that results in the smallest proof
is an NP-complete problem8][. This is in part because the equalities used as premises to explain a
congruence edge might also be reused to explain other edges in the path, meaning the best path to take
depends on the edges you already took. If we instead assume that equalities in the proof cannot be
shared (and instead have to be duplicated), the problem becomes tractable. This new definition of proof
size is called the prooft’rsee size, whereas the original definition is calledDiAtsG size1.</p>
        <p>The TreeOpt algorithm is a polynomial algorithm for finding the explanation with optimal tree size,
hence the name. It does this by first attributing a weight to each edge, defined as the tree size of the
proof for that edge. For non-congruence edges this value is always 1, and for congruence edges it is the
tree size of the proof of its justification. Since the weight of a congruence edge might depend on the
weight of other congruence edges, the algorithm needs to recompute these weights until it reaches a
ifxed point.</p>
        <p>Once the weight of all edges is computed, finding the optimal explanation amounts to simply finding
1This refers to the fact that, if we allow this sharing of equalities, the proof is represented by a directed acyclic graph (DAG),
whereas if we do not allow sharing, it is represented by a tree.
the shortest path between the two terms, taking care to recursively explain the justification of every
congruence edge encountered.</p>
      </sec>
      <sec id="sec-2-2">
        <title>2.2. Greedy</title>
        <p>The second algorithm presented by Flatt et1]ails.a[ greedy algorithm that attempts to find a small
explanation without incurring an increase in complexity. To do this, the algorithm first computes an
estimate of the proof size for each edge in the equality graph. This estimate is obtained by computing
the proof size of the edge with the traditional congruence closure algorithm, that is, ignoring redundant
equalities.</p>
        <p>Once the estimates are calculated, the algorithm simply finds the shortest path between the terms,
using the estimates as weights for the edges. The algorithm is parameterizfeudelbpyaarameter, which,
similarly to1][, we set to 10 as a default. When it encounters a congruence edge, if the fuel is greater
than 0, the algorithm recurses (and decrements its fuel) to explain the justification of the congruence
edge. However, if the fuel is 0, the algorithm explains the justification by simply using the classical
congruence closure algorithm, by finding a path which ignores redundant equalities.</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. Implementation</title>
      <p>
        We implemented these new congruence closure algorithms in c2v],ca5 [state-of-the-art SMT solver.
The existing theory solver for the theory of equality and uninterpreted functions, ecqaulalleidtyits
engine, implements a version of a proof-producing congruence closure algorithm as seen in Nieuwenhuis
et al. 1[
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. As part of this work, we adapted this existing implementation to not discard redundant
equalities, and implemented tThreeeOpt andGreedy explanation algorithms. In this section, we
highlight the main challenges that needed to be addressed to implement these new algorithms in cvc5.
      </p>
      <sec id="sec-3-1">
        <title>3.1. Context-dependence</title>
        <p>A big challenge in adapting the algorithms in Flatt1e]ttoalw. o[rk in a modern SMT solver was dealing
with the context-dependent nature of the solver. The CD) CalLg(orithm, used by most modern SMT
solvers, solves problems by testing many possible (partial) solutions and backtracking as soon as a
solution is determined to be invalid.</p>
        <p>This means that, from the viewpoint of the equality engine, the SMT solver will assert a series of
equalities, query the equality engine for explaining the reason why a given equality holds, and, if
the asserted equalities are found to be inconsistent, revert to a previous state. This means that the
equality engine must be able to eficiently produce explanations for the equivalence of any two terms,
while also at any point being able to backtrack to a previous state. To do that eficiently, the existing
implementation carefully records the steps taken by the congruence closure algorithm, and structures
the equality graph so that it can revert those steps, un-merging any equality classes that were merged
since the respective backtracking point.</p>
        <p>Keeping redundant equalities complicates this process. For example, when backtracking, the equality
engine holds an invariant that the number of edges is the same as the number of class merges —
since we modified the code to add edges that do not cause merges, we had to add “dummy” entries
to the class merges vector in order to keep this invariant. Since some data is cached between calls to
get_explanation (for example, the edge weights computed for tThreeOpt algorithm), we also had to
make sure that no invalid cached data survives after a backtrack. Otherwise, agceatl_letxoplanation
might use cached data from when the equality graph was in a diferent state, which might result in an
invalid or suboptimal proof.</p>
      </sec>
      <sec id="sec-3-2">
        <title>3.2. Avoiding circular explanations</title>
        <p>Since the equality engine in cvc5 is context-dependent, it is useful to think of the state of the equality
graph in terms olfevels. The current level of the equality engine is defined as the number of equalities
that were asserted, and for every equality that is backtracked, the level is decreased by 1.</p>
        <p>Importantly, when explaining the justification of a congruence edge that was added i n,wleevel
cannot use any redundant edges that were added in levels high er, otthhaenrwise the explanation
might use that congruence edge itself. Consider the following example:</p>
        <p>At level, the term is in the same equality class a, sseparated by a long path of edges. Sin ce
and are equivalent, there is a congruence edge bet w(e)enand () , whose justification is{, } . In
the next level+, 1 , the equality=  () is asserted, merging the equivalence classes of these two
terms. At lev e+l 2 , the redundant equal it=y () is asserted, and the corresponding redundant
edge is added. Then, the explanation f(o)r≡  () is queried. When explaining the congruence edge
between () and () , the algorithm must explain its justification, that is, find a path bet waenend
 . However, the shortest path between these terms will u(se()t, h()e) edge itself, resulting in a
circular explanation.</p>
        <p>(a) Example equality graph
at level.</p>
        <p>(b) Example equality graph
at level+ 1 .</p>
        <p>(c) Example equality graph
at level+ 2 .</p>
        <p>To prevent this, we store for each edge the level in which it was created. We also maadxd_eldevael
parameter tgoet_explanation, and changed the algorithms to ignore edges whose level is bigger than
the maximum level. When explaining a congruence edge with justifica{t i1o, n2}, max_level is set to
the level in which1 and 2 were determined to be equivalent. In this way, no circular explanations can
be constructed.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Evaluation</title>
      <p>In order to evaluate the efectiveness and performance of our implementation, we tested it against a
large set of benchmarks. More specifically, we used the 7502 SMT problems in the QF_UF logic from the
SMT-LIB benchmarks library16[], an industry-standard set of benchmarks for SMT solvers. The results
were generated with a cluster equipped with 16 x Intel(R) Xeon(R) CPU E5-2637 v4 @ 3.50GHz, 62.79
GiB RAM machines, with one core per solver/benchmark pair, 300s time limit, and 8 GB memory limit.</p>
      <p>We compare the two newly implemented algorithTmres,eOpt and Greedy, with the classical
congruence closure explanation algorithm, from here on referreVdatnoilalsa. We ran cvc5 on each
benchmark, using each of the three algorithms. We recorded the time taken to solve each problem, as
well as the size of the final proof. These results are shown in Sec4t.i1on</p>
      <p>The explanations returned by the congruence closure algorithm inform the search of the SMT solver,
which in turn changes which equalities are asserted to the equality engine, and the explanations that are
requested. Therefore, simply looking at the final proof size is not the most direct way to compare the
diferent algorithms. To get a more direct comparison, we instrumented cvc5 to, on each individual call
toget_explanation, run all three algorithms at the same time and record the size of each explanation
returned. These results are shown in Sect4i.2o.n</p>
      <sec id="sec-4-1">
        <title>4.1. Global impact results</title>
        <p>This data shows that, as expected, tThreeeOpt algorithm is much less eficient thanVanilla. On
the other hand, the performance of Gthreeedy algorithm is not as bad, representing on average an 18%
increase in runtime over tVhaenilla algorithm, and being in many cases faster than it. We believe
theses cases are due to smaller conflict clauses being provided, thus pruning a larger portion of the
search space, speeding up the solver.</p>
        <p>As for proof size, we did not measure a significant impact of the new algorithms in the final proof
size. On averageG,reedy andTreeOpt proofs were respectively 0.2% and 0.1% larger tVhaannilla
proofs. In most cases, proofs from all three algorithms were almost exactly the same size. In the best
cases, proofs fromGreedy andTreeOpt were respectively 80% and 78% smaller than the corresponding
Vanilla proofs. However, in the worst cases, the two new algorithms produced proofs that were up to
70% larger than the correspondiVnagnilla proofs.</p>
      </sec>
      <sec id="sec-4-2">
        <title>4.2. Local impact results</title>
        <p>We also compared, in each callgteot_explanation, the sizes of the proofs returned by each algorithm.
In particular, foGrreedy andTreeOpt, we are interested in the proof size ratio, that is, the size of the
proof returned by the algorithm, divided by the size of the proof returnedVbayntilhlea algorithm.</p>
        <p>For both algorithms, 83% of callsgteot_explanation result in proofs that are the same size as the
Vanilla proof (that is, the proof size ratio is 1). For both algorithms, the average proof size ratio was
0.98, and the minimum was 0.065. This means that while most proofs produced by these algorithms are
almost the same size as the ones froVmanilla, in some cases they can be up to 93.5% smaller.</p>
        <p>Looking at only the proofs whose size actually changed between algorithms (that is, excluding those
where the proof size ratio is 1), the average proof size ratio was 0.86 for both algorithms, representing a
reduction in proof size of 14%.</p>
        <p>In rare occasions, the algorithms produced larger proofsVtahnainlla. For Greedy, the worst proof
size ratio was 2.2, and foTrreeOpt it was 1.75. This is explained by the fact that these algorithms
search for proofs with minimal tree size, while the final size of the proof is computed as its DAG size.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>5. Conclusion and future work</title>
      <p>In conclusion, our work shows that congruence closure algorithms that keep redundant equalities
can be eficiently implemented in a state-of-the-art SMT solver, with reasonable runtime overhead.
Furthermore, we show that these techniques can have a measurable, even if modest, impact on proof
size. However, there are still many avenues for future work that need to be explored. For one, a more
extensive evaluation is necessary, investigating benchmarks from logics beyond QF_UF, and considering
other metrics like impact on proof checking time. Also, new algorithms and heuristics that use this
technique may be developed that present better performance, or that are better suited for use in an
SMT solver. While it is too soon to tell whether this technique will be practical for use in SMT solvers,
we hope that we were able to show that is has a lot of potential.
[15] R. Nieuwenhuis, A. Oliveras, Proof-producing congruence closure, in: J. Giesl (Ed.), Term Rewriting
and Applications, Springer Berlin Heidelberg, Berlin, Heidelberg, 2005, pp. 453–468.
[16] C. Barrett, P. Fontaine, C. Tinelli, The Satisfiability Modulo Theories Library
(SMTww-LwI.BS)M,TLIB.org, 2016.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>O.</given-names>
            <surname>Flatt</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Coward</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Willsey</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Tatlock</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Panchekha</surname>
          </string-name>
          ,
          <article-title>Small proofs from congruence closure</article-title>
          ,
          <source>in: 2022 Formal Methods in Computer-Aided Design (FMCAD)</source>
          ,
          <year>2022</year>
          , pp.
          <fpage>75</fpage>
          -
          <lpage>83</lpage>
          .
          <year>d1o0</year>
          .i:34727/ 2022/isbn.978-3-
          <fpage>85448</fpage>
          -053-2_
          <fpage>13</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <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 Construction and Analysis of Systems (TACAS)</article-title>
          ,
          <string-name>
            <surname>Part</surname>
            <given-names>I</given-names>
          </string-name>
          , volume 1324L3ecotufre 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-
          <issue>9</issue>
          _
          <fpage>2</fpage>
          .4 doi:10.1007/978-3-
          <fpage>030</fpage>
          -99524-9\_
          <fpage>24</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>H.</given-names>
            <surname>Barbosa</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Reynolds</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D. E.</given-names>
            <surname>Ouraoui</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Tinelli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C. W.</given-names>
            <surname>Barrett</surname>
          </string-name>
          ,
          <article-title>Extending SMT solvers to higher-order logic</article-title>
          , in: P. Fontaine (Ed.),
          <source>Proc. Conference on Automated Deduction (CADE)</source>
          , volume
          <volume>11716</volume>
          , Springer,
          <year>2019</year>
          , pp.
          <fpage>35</fpage>
          -
          <lpage>54</lpage>
          . URL:https://doi.org/10.1007/978-3-
          <fpage>030</fpage>
          -29436-6_.3doi:
          <fpage>10</fpage>
          . 1007/978-3-
          <fpage>030</fpage>
          -29436-6\_3.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>P. J.</given-names>
            <surname>Downey</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Sethi</surname>
          </string-name>
          ,
          <string-name>
            <surname>R. E. Tarjan,</surname>
          </string-name>
          <article-title>Variations on the common subexpression problem</article-title>
          ,
          <source>J. ACM</source>
          <volume>27</volume>
          (
          <year>1980</year>
          )
          <fpage>758</fpage>
          -
          <lpage>771</lpage>
          . URL: https://doi.org/10.1145/322217.32222.8doi:
          <fpage>10</fpage>
          .1145/322217.322228.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>G.</given-names>
            <surname>Nelson</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D. C.</given-names>
            <surname>Oppen</surname>
          </string-name>
          ,
          <article-title>Fast decision procedures based on congruence closure</article-title>
          ,
          <source>J. ACM</source>
          <volume>27</volume>
          (
          <year>1980</year>
          )
          <fpage>356</fpage>
          -
          <lpage>364</lpage>
          . URL: https://doi.org/10.1145/322186.32219.8doi:
          <fpage>10</fpage>
          .1145/322186.322198.
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>R. E.</given-names>
            <surname>Tarjan</surname>
          </string-name>
          ,
          <article-title>Eficiency of a good but not linear set union algorithm</article-title>
          ,
          <source>J. ACM</source>
          <volume>22</volume>
          (
          <year>1975</year>
          )
          <fpage>215</fpage>
          -
          <lpage>225</lpage>
          . URL: https://doi.org/10.1145/321879.32188.4doi:
          <fpage>10</fpage>
          .1145/321879.321884.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>R.</given-names>
            <surname>Nieuwenhuis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Oliveras</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Tinelli</surname>
          </string-name>
          ,
          <article-title>Solving sat and sat modulo theories: From an abstract davis-putnam-logemann-loveland procedure to dpll(t)</article-title>
          ,
          <source>J. ACM</source>
          <volume>53</volume>
          (
          <year>2006</year>
          )
          <fpage>937</fpage>
          -
          <lpage>977</lpage>
          .hUtRtLp: //doi.acm.
          <source>org/10</source>
          .1145/1217856.1217859. doi:
          <volume>10</volume>
          .1145/1217856.1217859.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>A.</given-names>
            <surname>Fellner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Fontaine</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B. W.</given-names>
            <surname>Paleo</surname>
          </string-name>
          ,
          <article-title>Np-completeness of small conflict set generation for congruence closure</article-title>
          ,
          <source>Form. Methods Syst. Des</source>
          .
          <volume>51</volume>
          (
          <year>2017</year>
          )
          <fpage>533</fpage>
          -
          <lpage>544</lpage>
          . URhLt:tps://doi.org/10.1007/ s10703-017-0283-x. doi:
          <volume>10</volume>
          .1007/s10703-017-0283-x.
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>H.</given-names>
            <surname>Barbosa</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Reynolds</surname>
          </string-name>
          , G. Kremer,
          <string-name>
            <given-names>H.</given-names>
            <surname>Lachnitt</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>Viswanathan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Viteri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Zohar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Tinelli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Barrett</surname>
          </string-name>
          ,
          <article-title>Flexible proof production in an industrialstrength smt solver</article-title>
          ,
          <source>in: Automated Reasoning: 11th International Joint Conference, IJCAR 2022, Haifa, Israel, August</source>
          <volume>8</volume>
          -
          <issue>10</issue>
          ,
          <year>2022</year>
          , Proceedings, Springer-Verlag, Berlin, Heidelberg,
          <year>2022</year>
          , p.
          <fpage>15</fpage>
          -
          <lpage>35</lpage>
          . URL: https://doi.org/10.1007/978-3-
          <fpage>031</fpage>
          -10769-6_.3doi:
          <fpage>10</fpage>
          .1007/978-3-
          <fpage>031</fpage>
          -10769-
          <issue>6</issue>
          _
          <fpage>3</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>H.</given-names>
            <surname>Barbosa</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Barrett</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Cook</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Dutertre</surname>
          </string-name>
          , G. Kremer,
          <string-name>
            <given-names>H.</given-names>
            <surname>Lachnitt</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Niemetz</surname>
          </string-name>
          ,
          <string-name>
            <surname>A.</surname>
          </string-name>
          <article-title>N ötzli, A</article-title>
          . Ozdemir,
          <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>Tinelli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Zohar</surname>
          </string-name>
          ,
          <article-title>Generating and exploiting automated reasoning proof certificates</article-title>
          ,
          <source>Commun. ACM</source>
          <volume>66</volume>
          (
          <year>2023</year>
          )
          <fpage>86</fpage>
          -
          <lpage>95</lpage>
          . URLh:ttps://doi.org/10.1145/358769.2 doi:10.1145/3587692.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>B.</given-names>
            <surname>Andreotti</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Lachnitt</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Barbosa</surname>
          </string-name>
          ,
          <string-name>
            <surname>Carcara:</surname>
          </string-name>
          <article-title>An eficient proof checker and elaborator for smt proofs in the alethe format, in: Tools and Algorithms for the Construction and Analysis of Systems: 29th International Conference</article-title>
          , TACAS 2023,
          <article-title>Held as Part of the European Joint Conferences on Theory and Practice of Software</article-title>
          ,
          <source>ETAPS 2023</source>
          , Paris, France,
          <source>April 22-27</source>
          ,
          <year>2023</year>
          , Proceedings,
          <string-name>
            <surname>Part</surname>
            <given-names>I</given-names>
          </string-name>
          , Springer-Verlag, Berlin, Heidelberg,
          <year>2023</year>
          , p.
          <fpage>367</fpage>
          -
          <lpage>386</lpage>
          .hUtRtLp:s://doi.org/10. 1007/978-3-
          <fpage>031</fpage>
          -30823-9_
          <fpage>19</fpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>031</fpage>
          -30823-9_
          <fpage>19</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>J.</given-names>
            <surname>Hoenicke</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Schindler</surname>
          </string-name>
          ,
          <article-title>A simple proof format for SMT</article-title>
          , volume 3185CoEfUR
          <source>Workshop Proceedings</source>
          , CEUR-WS.org,
          <year>2022</year>
          , pp.
          <fpage>54</fpage>
          -
          <lpage>70</lpage>
          . URL: http://ceur-ws.
          <source>org/</source>
          Vol-
          <volume>3185</volume>
          /paper9527.p.df
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>R.</given-names>
            <surname>Otoni</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Blicha</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Eugster</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. E. J.</given-names>
            <surname>Hyvärinen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Sharygina</surname>
          </string-name>
          ,
          <article-title>Theory-specific proof steps witnessing correctness of SMT executions</article-title>
          , in: Design Automation Conference (DAC), IEEE,
          <year>2021</year>
          , pp.
          <fpage>541</fpage>
          -
          <lpage>546</lpage>
          . URL: https://doi.org/10.1109/DAC18074.
          <year>2021</year>
          .
          <volume>958627</volume>
          .2doi:
          <fpage>10</fpage>
          .1109/DAC18074.
          <year>2021</year>
          .
          <volume>9586272</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>H.</given-names>
            <surname>Schurr</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Fleury</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Desharnais</surname>
          </string-name>
          ,
          <article-title>Reliable reconstruction of fine-grained proofs in a proof assistant</article-title>
          , in: A.
          <string-name>
            <surname>Platzer</surname>
          </string-name>
          , G. Sutclife (Eds.),
          <source>Proc. Conference on Automated Deduction (CADE)</source>
          , volume
          <volume>12699</volume>
          of Lecture Notes in Computer Science, Springer,
          <year>2021</year>
          , pp.
          <fpage>450</fpage>
          -
          <lpage>467</lpage>
          . URL: https: //doi.org/10.1007/978-3-
          <fpage>030</fpage>
          -79876-5_
          <fpage>26</fpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>030</fpage>
          -79876-5\_
          <fpage>26</fpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>