<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">An SMT Theory for n-Indexed Sequences</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Hichem</forename><surname>Rami</surname></persName>
						</author>
						<author>
							<persName><forename type="first">Ait</forename><surname>El</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution">OCamlPro</orgName>
								<address>
									<settlement>Paris</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
							<affiliation key="aff1">
								<orgName type="institution" key="instit1">Université Paris-Saclay</orgName>
								<orgName type="institution" key="instit2">CEA</orgName>
								<address>
									<addrLine>List</addrLine>
									<postCode>F-91120</postCode>
									<settlement>Palaiseau</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">François</forename><surname>Bobot</surname></persName>
							<affiliation key="aff1">
								<orgName type="institution" key="instit1">Université Paris-Saclay</orgName>
								<orgName type="institution" key="instit2">CEA</orgName>
								<address>
									<addrLine>List</addrLine>
									<postCode>F-91120</postCode>
									<settlement>Palaiseau</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Guillaume</forename><surname>Bury</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution">OCamlPro</orgName>
								<address>
									<settlement>Paris</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">An SMT Theory for n-Indexed Sequences</title>
					</analytic>
					<monogr>
						<idno type="ISSN">1613-0073</idno>
					</monogr>
					<idno type="MD5">86CA7D474D885DB3C9E6921D3D2F328F</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2025-04-23T17:21+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><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 efficient 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 different ways to represent and reason over n-indexed sequences using existing theories, as well as tailored calculi for the theory.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1.">Introduction</head><p>In the SMT theory of sequences, sequences are viewed as a generalization of strings to non-character elements, with possibly infinite alphabets. Sequences are dynamically sized, and their theory has a rich signature. It allows selecting elements of a sequence by their index, concatenating two sequences, extracting sub-sequences, and performing other operations. The expressiveness of the theory of sequences makes it easier to represent various commonly found data structures in programming languages, such as arrays in the C language, lists in Python, etc.</p><p>The theory of arrays is less expressive as it only supports selecting and storing one value at one index at a time, and arrays have fixed sizes determined by the number of inhabitants of the sort of indices. In contrast, sequences have dynamic lengths and operations allowing the selection and updating of sets of indices at a time. To use the theory of arrays to represent sequences, one would need to extend it and axiomatize the necessary properties, such as dynamic length and additional operations like concatenation and extraction.</p><p>We are interested in a variant of the theory of sequences, which we call the theory of n-indexed sequences. They differ from sequences mainly in their indexing, as they are not necessarily 0-indexed but n-indexed, as their name suggests. This means they are defined as ordered collections of values of the same sort indexed from a first index 𝑛 to a last index 𝑚. Such sequences are present in some programming languages like Ada. Since there is no dedicated theory for such sequences, reasoning over them cannot be done straightforwardly using the existing theories of arrays and sequences. It is therefore necessary to use extensions and axiomatizations to reason over them.</p><p>In this paper, we will present the theory of n-indexed sequences, its signature and semantics, as well as different ways to reason over it using existing theories and by adapting calculi from the theory of sequences to the theory of n-indexed sequences.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Related work:</head><p>The SMT theory of sequences was introduced by Bjorner et al. <ref type="bibr" target="#b0">[1]</ref>. Several contributions explored this theory, its syntax and semantics <ref type="bibr" target="#b1">[2]</ref>, and its decidability <ref type="bibr" target="#b2">[3,</ref><ref type="bibr" target="#b3">4]</ref>.</p><p>Our theory of n-indexed sequences and the calculi we developed are based on the contribution by Sheng et al. <ref type="bibr" target="#b4">[5]</ref>, which in turn is based on reasoning about the theories of strings <ref type="bibr" target="#b5">[6,</ref><ref type="bibr" target="#b6">7]</ref> and arrays <ref type="bibr" target="#b7">[8]</ref>. Other contributions have extended the theory of arrays with properties that are present in sequences, such as length <ref type="bibr" target="#b8">[9,</ref><ref type="bibr" target="#b9">10,</ref><ref type="bibr" target="#b10">11]</ref> and a concatenation function <ref type="bibr" target="#b11">[12]</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.">Notation</head><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.   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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.">The Theory of n-Indexed Sequences</head><p>The following list describes the semantics of each symbol of the theory:</p><p>• f 𝑠 : the first index of 𝑠.</p><p>• l 𝑠 : the last index of 𝑠.</p><p>• 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. </p><formula xml:id="formula_0">f 𝑠 ≤ 𝑖 ≤ l 𝑠</formula></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Definition 2 (Extensionality).</head><p>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 𝑏:</p><formula xml:id="formula_1">f 𝑎 = f 𝑏 ∧ l 𝑎 = l 𝑏 ∧ (∀𝑖 : Int, f 𝑎 ≤ 𝑖 ≤ l 𝑎 → get(𝑎, 𝑖) = get(𝑏, 𝑖)) → 𝑎 = 𝑏</formula></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Definition 3 (Empty n-sequence).</head><p>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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.">Reasoning with existing theories</head><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 offset to zero):</p><formula xml:id="formula_2">(declare-datatype NSeq (par (T) ((nseq.mk (nseq.first Int) (nseq.seq (Seq T))))))</formula><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>(declare-fun nseq.const (par (T) (Int Int T) (NSeq T)))</p><p>;; "nseq_const" (assert (par (T) (forall</p><formula xml:id="formula_3">((f Int) (l Int) (v T)) (! (let ((s (nseq.const f l v))) (and (= (nseq.first s) f) (= (nseq.last s) l) (forall ((i Int)) (=&gt; (and (&lt;= f i) (&lt;= i l)) (= (nseq.get s i) v))))) :pattern ((nseq.const f l v))))))</formula><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 differences 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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.">Porting Calculi from the Seq Theory to the NSeq Theory</head><p>To develop our calculi over the NSeq theory, we based our work on the calculi developed by Sheng et al. <ref type="bibr" target="#b4">[5]</ref> 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 differs from the Seq theory in both syntax and semantics of many symbols:</p><p>• 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.</p><p>• 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 offset, 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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.1.">Common calculus</head><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:</p><formula xml:id="formula_4">𝑠 1 = 𝑟𝑒𝑙𝑜𝑐 𝑠 2 ≡ l 𝑠 2 = l 𝑠 1 − f 𝑠 1 + f 𝑠 2 ∧∀𝑖 : 𝐼𝑛𝑡, f 𝑠 1 ≤ 𝑖 ≤ l 𝑠 1 ⇒ 𝑔𝑒𝑡(𝑠 1 , 𝑖) = 𝑔𝑒𝑡(𝑠 2 , 𝑖 − f 𝑠 1 + f 𝑠 2 )</formula><p>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 different indices.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Definition 5 (NSeq term normal form).</head><p>For simplicity and consistency with Seq theory calculi, we introduce the concatenation operator :: with the invariant:</p><formula xml:id="formula_5">𝑠 = 𝑠 1 :: 𝑠 2 =⇒ f 𝑠 = f 𝑠 1 ∧ l 𝑠 = l 𝑠 2 ∧ f 𝑠 2 = l 𝑠 1 +1</formula><p>This operator is used to normalize NSeq terms. It differs from concat by not having to check the condition that f 𝑠 2 = l 𝑠 1 +1 before concatenation, as it is ensured by the invariant. Assumption 1. We assume that the following simplification rewrites are applied whenever possible:</p><formula xml:id="formula_6">𝑠 1 :: 𝑠 2 → 𝑠 1 when l 𝑠 2 &lt; f 𝑠 2 (1) 𝑠 1 :: 𝑠 2 → 𝑠 2 when l 𝑠 1 &lt; f 𝑠 1<label>(2</label></formula><p>) 𝑠 1 :: 𝑠 2 → 𝑠 1 :: 𝑤 1 :: ... :: 𝑤 𝑛 when 𝑠 2 = 𝑤 1 :: ... :: 𝑤 𝑛 (3) 𝑠 1 :: 𝑠 2 → 𝑤 1 :: ... :: 𝑤 𝑛 :: 𝑠 2 when 𝑠 1 = 𝑤 1 :: ... :: 𝑤 𝑛 (4)</p><p>(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><p>Figure <ref type="figure" target="#fig_2">1</ref> illustrates a set of common rules shared between the two calculi NS-BASE and NS-EXT. The rules Const-Bounds and Reloc-Bounds propagate the bounds of constant and relocated n-sequences, which are created using the const and relocate functions, respectively. The rules NS-Slice, NS-Concat, and NS-Update handle slice, concat, and update by normalizing the NSeq terms under appropriate conditions. If an NSeq term has two normal forms where distinct terms begin at the same index but end at different indices, the NS-Split rule rewrites the longer term as a concatenation of the shorter one and a fresh variable. The NS-Comp-Reloc rule propagates concatenations over equivalence modulo relocation.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.2.">The base calculus</head><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.</p><p>Const-Bounds 𝑠 = const(𝑓, 𝑙, 𝑣)  </p><formula xml:id="formula_7">f 𝑠 = 𝑓 ∧ l 𝑠 = 𝑙 Reloc-Bounds 𝑠 1 = 𝑟𝑒𝑙𝑜𝑐𝑎𝑡𝑒(𝑠 2 , 𝑖) 𝑖 = f 𝑠2 ∧𝑠 1 = 𝑠 2 || 𝑖 ̸ = f 𝑠2 ∧ f 𝑠1 = 𝑖 ∧ l 𝑠1 = 𝑖 + l 𝑠2 − f 𝑠2 ∧𝑠 1 = 𝑟𝑒𝑙𝑜𝑐 𝑠 2 NS-Slice 𝑠 1 = 𝑠𝑙𝑖𝑐𝑒(𝑠, 𝑓, 𝑙) (𝑓 &lt; f 𝑠 ∨𝑙 &lt; 𝑓 ∨ l 𝑠 &lt; 𝑙) ∧ 𝑠 1 = 𝑠 || f 𝑠 ≤ 𝑓 ≤ 𝑙 ≤ l 𝑠 ∧𝑠 = 𝑘 1 :: 𝑠 1 :: 𝑘 2 NS-Concat 𝑠 = 𝑐𝑜𝑛𝑐𝑎𝑡(𝑠 1 , 𝑠 2 ) l 𝑠1 &lt; f 𝑠1 ∧𝑠 = 𝑠 2 || (l 𝑠2 &lt; f 𝑠2 ∨ l 𝑠1 +1 ̸ = f 𝑠2 ) ∧ 𝑠 = 𝑠 1 || f 𝑠1 ≤ l 𝑠1 ∧ f 𝑠2 ≤ l 𝑠2 ∧ f 𝑠2 = l 𝑠1 +1 ∧ 𝑠 = 𝑠 1 :: 𝑠 2 NS-Update 𝑠 1 = 𝑢𝑝𝑑𝑎𝑡𝑒(𝑠 2 , 𝑠) (l 𝑠 &lt; f 𝑠 ∨𝑓 𝑠 &lt; f 𝑠2 ∨ l 𝑠2 &lt; l 𝑠 ) ∧ 𝑠 1 = 𝑠 2 || f 𝑠2 ≤ f 𝑠 ≤ l 𝑠 ≤ l 𝑠2 ∧𝑠 1 = 𝑘 1 :: 𝑠 :: 𝑘 3 ∧ 𝑠 2 = 𝑘 1 :: 𝑘 2 :: 𝑘 3 NS-Split 𝑠 = 𝑤 :: 𝑦 1 :: 𝑧 1 𝑠 = 𝑤 :: 𝑦 2 :: 𝑧 2 l 𝑦1 = l 𝑦2 ∧𝑦 1 = 𝑦 2 || l 𝑦1 &gt; l 𝑦2 ∧𝑦 1 = 𝑦 2 :: 𝑘 ∧ f 𝑘 = l 𝑦2 +1 ∧ l 𝑘 = l 𝑦1 || l 𝑦1 &lt; l 𝑦2 ∧𝑦 2 = 𝑦 1 :: 𝑘 ∧ f 𝑘 = l 𝑦1 +1 ∧ l 𝑘 = l 𝑦2 NS-Comp-Reloc 𝑠 1 = 𝑘 1 :: 𝑘 2 :: ... :: 𝑘 𝑛 𝑠 1 = 𝑟𝑒𝑙𝑜𝑐 𝑠 2 f 𝑠1 = f 𝑠2 ∧𝑠 1 = 𝑠 2 || 𝑠 2 = 𝑟𝑒𝑙𝑜𝑐𝑎𝑡𝑒(𝑘 1 , f 𝑠2 ) :: 𝑟𝑒𝑙𝑜𝑐𝑎𝑡𝑒(𝑘 2 , f 𝑘2 − f 𝑠1 + f 𝑠2 ) :: ... :: 𝑟𝑒𝑙𝑜𝑐𝑎𝑡𝑒(𝑘 𝑛 , f 𝑘𝑛 − f 𝑠1 + f 𝑠2 )</formula><formula xml:id="formula_8">𝑖 &lt; f 𝑠 ∨ l 𝑠 &lt; 𝑖 || f 𝑠 ≤ 𝑖 ≤ l 𝑠 ∧𝑠 = 𝑘 1 :: 𝑐𝑜𝑛𝑠𝑡(𝑖, 𝑖, 𝑣) :: 𝑘 2 R-Set 𝑠 1 = 𝑠𝑒𝑡(𝑠 2 , 𝑖, 𝑣) (𝑖 &lt; f 𝑠2 ∨ l 𝑠2 &lt; 𝑖) ∧ 𝑠 1 = 𝑠 2 || f 𝑠2 ≤ 𝑖 ≤ l 𝑠2 ∧ f 𝑠1 = f 𝑠2 ∧ l 𝑠1 = l 𝑠2 𝑠 1 = 𝑘 1 :: 𝑐𝑜𝑛𝑠𝑡(𝑖, 𝑖, 𝑣) :: 𝑘 3 ∧ 𝑠 2 = 𝑘 1 :: 𝑘 2 :: 𝑘 3</formula></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.3.">The extended calculus</head><p>The extended calculus consists of the rules in figures 1 and 3. It differs from the base calculus by handling the get and set functions similarly to how they are treated in the array decision procedure described in <ref type="bibr" target="#b7">[8]</ref>. 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 Get-Concat 𝑣 = 𝑔𝑒𝑡(𝑠, 𝑖) 𝑠 = 𝑤 1 :: ... :: </p><formula xml:id="formula_9">𝑤 𝑛 𝑖 &lt; f 𝑠 ∨ l 𝑠 &lt; 𝑖 || f 𝑤1 ≤ 𝑖 ≤ l 𝑤1 ∧𝑔𝑒𝑡(𝑤 1 , 𝑖) = 𝑣 || ... || f 𝑤𝑛 ≤ 𝑖 ≤ l 𝑤𝑛 ∧𝑔𝑒𝑡(𝑤 𝑛 , 𝑖) = 𝑣 Set-Concat 𝑠 1 = 𝑠𝑒𝑡(𝑠 2 , 𝑖, 𝑣) 𝑠 2 = 𝑤 1 :: ... :: 𝑤 𝑛 𝑖 &lt; f 𝑠2 ∨ l 𝑠2 &lt; 𝑖 || 𝑠 1 = 𝑘 1 :: ... :: 𝑘 𝑛 ∧ f 𝑤1 ≤ 𝑖 ≤ l 𝑤1 ∧𝑘 1 = 𝑠𝑒𝑡(𝑤 1 , 𝑖, 𝑣)∧ f 𝑘1 = f 𝑤1 ∧ l 𝑘1 = l 𝑤1 ∧... ∧ f 𝑘𝑛 = f 𝑤𝑛 ∧ l 𝑘𝑛 = l 𝑤𝑛 || ... || 𝑠 1 = 𝑘 1 :: ... :: 𝑘 𝑛 ∧ f 𝑤𝑛 ≤ 𝑖 ≤ l 𝑤𝑛 ∧𝑘 𝑛 = 𝑠𝑒𝑡(𝑤 𝑛 , 𝑖, 𝑣)∧ f 𝑘1 = f 𝑤1 ∧ l 𝑘1 = l 𝑤1 ∧... ∧ f 𝑘𝑛 = f 𝑤𝑛 ∧ l 𝑘𝑛 = l 𝑤𝑛 Set-Concat-Inv 𝑠 1 = 𝑠𝑒𝑡(𝑠 2 , 𝑖, 𝑣) 𝑠 1 = 𝑤 1 :: ... :: 𝑤 𝑛 𝑖 &lt; f 𝑠2 ∨ l 𝑠2 &lt; 𝑖 || 𝑠 2 = 𝑘 1 :: ... :: 𝑘 𝑛 ∧ f 𝑤1 ≤ 𝑖 ≤ l 𝑤1 ∧𝑤 1 = 𝑠𝑒𝑡(𝑘 1 , 𝑖, 𝑣)∧ f 𝑘1 = f 𝑤1 ∧ l 𝑘1 = l 𝑤1 ∧... ∧ f 𝑘𝑛 = f 𝑤𝑛 ∧ l 𝑘𝑛 = l 𝑤𝑛 || ... || 𝑠 2 = 𝑘 1 :: ... :: 𝑘 𝑛 ∧ f 𝑤𝑛 ≤ 𝑖 ≤ l 𝑤𝑛 ∧𝑤 𝑛 = 𝑠𝑒𝑡(𝑘 𝑛 , 𝑖, 𝑣)∧ f 𝑘1 = f 𝑤1 ∧ l 𝑘1 = l 𝑤1 ∧... ∧ f 𝑘𝑛 = f 𝑤𝑛 ∧ l 𝑘𝑛 = l 𝑤𝑛 Get-Const 𝑠 = 𝑐𝑜𝑛𝑠𝑡(𝑓, 𝑙, 𝑣) 𝑢 = 𝑔𝑒𝑡(𝑠, 𝑖) 𝑖 &lt; f 𝑠 ∨ l 𝑠 &lt; 𝑖 || f 𝑠 ≤ 𝑖 ≤ l 𝑠 ∧𝑢 = 𝑣 Get-Intro 𝑠 1 = 𝑠𝑒𝑡(𝑠 2 , 𝑖, 𝑣) 𝑖 &lt; f 𝑠1 ∨ l 𝑠1 &lt; 𝑖 || f 𝑠1 ≤ 𝑖 ≤ l 𝑠1 ∧𝑣 = 𝑔𝑒𝑡(𝑠 1 , 𝑖) Get-Set 𝑠 1 = 𝑠𝑒𝑡(𝑠 2 , 𝑖, 𝑣) 𝑢 = 𝑔𝑒𝑡(𝑠 1 , 𝑗) 𝑖 &lt; f 𝑠1 ∨ l 𝑠1 &lt; 𝑖 || 𝑖 = 𝑗 ∧ f 𝑠1 ≤ 𝑖 ≤ l 𝑠1 ∧𝑢 = 𝑣 || 𝑖 ̸ = 𝑗 ∧ f 𝑠1 ≤ 𝑖 ≤ l 𝑠1 ∧𝑢 = 𝑔𝑒𝑡(𝑠 2 , 𝑖) Set-Bound 𝑠 1 = 𝑠𝑒𝑡(𝑠 2 , 𝑖, 𝑣) 𝑠 1 = 𝑠 2 || f 𝑠1 ≤ 𝑖 ≤ l 𝑠1 ∧𝑔𝑒𝑡(𝑠 2 , 𝑖) ̸ = 𝑣 Get-Reloc 𝑣 = 𝑔𝑒𝑡(𝑠 1 , 𝑖) 𝑠 1 = 𝑟𝑒𝑙𝑜𝑐 𝑠 2 𝑖 &lt; 𝑓 𝑠 ∨ 𝑙 𝑠 &lt; 𝑖 || 𝑓 𝑠 ≤ 𝑖 ≤ 𝑙 𝑠 ∧ 𝑣 = 𝑔𝑒𝑡(𝑠 2 , 𝑖 − f 𝑠1 − f 𝑠2 )</formula></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.">Implementation</head><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 </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7.">Experimental Results</head><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 <ref type="bibr" target="#b4">[5]</ref>, 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:</p><p>• Seq terms: NSeq terms for which the first index is 0 and the last index is greater or equal than −1.</p><p>• 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(𝑠):</p><formula xml:id="formula_10">l 𝑠 − f 𝑠 +1 • seq.nth(𝑠, 𝑖): get(𝑠, 𝑖) • seq.update(𝑠 1 , 𝑖, 𝑠 2 ): let(𝑟, relocate(𝑠 2 , 𝑖), ite(f 𝑠 1 ≤ 𝑖 ≤ l 𝑠 1 ∧ l 𝑠 1 &lt; l 𝑟 , update(𝑠 1 , slice(𝑟, 𝑖, l 𝑠 1 )), update(𝑠 1 , 𝑟)))</formula><p>• seq.extract(𝑠, 𝑖, 𝑗):</p><formula xml:id="formula_11">ite(𝑖 &lt; f 𝑠 ∨ l 𝑠 &lt; 𝑖 ∨ 𝑗 ≤ 0, 𝜖, slice(𝑠, 𝑖, min(l 𝑠 , 𝑖 + 𝑗 − 1))) • seq.++(𝑠 1 , 𝑠 2 , 𝑠 3 , ..., 𝑠 𝑛 ): let(𝑐 1 , concat(𝑠 1 , relocate(𝑠 2 , l 𝑠 1 +1)), let(𝑐 2 , concat(𝑐 1 , relocate(𝑠 3 , l 𝑐 1 +1)), ... concat(𝑐 𝑛−2 , relocate(𝑠 𝑛 , l 𝑐 𝑛−2 +1))))</formula><p>The figure <ref type="figure" target="#fig_5">4</ref> depicts the number of satisfiable and unsatisfiable goals solved over accumulated time using our prototype implementation and the cvc5 SMT solver with different command-line options. NS-BASE and NS-EXT refer to our implementations<ref type="foot" target="#foot_0">1</ref> , 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 <ref type="figure" target="#fig_5">4</ref>, 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 different 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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="8.">Conclusion</head><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 different 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.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head></head><label></label><figDesc>SMT 2024: 22nd International Workshop on Satisfiability Modulo Theories hra687261@gmail.com (H. R. Ait El Hara); francois.bobot@ocamlpro.com (F. Bobot); gbury@gmail.com (G. Bury) https://hra687261.github.io/ (H. R. Ait El Hara); https://gbury.eu/ (G. Bury) 0000-0001-7909-0413 (H. R. Ait El Hara); 0000-0002-6756-0788 (F. Bobot); 0009-0002-1267-251X (G. Bury)</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>(</head><label></label><figDesc>define-fun nseq.last (par (T) ((s (NSeq T))) Int (+ (-(seq.len (nseq.seq s)) 1) (nseq.first s)))) (define-fun nseq.get (par (T) ((s (NSeq T)) (i Int)) T (seq.nth (nseq.seq s) (-i (nseq.first s))))) (define-fun nseq.set (par (T) ((s (NSeq T)) (i Int) (v T)) (NSeq T) (nseq.mk (nseq.first s) (seq.update (nseq.seq s) (-i (nseq.first s)) (seq.unit v)))))</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Figure 1 :</head><label>1</label><figDesc>Figure 1: Common inference rules for the NS-BASE and NS-EXT calculi</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head>Figure 2 :</head><label>2</label><figDesc>Figure 2: NS-BASE specific inference rules</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head>Figure 3 :</head><label>3</label><figDesc>Figure 3: NS-EXT specific inference rules</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head>Figure 4 :</head><label>4</label><figDesc>Figure 4: Number of solved goals by accumulated time in seconds on quantifier-free Seq benchmarks translated from the QF_AX SMT-LIB benchmarks</figDesc><graphic coords="8,74.02,65.61,221.13,164.97" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_0"><head>Table</head><label></label><figDesc></figDesc><table /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_3"><head></head><label></label><figDesc>• 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 𝑎.</figDesc><table /><note>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:</note></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="1" xml:id="foot_0">Available at: https://git.frama-c.com/pub/colibrics/-/tree/smt2024 (commit SHA: 43024e674ef26673d2495f3b186954fa37bc3890)</note>
		</body>
		<back>
			<div type="annex">
<div xmlns="http://www.tei-c.org/ns/1.0"><head>A. Appendix</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>A.1. Representation of n-Indexed Sequences using Sequences and Algebraic Data Types</head></div>			</div>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">An SMT-LIB Format for Sequences and Regular Expressions</title>
		<author>
			<persName><forename type="first">N</forename><surname>Bjørner</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Ganesh</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Michel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Veanes</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Strings</title>
		<imprint>
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">On SMT Theory Design: The Case of Sequences</title>
		<author>
			<persName><forename type="first">H</forename><forename type="middle">R</forename><surname>Ait El Hara</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Bobot</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Bury</surname></persName>
		</author>
		<idno type="DOI">10.29007/75tl</idno>
		<ptr target="iSSN:2515-1762" />
	</analytic>
	<monogr>
		<title level="s">Kalpa Publications in Computing</title>
		<imprint>
			<biblScope unit="volume">18</biblScope>
			<biblScope unit="page" from="14" to="29" />
			<date type="published" when="2024">2024</date>
			<publisher>EasyChair</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">What&apos;s Decidable about Sequences?</title>
		<author>
			<persName><forename type="first">C</forename><forename type="middle">A</forename><surname>Furia</surname></persName>
		</author>
		<idno type="DOI">10.1007/978-3-642-15643-4_11</idno>
	</analytic>
	<monogr>
		<title level="m">Automated Technology for Verification and Analysis</title>
				<editor>
			<persName><forename type="first">A</forename><surname>Bouajjani</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">W.-N</forename><surname>Chin</surname></persName>
		</editor>
		<meeting><address><addrLine>Berlin, Heidelberg</addrLine></address></meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2010">2010</date>
			<biblScope unit="page" from="128" to="142" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Decision Procedures for Sequence Theories</title>
		<author>
			<persName><forename type="first">A</forename><surname>Jeż</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><forename type="middle">W</forename><surname>Lin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">O</forename><surname>Markgraf</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Rümmer</surname></persName>
		</author>
		<idno type="DOI">10.1007/978-3-031-37703-7_2</idno>
	</analytic>
	<monogr>
		<title level="m">Computer Aided Verification</title>
		<title level="s">Lecture Notes in Computer Science</title>
		<editor>
			<persName><forename type="first">C</forename><surname>Enea</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">A</forename><surname>Lal</surname></persName>
		</editor>
		<meeting><address><addrLine>Nature Switzerland; Cham</addrLine></address></meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2023">2023</date>
			<biblScope unit="page" from="18" to="40" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Reasoning About Vectors: Satisfiability Modulo a Theory of Sequences</title>
		<author>
			<persName><forename type="first">Y</forename><surname>Sheng</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Nötzli</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Reynolds</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Y</forename><surname>Zohar</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Dill</surname></persName>
		</author>
		<author>
			<persName><forename type="first">W</forename><surname>Grieskamp</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Park</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Qadeer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Barrett</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Tinelli</surname></persName>
		</author>
		<idno type="DOI">10.1007/s10817-023-09682-2</idno>
		<ptr target="https://doi.org/10.1007/s10817-023-09682-2.doi:10.1007/s10817-023-09682-2" />
	</analytic>
	<monogr>
		<title level="j">Journal of Automated Reasoning</title>
		<imprint>
			<biblScope unit="volume">67</biblScope>
			<biblScope unit="page">32</biblScope>
			<date type="published" when="2023">2023</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<monogr>
		<title level="m" type="main">A DPLL(T) Theory Solver for a Theory of Strings and Regular Expressions</title>
		<author>
			<persName><forename type="first">T</forename><surname>Liang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Reynolds</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Tinelli</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Barrett</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Deters</surname></persName>
		</author>
		<idno type="DOI">10.1007/978-3-319-08867-9_43</idno>
		<ptr target="http://link.springer.com/10.1007/978-3-319-08867-9_43.doi:10.1007/978-3-319-08867-9_43" />
		<imprint>
			<date type="published" when="2014">2014</date>
			<publisher>Springer International Publishing</publisher>
			<biblScope unit="volume">8559</biblScope>
			<biblScope unit="page" from="646" to="662" />
			<pubPlace>Cham</pubPlace>
		</imprint>
		<respStmt>
			<orgName>Lecture Notes in Computer Science</orgName>
		</respStmt>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Z3str3: a string solver with theory-aware heuristics</title>
		<author>
			<persName><forename type="first">M</forename><surname>Berzish</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Ganesh</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Y</forename><surname>Zheng</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 17th Conference on Formal Methods in Computer-Aided Design, FMCAD &apos;17</title>
				<meeting>the 17th Conference on Formal Methods in Computer-Aided Design, FMCAD &apos;17<address><addrLine>Austin, Texas</addrLine></address></meeting>
		<imprint>
			<publisher>FMCAD Inc</publisher>
			<date type="published" when="2017">2017</date>
			<biblScope unit="page" from="55" to="59" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Weakly Equivalent Arrays</title>
		<author>
			<persName><forename type="first">J</forename><surname>Christ</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Hoenicke</surname></persName>
		</author>
		<idno type="DOI">10.1007/978-3-319-24246-0_8</idno>
	</analytic>
	<monogr>
		<title level="m">Frontiers of Combining Systems</title>
		<title level="s">Lecture Notes in Computer Science</title>
		<editor>
			<persName><forename type="first">C</forename><surname>Lutz</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">S</forename><surname>Ranise</surname></persName>
		</editor>
		<meeting><address><addrLine>Cham</addrLine></address></meeting>
		<imprint>
			<publisher>Springer International Publishing</publisher>
			<date type="published" when="2015">2015</date>
			<biblScope unit="page" from="119" to="134" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">CDSAT for Nondisjoint Theories with Shared Predicates: Arrays With Abstract Length, Satisfiability Modulo Theories workshop</title>
		<author>
			<persName><forename type="first">M</forename><forename type="middle">P</forename><surname>Bonacina</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Graham-Lengrand</surname></persName>
		</author>
		<author>
			<persName><forename type="first">N</forename><surname>Shankar</surname></persName>
		</author>
		<ptr target="https://par.nsf.gov/biblio/10358980-cdsat-nondisjoint-theories-shared-predicates-arrays-abstract-length" />
	</analytic>
	<monogr>
		<title level="m">CEUR Workshop Proceedings</title>
				<imprint>
			<date type="published" when="2022">2022</date>
			<biblScope unit="volume">3185</biblScope>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">Interpolation Results for Arrays with Length and MaxDiff</title>
		<author>
			<persName><forename type="first">S</forename><surname>Ghilardi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Gianola</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Kapur</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Naso</surname></persName>
		</author>
		<idno type="DOI">10.1145/3587161</idno>
		<ptr target="https://doi.org/10.1145/3587161.doi:10.1145/3587161" />
	</analytic>
	<monogr>
		<title level="j">ACM Transactions on Computational Logic</title>
		<imprint>
			<biblScope unit="volume">24</biblScope>
			<biblScope unit="page">33</biblScope>
			<date type="published" when="2023">2023</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">What&apos;s Decidable About Arrays?</title>
		<author>
			<persName><forename type="first">A</forename><forename type="middle">R</forename><surname>Bradley</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Z</forename><surname>Manna</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><forename type="middle">B</forename><surname>Sipma</surname></persName>
		</author>
		<idno type="DOI">10.1007/11609773_28</idno>
	</analytic>
	<monogr>
		<title level="m">Verification, Model Checking, and Abstract Interpretation</title>
				<editor>
			<persName><forename type="first">E</forename><forename type="middle">A</forename><surname>Emerson</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">K</forename><forename type="middle">S</forename><surname>Namjoshi</surname></persName>
		</editor>
		<meeting><address><addrLine>Berlin, Heidelberg</addrLine></address></meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2006">2006</date>
			<biblScope unit="page" from="427" to="442" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">A Solver for Arrays with Concatenation</title>
		<author>
			<persName><forename type="first">Q</forename><surname>Wang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><forename type="middle">W</forename><surname>Appel</surname></persName>
		</author>
		<idno type="DOI">10.1007/s10817-022-09654-y</idno>
		<ptr target="https://doi.org/10.1007/s10817-022-09654-y.doi:10.1007/s10817-022-09654-y" />
	</analytic>
	<monogr>
		<title level="j">Journal of Automated Reasoning</title>
		<imprint>
			<biblScope unit="volume">67</biblScope>
			<biblScope unit="page">4</biblScope>
			<date type="published" when="2023">2023</date>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
