<!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>Mete: a Meta Rete Interface for Distributed Rule-based Systems</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Maarten Hubrechts</string-name>
          <email>maarten.hubrechts@vub.be</email>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Kennedy Kambonay</string-name>
          <email>ykennedy.kambona@vub.be</email>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Thierry Renauxz</string-name>
          <email>zthierry.renaux@vub.be</email>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Simon Van de Waterx</string-name>
          <email>xsimon.van.de.water@vub.be</email>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Mathijs Saey</string-name>
          <email>mathijs.saey@vub.be</email>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Coen De Rooverk</string-name>
          <email>kcoen.de.roover@vub.be</email>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Wolfgang De Meuter</string-name>
          <email>wolfgang.de.meuter@vub.be</email>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Software Languages Lab</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Vrije Universiteit Brussel Brussels</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Belgium</string-name>
        </contrib>
      </contrib-group>
      <abstract>
        <p>-In Complex Event Processing (CEP), continuous streams of information are analyzed to deduce useful insights from the incoming data. CEP can be implemented using rulebased systems. These are systems which are used to act upon states in which an object domain can be. It does so by providing facts that represent that object domain and rules that describe when certain actions must happen. In order to determine this, a rule interpreter is used to find the rules that match the available facts. A widely used example of such an interpreter is the Rete algorithm. However, since Rete was first introduced in the seventies, changes to the algorithm are needed to make it relevant to today's standards in CEP. One of those changes is the support for deployment in a cloud setting or on a computer cluster to enhance the processing performance. Previous research describes a distributed variant of the Rete algorithm which distributes the workload across a computer cluster. Inescapably, distributing the work over different machines introduces additional metaconcerns such as load balancing and fault tolerance. In this paper, we claim that the complexity of maintaining CEP systems can be reduced by disentangling these metaconcerns from the base application. We introduce a meta Rete system called Mete. Mete reasons about, and intercedes in, a distributed base Rete network. Mete allows programmers to add and modify meta-concerns such as auditing, fault tolerance, load balancing, or logging, without requiring any modification to the base application code. Index Terms-CEP, Meta Programming, Rete, Rule-based Systems</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>I. INTRODUCTION</title>
      <p>
        In today’s world enterprises continuously generate a
substantial amount of data. This leads to never ending streams
of information. Yet, the true potential of having this data is
only reached when it is analysed; processing data allows
enterprises to gain useful insights. This is where Complex Event
Processing, or CEP, comes into play. CEP is a method of
analyzing continuous streams of data and deriving conclusions
based on them [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. The data itself concerns actions that happen
in the scope of the enterprise. These data points are called
events. A combination of events is called a complex event.
Complex events are typically some situation, opportunity or
threat to the enterprise that must be acted upon. Hence, when
complex event gets detected, a certain action is executed as a
consequence.
      </p>
      <p>
        One way of implementing Complex Event Processing is by
using a rule-based approach [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. In rule-based CEP systems,
declarative rules are used to identify complex events.
Declarative rules are combinations of a pattern and a consequent;
when input data matches the pattern, the consequent should
be executed. In order to determine which rules are matched
by the available facts, a rule interpreter is needed [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ].
      </p>
      <p>
        A widely used example of such an interpreter is the Rete
algorithm [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. Rete is used to efficiently match many facts to
many patterns. However, the traditional algorithm was
developed for single-threaded use. This means that the algorithm
does not specify how to take advantage of the additional
compute power of multi-core computers or computer clusters.
This problem was tackled by [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] who adapted the algorithm
to operate on a machine consisting of a large number of
processing elements, each with its own local storage. Another
extension based on this by [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], introduced the distributed
rule-based CEP system CloudParte. Such distributed variants
of Rete made it possible to scale up rule processing by
distributing the work over different machines.
      </p>
      <p>
        However, a distributed variant of the Rete algorithm comes
with a new set of challenges. Examples of such challenges
are making the algorithm resistant to partial failures of the
computer cluster and implementing a load balancing technique
to evenly distribute the work over the different machines.
These challenges are all meta-concerns. Ideally, implementing
and modifying solutions to these challenges should be done in
such a way that the application logic is left unaffected. By
disentangling the concerns, adaptive and perfective maintenance
[
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] could be significantly simplified.
      </p>
      <p>So far, there is no abstract and general way to tackle
the meta-concerns of a distributed rule-based CEP system.
While the declarative nature of rule-based systems naturally
lends itself to disentangling the meta-concerns from the base
application logic, current rule based systems impose a hard
line between the declarative rules and their implementation.
While changes to the application logic require rewriting the
declarative rules, user demands for enhancements and
extensions to the rule-based system require rewriting elements
of the rule-based system’s core implementation. In practice
this entails that modifications are implemented by writing
software in the rule-based system’s implementation language.
For far-reaching concerns such as distribution, fault tolerance,
and load balancing, this requires the programmer to fully
understand the entire code base of the rule-based system.</p>
      <p>We propose to instead tackle such meta-concerns using
a meta Rete protocol. Through such a meta Rete protocol,
programmers can introspect the workings of a rule-based
system, and intercede in its workings. Crucially, the meta Rete
protocol is exposed to the rule-based language as logical facts
and actions which can be invoked from the consequent of a
rule matching.</p>
      <p>We developed a prototypical meta Rete system called Mete.
Mete provides an abstract and general way to make extensions
to a distributed CEP system based on the Rete algorithm. The
novelty of Mete is that it introduces a second Rete network,
called the meta Rete network. The meta Rete network reasons
about the distributed base Rete network. This enables us to
write meta rules which can make fundamental changes to the
base Rete network in a declarative manner, which reduces
the burden of maintenance and configuration. Tackling other
meta-concerns, or modifying the existing solutions, can be
done without having to touch — nor know the details of —
either the base application logic or the rule-based system’s
implementation.</p>
      <p>Section II describes the architecture of Mete. In section IV
we sketch an evaluation of our prototype. In order to validate
our system, we implement the meta-concern of fault tolerance
using only declarative meta-rules. To verify that the system
is indeed fault tolerant, we run it with and without induced
failures, and confirm that the results computed by the base
Rete are unaffected by partial failures of the computer cluster
it runs on.</p>
    </sec>
    <sec id="sec-2">
      <title>II. ARCHITECTURE</title>
      <p>
        The Rete algorithm was initially designed for
singlethreaded use. However, these days we are dealing with data on
too large a scale too tackle that way. Much more processing
power can be brought to bear by running workloads on
multiple cores or even multiple machines. This is why variants
of Rete were introduced that can be parallelized [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]–[
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]
or distributed across a computer cluster [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. All those
systems must take care of the additional challenges that present
themselves in a parallel or distributed context. For instance, the
algorithm must be made resource-aware. For distributed cases,
the algorithm must be made resistant against partial failures
of the hardware.
      </p>
      <p>
        Our work expands on the distributed Rete system
CloudParte [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. CloudParte splits up a Rete network and spreads
the Rete nodes among multiple machines that are part of the
computer cluster CloudParte runs on. CloudParte provides the
means for asynchronously exchanging messages between the
Rete nodes. However, CloudParte’s solution to the challenges
of a distributed setting are hard-coded. Extending its
capabilities, or changing the trade-offs that were made, requires
modifications to its core implementation. This is cumbersome
and error-prone, and discourages maintenance and adaptation.
      </p>
      <p>In order to facilitate evolving CloudParte’s code base, we
introduce a meta Rete system called Mete. Mete extends a
CloudParte system by providing a secondary Rete network.
In this secondary Rete network, meta-concerns of the base
Rete network are reified as logical facts. Logical rules in this
secondary Rete network hence reasons about the base Rete
network, effectively constituting a meta Rete network. We refer
to the rules of the meta Rete network as meta rules. The facts
in the meta Rete network are called meta facts.</p>
      <p>More concretely, the meta facts describe how the distributed
base Rete network is structured. For example, they define
which nodes are present in the base system and on which
machine they are located. The meta Rete network is responsible
for spawning the base Rete network, restoring failed nodes,
and relocating nodes to balance the load.</p>
      <p>When Mete initializes, it first spawns the meta Rete network
on a single machine, called the master machine. Then, the
distributed base Rete program is parsed and compiled into
meta facts representing it. Next, the meta facts are passed to
the meta Rete network. Since the initial situation is merely an
exceptional case of a valid configuration — all nodes of the
base Rete are present but none are scheduled on a machine —
the meta Rete can perform its function by spawning the base
Rete network on the different machines.</p>
      <p>Not all meta rules are devoted to spawning the base Rete
network. Some meta rules can, e.g., implement checkpointing
strategies. In general, meta rules provide solutions to any user
requirement that might present themselves in the future.</p>
      <p>Summarized, the system contains two active Rete networks,
shown in fig. 1:
1) The first network is the meta Rete network which has the
distributed base Rete network as its object domain. Meta
rules allow to describe situations that the distributed base
Rete network can be in. These rules make it possible to
influence and extend the behavior of that base network.
This means that the base Rete network’s behavior can
be adapted according to new requirements, which means
that the algorithm can evolve without knowing a priori
what these requirements are.
2) The second network is the base Rete network. The
base Rete network reasons about a specific application
domain, e.g., a supermarket’s customers and their
purchases. The base Rete network can be distributed across
multiple physical machines, in which case we refer to it
as the distributed base Rete network.</p>
    </sec>
    <sec id="sec-3">
      <title>III. A META RETE INTERFACE</title>
      <p>The meta Rete network implements a specific meta Rete
interface. This interface specifies which constructs are available
to user-defined meta rules. User-defined meta rules provide a
way for application developers to extend and configure the
CEP system. They reason about meta facts, i.e., facts that
represent the state and structure of the distributed base Rete
network.
meta facts produced by the rule engine. These can be matched 25
as logical facts by the user-defined meta rules. Second, there 2267 [Wi_ld(c)a]rd
are the meta facts that are understood by the rule engine.</p>
      <p>These can be asserted into — or retracted from — the rule
engine’s knowledge base by user-defined meta rules. The
former enables the meta-rules to respond to the state of the
rule engine. The latter enables meta-rules to modify the state
of the rule engine.</p>
      <p>The meta facts by which the state of the rule engine can
be inspected, are shown in Listing 1. They are divided in five
different categories:
Architecture patterns match meta facts which represent the
structure of the distributed base Rete network. For
example, line 2 shows a pattern of a Node meta fact.</p>
      <p>This pattern matches every Rete node that is part of
the distributed Rete network, since each such node is
represented in the knowledge base by a Node meta fact.</p>
      <p>Another example is the pattern describing Edge meta
facts, shown on lines 7 and 8. This pattern matches the
meta facts of all edges that connects two Rete nodes of
the distributed base Rete network.</p>
      <p>Timing patterns match TimerElapsed meta facts. The
presence of a TimerElapsed meta fact in the knowledge base
indicates that a certain timers threshold has elapsed.</p>
      <p>Info patterns match meta facts containing additional infor- 1 Timing
2 [RequestTimer (timer_id: TimerId, ms: Ms)]
mation about a base Rete node that is not related to 3
its structure. A concrete example are LoadCheck meta 54 [IRnefqouestLoadCheck (node_id: NodeId)]
facts. These communicate the amount of facts that the 6
corresponding base Rete node forwarded to its succes- 78 S[nRaepqsuheostttSinnagpshot (node_id: NodeId)]
sor(s). Info meta facts can for example be useful for 9 [RequestMetaSnapshot ()]
implementing a load-balancing strategy.</p>
      <p>Snapshotting patterns match meta facts that are related to</p>
      <p>
        snapshotting [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] the state of the different Rete networks.
      </p>
      <p>Wildcard patterns are all patterns that are automatically
matched exactly once, when the system gets started.</p>
      <p>Wildcard patterns can be used to initialize components
of the meta Rete network, or to initialize the distributed
base Rete network when the system gets started.</p>
      <p>Listing 1. Patterns of meta facts that can be matched in the patterns of
userdefined meta rules.</p>
      <p>The meta facts by which the rule engine’s state can be
modified, are shown in Listing 2. To modify the state, meta
facts matching these patterns can be asserted into the rule
engine’s knowledge base — or retracted from the knowledge
base. There are three categories of meta facts by which the
rule engine’s state can be modified:
Timing meta facts make or remove timers. When a
RequestTimer meta fact gets asserted a timer is created.</p>
      <p>Whenever the specified time is up, a TimerElapsed meta
fact (described previously) is asserted into the knowledge
base.</p>
      <p>Info meta facts serve a similar role, but instead of requesting
timer events, they request state-introspection meta facts
from the Info category.</p>
      <p>Snapshotting meta facts request different kinds of snapshots
to be made. Line 8 shows the meta fact RequestSnapshot
that when asserted, fires a built-in meta rule that will
assert a Snapshot meta fact (described previously). Line 9
shows the RequestMetaSnapshot that when asserted, fires
built-in meta rules that take a snapshot of the meta Rete
network itself, and stores it to persistent storage.</p>
      <p>Listing 2. Patterns of meta facts that can be asserted in the consequents of
user-defined meta rules.</p>
    </sec>
    <sec id="sec-4">
      <title>IV. EVALUTION</title>
      <p>In order to validate Mete, we implemented fault tolerance
as a set of user-defined rules, using only the meta Rete API
from section III. Together, these meta rules ensure that any
node involved in either the distributed base Rete network or
the meta Rete network can fail without influencing what the
rule engine detects. For space constraints and to limit the
scope of this paper — we introduce a meta Rete interface,
not fault tolerance — we do not list the exact set of meta
rules by which we implemented fault tolerance. The gist is
as follows: each situation in which a fault of a component
would lead to a global failure is handled by one or more
user-defined rules. These make sure that each node (Node)
is regularly (RequestTimer/TimerElapsed) persisted
(RequestSnapshot/RequestMetaSnapshot), and respawn the nodes with
that state after a crash.</p>
      <p>We conducted an experiment where 5000 facts were sent
to the base Rete network, which contains a rule which fires
whenever one of those facts arrives. That base rule hence fires
exactly 5000 times. After a delay of five seconds, we induce a
failure in all the nodes of the distributed base Rete network. As
fig. 2 shows, the user-defined meta rules succeed in respawning
the base Rete nodes. After the induced failure, no base rule
fires for a period of fifty seconds. After this period, the rule
gets fired again until all 5000 activations took place. This
demonstrates that our system is robust against crashes of the
distributed base Rete network.</p>
    </sec>
    <sec id="sec-5">
      <title>V. CONCLUSION</title>
      <p>In this paper we propose an abstract and general way of
extending the capabilities of rule-based systems running on the
Rete algorithm in a distributed setting. Previously, extending
the algorithm had to be done by manually adding
languagespecific code directly into the implementation. However, this
approach is undesirable because it lacks the advantages that
stem from suitable software maintenance techniques such as
perfective maintenance.</p>
      <p>We introduce Mete, a meta Rete system that reasons about a
base Rete network by means of a set of special rules and facts.
The architecture of Mete contains two active Rete networks.
The distributed base Rete network is reasons about the object
domain of the application via facts and user-defined rules.
Mete then provides a meta Rete network — a non-distributed
network that reasons about the base Rete network using meta
facts and meta rules. The distributed base Rete network is
represented by meta facts, describing its state and structure.
Built-in meta rules are provided that can match these meta
facts. The meta rules describe the extensions to the behavior of
the distributed base Rete network. We validate our approach by
enforcing fault tolerance in a distributed rule-based system. By
introducing Mete, perfective maintenance is improved since
it offers an abstract and general way of extending the Rete
algorithm.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <surname>David</surname>
            <given-names>C.</given-names>
          </string-name>
          <string-name>
            <surname>Luckham</surname>
          </string-name>
          .
          <article-title>The Power of Events: An Introduction to Complex Event Processing in Distributed Enterprise Systems</article-title>
          . Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Adrian</given-names>
            <surname>Paschke</surname>
          </string-name>
          and
          <string-name>
            <given-names>Alexander</given-names>
            <surname>Kozlenkov</surname>
          </string-name>
          .
          <article-title>Rule-based event processing and reaction rules</article-title>
          .
          <source>In International Workshop on Rules and Rule Markup Languages for the Semantic Web</source>
          , pages
          <fpage>53</fpage>
          -
          <lpage>66</lpage>
          . Springer,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>Frederick</given-names>
            <surname>Hayes-Roth</surname>
          </string-name>
          .
          <article-title>Rule-based systems</article-title>
          .
          <source>Communications of the ACM</source>
          ,
          <volume>28</volume>
          (
          <issue>9</issue>
          ):
          <fpage>921</fpage>
          -
          <lpage>932</lpage>
          ,
          <year>1985</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <surname>Charles</surname>
            <given-names>L.</given-names>
          </string-name>
          <string-name>
            <surname>Forgy</surname>
          </string-name>
          .
          <article-title>Expert systems. chapter Rete: A Fast Algorithm for the Many Pattern/Many Object Pattern Match Problem</article-title>
          , pages
          <fpage>324</fpage>
          -
          <lpage>341</lpage>
          . IEEE Computer Society Press, Los Alamitos, CA, USA,
          <year>1990</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <surname>Michael</surname>
            <given-names>A</given-names>
          </string-name>
          <string-name>
            <surname>Kelly and Rudolph E Seviora</surname>
          </string-name>
          .
          <article-title>A multiprocessor architecture for production system matching</article-title>
          .
          <source>In AAAI</source>
          , pages
          <fpage>36</fpage>
          -
          <lpage>41</lpage>
          ,
          <year>1987</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>Janwillem</given-names>
            <surname>Swalens</surname>
          </string-name>
          , Thierry Renaux, Lode Hoste, Stefan Marr, and Wolfgang De Meuter.
          <article-title>Cloud parte: elastic complex event processing based on mobile actors</article-title>
          .
          <source>In Proceedings of the 2013 workshop on Programming based on actors, agents, and decentralized control</source>
          , pages
          <fpage>3</fpage>
          -
          <lpage>12</lpage>
          . ACM,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <surname>Bennet</surname>
            <given-names>P</given-names>
          </string-name>
          <string-name>
            <surname>Lientz and E Burton</surname>
          </string-name>
          <article-title>Swanson. Problems in application software maintenance</article-title>
          .
          <source>Communications of the ACM</source>
          ,
          <volume>24</volume>
          (
          <issue>11</issue>
          ):
          <fpage>763</fpage>
          -
          <lpage>769</lpage>
          ,
          <year>1981</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>A.</given-names>
            <surname>Gupta</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Forgy</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Newell</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Wedig</surname>
          </string-name>
          .
          <article-title>Parallel algorithms and architectures for rule-based systems</article-title>
          .
          <source>SIGARCH Comput. Archit. News</source>
          ,
          <volume>14</volume>
          (
          <issue>2</issue>
          ):
          <fpage>28</fpage>
          -
          <lpage>37</lpage>
          , May
          <year>1986</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <surname>Mostafa</surname>
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Aref</surname>
            and
            <given-names>Mohammed A.</given-names>
          </string-name>
          <string-name>
            <surname>Tayyib</surname>
          </string-name>
          .
          <article-title>Lana-match algorithm: A parallel version of the rete-match algorithm</article-title>
          .
          <source>Parallel Computing</source>
          ,
          <volume>24</volume>
          :
          <fpage>763</fpage>
          -
          <lpage>775</lpage>
          ,
          <year>1998</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>Kemal</given-names>
            <surname>Oflazer</surname>
          </string-name>
          .
          <source>Partitioning in parallel processing of production systems</source>
          .
          <year>1987</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>A</given-names>
            <surname>Gupta</surname>
          </string-name>
          ,
          <string-name>
            <given-names>CL</given-names>
            <surname>Forgy</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D</given-names>
            <surname>Kalp</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A</given-names>
            <surname>Newell</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M</given-names>
            <surname>Tambe</surname>
          </string-name>
          .
          <article-title>Parallel ops5 on the encore multimax</article-title>
          .
          <source>In Proc. Int'l Conf. on Parallel Processing</source>
          , pages
          <fpage>271</fpage>
          -
          <lpage>280</lpage>
          ,
          <year>1988</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>Toru</given-names>
            <surname>Ishida</surname>
          </string-name>
          .
          <article-title>Parallel rule firing in production systems</article-title>
          .
          <source>IEEE Transactions on Knowledge and Data Engineering</source>
          ,
          <volume>3</volume>
          (
          <issue>1</issue>
          ):
          <fpage>11</fpage>
          -
          <lpage>17</lpage>
          ,
          <year>1991</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>E.</given-names>
            <surname>Gendelman</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L. F.</given-names>
            <surname>Bic</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M. B.</given-names>
            <surname>Dillencourt</surname>
          </string-name>
          .
          <article-title>An applicationtransparent, platform-independent approach to rollback-recovery for mobile agent systems</article-title>
          .
          <source>In Proceedings 20th IEEE International Conference on Distributed Computing Systems</source>
          , pages
          <fpage>564</fpage>
          -
          <lpage>571</lpage>
          ,
          <year>April 2000</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>