<!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>Temporal Meta-Axioms in Logical Agents</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Stefania Costantini</string-name>
          <email>stefania.costantini@univaq.it</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Panagiota Tsintza</string-name>
          <email>panagiota.tsintza@univaq.it</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Dip. di Ingegneria e Scienze dell'Informazione (DISIM), Universita` di L'Aquila</institution>
          ,
          <addr-line>Coppito 67100, L'Aquila</addr-line>
          ,
          <country country="IT">Italy</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>This paper deals with run-time detection and possible correction of erroneous and/or anomalous behavior in agents defined in datalog- or prologbased logic languages. In particular, we augment our previous approaches by allowing an agent to explicitly observe and record its past behavior so as to be able to decide its best actions, detect anomalous behavior and try to dynamically correct detected problems.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1 Introduction</title>
      <p>Agents, in their interaction with the environment, are subject to modify themselves and
evolve according to both external and internal stimuli, the latter due to the proactive and
deliberative capabilities of the agent themselves.</p>
      <p>
        In previous work, we defined semantic frameworks for datalog-based and
prologbased logical agents that account for: (i) the kind of evolution of reactive and proactive
agents due to directly dealing with stimuli, that are to be coped with, recorded and
possibly removed [
        <xref ref-type="bibr" rid="ref1 ref2">1,2</xref>
        ]; and (ii) the kind of evolution related to adding/removing rules
from the agent knowledge base. These frameworks have been integrated into an overall
framework for logical evolving agents (cf. [
        <xref ref-type="bibr" rid="ref3 ref4">3,4</xref>
        ]), where every agent is seen as the
composition of a base-level (or object-level) program and one or more meta-levels. In this
model, updates related to recoding stimuli are performed in a standard way, while
updates involving the addition/deletion of sets of rules, related to learning, belief revision,
etc. are a consequence of meta-level decisions.
      </p>
      <p>
        As agent systems are more widely used in real-world applications, the issue of
verification is becoming increasingly important (see [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] and the many references therein).
The motivation of the work presented in this paper is that, though agents behavior is
affected by their interaction with the external world, in most practical cases the actual
arrival order of events is unforeseeable. Often, the set of possible events is so large that
computing all combinations would result in a combinatorial explosion, thus making “a
priori” (static) verification techniques somewhat unpractical.
      </p>
      <p>Properties that one wants to verify often depend upon which events have been
observed by an agent up to a certain point, and which others are supposed to occur later.
We believe that static verification should be integrated with dynamic self-checking
aimed at detecting properties violation and trying to restore an acceptable or desired
state of affairs.</p>
      <p>
        The definition of frameworks such as the one that we propose here, for checking
agent behavior during its life based on its experience, has not been widely treated up to
now. In the quest quest for agent platforms whose component entities would be capable
of exhibiting a correct and rigorous behavior with respect to expectations, developers
have frequently applied model-checking techniques (cf. [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] and Section 4 for a
discussion of applications in the agent realm) that are based upon abstract models of an agent
system. On the one hand however, not all properties can be statically verified. On the
other hand, it would be useful to devise methods for reinstating a correct behavior at
run-time in case unwanted situations should occur. Thus, we believe that the
introduction of forms of dynamic (self-)checking are necessary and can be useful.
      </p>
      <p>In this paper, we propose a method for checking the agent behavior correctness
during the agent activity, based on maintaining information on its past “experiences” and
behavior. If augmented by time stamps, these records (that we call past events)
constitute in a way the history of the agent activity. The set of past events evolves in time, and
past events constitute the ground upon which the agent can check its own behavior with
respect to what has happened in the external environment (more precisely, with respect
to what the agent has perceived about what has happened). To perform such checks,
we introduce a new kind of constraints, that we call Evolutionary LTL Expressions, that
according to what has happened and to what is supposed to happen in the future define
properties that should hold and what should be done if they are violated. Evolutionary
LTL Expressions are based upon specifying: (i) a sequence of events that are supposed
to have happened; by using a notation obtained from regular expressions, one does not
need to completely specify a finite sequence, but is allowed to define partially specified
sequences of unlimited length; (ii) a temporal-logic-like expression defining a property
that should hold; (iii) a sequence of events that are supposed to happen in the future,
without affecting the property; (iv) a sequence of events that are supposed to happen in
the future; (v) optionally, “repair” actions to be undertaken if the property is violated.
The interval temporal logic adopted for defining properties has been introduced in
previous work. Evolutionary LTL Expressions are a novel feature that we introduce in this
paper, and that we have (prototypically) implemented and experimented.</p>
      <p>
        Our approach can be adopted in any logic agent-oriented framework, and we
believe that, more generally, evolutionary LTL expressions can be adopted as a
programming construct in event-based extensions to datalog and prolog. In particular, one such
language is DALI [
        <xref ref-type="bibr" rid="ref7 ref8">7,8</xref>
        ], which is an agent-oriented extension to prolog. We have
implemented the proposed approach in DALI, where we have performed the experiments
presented below.
      </p>
      <p>The paper is structured as follows. In Section 2 we provide the reader with some
background, concerning our declarative semantics of evolving agents, and temporal
logic (extended to interval temporal logic). In Section 3 we introduce Evolutionary
LTL Expressions, that define properties that are supposed to hold, given events that are
supposed to have occurred in the past, and events that are supposed to occur or not to
occur in the future. These expressions are actually constraints to be verified at run-time.
We compare the proposed approach with other approaches to verification in Section 4.
We introduce and discuss the problem of the experimental evaluation of the approach
in Section 5. Finally, in Section 6 we conclude.</p>
    </sec>
    <sec id="sec-2">
      <title>Background</title>
      <p>
        In this paper we will refer to the declarative semantics introduced in [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], aimed at
declaratively modeling changes inside an agent which are determined both by changes in the
environment, that we call external events, and by the agent’s own self-modifications,
that we call internal events. The key idea is to understand these changes as the result of
the application of program-transformation functions.
      </p>
      <p>As a typical situation, perception of an external event will have an effect on the
program which represents the agent: for instance, the event will be stored as a new
fact. This transforms the program into a new program, that will procedurally behave
differently than before, e.g., by possibly reacting to the event. Or, the internal event
corresponding to the decision of the agent to undertake an activity triggers a more complex
program transformation, resulting in a version of the program where the corresponding
intention is “loaded” so as to become executable.</p>
      <p>We abstractly formalize an agent as the tuple Ag = &lt; PAg; E; I; A &gt; where Ag
is the agent name and PAg (that we call “agent program”) describes the agent
behavioral rules. E is the set of the external events, i.e, events that the agent is capable to
perceive and recognize: let E = fE1; : : : ; Eng for some n. I is the internal events set
(distinguished internal conclusions): let I = fI1; : : : ; Img for some m. A is the set of
actions that the agent can possibly perform: let A = fA1; : : : ; Akg for some k. Let Y =
(E [ I [ A).</p>
      <p>
        According to this semantic account, one will have an initial program P0 = PAg
which, according to events that happen and actions which are performed, passes through
corresponding program-transformation steps (each one transforming Pi into Pi+1, cf.
[
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]), and thus gives rise to a Program Evolution Sequence P E = [P0; :::; Pn; :::]. The
program evolution sequence will imply a corresponding Semantic Evolution Sequence
M E = [M0; :::; Mn; :::] where Mi is the semantic account of Pi.
      </p>
      <p>The different languages and different formalisms in which an agent can possibly be
expressed will influence the following key points: (i) when a transition from Pi to Pi+1
takes place, i.e., which are the external and internal factors that determine a change
in the agent; (ii) which kind of transformations are performed; (iii) which semantic
approach is adopted, i.e., how Mi is obtained from Pi.</p>
      <p>We also believe it useful to perform an Initialization step, where the program PAg
written by the programmer is transformed into a corresponding program P0 by means
of some sort of knowledge compilation. This initialization step can be understood as a
rewriting of the program in an intermediate language and/or as the loading of a “virtual
machine” that supports language features. This stage can on one extreme do nothing,
on the other extreme it can perform complex transformations by producing “code” that
implements language features in the underlying logical formalism. P0 can be simply a
program (logical theory) or can have additional information associated to it.</p>
      <p>
        Let H be the history of an agent, that is, a set of events that happened and actions
performed by the agent, each one time-stamped so as to indicate when they occurred. In
particular, we introduce a set P of current “valid” past events that describe the state of
the world as perceived by the agent1, and a set PNV where we store all previous ones.
Thus, the history H is the tuple hP; P N V i. In practice, H is dynamically augmented
with new events that happen. Given set Y of events, if one is interested in identifying
the kind of event, a postfix (to be omitted if irrelevant) can provide this indication. I.e.,
XE is an external event, XA is an action and XI an internal event. As soon as X is
perceived by the agent, it is recorded in P in the form XP Y : Ti, Y 2 fE; A; Ig. In
[
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] we have defined Past Constraints, which allow one to define when and upon which
conditions (apart from arrival of more recent ones) past events should be moved into
PNV.
      </p>
      <sec id="sec-2-1">
        <title>Definition 1 (Evolutionary semantics). Let Ag be an agent. The evolutionary seman</title>
        <p>tics "Ag of Ag is a tuple hH; P E; M Ei, where H is the history of Ag, and P E and</p>
      </sec>
      <sec id="sec-2-2">
        <title>M E are its program and semantic evolution sequence.</title>
        <p>The next definition introduces the notion of instant view of "Ag, at a certain stage
of the evolution (which is in principle of unlimited length).</p>
        <sec id="sec-2-2-1">
          <title>Definition 2 (Evolutionary semantics snapshot). Let Ag be an agent, with evolu</title>
          <p>tionary semantics "Ag = hH; P E; M Ei. The snaphot at stage i of "iAg is the tuple
hHi; Pi; Mii, where Hi is the history up to the events that have determined the
transition from Pi 1 to Pi.</p>
          <p>
            For defining properties that are supposed to be respected by an evolving system, a
well-established approach is that of Temporal Logic (introduced in Computer Science
by Pnueli [
            <xref ref-type="bibr" rid="ref9">9</xref>
            ], for a survey the reader can refer to [
            <xref ref-type="bibr" rid="ref10">10</xref>
            ]), and in particular Linear-time
Temporal Logic (LTL), that implicitly quantifies universally upon all possible paths.
LTL logics are called linear because, in contrast to branching time logics, they evaluate
each formula with respect to a vertex-labeled infinite path s0s1 : : : where each vertex
si in the path corresponds to a point in time (or “time instant” or “state”).
          </p>
          <p>
            LTL enriches an underlying propositional logic language with a set of temporal
connectives composed of a number of unary and binary connectives referring to future-time
and past-time. In prior work (see e.g., [
            <xref ref-type="bibr" rid="ref11">11</xref>
            ]), we introduced an extension to temporal
logic based on intervals, where states in which a temporal formula is supposed to hold
are explicitly stated. E.g., Gm;n (always in time interval) states that formula ' should
become true at most at state sm and then hold at least until state sn.
3
          </p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Checking the behavior of Evolving Agents</title>
      <p>
        In this section we introduce Evolutionary LTL Expressions, which are aimed at
checking an agent’s behavior at run-time under partially specified sequences of past and future
events. This extends our past work [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] where we defined meta-axioms with repair to be
undergone upon violation of given conditions, but without reference to event sequences.
These expressions are based upon specifying: (i) a sequence of events that are supposed
to have happened; by using a notation obtained from regular expressions, one does not
1 The agent is aware of the world through perceptions, that necessarily report a past (though
hopefully recent) state.
need to completely specify a finite sequence, but is allowed to define partially specified
infinite sequences; (ii) a temporal-logic-like expression defining a property that should
hold; (iii) a sequence of events that are supposed to happen in the future, without
affecting the property; (iv) a sequence of events that are supposed not to happen in the
future, otherwise the property will not hold any longer; (v) optionally, “repair” actions
to be undertaken if the property is violated.
      </p>
      <p>According to the evolutionary semantics summarized above, time instants s0s1 : : :
concerning an agent’s “life” can be understood in terms of the events that happen. In
fact, at the i-th evolution step we have an history Hi, an agent program Pi and its
intended semantics Mi, determined by events E1; : : : ; Ei occurred so far. The next
evolution step will take place in accordance to the perception of next event Ei+1. Then,
any property ' which holds w.r.t. "iAg, i.e. w.r.t. the agent evolutionary semantics up to
step i, will keep holding until next event will determine a transition to the next
snapshot. In other words, the agent understands the world only in terms of the events that it
perceives. Therefore we can define a state si as</p>
      <p>si = "iAg = hHi; Pi; Mii:
that is, a state is taken to be the snapshot at stage i of the evolutionary semantics of the
agent.</p>
      <p>In model-checking, the aim is to establish if some LTL formula Op ' or ' Op
(where Op can be, for instance, N for “never”, E for “eventually”, etc.) can be
established to be true, given a description of the system at hand from which the system
evolution can be somehow elicited. In order to cope with the many cases where this
evolution cannot be fully foreseen, we propose to exploit temporal logic operators in
a different way than before, so as to take into account the events that have happened
already and those that are expected to happen or not to happen in the future and that are
relevant to the property that we intend to check.</p>
      <sec id="sec-3-1">
        <title>Definition 3 (Evolutionary LTL Expressions). Let be a temporal logic expression</title>
        <p>of the form Op ' if operator Op is unary or ' Op if operator Op is binary, where</p>
        <sec id="sec-3-1-1">
          <title>Op can be an interval operator Opz;x. The evolutionary version of , that we will call</title>
          <p>Evolutionary LTL Expression, is of the form</p>
        </sec>
        <sec id="sec-3-1-2">
          <title>The state until which is required to hold depends upon the current state sn and the</title>
          <p>operator Op occurring in with the following special cases.</p>
          <p>– contains an interval operator Opz;x: in this case, x is the state until which is
required to hold;
– one of the Ji’s happens at state sw, w &lt; x: then, is not required to hold after sw.
Notice that both the Fi’s and the Ji’s are optional Notice also that, in general, we cannot
foresee when (and in which order) the expected relevant events Fi’s will happen.</p>
          <p>
            In many practical cases, we are unable to provide a full sequence of the expected
events, and in particular to be aware of how many times they will occur. Sometimes, we
will be interested in specifying the (partial) order in which they should occur. Thus, in
the above definition, to be able to indicate the sets of past and future events in a more
flexible way we admit in part the syntax of regular expressions [
            <xref ref-type="bibr" rid="ref12">12</xref>
            ]. We also extend
this syntax, in order to specify a partial order among events.
          </p>
        </sec>
        <sec id="sec-3-1-3">
          <title>Definition 4. If E is an event, as customary in regular expressions E will indicate</title>
          <p>zero or more occurrences of E, and E+ one or more occurrences. Given events E1 and</p>
        </sec>
        <sec id="sec-3-1-4">
          <title>E2, by E1 E2 we mean that E1 must occur before E2 and by E1 E2 we mean</title>
          <p>that E1 must occur immediately before E2 (i.e., the two events must be consecutive).</p>
        </sec>
        <sec id="sec-3-1-5">
          <title>Wild-card X, standing for any event, can be used.</title>
          <p>For instance, E1+ X E2; E3 X E4 means that, after a certain (non-zero)
number of occurrences of E1 and, possibly, of some unknown event X, E2 and E3 can
occur in any order, immediately followed by some unknown event X and, immediately
afterwards, by E4. Notice that, for an agent, an event “occurs” when the agent perceives
it. This is only partially related to when events actually happen in the environment
where the agent is situated. In fact, the order of perceptions can be influenced by many
factors. However, either events are somehow time-stamped (in a reliable way) whenever
they happen so as to certify the exact time of their origin (as sometimes it may be the
case), or an agent must rely on its own subjective experience.</p>
          <p>Evolutionary LTL Expressions are easily given a semantics in the context of the
Evolutionary Semantics of an agent. Therefore, a given Evolutionary LTL Expression
can be evaluated w.r.t. a state, i.e. (as seen above), a snapshot "iAg and will hold
whenever Hi encompasses the sequence of events that have been supposed to have occurred
(i.e., they occur in Hi in the given order) and holds (i.e., i belongs to the given
interval and the formula is true w.r.t. i). According to agent’s activities the agent will
evolve to a new snapshot, in particular when a new event happens, either expected or
unwanted. In the new snapshot, the given expression can be re-evaluated. This
constitutes a “punctual” evaluation of the expression. An expression involving Opz;x can be
finally deemed to hold whenever either the interval has expired and has been true in
all points, or an unwanted event (one of the Jis) has occurred. Instead, an expression
can be deemed not to hold (or, as we often say, to be violated as far as it expresses a
wished-for property) whenever is false in some point.</p>
          <p>In Definition 3 we do not require the EPi ’s, the Fi’s and the Ji’s to be ground terms.
Instead, we admit each of them to contain variables if we are not interested in precisely
specifying some of their parameters. For instance, the expression consumeA+(r; Q)
(where postfix A as specified before indicates an action) stands for a sequence of events
where the action of consuming (some resource r) occurs at least once. Each action
will refer to an unspecified quantity Q. All variables occurring in evolutionary LTL
expressions are implicitly universally quantified, as customary in datalog- and
prologlike logic languages. An evolutionary LTL expression could be for instance (where N
stands for the LTL operator “never”):</p>
          <p>supplyP +(r; s) : N (quantity (r; V ); V &lt; th) :: consumeA+(r; Q)
stating that, after having provided a supply of resource r for a certain total quantity, the
agent is expected to consume unknown quantities of the resource itself. The expression
defines a constraint requiring that the available quantity of resource r must remain over
a certain threshold th. Evolutionary LTL expressions are in fact supposed to act as
constraints to be verified at run-time whenever new events are perceived. Notice in fact
that the “supply” event is supposed to occur at least once, possibly an unlimited number
of times. Interval-LTL formula = N (quantity (r; V ); V &lt; th) will be (re-)evaluated
after each occurrence. A violation will happen whenever does not hold.</p>
          <p>As another example, consider the following expression stating that, after a car has
been submitted to a checkup, it is assumed to work properly for (at least) six months,
even in case of (repeated) long trips, unless an accident occurs.</p>
          <p>checkupP (Car) : t1 : Gt1;t1+6monthswork ok(Car) :: long trip+(Car) :::
accident (Car)</p>
          <p>In the above example we have used the operator Gt1;t2, t2 = t1 + 6months which
is an interval LTL operator, G standing for “always”.</p>
          <p>
            We may notice the similarity between evolutionary LTL expressions and
eventcalculus formulations. The Event Calculus has been proposed by Kowalski and Sergot
[
            <xref ref-type="bibr" rid="ref13">13</xref>
            ] as a system for reasoning about time and actions in the framework of Logic
Programming. The essential idea is to have terms, called fluents, which are names
of time-dependent relations. Kowalski and Sergot write holds(r(x; y); t) which is
understood as “fluent r(x; y) is true at time t”. Take for instance the default inertia law,
stating when fluent f holds, formulated in the event calculus as follows:
holds(f; t)
happens(e); initiates(e; f ); date(e; ts);
ts &lt; t; not clipped(ts; f; t)
The analogy consists in the fact that, in the above LTL expression, past event
checkupP (Car) : t1 initiates a fluent which is actually an interval LTL expression,
namely Gt1;t1+6monthswork ok(Car), which would be “clipped” by accident (Car),
where a fluent which is clipped does not hold any longer. The evolutionary LTL
expression contains an element which constitutes an addition w.r.t. the event calculus
formulation: in fact, long trip+(Car) represents a sequence of events that is expected, but
by which the fluent should not be clipped if everything works as expected.
          </p>
          <p>In our opinion, evolutionary LTL expressions might in perspective be considered as
a useful programming construct in datalog and prolog (and their extensions). In fact,
also by means of interval LTL operators, propositions holding over intervals in a
dynamic setting can be expressed in a direct and compact way. Below we state when an
evolutionary LTL expression is defined to hold.</p>
          <p>Definition 5. An evolutionary LTL expression E , of the form
holds in state si whenever (i) some of the EP1 ; : : : ; EPl has happened, some (or none)
of the F1; : : : ; Fm has happened, none of the J1; : : : ; Jr has happened, and holds or
(ii) some of the J1; : : : ; Jr has happened.</p>
          <p>As said before, whenever an unwanted event (one of the Jis) should happen, is not
required to hold any longer (though it might). The proposition below formally allows
for dynamic run-time checking of evolutionary LTL expressions. In fact, it states that,
if a given expression holds in a certain state and is supposed to keep holding after the
first expected event has happened, then checking this expression amounts to checking
the modified expression where: (i) the occurred event has become a past event, and (ii)
subsequent events are still expected.
fEP1 ; : : : ; EPl ; FiP g :
holds iff EFi holds.</p>
          <p>
            Proposition 1. Given evolutionary LTL expression E = fEP1 ; : : : ; EPl g : :: F :::
J , where F = fF1; : : : ; Fmg and J is the list of unexpected events, assume that E
holds at state sn and that it still holds after the occurrence of event Fi 2 F at state sv
(v n), and that none of the events in J has happened. Let F1 = F n Fi. Given EFi =
:: F1 ::: J we have that for every state sw with (w v) E
In prior work (see e.g., [
            <xref ref-type="bibr" rid="ref11 ref4">4,11</xref>
            ]), we introduced temporal logic rules with repair, where
actions could be specified in order to cope with unwanted situations. We extend this
approach to the present work. We distinguish between two cases: in the former, none of
the unwanted events has happened, and nevertheless the inner interval LTL formula
does not hold; the latter, where does not hold because some of the unwanted events has
occurred (in this case however, according to previous definitions the overall expression
still holds).
          </p>
          <p>Definition 6. An evolutionary LTL expression E , of the form
is violated in state si whenever some of the EP1 ; : : : ; EPl has happened, some (or none)
of the F1; : : : ; Fm has happened, none of the J1; : : : ; Jr has happened, and does not
hold.</p>
          <p>Definition 7. An evolutionary LTL expression E , of the form
is broken in state si whenever some of the EP1 ; : : : ; EPl has happened, some (or none)
of the F1; : : : ; Fm has happened, some of the J1; : : : ; Jr has happened, and does not
hold.</p>
          <p>Whenever an evolutionary LTL expression is either violated or broken, a repair can be
attempted with the aim of recovering the agent’s state. LTL expressions will be “hosted”
in some logic agent-oriented programming language L. The repairs will be program
fragments written in L to be executed upon violations.</p>
          <p>Definition 8. An evolutionary LTL expression with repair E R is of the form:</p>
          <p>E jR1 jjR2
where E is an evolutionary LTL expression adopted in a language L, and R1; R2 are
program fragments written in L. R1 will be executed whenever F R is violated, and R2
will be executed whenever F R is broken.</p>
          <p>Going back to the example of the car, let us assume that, if before six months after a
checkup we have a malfunctioning, then one is entitled to get free assistance; in case of
an accident instead, one has (say) to call the police. Again, let’s assume that postfix ’A’
indicates actions.</p>
          <p>checkupP (Car) : t1 : Gt1;t1+6monthswork ok(Car) :: long trip+(Car) :::
accident (Car) j call f ree assistanceA(Car; Address) jj call policeA(Address)
Let us now assume that language L provides distinguished preconditions to actions,
i.e., distinguished predicates defining preconditions that are implicitly added to every
action. Let us assume that prevent (Action), whenever true, prevents an action from
being performed, and allow (Action; Condition) allows an action to be performed only
if the specified condition holds2. Then, we assume that an action can be performed only
if not prevented and allowed.</p>
          <p>The evolutionary LTL expression with improvement listed below states that no more
consumption can take place if the available quantity of resource r is scarce.
supplyP +(r; s) : N (quantity (r; V ); V &lt; th) :: consumeA+(r; Q) j
prevent (consumeA(r; Q))
We might instead adopt another (softer) constraint, that forces the agent to limit
consumption to small quantities (say less than quantity q) if it is approaching the threshold
(say that the remaining quantity is th + f , for some f ).</p>
          <p>supplyP +(r; s) : N (quantity (r; V ); V &lt; th + f ) :: consumeA+(r; Q) j
allow (consumeA(r; Q); Q &lt; q)
4</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Related Work</title>
      <p>
        Verification of agent programs can to some extent be performed statically (i.e., prior
to agent activation), by checking the system against any possible input
configuration, sequence of external events, etc., Static verification can be accomplished through
model-checking techniques [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], abstract interpretation [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] or theorem proving (the
latter two not commented here). Although model-checking techniques have been
originally adopted for testing hardware devices, their application to software systems and
2 These are supposed to be embedded procedures implemented within the interpreter of the
language at hand to achieve the desired behavior of allowing/disallowing action execution.
protocols is constantly growing [
        <xref ref-type="bibr" rid="ref15 ref16">15,16</xref>
        ], and there have been a number of attempts to
overcome some known limitations of this approach. The application of such techniques
to the verification of agents is still limited by two fundamental problems. The first
problem arises from the marked differences between the languages used for the definition of
agents and those needed by verifiers (usually ad-hoc, tool-specific languages). Indeed,
to apply static verification, currently an agent has to be remodeled in another language:
this task is usually performed manually, thus it requires an advanced expertise and gives
no guarantee on the correctness and coherence of the new model. In many cases (e.g.,
[
        <xref ref-type="bibr" rid="ref16 ref17">16,17</xref>
        ]) the current research in this field is still focused on the problem of defining a
suitable language that can be used to easily and/or automatically reformulate an agent
in order to verify it through general model-checking algorithms.
      </p>
      <p>
        However, the literature reports fully-implemented promising static verification
frameworks (e.g., [
        <xref ref-type="bibr" rid="ref18 ref19 ref20">18,19,20</xref>
        ]). [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ] is an extension of the SCIFF proof procedure to
prove system properties at design time. [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ] describes a technique to model-check
agents defined by means of a subset of the AgentSpeak language, which can be
automatically translated into PROMELA and Java and then verified by the model-checkers
SPIN [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] and Java PathFinder [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ], respectively, against a set of constraints which,
in turn, are translated into LTL from a source language which is a simplified version
of the BDI logic. [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ] describes an approach that exploits bounded symbolic
modelchecking, in particular the tool MCMAS, to check agents and MAS (Multi-Agent
Systems) against formulas expressed in the CTLK temporal logic. The second obstacle to
the application of model-checking to agents and MAS is represented by the dynamic
nature of agents, which are able to learn and self-modify over their life cycle, and by
the extreme variability of the environment in which agents move. These aspects make
it difficult modeling agents through finite-state languages, which are typical of many
model-checkers (e.g., [
        <xref ref-type="bibr" rid="ref15 ref22">15,22</xref>
        ]), and dramatically increase the resources (time, space)
required for their verification (state explosion). This can be seen as a motivation for our
approach, which defers at least part of the verification activity (namely, the part more
dependent upon agent evolution) to run-time.
      </p>
      <p>
        The issue of run-time verification has been considered in recent work. The SCIFF
proof procedure, based on abduction, allows for checking the compliance of a narrative
of events w.r.t. a specification, by matching events w.r.t. expectations, ie., by performing
a form of run-time monitoring (see, e.g., [
        <xref ref-type="bibr" rid="ref23">23</xref>
        ] and the references therein). [
        <xref ref-type="bibr" rid="ref24">24</xref>
        ] proposes
a reactive event calculus to check social commitments, i.e., commitments made from an
agent to another agent to bring about a certain property.
5
      </p>
    </sec>
    <sec id="sec-5">
      <title>Experimental Evaluation and Discussion</title>
      <p>We have implemented and we have been experimenting the proposed approach
within the DALI multi-agent system (the DALI interpreter is freely available at
http://www.di.univaq.it/stefcost/Sito-Web-DALI/WEB-DALI/). In this system, a
frequency can be associated to each constraint by means of directives (a default frequency
is otherwise provided). One can also establish since when and until when a constraint
has to be checked.</p>
      <p>An important aspect to be experimentally verified is whether constraints actually
empower the agent ability to cope with events without introducing too much
overhead, that would lead an agent to that “brittleness” that it is so important to avoid.
For performing dynamic checking without specific constructs, one has build, within an
agent program, a suitable cyclic structure to perform the needed checks. Our solution
therefore, by exploiting the underlying basic cycle of the interpreter, avoids adding this
further layer. In this sense, the overhead is in any case alleviated. Nonetheless, a
crucial point to consider is that one, when adding new constraints and/or increasing the
frequency of checks, has to experimentally verify that the addition/increment is
“sustainable” by the interpreter. The experimental evaluation is in fact mandatory under this
respect.</p>
      <p>In the Appendix we present a basic experiment. Namely, we have implemented an
agent that manages a FIFO queue, thus accepting requests of pushing and popping
elements on/from the queue. This example is in our opinion significant because it models
in an abstract way the very general and widely used architecture where an agent
provides a service to a number of consumer. The instance size of our experiments (set by
the user) coincides with the number of elements that are pushed/popped (at most 500).
We establish the constraint, represented below in our formalism, that the queue must
not contain any duplicated elements e1 and e2. The possible actions are pushA(V; Q)
that inserts a generic value V in the queue (as the e-th elements) and popA(Q) that
extracts the oldest element from the queue (pushP (V; Q) is the past event recording
this action having been performed). The constraint considers an unknown number of
pushing actions happened in the past (and thus now recorded as past events) and can
foresee an unknown number of popping actions.</p>
      <p>pushP +(V; Q) : N (in queue(e1 ; V ); in queue(e2 ; V ); e1 6= e2 ) :: popA+(Q)</p>
      <p>In particular, in the Appendix we present in Section A the pure prolog code, and
in Section B the DALI code. Then, in Figure 1 and Figure ?? we show the execution
time of the two solutions at the growth of the instance size. In Figure ?? we show
the difference in percentage between the execution times. It is possible to identify an
initial “unstable” stage and then a trend that further consolidates with the growth of the
instance size. In fact, what we can conclude beyond any doubt is that, when the number
of events that we consider is small, the two solutions are more or less equivalent, the
prolog one a bit better as it involves no overhead (while the DALI implementation
of events management necessarily involves some). But, as soon as the instance size
grows, the DALI solution becomes better and better in a very significant way, despite
the overhead of the implementation.
6</p>
    </sec>
    <sec id="sec-6">
      <title>Concluding Remarks</title>
      <p>In this paper, we have presented an approach to detection and correction of run-time
behavioral anomalies by using dynamic constraints. The runtime observation of actual
anomalous behavior with dynamic possible correction of detected problems, as opposed
to full prior classical program verification and validation on all inputs, can be a key
to bringing down the well-known computational burden of the agent behavior
assurance problem. Suitable experiments, performed in the DALI language, have shown that
the proposed approach is computationally effective, and constitutes and improvement
also in terms of efficiency. However, as it happens in all the environments where static
and dynamic checks are equally applicable, none of the two forms of verification may
substitute the other: indeed, the only possible solution is given by a synergy aimed at
creating an integrated, reliable and lightweight verification environment.
A</p>
    </sec>
    <sec id="sec-7">
      <title>Pure Prolog Code</title>
      <p>Below we report the code of the version of the Queue agent implemented in DALI (by
Alessio Paolucci, that we thank), but using only prolog constructs. The single DALI
feature that is exploited is related to the activation of the agent by means of a message. The
test agent in fact gets active and performs a test session whenever it receives from the
user a message with content run pure test(N um Items) where N um items
specifies the number of elements to be pushed/popped on/from the queue.</p>
      <p>When the agent receives event run pure test it reacts, thus invoking the
run pure testing goal with Times (=Size) as parameter, which starts the ’pushing’
phase. The pushing(T imes) goal pushes an item (through push item subgoal), when
T imes &gt; 0, otherwise it ends.</p>
      <p>push item as first step retrieves the data structure pqueue(Q). Then, it randomly
generates an item, and checks if that item is already present in the queue. If so, then
push item fails, and this (and only this) item pushing is skipped. If the new item
is not in the queue, then it is added in the head. The old queue is removed from
memory (retract(pqueue(Q))), and the new one is stored in the knowledge base
(assert(pqueue(N Q)). popping is then invoked, to perform items removal from the
queue. It makes use of pop item, a goal that retrieves and unifies the queue through
clause(pqueue(Q); ), and the extracts the head of the queue Q. After the ’popping’
phase, the test ends.
run pure testE(T imes):&gt; run pure testing(T imes):
run pure testing(T imes):- pretty start; now(StartT ime); T 1 is T imes + 1;
nl; write(0P U SHIN G:::0); nl; pushing(T 1);
nl; write(0P OP P IN G:::0); nl; popping(T 1);
now(EndT ime); T estT iming is EndT ime StartT ime;
nl; write(0T ime :0); write(T estT iming); nl; pretty end:
pushing(0):
pushing(T
imes):push
item:popping(0):
popping(T imes):- pop item; T 1 is T imes 1; popping(T 1):
pop item:- clause(pqueue(Q); ); nl; write(0P opping :0);</p>
      <p>Q = [HjT ]; write(H); retract(pqueue(Q)); assert(pqueue(T ));
nl; write(0Queue :0); write(T ); nl:
pop item:- assert(pqueue([])):
pretty start:- nl; write(0Start testing:::0); nl:
pretty end:- nl; write(0T est f inished:::0); nl:
B</p>
    </sec>
    <sec id="sec-8">
      <title>DALI Code</title>
      <p>The DALI implementation makes use of DALI advanced features, and in particular
exploits actions, and the ability to remember what happened in the past (past actions).
Basically, the power of the DALI infrastructure made us able to write the program
in a very comfortable manner: each pushing is an action, so every time the action is
performed, the DALI engine takes care, for the future, of this action as a past event.
We exploited this feature so as to perform pushing actions in the present. Then, we use
parameters of the action to take care of the items that have been pushed and of the order,
through an index. When a pop needs to be performed, we use the power of DALI past
events to retrieve actions previously performed, and thus retrieve the correct item from
the head of the queue, in a very elegant manner. The DALI implementation allows us to
concentrate on the problem, without focusing that much on the data structure, in a very
strict declarative fashion.</p>
      <p>Below we report the code of the proper version of the Queue agent implemented
in DALI. The test agent gets active and performs a test session whenever it receives
from the user a message with content run dali test(N um Items) where N um items
specifies the number of elements to be pushed and popped on the queue.
run dali testE(T imes):&gt; dali test startA; run dali testing(T imes):
run dali testing(T imes):&lt; dali test startP:
run dali testing(T imes):- dali start pushingA;
dali pushing(T imes); dali end pushingA;
dali start popA; dali popping(T imes); dali end popA;
dali end testingA:
dali pushing(0):- true:
dali pushing(T imes):- dali remember(T imes); T 1 is T imes
dali remember(T imes):- random(1; 300; Item);
not(clause(do action(dali push queue(Item; ); ); ));
get push index(P I);
dali push queueA(Item; P I):
get push index(I1):- clause(push index(Index); );</p>
      <p>I1 is Index + 1;
retract(push index(Index));
assert(push index(I1)):
get push index(Index):- assert(push index(1));</p>
      <p>Index = 1:
1; dali pushing(T 1):
C</p>
    </sec>
    <sec id="sec-9">
      <title>Comparison</title>
      <p>In Figure 1 below we show the execution time of the two solutions reported in previous
sections at the growth of the instance size. It can be observed that as the instance size
grows, the DALI solution becomes significantly better.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Costantini</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tocchio</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>About declarative semantics of logic-based agent languages</article-title>
          . In Baldoni,
          <string-name>
            <given-names>M.</given-names>
            ,
            <surname>Torroni</surname>
          </string-name>
          , P., eds.:
          <source>Declarative Agent Languages and Technologies. LNAI 3904</source>
          . Springer-Verlag (
          <year>2006</year>
          )
          <fpage>106</fpage>
          -
          <lpage>123</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Costantini</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          :
          <article-title>Defining and maintaining agent's experience in logical agents</article-title>
          .
          <source>In: Informal Proc. of the LPMAS (Logic Programming for Multi-Agent Systems) Workshop at ICLP</source>
          <year>2011</year>
          ,
          <article-title>and</article-title>
          CORR Proceedings of LANMR 2011, Latin-American Conference on
          <source>NonMonotonic Reasoning</source>
          . (
          <year>2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Costantini</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tocchio</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Toni</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tsintza</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>A multi-layered general agent model</article-title>
          .
          <source>In: AI*IA</source>
          <year>2007</year>
          :
          <article-title>Artificial Intelligence and Human-Oriented Computing, 10th Congress of the Italian Association for Artificial Intelligence</article-title>
          .
          <source>LNCS 4733</source>
          , Springer-Verlag, Berlin (
          <year>2007</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Costantini</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Dell'Acqua</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Pereira</surname>
            ,
            <given-names>L.M.:</given-names>
          </string-name>
          <article-title>A multi-layer framework for evolving and learning agents</article-title>
          . In M. T.
          <string-name>
            <surname>Cox</surname>
            ,
            <given-names>A</given-names>
          </string-name>
          .R., ed.
          <source>: Proceedings of Metareasoning: Thinking about thinking workshop at AAAI</source>
          <year>2008</year>
          , Chicago, USA. (
          <year>2008</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5. Fisher,
          <string-name>
            <given-names>M.</given-names>
            ,
            <surname>Bordini</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.H.</given-names>
            ,
            <surname>Hirsch</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            ,
            <surname>Torroni</surname>
          </string-name>
          ,
          <string-name>
            <surname>P.</surname>
          </string-name>
          :
          <article-title>Computational logics and agents: a road map of current technologies and future trends</article-title>
          .
          <source>Computational Intelligence Journal</source>
          <volume>23</volume>
          (
          <issue>1</issue>
          ) (
          <year>2007</year>
          )
          <fpage>61</fpage>
          -
          <lpage>91</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Clarke</surname>
            ,
            <given-names>E.M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lerda</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          :
          <article-title>Model checking: Software and beyond</article-title>
          .
          <source>Journal of Universal Computer Science</source>
          <volume>13</volume>
          (
          <issue>5</issue>
          ) (
          <year>2007</year>
          )
          <fpage>639</fpage>
          -
          <lpage>649</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Costantini</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tocchio</surname>
            ,
            <given-names>A.:</given-names>
          </string-name>
          <article-title>A logic programming language for multi-agent systems</article-title>
          .
          <source>In: Logics in Artificial Intelligence, Proc. of the 8th Europ. Conf.,JELIA 2002. LNAI 2424</source>
          , Springer-Verlag, Berlin (
          <year>2002</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Costantini</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tocchio</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>The DALI logic programming agent-oriented language</article-title>
          .
          <source>In: Logics in Artificial Intelligence, Proc. of the 9th European Conference, Jelia 2004. LNAI 3229</source>
          , Springer-Verlag, Berlin (
          <year>2004</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Pnueli</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>The temporal logic of programs</article-title>
          .
          <source>In: Proc. of FOCS, 18th Annual Symposium on Foundations of Computer Science</source>
          , IEEE (
          <year>1977</year>
          )
          <fpage>46</fpage>
          -
          <lpage>57</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Emerson</surname>
            ,
            <given-names>E.A.</given-names>
          </string-name>
          :
          <article-title>Temporal and modal logic</article-title>
          . In van Leeuwen, J., ed.:
          <source>Handbook of Theoretical Computer Science</source>
          , vol. B. MIT Press (
          <year>1990</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Costantini</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Dell'Acqua</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Pereira</surname>
            ,
            <given-names>L.M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tsintza</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Runtime verification of agent properties</article-title>
          .
          <source>In: Proc. of the Int. Conf. on Applications of Declarative Programming and Knowledge Management (INAP09)</source>
          . (
          <year>2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Hopcroft</surname>
            ,
            <given-names>J.E.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Motwani</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ullman</surname>
            ,
            <given-names>J.D.</given-names>
          </string-name>
          :
          <article-title>Introduction to Automata Theory, Languages, and Computation (3rd Edition)</article-title>
          .
          <article-title>Addison-Wesley Longman Publishing Co</article-title>
          ., Inc., Boston, MA, USA (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Kowalski</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sergot</surname>
            ,
            <given-names>M.:</given-names>
          </string-name>
          <article-title>A logic-based calculus of events</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Cousot</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Cousot</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          :
          <article-title>Abstract interpretation: a unified lattice model for static analysis of programs by construction or approximation of fixpoints</article-title>
          .
          <source>In: Conference Record of the Fourth Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</source>
          , Los Angeles, California, ACM Press, New York, NY (
          <year>1977</year>
          )
          <fpage>238</fpage>
          -
          <lpage>252</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Holzmann</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          :
          <article-title>The model checker spin</article-title>
          .
          <source>IEEE Transactions on Software Engineering (23)</source>
          (
          <volume>199</volume>
          )
          <fpage>279</fpage>
          -
          <lpage>295</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <surname>Bourahla</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Benmohamed</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Model checking multi-agent systems</article-title>
          .
          <source>Informatica (Slovenia)</source>
          <volume>29</volume>
          (
          <issue>2</issue>
          ) (
          <year>2005</year>
          )
          <fpage>189</fpage>
          -
          <lpage>198</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Walton</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          :
          <article-title>Verifiable agent dialogues</article-title>
          .
          <source>J. Applied Logic</source>
          <volume>5</volume>
          (
          <issue>2</issue>
          ) (
          <year>2007</year>
          )
          <fpage>197</fpage>
          -
          <lpage>213</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <string-name>
            <surname>Bordini</surname>
            , R., Fisher,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Visser</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wooldridge</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Verifying multi-agent programs by model checking</article-title>
          .
          <source>Autonomous Agents and Multi-Agent Systems 12(2)</source>
          (
          <year>2006</year>
          )
          <fpage>239</fpage>
          -
          <lpage>256</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          19.
          <string-name>
            <surname>Jones</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lomuscio</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Distributed bdd-based bmc for the verification of multi-agent systems</article-title>
          .
          <source>In: Proc. of the 9th Int. Conf. on Autonomous Agents and Multiagent Systems (AAMAS</source>
          <year>2010</year>
          ).
          <article-title>(</article-title>
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          20.
          <string-name>
            <surname>Montali</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Alberti</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chesani</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gavanelli</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lamma</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Mello</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Torroni</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Verification from declarative specifications using logic programming</article-title>
          .
          <source>In: 24th Int. Conf. on Logic Programming (ICLP'08). LNCS 5366</source>
          , Springer Verlag (
          <year>December 2008</year>
          )
          <fpage>440</fpage>
          -
          <lpage>454</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          21.
          <string-name>
            <surname>Visser</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Havelund</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Brat</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Park</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lerda</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          :
          <article-title>Model checking programs</article-title>
          .
          <source>Autom. Softw. Eng.</source>
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          22.
          <string-name>
            <surname>Dill</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Drexler</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hu</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Yang</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          :
          <article-title>Protocol verification as a hardware design aid</article-title>
          .
          <source>In: Proc. of IEEE Int. Conf. on Computer Design: VLSI in Computers and Processors</source>
          , IEEE Computer Society Press (
          <year>1992</year>
          )
          <fpage>522</fpage>
          -
          <lpage>525</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          23.
          <string-name>
            <surname>Montali</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chesani</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Mello</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Torroni</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Modeling and verifying business processes and choreographies through the abductive proof procedure sciff and its extensions</article-title>
          .
          <source>Intelligenza Artificiale, Intl. J. of the Italian Association AI*IA</source>
          <volume>5</volume>
          (
          <issue>1</issue>
          ) (
          <year>2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          24.
          <string-name>
            <surname>Torroni</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chesani</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Mello</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Montali</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Social commitments in time: Satisfied or compensated</article-title>
          .
          <source>In: DALT</source>
          . Volume
          <volume>5948</volume>
          of Lecture Notes in Computer Science., Springer (
          <year>2009</year>
          )
          <fpage>228</fpage>
          -
          <lpage>243</lpage>
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>