<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Give Reasoning a Trie</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Thomas Prokosch</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>François Bry</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Institute for Informatics, Ludwig-Maximilian University of Munich</institution>
          ,
          <country country="DE">Germany</country>
        </aff>
      </contrib-group>
      <fpage>93</fpage>
      <lpage>108</lpage>
      <abstract>
        <p>A data structure providing an eficient storage and retrieval of logical expressions is a necessary component of every automated reasoning system. Most theorem provers rely on term indexes tuned to unification. Tabled logic programming systems in contrast favour indexes tuned to the retrieval of variants or instances. This article proposes the versatile data structure Instance Trie which supports the unification of queries with stored expressions as well as the retrieval of variants, instances, and generalisations of queries. Instance tries are stable in the sense that their structure is independent of the order in which they are filled or updated. They give rise to an incremental expression retrieval.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        Automated reasoning [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] relies on an eficient storage of logical expressions as well as various
forms of expression retrieval. Resolution-based theorem proving systems require first and
foremost the retrieval of expressions unifying with queries. If they perform ancestor resolution
or make use of lemmas, they also require the retrieval of variants or instances of queries.
Metaprogramming [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], a form of logic programming, requires unification as well as the retrieval of
instances, variants, and generalisations of queries. Tabling [
        <xref ref-type="bibr" rid="ref3 ref4 ref5 ref6">3, 4, 5, 6</xref>
        ], a form of memoing used
in logic programming, requires the retrieval of variants or generalisations of queries while logic
programming’s core reasoning requires the retrieval of expressions unifying with queries.
      </p>
      <p>
        This article proposes instance tries primarily developed for tabled logic programming [
        <xref ref-type="bibr" rid="ref3 ref4 ref5 ref6">3, 4,
5, 6</xref>
        ] and meta-programming. Instance tries are versatile in the sense that they support the
various retrieval modes needed in automated reasoning: The unification of queries with stored
expressions and the retrieval of variants, instances, and generalisations of queries. Instance tries
exploit well established techniques: The implementation of variables as pointers of programming
languages’ run-time systems and the substitution-based tries of the term indexes of
resolutionbased theorem proving [
        <xref ref-type="bibr" rid="ref10 ref7 ref8 ref9">7, 8, 9, 10</xref>
        ]. Instance tries re-use these techniques in a novel manner,
though, resulting in a data structure which, in contrast to most of its predecessors, is stable in
the sense that it is independent of the order in which it is filled or updated and gives rise to an
incremental expression retrieval.
      </p>
      <p>The article is structured as follows. Section 1 is this introduction. Section 2 is devoted to
related work. Section 3 briefly recalls the concepts referred to, and introduces the notations
used in this article. Section 4 describes the structure of an instance trie. Section 5 addresses
various data retrieval modes for instance tries. Section 6 concludes the article.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Related work</title>
      <p>
        The book [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] and the book chapter [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] both survey “term indexing”, that is, data structures for
the storage and retrieval of first-order logic terms or atoms. They complement each other: [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]
covers “out-of-fashion” data structures, [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] covers data structures which did not exist when [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]
was written.
      </p>
      <p>
        Tries have been introduced in [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] for storing strings, the name “trie” in was introduced
in [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]. Tries store strings after their lexicographical order. Tries have advantages over hash
tables: They are not subject to collisions and are stable in the sense that their structures are
independent of the insertion order.
      </p>
      <p>
        The Path-Indexing Method [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] stores terms in “path lists” themselves stored in tries or hash
tables. A Path-Index is not “stable” in the sense that its structure depends on the insertion
order what might be beneficial in reasoning with commutative functions [ 13, p. 15] but makes
retrieval less eficient. Path-Indexing is “versatile” in the sense that it supports all query modes
variant, instance, generalisation and unification. Path-Indexes disregard variables’ identities [ 13,
p. 6] and therefore return false positives among the answers to retrieval queries.
      </p>
      <p>
        Dynamic Path Indexing [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] fixes a deficiency of the Path-Indexing Method [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. For eficiency
reasons, a dynamic path index re-orders the terms it stores. Thus, a dynamic path index is not
stable. Like a path-index, a dynamic path-index is versatile.
      </p>
      <p>
        Extended Path Indexing [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] improves the eficiency of Path-Indexing for non-linear queries.
While Extended Path Indexing’s algorithms rely on substitutions, its indexes store terms. Like a
path-index and a dynamic path-index, a dynamic path-index is not stable but versatile.
      </p>
      <p>
        Discrimination Trees [
        <xref ref-type="bibr" rid="ref16 ref17">16, 17</xref>
        ] store terms in their leaves (their inner nodes represent term
prefixes). Like path indexes, discrimination trees disregard variables’ identities and therefore
return false positives what makes necessary post-retrieval matching or unification tests.
Discrimination trees identify and order terms with randomly assigned integers [17, p. 158] what
makes them non-stable. They are versatile.
      </p>
      <p>
        Deterministic Discrimination Trees [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ] improve discrimination trees by making a
post-retrieval matching test unnecessary for retrieving variant, instances or generalisations of linear
queries [18, p. 323]. Deterministic Discrimination Trees are not stable but they are versatile.
      </p>
      <p>
        Adaptive Discrimination Trees [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ] adapt the traversal order on every insertion what makes
them non-stable but yields faster retrievals of generalisations, the only query mode supported
[19, p. 248]. Adaptive Discrimination Trees are not stable and not versatile.
      </p>
      <p>
        Abstraction Trees [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ] represent terms by substitutions and are structured by anti-unification
[
        <xref ref-type="bibr" rid="ref21 ref22">21, 22</xref>
        ]: Parent nodes carry strict generalisations of their children. The inner nodes of abstraction
trees do not store terms. A heuristic decides which terms are anti-unified what makes abstraction
trees non-stable. They are versatile.
      </p>
      <p>
        Substitution Trees [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] combine features of discrimination and abstraction trees and represent
the stored terms by substitutions. They have better memory usage and retrieval time than
abstraction trees. They are not stable but versatile.
      </p>
      <p>
        Downward Substitution Trees [
        <xref ref-type="bibr" rid="ref23">23</xref>
        ] modify substitution trees to ensure stability and the linearity
of deletions.
      </p>
      <p>
        Code Trees [
        <xref ref-type="bibr" rid="ref24">24</xref>
        ] were developed for speeding up resolution. Each query mode requires a
specific code tree: Code trees are not versatile but they are stable.
      </p>
      <p>
        Coded Context Trees [
        <xref ref-type="bibr" rid="ref25">25</xref>
        ] like abstraction trees represent terms by substitutions (and currying),
are structured by anti-unification and depend on the insertion order: They are not stable. They
support only the retrieval of generalisations: They are not versatile.
      </p>
      <p>
        Tabling [
        <xref ref-type="bibr" rid="ref3 ref4 ref5 ref6">3, 4, 5, 6</xref>
        ] consists in sharing, and therefore storing and retrieving, answers to
(sub)goals so as to improve both the eficiency and the termination of logic programs.
      </p>
      <p>
        Dynamic Threaded Sequential Automata (DTSA) [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ] have been developed for tabling. They
are based on Sequential Factoring Automaton (SFA) which were designed for speeding up
resolution. DTSA are substitution-based tries which store data only in their leaves and their
parent-child relationship is based on unification. The structure of a DTSA depends on the
insertion order what makes them non-stable. They support only the retrieval of instances: They
are not versatile.
      </p>
      <p>
        Time Stamped Tries [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] have also been developed for tabling. They are simpler and require
less memory than DTSA. Their retrieval prioritizes the most often instantiated terms. They rely
on a hash function based on the derivation time of the terms: They are not stable. They support
only the retrieval of variant and instances: They are not versatile.
      </p>
    </sec>
    <sec id="sec-3">
      <title>3. Concepts and notations</title>
      <p>Expressions Instance tries are defined in the following referring to expressions, a
generalisation of first-order terms and first-order atomic formulas. 1 Expressions are defined from symbols
as follows.</p>
      <p>Finitely many non-variable symbols and infinitely many variables are considered. The
nonvariable symbols are totally ordered by ≤  and the variables are totally ordered by ≤ .</p>
      <p>A constructor  is a pair / with  a non-variable symbol and  one of finitely many arities
associated with the symbol .</p>
      <p>An expression is either a variable or a non-variable expression. A non-variable expression is
either a constructor  of arity 0, or it has the form (1, . . . , ) where  is a constructor of arity
 ≥ 1 and 1, . . . ,  are expressions.</p>
      <p>Two expressions are variable-disjoint if none of the variables occurring in the one expression
occur in the other.</p>
      <p>1, . . ., and  are the direct subexpressions of (1, . . . , ).</p>
      <p>Observe that no proper prefix of an expression (in standard or prefix form) is an expression
and that there are finitely many constructors.</p>
    </sec>
    <sec id="sec-4">
      <title>Orders on expressions and sequences of expressions A total order ≤  is (lexicographi</title>
      <p>cally [27, pp. 18–19] [28, pp. 88–89]) defined as follows on the variables and constructors from
the orders ≤ , ≤ , and the order on the natural numbers:
1The distinction between terms and atomic formulas is irrelevant to storage and retrieval.
• 1 &lt; 2 if 1 and 2 are variables and 1 &lt; 2.
•  &lt; / if  is a variable and  is a non-variable symbol.
• /1 &lt; /2 if  is a non-variable symbol and 1 &lt; 2.</p>
      <p>• 1/1 &lt; 2/2 if 1 and 2 are non-variable symbols and 1 &lt; 2.</p>
      <p>A total order ≤  on expressions is lexicographically derived from the total order ≤  on
constructors. Similarly, a total order ≤  on finite sequences of expressions is lexicographically
derived from the total order ≤  on expressions.</p>
      <p>Prefix notation An expression (1, . . . , ) is in standard notation. This expression can also
be written without parentheses in prefix notation (also known as Polish or Łukasiewicz notation)
as / 1/1 . . . / where  is the arity of expression  (1 ≤  ≤ ).</p>
      <p>Notations In the following, the lower case letters , , , . . . ,  with the exception of  denote
the non-variable symbols and ≤  denotes the standard order on that set; 0, 1, 2, . . . (with
subscripts) denote the variables and ≤  the order on variables:  ≤   if  ≤ . The notation
1, . . . ,  (with superscripts) denotes  arbitrary variables.</p>
      <p>Example 1.</p>
      <p>• , () and (, ) are expressions in standard notation. Their counterparts in prefix
notation are /0, /1 /0 and /2 /0 /0.
• 2 and (, (5)) are expressions in standard notation. Their counterparts in prefix
notations are 2 and /2 /0 /1 5.
•  &lt; () &lt; (, ) in standard notation and 2 &lt; /2 /0 /1 5 in prefix notation.
• 2 ≤  5.
• [6] &lt; [6, (, ), (, (5))] &lt; [(, ), (, (5))] &lt; [(, (5)), (, )] where
[1, 2, . . . , ] denotes the sequence of expressions 1, 2, . . ., and .</p>
      <p>Substitutions Let ℰ denote the set of expressions and  the set of variables. A substitution2
 = {1 ↦→ 1, . . . ,  ↦→ } with  ≥ 0 denotes a total function  → ℰ such that
• 1, . . . ,  are pairwise distinct variables,
•  () =  for all  = 1, . . . , , and
•  () =  if  ̸=  for all  = 1, . . . , .</p>
      <p>The application  of a substitution  = {1 ↦→ 1, . . . ,  ↦→ } to an expression  is the
expression obtained from  by simultaneously replacing for all  = 1, . . . ,  every occurrence
of each  in  by . The application of the empty substitution  to an expression leaves it
unchanged: For all expressions ,  = . If  is an expression and if  and  are substitutions,
then ( ) = ( ) where  denotes the composition of  and  .</p>
      <p>
        2The binding of a variable  to an expression  is denoted  ↦→  because it reminds of the implementation of
variables as pointers. Another widespread notation for the same, used among others in [
        <xref ref-type="bibr" rid="ref29">29</xref>
        ], is /.
      </p>
      <p>Let  = {1 ↦→ 1, . . . ,  ↦→ } be a substitution. The finite set of variables dom( ) =
{1, . . . , } is the domain of  . The set of variables modified by  , that is, variables  such
that  ̸= , map to the range of  . The range of a substitution is finite.</p>
      <p>A renaming substitution is a substitution which is a permutation of the set  of variables.</p>
      <p>Substitutions  1 and  2 are compatible if for all  ∈ dom( 1) ∩ dom( 2)  1 =  2. If  1
and  2 are compatible substitutions, then  1 ∪  2 is a well-defined substitution.</p>
      <sec id="sec-4-1">
        <title>Variants, instances, generalisations, and unifiers A variant of an expression  is an ex</title>
        <p>pression ′ such that ′ =  for some renaming substitution  .</p>
        <p>An instance of an expression  is an expression ′ such that ′ =  for some substitution  .
An instance ′ of  is said to match to . A strict instance of an expression  is an instance of 
which is not a variant of .</p>
        <p>A generalisation of an expression  is an expression  such that  is an instance of , that is,
 =  for some substitution  . A strict generalisation of an expression  is a generalisation of
 which is not a variant of .</p>
        <p>A unifier  of expressions 1 and 2 is a substitution such that 1 = 2 .</p>
        <p>
          Matching and unification A (first-order syntactic) matching problem , short matching
problem, of an expression 1 in an expression 2 consists in finding substitutions  such that
1 = 2 . Thus, a matching problem consists in finding substitutions establishing an instance,
or symmetrically generalisation, relationship between expressions [
          <xref ref-type="bibr" rid="ref30">30</xref>
          ].3
        </p>
        <p>A first-order syntactic unification problem , short unification problem , consists in finding
uniifers for two expressions.</p>
        <p>
          If the matching (unification, respectively) problem of 1 in 2 (1 and 2, respectively) has
solutions, then it has solutions  most general matchers, short mgm, of 1 in 2 (most general
unifiers, short mgu, of 1 and 2), which are [
          <xref ref-type="bibr" rid="ref30 ref31">30, 31</xref>
          ]
• complete in the sense that for all matchers  of 1 in 2 (all unifiers  of 1 and 2,
respectively) there exist a substitution  such that  =  ,
• equivalent in the sense that two distinct mgms (mgus, respectively)  1 and  2 of 1 in 2
(of 1 and 2, respectively) are identical up to a variable renaming (that is, there exists a
renaming substitution  such that  1 =  2).
        </p>
        <p>A matching problem is a strengthening of a unification problem: If 1 = 2 , then  is a
unifier of 1 and 2. The converse is false: Some solutions to unification problems of 1 and 2
are solutions neither of the matching problem of 1 in 2, nor of the matching problem of 2
in 1. As a consequence, matching problems can be solved with algorithms (called matching
algorithms) which might be, in some cases, more eficient than algorithms for the unification
problem (called unification algorithms ).</p>
        <p>3Matching has also been called filtering , one-sided unification , and semi-unification.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>4. Instance tries: Structure</title>
      <p>An instance trie is a tree  such that:
• The root of  carries, but does not store, a variable.
• Every node of  except the root stores an expression.
• Every arc 1 → 2 of  corresponds to non-renaming substitution  such that if  is
the expression stored at node 1, then the instance  of  is the expression stored at
node 2.</p>
      <p>• The children of a node are ordered (in a manner described below).</p>
      <p>Since the substitution corresponding to an arc of an instance trie is not a renaming substitution,
the expression stored at a child of a node  is a strict instance of the expression stored at  .
Example 2. Abstract depiction of an instance trie storing the expressions (, 1, 1), (, , ),
(5, 3, 4, ), and (5, , , ):</p>
      <p>v0
p(a,v1,v1) q(v5,v3,v4,c)
p(a,b,b)
{v0↦→p(a,v1,v1)} {v0↦→q(v5,v3,v4,c)}
{v1↦→b}
{v3↦→a,v4↦→b}
Composing the substitutions along a path from the root to a node yields the expression stored at
that node. (5, , , ) is for example obtained by 0{0 ↦→ (5, 3, 4, )}{3 ↦→ , 4 ↦→ }.</p>
      <p>Instance tries do not store expressions in standard notation but instead in prefix notation and
furthermore using a low-level representation. The following paragraphs successively address
the representations of expressions, substitution application, substitutions, and finally instance
tries.</p>
      <p>Representation of expressions The representation of an expression in the memory of a
run-time system is based on the expression’s prefix notation. Assuming that a constructor and a
variable are stored in 4 bytes and storage begins at address 0, the representation of  (, 1, , 1)
is:4
4Recall that , , , . . . ,  except  denote non-variable symbols and 0, 1, 2, . . . denote variables.
The leftmost, or first, occurrence of the variable 1 is represented by the value nil which indicates
that the variable is unbound. The second occurrence of the variable 1 is represented by an ofset:
The address of this second occurrence’s representation, 16, minus the ofset, 8, is the address
of the representation of the variable’s first occurrence, 8. Occurrences of (the representation
of) a variable like the second occurrence of 1 in  (, 1, , 1) and the cell representing such
variables like the cell at address 16 in the above representation of  (, 1, , 1) are called locally
bound variables.</p>
      <p>Three properties of an expression representation are worth stressing:
1. The variables’ names are irrelevant to expression representations. If  is an expression
and  is a variable renaming, then  and  have exactly the same representation.5 For
example, the expression (, 1, , 1) is represented exactly like (, 0, , 0) and the
expression (5, 3, 4, ) is represented exactly like (0, 1, 3, ). However, this is
not the case of the representation of substitution applications: As it is discussed below,
 (, 1, 2, 3){2 ↦→ , 3 ↦→ 1} is not represented like  (, 1, , 1).
2. The representation of an expression is variable-linear, short linear, in the sense that a
variable occurs at most once in an expression. Indeed, a non-linear expression (like
 (, 1, , 1)) is represented as the application of a substitution to a linear expression
(like  (, 1, , 2){2 ↦→ 1}).
3. In an instance trie, two distinct variables cannot be bound to two distinct expressions in
which the same variable occurs. The bindings 1 ↦→  (3) and 2 ↦→ (3) for example
cannot occur in an instance tree. In an instance trie, such bindings would be expressed
for example as 1 ↦→  (3) and 2 ↦→ (4), 4 ↦→ 3.</p>
      <p>
        Thus, expressions can be ordered as if their variables were, in the order of their first occurrence,
0, 1, 2, . . ., that is, as if they were standardized [
        <xref ref-type="bibr" rid="ref29">29</xref>
        ].
      </p>
      <p>This representation of  (, 1, , 1) given above is abstract in the sense that it is a
simplification. Its implementation in the heap of a run-time system, that is, the concrete representation,
difers from the abstract representation as follows:
• A next-representation address is added at the beginning of a (connected) expression
representation so as to ease garbage collecting (but not at the beginning of each subexpression).
• Instead of cells, tokens are considered, each of which consists of one or several consecutive
cells.
• A three-valued flag at the beginning of every token indicates the type of its content:</p>
      <p>Non-variable symbol, non-locally bound variable, or locally bound variable.
• The token for a constructor / consists of three successive memory cells, the first of
which contains the afore-mentioned type flag, the second the code of the symbol , and
the third the arity .</p>
      <p>
        5As a consequence, expressions can be considered standardized [
        <xref ref-type="bibr" rid="ref29">29</xref>
        ]. Recall that the (unique) standardized form
of  (2, 5, 2) is  (0, 1, 0).
• A concrete expression representation might include additional information like variable
names or a time stamp.6
      </p>
      <p>Assuming that there is no additional information, that  and  are represented by their
ASCII codes 112 and 97 respectively, and that nil is represented as 9999997, the type flag takes
the values 0, 1, and 2, and using decimal instead of binary numbers for better readability, the
concrete representation of (, 1, 1) is as follows:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
24</p>
      <sec id="sec-5-1">
        <title>Representation of substitution applications Assuming that the expression (, 1, 1)</title>
        <p>is stored at address 0 and the expression (, 3) at address 23, the substitution application
(, 1, 1){1 ↦→ (, 3)} is represented as follows:
Thus, binding a variable (like 1) to an expression (like (, 3)) is realised by storing the
expression’s address (23) at the variable’s address (cell 8). Observe that the cell representing
the second occurrence of the variable 1 (cell 12) keeps its ofset (4) unchanged. Thus, binding
a variable  which occurs in an expression  to an expression ′ consists in storing at the
leftmost occurrence of  in the representation of  the address of the representation of ′,
leaving unchanged further occurrences of  in the representation of . This approach to binding
variables ensures that the representation of a substitution application is unique.
Representation of substitutions In an instance trie, a substitution is applied at a node 
to the expression representation  stored at the parent node  of  . The substitution’s domain
consists of all variables with value nil, that is, the non-locally bound variables, of . Consider
for example the arc  : (5, 3, 4, ) →  : (5, , , ) or, in a more faithful depiction,
 : {0 ↦→ (5, 3, 4, )} →  : {3 ↦→ , 4 ↦→ }, of Example 3. The substitution
{3 ↦→ , 4 ↦→ } is represented by two lists:
• The sequence of addresses of nil variables (that is, non-locally bound variables) in the
expression (5, 3, 4, ) at the parent node  (in their order of occurrence): [5, 3, 4]
• The sequence of the values assigned to each of these variables yielding the expression
(5, , , ) at the child node  : [, , ]
6Time stamps are needed by logic programming run-time systems for semi-naïve forward chaining and for
tabling.</p>
        <p>7nil can be represented by any other value outside the heap’s address space.</p>
        <p>More generally, a substitution {1 ↦→ 1, . . . ,  ↦→ } at a node  is represented by two
lists:
• The sequence of addresses of nil variables (that is, non-locally bound variables) in the
expression representation at the parent node of  .
• The sequence of the expressions or variable addresses8 assigned to each of these variables
at the child node  .</p>
        <sec id="sec-5-1-1">
          <title>Observe that</title>
          <p>• no variables occur in both lists since, as the expressions of second list are created, their
variables are represented by so far unused memory cells,
• the first list does not contain any variable which does not occur in the expression at the
parent node.</p>
          <p>Representation of instance tries The following example illustrates the representation of
substitutions in an instance trie.</p>
          <p>Example 3. Abstract depiction of an instance trie storing expressions (5, 3, 4, ), (5, , , ),
 (, 1, 1, 2), and  (, , , ):
Faithful depiction of the same instance trie with an abstract representation of substitutions:
[] [v0]
[f(a,v1,v1,v2)] [v1,v2] [q(v5,v3,v4,c)] [v5,v3,v4]
[b,c] []</p>
          <p>A substitution {1 ↦→ 1, . . . ,  ↦→ } at a node  is represented by the expression
sequence [1, . . . , ] for the variables [1, . . . , ] in the parent node’s variable sequence.</p>
          <p>8Which turn nil variables in the parent node’s expression into locally bound variables in the child node’s
expression.
Faithful depiction of the same instance trie with a standard representation of substitutions:
v0
v0
f(a,v1,v1,v2) q(v5,v3,v4,c)
f(a,b,b,c)
{v0↦→f(a,v1,v1,v2)} {v0↦→q(v5,v3,v4,c)}
{v1↦→b,v2↦→c}
{v3↦→a,v4↦→b}
The children of a node are ordered after their expression sequences. For all expressions ,
 ≤  , reflecting that as variable precedes every expression. The order on unbound variables
is reflected by the positions of nil in expression sequences. The root of an instance trie has
an empty expression sequence because it has no parent node. A node with an empty variable
sequence [] (like the leftmost leaf in the above example) cannot have any children what reflects
that the expression stored at such a node has no strict instance. The node of an instance trie
carries two sequences:
• A sequence of expressions or nil representing the bindings of its parent node’s variable.
• The sequence of the addresses of the nil variables occurring in the node’s expression.
The representations of the two kinds of sequences is as follows:
• The first sequence, the sequence of variable bindings, is a sequence of representations of
expressions. Since representations of expressions have variable lengths, the sequence is
represented as a linked list.
• The second sequence, the sequence of nil variables, is a sequence of representation of
variables, that is, of addresses of memory cells representing variables. Since such cells
all have the same length, the sequence can be represented as a memory block beginning
with the number of variable addresses stored in the block.</p>
          <p>In addition to the afore-mentioned two lists, the representation of the node  of an instance
tree includes a data structure storing, and giving a fast access to, the addresses of the children
of  . If this number is small, a linked list can be used. Otherwise, a binary tree, or a B-tree is
convenient.</p>
          <p>
            The expression stored at a node  of an instance trie is obtained by successively applying to
the instance trie’s root variable the substitutions along the path from the root to  . Because
of this, instance tries are a kind of substitution-based tries or substitution tree in [
            <xref ref-type="bibr" rid="ref10 ref7 ref8">7, 8, 10</xref>
            ].9
Most data structures so far designed for automated reasoning and logic programming are, like
instance tries, substitution tries. They difer from each other on how the expression  stored
at a node  relates to the expression  stored at the parent node  of  . In Instance Tries,
this relationship is structural:  is a strict instance of  . For most substitution tries proposed
for automated reasoning, this relationship is random: It results from the storing or updating
order of expressions.
          </p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>5. Instance tries: Operations</title>
      <p>Let  be a query, that is, an expression to be evaluated against the expressions stored in an
instance trie  . Four query modes are considered:</p>
      <sec id="sec-6-1">
        <title>1. Variant: Is  a variant of an expression stored in  ?</title>
        <p>2. Instance: Which expressions stored in  are (strict) instances of ?
9Substitution-based tries are not expression-based tries because an expression  stored at a child  of a node
 is not a strict prefix of the expression  stored at  . Indeed, no strict prefix of an expression is an expression.
3. Generalisation: Which expressions stored in  are (strict) generalisations of ?
4. Unification: With which expressions stored in  does  unify?</p>
        <p>All four query modes are realized by both, a traversal of the instance trie  and a test at each
node whether that node’s expression is an answer to the query.</p>
        <p>Dereferencing The tests are defined below referring to dereferenced representations of
expressions.10 Consider the following two representations of  (, 1, 2, 1, (1)):
The first representations of  (, 1, 2, 1, (1)) is dereferenced because, except for the
representations of the second and third occurrences of the variable 1, the variables’ values are nil.
The second and third occurrences of 1 cannot be dereferenced like a pointer, because this would
result in the following representation of  (, 1, 2, 3, (4)), not of  (, 1, 2, 1, (1)):
A dereferenced representation of an expression  is generated from any representation  of
 as follows: While traversing  from left to right:
• If the cell reached contains a constructor or nil, or the ofset of a locally bound variable,
then copy its content to a new cell.
• Otherwise (the token reached is a non-locally bound variable  storing the address  of
an expression representation), (recursively) dereference the expression representation at
address .</p>
        <p>We assume that when an expression representation is dereferenced, the list of the addresses
of its nil variables (that is, non-locally bound variables) is constructed. Constructing this list
can be done while dereferencing the expression representation, that is, it does not require an
additional traversal of the expression representation.</p>
        <p>In implementing the algorithm sketch above, care must be given not to trespass expression
representations’ ends in recursive calls. This is easily cared for in the same traversal of expression
representations by using as follows the constructors’ arities during a left-to-right traversal of
an expression representation :</p>
        <p>Let  denote the number of remaining (sub)expression representations; set  := 1 before
traversing , at each constructor / perform the update  :=  − 1 +  (− 1 for the
(sub)expression beginning at that constructor and + for the  subexpression representations
10Dereferencing a pointer  means determining the value  points to.
now to be traversed), and at each variable perform the update  :=  − 1. The expression
representation’s end is reached when  = 0.</p>
        <p>Since dereferencing an expression copies that expression, dereferencing expressions comes at
a cost. This cost is acceptable, though. Indeed, dereferencing speeds up the tests which anyway
require to copy the stored expressions they are performed against because they bind variables.
Binding variables directly in an instance trie would destroy it.11
Representation of a stored expression An expression  stored at a node  of an instance
trie retrieved for comparison with a query  has the form  = ′ where ′ is the expression
stored at the parent node of  and  is a non-renaming substitution, that is,  is a strict
instance of ′. As discussed in the previous paragraph, (the representation of) ′ is assumed to
be dereferenced. Furthermore,  and ′ as well as  and  are variable-disjoint.</p>
        <p>The substitution  is represented as described in Section 4, paragraph “Representation of
substitutions” by two lists: A list of variables and a list of expressions or nil. It is also assumed
that (the representation of) the expressions in that second list are dereferenced.</p>
        <p>Useful information on ′, the nature of which depends on the query mode, can be assumed to
be known:
• If variants or instances of  are searched for, then ′ is a strict generalisation of  (or,
equivalently,  is a strict instance of ′). Indeed, otherwise the strict instance  = ′ of
′ cannot be a variant or an instance of  and the search through  , which is described
below, would not have led to .
• If generalisations of  are searched for, then ′ is already a generalisation of . Indeed,
otherwise, the strict instance  = ′ of which ′ is a strict generalisation cannot be a
generalisation of  and the search through  , which is described below, woulds not have
led to .
• If expressions unifying with  are searched for, then  and ′ unify. Indeed, if  and
 = ′ unify, then there exists a substitution  such that  =  = ′ . Since the
representations of  and ′ are variable disjoint and the domain of the representation of 
contains only variables occurring in ′,  = . Therefore  =  = ′ . That is, 
is as unifier of  and ′. Thus, if  and ′ do not unify, then  and  = ′ cannot unify,
and the search through  , which is described below, would not have led to .
Retrieval Both a query  and an expression  stored in an instance tree at a node  tested as
a possible answer to  are available as strict instances of the expression ′ stored at the parent
node of  . Indeed, by definition of an instance trie,  is stored in that form, and during the
instance tree traversal  has been recognised as a strict instance of ′ for otherwise,  and 
would not be compared.</p>
        <p>Assume that  = ′  and  = ′  and recall that each of the representations of   and  
is a list consisting of  dereferenced expression representation, where  is the number of nil
variables in the representation of ′. The matching problems of  in  and of  in  therefore
reduce to matching problems of these two lists:</p>
        <p>11Copying the representation of the query is not necessary because, by using a log, bindings of query variables
can be undone before the query is tested against another stored expression.
• If the expressions in the list representing   and   are pairwise variant of each other,
then  and  are variant of each other.
• If every expression in the list representing   is an instance of its counterpart in the
list representing  , then  is an instance of , and if furthermore at least one of these
expressions is a strict instance of its counterpart, then  is a strict instance of .
• If every expression in the list representing   is a generalisation of its counterpart in the
list representing  , then  is a generalisation of , and if furthermore at least one of these
expressions is a strict generalisation of its counterpart, then  is a strict generalisation of
.</p>
        <p>• If the lists representing   and   unify, then  and  unify.</p>
        <p>Versatile unification algorithm Instance tries make use of a unification algorithm which
determines in a single left-to-right traversal of dereferenced expression representations 1 and
2 whether the represented expressions 1 respectively 2 are variants of each other, or 1 is a
strict instance of 2, or 1 is a strict generalisation of 2, or none of this hold but 1 and 2 are
unifiable, or finally 1 and 2 are not unifiable. This algorithm is called “versatile” because it
is both a matching and a unification algorithm and because it further qualifies how matching
expressions do match.</p>
        <p>This unification algorithm exploits the afore-mentioned representation of expressions in an
instance trie for avoiding unnecessary occurs-checks in some cases:
• on some ofset variables under certain conditions
• as long as the left-to-right expression traversal is still in a matching mode (that is, one of
variant, strict instance, or strict generalisation)</p>
        <p>
          A description of this unification algorithm is beyond the scope of this paper and is given
in [
          <xref ref-type="bibr" rid="ref32">32</xref>
          ].
        </p>
        <p>Traversal A left-to-right depth-first traversal of an instance trie is, like for any tree structure,
the algorithm of choice, because it has a simple recursive definition and minimizes the space
complexity. All query modes but the query mode Unification afect that traversal:
• Variant: The traversal can be interrupted as soon as an answer is found because an
instance tree does not contain distinct variant expressions.
• Instance: Subtrees rooted at instances of the query do not have to be traversed because
all expressions they store necessarily are answers to the query.
• Generalisation: In a depth-first traversal of an instance tree, the first expression  found
which generalises  and no children of which also generalise  determines the answers to
: Their set consists of  and its ancestors (except the instance trie’s root). The subtree
rooted at such a node  is not traversed.
Insertion and deletion The insertion of an expression  in an instance trie  is realised by
ifrst searching with the matching algorithm mentioned above for a strict generalisation  of  in
 , which is always found because the root of an instance trie is a strict generalisation of every
expression, second checking whether a child of  is a instance of . If a child of  is a variant of
, then nothing is done. If a child of  is a strict instance of , then  is inserted between  and 
(what requires no more than updating two pointers). Otherwise,  is inserted in the instance
trie as an as a new child of .</p>
        <p>In order to maintain tree invariants (instances of an expression are always inserted below
their first generalization in a tree), children of  to the right of  need to be searched for instances
of  and inserted below  recursively.</p>
        <p>The deletion of an expression  from an instance trie  is realised by searching with the
matching algorithm mentioned above for a variant of  in  . If such a variant is found at a node
 , then this node  is deleted (what requires no more than updating a pointer) and, after this
deletion, each expression stored at children node of  is inserted in the subtree rooted at the
node  which, before the deletion, was the parent node of  . Otherwise nothing is done.</p>
      </sec>
    </sec>
    <sec id="sec-7">
      <title>6. Conclusion</title>
      <p>This article has introduced the data structure Instance Trie salient properties of which are:
• Stability: Instance tries are stable in the sense that their structures are independent of the
order in which they are filled or updated.
• Versatility: Instance tries are versatile in the sense that they are well-suited to the retrieval
of stored expressions in four query, or retrieval, modes: Variants, instances, generalisations
and unification of expressions.
• Incrementality: Instance tries’ storage based on the instance relationship gives rise to an
incremental expression retrieval.</p>
      <p>
        The companion article [
        <xref ref-type="bibr" rid="ref32">32</xref>
        ] gives more details on the versatile unification algorithm mentioned
in Section 5. Further work will be devoted to analytical and empirical evaluations of instance tries
and to deploying instance tries in a run-time system for tabled logic programming supporting
meta-programming.
      </p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>J. A.</given-names>
            <surname>Robinson</surname>
          </string-name>
          ,
          <string-name>
            <surname>A</surname>
          </string-name>
          . Voronkov (Eds.),
          <source>Handbook of Automated Reasoning</source>
          , volume
          <volume>1</volume>
          , MIT Press,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>F.</given-names>
            <surname>Bry</surname>
          </string-name>
          ,
          <article-title>In praise of impredicativity: A contribution to the formalisation of metaprogramming</article-title>
          ,
          <source>Theory and Practice of Logic Programming</source>
          <volume>20</volume>
          (
          <year>2020</year>
          )
          <fpage>99</fpage>
          -
          <lpage>146</lpage>
          . URL: http://arxiv.org/abs/
          <year>1807</year>
          .06051.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>H.</given-names>
            <surname>Tamaki</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Sato</surname>
          </string-name>
          ,
          <article-title>OLD resolution with tabulation</article-title>
          , in: E.
          <string-name>
            <surname>Shapiro</surname>
          </string-name>
          (Ed.),
          <source>Proceedings of the Third International Conference on Logic Programming (ICLP)</source>
          , volume
          <volume>225</volume>
          <source>of LNCS</source>
          , Springer,
          <year>1986</year>
          , pp.
          <fpage>84</fpage>
          -
          <lpage>98</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>E.</given-names>
            <surname>Johnson</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C. R.</given-names>
            <surname>Ramakrishnan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>I. V.</given-names>
            <surname>Ramakrishnan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Rao</surname>
          </string-name>
          ,
          <article-title>A space eficient engine for subsumption-based tabled evaluation of logic programs</article-title>
          , in: A.
          <string-name>
            <surname>M.</surname>
          </string-name>
          <article-title>A</article-title>
          .,
          <source>T. Sato (Eds.)</source>
          ,
          <source>Functional and Logic Programming - Proceedings of the International Symposium on Functional and Logic Programming (FLOPS)</source>
          ,
          <source>number 1722 in LNCS</source>
          , Springer,
          <year>1999</year>
          , pp.
          <fpage>184</fpage>
          -
          <lpage>299</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>I. V.</given-names>
            <surname>Ramakrishnan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Rao</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Sagonas</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Swift</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D. S.</given-names>
            <surname>Warren</surname>
          </string-name>
          ,
          <article-title>Eficient Tabling Mechanisms for Logic Programs</article-title>
          ,
          <source>Technical Report</source>
          , Department of Computer Science, State University of New York at Stony Brook,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>F. M. F.</given-names>
            <surname>Cruz</surname>
          </string-name>
          ,
          <article-title>Call Subsumption Mechanism for Tabled Logic Programs</article-title>
          ,
          <source>Ph.D. thesis</source>
          , Departamento de Engenharia Informática, Faculdade de Engenharia da Universidade do Porto, Portugal,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>P.</given-names>
            <surname>Graf</surname>
          </string-name>
          ,
          <article-title>Substitution tree indexing</article-title>
          ,
          <source>in: Proceedings of the International Conference on Rewriting Techniques and Applications</source>
          (RTA),
          <source>number 914 in LNCS</source>
          , Springer,
          <year>1995</year>
          , pp.
          <fpage>117</fpage>
          -
          <lpage>131</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>P.</given-names>
            <surname>Graf</surname>
          </string-name>
          , Term Indexing, volume
          <volume>1053</volume>
          <source>of LNCS</source>
          , Springer,
          <year>1996</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>R.</given-names>
            <surname>Sekar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>I. V.</given-names>
            <surname>Ramakrishnan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Voronkov</surname>
          </string-name>
          ,
          <source>Handbook of Automated Reasoning</source>
          , volume
          <volume>2</volume>
          , MIT Press,
          <year>2001</year>
          , pp.
          <fpage>1853</fpage>
          -
          <lpage>1964</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>R.</given-names>
            <surname>Nieuwenhuis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Hillenbrand</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Riazanov</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Voronkov</surname>
          </string-name>
          ,
          <article-title>On the evaluation of indexing techniques for theorem proving</article-title>
          , in: R.
          <string-name>
            <surname>Gore</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Leitsch</surname>
          </string-name>
          , T. Nipkow (Eds.),
          <source>Proceedings of the International Joint Conference on Automated Reasoning (IJCAR)</source>
          ,
          <article-title>number</article-title>
          2083 in LNCS, Springer,
          <year>2001</year>
          , pp.
          <fpage>257</fpage>
          -
          <lpage>271</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <surname>R. de la Briandais</surname>
          </string-name>
          ,
          <article-title>File searching using variable length keys</article-title>
          ,
          <source>in: Proceedings of the Western Joint Computer Conference</source>
          ,
          <year>1959</year>
          , pp.
          <fpage>295</fpage>
          -
          <lpage>298</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>E.</given-names>
            <surname>Fredkin</surname>
          </string-name>
          ,
          <article-title>Trie memory</article-title>
          ,
          <source>Communications of the ACM</source>
          <volume>3</volume>
          (
          <year>1960</year>
          )
          <fpage>490</fpage>
          -
          <lpage>499</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>M. E.</given-names>
            <surname>Stickel</surname>
          </string-name>
          ,
          <article-title>The Path-Indexing Method For Indexing Terms</article-title>
          ,
          <source>Technical Note 473</source>
          , SRI International, Menlo Park, California, USA,
          <year>1989</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>R.</given-names>
            <surname>Letz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Schumann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Bayerl</surname>
          </string-name>
          , W. Bibel,
          <article-title>SETHEO: A high-performance theorem prover</article-title>
          ,
          <source>Journal of Automated Reasoning</source>
          <volume>8</volume>
          (
          <year>1992</year>
          )
          <fpage>183</fpage>
          -
          <lpage>212</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>P.</given-names>
            <surname>Graf</surname>
          </string-name>
          ,
          <string-name>
            <surname>Extended</surname>
          </string-name>
          path-indexing,
          <source>in: Proceedings of the 2th Conference on Automated Deduction (CADE)</source>
          ,
          <source>number 814 in LNAI</source>
          , Springer,
          <year>1994</year>
          , pp.
          <fpage>514</fpage>
          -
          <lpage>528</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>W.</given-names>
            <surname>McCune</surname>
          </string-name>
          ,
          <article-title>An indexing method for finding more general formulas</article-title>
          ,
          <source>Association for Automated Reasoning Newsletter</source>
          <volume>1</volume>
          (
          <year>1988</year>
          )
          <fpage>7</fpage>
          -
          <lpage>8</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>W.</given-names>
            <surname>McCune</surname>
          </string-name>
          ,
          <article-title>Experiments with discrimination-tree indexing and path-indexing for term retrieval</article-title>
          ,
          <source>Journal of Automated Reasoning</source>
          <volume>9</volume>
          (
          <year>1992</year>
          )
          <fpage>147</fpage>
          -
          <lpage>167</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>A.</given-names>
            <surname>Gräf</surname>
          </string-name>
          ,
          <article-title>Left-to-right tree pattern matching</article-title>
          ,
          <source>in: Proceedings of the 4th International Conference on Rewriting Techniques and Applications (RTA)</source>
          , volume
          <volume>488</volume>
          <source>of LNCS</source>
          , Springer,
          <year>1991</year>
          , pp.
          <fpage>323</fpage>
          -
          <lpage>334</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>R.</given-names>
            <surname>Ramesh</surname>
          </string-name>
          ,
          <string-name>
            <surname>I. Ramakrishnan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Sekar</surname>
          </string-name>
          ,
          <article-title>Adaptive discrimination trees</article-title>
          ,
          <source>in: Proceedings of the International Colloquium on Automata, Languages and Programming (ICALP)</source>
          , volume
          <volume>623</volume>
          <source>of LNCS</source>
          , Springer,
          <year>1992</year>
          , pp.
          <fpage>247</fpage>
          -
          <lpage>260</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>H. J.</given-names>
            <surname>Ohlbach</surname>
          </string-name>
          ,
          <article-title>Abstraction tree indexing for terms</article-title>
          ,
          <source>in: Proceedings of the 9th European Conference on Artificial Intelligence (ECAI)</source>
          ,
          <year>1990</year>
          , pp.
          <fpage>479</fpage>
          -
          <lpage>484</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>G.</given-names>
            <surname>Plotkin</surname>
          </string-name>
          , A note on inductive generalization,
          <source>Machine Intelligence</source>
          <volume>5</volume>
          (
          <year>1970</year>
          )
          <fpage>153</fpage>
          -
          <lpage>163</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <given-names>G.</given-names>
            <surname>Plotkin</surname>
          </string-name>
          ,
          <source>A further note on inductive generalization, Machine Intelligence</source>
          <volume>6</volume>
          (
          <year>1971</year>
          )
          <fpage>101</fpage>
          -
          <lpage>124</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <given-names>K.</given-names>
            <surname>Hoder</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Voronkov</surname>
          </string-name>
          ,
          <article-title>Comparing unification algorithms in first-order theorem proving</article-title>
          , in: B.
          <string-name>
            <surname>Mertsching</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Hund</surname>
            ,
            <given-names>M. Z.</given-names>
          </string-name>
          <string-name>
            <surname>Aziz</surname>
          </string-name>
          (Eds.),
          <source>Proceedings of KI 2009 - Advances in Artificial Intelligence, 32nd Annual German Conference on AI, number 5803 in LNCS</source>
          , Springer,
          <year>2009</year>
          , pp.
          <fpage>435</fpage>
          -
          <lpage>443</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <given-names>A.</given-names>
            <surname>Voronkov</surname>
          </string-name>
          ,
          <article-title>The anatomy of Vampire - Implementing bottom-up procedures with code trees</article-title>
          ,
          <source>Journal of Automated Reasoning</source>
          <volume>15</volume>
          (
          <year>1995</year>
          )
          <fpage>237</fpage>
          -
          <lpage>265</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <given-names>H.</given-names>
            <surname>Ganzinger</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Nieuwenhuis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Nivela</surname>
          </string-name>
          ,
          <article-title>Fast term indexing with coded context trees</article-title>
          ,
          <source>Journal of Automated Reasoning</source>
          <volume>32</volume>
          (
          <year>2004</year>
          )
          <fpage>103</fpage>
          -
          <lpage>120</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <given-names>P.</given-names>
            <surname>Rao</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C. R.</given-names>
            <surname>Ramakrishnan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>I. V.</given-names>
            <surname>Ramakrishnan</surname>
          </string-name>
          ,
          <article-title>A thread in time saves tabling time</article-title>
          ,
          <source>in: Proceedings of the Joint International Conference and Symposium on Logic Programming (ICSLP)</source>
          , The MIT Press,
          <year>1996</year>
          , pp.
          <fpage>112</fpage>
          -
          <lpage>126</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          [27]
          <string-name>
            <given-names>F.</given-names>
            <surname>Baader</surname>
          </string-name>
          , T. Nipkow,
          <source>Term Rewriting and All That</source>
          , Cambridge University Press,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          [28]
          <string-name>
            <given-names>E.</given-names>
            <surname>Harzheim</surname>
          </string-name>
          , Ordered Sets, Springer,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          [29]
          <string-name>
            <surname>J. A. Robinson,</surname>
          </string-name>
          <article-title>A machine-oriented logic based on the Resolution Principle</article-title>
          ,
          <source>Journal of the ACM</source>
          <volume>12</volume>
          (
          <year>1965</year>
          )
          <fpage>23</fpage>
          -
          <lpage>41</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref30">
        <mixed-citation>
          [30]
          <string-name>
            <surname>H.-J. Bürckert</surname>
          </string-name>
          ,
          <article-title>Matching - a special case of unification?</article-title>
          ,
          <source>Journal of Symbolic Computation</source>
          <volume>8</volume>
          (
          <year>1989</year>
          )
          <fpage>523</fpage>
          -
          <lpage>536</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref31">
        <mixed-citation>
          [31]
          <string-name>
            <given-names>F.</given-names>
            <surname>Baader</surname>
          </string-name>
          , W. Snyder,
          <source>Handbook of Automated Reasoning</source>
          , Elsevier and MIT Press,
          <year>2001</year>
          , pp.
          <fpage>445</fpage>
          -
          <lpage>532</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref32">
        <mixed-citation>
          [32]
          <string-name>
            <given-names>T.</given-names>
            <surname>Prokosch</surname>
          </string-name>
          ,
          <string-name>
            <surname>F.</surname>
          </string-name>
          <article-title>cois Bry, Unification on the run</article-title>
          , in: T.
          <string-name>
            <surname>Kutsia</surname>
            ,
            <given-names>A. M.</given-names>
          </string-name>
          <string-name>
            <surname>Marshall</surname>
          </string-name>
          (Eds.),
          <source>The 34th International Workshop on Unification (UNIF'20)</source>
          , number
          <fpage>20</fpage>
          -10
          <source>in RISC Report Series</source>
          , Research Institute for Symbolic Computation, Johannes Kepler University, Linz, Austria,
          <year>2020</year>
          , pp.
          <volume>13</volume>
          :
          <fpage>1</fpage>
          -
          <lpage>13</lpage>
          :
          <fpage>5</fpage>
          . URL: https://www.risc.jku.at/publications/download/risc_ 6129/proceedings-UNIF2020.pdf.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>