<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta>
      <journal-title-group>
        <journal-title>SMT</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>An SMT Theory for n-Indexed Sequences</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Hichem Rami Ait El Hara</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>François Bobot</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Guillaume Bury</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>OCamlPro</institution>
          ,
          <addr-line>Paris</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Université Paris-Saclay, CEA, List</institution>
          ,
          <addr-line>F-91120, Palaiseau</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2024</year>
      </pub-date>
      <volume>22</volume>
      <fpage>0000</fpage>
      <lpage>0001</lpage>
      <abstract>
        <p>The SMT (Satisfiability Modulo Theories) theory of arrays is well-established and widely used, with various decision procedures and extensions developed for it. However, recent works suggest that developing tailored reasoning for some theories, such as sequences and strings, is more eficient than reasoning over them through axiomatization over the theory of arrays. In this paper, we are interested in reasoning over n-indexed sequences as they are found in some programming languages, such as Ada. We propose an SMT theory of n-indexed sequences and explore diferent ways to represent and reason over n-indexed sequences using existing theories, as well as tailored calculi for the theory.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        The SMT theory of sequences was introduced by Bjorner et al. [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. Several contributions explored this
theory, its syntax and semantics [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], and its decidability [
        <xref ref-type="bibr" rid="ref3 ref4">3, 4</xref>
        ].
      </p>
      <p>
        Our theory of n-indexed sequences and the calculi we developed are based on the contribution by
Sheng et al. [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], which in turn is based on reasoning about the theories of strings [
        <xref ref-type="bibr" rid="ref6 ref7">6, 7</xref>
        ] and arrays [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ].
      </p>
      <p>
        Other contributions have extended the theory of arrays with properties that are present in sequences,
such as length [
        <xref ref-type="bibr" rid="ref10 ref11 ref9">9, 10, 11</xref>
        ] and a concatenation function [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ].
      </p>
    </sec>
    <sec id="sec-2">
      <title>2. Notation</title>
      <p>We refer to the theory of n-indexed sequences as the theory of n-sequences or the NSeq theory, and
n-indexed sequence terms will be referred to as n-sequences, n-sequence terms, or NSeq terms. Their
sort will be denoted as NSeq E, where E is the sort of the elements of the n-sequence. We will refer to
the theory of sequences as the Seq theory. Int is the sort of integers from the theory of Linear Integer
Arithmetic. min and max are the usual mathematical functions. ite is the ite SMT-LIB function; it
takes a boolean expression and two expressions of the same sort and returns the first one if the boolean
expression is true and the second otherwise. The let  = ,  symbol binds a variable  to a value  in
a term .</p>
      <p>In the remainder of the paper, we will use , , , , 1, 2, 1, and 2 to represent NSeq terms,
with  being a positive integer. , 1, 2, and 3 will represent fresh NSeq term variables.  and  will
be used as integer index terms, and  and  will be used as NSeq element terms. We assume that all the
terms we use are well-sorted.</p>
    </sec>
    <sec id="sec-3">
      <title>3. The Theory of n-Indexed Sequences</title>
      <p>We present in this section the theory of n-indexed sequences. The signature of the NSeq theory is
presented in the table 1. In the remainder of the paper, when referring to the symbols of the theory, the
prefix " nseq." of the symbols will be omitted.</p>
      <p>The following list describes the semantics of each symbol of the theory:
• f: the first index of .
• l: the last index of .
• get(, ): if the index  is within the bounds of , returns the element associated with  in ;
otherwise, returns an uninterpreted value. An uninterpreted value is one which is not constrained
and can be any value of the right sort.
• set(, , ): if  is within the bounds of , creates a new n-sequence in which  is associated with ,
and the other indices within the bounds are associated with the same values as the corresponding
indices in ; otherwise, returns .
• const(, , ): creates an n-sequence with  as the first index and  as the last, and if it is not
empty, all the indices within its bounds are associated with the value .
• relocate(,  ): given an n-sequence  and an index  , returns a new n-sequence  which has 
as its first index and ( + l − f) as its last index, and associates with each index  within the
bounds of  the same value associated with the index ( − f + f) in .
• concat(, ): if  is empty, returns ; if  is empty, returns ; if f = l +1, returns a new
nsequence in which the first index is f, the last index is l, and all the indices within the bounds
of  are associated with the same values as the corresponding indices in , as well as the indices
within the bounds of  are associated with the same values as the corresponding indices in ; if
f ̸= l +1, returns .
• slice(, , ): if f ≤  ≤  ≤ l, returns a new n-sequence for which the first index is  , the
last index is , and all the indices between  and  are associated with the same values as the
corresponding indices in ; otherwise, returns .
• update(, ): if  is empty, or  is empty, or the property f ≤ f ≤ l ≤ l doesn’t hold, returns
; otherwise, returns a new n-sequence  such that f = f and l = l, and for all the indices
within the bounds of , if they are within the bounds of , then they are associated with the same
values as they are in , otherwise they are associated with the values to which they are associated
in .</p>
      <p>Definition 1 (Bounds). The bounds of an n-sequence  are its first and last index, which are respectively
denoted as f and l, and which correspond to the values returned by the functions nseq.first() and
nseq.last() respectively. An index  is said to be within the bounds of an n-sequence  if:
f ≤  ≤ l
Definition 2 (Extensionality). The theory of n-indexed sequences is extensional, which means that
n-sequences that contain the same elements are equal. Therefore, given two n-sequences  and :
f = f ∧ l = l ∧
(∀ : Int, f ≤  ≤ l → get(, ) = get(, ))</p>
      <p>→  = 
Definition 3 (Empty n-sequence). An n-sequence  is said to be empty if l &lt; f. Two empty
nsequences  and  are equal if f = f and l = l; otherwise, they are distinct.</p>
    </sec>
    <sec id="sec-4">
      <title>4. Reasoning with existing theories</title>
      <p>One way to reason over the NSeq theory is by using the theory of arrays. It is done by extending it
with the symbols of the NSeq theory and adding the right axioms that follow the semantics of the
corresponding symbols in the NSeq theory.</p>
      <p>Another way is to use the theory of sequences and the theory of algebraic data types. It consists in
defining n-sequences as a pair of a sequence and the first index (the ofset to zero):
(declare-datatype NSeq
(par (T) ((nseq.mk (nseq.first Int) (nseq.seq (Seq T))))))</p>
      <p>The other symbols of the NSeq theory can also be defined using the NSeq data type defined above,
for example:
Except for the const function which needs to be axiomatized:</p>
      <p>The full NSeq theory, defined using the Seq theory and Algebraic Data Types, is attached in Appendix
A.1.</p>
      <p>Although this approach allows us to reason over n-indexed sequences, it is not ideal to depend on two
theories to do so. Additionally, the diferences in semantics between the update and  functions of
the NSeq theory, and the seq.update and seq.extract functions of the Seq theory, make the definitions
relatively complex.</p>
    </sec>
    <sec id="sec-5">
      <title>5. Porting Calculi from the Seq Theory to the NSeq Theory</title>
      <p>
        To develop our calculi over the NSeq theory, we based our work on the calculi developed by Sheng et al.
[
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] on the Seq theory, where two calculi were proposed. The first is called the BASE calculus, based
on a string theory calculus that reduces functions selecting and storing one element at an index to
concatenations of sequences. The second is called the EXT calculus, and it handles these functions using
array-like reasoning. Our versions of these calculi are referred to as NS-BASE and NS-EXT, respectively.
      </p>
      <p>The NSeq theory difers from the Seq theory in both syntax and semantics of many symbols:
• const and relocate do not appear in the Seq theory, while seq.empty, seq.unit, and seq.len do
not appear in the NSeq theory.
• The seq.nth function corresponds to the get function in the NSeq theory.
• seq.update from the Seq theory with a value as a third argument corresponds to set in the NSeq
theory, while seq.update with a sequence as a third argument corresponds to update in the NSeq
theory, which takes only two NSeq terms as arguments.
• seq.extract in the Seq theory takes a sequence, an ofset, and a length, and corresponds to slice in
the NSeq theory, which takes an n-sequence, a first index, and a last index.
• The concatenation function (seq.++) in Seq is n-ary, and it corresponds to concat in the NSeq
theory, which is binary.</p>
      <p>Therefore, we needed to make substantial changes to the Seq theory calculi to adapt them to the
NSeq theory. In this section, we present the resulting calculi. We assume that we are in a theory
combination framework where reasoning over the LIA (Linear Integer Arithmetic) theory is supported,
and where unsatisfiability in one of the theories implies unsatisfiability of the entire reasoning. We will
only present the rules that handle the symbols of the NSeq theory.</p>
      <sec id="sec-5-1">
        <title>5.1. Common calculus</title>
        <p>Definition 4 (Equivalence modulo relocation). Given two NSeq terms 1 and 2, the terms are said
to be equivalent modulo relocation, denoted with the equivalence relation 1 = 2, such that:
1 = 2 ≡
l2 = l1 − f1 + f2 ∧∀ : , f1 ≤  ≤ l1 ⇒ (1, ) = (2,  − f1 + f2 )
Equivalence modulo relocation represents equivalence between n-sequences relative to their starting index.
Two n-sequences are equivalent modulo relocation if they have the same set of elements in the same order,
but start at diferent indices.</p>
        <p>Definition 5 ( NSeq term normal form). For simplicity and consistency with Seq theory calculi, we
introduce the concatenation operator :: with the invariant:
 = 1 :: 2
=⇒</p>
        <p>f = f1 ∧ l = l2 ∧ f2 = l1 +1
This operator is used to normalize NSeq terms. It difers from concat by not having to check the condition
that f2 = l1 +1 before concatenation, as it is ensured by the invariant.</p>
        <p>Assumption 1. We assume that the following simplification rewrites are applied whenever possible:
1 :: 2
1 :: 2
1 :: 2
1 :: 2
→ 1
→ 2
→ 1 :: 1 :: ... :: 
→ 1 :: ... ::  :: 2
when l2 &lt; f2 (1)
when l1 &lt; f1 (2)
when 2 = 1 :: ... ::  (3)
when 1 = 1 :: ... ::  (4)
(1) and (2) remove empty NSeq terms from normal form. (3) and (4) make sure that when an NSeq term
appear in the normal of another NSeq term and has its own normal form, then it is replaced by its normal
form.</p>
      </sec>
      <sec id="sec-5-2">
        <title>5.2. The base calculus</title>
        <p>The base calculus comprises the rules in figures 1 and 2. The rules R-Get and R-Set handle the  and
 operations by introducing a new normal form for the NSeq terms they operate on. In the R-Get
rule, when  is within the bounds of , a new normal form of  is introduced. It includes a constant
NSeq term of size one at the th position storing the value , and two variables, 1 and 2, to represent
the left and right segments of NSeq term  respectively. The R-Set rule operates similarly: when  is
within the bounds of 2, new normal forms are introduced for both 1 and 2. These forms share two
variables, 1 and 3, representing segments on the left and right of the th index. 1 has a constant
NSeq term of size one holding the value  at the th index, while 2 introduces another variable, 2, of
the same size and position.
 = const(, , )
f =  ∧ l =</p>
        <p>NS-Slice
1 = (2, )
 = f2 ∧1 = 2
 ̸= f2 ∧ f1 =  ∧ l1 =  + l2 − f2
∧1 = 2</p>
        <p>||
1 = (, , )
( &lt; f ∨ &lt;  ∨ l &lt; ) ∧ 1 =  ||
f ≤  ≤  ≤ l ∧ = 1 :: 1 :: 2
NS-Update</p>
        <p>NS-Concat</p>
        <p>NS-Split
NS-Comp-Reloc</p>
        <p>= (1, 2)
l1 &lt; f1 ∧ = 2
(l2 &lt; f2 ∨ l1 +1 ̸= f2 ) ∧  = 1
f1 ≤ l1 ∧ f2 ≤ l2 ∧ f2 = l1 +1 ∧  = 1 :: 2
||
||
1 = (2, )
(l &lt; f ∨ &lt; f2 ∨ l2 &lt; l) ∧ 1 = 2
f2 ≤ f ≤ l ≤ l2 ∧1 = 1 ::  :: 3 ∧ 2 = 1 :: 2 :: 3
||
 =  :: 1 :: 1</p>
        <p>=  :: 2 :: 2
l1 = l2 ∧1 = 2 ||
l1 &gt; l2 ∧1 = 2 ::  ∧ f = l2 +1 ∧ l = l1 ||
l1 &lt; l2 ∧2 = 1 ::  ∧ f = l1 +1 ∧ l = l2
1 = 1 :: 2 :: ... ::</p>
      </sec>
      <sec id="sec-5-3">
        <title>5.3. The extended calculus</title>
        <p>
          The extended calculus consists of the rules in figures 1 and 3. It difers from the base calculus by handling
the get and set functions similarly to how they are treated in the array decision procedure described
in [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ]. The Get-Intro rule introduces a get operation from a set operation. The Get-Set operation is
equivalent to what is commonly referred to as the read-over-write or select-over-store rule in the Array
theory, allowing the application of a get operation over a set operation. The Set-Bound rule ensures
that a set operation is performed within the bounds of the target NSeq term, or that the resulting NSeq
term is equivalent to the one it was applied on. The Get-Concat, Set-Concat, and Set-Concat-Inv rules
illustrate how get and set operations are handled when applied to an NSeq term in normal form, where
        </p>
        <p>Set-Concat
Set-Concat-Inv</p>
        <p>= 1 :: ... :: 
1 = (2, , )</p>
        <p>2 = 1 :: ... :: 
 &lt; f2 ∨ l2 &lt; 
1 = 1 :: ... ::  ∧ f1 ≤  ≤ l1 ∧1 = (1, , )∧</p>
        <p>f1 = f1 ∧ l1 = l1 ∧... ∧ f = f ∧ l = l
1 = 1 :: ... ::  ∧ f ≤  ≤ l ∧ = (, , )∧
f1 = f1 ∧ l1 = l1 ∧... ∧ f = f ∧ l = l
the operations afect the right component of the concatenation within its bounds. The Get-Const rule
addresses the special case where a get operation is applied to a constant NSeq term. The Get-Reloc rule
facilitates the propagation of constraints on index-associated values in NSeq terms from one term to
others that are equivalent modulo relocation.</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>6. Implementation</title>
      <p>We have implemented a prototype of the described calculi in the Colibri2 CP (Constraint Programming)
solver. In this section, we discuss some of the implementation choices we made.</p>
      <p>The rewriting rules described in Assumption 1 are applied whenever applicable using a callback
system. When the conditions are satisfied, the corresponding rewriting rule is triggered.</p>
      <p>Equivalence modulo relocation is managed using a disjoint-set (union-find) data structure. In this
data structure, the elements of the sets are NSeq terms, and the equivalence relation is defined by =
as previously specified. By definition, if two elements of an equivalence class are at the same relocation
ofset from the representative, they are equal. The data structure maintains, for each equivalence
class, a mapping from ofset to an element of the class that is at that specific relocation ofset from the
representative. This facilitates eficient detection of such equalities with minimal overhead.</p>
    </sec>
    <sec id="sec-7">
      <title>7. Experimental Results</title>
      <p>
        In this section, we present experimental results of the calculi described in the previous section. Currently,
our experiments have focused exclusively on quantifier-free benchmarks that utilize only the theory
of sequences and the theory of uninterpreted functions. These benchmarks constitute a subset of
those employed in the paper [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], originally translated into the Seq theory from the QF_AX SMT-LIB
benchmarks.
      </p>
      <p>To achieve this, we implemented support for the Seq theory in our solver by translating Seq terms
into NSeq terms. The translation process is as follows:
• Seq terms: NSeq terms for which the first index is 0 and the last index is greater or equal than − 1.
• seq.empty: an NSeq term of the same sort, in which the first index is 0 and the last is − 1, denoted
 .
• seq.unit(): const(0, 0, )
• seq.len(): l − f +1
• seq.nth(, ): get(, )
• seq.update(1, , 2):
• seq.extract(, , ):
• seq.++(1, 2, 3, ..., ):
let(, relocate(2, ), ite(f1 ≤  ≤ l1 ∧ l1 &lt; l,</p>
      <p>update(1, slice(, , l1 )), update(1, )))
ite( &lt; f ∨ l &lt;  ∨  ≤ 0, , slice(, , min(l,  +  − 1)))
let(1, concat(1, relocate(2, l1 +1)),
let(2, concat(1, relocate(3, l1 +1)),</p>
      <p>...</p>
      <p>concat(− 2, relocate(, l− 2 +1))))</p>
      <p>The figure 4 depicts the number of satisfiable and unsatisfiable goals solved over accumulated time
using our prototype implementation and the cvc5 SMT solver with diferent command-line options.
NSBASE and NS-EXT refer to our implementations1, described in section 5, which can be used by running
Colibri2 with the command-line options --nseq-base and --nseq-ext, respectively. We compare
our implementation with the Seq theory implementation in cvc5 (version 1.1.1). In the graphs in figure
4, cvc5 corresponds to running cvc5 with the command-line option --strings-exp, necessary for
using cvc5’s solver for the Seq theory. cvc5-eager uses the same option with --seq-arrays=eager,
and cvc5-lazy with --seq-arrays=lazy, these options indicate diferent strategies for using an
array-inspired solver for the Seq theory.</p>
      <p>Examining the graph on the right, which shows performance on unsatisfiable goals, we observe that
our NS-EXT implementation outperforms cvc5 in both time and number of goals solved. Meanwhile,
NS-BASE initially solves more goals than cvc5, but solves fewer overall. Additionally, cvc5-eager and
cvc5-lazy solve more goals in less time compared to the others. The same trends apply to the satisfiable
case, with the exception that cvc5 also surpasses NS-EXT in both time and number of goals solved once
the 20-second threshold is reached.</p>
      <p>In our context, focused on program verification, the performance on unsatisfiable goals holds greater
significance, though the satisfiable case remains useful. Since Colibri2 constructs concrete
counterexamples before concluding satisfiability, we aim to enhance our current model generation technique
for n-sequences. In the unsatisfiable case, while we compete closely with the state-of-the-art SMT
solver cvc5, we have observed that some goals unsolved within a short timeout (5 seconds) also remain
unsolved with longer timeouts, suggesting potential performance limitations in our propagators for
the NSeq theory. It’s also notable that our translation from Seq to NSeq in Colibri2 introduces more
complex terms, and Colibri2 lacks clause learning, making decisions costlier than in other SMT solvers.</p>
    </sec>
    <sec id="sec-8">
      <title>8. Conclusion</title>
      <p>In this paper, we explored the topic of n-indexed sequences in SMT. We proposed a theory for such
sequences and discussed approaches for reasoning over it, whether by using existing theories or by
adapting calculi from the theory of sequences to this theory.</p>
      <p>Looking ahead, our future work will delve deeper into diferent reasoning approaches for this theory,
exploring their respective strengths and weaknesses through benchmarking with n-indexed sequences.
We aim to prove the correctness of our developed calculi and explore alternative methods for reasoning
over n-sequences beyond traditional sequence or string reasoning. Moreover, we seek to identify
additional applications for this theory beyond programming languages where n-indexed sequences are
present.
1Available at: https://git.frama-c.com/pub/colibrics/-/tree/smt2024 (commit SHA: 43024e674ef26673d2495f3b186954fa37bc3890)</p>
    </sec>
    <sec id="sec-9">
      <title>A. Appendix</title>
      <sec id="sec-9-1">
        <title>A.1. Representation of n-Indexed Sequences using Sequences and Algebraic Data Types</title>
        <p>(declare-datatypes ((NSeq 1))</p>
        <p>((par (T) ((nseq.mk (nseq.first Int) (nseq.seq (Seq T)))))))
(declare-fun nseq.const (par (T) (Int Int T) (NSeq T)))
(define-fun nseq.concat (par (T) ((s1 (NSeq T)) (s2 (NSeq T))) (NSeq T)
(ite (&lt; (nseq.last s1) (nseq.first s1))
s2
(ite
(or
(&lt; (nseq.last s2) (nseq.first s2))
(not (= (nseq.first s2) (+ (nseq.last s1) 1))))
s1
(nseq.mk
(nseq.first s1)
(seq.++ (nseq.seq s1) (nseq.seq s2)))))))
(define-fun nseq.slice (par (T) ((s (NSeq T)) (f Int) (l Int)) (NSeq T)
(ite
(and
(&lt;= f l)
(and (&lt;= (nseq.first s) f) (&lt;= l (nseq.last s))))
(nseq.mk f (seq.extract (nseq.seq s) (- f (nseq.first s)) (+ (- l f) 1)))
s)))
(define-fun nseq.update (par (T) ((s1 (NSeq T)) (s2 (NSeq T))) (NSeq T)
(ite
(and
(&lt;= (nseq.first s2) (nseq.last s2))
(&lt;= (nseq.first s1) (nseq.first s2))
(&lt;= (nseq.last s2) (nseq.last s1)))
(nseq.mk (nseq.first s1)
(seq.update
(nseq.seq s1)
(- (nseq.first s2) (nseq.first s1))
(nseq.seq s2)))
s1)))</p>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>N.</given-names>
            <surname>Bjørner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Ganesh</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Michel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Veanes</surname>
          </string-name>
          ,
          <article-title>An SMT-LIB Format for Sequences and Regular Expressions</article-title>
          ,
          <string-name>
            <surname>Strings</surname>
          </string-name>
          (
          <year>2012</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>H. R.</given-names>
            <surname>Ait El Hara</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Bobot</surname>
          </string-name>
          , G. Bury,
          <source>On SMT Theory Design: The Case of Sequences</source>
          , in: Kalpa Publications in Computing, volume
          <volume>18</volume>
          ,
          <string-name>
            <surname>EasyChair</surname>
          </string-name>
          ,
          <year>2024</year>
          , pp.
          <fpage>14</fpage>
          -
          <lpage>29</lpage>
          . URL: https://easychair.org/ publications/paper/qdvJ. doi:
          <volume>10</volume>
          .29007/75tl, iSSN:
          <fpage>2515</fpage>
          -
          <lpage>1762</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>C. A.</given-names>
            <surname>Furia</surname>
          </string-name>
          ,
          <article-title>What's Decidable about Sequences?</article-title>
          , in: A.
          <string-name>
            <surname>Bouajjani</surname>
          </string-name>
          , W.-N. Chin (Eds.),
          <source>Automated Technology for Verification and Analysis</source>
          , Springer, Berlin, Heidelberg,
          <year>2010</year>
          , pp.
          <fpage>128</fpage>
          -
          <lpage>142</lpage>
          . doi:
          <volume>10</volume>
          . 1007/978-3-
          <fpage>642</fpage>
          -15643-4_
          <fpage>11</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>A.</given-names>
            <surname>Jeż</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. W.</given-names>
            <surname>Lin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Markgraf</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Rümmer</surname>
          </string-name>
          ,
          <article-title>Decision Procedures for Sequence Theories</article-title>
          , in: C.
          <string-name>
            <surname>Enea</surname>
            ,
            <given-names>A</given-names>
          </string-name>
          . Lal (Eds.),
          <source>Computer Aided Verification, Lecture Notes in Computer Science</source>
          , Springer Nature Switzerland, Cham,
          <year>2023</year>
          , pp.
          <fpage>18</fpage>
          -
          <lpage>40</lpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>031</fpage>
          -37703-
          <issue>7</issue>
          _
          <fpage>2</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Sheng</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Nötzli</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>D.</given-names>
            <surname>Dill</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Grieskamp</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Park</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Qadeer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Barrett</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Tinelli</surname>
          </string-name>
          , Reasoning About Vectors:
          <article-title>Satisfiability Modulo a Theory of Sequences</article-title>
          ,
          <source>Journal of Automated Reasoning</source>
          <volume>67</volume>
          (
          <year>2023</year>
          )
          <article-title>32</article-title>
          . URL: https://doi.org/10.1007/s10817-023-09682-2. doi:
          <volume>10</volume>
          . 1007/s10817-023-09682-2.
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>T.</given-names>
            <surname>Liang</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>C.</given-names>
            <surname>Barrett</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Deters</surname>
          </string-name>
          ,
          <string-name>
            <surname>A DPLL</surname>
          </string-name>
          (
          <article-title>T) Theory Solver for a Theory of Strings and Regular Expressions</article-title>
          , volume
          <volume>8559</volume>
          , Springer International Publishing, Cham,
          <year>2014</year>
          , pp.
          <fpage>646</fpage>
          -
          <lpage>662</lpage>
          . URL: http://link.springer.com/10.1007/978-3-
          <fpage>319</fpage>
          -08867-9_
          <fpage>43</fpage>
          . doi:
          <volume>10</volume>
          .1007/ 978-3-
          <fpage>319</fpage>
          -08867-9_
          <fpage>43</fpage>
          ,
          <string-name>
            <surname>book</surname>
            <given-names>Title</given-names>
          </string-name>
          : Computer Aided Verification Series Title: Lecture Notes in Computer Science.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <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>
          ,
          <source>in: Proceedings of the 17th Conference on Formal Methods in Computer-Aided Design, FMCAD '17</source>
          ,
          <string-name>
            <given-names>FMCAD</given-names>
            <surname>Inc</surname>
          </string-name>
          , Austin, Texas,
          <year>2017</year>
          , pp.
          <fpage>55</fpage>
          -
          <lpage>59</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>J.</given-names>
            <surname>Christ</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Hoenicke</surname>
          </string-name>
          , Weakly Equivalent Arrays, in: C.
          <string-name>
            <surname>Lutz</surname>
          </string-name>
          , S. Ranise (Eds.),
          <source>Frontiers of Combining Systems, Lecture Notes in Computer Science</source>
          , Springer International Publishing, Cham,
          <year>2015</year>
          , pp.
          <fpage>119</fpage>
          -
          <lpage>134</lpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>319</fpage>
          -24246-
          <issue>0</issue>
          _
          <fpage>8</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>M. P.</given-names>
            <surname>Bonacina</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Graham-Lengrand</surname>
          </string-name>
          ,
          <string-name>
            <surname>N.</surname>
          </string-name>
          <article-title>Shankar, CDSAT for Nondisjoint Theories with Shared Predicates: Arrays With Abstract Length</article-title>
          , Satisfiability Modulo Theories workshop,
          <source>CEUR Workshop Proceedings</source>
          <volume>3185</volume>
          (
          <year>2022</year>
          ). URL: https://par.nsf.gov/biblio/ 10358980-cdsat
          <article-title>-nondisjoint-theories-shared-predicates-arrays-abstract-length.</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>S.</given-names>
            <surname>Ghilardi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Gianola</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Kapur</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Naso</surname>
          </string-name>
          ,
          <article-title>Interpolation Results for Arrays with Length and MaxDif</article-title>
          ,
          <source>ACM Transactions on Computational Logic</source>
          <volume>24</volume>
          (
          <year>2023</year>
          )
          <volume>28</volume>
          :
          <fpage>1</fpage>
          -
          <lpage>28</lpage>
          :
          <fpage>33</fpage>
          . URL: https://doi.org/10. 1145/3587161. doi:
          <volume>10</volume>
          .1145/3587161.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>A. R.</given-names>
            <surname>Bradley</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Manna</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H. B.</given-names>
            <surname>Sipma</surname>
          </string-name>
          ,
          <article-title>What's Decidable About Arrays?</article-title>
          , in: E. A.
          <string-name>
            <surname>Emerson</surname>
            , K. S. Namjoshi (Eds.), Verification,
            <given-names>Model</given-names>
          </string-name>
          <string-name>
            <surname>Checking</surname>
          </string-name>
          , and Abstract Interpretation, Springer, Berlin, Heidelberg,
          <year>2006</year>
          , pp.
          <fpage>427</fpage>
          -
          <lpage>442</lpage>
          . doi:
          <volume>10</volume>
          .1007/11609773_
          <fpage>28</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>Q.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. W.</given-names>
            <surname>Appel</surname>
          </string-name>
          ,
          <article-title>A Solver for Arrays with Concatenation</article-title>
          ,
          <source>Journal of Automated Reasoning</source>
          <volume>67</volume>
          (
          <year>2023</year>
          )
          <article-title>4</article-title>
          . URL: https://doi.org/10.1007/s10817-022-09654-y. doi:
          <volume>10</volume>
          .1007/s10817-022-09654-y.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>