<!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>Incorporating BDI-Agent Concepts into Object-Oriented Programming</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Berndt Muller</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Jack Betts</string-name>
          <email>jack.bettsg@southwales.ac.uk</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>University of South Wales</institution>
        </aff>
      </contrib-group>
      <abstract>
        <p>In 1987 Bratman introduced the model of reasoning on the grounds of beliefs, desires, and intentions (BDI) to mimic important aspects of human reasoning. This view has since been adopted as one of the major paradigms in agent-oriented modelling and agent programming. A number of dedicated agent programming languages have been developed and some of them are successfully used in niche areas. Despite the common BDI foundation, little work has been undertaken in unifying APLs or making them interoperable. There has been much debate as to why agent and multi-agent programming has not had more of an impact on software development in general. To overcome the apparent neglect of agent-oriented programming, we discuss some issues and develop solutions for incorporating agent-concepts in 'traditional' programminglanguage projects. By traditional we mean the well-established objectoriented programming languages that are mostly evolved as extensions to procedural programming languages. The examples we give use C++ but the techniques are not limited to this programming language.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>The development of an agents' deliberation cycle in a general
programming language usually requires starting from a blank page. This
`reinventing of the wheel' not only increases the time taken to complete a
system it also leads to the system having to be thoroughly tested before
it can be deployed. Once the agent system has been developed as a
bespoke system [10, p.234] attempts at implementing in other environments
may prove to be unsuccessful. The area of Software Engineering is still
learning from Hardware Engineering methodology in the way products
are designed and developed. When hardware is being designed and
engineered, capacitors and integrated circuit boards are not reinvented for
every project. Instead they use readily available components to develop
the hardware. These components have been tested and are known to work.
These commonly available components are referred to as \o the shelf"
components.</p>
      <p>\In the hardware world, component reuse is a natural part of the
engineering process. In the software world, it is something that has only begun
to be achieved on a broad scale." [9, p. 7]</p>
      <p>
        Wooldridge also states that many agent systems projects fail \because
basic software engineering good practice was ignored." [10, p.234] Agent
systems development has not yet achieved component based design as no
`o the shelf' agent components are available. The LAF (Layered Agent
Framework) Project is one attempt at providing a component based
approach to developing in agent in the form of layers and modules [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. The
possibility of agent developers being able to nd `Deliberation Modules'
or `Knowledge Storage' code and have it integrate with their LAF based
project has the potential to allow rapid development and deployment of
agent systems. For this paper we will focus on an agents' deliberation cycle
to demonstrate how well established component based design could assist
agent development. We have chosen the C++ language in our example
due to the object orientated features it provides such as polymorphism,
inheritance and abstraction.
2
      </p>
    </sec>
    <sec id="sec-2">
      <title>The BDI Paradigm</title>
      <p>
        In 1987 Bratman [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] introduced the model of reasoning on the grounds
of beliefs, desires, and intentions (BDI) to mimic important aspects of
human reasoning. This view has since been adopted as one of the major
paradigms in agent-oriented modelling and agent programming. A
number of dedicated agent programming languages have been developed [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]
and some of them are successfully used in niche areas. Despite the
common BDI foundation, little work has been undertaken in unifying APLs
or making them interoperable [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. There has been much debate as to why
agent and multi-agent programming has not had more of an impact on
software development in general (Dagstuhl Seminar \Engineering
MultiAgent Systems", 2012).
      </p>
      <p>To overcome the apparent neglect of agent-oriented programming,
we discuss some issues and develop solutions for incorporating
agentconcepts in 'traditional' programming-language projects. By traditional
we mean the well-established object-oriented programming languages that
are mostly evolved as extensions to procedural programming languages.
The examples we give use C++ but the techniques are not limited to this
programming language.
2.1</p>
      <sec id="sec-2-1">
        <title>Beliefs</title>
        <p>An agent's beliefs represent the subset of information about the universe
of discourse that the agent has acquired and has adopted as their
'knowledge'. Beliefs are inherently subjective to a particular agent and there is
no guarantee that the beliefs are all true or accurate. This might stem
from information that is out of date but remains a belief since there has
been no perceived update since the information gained belief status. To
keep beliefs accurate, the agent has to engage in perception of its
environment.</p>
        <p>Mathematically, beliefs are usually represented by a set of predicates
about instances of the universe. A belief set is a nite set of predicate
schemas that can denote an in nite set of ground terms. We denote a
belief set by</p>
        <p>B = fb1; : : : ; bng
where n is a non-negative integer and bi with i 2 f0; : : : ; ng are predicate
schemas.</p>
        <p>In programming, apart from the the intuitive representation of a belief
set as a set data structure in a programming language, there are reasons
to consider external databases for the storage and manipulation of beliefs.
From a programmer's perspective, the actual implementation should not
make any di erence to the design and code of the actual agent program.
We encapsulate these low-level design decisions in building blocks that
act as interfaces.
2.2</p>
      </sec>
      <sec id="sec-2-2">
        <title>Desires</title>
        <p>Philosophically, an agent's desires are aspects of the state of the universe
that the agent would like to see accomplished. A desire can in uence the
agent's actions, but is not in itself a set of actions. There is no requirement
that all desires can be accomplished at the same time, indeed it might be
the case that none of the desires can be brought about. An agent might
have to choose which of their desires to pursue when faced with mutually
incompatible desires.</p>
        <p>Like beliefs, Desires would mathematically be given as a set of
predicates describing the 'desired' properties within the universe.</p>
        <p>D = fd1; : : : ; bmg
where n is a non-negative integer and bi with i 2 f0; : : : ; mg are predicate
schemas.</p>
        <p>For programmer's, similar low-level options exists but should be oblique
at the agent level. Again, using building blocks for the reasoning can
allow the programmer to interact with interfaces hiding the actual data
structures.
2.3</p>
      </sec>
      <sec id="sec-2-3">
        <title>Intentions</title>
        <p>
          A non-idle agent will work towards some goals. The current goals are
determined by the intentions the agent has decided to work on. Execution
according to intentions can spawn new goals that will usually trigger the
creation of further intentions. Intentions exist concurrently and can be
created or removed during the deliberation process. Intentions are very
closely connected to plans and as such are subject to change. Whereas [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
considers intentions to \resist reconsideration and in that sense have
inertia", [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ] de nes intentions in terms of beliefs and desires, and . This view
is taken from decision theoretic planning (DTP) and is essential for
creating resource-bounded agents. Resource-boundedness is a requirement for
tractable programming and veri cation as shown in [
          <xref ref-type="bibr" rid="ref6 ref7">6, 7</xref>
          ].1
        </p>
        <p>
          Programmatically, for each intention, there will usually be an
intention stack that the agent has to work on sequentially. To guarantee an
acceptable run-time behaviour, the costs a plan in terms of all required
resources has to be taken into account both for the aim of achieving a
goal and for building the plan [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ].
2.4
        </p>
      </sec>
      <sec id="sec-2-4">
        <title>Updating the Sets</title>
        <p>Updating the sets, in particular the belief set, involves perception of
changes in the environment, execution of actions, and decision-making
about intensions. This process is usually performed in a so-called
deliberation cycle. Agent programming language interpreters are at the core
implementations of a working deliberation cycle, an example of which is
shown in Figure 1.</p>
        <p>Deliberation does not necessarily have to be carried out in the exact
sequence shown in Figure 1. E.g., the lack of an applicable plan would
lead to a `short cut' in the cycle. also, a permutation of the order of
actions/events might be desirable. Hence, in the next section we
propose re-usable building blocks for the construction of custom deliberation
cycles. These blocks can be plugged together by the programmer to
accommodate any particular needs.
1 Theoretically, intentions can be modi ed during the deliberation, but this is not
readily supported by most APLs.</p>
        <p>communi</p>
        <p>cate
perceive
environment
select
intention
handle top
of plan
calculate
applicable</p>
        <p>
          plans
select
plan
Before we can discuss how having agent software components would
bene t the agent development eld we must rst consider what is required
for this vision of agent components. This section lists some requirements
that must be met before the eld can begin to develop agent software
components.
Standardised APIs (Application Programming Interface [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]) are essential
for software components to achieve a high level of reusability. Standards
are also required, an example of such a standard is a component must
clearly state its behaviour. Another example is that all components must
fail gracefully without crashing the host system. However de ning these
APIs and component standards in full are far beyond the scope of this
paper and will require the support and collaborative e ort of the agent
systems community.
        </p>
      </sec>
      <sec id="sec-2-5">
        <title>Proof that a components works, and details on how it is to be used</title>
        <p>When a component is developed whether it a software or hardware
component, it is tested to check if it is ` t for purpose' [9, p.428]. When the
component is tested these results can be shared and thus more developers
will trust the component (assuming the component is open source). Once
a system has been developed using these components moving towards a
standard will become achievable.
3.3</p>
      </sec>
      <sec id="sec-2-6">
        <title>The APIs and any standards must be made free and available for all</title>
        <p>Any standards and APIs that are developed to enable agent software
components must be made freely available. Components that are
developed using these standards and APIs are not required to be made freely
available to the community unless the author allows this.
3.4</p>
      </sec>
      <sec id="sec-2-7">
        <title>Security and Integrity of Components</title>
        <p>All components that are made available (even through sale) must have a
form of digital checksum on the component to ensure data integrity. This
is just one measure that could be taken to combat tampering, in which a
component may be modi ed for malicious intent. The potential security
risk a component poses may be very real for certain agent systems,
especially if the application of this system is military use. Any component
must have some functionality to request access to elements of the host
system as well as a method in which the component can be tested in
isolation in order to monitor its activity.
4</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Using OOP to assist agents developers</title>
      <p>C++ provides many tools for Object Oriented Programming and Design.
We hope that such design practices will become commonplace within the
agent development community. Until then we will share how we have used
OOP to improve agent development within the LAF. For this paper, we
share the concept of Simplicity through hidden expected functionality.
4.1</p>
      <sec id="sec-3-1">
        <title>Simplicity through hidden expected functionality</title>
        <p>Hiding functionality from developers at rst would appear to be
counterintuitive in making a system easy to develop for. This holds true in most
scenarios where a developer may not be fully aware of what the system is
doing when parts of that systems functionality is hidden. In some
situations hiding expected functionality may make the system easier to work
with. What we mean by expected functionality is a certain behaviour
or aspect of a system that most, if not all, developers would implement
in a similar way and therefore be able to identify this aspect if seen
in another system. Functionality like ID number assignment and event
handling would be implemented by most developers in a similar fashion.
With LAF components these two examples of expected functionality are
dealt with in the background so that the developer better focus their time
on creating an agent rather than \laying the groundwork" so to speak.
Functionality that is required of a given class for it to work within the
LAF is implemented and when possible this functionality is automated.
A basic demonstration of this can be found within the process of creating
a temperature sensor within the LAF. A sensor requires the following
information to be valid in order to operate within the framework2:
{ ID Number</p>
        <p>Used for monitoring and debugging
{ Name</p>
        <p>Provides a human friendly identi er
{ Type of Sensor</p>
        <p>Allows categorisation of sensors and assumptions about the sensor
capabilities
{ Time of last update</p>
        <p>Used by the framework to detect non-responsive components
{ Sensor start time</p>
        <p>Used by the framework to monitor reliability and management
component stress</p>
        <p>Now for a developer to manage all of this data for each instance of
a sensor will likely add to the development time with this system. If 10
sensors needed to be created with all these variables set it would look
like:
1 time_t start_time = time ( 0 ) ;
2 std : : vector&lt;sensor&gt; sensorCollection ;
3 sensorClassification type = sensorClassification : :</p>
        <p>THERMAL_DETECTION ;
4 std : : string name = " Sensor " ;
5 f o r ( i n t i = 0 ; i &lt; 1 0 ; i++)f
6 std : : string sensorName = name ;
7 sensorName+=( ' 0 ' + i ) ;
8 sensorCollection . push_back ( sensor ( i , name , type ,
start_time ) ) ; g
2 This is for the current limited prototype and can easily be extended in future.</p>
        <p>One clear issue with this example code implementation of
instantiating sensors is that invalid values (such as a duplicate ID) can be passed to
the sensor. This could be done and without any safeguards implemented
against this could lead to the system behaving incorrectly or not
functioning at all. The developer would have to implement these safeguards
themselves which would require extra development time. Having to setup
and pass four arguments for each sensor can prove cumbersome when
compared to how the LAF allows sensor implementation.
1 std : : vector&lt;sensor&gt; sensorCollection ;
2 std : : string name = " Sensor " ;
3 f o r ( i n t i = 0 ; i &lt; 1 0 ; i++)f
4 std : : string sensorName = name ;
5 sensorName+=( ' 0 ' + i ) ;
6 sensorCollection . push_back ( TempSensor ( sensorName ) ) ; ) ; g</p>
        <p>Currently instantiating sensors within the LAF only requires a name
in the form of a string. This was achieved by having variables such as
ID and Type of sensor handled by the parent constructors of the sensor
hierarchy. Going from the base interface of ISensor to the sensor de nition
class TempSensor to nally the implementation of a TempSensor. Each step
completes more of the information required by the system. The previous
example were for comparison purposes, when looking at how a
temperature sensor (see Fig. 2) is added to a LAF based system we gain some
insight into how the expected functionality is hidden from the developer
while making development easier.
1 _pInternalTempSensor = std : : unique_ptr&lt;TempSensor &gt;(
2 new TempSensor ( " I n t e r n a l Temp Sensor 0001 " ) ) ;</p>
        <p>The code snippet above shows a unique_ptr of type TempSensor called
_pInternalTempSensor which is then assigned a new TempSensor. We are
using a smart pointer to assist with memory management. When looking
at the code for the constructor for the temperature sensor we begin to
see this hidden expected functionality. Here the constructor is not only
passing the sensor name to the sensor interface but also passing the sensor
classi cation for the sensor as THERMAL_DETECTION.
1 TempSensor ( c o n s t char ∗ sensorName )
2 : ISensor ( sensorName , THERMAL_DETECTION ) f temp =
6.0; g ;</p>
        <p>A developer would be required to create these sensor de nition classes
using the sensor interface provided by the LAF to access this functionality.</p>
        <p>At the sensor interface level we see the constructor lls in the last
pieces of information we need. An ID number is assigned to the sensor.
This ID number assignment is achieved through use of a private static
64bit integer stored within ISensor disallowing any objects but ISensor
from modifying the current ID counter.
1 ISensor ( c o n s t char ∗ sensorName , sensorClass</p>
        <p>Sensorclassifiction )
2 : _name ( sensorName ) , _ID ( IDCount++) , _classification (
sensorClassifiction ) f g ;</p>
        <p>The concept of Hidden Expected Functionality has be utilised within
the sensor implementation code to assist the developer. The addition of
new temperature sensors using this concept requires the assignment of
a name and nothing else, saving the developer time and reducing the
chance of an incomplete or invalid object. ID number, classi cation and
other system critical variables are instantiated within the sensor interface
and sensor de nition class.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>BDI Blocks for Custom Deliberation Cycles</title>
      <p>Moving forward with the idea of component based design we propose a
BDI module that comprises of components we label `blocks'. These blocks
represent the basic steps within a standard deliberation cycle within a
BDI based system. Containing them within blocks we believe will reduce
development time as blocks can be reused in other projects or even
removed. If an agent does not need to perceive in an advanced way ( lter
or sort incoming data) this step can be ignored and the raw data passed
onto the next step. We now list some of the blocks we are developing for
this component based BDI code. These blocks are subject to change in
terms of exact functionality and structure but the general descriptions
should remain the same.
The framework comprises the following blocks.</p>
      <p>Environment Perception Block: Handles how the agent will lter
perception data and store it. This block can also be con gured to
prioritise data or even apply some pre-processing to the data to reduce noise
before storage. This block generally passes feedback of the perceived
environment to the Intention Block.</p>
      <sec id="sec-4-1">
        <title>Communication and Agent Network Synchronisation Block:</title>
        <p>Handles how the agents will communicate with other agents and/or
devices. This block will also be tasked with what information the
agent shares on the network along with what information the agent
will take from the network.</p>
        <p>Intention Prioritisation and Selection Block: This block de nes how
the agent will select intentions based on perception feedback, this
includes prioritisation and intention con ict. An intention stack is then
created by the block in which highest priority intentions are at the
top and least important at the bottom. This block does not need to
be run every deliberation cycle and can be con gure to only run at
de ned intervals or for certain detected events (such as emergency
situations).</p>
      </sec>
      <sec id="sec-4-2">
        <title>Plan Processing and Selection Block: This block will not only be</title>
        <p>responsible for selecting the plan most appropriate for the selected
intention. This block will also monitor the progress of the plan,
selecting new plans if required. This block will also need to be aware of
when intentions changes and therefore select new plan(s). Intentions
are dealt with in a serial manner from highest priority rst.</p>
        <p>We aim to have it so blocks can be developed and tested in isolation to
the BDI module. This will be achieved through the use of C++ interface
classes dictating minimum functionality required of a block along with
access methods for the module to use. Once developed tests can be run
on the BDI module and the blocks attached to it in order to show the
potential bene t of component based design within agent systems.
6</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Outlook</title>
      <p>As we move forward with the design and development of agent software
components the bene ts of component based design are already apparent.
When a component of the LAF is faulty or has been made redundant, it
can be removed without the system crashing or requiring a replacement in
order to operate (for the most part). With every component automatically
assigned an ID number tracking and debugging components becomes
easier when compared to every component needing to be manually assigned
an identi er. Our next objective is to nalize the BDI block interface,
develop some blocks for testing and investigate the possible usefulness to
the agent community this BDI module could have.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          <article-title>1. API - application program interface</article-title>
          .
          <source>Webopedia</source>
          ,
          <year>2014</year>
          . http://www.webopedia.com/TERM/A/API.html,
          <source>Last checked: 7 July</source>
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>J.</given-names>
            <surname>Betts</surname>
          </string-name>
          and
          <string-name>
            <given-names>B.</given-names>
            <surname>Mu</surname>
          </string-name>
          <article-title>ller. Engineering MAS { a device integration framework for smart home environments</article-title>
          .
          <source>In Proceeding of CS&amp;P</source>
          <year>2013</year>
          , pages
          <fpage>15</fpage>
          {
          <fpage>26</fpage>
          ,
          <year>2013</year>
          . Revised version to appear
          <source>in Fundamenta Informaticae</source>
          (
          <year>2014</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>Guido</given-names>
            <surname>Boella</surname>
          </string-name>
          .
          <article-title>Intentions: choice rst, commitment follows</article-title>
          .
          <source>In AAMAS</source>
          , pages
          <volume>1165</volume>
          {
          <fpage>1166</fpage>
          . ACM,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Rafael</surname>
            <given-names>H.</given-names>
          </string-name>
          <string-name>
            <surname>Bordini</surname>
          </string-name>
          , Lars Braubach, Mehdi Dastani,
          <string-name>
            <surname>Amal El</surname>
            Fallah-Seghrouchni,
            <given-names>Jorge J</given-names>
          </string-name>
          .
          <string-name>
            <surname>Gomez-Sanz</surname>
          </string-name>
          , Jo~ao Leite,
          <string-name>
            <surname>Gregory M. P. O'Hare</surname>
            ,
            <given-names>Alexander</given-names>
          </string-name>
          <string-name>
            <surname>Pokahr</surname>
            , and
            <given-names>Alessandro</given-names>
          </string-name>
          <string-name>
            <surname>Ricci</surname>
          </string-name>
          .
          <article-title>A survey of programming languages and platforms for multiagent systems</article-title>
          .
          <source>Informatica (Slovenia)</source>
          ,
          <volume>30</volume>
          (
          <issue>1</issue>
          ):
          <volume>33</volume>
          {
          <fpage>44</fpage>
          ,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>M. E.</given-names>
            <surname>Bratman</surname>
          </string-name>
          . Intention, Plans, and
          <string-name>
            <given-names>Practical</given-names>
            <surname>Reason</surname>
          </string-name>
          . Harvard University Press, Cambridge (MA),
          <year>1987</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>Nils</given-names>
            <surname>Bulling</surname>
          </string-name>
          and
          <string-name>
            <given-names>Berndt</given-names>
            <surname>Farwer</surname>
          </string-name>
          .
          <article-title>Expressing properties of resource-bounded systems: The logics RTL* and RTL</article-title>
          . In Jurgen Dix, Michael Fisher, and Peter Novak, editors,
          <source>CLIMA</source>
          , volume
          <volume>6214</volume>
          of Lecture Notes in Computer Science, pages
          <volume>22</volume>
          {
          <fpage>45</fpage>
          . Springer,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>Nils</given-names>
            <surname>Bulling</surname>
          </string-name>
          and
          <string-name>
            <given-names>Berndt</given-names>
            <surname>Farwer</surname>
          </string-name>
          .
          <article-title>On the (un-)decidability of model checking resource-bounded agents</article-title>
          .
          <source>In Helder Coelho</source>
          , Rudi Studer, and Michael Wooldridge, editors,
          <source>ECAI</source>
          , volume
          <volume>215</volume>
          of Frontiers in
          <source>Arti cial Intelligence and Applications</source>
          , pages
          <volume>567</volume>
          {
          <fpage>572</fpage>
          . IOS Press,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>Louise</given-names>
            <surname>Dennis</surname>
          </string-name>
          , Berndt Farwer, Rafael Bordini, Michael Fisher, and
          <string-name>
            <given-names>Michael</given-names>
            <surname>Wooldridge</surname>
          </string-name>
          .
          <article-title>A common semantic basis for BDI languages</article-title>
          . In Mehdi Dastani, Amal El Fallah Seghrouchni, Alessandro Ricci, and Michael Winiko , editors,
          <source>Proceedings of the International Workshop on Programming Multi-Agent Systems (ProMAS</source>
          <year>2007</year>
          ), pages
          <fpage>88</fpage>
          {
          <fpage>103</fpage>
          , May
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <given-names>R. S.</given-names>
            <surname>Pressman. Software Engineering</surname>
          </string-name>
          :
          <article-title>A practioner's approach</article-title>
          .
          <source>McGraw-Hill</source>
          ,
          <volume>7</volume>
          <fpage>edition</fpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <given-names>M.</given-names>
            <surname>Wooldridge</surname>
          </string-name>
          .
          <article-title>An Introduction to MultiAgent Systems</article-title>
          . Wiley,
          <volume>2</volume>
          <fpage>edition</fpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>