Artificial Intelligence With Java
Artificial Intelligence With Java
Course Topics
● Introduction: what is an agent?
❍ Agents: Natural and Artificial
❍ Ferber's Discussion
❍ Lange and Oshima
❍ Nikolic
● Situated Agents
❍ Agent rationality
❍ Agent autonomy
❍ An Agent Classification Scheme
❍ A Basic Reactive Agent Example
❍ A Reactive Agent with state
❍ Agent environments
■ Lecture 1
■ Notes on Lecture 1
■ Lecture 2
■ Notes on Lecture 2
■ Lecture 3
❍ The Agent and its environment
❍ Seven Advantages of mobility
❍ Mobile agents vs mobile objects
❍ Agents and network computing paradigms
❍ The question of location transparency in distributed systems
● Aglets
❍ What are Aglets?
■ Inter-Aglet Communication
■ Cloning
■ Aglet Design Patterns
■ Survey of Patterns
● JADE
❍ Getting started with JADE
❍ The FIPA Agent Model and JADE
❍ The JADE 2.4 API and other docs (local)
❍ Ontologies and JADE
❍ Programming with JADE
● XML
❍ Survey
■ Introduction
■ Using XML
■ Document Type Definitions
■ XML and Inter-Agent Communication
❍ XML Interpretation using the DOM
❍ Using the SAX API
❍ XSL and XSLT
● Agent Negotiations
❍ Introduction
Disclaimer
The CPS720 notes are lecture notes. They have not been peer reviewed or published in book form. They
are meant to be helpful but are not necessarily complete or completely accurate. When in doubt, consult
the relevant textbooks or references.
The author is not responsible for any damages, direct or indirect, caused by the use of these notes.
Evaluations:
Weight Due
Type
(%) Dates
Assignment 1 10 Fri. Sept. 28
Notes: 1. Students obtaining less than 40% of the total marks available from the
exam will automatically fail, regardless of their marks on the
assignments.
2. Students obtaining tan exam mark between 40% and 50% will have
their final mark adjusted at the discretion of the instructor. This
adjustment will probably result in a lowering of the student's nominal
mark, but will unlikely result in a failing grade.
3. The exam will be either all multiple choice, or multiple choice with a
few short answer or fill in the blank questions. A programming
question is possible.
Assignment 1
Assignment 2
Assignment 3
Marks
As of Dec. 11, 2001
Overview
This assignment has some similarity with the lab done at the CERN CSC99 course. It simulates a survey.
The survey consists of a simgle statement to which respondants answer on a scale of 1 to 10. 10 means
completely agree; 1 means completely disagree; 5 or 6 means neutral, or no strong opinion.
For example, how would your rate the statement "Celine Dion is the best female vocalist today".
You can imagine each Aglet server (tahiti) represents a diffrent region or country where the survey takes
place. The idea is to have a mobile agent visit each of these servers in turn, combine the results, and
return to its origin. The total result is to be displayed as a histogram.
Specifics.
Packages
This assignment involves quite a few files so packaging is needed. You should have two packages,
cps720.assignment2m and cps720.assignment2.util.
All your code except two utilites should go in cps720.assignment2. A utility class needed to convert back
and forth between "csv String" histogram representaion, and array representation of histograms should be
put in cps720.assignment2.util. (See below for more on these representations.)
You will also be using a graphics package to draw the histogram. This package is called PtPlot and
comes from the Ptolemy project at the University of California, Berkeley. This system is in jar file called
plot.jar. If you want to copy it to your system, make sure you put it in the aglets/lib directory (where the
aglets jar file is) otherwise the tahiti server cannot find it.
To compile with PtPlot, you must import ptolemy.plot.*; into your code.
The data
Of course, we cannot conduct real surveys, so we have to fake it. You are supplied with a simple Java
program, cps720.assignment2.CreateSurvey. This allows you to "guide" the results. You answer the
question yourself and then the program uses a Gaussian distribution random number generator to
generate 'responses" with your answer as mean. You can adjust various parameters.
The program generates a binary file containint ints. You need to look at the source code to see how to
write your own conde to read the data back in.
Architecture
You need to write 3 agents, two stationary and one mobile.
This stationary service agent responds to the messsage, "histogram". Every system MUST use this
string since you want your service agent to respond to the visiting agents written by others.
When the service agent is created, it should read in the survey data file and create a histogram
representation. This datastructure is just a string containing comma separated values (csv). For example
you might wind up with "21,34,56,122,132,136,119,49,28,17". The numbers here represnt survey counts.
So, in the example, 21 people strongy disagreed with the statement (rating = 1), and 17 people strongly
agreed with the statement (rating =10).
This representation is used in the Aglet Message method sendReply(). You might find it more natural to
store the histogram results in an array of ints, due to a bug (?) in the Aglet API sendReply(Object o) does
not seem to work for user defined objects. The String type is safe, however. The use of this csv String
representation is compulsory for any histogram representations to be used in messages.
The csv String representation is needed for Aglet messages, but of course it is not much use for
manipulation integers. To update the histogram data you need to add ints. So you also need to keep an
array of 10 int elements.
You should write a class with two static methods with signatures such as,
● public static String arrayToCsv(int [] array)
To write thse you will find the classes String, String Buffer (with method append), and StringTokenizer
(in package java.util) useful.
Note that the class SurveyHistogram used to display the final result expects these conversion methods to
have exactly the signatures shown above. Also these methods must be in a class called Convert in a
package cps720.assignment2.util.
Introduction
In this assignment you are to create a simulation of supply and demand from basic economics. The
system consists of one producer of some product, and n consumers of the product. The producer can set a
price for its product and tell all the consumers the price. Consumers each have their own demand
schedule which determines how much of the product they will buy at the given price.
The consumers tell the producer how much of the product they want. The producer then calculates its
profit based on the total quantity sold, the unit price and the unit cost of production. Constant returns to
scale are assumed. That is, the producer can produce any amount of its product at the same unit cost.
If the producer does not like the profit at one price, it can try again with a different price. Of course a loss
might also be possible.
Economics
Profit is just the difference between revenue and costs. So, if the unit price of the product is p, and the
unit cost is c, and the amount sold is q, then
profit = (p - c) * q
A demand schedule is a plot of quantity demanded, q, vs. price, p. This curve has a negative slope. (Since
it is unlikely that a rational person would by more of a product the higher its price.) For the purposes of
this assignment you can assume a linear demand schedule.
q = m * p + b, where m is the (negative) slope and b is the intercept on the q axis. The slope m = -qmax /
pmax where pmax is the maximum price the consumer is willing to pay, and qmax is the gluttony value, the
amount the consumer can consume even if the product is mana from heaven (i.e., free).
The Simulation
The simulation is to run on the JADE platform. You only need one JADE container.
Ontology
The Producer and Consumer agents communicate using a special ontology as defined in
EconOntology.java and associated files. These are packaged in c720a3Ontology.jar.
What to submit
Your files should be packaged in a jar file with the package structure cps720.assignment3 and
cps720.assignment3.ontology, the latter containing the supplied ontology. Also include a readme.txt file
describing your Java files. Make sure all group names are on all source files. Call the jar file
cps720a3.jar.
Email the jar file as an attachment to david.grimshaw@sympatico.ca. Make sure all the group names are
listed in the body of the email.
What to study
The exam is based on the notes and the assignments. Links to other sites are intended as supplementary
background material.
If you look at the index page for cps720 you see there are several subsections. Here are some highlights.
1. Ferber, Lange and Oshima on Agents. Characteristics of "agenthood".
2. Situated agents (really robotics) This is AI. The 4 levels of agent
3. The Aglet API. Aglets are communicative agents. Know the basics, Aglet,. AgleProxy,
AgletContext, Message.
4. Agent communication. Basic facts about speech acts. Multi-agent architectures (e.g.
InfoSleuth). You will not be asked about KQML.
5. XML. Relation with DTD. Read simple DTD, read/write XML. The two kinds of parser, DOM,
SAX. (You will not be asked to use theSAX or DOM API's nor about XSL.)
6. Agent negotiation. Zero Sum games, prisoner's dilemma, problem of dishonesty and defection.
Remember, highlights are just that. You are responsible for the whole course!
Internet Resources
CERN School of Computing Aglets Course 1999
This is a webcast of parts of the 2 week summer course sponsored by CERN in held in Poland, starting
Sept. 13 1999. The webcasts include video, sound and slides. A number of the lectures involve Java
Mobile Agents using IBM's Aglets API. Given the time zones, try afternoon or evening. You will
probably need rogers@home or Sympatico High Speed Edition to view them properly.
CERN Agent Course
Aglet Resources
The Aglets Home Page (IBM Japan) The original Aglets page
JADE
JADE Home Page
Agent Cities
Ascape
Ascape Home Page
Zeurs
D'Agents
XML
Apache XML Project
● Xerces API Docs
IBM's XML
Sun's XML
Robert Cover's XML and SGML Page - with introductions and FAQs
Microsoft XML
Books
AI Books
Nils Nilsson, Artificial Intelligence, A New synthesis, Morgan Kaufmann, 1998
Stuart Russell & Peter Norvig, Artificial Intelligence, A Modern Approach, Prentice-Hall, 1995
Jacques Ferber, Multi-Agent Systems, Addison-Wesley, 2000
XML Books
Brett McLaughlin, Java and XML, O'Reilly, 2000
Rich Eckstein, XML Pocket Reference, O'Relly, 1999
Hiroshi Maruhama, Kent Tamura, Naohiko Uramoto, XML and Java, Addison-Wesley, 1999
By
Todd Papaioannou
A Doctoral Thesis
Doctor of Philosophy
of Loughborough University
February 2000
Acknowledgements
Undertaking a course of study that leads to the award of PhD is much like a journey of
exploration and discovery. Although you may have some idea of where it is you wish
to end up, the many rich experiences and pitfalls along the way are largely
unforeseen. It is certainly an experience that I would recommend to anyone who
believes they are capable. That is not to say, however, that it is a course suitable for
everyone. The road to travel is long and tough, and many fall by the wayside.
My own journey has been one of academic learning and self-discovery. During my
course of study, I have enjoyed incredibly the process of scaling new heights of
knowledge, of cutting a trail where others may have never been, of using and pushing
my mind to attack and answer the big questions. During this journey my mind has
been refined to a sharpness and focus hitherto unforeseen to me, and I feel I am now
able to wield my mind as a tool, in all situations. This has allowed me to look within,
and understand exactly whom I am. In addition, my character has grown and
expanded with a wealth of new experiences that have served to polish it.
I feel lucky to have undertaken my research in a relatively new field, where the
boundaries and rules have not been defined yet. This has afforded me an academic
freedom that many students do not enjoy, and allowed me to follow an academic path
out of the reach of many. This type of work cannot be done alone in isolation though,
and I would like to take this opportunity to thank those who have made it possible for
me to get this far.
Firstly I would like to thank all my family, especially Jill, Les and Yannis, for their
continued support throughout my many years of study. Without their help, I would
have been unable to complete my work. I hope my completion goes some way to
repaying their trust and support.
To study for a PhD requires a suitable environment and support in which to do so.
Most important in providing this has been my supervisor Dr. John Edwards. John
deserves special credit for having the patience to guide a determined and
unconventional student, even when many of the proposed ideas were contrary to his
own philosophies. I am sure the experience must have been challenging, but I believe
iii
On the Structuring of Distributed Systems Acknowledgements
that we have both learnt greatly from it. I would also like to thank the other members
of the MSI Research Institute for providing a stimulating social environment, and in
particular Ian Coutts and Paul Clements for their support in hearing and critiquing my
research philosophies as they developed.
In addition, I would like to offer my thanks to many people around the world who
have had some input or influence over the course of my study. In particular, my friend
and colleague Nelson Minar, who has been a trusted source of advice throughout the
journey, and Dr. Danny Lange who has been an excellent mentor and font of wisdom.
Also, the members of the agents, mobility and dist-obj mailing lists have provided an
invaluable service as a community of peers amongst which to discuss my research.
Many of the ideas expressed in this thesis have been shaped and refined in those
forums.
One cannot work on anything exclusively for so long and so hard, without the need
for respite. I have many friends to who I owe thanks, who have allowed me to relax,
rage, or lose myself, away from grindstone. Some deserve special mention. Firstly,
my best friend Darren May, who has been there from the early years and will be there
at the end. Also, my friends Derek Woods and Andy Grant who have been my
partners in many misdemeanours at Loughborough through the years.
Lastly, but most importantly I would like to thank my partner, Joanna Henderson,
whose unswerving love, support and companionship have allowed me to concentrate
my efforts on achieving my goals. She truly is a wonderful person and I count myself
extremely lucky to be with her.
iv
On the Structuring of Distributed Systems Abstract
Abstract
The last decade has seen an explosion in the growth and use of the Internet. Rapidly
evolving network and computer technology, coupled with the exponential growth of
services and information available on the Internet, is heralding in a new era of
ubiquitous computing. Hundreds of millions of people will soon have pervasive
access to a huge amount of information, which they will be able to access through a
plethora of diverse computational devices. These devices are no longer isolated
number crunching machines; rather they are on our desks, on our wrists, in our
clothes, embedded in our cars, phones and even washing machines. These computers
are constantly communicating with each other via LANs, Intranets, the Internet, and
through wireless networks, in which the size and topology of the network is
constantly changing. Over this hardware substrate we are attempting to architect new
types of distributed system, ones that are able to adapt to changing qualities and
location of service. Traditional theories and techniques for building distributed
systems are being challenged. In this new era of massively distributed computing we
require new paradigms for building distributed systems.
This thesis is concerned with how we structure distributed systems. In Part I, we trace
the emergence and evolution of computing abstractions and build a philosophical
argument supporting mobile code, contrasting it with traditional distribution
abstractions. Further, we assert the belief that the abstractions used in traditional
distributed systems are flawed, and are not suited to the underlying hardware substrate
on which contemporary global networks are built. In Part II, we describe the
experimental work and subsequent evaluation that constitutes the first steps taken to
validate the arguments of Part I.
The experimental work described in this thesis has been published in [Clements97]
[Papaioannou98] [Papaioannou99] [Papaioannou99b] [Papaioannou2000]
[Papaioannou2000b]. In addition, the research undertaken in the course of this PhD
has resulted in the publication of [Papaioannou99c] and [Papaioannou/Minar99].
i
On the Structuring of Distributed Systems Contents
Contents
Acknowledgements................................................................................................. iii
List Of Tables .........................................................................................................vii
List of Figures....................................................................................................... viii
Preface ......................................................................................................................1
1 Abstraction ......................................................................................................5
1.1 Introduction.................................................................................................5
1.2 A Brief History of Computing Time ............................................................5
1.3 Procedural Abstractions...............................................................................7
1.3.1 Commentary..................................................................................11
1.4 Programming Abstractions ........................................................................12
1.4.1 Commentary..................................................................................14
1.5 The Far Side..............................................................................................14
1.5.1 Commentary..................................................................................16
1.6 Conceptual Abstractions............................................................................17
1.6.1 Commentary..................................................................................19
1.7 Concluding Remarks .................................................................................19
2 Towers of Babel.............................................................................................21
2.1 Introduction...............................................................................................21
2.2 The Advent of Distribution........................................................................21
2.3 Distributed Communication.......................................................................22
2.3.1 Commentary..................................................................................25
2.4 Distributed Systems...................................................................................25
2.4.1 Inter Process Communication ........................................................26
2.4.1.1 Commentary......................................................................28
2.4.2 Remote Procedure Calls ................................................................29
2.4.2.1 Commentary......................................................................31
2.4.3 RM-ODP.......................................................................................31
2.4.3.1 Commentary......................................................................32
2.5 Characterisation of Traditional Distribution Architectures.............................................34
2.6 Commentary..............................................................................................35
2.7 Concluding Remarks .................................................................................40
ii
On the Structuring of Distributed Systems Contents
3 Mobility .........................................................................................................42
3.1 Introduction...............................................................................................42
3.2 A Brief History of Code Mobility ..............................................................42
3.3 The Differences.........................................................................................44
3.4 Mobile Code Design Abstractions .............................................................46
3.4.1 Remote Computation.....................................................................46
3.4.2 Code on Demand...........................................................................47
3.4.3 Mobile Agents...............................................................................47
3.4.4 Client/Server .................................................................................48
3.4.5 Subtleties of the Mobile Agent abstraction ....................................48
3.5 Characterisation of Mobile Agent Systems ................................................49
3.6 Commentary..............................................................................................50
3.7 Concluding Remarks .................................................................................52
iii
On the Structuring of Distributed Systems Contents
6 Implementation .............................................................................................87
6.1 Introduction...............................................................................................87
6.2 The Model.................................................................................................87
6.3 The Bestiary ..............................................................................................89
6.3.1 OrderAgents..................................................................................90
6.3.2 Order Objects ................................................................................91
6.3.3 SalesAgents...................................................................................91
6.3.4 StockControlAgents ......................................................................92
iv
On the Structuring of Distributed Systems Contents
7 Evaluation......................................................................................................99
7.1 Introduction...............................................................................................99
7.2 Generating Useable Metrics.......................................................................99
7.2.1 The Goal .......................................................................................99
7.2.2 The Questions .............................................................................100
7.2.3 The Metrics .................................................................................100
7.3 Evaluating Semantic Alignment ..............................................................102
7.3.1 Conceptual Diffusion...................................................................103
7.3.2 Semantic Alignment ....................................................................105
7.3.3 Commentary................................................................................106
7.4 Evaluating System Agility .......................................................................107
7.4.1 Change Capability .......................................................................107
7.4.2 Commentary................................................................................108
7.5 Evaluating Loose Coupling .....................................................................109
7.5.1 Evaluating Coupling in Mobile Code Systems .............................109
7.5.2 Commentary................................................................................110
7.6 Concluding Remarks ...............................................................................113
8 Conclusions..................................................................................................115
8.1 Future work.............................................................................................117
8.2 Commentary............................................................................................118
v
On the Structuring of Distributed Systems Contents
List of Publications...............................................................................................120
References.............................................................................................................121
Appendices............................................................................................................137
Appendix A...................................................................................................137
Appendix B...................................................................................................142
vi
On the Structuring of Distributed Systems Contents
List Of Tables
Table 1. Inter Process Communication Facilities...............................................27
Table 2. Network Transparency ........................................................................32
Table 3. Problems of a Distributed System........................................................37
Table 4. Summary of mobile agent security issues ............................................64
Table 5. Questions generated using the Basili GQM Method...........................101
Table 6. Metrics Generated using the GQM Method .......................................102
Table 7. Analysis of Conceptual Diffusion Present in Mobile Code ................104
Table 8. Results of Metrics (3) and (4) ............................................................105
Table 9. Change Capability metric sets after “scenarios for change” ...............108
Table 10. Requirement of Distributed Systems .................................................111
vii
On the Structuring of Distributed Systems Contents
List of Figures
Figure 1. The von Neumann Computer Architecture...........................................6
Figure 2. Early Layers of Abstraction.................................................................8
Figure 3. The layers of abstraction in the Procedural Abstraction Phase ...........12
Figure 3. Layers of abstraction in the................................................................14
Figure 4. Programming Abstraction Phase........................................................14
Figure 5. The full Layers of Abstraction diagram .............................................18
Figure 6. The OSI Reference Model .................................................................24
Figure 7. Inter Process Communication ............................................................28
Figure 8. A Remote Procedure Call ..................................................................30
Figure 9. The evolution of Distribution Abstractions ........................................33
Figure 10. Request Broker providing location transparency................................34
Figure 11. Mobile Data in a Traditional Distributed System ...............................35
Figure 12. Back flips required by ORB to ensure location transparency..............38
Figure 13. Communcation across the network, and mobile agent migration. .......45
Figure 14. Examples of the different mobile code abstractions. ..........................47
Figure 15. Network routing of Client/Server and Mobile Agent architectures .....49
Figure 16. Mobile logic and data in the Mobile Agent Abstraction.....................49
Figure 17. A distributed system built with mobile code ......................................51
Figure 18. The Aglet Environment .....................................................................75
Figure 19. An overview of I.T.L. around the world.............................................79
Figure 20. Information flow through I.T.L. on receiving an order.......................82
Figure 21. Abstract Process Model .....................................................................83
Figure 22. The Sales Order Process ....................................................................84
Figure 23. Modified Sales Order Process model .................................................85
Figure 24. Agent Sales Order Process Model......................................................88
Figure 25. DataQueryAgent Architecture ...........................................................94
Figure 26. The DataQueryAgent ........................................................................96
viii
On the Structuring of Distributed Systems Preface
Preface
Mobile Code is a new and generally untested paradigm for building distributed
systems. Although garnering many plaudits and continually increasing in popularity,
the technology and research field remain relatively immature. So far, most research
has focused on the creation of mobile code frameworks, and as yet, there is no
conceptual framework with which to contrast results. Equally, there is no clear
understanding of the new abstractions offered by this paradigm. Further, many
conclusions drawn about the technology remain qualitative and subjective. This
dearth of quantitative results means as yet it has not been possible to evaluate the
potential of both the technology and the paradigm.
It is against this backdrop that the work described in this thesis has been conducted.
Before an accurate and informed decision about the suitability of mobile code
technology can be made, a fuller appreciation of the paradigm is required. It is the
author’s opinion that the central essence of a new paradigm is the abstraction it offers
to the designer. Therefore, the contribution of this thesis addresses the issues of
understanding and evaluating the design abstractions offered by mobile code.
The first part of this thesis is concerned with building an understanding of the
abstractions offered by mobile code, and the implications of using them. Certainly, it
would be impossible to undertake this research without a context within which to
analyse the new paradigm. To this end, we trace the emergence and evolution of
abstractions employed throughout the history of computing, in an attempt to
understand the reasons behind the existence of contemporary traditional distribution
abstractions. We also build a philosophical argument supporting mobile code,
contrasting it with traditional distribution abstractions. Further, we assert the belief
that the abstractions used in traditional distributed systems are flawed, and are not
suited to the underlying hardware substrate on which contemporary global networks
are built.
In chapter one, we review the history of computing, and the abstractions that have
been employed within this field. We begin our journey by examining the early years
of computing, and trace the consecutive developments that have shaped the evolution
of our present day computing landscape. We build a picture of the key phases in this
1
On the Structuring of Distributed Systems Preface
evolution, and the gradual layering of abstractions, one atop another, that
characterises evolution in this area.
In chapter three, we begin our examination of the new design abstractions offered by
Mobile Code. We discuss what makes mobile code systems different from
contemporary ones and characterise these new abstractions as embodying local
interaction. Finally, we argue that by employing this new paradigm we are using an
abstraction more wholly suited to the underlying computational substrate, and thus to
building distributed systems. This chapter concludes our philosophical argument
concerning the structuring of distributed systems.
In chapter four, we present the rational for the experimental research undertaken in
this thesis, and describe how it will support the arguments made in Part I. Further, we
describe the technical issues involved with implementing mobile code abstractions,
and discuss some of the advantages claimed for this new technology. Lastly, we
review several of the better-known mobile code frameworks available to researchers,
before presenting IBM’s Aglet Software Development Kit, the framework used in our
experimental work.
2
On the Structuring of Distributed Systems Preface
In chapter five, we describe a case study undertaken in the UK. The case study has
been used to generate a real-world model of the Sales Order Process (SOP) of a
manufacturing enterprise that is used in the subsequent implementation work. In
addition, several requirements of the company were identified which will be used in
later chapters as “scenarios for change” with which to test and measure our
experimental implementations.
In chapter six, we describe the creation of two prototype mobile code systems. Their
common parts and differences are discussed, along with the supporting tools that have
been created.
In chapter seven, we begin our evaluation of the two prototype systems. Firstly, we
describe the process through which we have generated several tangible software
metrics. We then evaluate the prototypes through the “scenarios for change”, and
reflect on what has been learnt.
In chapter eight we conclude the research undertaken in this thesis, and discuss the
implications of the work, and avenues for further investigation.
3
Part I
Understanding
On the Structuring of Distributed Systems Abstraction
1 Abstraction
1.1 Introduction
Computers are fulfilling an increasingly diverse set of tasks in our society. They are
silently assuming many mundane but key tasks, providing seamless assistance to
support our lifestyles. They control our car engines, our environmental climate and
even our toasters. Increasingly, sophisticated hardware is the supporting substrate for
increasingly complex software. Yet despite major advances in our understanding of
the construction of software, building flexible and reliable systems remains a
considerable task. Increasingly powerful abstractions are employed by software
engineers in an attempt to reduce the cognitive complexity of such tasks.
In the 1940’s, the mathematician John von Neumann pioneered research into
formalising the basic architecture for a computing machine. The Von Neumann
architecture specified a computer in terms of three main components:
• A Memory: a large store of memory cells that contain data and instructions
• An Input/Output unit: to enable interaction and feedback with the user
• A Central Processing Unit (CPU): responsible for reading and writing instructions
or data from the memory cells or from the I/O unit
During execution, the CPU takes instructions and data from the memory cells one at a
time, storing them in local cells known as registers. The instructions cause the CPU
to manipulate the data via arithmetic or logic operations, before assigning any results
back to memory. Thus, the execution of instructions results in a change in the state of
5
On the Structuring of Distributed Systems Abstraction
the machine [Burks46]. The three components of a computer are able to interact via a
communications bus (see Figure 1).
bus bus
Von Neumann’s research was based on the earlier theoretical work of Church and
Turing on state machines [Church41] [Turing36]. Importantly though, it established a
hardware architecture for a computing machine that would serve as a reference
platform for decades to follow. Although we are generally accustomed to thinking of
computers as extremely complex machines, the central architecture itself is quite
simple. At the most basic level Harel states:
Nonetheless, von Neumann had taken the first step along a long path of evolution that
would culminate in the computer systems we take for granted today. This evolution
could not have taken place without advances in hardware design and manufacture,
however, for the scope of this thesis we are interested only in the abstractions and
technologies that have evolved to support the construction of software.
Since its creation, the von Neumann architecture has fundamentally influenced the
way we think about and build our computing systems. Most contemporary
programming languages can be viewed as abstractions of the underlying von
Neumann architecture. These languages retain as their computational model that of
the von Neumann architecture, but abstract away the details of execution. The
sequential execution of language statements (instructions) changes the state of a
program (computational machine) through assignment and manipulation of variables
(memory cells). These languages, known as imperative languages, have developed
through the addition of layers of increasingly high levels of abstraction [Ghezzi98].
In the next section we examine the emergence and evolution of imperative languages,
6
On the Structuring of Distributed Systems Abstraction
and discuss the ascending tower of abstractions that we use to construct software
systems.
The creation of assembly languages was the next step towards unlocking the full
potential of the computer. Using them, programmers were no longer concerned with
the location of individual registers and memory cells. They were able instead to
program with symbolic representations of their computing machines. From here, it
was a relatively simple matter to begin constructing repeatable computing algorithms
from assembler symbols [Wexelblat81]. These algorithms became a layer of
abstraction above the assembly symbols, which themselves were a layer of abstraction
above the hardware. Quickly, the pattern for computing evolution had been defined:
it would evolve through the gradual layering of ever subtler and complex levels of
abstraction. Each layer abstracting away the minutiae whilst retaining as their
underlying computational model the von Neumann architecture. Figure 2 shows the
abstractions of assembly languages, and then computing algorithms layered over the
underlying von Neumann computational model.
7
On the Structuring of Distributed Systems Abstraction
Programmer’s
perspective
Computing Algorithms
Assembly Languages
Pseudo codes arose because in some instances programmers found that the hardware
specific instructions available on their particular computing architecture were not
sufficient to support the range of operations they required. Pseudo codes are machine
instructions that differ to those provided by the native hardware on which they are
being executed. They are invariably executed within an interpreter [MacLennan87], a
software simulation of a computational machine, a virtual machine, whose machine
language is the pseudo codes. The virtual machine would normally offer facilities
that were not available in the real computer, for example, new data types (e.g. floating
point) or operations (e.g. indexing). Ergo, pseudo codes added yet another, higher
layer of abstraction, and were the initial steps taken in moving towards a tool that
allowed a programmer to construct software in a language that bore no resemblance to
its machine code representation [Hopper68]. Unfortunately, pseudo code languages
8
On the Structuring of Distributed Systems Abstraction
were hampered by slow execution speeds, since the interpreter had to first convert the
codes to native instructions prior to execution. To overcome this inefficiency a new
tool known as a compiler was produced. A compiler is a computer program that
translates programs specified in high-level languages, for example pseudo codes, into
the native hardware’s assembly language [Harel93]. The program need only be
translated once, but could be executed at native speeds many times, which was a
distinct advantage over programs that had to be interpreted every time.
The advent of compilers led to the creation of new programming languages, known as
1 st generation languages. The best known of these are IBM's Mathematical FORmula
TRANslating system (FORTRAN) [IBM56], COmmon Business Oriented Language
(COBOL) [DoD61], and ALGOrithmic Language (ALGOL) [Perlis58] which
appeared in the mid to late 1950's respectively. These languages allowed a
programmer to use a mathematical notation in order to solve a problem. FORTRAN
and ALGOL were defined as tools for solving numerical scientific problems, those
that required complex computations on relatively simple data, for example simulating
numerically the effects of a nuclear reaction. COBOL was developed as a tool for
solving business data-processing problems, those that required computations on large
amounts of structured data, for example a payroll application. It was able to satisfy
the needs of the bulk of the applications of the day, and its success has meant it
remains in use over thirty years after its introduction [Wilson93].
The advent of compilers and 1st generation languages meant it was possible to develop
computer programs without any knowledge of how your program was actually
transformed into the native instruction set required by the machine upon which it was
intended to execute; the translation was automatically performed by the compiler.
One of the most important concepts embodied in the abstractions offered by 1st
generation languages was the separation of a program into two distinct parts. The
description of the data contained within the program was known as the declarative
part, and the program logic that controlled the execution of the program and
manipulation of the data was known as the imperative part.
9
On the Structuring of Distributed Systems Abstraction
years. They are characterised by offering a much higher level of structured flow
control to the programmer whilst simultaneously introducing new techniques to aid
the composition of computer programs. Typical of this set of languages is ALGOL 60
[Naur63]. The product of a committee, ALGOL 60 introduced major new concepts
such as syntactic language definition [Backus78], the notion of block structure
[Wilson93] and recursive programming [Ghezzi98]. Further improvements to
structured flow in languages such as loops, conditional statements, sequential
constructs and subroutines [Harel93] meant that some of the hardware-influenced
instructions prevalent in 1st generation languages, such as the infamous GOTO1
statement [Dijkstra68], could be removed.
By the 1970's it was becoming clear that the need to support reliable and maintainable
software had begun to impose more stringent requirements on new programming
languages [Ghezzi98]. Programming language research in this period emphasised the
need for eliminating insecure programming constructs. Among the most important
language concepts investigated in this period include: strong typing [Cardelli85],
static program checking [Abadi96], module visibility [Parnas72a], concurrency [Ben-
Ari90] and inter-process communication [Simon96]. Greater significance was now
placed on building reliable software, and the term software engineering [Naur68] was
used to describe an emerging methodology for dealing with the full lifecycle of
software development, from specification to production. In general, it is fair to say
that 3rd generation languages built on the previous generation by working at
improving the software engineering principles inherent, and enforced by the
languages. Some important examples of 3rd generation languages are Euclid
[Lampson77], Mesa [Geschke77] and CLU [Liskov81]. The development of these
languages was directly influenced by the need to improve systems programming
[Wilson93], the creation of operating systems and tools such as compilers, and to
produce verifiable programs.
In the last half of the 1970’s new languages such as Pascal [Jensen85] [ISO90b] and C
[Kernighan78] were developed. Both offered the programmer power, efficiency,
modularisation and availability on a wide array of platforms. With Pascal though,
Wirth aimed to create a language that would also be suitable for teaching
1 Strangely, the much maligned GOTO statement continues to exist in many languages
10
On the Structuring of Distributed Systems Abstraction
1.3.1 Commentary
When von Neumann first specified his computing architecture, he set the direction in
which our computing landscape would evolve. Since then, we have evolved through
the gradual layering of increasingly powerful abstractions upon each other. The
progressive development of programming techniques that ascended via early
unwieldy bit strings, through assembly mnemonics, pseudo codes, compilers and three
generations of programming languages signified the first phase of our evolution. In
this phase programmers were gradually lifted out of the mire, and spared the task of
remembering the location of each cell or register they wish to use. They were now
able to specify programs in powerful and efficient languages, without requiring any
hardware specific knowledge of the computer they were using. By progressively
exploring and building up the layers of abstraction, the computer had been
transformed from a slow and cumbersome behemoth to a powerful, flexible tool.
In this thesis we term this period of computing the procedural abstraction phase. It is
characterised by the development of new computing abstractions and new techniques
for controlling program structure and flow. Figure 3 illustrates the individual layers
of abstraction discussed in the previous section. Each box roughly represents the
beginning of each abstraction, and is intended to depict the progressive layering of
abstractions as programming languages were developed. Certainly each box should
not be interpreted as a finite lifetime for each abstraction. For example, assembler
continues to be heavily used in modern military aircraft systems [Bennet94].
11
On the Structuring of Distributed Systems Abstraction
Layers of
Abstraction
Procedural Abstractions
1st Gen
Lang
Pseudo code
Algorithms
Assembler
vNM
“Show me your [code] and conceal your [data structures], and I shall
continue to be mystified. Show me your [data structures], and I
won't usually need your [code]; it'll be obvious.” [Raymond98]
citing and re-interpreting [Brooks95]
The mid to late 1970’s saw a new trend develop within the world of computing.
Supported by more powerful tools and languages programmers began to build
increasingly large and complex programs [DeRemer76]. These programs were no
longer standalone edifices, capable of performing a single task. Rather, they were
systems, capable of a multitude of tasks.
The sheer size of these systems meant that for reasons of clarity and maintenance it
was becoming increasingly important to organise programs into discrete modules
[Knuth74]. With the Modula-2 language [Wirth77], Wirth attempted to extend Pascal
12
On the Structuring of Distributed Systems Abstraction
with modules and while not wholly successful the experiment was an indication of the
possible advantages [Wilson93]. Language researchers soon realised that it was not
only advantageous to separate programs into discrete modules, but also to
conceptually encapsulate data and logic within larger entities. Such encapsulations
were known as abstract data types [Hoare72] and enabled the programmer to specify
new data types in addition to those primitives already supported by the language. For
these new abstractions, programmers could define operations through which they
could be manipulated, while the data structure that implements the abstraction
remained hidden. Information or data hiding [Parnas72a] ensures that the internal
data of a new type will only be manipulated in ways that are expected. The late
1970's and early 80's saw an explosion of new programming abstractions, such as type
extensions [Wirth82], concurrent programming [Andrews83] and exception handling
[Goodenough75]. Again, the motivation was to make software more maintainable in
the long term. A resulting synthesis of many of these new techniques is the language
Ada [DoD80], which can be viewed as the state-of-the-art for that time.
The 1980's saw the arrival of Object-oriented Programming (OOP), the origins of
which can be traced back to Simula 67 [Birtwistle73]. An object is an encapsulation
of some data, along with a set of operations that operate on that data. Operations are
invoked externally by sending messages to the object [Blair91]. Thus, each object is
an abstraction that both encapsulates and acts upon its logic and data respectively.
This allows a programmer to view their system as being composed of conceptually
separate entities, or objects. The OOP abstraction also builds on the previously
discussed advances in modularity, data abstraction and information hiding, by
including facilities for software reuse [Ghezzi98]. Newly created objects in the
system are not implemented from scratch, rather they may inherit pre-existing
behaviour from a parent object, and implement only the required new behaviour.
OOP initially became popular through the success of Smalltalk [Goldberg83], but was
more widely accepted with the advent of C++ [Stroustrup92], an extension of C.
Other popular OO languages include Dylan [Apple92], Emerald [Raj91], Modula-3
[Nelson91] and more recently Java [Gosling96].
13
On the Structuring of Distributed Systems Abstraction
1.4.1 Commentary
In this thesis we term this ascendance from building programs, to architecting systems
as the programming abstraction phase. It is characterised by the development of new
techniques for modularity, data abstraction and software reuse, and would result in
systems that were easier to change and maintain [DeRemer76] and were more reliable
[Horowitz83]. In Figure 4 below we see the programming abstraction phase continue
the gradual layering of abstractions.
Layers of
Abstraction
Programming Abstractions
OOP
Concurrent
Programming
Abstract
Data Types
Procedural
Abstractions
Explosion of
experimental
abstractions
14
On the Structuring of Distributed Systems Abstraction
With the decreasing costs of computer hardware, however, radically different designs
of computing machine have become possible. This has opened up the possibility that
other computational models could be found, and that it may be possible to design the
computer hardware to fit the model, rather than the other way round [Wilson93]. As
early as the 1960’s there have been attempts to define programming languages whose
computational models were based upon well-characterised mathematical principles,
rather than on efficiency of implementation [Ghezzi98]. These alternative camps can
be split into functional and logic programming languages.
Functional languages use as their basis the theory of mathematical functions, and they
differ greatly from imperative languages as they do not support the concept of
variable assignment. Assignment causes a change in value to an existing variable,
whereas the application of a function causes a new value to be returned. This has
important implications for the problem of concurrency, since in an imperative
language it is possible to refer to a variable or object that has been reassigned without
your knowledge. In a functional language, a function may be called at any time, and
will always return the same value for a given parameter [Hudak89]. Further, since
variables cannot be altered by assignment, the order in which a program’s statements
are written and evaluated does not matter; they can be evaluated in many different
orders. Thus, programs can be modified as data and data structures can be executed
as programs. The key concept in functional programming is to treat functions as
value, and vice versa [Watt96].
15
On the Structuring of Distributed Systems Abstraction
Another variant in the field of programming languages are those defined as logic
programming languages. The main difference between functional and logic
programming languages is that programs in a pure functional programming language
define functions, whereas pure logic programming defines relations [Ghezzi98].
Logic programming languages first appeared in the late 1970's and are based on the
principles of first order predicate calculus [Mendelson64] and eschew all relation to
the underlying machine hardware. In contrast to other styles of programming, a
programmer using a logic language is more involved in describing a problem in a
declarative fashion than in defining details of algorithms to provide a solution
[Callear94]. The knowledge about a problem and the assumptions about it are stated
explicitly as logical axioms [Kowalski79]. This problem description is then used by
the language’s computational machine to find a solution. To denote its distinctive
capabilities, in this case a computational machine that can execute a logical language
is often referred to as an inference engine. Synonymous with logic programming, and
the ancestor of all logic languages is PROLOG [Clocksin87].
1.5.1 Commentary
The genres of functional and logic programming languages are an important
contribution to our computing landscape. Both are declarative languages and are
characterised as being independent of the underlying hardware upon which they are
executed; they are abstractions that are not influenced by the von Neumann
architecture. However, to achieve this independence efficiency has been sacrificed
[Wilson93]. This, and the fundamental change of programming mindset required for
those accustomed to the imperative style has been detrimental to their widespread
acceptance and deployment outside of the artificial intelligence and expert systems
communities.
Perhaps most revealing in the functional vs imperative language debate is the 1978
Turing Award lecture given by John Backus [Backus78]. In this, and his paper,
Backus argues that conventional programming languages are fundamentally flawed in
their design since as they are inherently linked to the underlying von Neumann
architecture. Backus goes on to demonstrate the advantages of functional languages
over imperative ones, and further introduces a new functional language, FP. His
16
On the Structuring of Distributed Systems Abstraction
assertion is that the underlying abstractions we use are important, and can affect the
way we think, use and build computer systems and software.
17
Conceptual
Layers of abstractions
abstraction Programming
abstractions
Agents
Procedural abstractions
Actors
OOP
Concurrent Aspects
Figure 5.
Programming
On the Structuring of Distributed Systems
Evolution of
3rd Gen Langs imperative
18
Strong Typing languages
2nd Gen Langs
Modules
Exceptions
1st Gen Lang Synchronisation
IPC
Pseudo code
Algorithms
von Neumann
1.6.1 Commentary
The computers we build are no longer merely high-powered calculating machines;
they are useful tools that can be both incredibly flexible, and stubbornly inflexible at
the same time. Our on-going affair with computers has been characterised by our
attempts to harness their power, and apply them to ever more diverse situations. This
affair has been tempered, however, by the complexity inherent in a computing system.
The complexity involved has forced us to continually refine the languages and tools
we use to build software systems. In our efforts to understand and use the technology
we abstract away the details, pasting on ever more elaborate facades to hide us from
the true complexities involved in creating software. Gradually we have layered
increasingly complex abstractions over those lying beneath, until it is no longer even a
requirement to be aware of those early abstractions. Modern day programmers have
rapid development tools and libraries with which to build software. They employ
conceptual abstractions that bear no resemblance to underlying hardware upon which
their creations will be executed. These layers of abstraction mean that modern day
programmers are not required to be aware of the abstractions that lie below, that they
depend on to deliver their creation.
This chapter has presented a brief history of our progress up the computing
abstraction tower. It has examined the chronological development of computing
19
On the Structuring of Distributed Systems Abstraction
The aim of this thesis is to understand the mobile agent abstraction, a new technology
and abstraction for building distributed systems. The review in this chapter has
provided a context and history in which new and existing abstractions can now be
reviewed. In the next chapter we examine the abstractions currently used in building
contemporary distributed systems.
20
On the Structuring of Distributed Systems Towers of Babel
2 Towers of Babel
2.1 Introduction
In the 1970’s, networking began to emerge as an important aspect of computer
systems. Driven by applications in the military and airline industries, computer
systems were connected and inter-operation became widespread [Cerutti83]. During
the 1980’s, distributed computing became a vital aspect of many computer systems.
In the early 2000’s, we are beginning to see the emergence of ubiquitous computing:
characterised as a massive heterogeneous “sea” of disparate computational devices,
with varying connection bandwidths and an ever-changing topology of connections
[Weiser91].
This chapter examines the emergence of distribution and discusses the path of its
evolution. In examining today’s distribution mechanisms we show that the
fundamental abstraction in these systems is one of location transparency. Further, we
demonstrate that the emergence of location transparency is a result of the layers of
abstraction found beneath it. We argue that by using this approach we are attempting
to impose an unsuitable abstraction onto the underlying hardware substrate.
21
On the Structuring of Distributed Systems Towers of Babel
Distributed computing as we understand it today is a far cry from the limited facilities
of early distributed systems, such as remote job entry handlers [Boggs73]. Their role
however was simple - to allow scarce and expensive information and resources to be
shared by users. Ever since computer users began accessing central processor
resources from remote terminals over 40 years ago, computer networks have become
more versatile, more powerful and inevitably more complex [Green80].
At the heart of distributed computing are communication networks. They are the
infrastructures that support information flow between computers. The initial
development of such networks was fostered through experimental networks such as
ARPANET [Roberts70] [Cerf74] and CYCLADES [Pouzin73]. ARPANET, which
went live in December 1969, was initially motivated by the requirements of the US
Military for a communications network that could survive a nuclear war
[Tanenbaum96]. This early work established the procedures for connecting
computers and facilitating their interaction. Just physically connecting computers was
not sufficient to ensure successful interaction though. Two computers wishing to
communicate must adhere to a common set of rules for defining their interactions.
This rule set is termed a protocol, and is an agreement between the communicating
parties on how communication is to proceed [Rose90].
22
On the Structuring of Distributed Systems Towers of Babel
In early computer systems, it was common for each application found on a computer
to employ its own protocol stack. This communication support was usually built into
the application, and was not available for use by any other applications. This
approach therefore had the inherent disadvantages of duplicated functionality and
inefficient resource usage. To alleviate this undesirable situation, research focused on
providing communication mechanisms at the operating system level through the
provision of shared communication suites [Sloman87].
Since the vendors controlled the protocol specification, they also had the power to
change the specification at their discretion [Cerutti93]. Understandably, this made
third party developers very nervous in adopting and working to a standard whose
specification might be changed at any given moment. Although subsequent
publishing of the protocol specifications aided their widespread adoption, the issue
remained [Rose90]. Further, as each proprietary communication suite evolved,
systems from competing manufacturers became even more incompatible.
23
On the Structuring of Distributed Systems Towers of Babel
Data Data
Layer 7
Application
Network Node Application
Layer 6
Presentation
Layer 5 Presentation
Session
Layer 4 Session
Transport
Transport
Layer 3 Network Network
Network
Layer 2 Data Link Data Link
Data Link
Layer 1 Physical Physical
Physical
Computer A Computer B
The OSI Reference model is structured into seven layers that represent the logical
sequence of functions carried out when messages are constructed for transmission,
dispatched, and then dismantled on arrival [Simon96]. It also serves to provide a
common basis for the co-ordination of communication systems standards
development and to allow existing standards to be placed into perspective
[Sloman87]. An example of the OSI Reference Model is shown in Figure 6. Data at
Host A is translated by the OSI stack into a form that can be communicated over the
wire. It is then sent over the wire (perhaps via some network nodes), before it is
reconstituted at Host B by the corresponding protocol suite, before finally being made
available to the destination application.
2
Formerly the Consultative Committee for International Telegraph and Telephones (CCITT)
24
On the Structuring of Distributed Systems Towers of Babel
Of particular interest to this thesis is Layer 7 – the Application layer. The Application
layer is the highest level of abstraction defined in the OSI model and is ultimately
responsible for managing the communications between applications. It provides
programming primitives that a developer is able to use to access the communication
facilities offered by the full protocol suite.
2.3.1 Commentary
In the previous section, we have briefly examined the emergence of communication
protocols, and protocol suites, that support distributed computing. Their role and
existence has been vital in ensuring we are able to successfully network our
computers. In themselves, protocol suites form a hierarchy of abstractions. They
provide a mechanism for translating a signal on the wire up through the layers of
abstraction until at the application layer the information can be manipulated via
programming primitives. These primitives bear little resemblance to their
representation ‘on the wire’ but a developer is able to call upon the communication
facilities with relative ease. The advent of the OSI model, and particularly the
Internet incarnation of that model, has made communication between distributed
computers much simpler. There are now a number of well-known and widely
deployed communication suites in existence [Tanenbaum96].
The OSI model, and the many incarnations of protocol suites in existence are
important in that they allow computers to communicate in an agreed manner. They do
not address how a distributed application may be constructed. These suites are only
the enabling infrastructure. Further techniques and technology are required. In the
next section, we examine the emergence of distributed systems and concentrate on
developments within the application layer of the OSI model.
25
On the Structuring of Distributed Systems Towers of Babel
Dividing monolithic software systems into distinct processes had advantages for
manageability, but meant a method was required that would allow executing
processes to communicate with each other. Finding a solution to this problem became
a widely researched issue with many languages gaining new facilities and
programming primitives. These new facilities became known as Inter Process
Communication (IPC) [Cashin80] [Fukuoka82].
3
With respect to the other processes. The operating system still controls all of the processes.
4
Local files are able to overcome this problem.
26
On the Structuring of Distributed Systems Towers of Babel
Since all interacting processes are local to each other in IPC, it is also possible to use
the computer’s RAM to implement a shared memory facility - a common region of
memory addressable by all concurrent processes. Shared memory has become an
important technique for use between communicating local processes. Unfortunately,
there is no inherent synchronisation in this mechanism and it is easy for one process to
write a value to memory for storage, and have another process overwrite it with a new
value, or even erroneous data. To combat this problem, new techniques for
synchronisation between processes were developed such as semaphores [Dijkstra68b],
monitors [Hoare74] and sequences [Reed79].
Synchronisation problems;
Can handle large volumes of
Local Files inefficient due to repeated
data; Simple to use;
disk access;
27
On the Structuring of Distributed Systems Towers of Babel
vNM A
Process A Process B
Shared memory
Shared file
2.4.1.1 Commentary
IPC was successful because it provided:
The major factor in the success of IPC however, stemmed from the abstraction it
embodies. The IPC abstraction takes full advantages of the constituent elements of
the von Neumann architecture. Therefore, it is ideally suited to the underlying
28
On the Structuring of Distributed Systems Towers of Babel
hardware upon which it is used. IPC was only useful, however, for communication
between processes that are executing within the same computing machine. As
computer networks increased in number and size, resources were scattered even
further. This distribution of resources meant that it was increasingly useful for a
process on one machine to be able to access a process or resource that was located on
another. Unfortunately, the existing IPC mechanisms were designed for
communication between local processes only. They were complex and difficult to use
in a networked manner. There was therefore a clear need for a simple mechanism to
allow two networked machines to interact.
In a seminal paper, Birrel and Nelson [Birrel84] described a new mechanism, Remote
Procedure Calls (RPC), which they built for the Cedar [Teitelman84] programming
environment to allow remote communication.
Birrel and Nelson’s goal was to provide a mechanism through which remote processes
could interact. They also aimed to make this mechanism transparent to the
programmer by ensuring it was syntactically similar, and as simple for the
programmer to use as ordinary procedure calls [Simon96]. Consequently, the
mechanism for RPC was modelled directly on the IPC facilities found in the Mesa
programming language [Mitchel79]. Indeed, so successful were they that RPC has no
distinction in syntax between a local and a remote procedure call [Colouris94].
During an RPC call there are five separate modules that interact to enable the call.
They are the client, the client-stub, the RPC communications package (RPC
Runtime), the server-skeleton and the server (see Figure 8). When the client wishes to
call a procedure that exists on a remote machine, it invokes the appropriate method in
the client-stub. To the client, this resembles a normal local procedure call. The
29
On the Structuring of Distributed Systems Towers of Babel
client-stub then assembles one or more data packets that include the target procedure
and the required arguments. These packets are then passed to the local RPC Runtime,
which transmits them to the remote Runtime. On receipt, these packages are passed
to the server-skeleton, where they are unpacked and passed to the target procedure in
the server. Once this procedure has been executed, any results are packaged up and
the process repeated in reverse. RPC is synchronous in nature, so while the server
procedure is executing, the client is suspended, awaiting the result. The RPC Runtime
(or request broker) establishes a client/server relationship between the interacting
parties, removing the need for each party to be aware of the other’s location.
Client Server
Reply
Computer A Computer B
Many RPC systems have subsequently been built, and they fall into two categories:
30
On the Structuring of Distributed Systems Towers of Babel
Due to its request/reply nature RPC is an extremely good way of doing Client/Server
application work [Crichlow88]. Client/Server is a particular paradigm for distributing
a system, where the server is a manager of one or more resources and a client is a user
of that resource. The paradigm was used extensively in the 1970’s to structure
operating system level process interaction [Simon96] [Walsh85], and is still in
extensive use today. One of the best contemporary examples being the World Wide
Web [Berners-Lee92].
2.4.2.1 Commentary
The major tenets of RPC can be summarised as:
The early 1980’s saw many breakthroughs in the distributed systems arena. Some
were influenced by earlier theoretical propositions, such as communication between
sequential processes [Hoare78], which were now being supported by the increasingly
widespread adoption of the OSI networking suite. There were also attempts to
incorporate RPC into existing programming languages, such as CONIC [Kramer83],
whilst new programming languages that included distribution facilities were also
developed, for example SR [Andrews82]. Again, so many proprietary and differing
RPC solutions meant that the computing landscape became fractured.
In the same way that the chaos of competing, incompatible and proprietary
communication protocols necessitated the creation of the OSI model, the need for a
standardised model for distributed applications was recognised. In 1987, ISO began
work on a Reference Model for Open Distributed Processing (RM ODP) [Brenner87]
[Hutchison91] [ISO92].
2.4.3 RM-ODP
The RM-ODP model provides a framework for ODP standardisation and for the
specification of systems using ODP standards [Cerutti93]. RM-ODP was an attempt
to unify proprietary RPC systems, and distributed application creation. As a model, it
describes in detail the application layer of the OSI model (see Figure 6). The driving
31
On the Structuring of Distributed Systems Towers of Babel
objective behind its creation was to develop a distribution infrastructure that would
compliment and support the existing computing infrastructures.
Like the OSI model, RM-ODP was purely a reference model. Its specification
however, extends the concepts of transparency first visited by RPC, and identifies
eight separate forms of transparency. These are discussed further by [Colouris94], but
for the purpose of this thesis, it is suffice to demonstrate that transparency is a
fundamental tenet of the RM-ODP model. We are only concerned with access and
location transparency, collectively known as network transparency (see Table 2).
Their presence or absence most strongly affects the utilisation of distributed resources
[Colouris94].
Since its specification there have been a number of distributed infrastructures created
that are based upon the RM-ODP model. These include the Open Software
Foundation (OSF)’s Distributed Computing Environment (DCE) [OSF92], the
Computer Integrated Manufacturing – Building Integrated Open SYStems framework
(CIM-BIOSYS) [Gascoigne94], Sun’s Remote Method Invocation (RMI) [Sun98],
Microsoft’s Distributed Component Object Model (DCOM) [Redmond97] and the
Object Management Group’s (OMG) Common Object Request Broker Architecture
(CORBA) [OMG94]. Some of the more recent infrastructures integrate RPC with the
object paradigm in an attempt to combine the benefits of the latter, in terms of
modularity, with the established communication mechanism of the former [Picco98].
2.4.3.1 Commentary
In a manner similar to the process observed in Chapter 1, the abstractions that have
been created to support the construction of distributed systems have gradually been
layered upon each other, continually reaching ever higher.
32
On the Structuring of Distributed Systems Towers of Babel
In Figure 9 we see the evolution of distribution abstractions. IPC first came into
existence as an abstraction to enable communication between processes executing
within the same computer, or von Neumann machine (vNM). So successful was this
abstraction that Birrel and Nelson designed RPC in an attempt to enable remote and
local calls to appear identical. Out of the confusion of proprietary RPC
implementations, the RM-ODP model was born, which in turn has led to
contemporary distribution infrastructures such as CORBA or RMI.
RM-ODP
RPC
IPC
vNM
Time
33
On the Structuring of Distributed Systems Towers of Babel
Virtual vNM
Process A Process B
Communication
via request
Software view broker
Request Broker
Reality
vNM A vNM B
Process A Process B
In reality, processes A and B exist within two complete separate vNMs, as do the
resources they share. However, the infrastructure attempts to create the illusion that
they exist within the same vNM. It also ensures that any required resources appear to
each process as if they were in their local computing machine, thus achieving the
location transparency described above.
34
On the Structuring of Distributed Systems Towers of Babel
of the RM-ODP abstraction, which itself can be traced back to RPC. For example,
CORBA IDL is directly modelled on RPC.
Message
2.6 Commentary
We have seen in Chapter 1 that modern day computing abstractions can trace their
ancestry back to the original von Neumann architecture. As each abstraction has
emerged, bringing with it new facilities and technologies, it has added a new layer to
the continually ascending edifice. At their root though, the von Neumann architecture
remains, influencing modern day designs even from the past. It is the base
abstraction, the underlying model for our computational machines. As each new
abstraction is layered onto the others, it must take into account those that preceded it.
When Birrel and Nelson first designed RPC in 1984, their intention was to allow the
programmer to access and communicate with processes on remote machines, in the
same easy manner in which they were able to access local processes. They wished to
make calls to remote processes appear identical to those made locally, thereby making
the location of the process transparent to the programmer (and ultimately the user). It
should not matter if the process was being executed locally or on a machine on the
other side of the world, it would appear exactly the same in both cases.
This phase in the development of distributed systems is pivotal. RPC was directly
modelled on IPC, which had been an extremely successful mechanism for enabling
35
On the Structuring of Distributed Systems Towers of Babel
processes to communicate, and so Birrel and Nelson’s intentions were not without
merit. However, IPC had evolved by extending the abstractions offered by existing
programming languages and by taking advantage of local facilities such as memory or
file space, each fundamental constituents of the vNM. IPC therefore was a perfect
abstraction for communication between processes executing in the same
computational machine, i.e. in the same von Neumann machine.
RPC on the other hand attempts to mask any details of location from communicating
processes. In effect, blurring the demarcation between separate vNMs to make local
and remote calls look identical. The technique required to achieve this is complex; for
two processes to communicate, a set of five separate modules is required (see Figure
8). Nonetheless, this technique was successful for the time, and the central tenet of
the abstraction, location transparency, became one of the underlying principals for the
RM-ODP model, and consequently most contemporary distribution infrastructures.
Part of the reason behind the success of RPC is because it is perfectly suited to
building client/server software systems. At the time, business software was
predominately hosted on centralised mainframe computers, computer networks were
predominately LANs or WANs and the number of personal computers was
dramatically lower than today. Equally, concurrent programming was slowly
becoming a reality and objects were only just gaining momentum. Thus, is it is not
difficult to see why the RPC abstraction was employed successfully for the types of
software system being constructed at the time. Further, it follows that such a
successful technique would be used as the baseline for newer distribution
infrastructures such as CORBA. These new infrastructures take this issue further,
creating what in effect is a virtual vNM, where the illusion is created that all
components in the system exist within the same computational machine (see Figure
10).
Since that time, the nature of the environment in which these distributed systems exist
has been changing. Fuelled by the Microsoft vision of a PC on every desk, personal
computers have taken over many of the responsibilities that used to be the domain of
the mainframe. The network has also seen a dramatic enlargement with the explosion
of the Internet, but has also suffered from quality of service issues. Object-oriented
programming has fundamentally changed the way we view software systems, moving
36
On the Structuring of Distributed Systems Towers of Babel
us away from the synchronous single threaded model, to one that includes
asynchrony, multi-threading, encapsulation and component reuse. In short, many of
the assumptions made in the creation of RPC have now become erroneous. For
example, RPC implicitly assumes that the network is 100% reliable, and thus that
remote procedures will always be available. Anyone who has used the Internet will
attest this as a fallacy.
By 1994, the first strong doubts over the validity of the RPC approach were being
raised. In a seminal paper, Waldo et al [Waldo94] argue that objects5 acting in a
distributed system are intrinsically different to those in a local system and therefore
must be treated very differently. They identify four major problem areas when
comparing local and distributed systems (see Table 3).
Problem Details
5
This applies equally to processes and procedures, etc
37
On the Structuring of Distributed Systems Towers of Babel
In addition, even before the Waldo paper, Nelson himself had suggested that:
“If the aim is to provide location transparency then we must aim to provide
the same behaviour as in the case of a failure in a local procedure call,
although this can be costly.” [Nelson81]
In Figure 12, we see a software system built with the RM-ODP abstraction distributed
over three vNMs. Each component has access to certain resources, but of course,
there is no way for the component to tell if the resource is local (within the same
vNM) or remote. In the case of remote resources, the request broker is required to
support the illusion that they are indeed local, by providing the relevant connections
“behind the scenes”. This is depicted by the lines flowing through the plane of
transparency. From this very simple hypothetical system, it is evident just how many
lines cross the boundaries of vNMs. At each crossing, the system is subject to the
types of problem identified in Table 3.
Inter-component
communication
Plane of Transparency
Distribution Infrastructure
The central thesis of the Waldo paper is that local and remote computing are just plain
different, and should be treated as such. They argue that distributed systems should
be built with the premise that there are two distinct types of objects: local objects and
38
On the Structuring of Distributed Systems Towers of Babel
remote objects. Although Waldo et al identify the key differences between local and
distributed computing, their discussion of why these make distributed computing
different are pragmatic. The differences are eloquently stated, but there is no reason
given for exactly why these differences are evident, just that they are – and that the
two types of computing should be treated differently. In this part of the thesis, we go
further and present an argument as to the cause of these differences.
We have seen that IPC was an ideal abstraction for interacting processes within the
same vNM. Its success was built on the fundamental elements of a vNM, i.e. a single
memory (that could be shared), a single CPU and local files (I/O). RPC attempts to
take this effective abstraction and make it apply to many vNMs, by making location
transparent. This is similar to many contemporary distribution infrastructures.
Indeed, the stated goal of the Millennium experiment undertaken at Microsoft
Research is:
However, practice has shown that this approach is fraught with difficulties [Waldo94],
and the discontinuation of this project serves as a clear indication.
Certainly then, there are two diametric views as to how we may build reliable
distributed systems.
This thesis supports the assertions of Waldo et al, i.e. that we should treat local and
remote objects differently. However, we go further and argue that the fundamental
reason that RPC, and thus contemporary distributed systems based on the RM-ODP
abstraction, suffer from the problem mentioned above is because of the underlying
abstraction they embody. The RPC abstraction pays little regard to the supporting
layers beneath it; rather it attempts to strike out on a new course of its own and is
unsuitable for the underlying hardware substrate. Instead of continuing the long line
of abstractions that have served so well, RPC attempts to impose an abstraction that is
perfect for one vNM onto many. It pays little attention to the underlying hardware
39
On the Structuring of Distributed Systems Towers of Babel
abstraction, which as we have seen is the vNM. RPC has broken the abstraction
tower, and it is this fact that causes the acute problems associated with distributed
systems that Waldo et al have identified. While the RPC approach has been, and
continues to be, useful under certain circumstances, it no longer supports the type of
distributed system we wish to build in today’s networks with current software
engineering techniques and technologies.
As computers have become more prevalent, and the resources they represent the
lifeblood of business, we have developed methods for connecting computers and
enabling them to communicate with each other. Once communication was achieved it
was only natural that we pursue techniques for building software systems that span
multiple hosts, allowing us to harness the additional power and multiple resources
made available.
In this chapter, we have examined the emergence of distribution, and traced the
evolution of abstractions used to build networks. Networks are an essential
constituent of distribution, they enable communication between computers. They are
the substrate over which distributed systems can be built. Next, we have examined
the evolution of abstractions used in contemporary distributed systems. We have seen
how RPC attempts to extend the extremely successful IPC abstraction, ultimately
leading to the location transparency abstraction, embodied in many contemporary
distributed infrastructures. In effect, these infrastructures attempt to create a virtual
von Neumann machine. This approach has been shown to be unreliable.
The central thesis in this chapter is that by attempting to create the illusion that all
components exist within the same machine, location transparency is breaking the
40
On the Structuring of Distributed Systems Towers of Babel
layers of abstractions upon which computing has been built since the dawn of
computing. The abstraction is unsuitable for the underlying computational machine
upon which it must execute. We need new techniques and abstractions for distributed
computing that do not break our layers of abstraction, rather they continue to
appreciate what has preceded them, and are suited to the underlying computational
machine. In the next chapter, we review mobile code, a new technology that promises
to fulfil these requirements.
41
On the Structuring of Distributed Systems Mobility
3 Mobility
3.1 Introduction
Code mobility is not a completely new idea. There have been several widely used and
successful mechanisms for moving code around a network previously employed,
perhaps the best known being the PostScript language [Adobe85] that is used to
control printers.
Recently though, mobility has been examined from a different perspective, and has
become a burgeoning topic for discussion in mainstream distributed systems research.
Mobility currently boasts a flourishing research community dedicated to investigating
the potential of this new paradigm [Mobility99]. So far in this thesis, we have built an
argument against using location transparency, the abstraction embodied in
contemporary distributed systems. We have identified the need for new abstractions
for distribution, which are entirely suited to the underlying computational machine,
and are able to distinguish between local and remote resources.
42
On the Structuring of Distributed Systems Mobility
This basic concept was the seed for further research, and out of it grew projects such
as Accent [Rashid81] and RIG [Rashid86], which culminated in the MACH
[Accetta86] operating system. These were experiments in building distributed
operating systems, which attempted to present the same abstractions regardless of the
underlying hardware substrate. Latterly, this work has been embodied in migratory
systems such as Locus [Thiel91] and Cool [Lea93], which support process and object
migration respectively. Both systems provide mobility at the operating system level,
and therefore any migration is transparent to the user and system programmer. As
argued in Chapter 2 though, complete transparency can be counter-productive.
Certainly, the designers of Emerald [Jul88] concur, as they offer the programmer
explicit control over migration, as well as automatic migration.
Thus far, the techniques described have been positioned at the operating system level
and are particularly useful when dealing with small scale distributed systems. They
do not tend to be suitable for large-scale networks and systems, particularly those of
the scale of the Internet, and have mainly been used for techniques such as load
balancing [Picco98]. Although process migration never took off as a commercial
reality, the research was widely regarded as successful [Milojicic99].
The notion of mobile computation at a higher level of abstraction was first suggested
in “Objectworld” [Tsichritzis85], a hypothetical computing environment geared
towards information dissemination in which all objects could be mobile. This, and the
ideas embodied in migratory systems have spawned a new field of research that is
investigating similar solutions but on a much larger scale and at a higher level of
abstraction. This field has many names, amongst them mobile code systems, mobile
object systems, active networks and mobile agents. For the remainder of this thesis,
we use the terms interchangeably unless explicitly stated otherwise. Unfortunately,
there is still no consensus among the mobility research community as to what exactly
each term refers to, or a standard definition for each to which everyone subscribes.
Therefore, in this thesis we define a mobile agent as:
43
On the Structuring of Distributed Systems Mobility
The notion of a mobile agent was first established in 1994 with the release of a white
paper by White [White94] that described a computational environment known as
“Telescript” [White96]. In this environment, executing programs were able to
transport themselves from one node to another in a computer network, in order to
interact locally with resources at those nodes. Telescript was never a commercial
success, but it did generate a lot of academic interest.
Since that time, this field has exploded in popularity, with a plethora of new
frameworks and infrastructures appearing almost continually [MAL99]. This
profusion of experimental frameworks is reminiscent of the explosion of new
programming languages in the early days of computing (see Chapter 1) and is
indicative of a new and immature research field. Although we review some of the
more popular mobile code systems in the next chapter, to fully understand this new
paradigm we must first examine the differences between contemporary and mobile
code based distributed systems.
Distributed systems built around the tenet of mobile code are quite different. Instead
of masking the physical location of a component, mobile code infrastructures make it
evident. These systems embody a completely different abstraction. Each node in the
network has an Executing Environment (EE) through which components are able to
44
On the Structuring of Distributed Systems Mobility
access the facilities of the network layer. These facilities can then be used to
communicate with other remote components as normal. However, if components
require access to a resource that is not located at their current host, or wish to interact
locally with another component, they are able to migrate to the new host. In Figure
13, we see examples of the mobile code paradigm. Component A is in
communication with Component B, both of which have references to local resources.
However, in contrast to contemporary distributed systems, A requires explicit
knowledge of the location of B so that they may communicate. There is no request
broker to mediate the communication. Component C is separate, and demonstrates
the mobility aspect of this approach. Instead of communicating with a data source
across the network, C is able to migrate to the data source’s host, and interact with it
locally. In a contemporary system, C would not even be aware that the data source
resided on a different host.
Component
EE A Communication EE B
Component A Component B
Component C Component C
Component
migration
Software View
Component C Component C
Figure 13. Communcation across the network, and mobile agent migration.
The major differences between mobile and contemporary distributed systems are well
described by Picco [Picco98] and are summarized here:
• Code mobility is geared for Internet-scale systems – systems such as Emerald and
Locus were designed with small-scale networks in mind. Thus, they assume high
45
On the Structuring of Distributed Systems Mobility
bandwidth, reliable networks, small latency, trust, and homogeneity. Mobile agents
on the other hand are built with the opposite criteria in mind.
• Programming is location aware – mobile agent systems provide an abstraction in
which the notion of location is available to the programmer and the constituent
components of the system.
• Mobility is a choice – migration is controlled by the programmer or at runtime by the
agent, instead of being triggered transparently by the system.
• Load balancing is not the driving force - process and object migration operating
systems were primarily designed to assist with resource and load balancing. Mobile
agents are used to design systems supporting flexibility, autonomy and disconnected
operation.
Mobile code is a powerful programming abstraction offering many possibilities. To
fully appreciate and employ successfully, it is important to understand all the nuances
of the different architectural abstractions afforded to the system designer. In the
following sections, we describe the different flavours of the mobile code paradigm.
46
On the Structuring of Distributed Systems Mobility
Component A Component B
L
L L R
Message between
communicating
components
Host A Code on Demand Host B
Component A Component B
R L L
L
Component A Component A
L L R
Mobile agent migration
Host A Host B
Client Server
Component A Component B
L R
47
On the Structuring of Distributed Systems Mobility
with R to perform T. This method is quite different to the previous two examples, in
this instance an entire component is migrating, along with its associated data and
logic. This is potentially the most interesting example of all the mobile code
abstractions. There are currently no contemporary examples of this approach, but we
examine its capabilities in the next section.
3.4.4 Client/Server
Client/Server is a well known architectural abstraction that has been employed since
the first computers began to communicate. In this example, B has the logic L to carry
out Task T, and has access to resource R. Component A has none of these, and is
unable to transport itself. Therefore, for A to obtain the result of T, it must resort to
sending a request to B, prompting B to carry out Task T. The result is then
communicated back to A when completed.
48
On the Structuring of Distributed Systems Mobility
begin a new dialogue with the WarehouseAgent to establish when the required book
will become available. This scenario is depicted in Figure 15 below.
Path of
Communication
BA WA Path of mobile BA WA
agent
From these diagrams, it is evident that a mobile agent architecture involves less
recourse to network communication than a client/server architecture in this particular
scenario. In addition, each time the mobile agent is using the network it is to transport
itself, not make a remote call to a component on another machine. If we imagine that
each interaction entailed more than a simple request/reply dialogue then the
client/server diagram would quickly become littered with communication arrows,
whilst the mobile agent one would remain identical. The ability to move the
computation to the data source and continue locally is one of the biggest advantages
of mobile agents.
Message
Figure 16. Mobile logic and data in the Mobile Agent Abstraction
49
On the Structuring of Distributed Systems Mobility
3.6 Commentary
In Chapter 1, we traced the evolution of computing from the early work of von
Neumann through to the present day. We followed the emergence of computing
abstractions, and saw how those we employ have been gradually layered upon each
other, forming a continually ascending tower of abstractions, whilst retaining as their
underlying computational model and base abstraction the von Neumann machine.
In this chapter, we have reviewed a new paradigm, with new abstractions, that
potentially fulfils the requirements for a distribution abstraction put forward earlier in
Chapter 2. Our requirements may be summarised as follows.
A distribution abstraction:
It is precisely these requirements that the mobile code paradigm fulfils. As we have
seen, its central tenet is one of local interaction. Components in a distributed system
that wish to communicate are able to transport themselves across the network so they
may interact locally at the same host. In addition, components are also able to
communicate by exchanging messages across the network.
In each case, the core abstraction remains faithful to the underlying von Neumann
machine and the Tower of Abstractions. Instead of attempting to remove location
from the abstraction, and build a virtual computational machine, mobile code makes
50
On the Structuring of Distributed Systems Mobility
In Figure 17, we see the same hypothetical distributed system that was first
encountered in Chapter 2. However, this time the system has been built with the
mobile code paradigm. Again, each process has access to certain resources, but this
time there is clear knowledge of the location of each resource, i.e. in which vNM it
resides. Local references are shown in yellow, whilst remote references are shown in
red. Knowledge of the location of a resource, allows each component to make a
judgement about the type of reference it holds to that resource. In comparison to the
RM-ODP version of this model, there is no illusion being created by the “plane of
transparency”. While network references may still suffer from the problems depicted
in Table 3, the components themselves are aware that this is a potential problem. In
51
On the Structuring of Distributed Systems Mobility
The major conceptual difference between the two distribution abstractions is clear,
location. With location transparency, location is removed from the abstraction and a
virtual computational machine is created which attempts to create the illusion that all
components in a system reside within the same address space. The illusion, however,
can be shattered by any number of problems associated with trying to create a rock
solid abstraction across the network.
In contrast, local interaction makes location evident and components are able to make
a judgement themselves about how to communicate with other components. It is this
fundamental difference that the author believes is vitally important. In Chapter 1, we
discussed how abstraction is an immensely powerful tool. It allows us to manage the
complexity of a situation, and to rationalise about it by removing those details we
consider inessential. It is the author’s belief that when it comes to distribution,
location is a vital piece of information. We are no longer attempting to build
distributed systems in networks in which location can be papered over, in which the
size of the system can mask the fallacies in the paradigm. We are now building large
systems in which the network is unreliable, in which the topology of the network or
availability of resources may change rapidly. In such an environment, information
about location becomes essential. If we examine perhaps the most successful
distributed system of all time, the Internet, we see that location is central to its
success. The URL [Berners-Lee92b] abstraction is purely a reference to location, but
has been fundamental to the evolution and success of the web. We must learn from
these lessons.
"A designer knows that he has arrived at perfection not when there is no
longer anything to add, but when there is no longer anything to take away”
[Antoine de Saint-Exupery]
52
On the Structuring of Distributed Systems Mobility
Local interaction on the other hand remains faithful to the core abstraction, and makes
use of the core facilities embodied in IPC. Instead of masking location, it makes it
evident. Communicating components are aware if they are local or remote to each
other, and are able to make a judgement about how to communicate. By utilising the
strengths of the von Neumann machine and the network, the local interaction
abstraction allows us to build distributed systems that do not suffer from the Waldo
[Waldo94] problems.
The central argument of Part I is that local interaction should be the abstraction of
choice for building distributed systems. In hindsight, we should view location
transparency as an evolutionary blip, a wrong fork in the road. If we are to build
successful distributed systems in the myriad of new networks, we must be bold and
admit our mistakes of the past.
53
Part II
4.1 Introduction
Mobile Code is a new and generally untested paradigm for building distributed
systems. Although garnering many plaudits and continually increasing in popularity,
the technology and research field remain relatively immature [Picco98]. To date,
most research has focused on the creation of mobile code frameworks, and as yet
there is no consensus on a conceptual framework with which to compare results.
Further, there is no clear understanding of the new abstractions offered by this
paradigm. Part I of this thesis aspires to address the conceptual deficiencies of the
research field by offering a philosophical argument and critique of mobility.
In Part II we begin our study of mobility in the real world. In later sections of the
chapter, we will see that there are many advantages claimed for mobile code systems.
Unfortunately, these claims remain qualitative and subjective in their nature. The
dearth of quantitative results, however, means it has not yet been possible to properly
evaluate the potential of either the technology or the paradigm. In the last year a
trickle of results is beginning to validate some of the claims [Papastavrou99]
[Picco98b], and these results are certainly important in establishing the credibility of
mobile code systems. Nonetheless, it is the author’s belief that these types of
improvement are optimisations, or incremental improvements. The true benefit of the
paradigm is in the type of software architecture that can be built. In support of our
arguments presented in Part I, in Part II we provide an insight into how well mobile
code architectures respond to real world pressures.
55
On the Structuring of Distributed Systems Mobility in the Real World
computing, and the abstractions that exist in this field, beginning with the early
pioneering work of John von Neumann. We believe that Part I contributes to raising
the level of conceptual understanding surrounding the mobile code paradigm,
especially when examined in the wider context of the different abstractions embodied
by distributed systems.
As we have seen, the technology base in the field of mobile code remains immature.
Whilst the plethora of new frameworks continues to increase, the amount of real
distributed systems built with this technology remains low [Milojicic99]. Although
abstractions are the central essence of a paradigm, the technological instantiation of
that abstraction must successfully embody it. To support our argument of Part I, we
must prove that mobile code can be used to build real world systems. Thus, our
research motivation is to investigate and use mobile code, as it would be in the real
world, and to analyse the issues involved and the lessons that can be learnt.
6
Indeed, an entire academic career could be pursued with these arguments!
56
On the Structuring of Distributed Systems Mobility in the Real World
systems of the Remote Computation and Mobile Agent abstractions. We have gained
an understanding of each abstraction, and have been able to compare the two. For
ease of use, and because of the conceptual abstraction they support, from herein we
refer to the former as the Mobile Object system, and the latter as the Mobile Agent
system.
"There was a time when the virtue of software over physical media like paper
and pencil was in its very responsiveness … Although this may be to some
extent true for small projects (program building), it is not (and has never
been) true for ambitious undertakings (system building). In fact, software
systems are usually the least responsive element in many organisations today.
The organisation as a whole is able to adapt more fluidly than the software
upon which it has grown dependent.” [Cox87]
Recent experience has shown that attempts to create large scale supporting
infrastructures have resulted in complex monolithic systems that are the least flexible
element within an enterprise [Barber98]. Most companies require a change in their
software at some point, and so software change is one of the most important issues
currently facing the software industry [Booch94]. A software system will have a
limited lifetime if it cannot be altered to accommodate a change in the business
process it is intended to support.
This issue is well known to the software engineering community, and in this thesis we
refer to it as System Agility. There already exists a substantial body of work relating
to the issue of system agility, e.g. [ICSE’99], and the full variety of issues is vast. We
57
On the Structuring of Distributed Systems Mobility in the Real World
cannot hope to consider them all in our experimental study, so we initially select two
broad but vitally important factors on which to focus:
These are still broad issues, with many factors contributing to each, so we refine our
focus even further. To represent each facet, we have selected the specific issues of
Semantic Alignment (SA) and Component Coupling (CC). System integration and
agility has been one of the main issues of research at the MSI Research Institute for
nearly a decade, and therefore SA and CC augment the research undertaken by other
members of the institute [MSI99] [Coutts98b]. In the next sections, we briefly review
both concepts.
58
On the Structuring of Distributed Systems Mobility in the Real World
For example, if in the real world a business process contained the concepts of Apples,
Oranges, Potatoes and Tomatoes, but the software model only contained the concept
of Food, then this system would not be as successfully aligned as a system that
contained the concepts of Fruit and Vegetables.
The benefits of loose coupling are potentially huge and include [Clark96]:
59
On the Structuring of Distributed Systems Mobility in the Real World
1] To demonstrate mobile code can be used to build real world software systems
We describe the construction of two prototype mobile code systems. They are used to
investigate the effectiveness of the two selected abstractions in building real world
distributed systems. To simulate real world software problems the prototypes are
constructed to support the Sales Order Process of a UK manufacturing enterprise.
This real world business process was identified during an industrial case study (for
further details see Chapter 5).
Merely building proof-of-concept systems is a worthy exercise, but systems in the real
world very rarely fulfil all the requirements of a business for any length of time. In
the majority of cases, the capabilities of a software system will need to be later
upgraded to support new functions or features, usually due to a change in a business
process. In addition to their creation, we aim to evaluate the prototypes with respect
to the issues of understanding and changing a system that currently confront system
designers. To achieve this we have extracted several “Scenarios for Change” from
data collected during our case study, which will be used to evaluate how well the
prototypes respond to change. Three common and related problems facing the
software industry today have been identified as candidates for examination. These
are:
From the experiments, we hope to gain an insight into how successful mobile code
systems are when subjected to the kinds of pressures prevalent in industry.
60
On the Structuring of Distributed Systems Mobility in the Real World
Weak mobility on the other hand is only able to migrate the code associated with the
entity across the network. Any state or non-constant data that is required by the entity
must be packaged up for travel before migration. The onus of this packaging is
61
On the Structuring of Distributed Systems Mobility in the Real World
placed upon the programmer at design time. Weak mobility is generally easier to
achieve technically, especially with programming languages such as Java available,
but is burdened by its limitations when complex applications are considered. The
programmer must be fully aware of any data that may be required after migration and
take care to package it, or it will be lost. The majority of (if not all) mobile agent
frameworks based on Java are weakly mobile (see Section 4.6. for examples)
Compilation is not particularly popular in the field of mobile agents, since it forces the
sending machine to be aware of the platform and hardware architecture of the
receiver, so that it may choose the appropriate compiler or the appropriate library of
native code. As the number of different platforms being supported increases the
complexity is wont to spiral out of control. Compilation does however have the
advantage of speed of execution. Some examples are [Knabe96] [UCI96].
62
On the Structuring of Distributed Systems Mobility in the Real World
• Copy - If the resource can be copied, then the mobile agent can take a copy of the
resource with it to the new host.
• Move - The mobile agent can take the only copy of the resource along with it.
• Network reference - If the resource is static, then the reference can be changed into a
network reference that points back over the network to the resource.
• Reference removal – If the reference is no longer needed, or cannot be accessed
remotely via a network reference, it can be removed.
• Rebinding of reference – If another copy or instance of the resource, or a similar
resource, is found at the new host, the reference can be rebound to it.
Which tactic to adopt is often determined by the nature of the resource in question,
and the programming language being employed. For example, it would be
nonsensical to copy or move an entire database to a new host.
4.4.4 Security
Security is one of the most emotive issues raised when discussing mobile agent
systems. It is often quoted [Johansen99] as the major reason mobile agent systems
have not taken off in the mainstream. There is currently a wealth of research being
done on this particular subject [Vigna98]. A brief summary of the most important
security issues are describe below in Table 4.
The work described in this thesis is concerned with private networks, in which all the
hosts and agents are trusted and their origins known. Thus, the only class of
applicable attack is that of a third party eavesdropping on a transmission. This could
be overcome by the usual cryptographic techniques employed in such exchanges as
email, for example. Therefore, the issues of security are considered external to the
scope of this thesis.
63
On the Structuring of Distributed Systems Mobility in the Real World
4.4.5 Communication
Communication among mobile agents in a network can take several different forms.
Since there is no guarantee that there is actually another agent at the present node, the
most basic inter-agent communication usually begins by using the executing
environment to pass messages to another agent. This can be achieved directly, if the
agent’s identity is known, or can be broadcast to the entire node. Once the presence
of the agent is established, communication can then proceed more privately with both
agents being involved in a one-to-one dialogue.
Mobile agents are also able to communicate over the network, in a similar way to
traditional Internet applications, such as ftp, telnet, etc. Once again, the initial
establishment of a dialogue between agents is achieved via the hosting executing
environments. Communication with remote mobile agents does have associated
problems, caused by the mobility of the agent. Passing messages between two agents
requires some type of address, which refers to the receiving agent’s location.
64
On the Structuring of Distributed Systems Mobility in the Real World
Obviously, this can cause problems if the receiver is able to move to a new location,
as the address is no longer valid. New techniques for overcoming this particular
problem are in the early phases of research and development, but include multicast
messaging, where a message is broadcast to the entire network, instead of just to the
local node.
So far, there have been many advantages claimed for mobile agents
[Chess97][Lange99]. These claims are usually in the form of qualitative assessments
but unfortunately, very few quantitative measures exist to support these claims.
However, a summary of some of the more frequently quoted and accepted claims are
described in the following sections.
65
On the Structuring of Distributed Systems Mobility in the Real World
processing, they are able to continue with their work, transporting merely the result to
a new host, if it is in fact needed.
Mobile agents are a solution to this problem. A particular task can be encapsulated
within a mobile agent. The agent is then dispatched to a host that is part of the
network backbone, and enjoys massive bandwidth access. Once there, the mobile
agent is able to carry out its task in the resource rich environment before returning
home. A further advantage of this paradigm is that since the mobile agent is now
independent of the device, the device can go offline, or even be switched off, before
again connecting later for the agent to return with the results.
66
On the Structuring of Distributed Systems Mobility in the Real World
was hosting the component you were communicating with has died or the component
itself has frozen.
One of the underlying philosophies behind mobile agents is that the network is not a
permanent resource. By building software with mobile agents, distributed systems
can be less dependent on the network, since the underlying tenet is local interaction.
Discovering the nature of a failure in a local context is a much easier proposition, and
so systems built this way can be more stable. Mobility can also be used to achieve
replication for fault tolerance, and support robust distributed systems. If a host is
being shut down, or experiencing problems, an agent is able to react to this by
migrating to a new host where it can continue with its operations.
Further, since mobile agents are able to carry around their own code, the distributed
system can become more flexible since the mobile agent is not merely limited to the
functions a server predefines. It is able to bring along new or improved code and can
extend the functionality of the server in which it is executing.
67
On the Structuring of Distributed Systems Mobility in the Real World
4.5.8 Commentary
The advantages we have seen described for mobility are certainly exciting. Whilst
very few quantitative results exist to verify the claimed advantages, the overall picture
painted is one of a completely new paradigm for building distributed systems. Such is
the excitement that many research labs have already begun to produce mobile code
infrastructures [Lange98] [Concordia]. In later years, this initial group may become
known as 1st generation infrastructures.
As the mobile code research field has matured, a few quantitative measures are
beginning to be published [Picco98b]. Papastavrou et al [Papastavrou99] have shown
that using mobile agents to perform your database queries locally can have a dramatic
affect on system performance. Johansen has shown that bandwidth usage can indeed
be reduced by significant levels by using mobile agents when compared to traditional
client/server architectures [Johansen99].
It is the author’s belief, however, that the majority of advantages discussed in the
previous sections are merely optimisations. Many of these advantages could be
achieved with contemporary distributed systems, for example by redesigning
communications protocols. The true advantage of this new paradigm is the types of
distributed system that can be built: ones that do not suffer from the Waldo problems.
In the next section, we review some of the well-known frameworks to see how these
new abstractions are manifesting themselves.
68
On the Structuring of Distributed Systems Mobility in the Real World
review some of the better-known frameworks and analyse how they embody the
mobile code abstractions discussed in Chapter 3.
4.6.1 Java
Although not marketed as a mobile agent framework, the Java [Gosling96]
Development Kit does provide enough native facilities to support weakly mobile
code. This should not be a surprise since the original goal of Java’s designers was to
provide a portable, easy to learn, network aware object-oriented language. To ensure
portability, Java was designed to be platform independent. Instead of compiling Java
into native instruction codes, it is compiled into an intermediary format known as
bytecodes. The bytecodes can then be interpreted on any platform that has a suitable
java interpreter; the interpreter is known as the Java Virtual Machine (JVM)
[Lindholm99]. By having the intermediary bytecode stage, Java is an ideal language
for weak code mobility. The most widely known examples of Java’s mobile code
capabilities are probably applets and servlets [Hopson96], mobile snippets of code
that can be transferred over the network in an asynchronous manner. Applets and
servlets should not be viewed as mobile agents however, since they are merely single-
hop pieces of code that contain no notion of autonomy. They do embody the Remote
Computation (RC) and Code on Demand (CoD) design abstractions (see Section 3.4).
4.6.2 D’Agents
Developed at Dartmouth College, D’Agents [Rus97] is one of the new breeds of
mobile agent framework. In its first incarnation as Agent Tcl [Gray97], D’Agents
employed a Tcl [Ousterhout94] interpreter, extended to support strong mobility.
When an agent wishes to migrate to another machine it need only call a single
function, agent_jump, which triggers the interpreter to package up the complete state
of the agent and send it to a destination machine. Strong mobility has always been a
design goal of the Dartmouth Group and recently, D’Agents has been updated to be a
69
On the Structuring of Distributed Systems Mobility in the Real World
multi-language framework and now supports strong mobility in Java. However, this
facility has come with a price; in order to support strong mobility in Java the
D’Agents team had to modify the JVM, which means that the framework will only
work with the specialised JVM. With the current rate of change in the Java world,
this means that the D’Agent interpreter can quickly become out of date.
4.6.3 Mole
Mole [Straßer96] was the first mobile agent framework developed in Java, and was
initially released in 1995 by the IPVR group of Stuttgart University. Mole supports
weak mobility only, a choice the designers justify in [Baumann97]. Interestingly, the
Mole group assert that their choice of weak mobility was to avoid the problems of
using a modified JVM that quickly became out of date. Their goal was to provide a
pervasive framework the worked ‘out-of-the-box’ with any standard JVM. This is in
contrast to the D’Agents group and demonstrates the generally unexplored nature of
the research field. Whether strong or weak mobility is the correct methodology
remains an open question within the mobility community.
Mole provides the notions of places, the executing environment, where user agents
are able to meet and communicate. They can interact with the underlying operating
system resources via service agents, which are always stationary. Mole supports a
number of communication mechanisms including badges, sessions and events. An
ascending hierarchy of increasingly anonymous and wider scope of influence
mechanisms, they are fully described in [Baumann97].
4.6.4 Hive
Hive is a distributed agents platform, a decentralized system for building applications
by networking local system resources, and taking advantage of mobile code
[Minar99]. Its designers, a group at the MIT Media lab, are using it to provide the
infrastructure for connecting their many Things That Think [Gershenfeld99] research
initiatives. Hive is built using the standard Java features of object serialisation and
interpretation used by so many mobile agent frameworks and therefore supports weak
mobility.
70
On the Structuring of Distributed Systems Mobility in the Real World
The Hive architecture consists of the following three abstractions: cells, shadows and
agents. A cell is the executing environment in which agents are hosted. Cells also
contain shadows, which are placeholders for local resources, for example a display or
printer. The designers of Hive have made particular efforts to address the problems of
agent description and Hive supports both a syntactic and semantic ontology.
4.6.5 Voyager
ObjectSpace’s Voyager platform is a one-size-fits all communication infrastructure.
At the time of writing Voyager currently supports EJB [Sun99], CORBA, DCOM,
and RMI. In its early days ObjectSpace promoted the capability of Voyager to take
existing CORBA IDL classes and “virtualise” them, effectively making them weakly
mobile. This was a major selling point for Voyager, but recently the company has
been playing down these capabilities [Glass99]. Voyager should really be viewed as a
Java based messaging broker that has some added capabilities from the mobile agent
field. This allows programmers to create network applications by choosing between
traditional and mobile distribution technologies, and has been a widely successful
product.
4.6.6 Jini
Jini [Arnold99] is Sun Microsystem’s proposed architecture for embedded network
applications. It is built using Java and RMI in much the same way as Hive. Jini
71
On the Structuring of Distributed Systems Mobility in the Real World
4.6.7 Aglets
The Aglet Software Development Kit (ASDK) [Lange98] has been developed by
IBM’s Tokyo Research Labs, and was one of the first and most publicised Java based
mobile agent frameworks released. The core abstractions supported by the ASDK are
that of an aglet, a proxy and a context.
The aglet context is the executing environment in which the aglets exist. It provides
an interface to the underlying operating system through which aglets are able to
access core facilities, and gain references to other aglets’ proxies. The context also
manages the lifecycle of an aglet. Since the ASDK only provides weak mobility, this
lifecycle is one of the ASDK’s most valuable features since it allows the programmer
to describe behaviour an aglet should perform in reaction to certain events, for
example, the shutdown of the current host, or a request to migrate to a new host. This
72
On the Structuring of Distributed Systems Mobility in the Real World
Telescript was an interpreted language that supported strong mobility. There were
actually two levels of the language: High Telescript, the actual language used for
implementation, and Low Telescript, a Postscript like language which could be
interpreted better by the top level executing environment, the engine.
Other abstractions supported by Telescript included agents, mobile agents that were
able to migrate on a single command of go; places, stationary processes that provide
interfaces to services, and were normally inhabited by agents; tickets, objects that
describe an agents journey; permits, objects that define the capabilities and resource
constraints of an agent.
73
On the Structuring of Distributed Systems Mobility in the Real World
Sadly, Telescript is no longer available, having gone to the Mobile Agent Graveyard7.
Odyssey was General Magic’s attempt to revive its flagging fortunes with a Java
based mobile agent framework that resembled Telescript. It never made it out of beta.
The ATP is an application level protocol for distributed agent based information
systems and facilitates migration of the aglets over a network. Based on the naming
conventions of the Internet, ATP uses the Universal Resource Locator (URL)
[Berners-Lee92b] for specifying host locations, whilst maintaining a platform
independent protocol for enabling the transfer of mobile agents between networked
computers. Although this protocol has been released with the ASDK, its domain of
use is by no means exclusive to aglets, as it offers the opportunity to handle mobile
7
It lives on though, through furtively copied gold CD’s!
74
On the Structuring of Distributed Systems Mobility in the Real World
agents from any programming language and a variety of agent systems, as long as
they implement the protocol interfaces.
Aglet-Aglet
Aglet-Context Communication
Communication
Aglet Migration
Aglet Proxy
This chapter also contains a review of the technical issues involved with
implementing the mobile code abstractions, a summary of many of the claimed
advantages for mobile code and a roundup of several of the more established mobile
code infrastructures. In the following chapters, we report on the implementation and
75
On the Structuring of Distributed Systems Mobility in the Real World
evaluation of our prototypes. Before that however, we describe the case study that
was used to generate a business model and process for the prototypes to support.
76
On the Structuring of Distributed Systems I.T.L. : An Industrial Case Study
5.1 Introduction
This chapter describes the industrial case study undertaken in the course of the
research described in this PhD. It was performed at Instrument Technology Ltd
(ITL), a high performance vacuum component manufacturer based on the south coast
of the UK, in Q1 1997. In the next section, we discuss the methodology and the
objectives of the case study.
Case studies are able to examine processes within a specific context, draw on multiple
sources of information, and relate a story, usually in a chronological order. In case
studies, we are able to ask: "How or why does this occur?" We can create a rich,
textured description of a social, economical or infrastructural process [Scanlon97].
This information can give an insight into how to gain answers to more specific
questions, or produce conceptual models of a business process.
It has already been shown that the mobile code community recognises the lack of real
world examples of their technology [Picco98] [Milojicic99]. We aim to prove that
mobile code can be used to build real software systems. Therefore, the scope of this
particular study was to gain an insight into I.T.L. and identify a suitable business
process. The extraction of an industrial process model would provide a suitable
reference around which the subsequent prototype implementations could be built.
Further, the case study allows us to generate real world scenarios that can be used to
evaluate the prototype systems after their construction.
77
On the Structuring of Distributed Systems I.T.L. : An Industrial Case Study
Together they allow the examiner to create a 'snap-shot' in time of a particular process
or situation. The methodology was considered appropriate, as it was capable of
fulfilling our requirements:
The models generated from the case study are presented and discussed later in the
chapter, following an overview of I.T.L.
78
On the Structuring of Distributed Systems I.T.L. : An Industrial Case Study
HQ
Manufacturing
Sales
Stock Control
I.T.L. now perceives the greatest potential for sustained growth in expanding its net-
work of Sales Agents into new markets, whilst attempting to broker new OEM deals
with further American companies [Barlow97]. Consolidation with its oriental
partners has also brought new opportunities in reducing manufacturing costs, and the
company is investigating the viability of investing in new manufacturing facilities in
the Far East.
8
The term “perceived” used here is factually correct, at the time of writing no one at I.T.L. was able to give exact figures for any
of their markets.
79
On the Structuring of Distributed Systems I.T.L. : An Industrial Case Study
Finally, I.T.L. has settled on a long-term strategy of expanding its global presence. In
doing so, I.T.L. has realised that it will no longer be economical to continue with
centralised stock control since transportation of its products is expensive. Ergo, the
company is considering adding new stock control centres or warehouses at globally
strategic locations.
5.3.3 Commentary
With the increasingly extensive portfolio of products and parts, the configurability
that I.T.L. offers to its customers, coupled with the long term strategy of expansion
and the need to remain responsive in the market place, it is clear that I.T.L. requires a
high degree of flexibility from both its business practices and the supporting IT
infrastructure.
I.T.L. is also hoping to expand both its network of Sales Agents and its stock control
centres. This requires a radical change in the company’s business practices. It must
transform from a central and localised operating model to a distributed one. The
pitfalls and problems associated with transformations of this kind are well
documented [Peters82] [Hammer93] [Goldman95].
It was our aim to generate a process model from a real company. This would then
form the basis for our implementations, and would allow us to evaluate their
performance when subjected to the kinds of pressures a real software system may
experience. From the case study, it is clear that I.T.L. is a prime example of a
manufacturing enterprise facing the very real pressures of remaining agile and
competitive. The requirements of I.T.L. can be summarised as:
80
On the Structuring of Distributed Systems I.T.L. : An Industrial Case Study
From this rather complex diagram, it is possible to extract the core business processes
and represent them in a higher level, abstract view. Figure 21, the Abstract Process
Model (APM), shows this simplified view and depicts the interactions between the
each process upon receipt of a new order. The decision branch shown in Figure 21
has been intentionally omitted from Figure 20 for reasons of clarity. By examining
the interactions between the major components of the APM a basic visual model was
generated to represent the entire process. This can be seen in Figure 22. To better
understand this model we will walk through an example of a new order being placed.
81
On the Structuring of Distributed Systems I.T.L. : An Industrial Case Study
Sales
Order In
Jack
Inputs data to Inputs data to
Sales
Package1 Package2
Jill John
Production Planner Production Administrator
Order is
Julie Manufactured
Purchaser
Purchasing
Stock Dispatch
Control
Accounts
Packing
Darren
Stock Controller
Invoices &
delivery notes Dispatch
82
On the Structuring of Distributed Systems I.T.L. : An Industrial Case Study
Order
Sales
Yes
In Stock?
No
Production
Planning
Purchasing Manufacture
Stock
Control
Dispatch
83
On the Structuring of Distributed Systems I.T.L. : An Industrial Case Study
Initial stock
Raise New
request and
Order
reply
5.4.1 A Walkthrough
A new Customer Order is placed with a Sales Agent. The Sales Agent then
interrogates Stock Control to see if the order can be fulfilled from the existing stock.
If it can, a new Order is raised and the items are allocated to that order number before
being dispatched to the customer, along with an invoice.
If the items are not in stock, then the order is passed to production control where
again, an Order is raised. Accompanying this Order is a new Works Order for the
required manufacturing of the requested products, or product parts. The Works Order
is then passed to manufacturing for completion, and if necessary purchasing for
replacement of raw materials. Once the product or parts are completed, they are
booked into Stock Control before being checked out again for dispatch. The standard
delivery time at I.T.L. is three weeks, unless the order is being specially manufactured
to specifications submitted by the customer.
84
On the Structuring of Distributed Systems I.T.L. : An Industrial Case Study
The Production Control process was removed from the model since scheduling is an
entire field of research in its own right and was deemed external to the objectives of
this thesis. In addition, the greyed out areas of Dispatch and Manufacturing represent
processes that were considered of secondary importance to the requirements identified
in Chapter 4. These would make excellent candidates for investigation and expansion
in any future work. The finalised model used in the implementation can be seen in
Figure 23.
Sales
Agent Manufacturing
Production Control
Sales
Agent Stock Control
Sales Dispatch
Agent Stock
Database
85
On the Structuring of Distributed Systems I.T.L. : An Industrial Case Study
resulting in the identification of a set of requirements that I.T.L. had of their software
system. These are summarised below.
I.T.L.:
In the next chapter we describe the implementation of our two prototype systems.
86
On the Structuring of Distributed Systems Implementation
6 Implementation
6.1 Introduction
It has been stated that the field of mobile code research lacks examples of real world
applications [Picco98]. Therefore, the work in Part II of this thesis has been
undertaken with that fact in mind. In support of our philosophical argument for
mobile code, we wish to demonstrate the feasibility of actually building real
distributed systems with this technology.
In the previous chapter, we described the generation of a Sales Order Process model,
which we aim to support with mobile code technology. We have further refined the
model to focus our investigative work on those aspects that depend on distribution by
choosing to concentrate on the interactions of sales agents dealing with order requests
and the stock control centres.
87
On the Structuring of Distributed Systems Implementation
v
Order Agent
Order
Order Agent
Delivery Date
|
u Purchasing
Order Agent
Purchasing
Stock Database Agent
Stock
Control
Agent
BOM
Materials Stock
y Database
Purchasing
Agent
Stock Database
Stock
Control
}
Agent ⊆
Manufacturing
Order Agent
Works Order
u-v - in stock
Manufacturing
Agent
u-y-x-{ - get order made
Figure 24. Agent Sales Order Process Model – with example routes for OrderAgents
If there are not enough products in stock to satisfy the order, the OrderAgent migrates
to the manufacturing plant where it uses the Product ID encapsulated in the Order
object and queries the BOM database for a list of sub-parts or raw materials required.
This is then encapsulated within the OrderAgent, which is dispatched to
manufacturing to deliver it, before returning to the SalesAgent with a DeliveryDate
88
On the Structuring of Distributed Systems Implementation
object containing a standard delivery date. If there are not enough raw materials in
stock, agents within the manufacturing plant server generate a PurchaseOrderAgent
that encapsulates details of all the required materials.
The mobile object model is very similar to that described above, the key difference
being that the results from stock database queries are gathered from remote
StockControlAgents by a mobile OrderObject guided by a specific itinerary. Instead
of processing this information locally to the data source, it is returned to the
SalesAgent for processing. At arrival, the OrderObject delivers the results before
being terminated. If further excursions are necessary, the SalesAgent creates new
mobile objects and dispatches them as required. The mobile object does not make
autonomous decisions based on the acquired information.
89
On the Structuring of Distributed Systems Implementation
6.3.1 OrderAgents
OrderAgents represent the mobile components in the Mobile Agent system. The
agents discussed in this paper can be classified in line with Franklin and Graesser
[Franklin96] as goal oriented, communicative, and mobile i.e.:
After creation, the OrderAgents migrate to the first host in their Itinerary to interact
with the resident StockControlAgent. This interaction will involve the OrderAgent
querying the StockControlAgent as to whether the Order it is carrying can be satisfied
by the levels of stock currently held. The actual stock database is queried by the
StockControlAgent; the OrderAgent does not interact with it. The OrderAgent
processes the results returned by the StockControlAgent. If the relevant stock is
available the OrderAgent asks the StockControlAgent to book out the stock to its
Order number before returning to the SalesAgent that created it to report on the
delivery date, whilst the StockControlAgent sends a message to the DispatchAgent
with details of where to send the products. If the stock levels at the first
StockControlAgent are unsatisfactory, the OrderAgent is able to migrate to the next
host in its list to begin the process again. However, if no StockControlAgents are able
to satisfy the Order then the OrderAgent will proceed to the ManufacturingAgent to
request production of the relevant components. Although this behaviour remains
unimplemented, it is intended that the ManufacturingAgent would then interact with
some scheduling software system to ascertain an estimate on the required time for
manufacture that the OrderAgent could use to report to the SalesAgent. Currently,
this communication consists of a simple message and acknowledgement from the
ManufacturingAgent.
90
On the Structuring of Distributed Systems Implementation
The valid outcome for the goal of the OrderAgent is reporting a delivery date for the
order to the SalesAgent. If all else fails, it will return and report that it has failed,
allowing the SalesAgent to begin the process again. In the future, this may also
include reporting an allocation for raw materials, an internal works order number and
time to manufacture. While not complex, OrderAgents usually make up the majority
of the agent population in the system, although this is dependent on the number of
enquiries received by the SalesAgents. Potentially, there could be hundreds of mobile
OrderAgents migrating through the network, attempting to fulfil their own particular
Order. Since OrderAgents require no interaction with a user, they have no Graphical
User Interface (GUI).
6.3.3 SalesAgents
SalesAgents are static agents that are responsible for generating Order components,
giving them an Order and Itinerary, and sending them out into the network so they
91
On the Structuring of Distributed Systems Implementation
may interact with StockControlAgents. SalesAgents are the human users’ main
interaction with the SOP system and therefore they have a GUI with which the sales
person can create a new Order. SalesAgents are more complex than the Order
components, since they must keep track of current orders, but they still remain “slim”
and can be manifest as a client for sales persons working on terminals or NetPCs, or
be hosted on a laptop for travelling sales persons.
In the mobile agent version the only logic contained within these agents is that
required to create a new OrderAgent, with its accompanying Order and Itinerary.
They are capable of maintaining a list of spawned OrderAgents, and thus are aware of
which Orders have been fulfilled. In the mobile object version, they also contain the
business logic required to process the results returned by their slave OrderObjects.
6.3.4 StockControlAgents
The StockControlAgents are another example of static agents within the systems, but
as they do not interact with human users, they have no user interface. They are
responsible for handling all requests for products and materials made by the Order
components, and act as custodians for the information contained in the stock
databases. As such, they are a communications bridge between the data sources and
the other agents in the system. All requests for stock levels and allocation must be
made through the StockControlAgents.
92
On the Structuring of Distributed Systems Implementation
93
On the Structuring of Distributed Systems Implementation
Infrastructure
Database Handler
94
On the Structuring of Distributed Systems Implementation
complex may require an attempt at semantic level communication. The use of Agent
Communication Languages (ACL’s) such as KQML [Labrou96] is typical of the more
advanced approaches that are being proposed to solve these problems. To handle the
requirement for a variety of communication methods, the Comms Package can be
interchanged by the software designer with respect to their particular requirements.
The examples shown in Figure 26 address a large percentage (but by no means all) of
the real world situations and the methods currently being employed to query databases
within a manufacturing enterprise. Connecting to a new type of database ostensibly
requires only the production of a new Database Handler. However, we make no
95
On the Structuring of Distributed Systems Implementation
claims about the ease of this task. It is understood that access to a database is not all
that is required; there remains the difficult problems of understanding the schema
used in the new database before specific information can be retrieved. Work towards
this goal can be seen in the efforts of the EDI and STEP/PDES community.
DataQueryAgent
Database Handler
M iddle Tier
Legacy System
The DataConnector Tool is a Java program, with a user interface that allows the user
to insert the required parameters for connection to a JDBC compliant data source.
The validity of these parameters can be repeatedly tested, using the refresh, update
and test facilities, until the correct configuration is achieved. Once a satisfactory
connection has been made, this data is then exported by serialising it to disk. Each
StockControlAgent can then be given a reference to the file that contains the
particular information they require to connect to their specific database.
96
On the Structuring of Distributed Systems Implementation
The biggest advantage in using this tool is the ability to test connections to a database
and server across the network, or even the Internet. If a virtual enterprise were to
decide to use mobile agent technology as a tool for
rapid integration, it is likely that one of the
collaborators (or their systems administrator) will
have some prior experience in using the
technology. The DataConnector tool allows a
single administrator to test all the required
database connections between the relevant
systems, and produce a set of connection
information files that can be forwarded to the
respective sites. Moreover, if the agent
Fig 27 Screenshot of DataConnector
environments and servers have already been set
up, a Messenger agent could deliver the files, and the DataHandlers could be
completed and initialised automatically. The lightweight nature of a connection
information file means that continued use of the agent system would allow an
administrator to build up a set of predefined files for various configurations that
would accelerate the speed with which new collaborators or data sources could be
added in the future, increasing the system agility and responsiveness of the enterprise.
The major difference between the two systems is the physical and conceptual location
of the business logic associated with processing stock query results. In the mobile
object version, this logic remains in the SalesAgent and is in an analogous position to
where it would be found in a traditional client/server system. In the mobile agent
97
On the Structuring of Distributed Systems Implementation
version, this logic is encapsulated within the mobile OrderAgent. In the former, the
processing of the results must take place after all the data has been returned to the
client, whilst in the latter the decision can be made locally to the data source by the
mobile agent.
At the start of this chapter, we mentioned that part of the rational for this study was to
demonstrate the feasibility of building real distributed systems with this new
technology. We have accomplished that. We have built two prototype Sales Order
Process software systems, based on a real world model, with mobile code technology.
In addition, through consideration of the lifecycle and maintenance issues of these
systems we have developed a proto-pattern to assist in the modular creation of
DataQueryAgents. Supporting this pattern is a small tool, the DataConnector tool,
which allows system administrators to rapidly connect DataQueryAgents to their data
sources.
During the case study, described in Chapter 6 we also established several real world
requirements for such systems. These have been identified as “scenarios for change”
that can be used to evaluate how well each prototype responds to the types of
pressures experience by real world software systems. The evaluation process and
results are described in the next chapter.
98
On the Structuring of Distributed Systems Evaluation
7 Evaluation
7.1 Introduction
The previous chapter described the implementation of two mobile code systems. The
rational for their construction was to evaluate the mobile object and mobile agent
abstractions, in an attempt to understand exactly what each has to offer, and how that
might affect how we build distributed systems. In this chapter, we evaluate how
successfully each prototype responds to the scenarios for change that were generated
from data collected in the case study of I.T.L, and report on the lessons learned and
insights gained during these experiments.
In the next sections, we present an overview of the GQM methodology, and the
principle goals, questions and metrics identified for the systems.
99
On the Structuring of Distributed Systems Evaluation
“To evaluate each prototype system from the industrialist’s perspective, with
respect to satisfying the industrial motivations to support system agility”
(see section 5.5)
To this end two workshops were held, one at MSI, Loughborough University, and one
in the Computer Science Department of Reading University. In order to evaluate the
prototypes with respect to the issues identified in section 5.5, the initial questions
focused on system complexity (how easy is it to understand), and system agility (how
easy is it to change). The results of these workshops were a large and varied set of
questions, with many superfluous or duplicate entries. This is an expected part of the
Basili methodology. Table 5 lists the focused set of questions that remained after
refining.
On their own, most of the generated metrics are extremely narrow in their focus.
However, through combination, it is possible to arrive at some useful measures of a
software system. In the following sections, we examine how these metrics can be
used to evaluate the implemented systems, and discuss how well each prototype
performs.
100
On the Structuring of Distributed Systems Evaluation
Which real world entities that are mobile are also (3)
mobile in the system
Which real world entities that are static are also (4)
static in the system
101
On the Structuring of Distributed Systems Evaluation
(11) Count how many files are changed for each requirement
102
On the Structuring of Distributed Systems Evaluation
CD = A/B
Table 7 also shows the results of metrics (1) and (2). These metrics are examples of
examining conceptual diffusion at a larger level of granularity. For example, metric
(1) requires the identification of all the information-based concepts within the real
world, and a comparison with their counterparts in the software systems. Since Order
is an information-based abstraction, it is therefore included in the results of metric (1).
We may use Conceptual Diffusion to gain an insight into how well concepts or
abstractions are embodied in software.
103
On the Structuring of Distributed Systems Evaluation
Info
Process Abstractions SOP Logic
Abstractions
Objects
Order Customer SA SCA PC M P D MobAg MobOb
BaseAglet P P P P P
DBAglet P
OrderAglet P P P
SlaveItin P P
SlaveDetails P
SalesAglet P P
Result P P
GenericTask P P
StockCommit
P P
Task
DBStockRequest
Task
P P
NewOrderDialog P
Order P
OrderListEntry P
OrderList P
Product P
ProductList P
FutureLevels P
OrderNumbers P
SlaveList P
Conceptual 4 N/A 7 4 N/A 1 1 1 6 7
Diffusion
104
On the Structuring of Distributed Systems Evaluation
Is Ps Ms Ss
SA = , , ,
Ir Pr Mr Sr
where SA is semantic alignment, I is information based abstractions, P is process
based abstractions, M is mobile components, S is static components, s denotes in
Ps
software and r denotes in the real world. Thus, is the ratio of process-based
Pr
abstractions in the software to the process based abstractions in the real world.
Order P P
Products O O
Materials O O
Static elements Mobile agent Mobile object
Sales P P
Stock Control P P
Production Ctrl O O
Manufacturing P P
Purchasing O O
Dispatch P P
Table 8. Results of Metrics (3) and (4)
105
On the Structuring of Distributed Systems Evaluation
This metric can be used to analyse a system and to assess how well the software
system reflects the semantics of the application domain. A comparison with the ideal
alignment of {1,1,1,1} can be used as a measure to gauge how difficult it might be to
understand the software, given an understanding of the application domain. Table 8
shows the results of metrics (3) and (4).
By combining the results of the first four metrics, we are able to state that:
7.3.3 Commentary
The results of the Conceptual Diffusion and Semantic Alignment analysis show that
both Mobile Agent and Mobile Object systems should be easy to understand, as the
abstractions in the real world align reasonably well with the components of the
software systems. The information abstractions from the real world are on average
spread over four components in the implementations. When considering mobile and
static component alignment, for both systems, a third of the components in the domain
are modelled as mobile in the implementation, and two thirds of the static components
in the domain are modelled as static elements in the implementations.
The difference in the two systems is shown when considering the semantic alignment
of the business process. Here the mobile agent system is shown to have better
semantic alignment than the mobile object system as the process logic for the SOP is
contained solely within the OrderAgent and not diffused across both the SalesAgent
and the OrderObject. Therefore, we can conclude that the mobile agent solution
provides better semantic alignment with the real world business processes it supports.
106
On the Structuring of Distributed Systems Evaluation
increase the semantic alignment between the real world and its supporting software
systems, for any system that is not constructed from completely static components.
In addition, these new metrics are not merely restricted to use after the fact, but can be
used proactively during the specification process, before any software has actually
been built. Ensuring good semantic alignment of a software system before production
will undoubtedly save both time and money in the long term. In particular, these
metrics can be useful for identifying those components that should be mobile, and
those that should be static. With increasing numbers of mobile code systems being
built, this will prove an increasingly important aspect of system analysis and design
â â â â
CC = ∑ äo,∑ äs,∑ äi,∑ äå
á → â á á á á
where Change Capability CC, for a required change, is the set of the changes to the
number of objects (o), the number of src files (s), the number of interactions (é) and
the number of conceptual entities (å), between states á and â. A conceptual entity is
107
On the Structuring of Distributed Systems Evaluation
Change Capability can be used to compare systems or to get a measure of the agility
of the system relative to the ideal {0,0,0,0}. For the mobile object and mobile agent
systems Change Capability for each requirement is summarised in Table 9.
System
Industrial Requirement
Mobile Mobile
Agent Object
7.4.2 Commentary
Again, these results show that both systems are relatively easy to change. Adding
new sales facilities requires only the instantiation of new SalesAgents that incurs zero
changes to the system code. New stock control centres can be added through a low
number of changes that are the same for both systems. The difference between the
systems becomes apparent when making changes to the Sales Order Process logic. In
the mobile agent system, this logic is contained solely in the single mobile
OrderAgent, whereas in the mobile object system it is contained in both the
SalesAgent and the OrderObject.
The Change Capability metric can be used by a system designer to evaluate how
responsive to change their system has been after a specific change. It is possible to
108
On the Structuring of Distributed Systems Evaluation
While both implementations have demonstrated they are relatively agile, the question
of whether they are more agile than a contemporary distributed system remains open.
Certainly, it is unlikely that a traditional system will be any more agile than the
mobile object system, since Remote Computation and Client/Server are very close in
terms of the abstraction they offer. Nevertheless, we are able to assert that the mobile
agent system has shown that it is more agile than the mobile object system. This
increased agility was due to the reduced conceptual diffusion and improved semantic
alignment that the mobile agent abstraction allows. In the next section, we pursue this
matter by examining loose coupling, a central issue to building agile software
systems.
109
On the Structuring of Distributed Systems Evaluation
they are fully decoupled from each other. During execution of the system, there is no
communication or interaction between any of the static components. Any
communication that does take place within the systems is between static and mobile
entities. Until a mobile entity alights at a host and attempts to interact with a static
one, there is no coupling between any of the components. This is significant, since
the system only experiences tighter coupling during a dialogue between components,
i.e. when a mobile entity wishes to communicate with a static one. Of course, this
dialogue depends upon prior knowledge on the part of the mobile entity as to what
language the other agent understands, be it a syntactic dialect, or a more complex
semantic conversation. In a private, controlled system however, this knowledge will
always be available. In addition, since there are very few types of component that are
mobile it is simple to alter the interactions, by updating the mobile agent population.
Research is being undertaken so a dialogue may be established with no
foreknowledge [Martin99]. Although this is currently in the static, intelligent agents
domain, in time it will naturally be applied to that of mobile agents.
7.5.2 Commentary
Our prototype systems have demonstrated extremely low, if not non-existent,
component coupling until runtime. Contemporary distributed systems such as
CORBA do support loose coupling in the same inherent manner [Coutts98b].
Components in these systems that wish to communicate require implicit knowledge of
each other’s interfaces. These interfaces are the central aspect of building distributed
systems with traditional technology.
“You should be able to look only at the IDL and know precisely how to
implement against it.” [Vinoski99]
Therefore, even if the key conceptual abstractions remain embodied in large grained
components, for these components to interact they must be aware of each other a
priory, and inevitably end up intermeshed with each other. The work of Coutts and
Edwards has shown that it is possible to build loosely coupled systems with traditional
technology by employing additional design patterns and forethought. The author
believes that being required to follow this enforced route is simply increasing the
cognitive complexity of building distributed systems. Something that is already an
onerous task.
110
On the Structuring of Distributed Systems Evaluation
111
On the Structuring of Distributed Systems Evaluation
On the other hand, components in distributed systems built with the local interaction
abstraction do not rely on interface signatures to be located. Instead, they employ
physical location as the information required for location. This is an important
difference. By retaining location as the locator, the mobile code abstraction divorces
the distribution mechanism from the dialogue constraints. This is shown in Table 10.
This separation has important implications for how tightly coupled a system might be.
By divorcing distribution from dialogue, distributed systems can be much more
loosely coupled until runtime. At the outset, all that two components who wish to
communicate must know about each other is their respective locations. It is only
when they actually wish to interact that they become more tightly coupled. The
difference to contemporary technologies is in the timing of when it is required.
The implications of this subtle change are fundamental. System agility is affected by
the coupling of components within a system, and in this respect, we argue that local
interaction does indeed support looser coupling than traditional distribution
technologies. By divorcing the mechanism for distribution from the dialogue,
components in a system can be loosely coupled right up until the moment of
interaction. Although once engaged in dialogue the components become tightly
coupled, the moment of coupling has been delayed. Therefore, we may conclude that
mobile code systems are more loosely coupled, and this looser coupling enables
improved system agility when compared with traditional distribution technology.
The important issue to understand is why there are such marked differences between
the abstraction offered by current distribution technologies and that offered by mobile
code. In chapter one we examined the history of computing and saw how the
computing landscape we inhabit today has been formed through the gradual layering
of ascending abstractions. This is not a problem, since abstractions are an extremely
useful tool for reducing the complexity of a situation, removing the minutiae so one
might contemplate the problem at hand with clarity. However, what is important
about abstraction is the importance of using an appropriate one. One that is able to
accurately describe the real situation, without losing any important information.
It has been the author’s belief that the major tenet of RM-ODP systems, that of
location transparency, is fundamentally flawed in this respect. The first notion of this
112
On the Structuring of Distributed Systems Evaluation
abstraction arose when Birrel and Nelson attempted to take the extremely successful
abstraction of IPC, and apply it to many networked machines, in order to make local
and remote calls look identical. This philosophy has prevailed and been extended so
that we currently employ an abstraction that attempts to make every object or
component in a distributed system believe they are executing in the same computing
machine. However, by attempting to “shoehorn” an abstraction that was perfectly
suited for the underlying hardware, i.e. a single von Neumann machine, onto many
computing machines an important piece of information has been lost from the
abstraction – location. Waldo et al identify several problems of distributed systems
but do not offer a clear reason for these problems. We propose that it is due to the
loss of location from the distribution abstraction. Identification of components in the
network can no longer be achieved via their location, instead they must be identified
by their interface signatures.
The assertion of the author is that although this technology can indeed build
successful distributed systems, the drawbacks do not warrant the effort. The price for
using the interface as a locator is tightly coupled systems that are difficult to change.
Instead of enabling location transparency, mobile code systems enable local
interaction, an abstraction ideally suited to single von Neumann machines. By using
physical location as a locator, mobile code systems are able to separate the issues of
distribution from the issues of dialogue, and thus these systems are more loosely
coupled. Additionally, they provide improved semantic alignment, and thus reduce
the cognitive complexity of the system.
113
On the Structuring of Distributed Systems Evaluation
demonstrate the feasibility of actually building distributed systems with mobile code
technology, and to investigate the implications for system agility when using this new
paradigm.
We initially examined the issue of semantic alignment and compared our two
prototype systems. The experimental work has shown that by reducing the conceptual
diffusion in a system, the mobile agent abstraction is able to offer improved semantic
alignment with the business process it is intended to support when compared to the
mobile object system. The difference is barely significant in our systems, but could
easily be magnified in a full size system. In the process of this evaluation, two
software metrics have been developed to assist the system designer in identifying
which components, if any should be mobile.
When looking at loose coupling we see no difference between the mobile object and
mobile agent prototypes. However, in general component coupling in these systems
is extremely low. This is in marked contrast to distributed systems built with the
location transparency abstraction. Although our work does not shed any further
quantitative light onto this matter, our observations do support the argument made in
Part I of this thesis: that location transparency is fundamentally flawed. Our
conclusion is that this is further exacerbated by combining the information used for
location of components with that required for a dialogue. Local transparency on the
other hand separates these two issues, and is thus able to build more loosely coupled
systems that are more responsive to change.
114
On the Structuring of Distributed Systems Conclusions
8 Conclusions
Building distributed systems is not a new endeavour. We have been doing so for as
long as we have been networking computers. However, the types of system being
built, and the nature of the underlying network are evolving beyond the wildest
dreams of the early network pioneers. Networks are becoming pervasive in society,
and the dream of ubiquitous computing is finally being realised. These new networks
bring new requirements for how we build distributed systems. We can no longer
guarantee network reliability or even topology. Our existing technologies and
infrastructures are beginning to creak under the strain.
This thesis has been concerned with how we build distributed systems. Instead of
focusing merely on the technology used to implement them, we have also focused on
the abstractions employed in their construction. These immensely powerful concepts
allow us to manage the complexity of a situation, by removing those details we
consider inessential. After all, the central essence of any paradigm is the abstractions
it embodies. The major contributions of this thesis have been:
115
On the Structuring of Distributed Systems Conclusions
The arguments presented in Part I are extensive, and a full experimental investigation
was deemed beyond the scope and timescale of a PhD. Instead, our horizons were
shortened to encompass the first steps along the long path of validating the argument.
Part II, Using and Evaluating, is therefore a report on our experiences of mobile code
in the real world. To date, the mobile code research arena has remained relatively
immature, and the dearth of real systems has hampered its development. With this in
mind, our experimental work was based upon a business process model generated
from an industrial case study. We reported on the creation of two prototype systems
that embodied the Mobile Agent and Remote Computation abstractions, part of the
mobile code family of abstractions. In this, we have achieved our first aim; to
demonstrate the feasibility of building real world distributed systems with mobile
code. We also wish to comment on the relative merits of each prototype.
In the course of the experimental work, we subjected our systems to real world
pressures in the form of Scenarios for Change, also generated from the case study.
During the subsequent evaluation, we developed several metrics using the Basili
GQM methodology. The metrics of Conceptual Diffusion, Semantic Alignment and
Change Capability have proved to be useful techniques for evaluation that can be used
during both the specification process, and post construction. In addition, we have
tried to consider the full lifecycle of our systems, an exercise that has produced
several supporting tools and proto-patterns.
Our evaluation of the two mobile code prototypes draws us to conclude that the
mobile agent abstraction is the more useful to employ. From our experiments, we
observe that mobile agents enjoy increased semantic alignment and system agility
when compared to the remote computation abstraction. The differences in each
116
On the Structuring of Distributed Systems Conclusions
implementation arise due to the lower conceptual diffusion of the mobile agent
system, something that is enabled by the autonomy of the agent metaphor.
We believe the next stage of validation for our philosophical argument would be to
undertake a course of research to directly compare Mobile Agents with RM-ODP. To
avoid the differences in technology maturity, we envisage building each abstraction
from the ground up. A clean room implementation of both abstractions would allow a
more valid and comprehensive comparative analysis. Further, it is clear that software
patterns and software metrics evolve throughout their lifetime. Through use,
practitioners are able to refine them. We believe additional software metrics would
support this investigative work.
As has already been mentioned, an obvious avenue for future work would be to
continue the SOP implementation undertaken in this thesis. The current model
117
On the Structuring of Distributed Systems Conclusions
embodied in our prototypes has many areas where it can be expanded. Increasing the
size and complexity of our systems would allow us to reapply the scenarios for
change. A comparative study with our current results would be a valuable exercise to
ascertain how much of an effect size and complexity has on system agility. We
should also be searching for collaborative partners on other continents to truly test
how successfully each system supports distribution.
Finally, the creation of a modelling language that includes the facility to specify
mobile components would be an invaluable addition to the system designer’s toolbox.
Current modelling languages, such as UML [Booch97], do not include the concept of
mobility. Extending de facto industry methodologies is a sure fire way to ensure
widespread adoption of new ideas and technologies.
8.2 Commentary
Using mobility is not just about what the technology can do for you. It is also about a
fundamental change of mindset. By removing the conceptual block that is the plane
of transparency, distributed systems designers can begin to appreciate the rich
environment that is the network. If we remain faithful to the Tower of Abstractions,
and employ the network as our communications infrastructure, we draw on the
strengths of the von Neumann machine and the network suite, whilst divorcing the
issues of distribution from those of dialogue.
118
On the Structuring of Distributed Systems Conclusions
Mobile agents have shown considerable early promise. The future they depict is one
of a rich network environment, inhabited by an ecology of autonomous agents. Nodes
in the network become islands of resources, on which agents may alight to take
advantage of resources locally. The population consists of mobile and static agents,
all enjoying some level of autonomy, ranging from simple task specific instructions,
to complex autonomous agent architectures. The mobile agents live in the network,
able to migrate, clone, sleep, wake, but in reality insert a new layer of abstraction over
the underlying computation substrate. They act for other agents, or their human
owners. The static agents are brokers for immovable resources such as printers or
databases. In this virtual ecology, we see the glimpses of our future computing.
119
On the Structuring of Distributed Systems List of Publications
List of Publications
Clements, P.E., Papaioannou, T. and Edwards, J.M., ''Aglets: Enabling the Virtual
Enterprise'', Proceedings of the 1st International Conference on Managing
Enterprises - Stakeholders, Engineering, Logistics and Achievement, ME-SELA '97,
Wright, Rudolph, Hanna, Gillingwater and Burns (eds), Mechanical Engineering
Publications, Loughborough University, July 1997,pp 425-432, ISBN 1-86058-066-1
Papaioannou, T., Edwards, J.M., “Mobile Agent Technology Enabling the Virtual
Enterprise: A Pattern for Database Query”, in notes of Agent Based Manufacturing
Workshop, part of the International Technical Conference Autonomous Agents '98.
Papaioannou, T., Edwards, J.M., “Using Mobile Agents To Improve the Alignment
Between Manufacturing and its IT Support Systems”, International Journal of
Robotics and Autonomous Systems, 27, pp 45-57, 1999.
Papaioannou, T., “Mobile Agents: Are They Useful for Establishing a Virtual
Presence in Space?”, in notes of Adjustable Autonomy Symposium, part of the
AAAI Spring Symposium Series, Stanford University, 1999.
Papaioannou, T., Minar, N., “Mobile Agents in the Context of Competition and
Cooperation”, Proc. of MAC3 workshop, part of Autonomous Agents ‘99
conference, Seattle, 1999.
Papaioannou, T., Edwards, J.M., “Manufacturing Systems Integration and Agility:
Can Mobile Agents Help?”, accepted for publication in Journal of Integrated
Computers-Aided Engineering, IOS Press. To appear in January 2001 Issue.
120
On the Structuring of Distributed Systems References
References
Abadi96 Abadi, M., and Cardelli, L., “A Theory of Objects”,
Monographs in Computer Science, Springer-Verlag, Berlin,
1996.
Accetta86 Accetta, M., Baron, R., Golub, D., Rashid, R., Tevanian, A.,
Young, M., “MACH: A New Kernel Foundation for UNIX
Development”, Proc. Summer USENIX Conference, pp 93-
112, 1986.
Adobe85 Adobe Systems Inc., “The Postscript Language Reference
Manual”, Addison-Wesley, 1985.
Agha97 Agha, G., “Abstracting Interaction Patterns: A Programming
Paradigm for Open Distributed Systems”, in Najm, E. and
Stefani, J.B., Eds, “Formal Methods for Open Object-based
Distributed Systems”, Chapman & Hall, 1997
Andrews82 Andrews, G.R., “The distributed programming language SR –
mechanisms, design and implementation”, Software Practice
and Experience, Vol 12, pp 719-753, 1982
Andrews83 Andrews, G., Schneider, F., “Concepts and Notations for
Concurrent Programming”, ACM Computing Surveys, 15, pp
3-43.
Apple92 Apple Computers, “Dylan, an Object Oriented Dynamic
Language”, Apple, Cupertino, CA, 1992.
Arnold99 Arnold, K., Wollrath, A., O’Sullivan, B., Sheifler, R., Waldo,
J., “The Jini Specification”, Addison-Wesley, 1999.
Barber98 Barber, M., Weston, R., "BPR Scoping Paper", IJPR, 1998.
121
On the Structuring of Distributed Systems References
122
On the Structuring of Distributed Systems References
Carrot97 Carrot, A.J., Wright, C.D., West, A.A., Harrison, R., "Creating
a distributed object-oriented integration framework for machine
design and control ”, First International Conference on
Managing Enterprises-Stakeholders, Engineering, Logistics &
Achievement (ME-SELA ‘97) at Loughborough University,
22-24 July 1997.
Carver91 Carver, G. P., Bloom, H.M., "Concurrent Engineering through
Product Data Standards", U.S. Department of Commerce, May
1991.
Carzaniga97 Carzaniga, A., Picco, G.P., Vigna, G., “Designing Distributed
applications with Mobile Code Paradigms”, Proc. 19th
International Conf. On Software Engineering (ICSE’97), 1997,
Taylor, R., Ed., ACM Press, pp 22-32.
Cashin80 Cashin, P.M., “Inter-Process communication”, Bell-Northern
Research Report, May 1980.
Cheong83 Cheong, V.E., “Local Area Networks”, Wiley and Sons, 1983.
123
On the Structuring of Distributed Systems References
124
On the Structuring of Distributed Systems References
125
On the Structuring of Distributed Systems References
Goldman95 Goldman, S.L., Nagel, R.N., Preiss, K., “Agile Competitors and
Virtual Organisations”, Van Nostrand Reihold Publishing,
1995.
Gong99 Gong, L., “Inside Java 2 Platform Security: Architecture, API
Design, and Implementation”, Addison-Wesley, 1999. ISBN:
0201310007
Goodenough75 Goodenough, J.B., “Exception handling: Issues and proposed
notitation”, Comm. ACM, 16 (12), pp 683-696, Dec. 1975.
Gosling96 Gosling, J., Joy, B., Steele, G., "The Java Language
Specification", Addison-Wesley, Reading, MA, 1996.
Gray83 Gray, J.P., Hansen, P.J., Homan, P., Lerner, M.A., Pozefsky,
M., “Advanced program-to-program communication in SNA”,
IBM Systems Journal, Vol. 22 (4), pp 298-318, 1983.
Gray97 Gray, R., “Agent Tcl: A flexible and secure mobile-agent
system”, PhD thesis, Dept. of Comp Sci, Dartmouth College,
June 1997.
Green80 Green, P.E. Jr, “An Introduction to Network Architectures and
Protocols”, in [IEEE80].
Harel87 Harel, D., “The science of computing: exploring the nature and
power of algorithms, Addison-Wesley, USA, 1987.
126
On the Structuring of Distributed Systems References
127
On the Structuring of Distributed Systems References
Jul88 Jul, E., Levy, H., Hutchinson, N., Black, A., “Fine-grained
Mobility in the Emerald System”, ACM Transactions on
Computer Systems, Vol 6 (2), 1988, pp 109-133.
Kernighan78 Kernighan, B.W., Ritchie, D.M., “The C Programming
Language”, Prentice Hall, 1978.
Kiczales97 Kiczales, G., Lamping, J., Mendhekar, A., Maeda, C., Lopes,
C.V., Loingtier, J-M., Irwin, J., “Aspect-Oriented
Programming”, Proc. European Conf. on OOP (ECOOP),
Springer-Verlag LNCS 1241, 1997
Knabe96 Knabe, F.C., “Language and compiler support for mobile
agents”, PhD thesis, Carnegie Mellon University, 1996.
Kotz99 Kotz, D., Gray, R.S., “Mobile code: The Future of the
Internet”, in [Papaioannou/Minar99], 1999.
Kramer83 Kramer, J., Magee, J., Sloman, M., Lister, A., “CONIC: an
integrated approach to distributed computer control systems”,
IEE Proceedings, Part E, Vol 130 (1), pp 1-10, 1983.
Labrou94 Labrou, Y., Finin, T., “A Semantics Approach for KQML – a
General Purpose Communication Language for Software
Agents”, in proc. 3rd Int’l Conf. On Information and
Knowledge Management (CIKM’94), 1994.
Lampson77 Lampson, B., Mitchell, J., Satterthwaite, E., "Report on the
programming language Euclid", SIGPLAN Notices, 12 (2), Feb
1977
Lange98 Lange, D.B., Oshima, M., "Mobile Agents with Java: The
Aglet API", World Wide Web Journal, 1998.
128
On the Structuring of Distributed Systems References
Liskov81 Liskov, B., Atkinson, R., Bloom, T., Moss, E., Schaffert, J.C.,
Sheifler, R. and Snyder, A., “CLU Reference Manual”,
Springer-Verlag, 1981.
Martin99 Martin, D. L., Cheyer, A. J., and D. B. Moran, "The open agent
architecture: A framework for building distributed software
systems," Applied Artificial Intelligence, vol. 13, pp. 91--128,
January-March, 1999.
McCall77 McCall, J.A., Richards, P.K.z, Walters, G.F., “Factors in
Software Quality”, Rome Air Development Centre, RADC TR-
77-369, 1977.
McCarthy60 McCarthy, J., "Recursive functions of symbolic expressions
and their computation by machine.", Comm ACM, 3 (4), pp
184-195, 1960.
McFayden76 McFayden, J.H., “Systems network architecture: An overview”,
IBM Systems Journal, Vol 15 (1), pp 4-23, 1976.
129
On the Structuring of Distributed Systems References
Minar99 Minar, N., Gray, M., Roup, O., Krikorian, R., Maes, P., (1999),
“Hive: Distributed Agents for Networking Things”,
Proceedings of. ASA/MA ‘99.
Minar99b Private email correspondence with Nelson Minar, Hive team
lead and chief architect, Dec 1999.
Naur78 Naur, P., “The European Side of the Last Phase of the
Development of Algol 60”, SIGPLAN Notices 13 (8), pp 15-
44, 1978.
Nelson91 Nelson, G., “Systems Programming with Modula-3”, Prentice-
Hall, Englewood Cliffs, 1991.
130
On the Structuring of Distributed Systems References
131
On the Structuring of Distributed Systems References
132
On the Structuring of Distributed Systems References
Sloman85 Sloman, M., Kramer, J., Magee, J., “The Conic toolkit for
building distributed systems”, Proc. 6th IFAC Workshop on
Distributed Computer Control Systems, California, Pergamon
Press, 1985
Sloman87 Sloman, M., Kramer, J., “Distributed Systems and Computer
Networks”, Prentice-Hall, 1987
133
On the Structuring of Distributed Systems References
134
On the Structuring of Distributed Systems References
Vigna98 Vigna, G., ed, “Mobile Agents and Security”, LNCS Vol 1419,
Springer-Verlag, 1998.
Waldo94 Waldo, J., Wyant, G., Wollrath, A., Kendall, S., “A note on
distributed computing”, Sun Microsystems Technical Report
SML 94-29, 1994.
Walsh85 Walsh, D., Lyon, B., Sager, G., Change, J.M., Goldberg, D.,
Kleiman, S., Lyon, T., Sandberg, R. and Weiss, P., “Overview
of the Sun Network File System”, Proc. of the Winter Usenix
Conference, 1985.
Watt96 Watt, S., “Pride and prejudice: four decades of LISP”, in
[Woodman96], pp 235-254, 1996
Weiser91 Weiser, M., “The Computer for the 21st Century”, Scientific
American, Vol 265 (3), pp 94-104, 1991.
135
On the Structuring of Distributed Systems References
136
On the Structuring of Distributed Systems Appendices
Appendices
Appendix A
Program listing of an example OrderAgent:
package uk.ac.lboro.todd.aglets.mascenario;
import uk.ac.lboro.todd.aglets.mascenario.tasks.*;
import uk.ac.lboro.todd.aglets.*;
import uk.ac.lboro.todd.aglets.order.*;
import uk.ac.lboro.todd.aglets.utils.*;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.URL;
import java.util.Date;
/**
* A simple QueryAglet that can be created by a Master and tasked
* with tracking down the stock levels of a product from a list of
* hosts.
*
* @version 2.1 10/11/98 Changed from a properties lookup for
* the DataSource to multicast messaging
* version 2.0 21/10/98 Most of the required logic has now
* been refactored and shifted to the
* Task classes. Allows for far more
* modularity.
* version 1.2 18/10/98 Query can now handle missing data
* sources and also the addition of
* subsequent tasks, after the
* completion of the first one.
* version 1.1 08/10/98 Query aglet is now able to complete
* Itinerary and request a retraction
* Removed MakeRequest and added it to
* StockRequestTask. Makes more sense.
* version 1.01 25/09/98 Added capability to create with
* details and receive an Itinerary.
* version 1.00 23/09/98 First attempt.
*
* @author Todd Papaioannou
*/
137
On the Structuring of Distributed Systems Appendices
super.onCreation(init);
int counter = 0;
if (counter > 1)
System.out.println("ACounter = " +
new Integer(counter).toString());
counter++;
if (counter > 3) {
System.out.println("Self destructing!");
try {
event.getAgletProxy().dispose();
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
); /* End of Adapter */
// Test run
public void run() {
//System.out.println("\nInto run");
waitMessage(1 * 1000);
}
138
On the Structuring of Distributed Systems Appendices
try {
task.finishTasks(itin);
} catch (Exception e) {
System.out.println(e);
}
}
}
/**
* Handle ourselves being killed gracefully
*
public void onDisposing() {
/**
* Returns true if the current host is our origin
*/
public boolean atHome() {
if (getAgletInfo().getOrigin().equals(getAgletContext(). \
getHostingURL().toString()))
return true;
else
return false;
}
/**
* Allows a slave to contact it's master and ask for a
* retraction. Useful since the Master has no idea where the
* Slave might have ended up.
*/
public void returnHome() {
try {
Message msg = new Message("RetractMe");
msg.setArg("url", getAgletContext().getHostingURL());
msg.setArg("id", getAgletID());
mProxy.sendOnewayMessage(msg);
} catch (InvalidAgletException iae) {
System.out.println("1 " + iae.toString());
} catch (Exception e) {
System.out.println("2 " + e.toString());
}
}
/**
* Find out who is the data source in this context
*/
139
On the Structuring of Distributed Systems Appendices
try {
ReplySet set = getAgletContext().multicastMessage
(new Message("DataSource?"));
if (dataProxy != null)
return true;
else
return false;
}
/**
* Attempt to handle any incoming messages
*/
public boolean handleMessage(Message msg) {
if (msg.sameKind("Itinerary")) {
itin = (SlaveItin)msg.getArg();
appendMessage("Itinerary received, starting trip.");
itin.startTrip();
} else {
System.out.println(msg.toString());
return false;
}
return true;
}
/**
* Override super class method to allow for easy redirection
* during testing.
*/
public void appendMessage(String text) {
System.out.println("[" + getName() + "] " + text);
}
/**
* Return the current order we are dealing with
*/
public Order getOrder() {
return order;
}
140
On the Structuring of Distributed Systems Appendices
/**
* Return our current result set
*/
public ResultSet getResults() {
return resSet;
}
/**
* Allow someone to try to clear our result set
*/
public void clearResults() {
resSet = null;
}
/**
* Return a reference to our Master's proxy
*/
public AgletProxy getMasterProxy() {
return mProxy;
}
/**
* Return a reference to the DataAglet's proxy
*/
public AgletProxy getDataProxy() {
return dataProxy;
}
/**
* Return a reference to our Itinerary
*/
public SlaveItin getItin() {
return itin;
}
} /* End of Class */
141
On the Structuring of Distributed Systems Appendices
Appendix B
Program listing of an example Agent Task:
package uk.ac.lboro.todd.aglets.mascenario.tasks;
import uk.ac.lboro.todd.aglets.*;
import uk.ac.lboro.todd.aglets.utils.*;
import uk.ac.lboro.todd.aglets.mascenario.*;
import uk.ac.lboro.todd.aglets.order.*;
import com.ibm.aglet.*;
import com.ibm.agletx.util.*;
import java.net.URL;
/**
* StockRequestTask - a task that allows an agent to make a request
* to a DataSource aglet. The request is encapsulated within the
* Order object the slave carries around with it.
*
* @version 2.1 04/11/98 First attempt with MA instead
* of MO's. Added evalResult().
* @version 2.0 21/10/98 Massive refactoring of the
* code. Very little of the behaviour of
* the Aglet relies on code in run()
* The addition of finishTasks allows
* for a much simpler and more modular
* approach to design of Slave agents.
* @version 1.11 08/10/98 MakeRequest has been added from
* QueryAglet. Makes more sense.
* @version 1.10 08/10/98 StockRequest now fully functional
* @version 1.00 28/09/98 First attempt.
*
* @author Todd Papaioannou
*/
/**
* Use this to allow us a better view of what goes on at a host
*/
static boolean pause = true;
/**
* The actual work associated with this Task.
*/
public void execute(SeqItinerary itin) throws Exception {
142
On the Structuring of Distributed Systems Appendices
/**
* Make a request for an Order to be checked.
*/
public void makeRequest() {
try {
// Let's put some artificial pausing in. Looks good for the
// humans!
if (pause) {
for (int i=0; i < 160; i++) {
System.out.print(".");
}
System.out.println("\n");
}
} // End of makeRequest
143
On the Structuring of Distributed Systems Appendices
/**
* Can this host satisfy our order?
*/
private void evalResult() {
if (result.getIndicator() == Result.YES) {
if (success) {
commitOrder();
} else {
qag.appendMessage("Current host cannot satisfy order. \
Going to next host.");
}
}
try {
// Kill ourselves
qag.dispose();
} else if (reply.equals("OutOfStock")) {
qag.appendMessage("Out of Stock!");
qag.getMasterProxy().sendOnewayMessage(new Message
("OutOfStock", qag.getOrder().getOrderNumber()));
qag.dispose();
} else {
qag.appendMessage("Something messed up! Getting rid \
of myself.");
qag.dispose();
}
144
On the Structuring of Distributed Systems Appendices
System.out.println(ex);
} catch (MessageException ex) {
System.out.println("[ERROR] Make Request Failed because \
of:\n" + ex.getException());
System.out.println(ex);
}
} /* End of Class */
145
On the Structuring of Distributed Systems Error! Reference source not found.
Jeffrey M. Bradshaw
S
ince the beginning of recorded history, people have been fascinated with
the idea of non-human agencies.1 Popular notions about androids, hu-
manoids, robots, cyborgs, and science fiction creatures permeate our cul-
ture, forming the unconscious backdrop against which software agents are per-
ceived. The word “robot,” derived from the Czech word for drudgery, became
popular following Karel Capek’s 1921 play RUR: Rossum Universal Robots.
While Capek’s robots were factory workers, the public has also at times em-
braced the romantic dream of robots as “digital butlers” who, like the mechani-
cal maid in the animated feature “The Jetsons,” would someday putter about
the living room performing mundane household tasks. Despite such innocuous
beginnings, the dominant public image of artificially intelligent embodied crea-
tures often has been more a nightmare than a dream. Would the awesome
power of robots reverse the master-slave relationship with humans? Everyday
experiences of computer users with the mysteries of ordinary software, riddled
with annoying bugs, incomprehensible features, and dangerous viruses rein-
force the fear that the software powering autonomous creatures would pose
even more problems. The more intelligent the robot, the more capable of pursu-
ing its own self-interest rather than its master’s. The more humanlike the robot,
the more likely to exhibit human frailties and eccentricities. Such latent con-
cerns cannot be ignored in the design of software agents—indeed, there is more
than a grain of truth in each of them!
Though automata of various sorts have existed for centuries, it is only with
the development of computers and control theory since World War II that any-
thing resembling autonomous agents has begun to appear. Norman (1997) ob-
serves that perhaps “the most relevant predecessors to today’s intelligent agents
are servomechanisms and other control devices, including factory control and
the automated takeoff, landing, and flight control of aircraft.” However, the
agents now being contemplated differ in important ways from earlier concepts.
4 BRADSHAW
Significantly, for the moment, the momentum seems to have shifted from hard-
ware to software, from the atoms that comprise a mechanical robot to the bits
that make up a digital agent (Negroponte 1997).2
Alan Kay, a longtime proponent of agent technology, provides a thumbnail
sketch tracing the more recent roots of software agents:
“The idea of an agent originated with John McCarthy in the mid-1950’s, and the
term was coined by Oliver G. Selfridge a few years later, when they were both at
the Massachusetts Institute of Technology. They had in view a system that, when
given a goal, could carry out the details of the appropriate computer operations and
could ask for and receive advice, offered in human terms, when it was stuck. An
agent would be a ‘soft robot’ living and doing its business within the computer’s
world.” (Kay 1984).
Nwana (1996) splits agent research into two main strands: the first beginning
about 1977, and the second around 1990. Strand 1, whose roots are mainly in dis-
tributed artificial intelligence (DAI), “has concentrated mainly on deliberative-
type agents with symbolic internal models.” Such work has contributed to an un-
derstanding of “macro issues such as the interaction and communication between
agents, the decomposition and distribution of tasks, coordination and cooperation,
conflict resolution via negotiation, etc.” Strand 2, in contrast, is a recent, rapidly
growing movement to study a much broader range of agent types, from the mo-
ronic to the moderately smart. The emphasis has subtly shifted from deliberation
to doing; from reasoning to remote action. The very diversity of applications and ap-
proaches is a key sign that software agents are becoming mainstream.
The gauntlet thrown down by early researchers has been variously taken up
by new ones in distributed artificial intelligence, robotics, artificial life, dis-
tributed object computing, human-computer interaction, intelligent and adap-
tive interfaces, intelligent search and filtering, information retrieval, knowledge
acquisition, end-user programming, programming-by-demonstration, and a
growing list of other fields. As “agents” of many varieties have proliferated,
there has been an explosion in the use of the term without a corresponding con-
sensus on what it means. Some programs are called agents simply because they
can be scheduled in advance to perform tasks on a remote machine (not unlike
batch jobs on a mainframe); some because they accomplish low-level computing
tasks while being instructed in a higher-level of programming language or
script (Apple Computer 1993); some because they abstract out or encapsulate the
details of differences between information sources or computing services
(Knoblock and Ambite 1997); some because they implement a primitive or ag-
gregate “cognitive function” (Minsky 1986, Minsky and Riecken 1994); some be-
cause they manifest characteristics of distributed intelligence (Moulin and
Chaib-draa 1996); some because they serve a mediating role among people and
programs (Coutaz 1990; Wiederhold 1989; Wiederhold 1992); some because
they perform the role of an “intelligent assistant” (Boy 1991, Maes 1997) some
because they can migrate in a self-directed way from computer to computer
AN INTRODUCTION TO SOFTWARE AGENTS 5
(White 1996); some because they present themselves to users as believable char-
acters (Ball et al. 1996, Bates 1994, Hayes-Roth, Brownston, and Gent 1995);
some because they speak an agent communication language (Genesereth 1997,
Finin et al. 1997) and some because they are viewed by users as manifesting in-
tentionality and other aspects of “mental state” (Shoham 1997).
Out of this confusion, two distinct but related approaches to the definition of
agent have been attempted: one based on the notion of agenthood as an ascription
made by some person, the other based on a description of the attributes that soft-
ware agents are designed to possess. These complementary perspectives are sum-
marized in the section “What Is a Software Agent.” The subsequent section dis-
cusses the “why” of software agents as they relate to two practical concerns: 1)
simplifying the complexities of distributed computing and 2) overcoming the lim-
itations of current user interface approaches. The final section provides a chapter
by chapter overview of the remainder of the book.
This section summarizes the two definitions of an agent that have been at-
tempted: agent as an ascription, and agent as a description.
‘Agent’ as an Ascription
As previously noted, one of the most striking things about recent research and
development in software agents is how little commonality there is between dif-
ferent approaches. Yet there is something that we intuitively recognize as a
“family resemblance” among them. Since this resemblance cannot have to do
with similarity in the details of implementation, architecture, or theory, it must
be to a great degree a function of the eye of the beholder.3 “Agent is that agent
does”4 is a slogan that captures, albeit simplistically, the essence of the insight
that agency cannot ultimately be characterized by listing a collection of at-
tributes but rather consists fundamentally as an attribution on the part of some
person (Van de Velde 1995).5
This insight helps us understand why coming up with a once-and-for-all
definition of agenthood is so difficult: one person’s “intelligent agent” is another
person’s “smart object”; and today’s “smart object” is tomorrow’s “dumb pro-
gram.” The key distinction is in our expectations and our point of view. The
claim of many agent proponents is that just as some algorithms can be more eas-
ily expressed and understood in an object-oriented representation than in a pro-
cedural one (Kaehler and Patterson 1986), so it sometimes may be easier for de-
velopers and users to interpret the behavior of their programs in terms of agents
rather than as more run-of-the-mill sorts of objects (Dennett 1987).6
The American Heritage Dictionary defines an agent as “one that acts or has
6 BRADSHAW
Dennett (1987) describes three predictive stances that people can take toward
systems (table 1). People will choose whatever gives the most simple, yet reliable
explanation of behavior. For natural systems (e.g., collisions of billiard balls), it
is practical for people to predict behavior according to physical characteristics
and laws. If we understand enough about a designed system (e.g., an automo-
bile), we can conveniently predict its behavior based on its functions, i.e., what it
is designed to do. However as John McCarthy observed in his work on “advice-
takers” in the mid-1950’s, “at some point the complexity of the system becomes
such that the best you can do is give advice” (Ryan 1991). For example, to pre-
dict the behavior of people, animals, robots, or agents, it may be more appropri-
ate to take a stance based on the assumption of rational agency than one based
on our limited understanding of their underlying blueprints.11
Singh (1994) lists several pragmatic and technical reasons for the appeal of
viewing agents as intentional systems:
“They (i) are natural to us, as designers and analyzers; (ii) provide succinct descrip-
tions of, and help understand and explain, the behaviour of complex systems; (iii)
make available certain regularities and patterns of action that are independent of
the exact physical implementation of the agent in the system; and (iv) may be used
by the agents themselves in reasoning about each other.”
‘Agent’ As a Description
A more specific definition of “software agent” that many agent researchers
might find acceptable is: a software entity which functions continuously and au-
tonomously in a particular environment, often inhabited by other agents and
processes (Shoham 1997). The requirement for continuity and autonomy de-
rives from our desire that an agent be able to carry out activities in a flexible and
intelligent manner that is responsive to changes in the environment without re-
quiring constant human guidance or intervention. Ideally, an agent that func-
tions continuously in an environment over a long period of time would be able
to learn from its experience. In addition, we expect an agent that inhabits an en-
vironment with other agents and processes to be able to communicate and coop-
erate with them, and perhaps move from place to place in doing so.
8 BRADSHAW
All this being said, most software agents today are fairly fragile and special-
purpose beasts, no one of which can do very much of what is outlined above in a
generic fashion. Hence the term “software agent” might best be viewed as an um-
brella term that covers a range of other more specific and limited agent types
(Nwana 1996). Though as individuals the capabilities of the agents may be rather
restricted, in their aggregate they attempt to simulate the functions of a primitive
“digital sister-in-law,” as particular ones intimately familiar with the user and sit-
uation exchange knowledge with others who handle the details of how to obtain
needed information and services. Consistent with the requirements of a particular
problem, each agent might possess to a greater or lesser degree attributes like the
ones enumerated in Etzioni and Weld (1995) and Franklin and Graesser (1996):
• Reactivity: the ability to selectively sense and act
• Autonomy: goal-directedness, proactive and self-starting behavior
• Collaborative behavior: can work in concert with other agents to achieve a
common goal
• “Knowledge-level” (Newell 1982) communication ability: the ability to commu-
nicate with persons and other agents with language more resembling human-
like “speech acts” than typical symbol-level program-to-program protocols
• Inferential capability: can act on abstract task specification using prior
knowledge of general goals and preferred methods to achieve flexibility;
goes beyond the information given, and may have explicit models of self,
user, situation, and/or other agents.
• Temporal continuity: persistence of identity and state over long periods of
time12
• Personality: the capability of manifesting the attributes of a “believable”
character such as emotion
• Adaptivity: being able to learn and improve with experience
• Mobility: being able to migrate in a self-directed way from one host plat-
form to another.
To provide a simpler way of characterizing the space of agent types than
would result if one tried to describe every combination of possible attributes,
several in the agent research community have proposed various classification
schemes and taxonomies.
For instance, AI researchers often distinguish between weak and strong no-
tions of agency: agents of the latter variety are designed to possess explicit men-
talistic or emotional qualities (Shoham 1997; Wooldridge and Jennings 1995).
From the DAI community, Moulin and Chaib-draa have characterized agents
by degree of problem-solving capability:
“A reactive agent reacts to changes in its environment or to messages from other
agents.… An intentional agent is able to reason on its intentions and beliefs, to cre-
ate plans of actions, and to execute those plans.… In addition to intentional agent
AN INTRODUCTION TO SOFTWARE AGENTS 9
Agency
Fixed-Function
Agents
Service interactivity Intelligent
Agents
Application interactivity
Data interactivity
Representation of user
Asynchrony Expert Systems
capabilities, a social agent possesses explicit models of other agents.” (Moulin and
Chaib-draa 1996, pp. 8-9).
An influential white paper from IBM (Gilbert et al. 1995) described intelli-
gent agents in terms of a space defined by the three dimensions of agency, intel-
ligence, and mobility (figure 1):
“Agency is the degree of autonomy and authority vested in the agent, and can be mea-
sured at least qualitatively by the nature of the interaction between the agent and
other entities in the system. At a minimum, an agent must run asynchronously. The
degree of agency is enhanced if an agent represents a user in some way… A more ad-
vanced agent can interact with… data, applications,… services… [or] other agents.
Intelligence is the degree of reasoning and learned behavior: the agent’s ability
to accept the user’s statement of goals and carry out the task delegated to it. At a
minimum, there can be some statement of preferences… Higher levels of intel-
ligence include a user model… and reasoning.… Further out on the intelli-
gence scale are systems that learn and adapt to their environment, both in terms
of the user’s objectives, and in terms of the resources available to the agent…
Mobility is the degree to which agents themselves travel through the net-
work… Mobile scripts may be composed on one machine and shipped to another
for execution… [Mobile objects are] transported from machine to machine in
the middle of execution, and carrying accumulated state data with them.”
Nwana (1996) proposes a typology of agents that identifies other dimensions
of classification. Agents may thus be classified according to:
• Mobility, as static or mobile
• Presence of a symbolic reasoning model, as deliberative or reactive
10 BRADSHAW
Smart Collaborative
Agents Learning
Agents
Cooperate Learn
Interface
Autonomous Agents
Collaborative
Agents
Autonomous Agents
Biological Robotic
Agents Agents
current web-based searching and filtering “agents,” though useful, “are essen-
tially one-time query answering mechanisms” that are adequately described by
the less glamorous computer science term “server.” Similarly, “mobile process”
would be a less confusing term than “mobile agent” for those Java applets
whose only “agent-like” function is to allow processes to run securely on foreign
machines. In contrast to these previous attempts to describe a set of unambigu-
ous defining characteristics for agents in general, Petrie argues the case for one
specific class: typed-message agents. Typed-message agents are distinguished from
other types of software by virtue of their ability to communicate as a community
using a shared message protocol such as KQML. In the shared message protocol,
at least some of the message semantics “are typed and independent of the appli-
cations. And semantics of the message protocol necessitate that the transport
protocol not be only client/server but rather a peer-to-peer protocol. An individ-
ual software module is not an agent at all if it can communicate with the other
candidate agents only with a client/server protocol without degradation of the
collective task performance.”
Time and experience will ultimately determine both the meaning and the
longevity of the term “agent.” Like many other computing terms in common
usage such as “desktop,” “mouse,” and “broker,” it began with a metaphor but
will end up denoting concrete software artifacts. As public exposure to useful
and technically viable implementations of agent software increases, the term
will either come to mean something that everyone understands because they
have seen many examples of it, or it will fall into disuse because it describes a
concept that is no longer appropriate. What is unlikely to disappear are the mo-
tivations that have incited the development of agent-based software. These are
described in the following section.
12 BRADSHAW
While the original work on agents was instigated by researchers intent on study-
ing computational models of distributed intelligence, a new wave of interest has
been fueled by two additional concerns of a practical nature: 1) simplifying the
complexities of distributed computing and 2) overcoming the limitations of cur-
rent user interface approaches.13 Both of these can essentially be seen as a contin-
uation of the trend toward greater abstraction of interfaces to computing ser-
vices. On the one hand, there is a desire to further abstract the details of
hardware, software, and communication patterns by replacing today’s program-
to-program interfaces with more powerful, general, and uniform agent-to-agent
interfaces; on the other hand there is a desire to further abstract the details of the
human-to-program interface by delegating to agents the details of specifying and
carrying out complex tasks. Grosof (Harrison, Chess, and Kershenbaum 1995)
argues that while it is true that point solutions not requiring agents could be de-
vised to address many if not all of the issues raised by such problems, the aggre-
gate advantage of agent technology is that it can address all of them at once.
In the following two subsections, I discuss how agents could be used to ad-
dress the two main concerns I have mentioned. Following this, I sketch a vision
of how “agent-enabled” system architectures of the future could provide an un-
precedented level of functionality to people.
Disjoint
Ad hoc
Encapsulated
A A
A A
Figure 6. Cooperating systems with distributed agents. Connecting lines represent on-
going agent-to-agent communication (Adapted from Brodie 1989).
plex tasks (diSessa 1986; Erickson 1996; Kay 1990; Whittaker 1990). Among
others, people are likely to encounter the following problems:
• Large search space: In large distributed systems it is difficult to find what
we need through browsing or the use of traditional indexing methods.
What is practical and possible for a few hundred items becomes unwieldy
and impossible for several thousand.
• Actions in response to immediate user interaction only: Sometimes instead of
executing an action immediately, we want to schedule it for a specific time
in the future. Or, we may want to have software automatically react to sys-
tem-generated events when we are away from the machine.
• No composition: With most direct manipulation interfaces, we cannot easily
compose basic actions and objects into higher-level ones.
• Rigidity: The consistency that makes passive artifact interfaces predictable
and easy-to-learn for simple tasks makes them brittle and untrustworthy
for complex ones.
• Function orientation: Software is typically organized according to generic
software functions rather than the context of the person’s task and situation.
• No improvement of behavior: Traditional software does not notice or learn
from repetitive actions in order to respond with better default behavior.
proach, users would no longer be obliged to spell out each action for the com-
puter explicitly; instead, the flexibility and intelligence of software agents would
allow them to give general guidelines and forget about the details.
Many of the actions now performed by users could be delegated to various
software agents. Thus, in a glimpse of the future, Tesler (1991) imagines the fol-
lowing directives being given by a person to a software agent:
• On what date in February did I record a phone conversation with Sam?
• Make me an appointment at a tire shop that is on my way home and is
open after 6 PM.
• Distribute this draft to the rest of the group and let me know when they’ve
read it.
• Whenever a paper is published on fullerene molecules, order a copy for my
library.
Later on in the day, Tesler imagines the agent catching up to the person with
these follow-up messages:
• You asked me when you last recorded a phone conversation with Sam. It
was on February 27. Shall I play the recording?
• You scribbled a note last week that your tires were low. I could get you an
appointment for tonight.
• Laszlo has discarded the last four drafts you sent him without reading any
of them.
• You have requested papers on fullerene research. Shall I order papers on
other organic microclusters as well?
Direct manipulation and indirect management approaches are not mutually ex-
clusive. Interface agent researchers are not out to completely do away with com-
puting as we know it, but more modestly hope that complementing see-and-
point interfaces with ask-and-delegate extensions will help reduce required
knowledge and simplify necessary actions while maintaining a sufficient level of
predictability. Specifically, the use of software agents will eventually help over-
come the limitations of passive artifact interfaces in the following ways (table 2):
• Scalability: Agents can be equipped with search and filtering capabilities that
run in the background to help people explore vast sources of information.
• Scheduled or event-driven actions: Agents can be instructed to execute tasks
at specific times or automatically “wake up” and react in response to sys-
tem-generated events.
• Abstraction and delegation: Agents can be made extensible and composable
in ways that common iconic interface objects cannot. Because we can
“communicate” with them, they can share our goals, rather than simply
process our commands. They can show us how to do things and tell us
what went wrong (Miller and Neches 1987).
• Flexibility and opportunism: Because they can be instructed at the level of
AN INTRODUCTION TO SOFTWARE AGENTS 17
goals and strategies, agents can find ways to “work around” unforeseen
problems and exploit new opportunities as they help solve problems.
• Task orientation: Agents can be designed to take the context of the person’s
tasks and situation into account as they present information and take action.
• Adaptivity: Agents can use learning algorithms to continually improve
their behavior by noticing recurrent patterns of actions and events.
Integrated interface
to knowledge
media
Agent as
Agents as intelligent
A personal
interface managers
assistant
A A
Agent-to-agent
A Agents
communication A
behind the
scenes
Interapplication communication
drawing on the resources of other agents working behind the scenes (Arens et al.
1991; Browne, Totterdell, and Norman 1990; Kay 1990; Neal and Shapiro 1994;
Sullivan and Tyler 1991). Such agents would work in concert to help coordinate
the selection of the appropriate display modes and representations for the relevant
data (Bradshaw and Boose 1992; Johnson et al. 1994), incorporating semantic rep-
resentations of the knowledge in the documents to enhance navigation and infor-
mation retrieval (Boy 1992; Bradshaw and Boy 1993; Gruber, Tenenbaum, and
Weber 1992; Lethbridge and Skuce 1992; Mathé and Chen 1994). Because the lay-
out and content of the views would be driven by context and configuration mod-
els rather than by hand-crafted user-interface code, significant economies could be
realized as the data and software components are reused and semi-automatically
reconfigured for different settings and purposes. Some agents might be represent-
ed explicitly to the user as various types of personal assistants (Maes 1997). Ideally,
each software component would be “agent-enabled,” however for practical rea-
sons components may at times still rely on traditional interapplication communi-
cation mechanisms rather than agent-to-agent protocols.
Learning and Intelligent Assistance,” describes how agents have been used to
enhance learning and provide intelligent assistance to users in situations where
direct manipulation interfaces alone are insufficient. The final set, “Agent Com-
munication, Collaboration, and Mobility,” details various approaches to agent-
oriented programming, agent-to-agent communication, and agent mobility, as
well as the use of agents to provide intelligent interoperability between loosely-
coupled components of distributed systems.
How Might People Interact with Agents? Norman’s (1997) introductory chap-
ter sets the stage for the first section of the book. “Agents occupy a strange place
in the realm of technology,” he opens, “leading to much fear, fiction, and extrav-
agant claims.” Because the new crop of intelligent agents differ so significantly
in their computational power from their predecessors, we need to take into ac-
count the social issues no less than the technical ones if our designs are to be ac-
ceptable to people:
“The technical aspect is to devise a computational structure that guarantees that
from the technical standpoint, all is under control. This is not an easy task.
The social part of acceptability is to provide reassurance that all is working accord-
ing to plan… This is [also] a non-trivial task.”
The reassurance that all is working according to plan is provided by an un-
derstandable and controllable level of feedback about the agent’s intentions and
actions. We must also think about how to accurately convey the agent’s capabili-
ties and limitations so that people are not misled in their expectations. Part of
the problem is the natural overenthusiasm of agent researchers; part of the
problem is people’s tendency to falsely anthropomorphize.15 Although designers
can carefully describe agent capabilities and limitations within accompanying
instructional manuals, it is even more important to find clever ways to weave
this information naturally and effectively into the agent interface itself.
Safety and privacy are additional concerns. “How does one guard against
error, maliciousness (as in the spread of computer viruses), and deliberate intent
to pry and probe within one’s personal records?” Legal policies to address these
issues must be formulatedimmediately, at local, national, and global levels.
A final concern is how to design the appropriate form of interaction between
agents and people. For example, how do ordinary people program the agent to
do what they want? While programming-by-demonstration or simplified visual
or scripting languages have been suggested, none of them seem adequate to spec-
ify the kinds of complex tasks envisioned for future intelligent agents.16
Since “agents are here to stay,” we must learn how to cope with the dan-
gers along with the positive contributions. “None of these negative aspects of
agents are inevitable. All can be eliminated or minimized, but only if we
20 BRADSHAW
to some of the most common criticisms. First, is the objection to having to face
“whining, chatting little irritants” each time you turn on the machine. Laurel
notes that the problem is not “agents per se, but rather the traits they are assumed
to possess.” To address this problem, we must allow the traits of agents to be fully
user-configurable. Another criticism is the indirection implied by the presence of
an agent, “Why should I have to negotiate with some little dip in a bowtie when
I know exactly what I want to do?” The answer is that if you know what you
want to do and if you want to do it yourself, the agent should quickly get out of
your way. Agent-based assistance should be reserved for tedious or complex tasks
that you don’t want to do yourself, and that you are comfortable entrusting to a
software entity. Will people’s acquired habit of bossing agents around lead them
to treating real people the same way? Laurel argues that this is a real issue, but
should not be handled by repression of the dramatic form—rather it should be
addressed as an ethical problem for agent designers and the culture at large. Fi-
nally, there is the oft-heard criticism that “AI doesn’t work.” Laurel counters
with examples of successful use of AI techniques in well-defined domains. More-
ove, she asserts that most agents do not need a full-blown “artificial personality,”
but can be implemented much more simply.
Laurel concludes with a discussion of key characteristics of interface agents
(agency, responsiveness, competence, and accessibility) and of an R&D agenda
that includes an appreciation of the contribution of studies of story generation
and dramatic character.18
Designing Agents as if People Mattered. Erickson (1997) explores the many
difficulties surrounding adaptive functionality and the agent metaphor. With
respect to adaptive functionality, he describes three design issues raised in a
study of users of the DowQuest information retrieval system. In brief, people
need to understand what happened and why when a system alters its response;
they need to be able to control the actions of a system, even when it does not al-
ways wait for the user’s input before it makes a move; and they need to predict
what will happen, even though the system will change its responses over time.
Several approaches to these problems have been suggested, including: providing
users with a more accurate model of what is going on, managing overblown ex-
pectations of users at the beginning so they are willing to persist long enough to
benefit from the system’s incremental learning, and constructing a plausible
‘fictional’ model of what is going on.
Given the potential of the agent metaphor as a possible fiction for portraying
system functionality, Erickson examines three strands of research that shed
some light on how well this approach might work. Designed to encourage stu-
dents to explore an interactive encyclopedia, the Guides project allowed re-
searchers to observe the kinds of attributions and the level of emotional engage-
ment people had with stereotypic characters that assisted in navigation.
Erickson also reviews the extensive research that Nass and his colleagues have
22 BRADSHAW
performed on the tendency of people to use their knowledge of people and so-
cial rules to make judgments about computers. Finally, he discusses recent re-
search on the reaction of people to extremely realistic portrayals of agents.
In the final section of the chapter, Erickson contrasts the desktop object and
agent conceptual models, and argues that they can be used together in the same
interface so long as they are clearly distinguished from one another. Specific
computing functionality can be portrayed either as an object or an agent, de-
pending on what is most natural. The desktop metaphor takes advantage of
users’ previous knowledge that office artifacts are visible, are passive, have loca-
tions, and may contain things. “Objects stay where they are: nice, safe pre-
dictable things that just sit there and hold things.” Ontological knowledge of a
different sort comes into play when the agent metaphor is employed. Our com-
mon sense knowledge of what agents can do tells us that, unlike typical desktop
objects, they can notice things, carry out actions, know and learn things, and go
places.19 “Agents become the repositories for adaptive functionality.” The over-
all conclusion is that research “which focuses on the portrayal of adaptive func-
tionality, rather than on the functionality itself, is a crucial need if we wish to
design agents that interact gracefully with their users.”
Direct Manipulation Versus Agents: Paths to Predictable, Controllable, and
Comprehensible Interfaces. Breaking with the tone of cautious optimism ex-
pressed in the preceding chapters, Shneiderman, a longtime advocate of direct
manipulation, is troubled by the concept of intelligent interfaces in general:
“First, such a classification limits the imagination. We should have much greater
ambition than to make a computer behave like an intelligent butler or other
human agent…
Second, the quality of predictability and control are desirable. If machines are in-
telligent or adaptive, they may have less of these qualities…
[Third,] I am concerned that if designers are successful in convincing the users that
computers are intelligent, then the users will have a reduced sense of responsibility
for failures…
Finally,… [m]achines are not people… [and if] you confuse the way you treat machines
with the way you treat people… you may end up treating people like machines.”20
Shneiderman backs up his general concerns with lessons from past disappoint-
ments in natural language systems, speech I/O, intelligent computer-assisted in-
struction, and intelligent talking robots.
Shneiderman observes that agent proponents have not come up with good
definitions of what is and is not an agent. “Is a compiler an agent? How about
an optimizing compiler? Is a database query an agent? Is the print monitor an
agent? Is e-mail delivered by an agent? Is a VCR scheduler an agent?” His ex-
amination of the literature reveals six major elements of the agent approach: an-
thropomorphic presentation, adaptive behavior, acceptance of vague goal
specification, gives you what you need, works while you don’t, and works
AN INTRODUCTION TO SOFTWARE AGENTS 23
where you aren’t. The first three, on closer examination, seem counterproduc-
tive, while the last three are good ideas that could be achieved by other means.
The alternative to a vision of computers as intelligent machines is that of pre-
dictable and controllable user interfaces, based on direct manipulation of repre-
sentations of familiar objects. Shneiderman concludes with a description of two
examples from his own lab (tree maps and dynamic queries) that show the
power of visual, animated interfaces “built on promising strategies like infor-
mative and continuous feedback, meaningful control panels, appropriate pref-
erence boxes, user-selectable toolbars, rapid menu selection, easy-to-create
macros, and comprehensible shortcuts.” These, he argues, rather than vague vi-
sions of intelligent machines, will allow users to specify computer actions rapid-
ly, accurately, and confidently.
Agents for Information Sharing and Coordination: A History and Some Reflec-
tions. The chapter by Malone, Grant, and Lai (1997) reviews more than ten
years of seminal work on a series of programs which were intended to allow un-
sophisticated computer users to create their own cooperative work applications
using a set of simple, but powerful, building blocks. The work is based on two
key design principles, which each imply a particular kind of humility that
should be required of agent designers:
“1. Don’t build computational agents that try to solve complex problems all by them-
selves. Instead, build systems where the boundary between what the agents do and
what the humans do is a flexible one. We call this the principle of semiformal systems…
2. Don’t build agents that try to figure out for themselves things that humans
could easily tell them. Instead, try to build systems that make it as easy as possible
for humans to see and modify the same information and reasoning processes their
agents are using. We call this the principle of radical tailorability…”
Information Lens, the first program in the series, was a system for intelligent
sorting and processing of electronic mail messages. Object Lens and Oval were
successor programs providing much more general and tailorable environments
that extended beyond the domain of electronic mail filtering.
The name “Oval” is an acronym for the four key components of the system:
objects, views, agents, and links. “By defining and modifying templates for
various semi-structured objects, users can represent information about people,
tasks, products, messages, and many other kinds of information in a form that
can be processed intelligently by both people and their computers. By collect-
ing these objects in customizable folders, users can create their own views
which summarize selected information from the objects. By creating semi-au-
tonomous agents, users can specify rules for automatically processing this in-
formation in different ways at different times. Finally, links, are used for con-
necting and relating different objects” (Lai and Malone 1992).
24 BRADSHAW
The authors describe several different applications that were created to show the
power and generality of the Oval approach.21 All these demonstrate the surprising
power that semiformal information processing can provide to people, and lend cre-
dence to the claim that people without formal programming skills can be enabled
to create agent-based computing environments that suit their individual needs.
Agents that Reduce Work and Information Overload. While the developers of
Oval have explored ways to simplify agent authoring, Pattie Maes and her col-
leagues at MIT have pursued an approach that allows personal assistants to learn
appropriate behavior from user feedback (Maes 1997). The personal assistant
starts out with very little knowledge and over time becomes more experienced,
gradually building up a relationship of understanding and trust with the user:
“[We] believe that the learning approach has several advantages over [end-user
programming and knowledge-based approaches]… First, it requires less work
from the end-user and application developer. Second, the agent can more easily
adapt to the user over time and become customized to individual and organiza-
tional preferences and habits. Finally, the approach helps in transferring informa-
tion, habits and know-how among the different users of a community.”
A learning agent acquires its competence from four different sources. First, it
can “look over the shoulder” of users as they perform actions. Second, it can
learn through direct and indirect feedback from the user. Indirect feedback is
provided when the user ignores the agent’s suggested action. Third, the agent
can learn from user-supplied examples. Finally, the agent can ask advice from
other users’ agents that have may have more experience with the same task.
Two assumptions determine whether the learning approach is appropriate for a
given application:
1. The application should involve a significant amount of repetitive behavior.
Otherwise, there would be no consistent situation-action patterns for the
agent to learn.
2. Repetitive behavior should be different for different users. Otherwise, the be-
havior could be more efficiently hard-coded once and for all in a program,
rather than implemented using learning agents.
Maes describes four agent-based applications built using the learning ap-
proach: electronic mail handling (Maxims), meeting scheduling,22 Usenet Net-
news filtering (Newt), and recommending books, music or other forms of enter-
tainment (Ringo)23 Through clever user feedback mechanisms and tailoring
options, this approach provides a great deal of functionality from the combina-
tion of relatively simple mechanisms.
KidSim: Programming Agents without a Programming Language. Like Mal-
one and his colleagues, Smith, Cypher, and Spohrer (1997) have focused their at-
tention on the problem of agent authoring. What is unique to their application,
however, is that they are trying to create a general and powerful tool for use by
AN INTRODUCTION TO SOFTWARE AGENTS 25
rience with the Situation Recognition and Analytical Reasoning (SRAR) model
and the knowledge block representation (Boy 1992; Boy 1991; Boy and Mathé
1993; Mathé and Chen 1994), he defines an agent in the context of this chapter
to be “a software entity that can be represented by a knowledge block with an
interface metaphor (appearance).”
As an example of an agent-based CSCL system Boy describes ACTIDOC, a
prototype environment for active documents that has been applied in the do-
main of physics instruction. ACTIDOC documents consist of an ordered set of
pages containing content and software agents (to make the content active). Each
agent contains a name, a context, a set of triggering conditions, a set of internal
mechanisms, and a set of interface metaphors. From Schank and Jona’s (1991)
six learning architectures, Boy derives classes of agents useful in active docu-
ment design: case-based learning agent, incidental learning agent, problem-solving
agent, video database agent, simulation agent, and suggestive-questions agent. Addi-
tionally he defines the roles of evaluation, instructor aid, and networking agents.
These are illustrated using a physics example that demonstrates one way that
agents can be used to make document content come alive.
The M System. Based on Minsky’s Society of Mind (SOM) theory (Minsky 1986),
the M system (Riecken 1997) is designed to provide intelligent assistance in a
broad range of tasks through the integration of different reasoning processes
(societies of agents). The architecture has previously been applied in the domains
of music composition and intelligent user interface agents; this paper describes
how M assists users of a desktop multimedia conferencing environment to clas-
sify and manage metaphorical electronic objects such as documents, ink, im-
ages, markers, white boards, copy machines, and staplers.
In the Virtual Meeting Room (VMR) application, participants collaborate
using pen-based computers and a telephone:
“Each user is supported by a personalized assistant, which attempts to recognize
and define relationships between domain objects, based on the actions performed
by the users and the resulting new states of the world. For example, VMR partici-
pants may perform actions on a group of electronic documents such as joining
them as a set or annotating them collectively. M attempts to identify all domain ob-
jects and classify relationships between various subsets based on their physical
properties and relevant user actions.”
Within M there are five major reasoning processes, each of which are viewed as
individual agents: spatial, structural, functional, temporal, and causal. Other more
simple agents function as supporting agents. Functioning as a set of SOM memo-
ry machines, these supporting agents represent conceptual knowledge about
things like color, shape, and spatial relationships. As an architecture of integrat-
ed agents, M dynamically generates, ranks, and modifies simultaneous theories
about what is going on in the VMR world. As a faithful implementation of
SOM theory, M provides for an I/O system, a spreading activation semantic net-
28 BRADSHAW
chapter, Finin, Labrou and Mayfield (1997) justify such a rationale as follows:
“The building block for intelligent interaction is knowledge sharing that includes
both mutual understanding of knowledge and the communication of that knowledge.
The importance of such communication is emphasized by Genesereth, who goes so far
as to suggest that an entity is a software agent if and only if it communicates correctly
in an agent communication language (Genesereth and Ketchpel 1994). After all, it is
hard to picture cyberspace with entities that exist only in isolation; it would go against
our perception of a decentralized, interconnected electronic universe.”
After an overview of the work of the Knowledge Sharing Effort (KSE) con-
sortium (Neches et al. 1991) to tackle various issues relating to software agents
and interoperability, the authors focus on one particular result of the effort:
KQML (Knowledge Query Manipulation Language).
The authors suggest seven categories of requirements for an agent communi-
cation language:
• Form. It should be declarative, syntactically simple, and easily readable by
people and programs.
• Content. A distinction should be made between the language that expresses
communicative acts (“performatives”) and the language that conveys the
content of the message.
• Semantics. The semantics should exhibit those desirable properties expect-
ed of the semantics of any other language.
• Implementation. The implementation should be efficient, provide a good fit
with existing software, hide the details of lower layers, and allow simple
agents to implement subsets of the language.
• Networking. It should support all important aspects of modern networking
technology, and should be independent of transport mechanism.
• Environment. It must cope with heterogeneity and dynamism.
• Reliability. It must support reliable and secure agent communication.
After a review of the features of KQML, the authors describe how the fea-
tures of KQML support each of these requirements. The authors conclude by
describing various applications of KQML and by giving a comparison with two
related approaches: AOP and Telescript.
An Agent-Based Framework for Interoperability. Genesereth (1997) continues
the theme of agent communication with his chapter on the role of agents in en-
abling interoperability, meaning that software created by different developers
and at different times works together in seamless manner. He discusses two
limitations of current software interoperability technologies: 1. they lack the
ability to communicate definitions, theorems, and assumptions that may be
needed for one system to communicate effectively with another, and 2. there is
no general way of resolving inconsistencies in the use of syntax and vocabulary.
Like Finin and his colleagues, Genesereth has been a major contributor to
30 BRADSHAW
the KSE. His ACL (agent communication language) draws on three corner-
stones of the KSE approach: vocabularies, (ontologies) KIF (Knowledge Inter-
change Format), and KQML. The vocabulary of ACL is represented as a sophis-
ticated open-ended dictionary of terms that can be referenced by the
cooperating agents and applications.27 KIF is a particular syntax for first order
predicate calculus that provides for a common internal knowledge representa-
tion, an “inner” language for agents (Genesereth and Fikes 1992). It was origi-
nally developed by Genesereth’s group and is currently being refined as part of
an ISO standardization effort. In the ACL approach, KQML is viewed as a lin-
guistic layer on top of KIF that allows information about the context (e.g.,
sender, receiver, time of message history) to be taken into account as part of
agent messages. In short, “an ACL message is a KQML expression in which the
‘arguments’ are terms or sentences in KIF formed from words in the ACL vo-
cabulary” (Genesereth and Ketchpel 1994).
The concept of a facilitator is central to ACL. Agents and facilitators are orga-
nized into a federated system, in which agents surrender their autonomy in exchange
for the facilitator’s services. Facilitators coordinate the activities of agents and pro-
vide other services such as locating other agents by name (white pages) or by capa-
bilities (yellow pages), direct communication, content-based routing, message
translation, problem decomposition, and monitoring. Upon startup, an agent initi-
ates an ACL connection to the local facilitator and provides a description of its ca-
pabilities. It then sends the facilitator requests when it cannot supply its own needs,
and is expected to act to the best of its ability to satisfy the facilitator’s requests.
Genesereth describes several examples of applications and summarizes issues
where further work is needed. ACL is an important step toward the ambitious
long-range vision where “any system (software or hardware) can interoperate with
any other system, without the intervention of human users or… programmers.”
Agents for Information Gathering. The chapter by Knoblock and Ambite
(1977) provides an in-depth example of the use of agents for an important
class of problems: information gathering. The SIMS architecture for intelli-
gent information agents is designed to provide:
1. modularity in terms of representing an information agent and information
sources,
2. extensibility in terms of adding new information agents and information
sources,
3. flexibility in terms of selecting the most appropriate information sources to
answer a query,
4. efficiency in terms of minimizing the overall execution time for a given
query, and
5. adaptability in terms of being able to track semantic discrepancies among
models of different agents.”
AN INTRODUCTION TO SOFTWARE AGENTS 31
twofold. First, if developers are allowed to extend the set of KQML performa-
tives, they must provide both correct implementations of the directive force of
new actions as well as assure that the new actions enter into old and new con-
versation patterns correctly. Second, if the communication primitives are to be
handled independently of the content of the message, developers must not allow
any attitude operators in the content (e.g., not permit an agent who says that it
requests an act to also say that it does not want the act done).
The authors provide a comparison with other agent communication lan-
guages including AOP, Telescript, and their own Open Agent Architecture
(OAA) approach (Cohen and Cheyer 1994). Additional work in joint intention
theory (Cohen 1994; Cohen and Levesque 1991; Smith and Cohen 1995) is re-
quired to clarify how communicative actions function in the initiation of team
behavior, and how they may be able to predict the structure of finite-state mod-
els of interagent conversations as used in agent architectures such as KAoS.29
Mobile Agents. Telescript is an object-oriented remote programming lan-
guage that is designed to address the problem of interoperability for network
services (White 1997). What PostScript did for cross-platform, device-
independent documents, Telescript aims to do for cross-platform, network-
independent messaging:
“In Telescript technology, mobile agents go to places, where they perform tasks on
behalf of a user. Agents and places are completely programmable, but they are
managed by security features such as permits, authorities, and access controls. Tele-
script technology is portable, allowing it to be deployed on any platform, over any
transport mechanism, and through assorted media—wireline and wireless. Tele-
script technology can also handle different content types, including text, graphics,
animations, live video, and sounds. Telescript technology turns a network into an
open platform.30 Simplified development, portability, and support for rich message
content make the technology applicable to a range of communicating applications,
from workflow automation to information services and from network manage-
ment to electronic markets” (General Magic 1994).
Telescript technology allows developers to bundle data and procedures into an
agent that will be sent over the network and executed remotely on the server.31
The Telescript agent carries its own agenda and may travel to several places in
succession in order to perform a task. Security for host systems is of paramount
concern. The Telescript runtime engine can be set to prevent agents from exam-
ining or modifying the memory, file system, or other resources of the computers
on which they execute. Moreover, each agent carries securely formatted and en-
crypted identification tickets that must be checked by the host before running
code. The ticket may also carry information about what kinds of tasks the agent
is permitted to perform, and the maximum resources it is allowed to expend.
White provides a motivation for mobile agent technology in terms of several
example applications. A comprehensive overview of Telescript technologies and
programming model and a brief discussion of related work round out the chapter.
34 BRADSHAW
Parting Thoughts
Readers may legitimately complain about the idiosyncratic selection of chapters for
this book. Significant research topics and important bodies of work have certainly
been neglected32 although I hope that some of this may be rectified in a subsequent
volume. What I have tried to provide is convenient access to an initial collection of
exemplars illustrating the diversity of problems being addressed today by software
agent technology. Despite the fact that the solutions described here will ultimately
be replaced by better ones; regardless of whether the term “software agent” sur-
vives the next round of computing buzzword evolution, I believe that the kinds of
issues raised and lessons learned from our exploration of software agent technology
points the way toward the exciting developments of the next millennium.
Acknowledgments
Heartfelt thanks are due to Kathleen Bradshaw and to Ken Ford and Mike
Hamilton of AAAI Press, who nurtured this project from the beginning and pa-
tiently sustained it to a successful end. I am grateful to the authors of the individual
chapters for allowing their contributions to appear in this volume, and for many
stimulating discussions. Peter Clark, Jim Hoard, and Ian Angus provided helpful
feedback on an earlier draft of this chapter. Significant support for this effort was
provided by Boeing management including Cathy Kitto, Ken Neves, and Al Eris-
man; and by my colleagues in the agent research group: Bob Carpenter, Rob
Cranfill, Renia Jeffers, Luis Poblete, Tom Robinson, and Amy Sun. The writing of
this chapter was supported in part by grant R01 HS09407 from the Agency for
Health Care Policy and Research to the Fred Hutchison Cancer Research Center.
Notes
1. Works by authors such as Schelde (1993), who have chronicled the development of
popular notions about androids, humanoids, robots, and science fiction creatures, are a
useful starting point for software agent designers wanting to plumb the cultural context
of their creations. The chapter “Information beyond computers” in Lubar (1993) pro-
vides a useful grand tour of the subject. See Ford, Glymour, and Hayes (1995) for a de-
lightful collection of essays on android epistemology.
2. This is perhaps an overstatement, since researchers with strong roots in artificial life (a-
life) and robotics traditions have continued to make significant contributions to our un-
derstanding of autonomous agents (Maes 1993; Steels 1995). Although most researchers in
robotics have concerned themselves with agents embodied in hardware, some have also
made significant contributions in the area of software agents. See Etzioni (1993) for argu-
ments that software presents a no-less-attractive platform than hardware for the investi-
gation of complete agents in real-world environments. Williams and Nayak (1996) de-
scribe a software-hardware hybrid agent concept they call immobile robots (immobots).
3. For example, see the operational definition proposed by Shoham: “An agent is an enti-
ty whose state is viewed as consisting of mental components such as beliefs, capabilities,
choices, and commitments.”
AN INTRODUCTION TO SOFTWARE AGENTS 35
we are particularly interested in how the students think about the creatures. Do they
think of the LEGO creatures as machines, or as animals? In fact, we have found that stu-
dents (and adults) regard the creatures in many different ways. Sometimes students view
their creatures on a mechanistic level, examining how one LEGO piece makes another
move. At other times, they might shift to the information level, exploring how informa-
tion flows from one electronic brick to another. At still other times, students view the
creatures on a psychological level, attributing intentionality or personality to the creatures.
One creature ‘wants’ to get to the light. Another creature ‘likes’ the dark. A third is
‘scared’ of loud noises.
Sometimes, students will shift rapidly between levels of description. Consider, for ex-
ample, the comments of Sara, a fifth-grader (Martin 1988). Sara was considering whether
her creature would sound a signal when its touch sensor was pushed:
‘It depends on whether the machine wants to tell… if we want the machine to tell
us… if we tell the machine to tell us.’
Within a span of ten seconds, Sara described the situation in three different ways.
First she viewed the machine on a psychological level, focusing on what the machine
‘wants.’ Then she shifted intentionality to the programmer, and viewed the programmer
on a psychological level. Finally, she shifted to a mechanistic explanation, in which the
programmer explicitly told the machine what to do.
Which is the correct level? That is a natural, but misleading question. Complex sys-
tems can be meaningfully described at many different levels. Which level is ‘best’ de-
pends on the context: on what you already understand and on what you hope to learn. In
certain situations, for certain questions, the mechanistic level is the best. In other situa-
tions, for other questions, the psychological level is best. By playing with artificial crea-
tures, students can learn to shift between levels, learning which levels are best for which
situations.” (Resnick and Martin 1990).
12. Ideally, this would include some notion of episodic memory. Unfortunately, only two
major examples of “agents” incorporating episodic memory in the literature easily come
to mind: Winograd’s (1973) SHRDLU and Vere and Bickmore’s (1990) “basic agent.”
For a thought-provoking look into the consequences of a future where a personal
“agent” might become the ultimate cradle-to-grave companion, experiencing and re-
membering every event of a lifetime, see “The Teddy” chapter in Norman (1992).
13. In his widely cited article “Eye on the Prize” (Nilsson 1995), Nilsson discusses the
shift of emphasis in AI from inventing general problem-solving techniques to what he
calls performance programs, and gives his reasons for believing that there will soon be a
reinvigoration of efforts to build programs of “general, humanlike competence.”
14. While macro and scripting languages are technically adequate to solve this problem, it
seems unlikely that the majority of “end users” will ever want to endure what it takes to
become proficient with them: “In the past two decades there have been numerous attempts
to develop a language for end users: Basic, Logo, Smalltalk, Pascal, Playground, Hyper-
Talk, Boxer, etc. All have made progress in expanding the number of people who can pro-
gram. Yet as a percentage of computer users, this number is still abysmally small. Consider
children trying to learn programming… We hypothesize that fewer than 10% of there
children who are taught programming continue to program after the class ends… Eliot
Soloway states, ‘My guess is that the number… is less than 1%! Who in their right mind
would use those languages—any of them—after a class?’” (Smith, Cypher, and Spohrer
1997). While the software agent perspective does not obviate the need for end-user pro-
gramming, I believe it has potential as one means of simplifying some of the conceptual
barriers that users and developers face in designing and understanding complex systems.
AN INTRODUCTION TO SOFTWARE AGENTS 37
15. Fortunately, people have a lot of experience in judging the limitations of those with
whom they communicate: “Sometimes people overstate what the computer can do, but
what people are extremely good at is figuring out what they can get away with. Children
can size up a substitute teacher in about five minutes” (Kahle 1993). For evidence that
developers of intelligent software are no less prone than other people to overestimate the
capabilities of their programs, see McDermott (1976).
16. Automatic programming is an enterprise with a long history of insatiable requirements
and moving expectations. For example, Rich and Waters (1988) remind us that “compared
to programming in machine code, assemblers represented a spectacular level of automa-
tion. Moreover, FORTRAN was arguably a greater step forward than anything that has hap-
pened since. In particular, it dramatically increased the number of scientific end users who
could operate computers without having to hire a programmer.” Today, no one would call
FORTRAN a form of automatic programming, though in 1958 the term was quite appropri-
ate. The intractability of fully-automated, completely-general programming is analogous
to the problem of automated knowledge acquisition (Bradshaw et al. 1993a; Ford et al.
1993). As Sowa observes: “Fully automated knowledge acquisition is as difficult as unre-
stricted natural language understanding. The two problems, in fact, are different aspects of
exactly the same problem: the task of building a formal model for some real world system
on the basis of informal descriptions in ordinary language. Alan Perlis once made a remark
that characterizes that difficulty: You can’t translate informal specifications into formal
specifications by any formal algorithm.” (Sowa 1989).
17. Van de Velde (1995) provides a useful discussion of the three coupling mechanisms
which can enable coordination between multiple agents: knowledge-level, symbol-level,
and structural. Symbol-level coupling occurs when agents coordinate by exchange of
symbol structures (e.g., “messages”) and knowledge-level coupling occurs when an agent
“rationalizes the behavior of multiple agents by ascribing goals and knowledge to them
that, assuming their rational behavior, explains their behavior” (i.e., through taking an
intentional stance). Structural coupling, as discussed extensively by Maturana and Varela
(1992), occurs when two agents “coordinate without exchange of representation,… by
being mutually adapted to the influences that they experience through their common en-
vironment… For example, a sidewalk… plays a coordinating role in the behavior of
pedestrians and drivers… [and] the coordination of [soccer] players (within and across
teams) is mediated primarily by… the ball.” Similarly, as Clancey (1993) argues, the use-
fulness of the blackboard metaphor is that it provides an external representation that
regulates the coordination between multiple agents.
18. These latter issues are discussed in more detail in a Laurel’s (1991) book Computers as
Theatre.
19. It is also easy for people to assume less tangible qualities about agents like that they
are internally consistent, are rational, act in good faith, can introspect, can cooperate to
achieve common goals, and have a persistent mental state.
20. A more blunt criticism of agents is voiced by Jaron Lanier (1996), who writes, “The
idea of ‘intelligent agents’ is both wrong and evil. I also believe that this is an issues of
real consequence to the near-term future of culture and society. As the infobahn rears its
gargantuan head, the agent question looms as a deciding factor in whether this new beast
will be much better than TV, or much worse.” See also his extended online debate with
Pattie Maes in Lanier and Maes (1996).
21. Several commercial products have subsequently incorporated Ovallike capability,
though with less generality and sophistication. These include cooperative work tools and
databases for semi-structured information such as Lotus Notes (Greif 1994) and Caere
38 BRADSHAW
Pagekeeper, as well as mail readers with rule-based message sorting. Workflow manage-
ment tools with some of these capabilities have also appeared.
22. For other approaches to defining agents for scheduling and calendar management
tasks, see Kautz et al. (1993); Mitchell et al. (1994).
23. Maes has formed Firefly Network, Inc. in order to extend the technology developed
in Ringo to the Web. Her firefly service uses knowledge about people with similar tastes
and interests in music and movies as a means of personalizing its recommendations.
24. A sort of Java for kids.
25. For a similar approach that relies on graphical rewrite rules, see Repenning’s (1995)
Agentsheets.
26. This is of course a caricature of both approaches: Shoham does not ignore the impor-
tance of agent communication in AOP; neither would most agent communication re-
searchers argue that some representation of “mental state” is unnecessary. Davies’ (1994)
Agent-K language is an attempt to build a hybrid that extends AGENT-0 to use KQML
for communication.
27. One well-known tool that has been used to construct such vocabularies is Ontolingua
(Gruber 1992a, 1992b).
28. Recent efforts to provide a semantic foundation for KQML are described in Labrou
(1996) and Labrou and Finin (1994). Another more general approach to agent language se-
mantics is currently under development by Smith and Cohen (1995).
29. Such a strategy parallels the approach of Rosenschein, who designed a compiler that
generates finite state machines whose internal states can be proved to correspond to cer-
tain logical propositions about the environment (Kaelbling and Rosenschein 1990;
Rosenschein 1995).
30. General Magic is working hard to assure that Telescript can take maximum advan-
tage of developments in Internet technology. Its Tabriz AgentWare and Agent Tools
products (General Magic 1996) integrate Telescript and Web technologies, and White
has proposed a common agent platform intended to enable interoperability between
Telescript and other mobile agent technology (White 1996).
31. With respect to the relationship between Telescript, Tabriz, and Java, General Magic
writes: “It is important to note that Telescript and Java are complementary, interoperable
languages. Telescript agents can set parameters for Java applets and Java applets can call
Telescript operations on the server. This interoperability allows developers to create solu-
tions that leverage the power of the two environments: Java can be used to create and
manage compelling user experiences, while Tabriz can manage transactions, instruc-
tions, events, and processes” (General Magic 1996).
32. Much more, for example, could have been included about the veritable explosion of
work on agents and the Internet (Bowman et al. 1994; Cheong 1996; Etzioni and Weld
1995; Weld, Marks, and Bobrow 1995). None of the many applications of agent technolo-
gy in complex application areas ranging from digital libraries (Paepcke et al. 1996;
Wiederhold 1995) to systems management (Benech, Desprats, and Moreau 1996; Rivière,
Pell, and Sibilla 1996) to manufacturing (Balasubramanian and Norrie 1995) could be in-
cluded. We have slighted the whole fields of artificial life (Langton 1995) situated au-
tomata (Brooks 1990; Kaelbling and Rosenschein 1991), learning and adaptation (Gaines
1996; Maes 1995; Sen et al. 1996), and large portions of the voluminous literature on DAI
and other fields where important related work is taking place.
AN INTRODUCTION TO SOFTWARE AGENTS 39
References
Apple. 1993. AppleScript Language Guide. Reading, Mass.: Addison-Wesley.
Arens, Y.; Feiner, S.; Foley, J.; Hovy, E.; John, B.; Neches, R.; Pausch, R.; Schorr, H.; and
Swartout, W. 1991. Intelligent User Interfaces, Report ISI/RR-91-288, USC/Information
Sciences Institute, Marina del Rey, California.
Balasubramanian, S., and Norrie, D. H. 1995. A Multi-Agent Intelligent Design System
Integrating Manufacturing and Shop-Floor Control. In Proceedings of the First Interna-
tional Conference on Multi-Agent Systems (ICMAS-95), ed. V. Lesser, 3–9. Menlo Park,
Calif.: AAAI Press.
Ball, G. 1996. Lifelike Computer Characters (LCC-96) Schedule and Workshop Infor-
mation. http://www.research.microsoft.com/lcc.htm.
Ball, G.; Ling, D.; Kurlander, D.; Miller, J.; Pugh, D.; Skelly, T.; Stankosky, A.; Thiel,
D.; Dantzich, M. V; and Wax, T. 1996. Lifelike Computer Characters: The Persona Pro-
ject at Microsoft Research. In Software Agents, ed J. M. Bradshaw. Menlo Park, Calif.:
AAAI Press.
Barrett, E. 1992. Sociomedia: An Introduction. In Sociomedia: Multimedia, Hypermedia, and
the Social Construction of Knowledge, ed. E. Barrett, 1–10. Cambridge, Mass.: MIT Press.
Bartlett, J., and Beck, E. M., eds. 1980. Familiar Quotations. Boston, Mass.: Little, Brown.
Bates, J. 1994. The Role of Emotion in Believable Agents. Communications of the ACM
37(7): 122–125.
Bates, J., Hayes-Roth, B., Laurel, B., & Nilsson, N. 1994. Papers presented at the AAAI
Spring Symposium on Believable Agents, Stanford University, Stanford, Calif.
Benech, D.; Desprats, T.; and Moreau, J.-J. 1996. A Conceptual Approach to the Integra-
tion of Agent Technology in System Management. In Distributed Systems: Operations and
Management (DSOM-96).
Bowman, C. M.; Danzig, P. B.; Manber, U.; and Schwartz, M. F. 1994. Scalable Internet
Resource Discovery: Research Problems and Approaches. Communications of the ACM
37(8): 98–107, 114.
Boy, G. 1992. Computer-Integrated Documentation. In Sociomedia: Multimedia, Hyper-
media, and the Social Construction of Knowledge, ed. E. Barrett, 507–531. Cambridge,
Mass.: MIT Press.
Boy, G. A. 1991. Intelligent Assistant Systems. San Diego, Calif.: Academic Press.
Boy, G. A. 1997. Software Agents for Cooperative Learning. In Software Agents, ed J. M.
Bradshaw. Menlo Park, Calif.: AAAI Press.
Boy, G. A., and Mathé, N. 1993. Operator Assistant Systems: An Experimental Ap-
proach Using a Telerobotics Application. In Knowledge Acquisition as Modeling, eds. K.
M. Ford and J. M. Bradshaw, 271–286. New York: Wiley.
Bradshaw, J. M., and Boose, J. H. 1992. Mediating Representations for Knowledge Ac-
quisition, Boeing Computer Services, Seattle, Washington.
Bradshaw, J. M., and Boy, G. A. 1993. Adaptive Documents, Internal Technical Report,
EURISCO.
Bradshaw, J. M., Dutfield, S., Benoit, P., & Woolley, J. D. 1997. KAoS: Toward an indus-
trial-strength generic agent architecture. In Software Agents, ed J. M. Bradshaw. Menlo
Park, Calif.: AAAI Press.
Bradshaw, J. M.; Ford, K. M.; Adams-Webber, J. R.; and Boose, J. H. 1993. Beyond the
40 BRADSHAW
Lange, D. B. 1996. Agent Transfer Protocol ATP/0.1 Draft 4, Tokyo Research Laborato-
ry, IBM Research.
Langton, C. G., ed. 1995. Artificial Life: An Overview. Cambridge, Mass.: MIT Press.
Lanier, J. 1996. Agents of Alienation. http://www.voyagerco.com/misc/jaron.html.
Lanier, J., and Maes, P. 1996. Intelligent Humans = Stupid Humans? Hot Wired, 15–24
July. http://www.hotwired.com/braintennis/96/29/index0a.html.
Laurel, B. 1991. Computers as Theatre. Reading, Mass.: Addison-Wesley.
Laurel, B. 1997. Interface agents: Metaphors with Character. In Software Agents, ed J. M.
Bradshaw. Menlo Park, Calif.: AAAI Press.
Le Du, B. 1994. Issue 1309, 13 mai. Les Agents, des Assistants dotés d’Intelligence. 01 In-
formatique, p. 13.
Lethbridge, T. C., and Skuce, D. 1992. Beyond Hypertext: Knowledge Management for
Technical Documentation. Submitted to SIGDOC ‘92. Ottawa, Ontario, Canada.
Lewis, J. 1996. NETSCAPE Gets Serious about Infrastructure. The Burton Group.
Lubar, S. 1993. InfoCulture: The Smithsonian Book of Information and Inventions. Boston,
Mass.: Houghton Mifflin.
McCarthy, J. M. 1979. Ascribing Mental Qualities to Machines, Technical Report, Memo
326, AI Lab, Stanford University.
McDermott, D. 1976. Artificial Intelligence Meets Natural Stupidity. SIGART Newslet-
ter 57:4–9.
MacGregor, R. 1990. The Evolving Technology of Classification-Based Knowledge Rep-
resentation Systems. In Principles of Semantic Networks: Explorations in the Representation
of Knowledge, ed. J. F. Sowa, 385–400. San Francisco, Calif.: Morgan Kaufmann.
Maes, P. 1997. Agents that Reduce Work and Information Overload. In Software Agents,
ed. J. M. Bradshaw. Menlo Park, Calif.: AAAI Press.
Maes, P. 1995. Modeling Adaptive Autonomous Agents. In Artificial Life: An Overview,
ed. C. G. Langton, 135–162. Cambridge, Mass.: MIT Press.
Maes, P., ed. 1993. Designing Autonomous Agents. Cambridge, Mass.: MIT Press.
Maes, P., and Kozierok, R. 1993. Learning Interface Agents. In Proceedings of the
Eleventh National Conference on Artificial Intelligence (AAAI-93), 459–465. Menlo
Park, Calif.: American Association for Artificial Intelligence.
Malone, T. W.; Grant, K. R.; and Lai, K.-Y. 1996. Agents for Information Sharing and
Coordination: A History and Some Reflections. In Software Agents, ed. J. M. Bradshaw.
Menlo Park, Calif.: AAAI Press.
Martin, F. 1988. Children, Cybernetics, and Programmable Turtles. Masters Thesis, Media
Laboratory, Massachusetts Institute of Technology.
Mathé, N., and Chen, J. 1994. A User-Centered Approach to Adaptive Hypertext Based
on an Information Relevance Model. Paper presented at the Fourth International Con-
ference on User Modeling (UM ‘94), Hyannis, Massachusetts.
Maturana, H. R., and Varela, F. J. 1992. The Tree of Knowledge: The Biological Roots of
Human Understanding (rev. ed.). Boston: Shambala.
Mellor, P. 1994. CAD: Computer-Aided Disaster. SOFSEM 94.
Milewski, A. E., and Lewis, S. M. 1994. Design of Intelligent Agent User Interfaces:
Delegation Issues. Technical Report, Oct. 20. AT&T Information Technologies Services.
44 BRADSHAW
Miller, J. R., and Neches, R. 1987. Tutorial on Intelligent Interfaces Presented at the
Sixth National Conference on Artificial Intelligence, 14–16 July, Seattle, Washington.
Minsky, M. 1986. The Society of Mind. New York: Simon & Schuster.
Minsky, M., and Riecken, D. 1994. A Conversation with Marvin Minsky about Agents.
Communications of the ACM 37(7): 23–29.
Mitchell, T.; Caruana, R.; Freitag, D.; McDermott, J.; and Zabowski, D. 1994. Experi-
ence with a Learning Personal Assistant. Communications of the ACM 37(7): 81–91.
Moulin, B., and Chaib-draa, B. 1996. An Overview of Distributed Artificial Intelligence.
In Foundations of Distributed Artificial Intelligence, eds. G. M. P. O’Hare and N. R. Jen-
nings, 3–55. New York: Wiley.
Neal, J. G., and Shapiro, S. C. 1994. Knowledge-Based Multimedia Systems. In Multime-
dia System, ed. J. F. K. Buford, 403–438. Reading, Mass.: Addison-Wesley.
Neches, R.; Fikes, R.; Finin, T.; Gruber, T.; Patil, R.; Senator, T.; and Swartout, W. R.
1991. Enabling Technology for Knowledge Sharing. AI Magazine 12(3): 36–55.
Negroponte, N. 1997. Agents: From Direct Manipulation to Delegation. In Software
Agents, ed. J. M. Bradshaw. Menlo Park, Calif.: AAAI Press.
Negroponte, N. 1995. Being Digital. New York: Alfred Knopf.
Negroponte, N. 1970. The Architecture Machine: Towards a More Human Environment.
Cambridge, Mass.: MIT Press.
Newell, A. 1982. The Knowledge Level. Artificial Intelligence 18:87–127.
Newquist, H. P. 1994. Intelligence on Demand—Suckers. AI Expert, December, 42–43.
Nilsson, N. J. 1995. Eye on the Prize. AI Magazine 16(2): 9–17.
Norman, D. A. 1997. How Might People Interact with Agents? In Software Agents, ed J.
M. Bradshaw. Menlo Park, Calif.: AAAI Press.
Norman, D. A. 1992. Turn Signals Are the Facial Expressions of Automobiles. Reading,
Mass.: Addison-Wesley.
Nwana, H. S. 1996. Software Agents: An Overview. Knowledge Engineering Review,
11(3): 205-244.
Paepcke, A.; Cousins, S. B.; Garcia-Molina, H.; Hassan, S. W.; Ketchpel, S. P.;
Röscheisen, M.; and Winograd, T. 1996. Using Distributed Objects for Digital Library
Interoperability. IEEE Computer, May, 61–68.
Perrow, C. 1984. Normal Accidents: Living with High-Risk Technologies. New York: Basic.
Petrie, C. J. 1996. Agent-Based Engineering, the Web, and Intelligence. IEEE Expert,
11(6): 24-29.
Repenning, A. 1995. Bending the Rules: Steps toward Semantically Enriched Graphical
Rewrite Rules. Paper presented at Visual Languages, Darmstadt, Germany.
Resnick, M., and Martin, F. 1990. Children and Artificial Life, E&L Memo, 10, Media
Laboratory, Massachusetts Institute of Technology.
Rich, C., and Waters, R. C. 1988. Automatic Programming: Myths and Prospects. IEEE
Computer 21(8): 40–51.
Riecken, D. 1997. The M System. In Software Agents, ed. J. M. Bradshaw. Menlo Park,
Calif.: AAAI Press.
Rivière, A.-I.; Pell, A.; and Sibilla, M. 1996. Network Management Information: Integration
Solution for Models Interoperability, Technical Report, Hewlett-Packard Laboratories.
AN INTRODUCTION TO SOFTWARE AGENTS 45
Abstract
As the complexity and application scope of agent-based systems increases, the requirements
placed on Agent Communication Languages have also increased with it. Currently-available
ACLs focus on agent-based systems in the domain of knowledge agents. Therefore, they lack
certain facilities required to implement large, complex, and robust information-centric agent
systems. These facilities are required for efficient information transfer, use of multimedia
information, and data security. Furthermore, information-gathering agents tend to execute long-
running and/or complex tasks, and require ACL support for managing tasks and conversations.
Lastly, information agents (and other types of agents) may require more flexible agent-level
management and control, specifically in the areas of mobile resources and/or intermittently-
connected users.
In this paper we attempt to discuss the shortcomings of existing ACLs and provide specific
solutions to address them. The proposed ACL architecture is based on issues that we have
encountered with the InfoSleuth system at MCC and other related work.
1. Introduction
Agent-based systems are groups of agents that work together as a single system to integrate their functionality.
They consist of a group or groups of agents that interoperate, cooperating to execute large tasks in a distributed
manner. The individual agents are encapsulated, semi-autonomous processes that execute on a computer network,
offering their services to other agents or other processes. Each agent is a specialist in a particular task or subtask.
To execute a larger, more complex task, an agent-based system composes a solution to the task from the different
services offered by the individual agents in its system. Naturally, a key piece in this picture is the necessity for the
agents to communicate among themselves to coordinate the execution of these complex tasks.
Agent communication languages (ACLs) allow agents to communicate with each other about how to partition
these tasks, and to specify the responsibilities of the individual agents that are invoked. Proposed agent
1
This material is based upon work supported by DARPA under Contract No. N66001-97-C-8500.
2
Any opinions, findings and conclusions or recommendations expressed in this material are those of the
author(s) and do not necessarily reflect the views of DARPA.
93], [KQML-97], [Lab96] [KQML- Lite]. These proposals are oriented towards speech act theory. Speech acts
are utterances that perform some action or request some specification. An ACL message is a representation of a
speech act, and thus provides guidelines as to the interpretation of its contents. This facilitates openness by
As an ACL, the FIPA proposal is oriented towards agents sharing knowledge, and attempts to define each
speech act in the context of some belief system. In an information-oriented system, beliefs are very cumbersome,
not well understood by the community, and thus often ignored. For example, FIPA defines the information passing
performatives tell and inform, where the specifications require the agents to use modal logic to correctly
interpret the contents. However, many agents, including most information-centric agents, generally do not
implement modal logic. These agents need to be able to exchange messages without needing these extensive
capabilities.
The other group of “standard” agent communication languages, KQML (“Knowledge Query Manipulation
Language”), comes in several distinct versions. Some of these are more amenable to use in information-centric
agent systems. The original version, now referred to as “KQML Classic” [KQML-Classic], has a nested message
formulation that is particularly flexible and amenable to various uses among information agents. “KQML 93” and
its close relative “KQML 97” [Lab96],[KQML-97] have some problematic features. “KQML Lite” [KQML-Lite],
now being developed by DARPA, shows some promise of solving the problems of its precursors. However, again,
In this paper, we explore issues and requirements that information-centric agents place on an agent
communication language. Information-centric agents focus their efforts on collecting, processing, analyzing, and
monitoring large amounts of information, and presenting the information at appropriate levels and in appropriate
ways to users interested in that information. The issues we address here have grown out of our extensive
experiences with InfoSleuth [BBB+97], an information-centric agent system that has been under development for
four years and in use for the last two years. We are specifically interested not only in developing an ACL for the
information realm, but also one that is useful among the domain of knowledge agents as well. We then take these
requirements and show how they practically extend into a reasonable agent communication language. This
paradigms that support the passing of information and knowledge around efficiently and usefully. Of particular
importance is the desire not to encumber a message with interpretational constraints such as beliefs or information
formats when the receiving agent cannot understand the nuances among these constraints.
Services
Monitor
Agent
Resource
Applet Agent
User
Images &
Agent
Video
Mobile …. Resource
Agent
Ontology 1 Ontology n
Text
The InfoSleuth model [BBB+97,NPU98] defines a proven framework for loosely collecting agents based on
semantic advertisements and dynamically composing agents based on application needs. Figure 1 shows the agent
architecture currently defined and deployed in the MCC InfoSleuth project. User agents, shown on the left, stand
as proxies for individual users or groups of users. Users or other task initiators specify what information they want,
over what sort of time span, at what level they want the information abstracted or consolidated to, and may specify
how they want to view the returned results. Resource agents, on the right, serve as interfaces to external
information sources. This information can be stored in files, databases, or text or document collections. Resources
can contain any kind of information – structured data, HTML data, image/video data, and semi-structured data.
The “cloud” in the middle represents the large and diverse set of agents that work together to connect users with
Ontology agents. The Broker agent serves as a repository for information about agents, and matches requests for
services with agents that can service the request. Other agents exist to do task planning and execution, query
processing, data analysis and data mining. All of these agents communicate over a common agent communication
language, a variant of KQML, using a common set of query languages and domain ontologies.
A few notable aspects of this architecture, and especially of the agents in the “cloud”, are:
• InfoSleuth offers a set of information gathering and monitoring agents. These include: advertisement and
brokering, information source wrapping and monitoring, user persistence and representation, data correlation
detection across sources, complex query processing and event detection across sources, statistical data analysis
and mining, and tracking agent activity in subsets of the agent network.
• Agents advertise their “information gathering and monitoring” capabilities, described using semantic
constructs from the InfoSleuth agent capability ontology and a domain ontology. An agent's capabilities can
apply to portions of an ontology. In other words, an agent may constrain its capability advertisement to apply
to only a select set of concepts, relationships, or instances from a particular domain. These are represented as
• In query processing, users formulate information gathering tasks using terms from a domain-specific ontology;
the InfoSleuth system dynamically constructs information gathering agent communities, based on brokering
• In monitoring for information, the user specifies queries over the ontology. The queries which may include
relevant abstractions over the information, and may request InfoSleuth to monitor for changes in the queried
information over time. This allows the user to view large amounts of information at an appropriate level of
The InfoSleuth architecture, as it currently stands, excels at performing information gathering and monitoring
in networks of dynamically appearing and continually changing information sources. Its current Java
We note in passing that there exist many other information-centric agent systems. SIMS [AKS96],
Warren/Retsina [DSW96, DS97], Infomaster [GGKS95], TSIMMIS [GPQR+95], and DISCO [TRV95] all to some
A Layered Infrastructure
The operation of an agent system can roughly be broken into four layers, which we will call the system layer,
the task layer, the conversation layer, and the message layer. These layers together define some of the required
The system layer governs how the agent-based system works – how the agents are put together to accomplish
their tasks, how they monitor and control their internal operation. For example, one important aspect of the system
layer in InfoSleuth is that it has Broker Agents that serve as repositories for information about agents, and that can
reason over requests for services and match agents with requested services.
The task layer processes user- or external process- initiated requests into the agent system. The task layer
maps individual requests onto specific sub-tasks, and distributes the subtasks among the agents in the system.
Either inherent or explicit policies govern how the group of agents cooperate and communicate to complete the
task. The structure of these tasks3 tends to be somewhat abstract, and evolves as the task is being executed.
A conversation begins where an agent requests a specific service from another agent. Modulo issues of
forwarding the message, delegating the task, or carbon-copying the response, these conversations are essentially
pairwise exchanges between agents. With respect to these conversations, the flow of messages between the agents
Messages are the individual packets of information passed between the agents during conversations. Of all
the layers that we have discussed, this has been the most thoroughly studied in the ACL literature.
3. A General Plea
Having worked with both information-centric agents and with interoperability issues with other agent systems,
e.g. SIMS [AKS96], we would like first to issue a plea for an ACL with the following properties:
3
Note that some systems refer to “conversations” as occurring at this layer. We will maintain the term
“conversation” as we use it in InfoSleuth, to mean agent conversations as defined in the next paragraph.
• An underlying message structure that is easy to parse, interpret, and process while being extensible.
• Support for practical operational issues in systems such as robustness, monitoring, security, and self-
organization.
• No assumptions about the underlying transport mechanism should be made, though the specification may
For example, with respect to the speech acts, current standards utilize a set of speech acts that is more
semantically rich than they need to be for general operation. Thus, we advocate for pushing some of the nuances
that are currently distinguished at the speech act level down to properties within the message. This has two
advantages. One is that we can define a standard set of conversations over the speech acts more easily, and these
conversations can be used for both knowledge- and information-centric agent systems. This facilitates
interoperation with other agent systems, even with agent systems of different types. The second is that it is easier
to alter the message-specific properties to support more flexible types of service requests, without impacting the
basic underlying conversation structure. As we move towards having at least some standard core, these issues
With respect to the second point, we have found with our KQML experience that representing a message as an
unordered property list makes it harder to parse and process. Furthermore the nesting of certain types of message
such as standby can make the message hard to interpret. Nested messages are hard to interpret because they can
have conflicts between the basic properties at the different levels of nesting in the message, and it is difficult (or at
least cumbersome) to resolve those conflicts. Thus, any straightforward message specification should minimize the
With respect to the problem of parsing and processing the unordered property lists, we would like to refer the
reader back to the layered infrastructure defined earlier. Different layers within the infrastructure only need to
examine specific parts of the incoming message. The remainder of the message is left to the “application” part of
the agent, i.e., the part that may be oriented towards information or knowledge or some other domain type. For
efficiency and intelligent operation, the part of an agent that implements a specific layer needs only to examine
and LQUHSO\WR fields, and the message type, when matching an incoming or outgoing message with its
appropriate conversation. We propose the following properties, which are sorted by layer. Properties at any layer
should appear before properties in any lower layers. The specifics of these properties will become clear later in the
paper.
Layer Fields
Message layer
Conversation layer :sender, :receiver, :conversation-id, :sequence-number, :reply-to :cc-to :flow-policy
Task layer :task-id, :query-pedigree, :result-pedigree, :result-explanation, :result-annotation, : query-
effort, :query-context, :ask-policy, :reply-with-estimate, :reply-out-of-band, :locator
System layer :content, :language, :ontology, :code
Application :content, :language, :ontology, other optional properties4
We have already, in another paper [NU97], argued for a standardized “base” set of conversation policies,
again to extend the standard and to facilitate interoperation with other agent systems. In the current context, these
“base” conversations should, at least at the level of exchanges of speech acts, be independent of whether the agents
are knowledge-centric, information-centric, a mix of both, or operate in some other domain type.
Lastly we point out that both FIPA and KQML focus on information transmission between the “application”
parts of the agents, but there is also an infrastructure to all agents devoted to at least some of the functions of
managing transport and connectivity, message processing, conversation management, and task-level management.
Often, agents’ infrastructures need to exchange messages among themselves – classic examples of this in KQML
include the transport-address performative at the level of managing connectivity, and the next
performative at the level of flow control in conversation management. In InfoSleuth, we also have requirements
for additional facilities to use; including those for exchanging monitoring data and for pinging other agents to see
if they are up. Some of these facilities overlap with the semantics of the speech acts, but are addressed invisibly of
the agent application. An ACL needs to define how to implement these facilities within context.
4
In InfoSleuth, we include DVNSROLF\, UHSO\SROLF\, UHSO\VXPPDU\ here.
The message layer is where individual speech acts are represented as messages. Messages represent the
4.1 Requirements
Multimedia information presents an additional challenge beyond that of structured data, in that individual
data items are rather bulky and irregular. Text documents often contain special characters that overlap with the set
of special characters used as delimiters in the ACLs message types. Video and image data are represented as byte
streams, and are not ASCII data at all. None of these characteristics can be efficiently handled in a string-oriented
If the ACL uses special characters such as parentheses or quotes within its message structure, the presence of
those special characters in the data should be isolated from the message. Also, the ACL should allow data that is
Sometimes it is very inefficient to pass multimedia data within the message. In most cases the best solution is
to return the data out-of-band. This approach will be discussed in the Task Layer section. Still the ACL should not
put any restriction as to what can be contained within the content of a message.
A1 The ACL should not impose any requirements on the representation of the “content” part of its
messages.
A2 ACL replies must include the ability to be self-describing, i.e., to include a description of their own
The requirement that there be no restrictions on the representation of the content (Requirement A1) indicates
that there are certain parts of the message that should not even be looked at except by the application. Therefore,
we suggest that all messages be represented as property lists, where each value of a property is represented by a
length-encoded string. The string is preceded by its length (e.g., KQML represents strings in a format like
that is a property value. Alternatively, the ACL could allow the contents to be sent as a URL, and retrieved out-of-
band by some different transport mechanism such as ftp or http, which is better-suited towards handling files.
With respect to messages being self-describing (Requirement A2), this is important either when sending data
on the sender’s own initiative (tell), or at the request of the receiver (reply). The self-description also may apply to
contents that are included in the message (either tell or reply), or to contents that are available only out-of-band
(tell-summary or reply-summary). The self-description would also apply to message encryption and compression
schemes.
5. Conversation layer
The conversation layer is the layer of the system delivering message interactions between agents. The flow of
5.1 Requirements
Conversation Identification is an issue that is usually ignored in ACLs and often causes problems. For
example KQML supports the chaining of messages using the UHSO\ZLWK and LQUHSO\WR fields, which
are predicated on a request-response model. Therefore one would have trouble chaining together messages in
conversations that do not follow that model. Suppose an agent were to submit a query involving a large
computation. At some point, the agent wishes to cancel the query or possibly amend the query to provide
additional restrictions because it is taking too long. However, since no response has been received there is no
incoming message to chain the discard message to. Therefore it is evident that it is necessary to be able to
Conversations with multiple messages add complexity and versatility to communication between agents but it
creates the problem of message ordering. This problem is important when dealing with multimedia content since
the order of the messages is very important. The data in these streams may either be naturally ordered (e.g.
ACL need to provide information for assembling the messages into the proper sequence if required. KQML
messages, for instance, do not support any message parameters that would inherently aid in the reordering of
messages on the other end. The ordering issues also hold true when exchanging knowledge, as the interpretation of
new knowledge is often dependent on the current knowledge. Thus, for example, two interdependent tells may
have a different effect on the knowledge base if they are received in different orders.
B1. The messages in the ACL should provide information as to which conversation it pertains to.
B2. The messages in the ACL should provide the information needed to ensure that the messages are
B3. The ACL should provide information about the origin and destination of the messages.
B4. The ACL should provide support to notify in the event of an error and acknowledge receipt of
messages.
Multi-Agent Conversations
One of the main problems faced by an information-centric agent system is that there is a lot of duplication of
data. The reason for this is that the conversations used by these systems are usually pair-wise. For information-
centric agents this is a serious problem since frequently large intermediate results are passed between agents, and
usually all these agents do is forward it to the next agent in the chain. If conversations were not restricted to two
agents, then it would be possible for agents to communicate more efficiently. Also conversations would not require
additional parameters to support multicasting, delegating, and forwarding. Even forum type discussions between
Service-oriented conversations are not necessarily pairwise. For instance, one agent may make a subscription
request over a set of information, then other agents may themselves subscribe to the same set. In this case, the
agent system (for efficiency) may multicast the responses to all of the subscribers. This is one example of a
An agent may receive a request that it wishes to delegate in entirety to another agent. In this case although the
processing agent receives the request from the delegating agent it would send the reply to the agent specified to it
B5. The ACL should support conversations involving more than one agent
B6. An Agent should have the ability to multicast a message to multiple agents.
Flow Control
In a data-intensive environment, query results frequently are large, involving many possibly ordered results.
This is very typical during query processing when exchanging intermediate results. The typical way that this is
addressed in the existing ACLs is to use a streaming facility. With this approach, results are returned one at a time
to the requesting agent. However, in an information-intensive agent system, we need a different type of streaming
facility. In particular, we need to be able to divide the large result into uniform blocks, sending one block per
message. We can then pipeline these messages back, using flow control techniques to ensure that the receiver does
not get flooded with results. Therefore we have the following flow control requirement.
B9. The ACL should provide underlying support for streaming back data, and for flow control
By including a unique conversation identifier field in each message we can solve the issue of matching
Each message can contain a field with the sequence number of the message in the conversation. This would
An Error message would be needed to signal in the event of an error (Requirement B4).
Therefore the following fields are defined to support the above requirements.
Multi-Agent Conversations
To support multi-agent conversations and multicasting (Requirements B5 and B6) one must be able to specify
So support delegation (Requirement B7) we would need an additional field to specify which agent to send the
replies to. The agent that is doing the delegation would send the request to the agent that is processing the task.
The request would contain a UHSO\WR field telling it where to send the replies. That way the results would be
sent directly to the requesting agent rather than being funneled through the delegating agent.
Forwarding (Requirement B8) could be accomplished by send a request with a FFWR field set to the agents
Flow Control
To support flow control (Requirement B9) in the Agent Communication Language we would need additional
messages that could be passed between agents to control the data flow between the agents. The requestor also needs
to be able to describe the number of tuples it is willing to receive in a single block, and the number of blocks of
messages that can be “in transit” at a given time for flow control. Streaming and flow control may be supported by
A next message is an indicator from the receiver to the sender that it can send another reply.
given time. The entire result is the concatenation of the contents of all of the replies, in the order they were sent.
When Agent Y starts responding, it primes the channel with <num-out> replies, then after that it sends the next
6. Task layer
At the task layer, an ACL needs to facilitate the management of the task-related services within the agent. A
prime example of where this becomes useful in the data domain is during transaction management.
6.1 Requirements
At the layer of tasks, an ACL needs to support the ability to relate incoming service request conversations
with their corresponding outgoing service conversations easily. To facilitate this, there should be some easy way of
matching the incoming conversations with the set of threads accessing outgoing conversations. Messages in the
ACL should contain an overall task identifier that is constant for all conversations pertaining to the task.
The task model implied by the ACL should allow the requesting agent to terminate gracefully the computation
of a task and the transmission of results at any time, including both before it receives any results and during the
The ACL should have support for an agent to refuse service requests from certain agents.
C1. Each task in the system should have its unique identifier that could be added to all messages
C2. The ACL should support asserting and querying for information, and replying to queries.
Explanation of Results
One issue that comes up immediately once changes are allowed in the underlying set of resources is the notion
of uncertainty in the returned answer. For instance, if you execute the same query at two separate times, you may
get different results because one of the resources accessed during the first query has gone offline, or a new resource
was accessed when processing the query the second time. A query that ran once may not return any information
the second time because some resource has gone offline. Results may need to contain a result pedigree (origin) so
that the requesting user can understand where the information came from, either because he wants to judge the
quality of the results or because he wants to understand why some information is missing.
Results may be incomplete, or only answer some part of the query. Ideas related to this have been explored,
for instance, in the DISCO [TRV95] system. The return messages need to allow for the responding agent to
explain the nature of incomplete results and why the query was not completely processed.
Messages containing information should be able to be annotated with support for using or viewing that
information. Similar issues hold when returning information or simply telling another agent something. For
example, we have already noted that the response may be a summary, locator or estimate. Depending on the type
of information, the result also may be annotated with preferred ways of viewing the result; for instance, it may
recommend that large amounts of numerical data be displayed as a graph or scatter plot. Also, the user may want
C5. Results may need to contain a result pedigree so that the requesting agent can understand where the
C7. Results might need to contain information on how to use or view the information.
Querying
For all aspects of agent interaction relating to data - telling or updating, querying, and responding, there are
nuances about how the information is requested or presented that should not necessarily show up at the layer of the
message type / speech act. For instance, if you want to subscribe to a set of information and be notified of changes,
you may want the notification to happen as soon as the information changes or you may want to know periodically.
Furthermore, you may want to receive a fresh copy of all your data, or you may want to receive just the changes.
There are many issues related to the fact that resources may contain overlapping sets of data, also there may
be a lot of resources available, containing more information than is really needed by the requester. In this
situation, it is helpful to constrain the set of agents accessed, and sometimes to return a “best effort” result as
Certain types of information access do not lend themselves well to having the set of resources change without
restriction. For example, a user may wish to browse through a specific set of related information rather than ask
specific queries. Also, sometimes a user may wish to formulate a query based on some response to an earlier query.
In a data mining application, the user may wish to analyze a constant set of data in different ways. Given that a
result may be annotated with the resources where it came from, i.e. its pedigree, then further queries may need to
be constrained to access only those resources, or the state of the system at the time the earlier query was made.
Thus, the set of results and their pedigree may define a context over which the user can operate.
The querying model should support the return of an estimate before the query is processed. This estimate
could be the time the query would take to process or the approximate size of the result, etc. The message should
As an alternative to receiving results through conversations, the information can also be returned out-of-band.
Here, the direct response to a query may consist of a locator for the information results, and possibly a summary of
the results. In InfoSleuth we have explored using out-of-band transmission of bulky, non-ASCII data such as
images. With this approach, a locator such as a URL is returned in place of each multimedia item. During query
actually looking at the item can use the URL to retrieve it out-of-band by some more efficient means, such as ftp, or
http.
C8. An Agent should be able to specify how queries are performed and the type of results that are
returned.
C9. An agent should be able to query for a “best effort” result or by amount of data to return as well as
C10.An Agent should be able to specify a context over which it can operate.
To be able to identify which task a particular message belongs (Requirement C1) we would need to define a
task identifier field for each message. This field could be named WDVNLG.
We suggest supporting the following messages to fulfill the above requirements (Requirements C2 - C4).
A sorry is used to signal that the agent cannot or will not provide service.
Figure 3. Conversations to support asserting and querying for information, and replying to queries
Explanation of Results
The following fields where defined to support the above mentioned requirements (Requirements C6 and C7).
Querying
The following fields where defined to support the above mentioned requirements (Requirement C8 – C12).
7. System Layer
At the system layer, an agent-based system needs to be able to monitor and manage its own internal operation
and its interoperation with other agent-based systems. This monitoring and management should be shielded from
the “application” part of the agents, but is rather embedded in the agent infrastructure.
Advertisements
An agent must be able to advertise its capabilities in more depth than just advertising its service interface. We
have discussed this issue in more detail in [NU96]. This requirement has been particularly strong in the InfoSleuth
system, which is designed to adapt to changing availability of agents and resources. When an agent advertises
itself, it offers up its services to the agent system. The clearer the specification of this advertisement, the better
matchmaking that the broker can do. In InfoSleuth, we use constraint-based specification of advertisements and of
queries, for instance. Therefore, our advertisements are specified as a service interface plus constraints over the
information content of the agent, its semantic capabilities, and other agent properties.
Secondly, with respect to a changing system, agents may wish to change its advertisement, or even
unadvertise itself if it is about to shut down or wishes to disappear for a while. This enables the broker (or
D1. Advertisements should not be required to use a specific content language, but rather should use a
D2. The ACL should support the ability of an agent to modify or delete its advertisement.
An agent-based system should allow the option for its agents to monitor themselves, and to provide
information about themselves to other agents as appropriate. During normal operation, monitoring information
may be collected at different levels of operation – transport, message, conversation, task, and agent. Additionally,
error information may be generated at different levels of operation; for instance, the message layer of an agent that
received a malformed message may wish to notify the message layer of the sending agent of the problem. Lastly,
the infrastructure may need to maintain a current version of the interconnectivity of the system, using mechanisms
such as pinging agents to see if they are alive or subscribing to changes in an agent’s state, in which case the agent
messages containing this information can be distinguished at the appropriate layer of processing.
D4. The ACL should include at the system layer messages used to monitor connectivity and subscribe to
changes in connectivity.
Advertisement
We suggest supporting three message types at this layer to support the requirements (Requirements D1 and
D2).
Advertise asserts positive information about an agent, for either when the agent is starting up or
advertising for the first time, or when the agent has additional information to advertise.
Unadvertise indicates that specific information about the agent is now invalid.
Unregister indicates that the agent is shutting down, and should be removed entirely from the broker’s
repository.
advertise /
unadvertise /
Agent X unregister Broker
ack /
error
Much of the monitoring and error-communication at the system layer mimics the conversational paradigms
that happen at the application level. Therefore, we suggest that monitoring ontologies be defined in conjunction
with the ACL, where each monitoring ontology corresponds to some level of processing. Thus, the message layer
would have its own ontology that describes the information it can provide (including error types and error codes).
Similar ontologies would also be defined for the conversation, task, and system layers. Then, requests and
information propagation related to these layers would follow the same message and conversational semantics as the
applications use. These messages would actually be handled by the agent’s infrastructure at the appropriate layer.
Thus, we have the following properties to support monitoring functionality (Requirements D3 and D4).
With respect to pinging and connectivity monitoring, we suggest implementing agent ping as an ask message for
the remote agent’s name over the system ontology, where the name specified in the reply should correlate with the
name the requesting agent expects. If an agent is mobile other agents may wish to subscribe to its location.
8. Conclusions
In this paper, we have presented a set of general requirements and approaches towards defining a general
ACL that would support information-centric agent systems. Our proposal for a general ACL is not intended to
detract from the needs of knowledge-centric agents, but rather to move towards having a standard set of speech
acts. These speech acts would be the “common denominator” for both information- and knowledge-centric agents,
As an example, earlier we noted that FIPA supports different speech acts for an agent to tell another agent
something, based on what the telling agent believes about itself and what it believes the other agents should do.
basic type of message, and when carrying knowledge the properties of the message would annotate the contents
with the beliefs of the sending agent. Other types of belief-oriented annotation might be useful in other
circumstances; therefore the extensibility of the ACL would be more focused on extending the properties associated
with the messages rather than extending the message types themselves.
With a standard set of basic speech acts defined, we can then extend the ACL to support the different
functions required by the conversation, task and system layers of agent-based systems. We have made some specific
proposals in this paper towards supporting that functionality. Some issues raised by this architecture have not
really been addressed properly in any currently existing ACL, though FIPA [FIPA] is addressing some of these
issues. Also, security-related issues specifically are discussed in some detail in [Thi95]. However, issues pertaining
to each layer of this architecture must be addressed before we can define a “standard” ACL and consequently move
Acknowledgements
The authors would like also to thank Brad Perry for his contributions to the ideas in this paper.
References
[AKS96] Y. Arens, C. A. Knoblock, and W. Shen, "Query Reformulation for Dynamic Information Integration,"
Journal of Intelligent Information Systems, 1996
[BBB+97] R. Bayardo et.al, “InfoSleuth: Agent-based semantic integration of Information in open and dynamic
environments”. In Proceedings of SIGMOD ’97, 1997.
[CORBA] The Object Management Group and X/Open, The Common Object Request Broker: Architecture and
Specification, Revision 1.1, John Wiley and Sons, 1992b.
[DS97] K. Decker and K. Sycara, “Intelligent adaptive information agents”. To appear in Journal of Intelligent
Information Systems.
[DSW96] K. Decker, K. Sycara and M. Williamson, “Modeling information agents: Advertisements,
organizational roles, and dynamic behavior.” In Working Notes of the AAAI-96 Workshop on “Agent
Modeling”, 1996.
[FIPA] FIPA 97 Specification, http://drogo.cseult.stet.it/fipa/spec/fipa98/fipa98.htm, November, 1997.
[FLM97] T. Finin, Y. Labrou and J. Mayfield, “KQML as an agent communication language”. In Software
Agents, J. M. Bradshaw, ed., AAAI Press, 1997.
[GGKS95] D. Geddis, M. Genessereth, A. Keller and N. Singh, “Infomaster: a virtual information system”. In
ACM CIKM Intelligent Information Agents Workshop, 1995.
(MAC3)
http://mobility.lboro.ac.uk/MAC3/
Co-chairs
Program Committee
Preface
Mobile Agent research is a rapidly growing field contributing to autonomous software agents and
distributed systems. Mobility is both a useful abstraction and tool for agent-based system design-
ers; it allows for increased resource efficiency, capability, and robustness. Also, mobile code is
becoming an accepted technology for building distributed systems; allowing distributed systems to
be more dynamic and flexible.
While the mobile agent field is a promising area of new research, it comes with many challenges.
Although mobility greatly expands the potential of agent systems, the issues of increased complex-
ity and managability must be addressed. Mobile agents also incur new security and consistency
problems. Finally, mobility is a relatively new tool for system design; we are still in the early stag-
es of exploring what it is best at. The solution to these problems can be attained through diligent
research and communication.
This workshop is one entry in the continuing dialog about mobile agent systems. We hope it will
be a valuable opportunity for active researchers in the field to meet, present current and forthcom-
ing research, share ideas, and discuss and critique each other's work.
These workshop notes contain seven papers grouped into four themes. The Argument for Mobile
Agents contains two papers that discuss in detail why mobile agents are useful; these ideas provide
context for mobile agents research. Tools for managing agent systems are an important facet of
making manageable systems; pattern languages are one such useful tool for organizing mobile
agent systems. Applications are ultimately what justifies any research; this section contains de-
scriptions of two areas for which mobile agents are particularly well suited. Finally, the workshop
notes end with two papers that describe conceptual frameworks for mobile agent systems; this re-
search is important so that we may understand the complex software systems we are building.
We wish to thank our program committee for all their help and guidance in organizing the work-
shop, and all contributors. We hope it will be a valuable experience for everyone involved.
Table of Contents
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i
Table of Contents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii
Alexander Schill (Dresden University), Albert Held (DaimlerChrysler), Thomas Ziegert (DU),
3:30 - 4:30 Frameworks for Managing & Understanding Mobile Agent Complexity
This program is only a rough guide for the day and is open to change.
dfk@cs.dartmouth.edu, robert.s.gray@dartmouth.edu
Abstract
Use of the Internet has exploded in recent years with the appearance of the World-Wide Web. In
this paper, we show how current technological trends necessarily lead to a system based substantially on
mobile code, and in many cases, mobile agents. We discuss several technical and non-technical hurdles
along the path to that eventuality. Finally, we predict that, within five years, nearly all major Internet
sites will be capable of hosting and willing to host some form of mobile agents.
1 Introduction
Rapidly evolving network and computer technology, coupled with the exponential growth of the services and
information available on the Internet, will soon bring us to the point where hundreds of millions of people
will have fast, pervasive access to a phenomenal amount of information, through desktop machines at work,
school and home, through televisions, phones, pagers, and car dashboards, from anywhere and everywhere.
Mobile agents will be an essential tool for allowing such access. Mobile agents are an effective choice for
many reasons [LO99], and although not all applications will need mobile agents, many other applications
will find mobile agents the most effective implementation technique for all or part of their tasks.
Although current trends in Internet technology and usage lead inevitably to the use of mobile agents, several
technical and non-technical hurdles must be addressed along the way. Although these hurdles represent
significant challenges, they can be cleared within years, and nearly all major Internet sites will accept mobile
agents within five years. The goal of this position paper is to spark discussion about how best to realize this
optimistic, but reasonable, vision.
2 Trends
There are several trends affecting Internet technology and activity:
Bandwidth. The telecommunications industry is laying down astonishing amounts of fiber. Although
Internet traffic is growing exponentially, the bandwidth soon to be available on the Internet backbone, as
well as to many offices and neighborhoods, is immense.
Nonetheless, bandwidth to many end users will remain limited by several technical factors. Many users
will still connect via modem, or at best, ADSL over the old copper loop. Many other users will connect
via low-bandwidth wireless networks. Most users can expect to see no more than 128 Kbps to 1 Mbps
available at their desktop or palmtop, although some asymmetric cable modems may reach 10 Mbps (for
downloads) [Gri99, DR99].
Perhaps more importantly, the gap between the low-bandwidth “edge” of the network, and the high-
bandwidth “backbone” of the network, will increase dramatically as the backbone benefits from increased
quality and availability of fiber, while the edge remains limited by the fundamentals of wireless and copper
connections. We expect that this trend will continue even as local connections improve past 1 Mbps in the
next few years, since backbone bandwidths are improving much faster than local bandwidths.
Mobile devices. One of the hottest areas of growth in the computer industry is portable computing
devices. Everything from laptops to palmtops to electronic books, from cars to telephones to pagers, will
access Internet services to accomplish user tasks, even if users have no idea that such access is taking place.
Typically, these devices will have unreliable, low-bandwidth, high-latency telephone or wireless network
connections.
Mobile users. Web-based email services1 make it clear that users value the ability to access their email
from any computer. Web terminals will become commonplace in public spaces, such as cafes, airports, and
hotels. Eventually, particularly with the growth in bandwidth, users will have full access to all of their files
and applications from any terminal. Despite this, mobile devices will proliferate unchecked, since just as
with public phones, Web terminals will never be available everywhere that a user might find herself.
Intranets. Organizations are increasingly using Internet protocols, particularly HTTP, to build internal
“intranets” for their own distributed-information needs. Since all access to an intranet is managed by a
single organization, new technologies can be deployed quickly, since (1) little coordination is needed with
outside organizations, and (2) security (within the intranet) is of less concern.
Information overload. Internet users are already overwhelmed by the sheer volume of available informa-
tion, and the problem will get worse as the Internet grows. Search engines, shopbots, portals, collaborative
filtering, and email filtering are existing technologies that allow the user to reduce the torrent to a manageable
stream, but these technologies are still quite limited.
Customization. Unlike broadcast media, the Internet makes it possible to customize access for each user.
Current technologies allow customization at both the client (browser) and the server. Many Web sites include
their own site-specific customization features, but the customization is increasingly provided by third-party
“proxy” sites.
Proxies. Such proxy sites, which today are most often Web sites such as the various shopbots, interpose
between a user and one or more other Internet services. As a means to both reduce information overload
and customize service access, proxy sites will become more and more important. In particular, as portable
devices become more prevalent, highly specialized proxy sites will be provided to meet the special needs of
mobile users.
(d)
"Customization"
(e.g., re-formatting, Avoid large Disconnected
(h) (j)
filtering, metasearch) transfers operation
(m)
Avoid star-shaped
(o)
Multiple sites itinerary
to visit
(p)
Multi-hop mobile code (mobile agents)
to multiple proxies or servers
4 Technical hurdles
There are several technical hurdles that must be cleared before mobile agents can be widely used.
Performance and scalability. Current mobile-agent systems save network latency and bandwidth at
the expense of higher loads on the service machines, since agents are often written in a (relatively) slow
interpreted language for portability and security reasons, and since the agents must be injected into an
appropriate execution environment upon arrival. Thus, in the absence of network disconnections, mobile
agents (especially those that need to perform only a few operations against each resource) often take longer to
accomplish a task than more traditional implementations, since the time savings from avoiding intermediate
network traffic is currently less than the time penalties from slower execution and the migration overhead.
Fortunately, significant progress has been made on just-in-time compilation (most notably for Java), software
fault isolation, and other techniques [MMBC97], which allow mobile code to execute nearly as fast as natively
compiled code. In addition, research groups are now actively exploring ways to reduce migration overhead.
Together, these efforts should lead to a system in which accepting and executing a mobile agent involves only
slightly more load than if the service machine had provided the agent’s functionality as a built-in, natively
compiled procedure.
2 e.g., http://www.metacrawler.com/.
3 e.g., Apple’s “Sherlock” meta-search tool.
Portability and standardization. Nearly all mobile-agent systems allow a program to move freely among
heterogeneous machines, e.g., the code is compiled into some platform-independent representation such as
Java bytecodes, and then either compiled into native code upon its arrival at the target machine or executed
inside an interpreter. For mobile agents to be widely used, however, the code must be portable across
mobile-code systems, since it is unreasonable to expect that the computing community will settle on a
single mobile-code system. Making code portable across systems will require a significant standardization
effort. The OMG MASIF standard is an initial step, but addresses only cross-system communication and
administration [MBB+ 98], leading to a situation in which an agent can not migrate to the desired machine,
but instead only to a nearby machine that is running the “right” agent system. The mobile-agent community
must take the next step of standardizing on some specific execution environment(s) (such as a particular
virtual machine), as well as on the format in which the code and state of a migrating agent are encoded.
Security. It is possible now to deploy a mobile-agent system that adequately protects a machine against
malicious agents [Vig98]. Numerous challenges remain, however: (1) protecting the machines without ar-
tificially limiting agent access rights;4 (2) protecting an agent from malicious machines; and (3) protecting
groups of machines that are not under single administrative control. An inadequate solution to any of these
three problems will severely limit the use of mobile agents in a truly open environment such as the Internet.
Fortunately, groups are now exploring many new techniques, each of which addresses (or partially addresses)
one of the three problems (e.g., agents paying for resource usage with electronic cash, which allows them to
live and propagate only as long as their cash supply holds out). Although many technical advances (and
user-education efforts) must be made before these three problems are solved adequately for all Internet
applications, current work is promising enough that, within five years, mobile-agent systems will be secure
enough for many applications.
5 Non-technical hurdles
Once the technical challenges have been met, there remain several non-technical issues that may deter the
widespread adoption of mobile-agent technology. Internet sites must have a strong motivation to overcome
inertia, justify the cost of upgrading their systems, and adopt the technology. While the technological argu-
ments above are convincing, they are not sufficient for most site administrators. In the end, the technology
will be installed only if it provides substantial improvements to the end-user’s experience: more useful ap-
plications, each with fast access to information, support for disconnected operation, and other important
features.
Lack of a killer application. The most important hurdle is that there is no “killer” application for mobile
agents. The “mobile agent” paradigm is in many respects a new and powerful programming paradigm,
and its use leads to faster performance in many cases. Nonetheless, most particular applications can be
implemented just as cleanly and efficiently with a traditional technique, although different techniques would
be used for different applications. Thus, the advantages of mobile agents are modest when any particular
application is considered in isolation. Instead, researchers must present a set of applications and argue that
the entire set can be implemented with much less effort (and with that effort spread across many different
programming groups). At a minimum, making such an argument demands that the mobile-agent community
actively support anyone who is writing a high-quality survey of mobile-agent applications, since no one group
will be able to implement a sufficient number of applications. Once a clear quantitative argument is made,
a few major Internet services can be convinced to open their sites to mobile agents, since they will recognize
that agents will lead to more applications based around their services and hence more users. From there,
more Internet services will follow.
Getting ahead of the evolutionary path. It is unlikely that any Internet service will be willing to jump
directly from existing client-server systems to full mobile-agent systems. Researchers must provide a clear
evolutionary path from current systems to mobile-agent systems. In particular, although full mobile-agent
4 Many mobile-agent systems reduce an agent’s access rights when it arrives from a machine that is not trusted, even if it
was launched from a trusted user at a trusted site. The concern is that the agent may have been maliciously modified at the
untrusted site.
systems involve all the same research issues (and more) as more restricted mobile-code systems, researchers
must be careful to demonstrate that the switch to mobile agents can be made incrementally.
For example, “applets”, mobile code that migrates from server to client for better interaction with the user,
are in common use, and the associated commercial technology is improving rapidly (e.g., faster Java virtual
machines with just-in-time compilation). From applets, the next step is proxy sites that accept mobile code
sent from a mobile client. In all likelihood, such proxies will be first provided by existing Internet service
providers (ISPs). Since the sole function of the proxy sites will be to host mobile code, and since the ISPs
will receive direct payment for the proxy service (in the form of user subscriptions, although not likely at a
fixed rate), the ISPs will be willing to accept the perceived security risks of mobile code. Once mobile-code
security is further tested on proxy sites, the services themselves will start to accept “servlets”, mobile code
sent from the client directly to the server (or from the proxy to the server).5 Once servlets become widely
used, and as researchers address the issue of protecting mobile code from malicious servers, services will start
to accept mobile agents.
Another critical evolutionary path is the migration of agent technology from intranets to the Internet.
Mobile-code technologies will appear first in the relatively safe intranet environment, particularly intranets
that are built on high-latency networks such as a WAN or a wireless network for mobile computers. For
example, a large company, particularly one with a mobile workforce, might find mobile agents the most
convenient way to provide its employees with a wide range of access to its internal databases. Intranets tend
to be early adopters of new (useful) technology, because their administrators have more control over the
intranet than over the Internet; that control means that security is less of a concern, and wide deployment
of agent support services can be encouraged. As the technologies mature in intranets, site administrators
will become comfortable with them, and their practicality, safety and potential uses will become clear. Then
they will find their way into the Internet.
Revenue and image. A final important hurdle is the problem of revenue flow and commercial image.
For example, although it is not yet clear whether advertising is a viable economic foundation for Web sites,
many Web sites earn money solely from advertisements. If these sites allow mobile agents to easily access
the content of the site, the number of human visits to the Web pages will presumably decrease, and the
advertisements will not be seen. How, then, will the site earn revenue? Similarly, when users are accessing
a service with a front-end backed by mobile agents, the distinction between the service and the front-end
agents starts to blur. Since the agents will likely be provided by middleware developers, the Internet service
will no longer have complete control over its image. A poorly implemented agent may lead to a negative
view of the service, even though the service is blameless. We believe, however, that mobile agents can be
deployed in the near-term in many applications where the existing services do not rely on advertising; in the
long-term, both the Internet and mobile-agent communities will need to explore different revenue models.
6 Conclusion
There is a strong case for the use of mobile agents in many Internet applications. Moreover, there is a clear
evolutionary path that will take us from current technology to widespread use of mobile code and agents
within the next five years. Once several technical challenges have been met, and a few pioneering sites install
mobile-agent technology, use of mobile agents will expand rapidly.
7 Acknowledgments
Many thanks to the Office of Naval Research (ONR), the Air Force Office of Scientific Research (AFOSR),
the Department of Defense (DoD), and the Defense Advanced Research Projects Agency (DARPA) for their
financial support: ONR contract N00014-95-1-1204, AFOSR/DoD contract F49620-97-1-03821, and DARPA
5 Like applets, and unlike agents, servlets are mobile code but not mobile processes. The code is moved from client to server,
starts execution, and later ends execution on the same machine. It cannot migrate further once it starts executing.
contract F30602-98-2-0107; to Jon Bredin, Brian Brewington, and Arne Grimstrup for invaluable feedback on
early drafts of this paper; and to the anonymous reviewers for their useful and thought-provoking comments.
References
[DR99] Amitava Dutta-Roy. Bringing home the Internet. IEEE Spectrum, 36(3):32–38, March 1999.
[Gri99] Corey Grice. When will data change the wireless world? CNET NEWS.COM, February 10,
1999.
[LO99] Danny B. Lange and Mitsuru Oshima. Seven good reasons for mobile agents. Communications
of the ACM, 42(3):88–89, March 1999.
[MBB+ 98] D. Milojicic, M. Breugst, I. Busse, J. Campbell, S. Covaci, B. Friedman, K. Kosaka, D. Lange,
K. Ono, M. Oshima, C. Tham, S. Virdhagriswaran, and J. White. MASIF: The OMG Mobile
Agent System Interoperability Facility. In Proceedings of the Second International Workshop
on Mobile Agents, volume 1477 of Lecture Notes in Computer Science, pages 50–67, Stuttgart,
Germany, September 1998. Springer-Verlag.
[MMBC97] G. Muller, B. Moura, F. Bellard, and C. Consel. Harissa: A flexible and efficient Java envi-
ronment mixing bytecode and compiled code. In Proceedings of Third USENIX Conference on
Object-Oriented Technologies and Systems (COOTS ’97), pages 1–20, 1997.
[Vig98] Giovanni Vigna, editor. Mobile Agents and Security, volume 1419 of Lecture Notes in Computer
Science. Springer-Verlag, 1998.
!#"
$
&%')(*+,-./
0 /12
!35468794:+ ;<1>=9?@A3$48B
CED1FG-HJILK/MONQPRPRNTS
U)VWRXYMOV:N KFG-G{F}|@~9!PMO
WRMbwV
Z\[^]`_a_b]Tc
d9egfh.[iej]YkmlEnj]po hYq'rsY[^t`uvh.hwf*kyx'h.z ]`omoyrAx`nY[kneY[ tY]Ykyx`
9N'VWRPRND)V!MYN'P
RMWwMPRNE>
V:vXYP`WRMO!N
D)V!MYN'P
RMW
Xw|@NQV!NQ`
2MWQN'PR OwV!
U1¡!PMO ¢w£>¢g¤Y¤Y¤
¥Q¦§g¨j©\ª-«¬w§g®©¦
¯>°j±-²Q³Q´*µp³T¶·¸°j¹»º¼p´*¼`±½¹»º$·¸³¾g±Rºa¿À½a¹iÁw±-Âj³ÃQ±Àµ`´*¼j¼jµi¹i¿´·¸¹m³QÂpº$³*¶2ÄE³*Áj¹iµi±Å³g¾g±{·¸±¿Æ°jÂp³*µi³*²*ÇÈ\°j¹»¿Æ°°p´Ã*±
Âj³T·9´T¼j¼w±´*½a±R¾ÉÇ*±·ÁjÊg·9ºa°j³QÊjµi¾ÉÁw±¶±R´*ºa¹mÁpµm±È\¹m·a°Ë³*Êj½9¿Êj½¸½a±Â'·Ì'Âp³È\µm±R¾g²*±³*¶\·a°j±¾j³*Í´T¹iÂÎ@¯>°j±Rº®±
Âj±ÀÈÏ´T¼j¼jµi¹»¿À´·¸¹m³QÂpº¿À³*Â'·a½Æ´*¾j¹i¿··a°p±³*¶·a±ÀÂjÐOÍ´*¾j±J³*Á`º®±½aô·¸¹m³Q·a°p´T·Ä@³*Áj¹iµm±Ñųg¾g±J¹»ºÒvÊpº®·´*Âj³T·¸°j±À½
·a±R¿Æ°jÂj¹»ÓQÊp±·¸°p´·¾g³Ô±º9Âj³*·9½¸±´*µmµiÇÕÁj½¸¹mÂp²JÍ}Ê`¿Æ°Ëͳ*½¸±)¼w³Qº¸ºa¹mÁj¹iµi¹·¸¹m±Rº}·¸°p´T±Ög¹»ºv·¸¹mÂp²J·¸±¿Æ°jÂj³Qµm³Q²*¹i±º¶³*½
¾g¹»ºv·¸½a¹iÁjÊg·¸±¾´T¼j¼pµm¹»¿À´T·a¹i³*ÂpºÎׯ>°j±À½¸±E¹»º´ØÈ\°j³*µi±@¿µ»´*º¸º³T¶¼j½¸³*Ájµi±Àͺ9·a°`´·°p´ÃQ±1Âp³T·½¸±¿±¹mÃQ±¾ÙÍ}Êp¿Æ°
´·a·a±ÀÂ'·¸¹m³QÂ9ÇQ±·´*Âp¾·a°p´T·´T½¸±Âp³T·$ȱÀµiµjÍ´TÂp´*²*±¾ÁÔÇ¿ÀÊj½a½¸±ÀÂ'·5±ÀÂÔÃÔ¹i½a³QÂjͱÀÂ'·¸ºÎ.¯>°j±Rº®±{´*½a±·¸°j±{¼j½¸³*Ájµi±Àͺ
³T¶Í´T¹iÂ'·¸´T¹iÂj¹iÂj²¿³QÂpºa¹iº®·a±Âp¿Ç³T¶¾gÇÔÂp´T͹»¿>¹mÂj¶³*½¸Í´T·a¹i³*´TÂ`¾Í´*¹mÂ'·Æ´T¹iÂj¹mÂp²º®Çgº®·a±Àͺ¹m´Q¾g±Ó'Êp´Q¿ÇÈ\¹m·a°
·a°j±/±Ã*±½>¿Æ°`´TÂj²Q¹mÂj²½¸±Ó'Êj¹i½a±Í±ÀÂ'·¸º³T¶5¿Ê`ºv·¸³*ͱÀ½ÆºÀÎ
Ú Êj½}ͳT·¸¹môT·a¹i³*ÂÕ¹»º/·a°`´·Û5Áw±ºa¹»¾g±º·a°j±1ÓQÊ`´TÂ'·a¹m·¸´T·a¹iÃ*±¹iͼj½a³ÃQ±ÀͱÀÂ'·ÆºA·a°p´T·Í³Qº®·}¼w±À³*¼pµm±)±Ög¼`±R¿
·
¶½a³QÍÜÊpºa¹iÂj²ÑÄE³*Áp¹mµi±Å³g¾g±*Û·a°p±À½¸±E¹iº´*µiºa³Õ´ÕÓ'Êp´Tµi¹·Æ´·¸¹mÃQ±1Áw±ÀÂp±Ýj·1È\°j¹i¿Æ°¹»º±ÀÃQ±ÀÂͳ*½¸±¹mͼw³*½a·¸´TÂ'·
ÁjÊg·Âj³T·ÊpÂj¹mÃQ±À½Æºa´*µmµiÇ}½¸±¿À³*²QÂj¹mÞ±¾9Âj³È/ß!ÄE³*Áp¹mµi±Aųg¾g±-´*µmµi³È{º$¿³QÍÍ}ÊjÂj¹»¿À´T·a¹i³*ÂÈ\¹m·a°@àiá
âÆâAãÆäå`æáÀåpçOèäåpâ
·a°p´*Â@ͱº¸ºa´*²*±¼`´*º¸º®¹iÂj²é êÔÛëìbÎ/í$½¸³Ô¿À±º¸º®±Rº\¹iÂQ·¸±À½Æ¿³QÂjÂj±¿·a±R¾EÁÔÇÄ@³*Áj¹iµm±Å³g¾g±º®·a¹iµiµ:°`´Ã*±/·¸³)´T²Q½a±±³*Â
°j¹i²*°Jµi±ÀÃQ±Àµ!±ÀÂ`¿³g¾g¹iÂj²1´*Âp¾JºaÇÔÂp¿Æ°j½¸³*Âj¹iÞ´T·a¹i³*Â@¼p½a¹i͹·¸¹mÃQ±ºAÁjÊg··a°p±ºa±9´*²*½¸±À±ÀͱÂQ·Æº´*½a±9³*ÂpµmÇ@´¶½¸´Q¿
·¸¹m³QÂ
³T¶$È\°p´T·¹»º-Âp±¿±Rºaº¸´T½¸Ç)·a³)¿À³*ÍÍ}ÊpÂj¹i¿´·¸±*ÎÄJ´TÂÔÇE¿³*Â'·¸±ÖÔ·¾g±¼`±Âp¾g±ÀÂ'·/´*ºa¼`±R¿
·Æº¿´TÂ@Áw±±Âp¿À´*¼pºaÊjµi´T·a±R¾
¹mÂ`º®¹»¾g±JÄE³QÁj¹iµm±ÕųԾj±J´TÂp¾¿Æ°`´TÂj²Q±¾È\°j±ÀÂ×·a°j±Ø¿³*Â'·¸±ÖÔ·)¿Æ°p´*Âj²*±RºÀÎïî$Â`¿À´T¼`º®Êjµ»´·¸¹m³Q°p´*º·a°j±Jº¸´Tͱ
Á`±Âj±Ýp·¸º°j±À½¸±´*º}¹mÂÕ³*·a°j±½}º®³*¶·vÈ´*½a±±Âj²*¹iÂj±±À½¸¹mÂj²@¾j³*Í´T¹iÂpºß}¹m·½¸±¾gÊp¿À±º·¸°j±¾g±¼`±Âp¾g±Âp¿ÇÉÁw±·vȱÀ±ÀÂ
¿³QÍ9¼w³*Âp±ÀÂ'·¸ºÛR·a°ÔÊpº½¸±¾jÊp¿¹iÂj²\·¸°j±ÂÔÊjÍÁ`±½2³*¶jÍ9³g¾g¹mÝ`¿´·a¹i³*Â`º·a°`´·.ȱ$ÍÊpºv·:Í´TÌ*±$·a³-ºa³T¶·vÈ>´T½¸±5¹mÂ}³*½Æ¾g±À½
·a³9´*¾j´*¼g·¹m··¸³}Âj±È×½¸±Ó'Êj¹i½a±Í9±Â'·¸ºÎ:ðp³*½$·¸°j¹»º½¸±´Qº®³QÂȱ-·a°j¹iÂjÌ·¸°p´·¹·>¹iº·a°p±Áw±º®·È>´Ç·a³¿À³*¼w±-È\¹m·a°
º®Çgº®·a±Íº.·¸°p´·$´T½¸±/ñè»â
çò
èóÀôgçõá¸ñTÛ*°j±Âp¿±>Âj³*·5Í´*Âp´T²Q±´*Ájµm±ÁÔÇ´Aºa¹iÂj²*µi±¼w±À½Æºa³*Â}³Q½!³*½¸²Q´TÂp¹mÞR´·a¹i³*Â2ö·a°p´T·5´*½a±
ñ÷åYøù9èãÛ!Áw±¿À´*Êpºa±·a°j±¹mÂg¶³Q½aÍ´T·a¹i³*·a°j±ÇØ¿À³*Â'·¸´*¹mÂÉÍ}Ê`ºv·¿Æ°`´TÂj²Q±9È\°p±ÀÂÉ·a°p±È³Q½aµ»¾¹·Æº®±µ¶{¿Æ°p´*Âj²*±RºÀö
´TÂp¾Ù·¸°p´·´*½a±ÑáÀæäTàyæèåÔú@ºa¹mÂ`¿±·a°p±@Êpºa±À½Æº¾g¹iº¸¿³ÃQ±À½Âj±ÈûÈ>´Çgº}·¸³ÕÊpºa±·a°j±Íü´TÂ`¾Ë·¸°j±@¹iÂg¶³*½¸Í´·¸¹m³QÂ
¼j½¸³Ã'¹»¾g±R¾Î
¯>°j±-Áp´Qº®¹»¿\¹»¾g±´¹iº·a³°p³'³QÌ}¶³Q½a±¹m²QÂÄE³*Áj¹iµi±Å³g¾g±\·¸³´/½¸ÊjÂjÂj¹iÂj²}´*¼j¼jµi¹i¿´·¸¹m³QÂÈ\¹·¸°j³*Êg·¹mÂ'·¸±À½a¶±À½¸¹mÂj²
È\¹·¸°É¹·ÆºÁp´*ºa¹i¿¶ÊjÂ`¿
·a¹i³*Â`´Tµi¹·vÇJ´*Âp¾J·a³±Ög±¿ÀÊg·a±9·¸°j±ºa±ÄE³*Áj¹iµi±9±Ã*±ÂQ·/°p´*Âp¾gµi±À½ÆºA·a³¼w±À½a¶³*½¸Í´TÂÔÇ@Âj±È
·¸´Qº®ÌɹiÂÙ¿³QÂjÂj±R¿
·a¹i³*ÂËÈ\¹·¸°Ñ·a°p±1´*¼j¼jµi¹i¿´·a¹i³*Â2ÎØ¯>°j±1¹iÂQ·¸±À½¸±º®·¹»º·a°p´T·9È\¹m·a°Ù³*ÂjµiÇÕ´JºaÍ´*µmµ>ÂÔÊjÍÁ`±½³*¶
´*¾j¾j¹·¸¹m³QÂp´TµY¿³QÂpºv·¸½¸´*¹mÂ'·Æº5¹m·a°j±A³*½¸¹i²*¹iÂp´Tµp¾j±ºa¹m²Q³T¶·¸°j±AºaÇgºv·¸±ÀÍý¹m·Áw±¿À³*ͱº¿³*ͼjµi±·¸±ÀµiÇ´*¾j´*¼g·¸´*Ájµi±\·a³
¶Êg·aÊp½a±/Âj±±¾jº\´*Âp¾´TµiµY·a°j±/¹iÂg¶³Q½aÍ´·¸¹m³QÂ)¹m·{Í´TÂp´*²*±RºÁw±¿À³*ͱº\´Ã´*¹mµ»´TÁjµi±A¶³*½\Âj±Èþ¼jÊp½a¼w³Qºa±ºÎ
ÿ
!
"#$
%
'&)(*
+,.-/0 213-/4562
!-7068
9 &;:, 45:<&)(0 )-73= 9?>@@@
ACBEDGFEHIKJMLD<NPO
Å I LdÆ5ÇÈI!É JZÊiOD<ËÌI ÉÍIKJZÈdLDÏÎCI5ËD
<SbdS]=WqXdfW5oTdSUY]=W0eb+VWb
*T\=Y'W,V\=RaXdfW5oTW0j\=S[bibdW
*Xd\=SR.XdfW5oSUbb\=Y\=]^\^XcSWTdW,VYjcr¾SY\=]^WEÐ!SVW
XdS|W0R'
0`6o'b[]_`gXWa
0SRjWRXd\=SRb#`6R'VC`UV`6oXoTS6XS
*S]_bEXdS|RW0h·RWWVb#\_b#W*jXdTW0epW]^cg`]^[`Y]=W ¼ S|S[T
nS`6]<\_bZXdS[bWp¾~SUY\^]=W{Ð!SjVWXdSep\^R\^ep\=Ã0WrXdfWaRj[eYW0T#S6l
0SRjWRXd\=SRbXdf`6XMhqS[]_V~TW¶[\=TdWre[
f
`6RXd\_
*\=o`6Xd\=SRSUTe['
f
*SU]^]_`6YST`gX\^SUR.f\_bpbSU]^[Xd\=SR\_bRS6XpTdW]=`6XdWVXdSC`o`6TdXd\_
*[]=`TXdW,
fRSU]^SUnc
Âx¾~W,bdbdW0RnW0Tb¾~SY\^]=W ® YW
*XbU¾~SUY\=]^W À nW0RXb0bXTdSURn#ST+hqW`6keaSUY\=]^\^XcW*X
6
ÄY[X
XdSXfW5nWRW0T`6]
Ñ~ÒÓÔ^Õ=Öp×!ÒØÖÙ'Ú6ÛÚØÔ=ÜÝ|ÞßÒgàqÖ0áUÖ0Û,âÔ^ãZÔ_äEåÒ6ãZåÖæ*Ö,ädäÚ6ÛÔ=Õ^çäãÛÚÔ^ÜUèUãdémÒÛàqÚÛØãdÒÔ^ÝpÙÕ=Ö0ÝpÖ0åã#à5ÔãèÚ6Õ=Õ
æ*êÛÛÖ0åãÑ~ÒÓÔ=Õ=Ö×!ÒØÖ#ÖåájÔ=ÛdÒUåÝpÖ0åãäÞ
ë2åaÝÚåçaæ0ÚUäÖ,ä;àqÖãdèÔ^åìãdèÚ6ã
Ô^ãKÔ=ä+ÙÒUäädÔ^ÓÕ=ÖqãdÒØÖ,äÔ=ÜåaÔ=åémÒÛÝÚgãdÔ=ÒåpädçjäãdÖÝä+à5ÔãèÒêãKÜÔ=áÔ=åÜMãdÒjÒ
ÝêæèpÚgãdãdÖåUãÔ^ÒUåaãdÒæ*ÒUÝpÝêåÔ_æ0Ú6ãdÔ=ÒåaÔ=äädêÖäiÔ=åÚMíÛäã+ÙèÚUäÖ5Óêã+ãdÒèÚáUÖqädÒÝpÖ5ìjÔ^å'ØrÒéÑ~ÒUÓÔ=Õ^ÖZ×!ÒØÖ
Ö*îÖæ0êãdÔ=ÒåÖåjáÔ=ÛÒåÝpÖ0åã<Ô=åãdÖÜÛÚgãdÖ,Ø#à5ÔãèÔ=åãdèÖqäçäãdÖݵÔ^ãädÖ0Õ^éÞ;ïèÖ
ÓÚUäÔ_æ+àÚçEãÒEæ*ÒUÝaÝrêåÔ_æ0Ú6ãdÖKà5Ô^ãdè
äê'æèädçäãÖ0ÝäÔ=ä5ãdÒäÖåØ|Ñ~ÒÓÔ^Õ=Ö×!ÒjØÖ#émÒÛ5Õ=ÒjæÚ6Õ7Ô=åãdÖ0ÛÚæ*ãdÔ=ÒåäÞ
ïèÖädÖÔ=åUãÖ0ÛÚæ*ãdÔ=ÒåäæÚ6åðÒåÕ=çãÚ6ìUÖ~ÙÕ=ÚUæ*Ö~ÓÖ*ãàqÖ0ÖåðãdèÛÖÚUØäpãdÛÔ=ÜÜÖÛdÖ,ØÓjçÑ~ÒÓÔ=Õ=Ö}×!ÒØÖÚ6åØ
ájÔ=ädÔ^ÓÕ^ÖÙÚÛãä5Ò6éiãèÖädÖ0ÛáÔ_æ*ÖñxÔãäÔ=åUãÖ0ÛdéxÚæ0Ö,òÞïèÖÔ=åãdÖÛéxÚUæ*Ö#ãçjÙÔ_æ0Ú6Õ=Õ=çà5Ô=Õ^Õ<ÚÕ^Õ=ÒgàµÖ*îjãdÖÛdåÚÕ<ädÒ6éãàÚ6ÛÖ
Ö0åãdÔ^ãdÔ=ÖäZãÒÛÖ*ãÛdÔ=Ö0áUÖrÚ6å'ØêÙ/ØÚ6ãdÖaÔ^åémÒUÛdÝÚ6ãdÔ=ÒåÒUÛEãÒ|àqÚ6ãæèÖáÖ0åãäZÒææ*êÛÔ^åÜÔ=åãèÖaädçäãÖ0Ý|ÞïèÔ_ä
Ñ~ÒÓÔ^Õ=ÖZ×!ÒØÖæ0ÚåaÓÖ5à5ÛÔãdãdÖ0åÖÔãèÖ0Û
ÓçãdèÖädÖ0ÛájÔ=æ0ÖØÖädÔ=ÜåÖÛ+ÒÛ+Ójçræ0ÒåädêÝpÖ0ÛäiÔé/ãèÖ0çrèÚáÖ5ädÙ'Ö,æ*Ô_Ú6Õ
åÖ0Ö,Øä5Ú6å'ØæÚ6ååÒãæ*ÒÕ=Õ_Ú6ÓÒÛÚgãdÖZà5ÔãèãdèÖädÖ0ÛájÔ=æ0ÖMØÖ,äÔ=ÜåÖ0ÛÓêãèÚáUÖMÚaÜUÒÒØêåØÖÛäãÚåØÔ=åÜaÒ6é)ãdèÖ
Ô^åãÖ0ÛdéxÚæ*ÖUÞ)ó
åæ0ÚÙädêÕ=Ú6ãdÔ=åÜÕ=Ògà»Õ=Ö0áÖÕæ0ÒÝpÝêåÔ=æÚgãÔ^ÒUå{Ô^åÑ~ÒÓÔ^Õ=Ö×!ÒØÖZÜêÚÛÚåãdÖ0Ö,ä+ãèÚgãqãdèÖ#ädçjäãdÖÝ
æ0ÚåÛÖ0ÝÚ6Ô=åãdèÖäÚ6ÝpÖ#Ö0áUÖ0åÔé)ãdèÖêåØÖ0ÛÕ=çÔ=åÜpåÖ0ãà!ÒUÛdìÖáÒÕ=áÖ,äqÔ^å|êåÙÛdÖ,ØÔ=æ*ãÚÓÕ^ÖàÚçä0Þ
ô êÛÚ6ããdÖÝpÙããÒØÖ,äÔ=ÜåÔ=åãdÖÛéxÚUæ*ÖäémÒÛ|ØÔ=äãdÛÔ=ÓêãdÖ,ØädÖ0ÛáÔ_æ*Ö,ä{Ú6å'ØðãdÒØÖäæ*ÛÔ^ÓÖãèÖ0Ýõà5Ô^ãdè´Ú
æ*ÒUÝaÙÕ^Ö0îCÔ=åUãÖ0ÛdéxÚæ0Ö{ØÖ*íåÔãÔ^ÒUåÕ=ÚåÜêÚÜÖ~ö ÷,ø!èÚUäÛÖ0áÖÕ^Ö,ÚØãdèÚ6ãÔ^ãÔ=äÚ|Ùêù0ùÕ^Ô=åÜÚ娨ֿ0ÒêÛÚ6ÜUÔ^åÜ
ãÚUäì/ú7ÝÚ6Ô=åÕ=ç~Ó'Ö,æ0Ú6ê'äÖaà!ÖaèÚáUÖãdÒÜêÖääEà5èÔ_æèÖáÖåUãäMà5Ô^Õ=ÕiÓ'ÖpÔ=åUãÖ0ÛÖäãdÔ=åÜ{émÒUÛäÖÛdájÔ_æ*Öê'äÖÛäMÚ6åØ
à5èÚgãà5Ô=Õ^Õ
Ó'ÖpãèÖÝpÒUäãæ0ÒåjáÖåÔ=Ö0åãàqÚç|ãÒ|ÚUæ0æ0Öää#Ô^åémÒUÛdÝÚ6ãdÔ=Òå.ÞûÒUÛ#ãdèÔ_äÛÖÚUäÒUåà!ÖpãèÔ=åìãèÚgã
Ô^å'äãÖÚØÒéMÓÖ0Ô=åÜèÔ_ØØÖå»Ó'ÖèÔ^å'ØðÔ^åãdÖÛéxÚUæ*Ö,ä0âäçäãdÖÝpääèÒUêÕ_ØÛÖ0ÝÚÔ^åðÒÙÖ0åémÒUÛ{Ô^å'äÙÖæ*ãdÔ=Òå»Ú6åØ
Ú6Õ=Õ^Ògà²ÚgããÚæèÝpÖåUã5ÒéiÑ~ÒUÓÔ=Õ^Ö×!ÒØÖÞ+ë8éiàqÖMÛÖ0ÝpÒgáUÖEãèÖ#ÒêãÖ0ÛädèÖ0Õ=Õ.ÓÖ*ãàqÖ0Ö0å|ÚpäçäãdÖÝüÚ6å'Ø{émÒUÛdÖÔ^ÜUå
ãdèÛÖÚUØäâãèÖ0çà5Ô=Õ^Õ/ÓÖMÚÓÕ=ÖEãÒrÚææ*Ö,ädä!Ô^åémÒÛÝpÚ6ãdÔ=Òå{ÝpÒUÛdÖMØÔ^ÛÖæ*ãdÕ=çÞië2åémÒUÛdÝÚgãÔ^ÒUå{Ô^ãädÖ0Õ^é;äãÔ^Õ=Õ/åÖ0Ö,Øä!ãdÒ
Ó'ÖÖåæ0ÚÙädêÕ=Ú6ãdÖ,ØÚ6ã5ãdèÖÒUÓýÖæ*ãÕ^ÖáÖ0Õ7ÓêããdèÖÜÛÚ6åjêÕ_Ú6ÛÔãçpÔ_ääÝÚÕ^Õ=Ö0Û,ÞKïèÖæ*ÒUåädÖþêÖ0å'æ*Ö#Ô=äqãèÚgãÔ^ã
Ó'Ö,æ*ÒUÝaÖ,äÙ'ÒädädÔ=ÓÕ^ÖMãÒà!ÒUÛdìà5Ô^ãdè~ÚaÝêæè|Õ_Ú6ÛÜÖÛqädÖ*ãÒéiÚUæãdÔ=Òå'äqÚåØÖ0áUÖ0åãäÞ
Ñ~ÒÓÔ=Õ=ÖC×!ÒjØÖÚgããÚæèÖ,ØãÒãdèÔ_äìjÔ=åØÒ6éäçäãdÖ0ÝÿäèÒUêÕ_ØåÒ6ã{ØÔ_äãêÛdÓðÔ^ãäpémêåæãÔ^ÒUåÚ6Õ=ÔãçUâqãdèjêä
ÛdÖ,äãÛdÔ_æãÔ^ÒUåäiÚ6ÛÖåÖæ0ÖäädÚÛdçUÞ ô åÖqémÖÚUäÔ=ÓÕ=ÖqÙÒÕ=Ô_æ*çÔ_ä)ãdÒÕ=Ö*ãiémÒUÛdÖÔ^ÜUårèÚåØÕ=Ö0ÛäiÔ^å'äÙÖæ*ãKÒÓýÖ,æãä)ãèÛÒêÜUè
ãdèÖÔ^ÛÔ=åãdÖ0ÛdéxÚæ0ÖâjÚ6åØÔ^å'äãÚ6Õ=Õ dèÒjÒìä ãdèÚ6ãqà5Ô=Õ^Õ/ÓÖEãÛdÔ=ÜÜUÖ0ÛÖØpà5èÖåÚrÜÔ=áÖå{ÒÓýÖ,æãqÛdÖ,æ*Ö0Ô=áÖ,ä
ÚrÜÔ=áÖå
ÝpÖäädÚÜÖZñxÒåÖqÒ6é'ÔãäiÝaÖ0ãdèÒØä)Ô_ä+æ0ÚÕ^Õ=ÖØò*Þ ô ãèÖ0ÛiÛÖädÖÚ6ÛæèÖÛäKö 6øèÚáUÖ!ÛÖÚUæèÖØãdèÖädÚÝpÖqæ0Òåæ0Õ^êädÔ=Òåä
Ú6åØ|Ô_ØÖåUãÔí'ÖØãdèÖåÖ0Ö,ØãdÒ{àqÒÛìÚ6ããdèÖÒÓýÖ,æãEÜUÛÚåêÕ=ÚÛdÔ^ãçÚ6å'ØãÒãdÛÔ=ÜÜÖÛ5Ö0áUÖ0åãEèÚåØÕ=Ö0Ûä5à5èÖ0å
ÒÓýÖ,æãä5Ú6ÛÖMÛÖæ0Ö0Ô=ájÔ^åÜaÝpÖäädÚÜÖ,ä0Þ
!
ô åÖáUÖ0ÛçãçÙÔ=æÚ6Õ)Ö*îÚ6ÝpÙÕ=ÖrÒé
Õ_Úæì|Ò6éKÔ=åémÒÛÝÚgãÔ^ÒUåÝÚ6åÚÜÖÝaÖåãZÚ6åØÓÚØÖ0áUÖ0åãZèÚåØÕ=Ô^åÜÔ_äZãdèÖ
#" $" #"
ÙÛÒÓÕ=Ö0ÝÒéEÓÛÒìÖåÕ=Ô^åìjäaÔ=åãèÖ CÒUÛdÕ_Ø »Ô_ØÖ }Ö0Ó.ÞðïèÔ_ärÙèÖ0åÒUÝpÖ0åÒUåèÚÙÙÖ0åäpÚ6Õ=ÕqãdèÖãÔ^ÝpÖ
Ó'Ö,æ0ÚêäÖZÙ'ÖÒÙÕ=Ö#Ú6ÛÖÛdÖ0émÖ0ÛÖ0åæ0Ô^åÜÒÛqÓÒÒUìjÝpÚÛdìjÔ=åÜÔ=åãdÖ0ÛÖäãdÔ=åÜrÙÚ6ÜUÖä+ãèÚgã5ØÒråÒ6ãèÚáÖMÚØÖ0íåÔ^ãdÔ=áÖ
Õ^ÒæÚgãdÔ=ÒårÓêãKæ0ÚårÝpÒgáUÖ
ÒÛiÓÖ5ØÖäãdÛÒgçÖ,Øà5èÖårädÔãÖqÝÚåÚ6ÜUÖ0Ûä<ÛÖ0ÒUÛdÜÚ6åÔ=ù0Ö+ãèÖ0Ô=ÛKØÒæ*êÝaÖåãäÞ)Ñ~ÒUÓÔ=Õ^Ö
&% #'
×!ÒØÖàqÒêÕ_Ø~ÓÖaÚåÖ0Õ=Ö0ÜÚ6åãEàÚçãdÒädÒÕ=áÖãdèÔ_ä#ØÔ {æ0êÕã#ÙÛÒÓÕ=Ö0Ý 5à5èÖåCÚêäÖÛEÔ_äMÔ^åãdÖÛdÖ,äãÖØ~Ô=åÚ
("
ÙÚ6ÜUÖâèÖ#à5ÛÔãÖäÚåÚÜÖåUãÚåØädÖ0å'Øä5Ô^ã5ãdÒaãdèÖädÖ0ÛáÖÛÞ »èÖå|ÙÛdÒUÙ'ÖÛdÕ=çèÒjÒìUÖØãdÒpãèÖäÖÛdáUÖ0Û,âãdèÖ
Ú6ÜUÖ0åã5Ô=ä5ÛÖÚUØçãÒÓ'ÖÖ0îjÖ,æ*êãÖØà5èÖåãèÖÙÚÜÖ#Ô_ä5ÝpÒgáÖØÒÛØÖ0Õ=Ö*ãdÖ,Ø|Ú6åØ|æ0Úå~ØÒà5èÚgãÖ0áUÖ0Û5äÖÖ0Ýä
*)
Ú6ÙÙÛdÒUÙÛdÔ_ÚgãÖEãÒaãdèÖêädÖ0Û,âjémÒÛ5Ô=åäãÚåæ*ÖädÖ0åØÚ6åÖ 8ÝÚ6Ô=Õ.ÒÛqíîèjçÙÖ0ÛÕ=Ô^åìäÒUåãèÖæ*Õ=Ô^ÖåãEäÔ_ØÖÞ
ïèÖ}ädçäãÖ0ÝäÙ'ÖÛémÒUÛdÝpÔ=åÜØÔ=äãdÛÔ^ÓêãdÖ,Ø´äæèÖØêÕ^Ô=åÜðÚ6娲ØÔ=äãdÛÔ=ÓêãdÖ,ØÛÖädÒêÛæ*ÖCÚ6Õ=Õ^Òæ0Ú6ãdÔ=Òå´ÚÛdÖ
Ú6Õ_äÒÔ^åãdÖÛdÖ,äãÔ^åÜæ0ÚåØÔ_ØÚgãÖäÓ'Ö,æ0Ú6ê'äÖ~ãèÖ0ÛÖCÚÛdÖCÒ6éãÖ0åÝÚ6åjçðØÖ0ÙÖ0å'ØÖ0åæ0Ô^Ö,äÓ'Ö0ãà!ÖÖ0åÛÖädÒêÛæ*Ö,ä0Þ
ïèÖädÖpØÖ0ÙÖ0åØÖ0åæ0Ô^Ö,ä#Ô^ÝpÙÕ=ç~émÛÖþêÖ0åãæ*ÒUåäãdÛÚ6Ô=åUã#æèÖæìjÔ=åÜ|Ú6åØCæ*ÒÝpÙÕ=Ö*îÖáÖåUã#èÚåØÕ=Ô^åÜãÒìUÖ0Ö0Ù
+%
Ô^åémÒÛÝpÚ6ãdÔ=Òå»êÙãdÒØÚgãdÖUÞ Ñ~ÒUÛdÖÒgáÖÛÔã|Ô=äáÖÛdçØÔ æ0êÕ^ããÒémÒÛÖädÖ0Öà5èÔ=æè²æ*Òå'äãÛÚÔ^åãä{à5Ô^Õ=Õ#Ó'Ö
-,
Ô^ÝpÙÒUädÖØ~Ójç|êädÖ0ÛäEÚåØÓê'äÔ=åÖääZÙÛdÒæ0ÖääÖ,ä5ÒåÖ,ÚæèÛÖädÒêÛæ0ÖÞ qêãMÔã#Ô=äMæ*ÖÛãÚ6Ô=å~ãdè'ÚgãMæ0ÒåäãdÛÚ6Ô=åãä
."
Ú6åØ}ØÖÙ'ÖåØÖ0å'æ*Ô=ÖäØÒ|Ö0áUÒÕ=áÖrà5èÖ0å}Ù'ÖÒÙÕ=ÖÚ6åØãdèÔ^åÜä#ÝpÒgáÖpÚ6åØ}æèÚ6åÜÖÞ »ÔãèÙ'ÖÒÙÕ=ÖpèÚájÔ^åÜ
Ù'ÖÛädÒå'Ú6ÕjÖ0Õ=Öæ*ãdÛÒåÔ_æ
ÒUÛdÜÚ6åÔ=ù0ÖÛä)Ú6å'ØÛÖädÒêÛæ*Ö,ä;ädêæèpÚäiÙÕ_Úæ0Öä)ÒÛ+áUÖ0èÔ_æ*Õ=Öä)èÚájÔ=åÜZãdèÖÔ^ÛKÒgà5åaÚ6ÜUÖ0åØÚ
Ôã#Ô_äZÖ,ÚädçãdÒÔ^ÝÚ6ÜUÔ^åÖèÒgà æ0ÒÝpÙÕ=Ö*î~ãdèÖrÔ=åãdÖ0ÛÛÖ0Õ_ÚgãdÔ=Òå'äZæÚ6åÓÖaÚåØèÒgà Ô^åãdÖÛdÖ,äãÔ^åÜÔ^ãMàqÒêÕ=ØÓ'Ö
ãdÒaÙÛÒÜÛÚ6ÝPÚ6ÜUÖ0åãä
ãdÒpæèÖ,æì{æ*Òå'äãÛÚÔ^åãäqÚ6å'ØØÖ0ãdÖæ*ã5Ô^åæ0ÒåädÔ_äãÖ0åæ0Ô^Ö,ä0ÞiûÒUÛqÔ=åäãÚåæ*Ö Ýrçaà5Ô^émÖÚ6åØ
/ 0
ëqæÚ6ååÒ6ãEÚææ*ÖÙã5ãà!ÒÔ=åjájÔãÚgãdÔ=Òå'äémÒÛ5ãèÖäÚ6ÝpÖØÚç aÒÛ ãdèÖÛdÖÝrêäãEÚÕ^àÚçäÓ'ÖÒåÖ#émÛÖ0ÖädÖ0ÝpÔ=åÚ6Û
1232546287#9:287<;=?>/@ACB
DFEHG =?I E0JKELE 7$I E 1>M@NC1O1QPR@ E ;MS2T@ ELE0G 2VU E =8@P+WX>Y=Z73>8257 E U G 2 G =5@[U\281Q] E ;TU^P+S G`_ 254aOCN/S E 1Q@
J N/S G =8@72.72ZSQP+25702Zbc4d2 J P+WXP&S>dU^PXW+WKeC7<;01 E =ZWXPR@SQP _^ELf =Z4dOW E @2ZbgS G PX@\]3P+7<;gh3P+7@N _iG ;P+I E 1i@ E ;/284j=ZPX7C@
=8@ 4.NW&SQP+4 E ;/PX=j;PX@S1QP J N/SPX287chK@>/@S E 4k=8;/4dPX7PR@SQ1Q=ZSPX287chC@28NC1 _LEl_ 23; E 4d=87C=Zm E 4 E 7nSoh E W Ep_ SQ1257P _q_ 284ar
4 E 1 _*E h(@ _ P E 7nSP+e _0_ 28WXWX= J 251Q=ZSPX287ch E S _ Bs tVuvB:w281[S G PR@x1 E =5@257YU E =81 E0y NP+S E_*E 1SQ=8P+7MS G =VSxS GE 1 E PR@[=
WX=81m El_ WX=5@@ 28b@N _iG P+4dOK281SQ=Z7nSzO1Q2 J W E 4d@^=87C;H72ZS{NC@S-=.b E U|PX@28WR=VS E ; _ =5@ E @LB
} ~C-a
3
3z~
a
DFE @ G 28NCWX; J<E = J W E SQ2He<7C;Y@=ZSPR@b= _ S251>:@28WXN/SPX287<@lb281lS GE @ E OC12 J W E 4j=VSP _ =ZOOWXP _ =VSQP+257C@lU^P&S G 28N1
=ZOOC12n= _iG 2Zbc9:2 J P+W E 2/; E =8@b251 E P+m57 E I E 7nS G =87C;/W E 1i@LB( G PR@!7 E U=ZOOC12n= _iG PX@ _*E 1Si=ZPX7W+>a728S!b1 ELE 28b
O1i= _ SQP _ =ZW/OP+Sb=8W+WR@ J NS!1 Eo_*E 75S1 E @ E =81 _iG 287j9:2 J P+W E 2/; E^G =5@=ZWX1 E =8;/>qOC125O<2n@ E ;xb=8P+1QW+>.m8232/;d=Z7C@U E 1Q@
b281^4d25@S^2ZbS GE 4#
o 9 E 4d281Q>N<@=8m E \2jWXPX4aP+S-S GE[_ 287C@N4dO/SPX287:28b(@ E 1QI E 1z4 E 4d281Q> J > _ NC@S254 E 1Q@p E I E 7nS G =87/r
;/W 1i@xU E_ =87$=ZOOWX>YO1QP+7 _ P+OCW E @x2Zb-= _L_ 28N7nSPX7m<h7C=84 E WX>M@ E WXW\@ E 1QI E 1x4 E 4d281Q>FS2:S GEH_ NC@SQ284 E 1[S2
E
P+7 _ P+S E @OC=Z1QP+7Cm.P+SpB
8d E 1b2514j=87 _*E 2Y] ELE OS GE 4j=8P+7@>/@S E 41NC77PX7mChP&Sj4[N<@S0728S J<E 2VI E 1WX25=5; E ; J >$S GE
E IV=ZWXNC=ZSPX287$28b E I E 7nS G =87C;/W E 1i@LB DME:_ =Z7;/2FP+SdU^P&S G O1QPX281QP&S>M4 Ep_iG =87PX@4j@Lh!U^P&S G ;/PR@SQ1P J N/SQP+25728b
S GE WX25=5;:S24d281 E S G =Z7M287 E @ E 1QI E 1l=87C; J >:] EpE OPX7mHS GEj_ 287C;/P+SPX287<@l@PX4aOCW E E IV=ZWXNC=VSQP+7m _ 254dOW ELf
_ 257C;/P+SPX287C@\b251z=.WX2ZSz28b E I E 75Sr G =Z7C;/W E 1i@!S20; Eo_ PR; E P&bS GCE > G =?I E S2 JKE @Si=Z1S E ; _ =87 y NP _ ]3W+> J<Eo_ 284 E
E*f S1 E 4 E W+> GCE =?I3> B
t Ep_ N1QP&S> 254 E!E 73I3P+1Q2874 E 75Si@gWXP+] E! =?IV= O1Q2VI3PX; E =ZN/S GE 7nSP _ =ZSPX287x=87C;I E 1P+e _ =ZSPX2872Zb3b251 E P+m57
_ 2/; E B-zN/S GE 7nSQP _ =VSPX287FPX@-NC@NC=ZWXW+> J =5@ E ;#287 E 7 _ 1Q>3O/SPX287=87C;; E S E 14dPX7 E @U GE S GE 1-S GEd_ 2/; E 281QP+m5P&r
7C=VS E @b1Q2846=[S1QNC@S E ;@25N1 _*E =87C;0I E 1QP&e _ =VSQP+2570PR@^=[1QN7nSPX4 E 4 Ep_iG =Z7PR@4SQ2 E 7C@N1 E S G =VS^N7nS1QNC@S E ;
_ 2/; E ;/2 E @z72ZS^O E 1b281Q46P+WXW E m5=8Wg28O E 1i=VSQP+257C@LB
GE 1 E =81 E =ZWR@2`@254 E O1Q2 J W E 4j@HS G =ZS#@ ELE 44a251 E bN7C;=84 E 7nSQ=8W=87C; _iG =ZWXW E 7m8PX7m$U^P+S G S G PR@
=ZOOC12n= _iG
nj¡ 7C@O Ep_ SPX287=87C;`P+7C@SQ=8W+WR=VSQP+257¢2Zb E I E 7nSr G =Z7<;/W E 1Q@j@284 E U G =VS _ 287nS1i=8;/P _ SjS GE O1QPX7 _ PXOW E @j28b
E 7 _ =ZOC@NWR=VSQP+257TS G =VSxU E 7 ELE ;M@2#4[N _iG PX7YWX=81m E @>/@S E 4j@LhS GE > _ 25NWR;FPX7 _ 1 E =8@ E S GE ; E O E 7C; E 7 _ P E @
J<E SU EpE 7#@N J rv@>/@S E 4j@^=Z7<;H4j=8] E S GE 4£4d281 E ;/P&¤ _ NW&S-S2d4j=Z7C=8m E B
¥8 DME 7 EpE ;1 Eo_ PXO1Q2 _ =ZW4 Ep_iG =87PR@4j@S2 E 7C@NC1 E S G =VS E I E 7nS G =Z7<;/W E 1Q@^;2a7C2ZS J<Eo_ 254 E 2 J @28W E S E
J >jS GE = _ SQP+257C@ 2Zb(NC@ E 1i@PX7S GE P+1-2VU^7 E 7nI3PX12574 E 7nSQ@pB
¦5q¡ 7Y= _ 284dOW E*f @>/@S E 4§U^P&S G 4d=873>P+7nS E 1Q1 E WX=ZS E ;MPX7/b281Q4j=VSQP+257C@q=Z7C;MWX2ZSi@q2Zb E I E 7nSr G =Z7<;/W E 1Q@
GS E 1 E\_ 25NWX; J<E _ PX1 _ NWR=Z1; E O E 7C; E 7 _ P E @W E =5;/P+7CmzS2l=z7 E UYS>3O E 2ZbPX7/eC7P+S E WX2n25OC@pB(¨7 E 2ZbS GE_ WX=5@@P _ =ZW
@25W+NSPX287C@ PR@\S2jPX4dO<2n@ E =Z7281i; E 1^281 G P E 1i=Z1 _iG >j257 E W E 4 E 7nSQ@ SQ2j=?I828PR;@N _iG WX2n25OC@pB
ª©Z -7H25O E 7@>/@S E 46U^P+S G PX7C@O Eo_ SPX287Hb= _ P+WXP+SP E @ U^PXW+WcOC12 J = J WX>j1 Epy NPX1 E W+28SQ@ 28b E*« 281SQ@\P+b(@ Ep_ 1 E SQ@
G =?I E S2 JKEG PR;; E 7h J N/S-U Eq_ =87HPX4j=Zm8PX7 E S G =VS S GE @>/@S E 4¬; E @P+m57 E 1 G PR; E @z@254 El_ WX=5@@ E @ph E 7 _ =ZOC@N/r
WX=ZS E @ O1 Eo_ PX28NC@ PX7/b2514j=VSQP+257HPX72 J { Eo_ SQ@ 251^NC@ E @ _ 1Q>3O/S25m81i=ZO G P _ S Eo_iG 7P y N E @\S2 G PX; E @ E 7<@P+SPXI E ;=ZSQ=B
5 9:2n@S E*f PX@SPX7m[@>/@S E 4j@ E*f O<2n@ E I E 1>aW+P+SSQW E 2ZbgS GE PX1\P+7nS E 17<=ZWCPX7/b2514j=VSQP+257=Z7<; E I E 7nSQ@S2.S GE
28N/Si@PR; E =Z7<;=81 E ;/P+¤ _ NW+SzS2dPX7nS E m51Q=ZS E U^P+S G S GE 7 E U®=8OO1Q25= _iG B
¯ ~°/~±£²M³!´µ
¡ 7#28N1z1 Ep_LE 7nS E*« 281SQ@ SQ2 J NPXWX;:;PX@S1QP J N/S E ; E I825W+IV= J W E ;/>37C=84dP _ PX7/b281Q4j=VSQP+257#@>/@S E 4j@ U EqG =?I E b28W+r
W+2VU E ;[SU\2x;/P+1 Ep_ SPX287C@ ?(¶ @P+7CmqS GE^·C¸ O125m81i=Z4d4dP+7CmWR=Z7m5NC=Zm E =87C;j9:2 J P+W E 2/; E^E 73I3PX12574 E 7nSph
U EdG =?I EdJ NPXW&S[=#@>3@S E 4¹SQ24j=87C=Zm E =WXP J 1Q=81>:28b ·C¸ @28NC1 _LEd_ 2/; E S G =ZS[=ZWXW+2VUz@lNC@SQ2 E ;/P+Sph(@SQ281 E h
;/PR@@ E 4dPX7C=VS E =Z7C;j= _ SQP+IV=VS E eCI E ;/P «E 1 E 7nS!]3PX7C;@!2Zbc@25N1 _*Ez_ 2/; E eCW E @LB 1 E InPX28N<@WX>qS GCE >aU E 1 E ;/P+¤ _ NW+S
S2d4j=Z7C=8m EJKEp_ =8NC@ E S GE >HU E 1 E =ZWXWc@S281 E ;HPX7PX7C;/PR@SPX7 _ S^S E*f S^eCW E @ S G =VS-;/PR;72ZSz=8W+WX2VUSQ2a1 E OC1 E @ E 75S
S GE P+1OC=Z1SP _ NCWX=81P+SP E @=Z7C;#PX7nS E 1i; E O E 7C; E 7 _ P E @pB 8 9=ZPX7nSQ=8P+7PX7mjS GE[_ 287C@PX@S E 7 _ >2Zb!;2 _ N4 E 7nSQ@=VS
º8»¼½\¾L¿<ÀÁ+¾zÃ8ÄCÅxÂQ¼Æ3ÁXÄÇlºqÈjÃZÉ5¾ Á&ÂÃ5ÊLÊL¾pÀQÀÁX¿ËX¾!ÂQºÌº8¼Q¾LÁXÇ8Äa¾LÍ8¾pÄnÂ(Î<ÃZÄCÅ/ËX¾L¼iÀpÏÐ ÎÁRÀ½\º8¼QÉqÁXÀ!ÃVÂÃZÄd¾pÃ8¼ËXÆ
ÀÂiÃZÇ5¾xÃZÄCÅ#ÎCÃ5À^¿K¾L¾LÄFÀËXºV½¾oÅ#Å/ºV½^Ä#¿nÆHÂÎC¾[Å/Á+ÑjÊL»Ë+ÂÆHÂQº0ÁXÄ5ÂQ¾LÇ5¼QÃZ¾lÂξ.¾*Ò/ÁRÀÂQÁ+ÄÇHÀ¾p¼Í5¾L¼zÃZÄ<Å:Ó-Ð^ÔÕ
¾pÅ/Á+º5¼QÀ »<À¾oÅHÃZÂ^ÂξqÁXÄCÀÂÁ+»/ÂQ¾8Ï
РξL¼Q¾jÃZ¼Q¾aÀ¾LÍ5¾L¼iÃZ˺ZÂÎC¾L¼qÇ8¼Qº8»CÖCÀl½º5¼É3ÁXÄǺ5ÄTÂQ¾pÊiÎÄÁR×n»¾pÀl̺5¼qËXÃ8¼Ç5¾.ÀQÊLÃ8Ë+¾d¾LÍ5¾LÄnÂÎCÃZÄCÅË+ÁXÄÇ:ÃZÄCÅ
ÈjÃZÁXÄ5ÂiÃZÁXÄÁXÄÇTÁXÄ/̺8¼QÈjÃVÂQÁ+º5ÄÊ*º5ξL¼Q¾LÄ<Ê*¾TØ ÙZÚ^¿»/ÂdÂQξL¼Q¾HÁRÀ.º8ÄËXƺ8ľ#ÀÆ3À¾pÈÛºZÌ-½^ÎÁRÊiν\¾#ÃZ¼Q¾HÃ?½ ÃZ¼Q¾
ÂÎCÃZÂ.Ê*ËXº5À¾LËXÆFÃ8ÖÖ¼Qº5Ã5ÊiξpÀlº8»C¼xÇ8ºnÃZËRÀqºZÌ »CÀÁ+ÄÇFÔ:º8¿ÁXËX¾Hܺ3ž0Á+Ä$ÅÁXÀ¼QÁ+¿C»/¾oÅYÁ+Ä/̺5¼ÈjÃZÂÁXº8ÄÀÆ/À¾pÈdÀpÝ
ÂξxÞnÂQº8¼QÈjÊLÃ8À ½¾oÃVÂÎC¾L¼ Á+Ä̺8¼QÈdÃZÂÁXº8ÄÃZÄCÅ̺8¼Q¾pÊpÃ8À ÀÆ/ÀÂQ¾LȹØ+ß*ÚvÏРξqÅ/¾pÀÁ+Ç5ľL¼iÀºZÌÂQξqÀ¾p¼Í3ÁRÊ*¾lÎCÃ?Í8¾
Ö¼Qº8Ç8¼iÃZÈdÈd¾pÅqÃlÀ¾*Â(ºZÌ<Ã8Ç8¾LÄnÂiÀc̺5¼ÂQξLÁX¼Ê*»CÀº5Èa¾p¼QÀ½^κÊLÃ8Ä[Êiκ3º5À¾!ÖCÃ8¼QÃ8Èd¾*¾p¼QÀÃZÄCÅ.Ã8Ê*ÂÁXÍ?ÃZ¾ ÃZÇ5¾LÄnÂQÀ
ºaÈdº8ÄÁ+º5¼ÂQξqÊ*»¼Q¼Q¾LÄnÂ\½\¾pÃZÂξp¼\ÀÁ+»CÃZÂÁXº8Ä#ÃZÄCÅHÀ¾pÄCÅÈd¾oÀÀQÃZÇ5¾pÀ\Ã8ÊLÊLº8¼iÅ/ÁXÄÇqºaÂQξLÁX¼^ÀÖK¾pÊLÁ&à<Êlľp¾pÅÀpÏ
Ð ÎÁRÀ.ÀÆ/ÀÂQ¾LÈÛÁXÀ.ÁXÄ5ÂQ¾L¼Q¾pÀÂÁXÄÇT¿K¾pÊpÃZ»CÀ¾Á+ÂaÀκV½zÀ[Âξ̾pÃ5ÀÁX¿ÁXË+Á+ÂÆYºZÌzÎCÃ?Í3ÁXÄÇTËXºZÂiÀ[º8Ìz»CÀ¾p¼QÀ[¾*Ò/¾pÊL»/ÂÁXÄÇ
ÂξpÁ+¼zÃ8Ç8¾pÄ5ÂiÀ º8ÄHÂξxÀ¾L¼QÍ8¾p¼pÏ
áFâ!ãägåæ-ç3èâ!ã
é a ¾ κ5Ö<¾[ÂÎCÃZÂÂQÎÁXÀlÖCÃ8Ö<¾p¼Î<Ã8ÀlÊ*º8Ä3Í3ÁXÄCÊ*¾oÅ#Âξa¼Q¾pÃ8žL¼zÂQÎCÃVÂjêß?ë-Ôº8¿ÁXË+¾jܺ/Å/¾[¿¼QÁXÄÇ5À-ìC¾*Ò/ÁX¿ÁXË+Á+ÂÆ:Á+Ä
Å/ÁRÀÂQ¼ÁX¿»/ÂQ¾pÅÀÆ3À¾pÈjÀq¿<¾oÊLÃ8»CÀ¾Á&Â[Î<Ã8ÀÂQξÃZ¿CÁ+ËXÁ&ÂÆFºT¾LÄCÊpÃZÖCÀ»ËRÃV¾0ÊLº8Ä3Í8¾pÄnÂÁXº8ÄCÀqÃ8ÄCÅF̼¾p¾pÀx»<À̼º5È
Âξ:ÄC¾L¾pÅÂQºÖ¼¾LíªÁXÄCÀÂQÃ8Ë+Ë ÂQξTÀºZÌî½ ÃZ¼Q¾ÂQÎCÃVÂ0¿K¾LÎCÃ?Í5¾pÀjÃ5ÊLÊ*º5¼QÅÁ+ÄÇMÂQºYÂξoÀ¾ÊLº8Ä3Í8¾pÄ5ÂQÁ+º5ÄCÀ#êï5ë.Âξp¼¾
ÁXÀ.ÃZÄY»¼QÇ8¾pÄ5ÂxÄC¾L¾pÅYº8Ì ìC¾*Ò/ÁX¿Á+ËXÁ+ÂÆFÁXÄYº/ÅÃ?Æð ÀxÊ*º5ÈaÈ.»ÄÁRÊLÃZÂÁXº8ÄYÖ¼QºZº/ÊLº8ËRÀqÃZÄCÅÅ/ÁRÀ¼QÁ+¿»Â¾pÅÀÆ/ÀÂQ¾LÈjÀ
¿<¾oÊLÃ8»CÀ¾qÁ+ÂÁRÀzÁXÈdÖ<ºnÀÀÁX¿Ë+¾xº0ÃZÄnÂQÁXÊLÁ+ÖCÃZ¾xÎCºV½|Ã0À»CÊpÊ*¾pÀQÀÌ»ËÀÆ3À¾pÈ£½^ÁXËX˾LÍ5º8ËXÍ8¾0êñ5ë ¿3ÆË+¾LÂÂÁXÄÇ0»<À¾p¼QÀ
Ã8ÅÅaÂQξLÁX¼!ºV½^Äj¾pÍ8¾pÄ5ÂíªÎ<ÃZÄCÅ/ËX¾L¼iÀÃZÄ<ÅdÁ+Än¾p¼QÃ5ÊòÂQÁ+º5ÄjÖ¼º8º/Ê*º5ËXÀÂQºx¼Q»ÄÄÁXÄÇ[ÀÆ/ÀÂQ¾LÈjÀ»CÀÁXÄÇ[Ô:º5¿Á+ËX¾lܺ/Å/¾
¾oÊiÎĺ8ËXº8Ç5Æ8óZÁ+ÂÊLº8»ËRÅd¿<¾-Ö<ºnÀÀÁ+¿CË+¾zÃ8ÄCÅd»CÀ¾*Ì»ËCºxÈdÁXÄÁ+ÈdÁXôL¾^ÂQξzľp¾pÅÀ̺8¼!ÊLº8ËXËXÃ8¿<º5¼QÃZÂÁXº8Äa¿<¾L½¾p¾LÄjÁXÄ/í
̺8¼QÈjÃVÂÁXº8ÄaÖ¼QºVÍ3ÁXÅ/¾p¼QÀÃZÄ<ÅaÊLº8ÄCÀ»Èd¾L¼iÀ êÙ3ëÂξp¼¾^ÃZ¼Q¾^À¾pÍ8¾p¼QÃ8ËnÁXÄn¾p¼¾oÀÂQÁ+ÄÇÖ¼Qº8¿CË+¾pÈdÀ̺5¼½^ÎÁRÊiÎaÔ:º5¿ÁXË+¾
ܺ/Å/¾d½^Á+ËXËÖ¼Qº8¿CÃ8¿ËXÆ¿<¾dÂQξj¿K¾pÀÂ.Àº5Ë+»ÂÁXº8ÄM¿<¾oÊLÃZ»<À¾aÂÎC¾LÆTº/ÊpÊ*»¼qÁXÄÀÆ/À¾LÈjÀÂQÎCÃVÂ[Ã8¼¾dÅ/ÁRÀÂQ¼ÁX¿»/ÂQ¾pÅ
ÂÎ3»CÀaĺ8ÂdÈjÃ8ÄCÃZÇ5¾pÃZ¿CË+¾H¿nÆ$ÃMÀÁ+ÄÇ5Ë+¾ÖK¾L¼iÀº5ĺ8¼aº8¼QÇ5Ã8ÄÁXôpÃVÂQÁ+º5ÄcóÅ/Æ3ÄCÃZÈdÁRÊ¿<¾oÊLÃZ»<À¾HÂξ#ÁXÄ/̺8¼QÈjÃVÂQÁ+º5Ä
ÂξpÆaÊLº8ÄnÂQÃ8Á+ÄjÈ.»CÀÂÊiÎCÃZÄCÇ8¾^½^ξpÄdÂξz½\º8¼QËRÅ.Á+ÂQÀ¾LË+ÌÊiÎCÃ8ÄÇ8¾oÀÃZÄCÅd¾pÍ8º5Ë+Í3ÁXÄǽ^ξLÄ0»<À¾p¼QÀÅÁXÀQÊ*ºVÍ5¾L¼Ä¾p½
½\Ã?Æ/Àºd»CÀ¾ÂÎC¾qÁ+Ä/̺5¼ÈjÃZÂÁXº8ÄÖ¼ºVÍ3ÁRÅ/¾pÅcÏ
õ÷özøZözùöú#û^özü
ýÿþ
!"#$&%'")((* +-,. /%01324568798
:58;<
=?>@BADC9EF?G' H.88=:JIBAK2LCKMEFGN H
;O8P)QR=S
UT3V.F4WCKX?YZ;<[ \.]WY_^AK`a?F?FG2!4BV.X?P)FAKb24.ý FCKa. cYW^BAK24&V3FAZ
þ \.\3]W='F?aCK@AKF)4&`1CKF?X_24a?`.d^B@BCKFA
XDa?2F?4Ba?F.egf.`.b<
þ hi3iW*QjBP) lk1mRn1h.o1mqp3h.\n3\JmsrtZEv?þ \.\.].H
ý uv;xw
wyw8B_;)z/{K%|-c}W%qD~{|c+-{/$,Ov{K{$W#|<$&/|j3$&$&%q<%&x+K,3{xj
~3/{K%|-c}W%qD~
{jB,3|DK~3s3|-03': &79&FXD2!X?&w4B2!f.FAKXD2LCR`3yF4&F?f3TC
þ \3\iW
ý kJvw8
=__3_ mq!'_(B$z|KD+%c3$B{N
?3|U!8~@B4&^&@B&b2XD&FGXDb2!GBF?XZ2LCK^AKF?XDF?4C-T1CK2`.4t4&`1CKF?X?
þ\3\.]WNTf.T12!b!T1&bFT1C6CDCK^Y .Ja?@&2 @&4B2!V3F. agW?W@BF?b`.MJJ^gT1^*FAKX-1`3^*F?4gG2A ^BX? V3M.
ý h156B
: 8P)=w;1 *!18=SI)3 =W"zt{K!#3$'|j,3v3|D
?3|-$&%q|-$N%cc *+K,.!¢¡93$&%9{|-1,3%c3$
,3$g~v£1% ¤)+K,3%c1$&:AK`aF?FGB24BV.X8`1CKBFt2L¥WCK¦
@AK`.^*FT14§W`3¨CR¢TJAKF
:4&V324&F?FAK24BV<©)`34B/FAKF?4&a?F36©¢;
Qjy&8IZ7I_2¨CK<d^*`.XD2@&dª`.4CKBF6`.@&4&G&TJCK2!`34&X9`1:W`3Cq¢TJAKF8
:4&V.24BF?FAK24&Vg*@BAK2a-B2CKMFAKb!T34gGN
þ\3\i
ý n7&©)
w8Qq tB©
I))$<%&8{-%|-}B+%}W|/$#«j
+K3
(g}W%q|+K3t}$Bc+K,3%c3$B{Kg: 79BF?XD2X?&w
4&2fFAKXD2LCR
`3yF4&F?f3TC
þ \3\.k
MAC3 Workshop Notes Tools for Managing Mobile Agent Systems
Abstract: In this position paper, we make a case for the development of mobile agent patterns. Patterns have
proven extremely useful to the object-oriented programming community. However, of the large amount of
pattern research, little effort has been devoted to developing mobile agent patterns. We wish to correct this
situation. We believe that the ongoing success of mobile agent systems depends on the development of
software engineering principles for them. Patterns are a recognized means to this end, and one that we wish
to promote.
Introduction
In most areas of research there comes a time when the researchers begin to understand the principles, facts,
fundamental concepts, techniques, architectures, and other research elements in their fields of study. Research into
agents, specifically mobile agents, is reaching that time. As evidence of this fact, one need not look any further than
the calls for papers to upcoming conferences and workshops on mobile agents. Take for example, the call for papers
for the workshop on Mobile Agents in the Context of Competition and Cooperation [MAC3 99]. We find comments
such as, “… gaining more widespread acceptance and recognition as a useful abstraction and technology” and, “we
are uninterested in papers that describe yet another mobile agent system.” The question to answer now is what is
important for us to do next as a research community.
To answer that question we must first consider why we do not want to hear about another mobile agent system.
We will not answer for the various workshop and program committees, but we can propose one that we hear often
from others. Since there are many mobile agent systems and frameworks in existence doing many of the same things,
there is no use discussing another one because it too will do the same things and in similar ways. In other words, a
new system does not often provide any new insights that are useful to the research community. However, we claim
that these ‘new’ systems do validate, refine and show the reuse of many of the previously proposed and discussed
research elements. Moreover, they bring with them additional thoughts, understanding and clarifications of the
research elements. The problem is that when reporting on these ‘new’ systems, these insights get lost in the discussion
of the system as a whole, or they are just not reported at all. For example, we have lost track of how many times we
have read a paper that indicated it used KQML for the communication between agents and not been able to understand
why it was used? There may have been an obvious advantage, or maybe it just did not matter. What we wanted to
understand was which forces and context lead to this decision, because if we need to make a similar decision in the
future we need this information.
We propose that, since as a research community we have reached a stage where some research elements in mobile
agents are well understood and that there are several examples of each, it is time to begin the effort of documenting
these elements as software patterns. This is not a matter of documenting the solution and problem surrounding each
research element; this material is already evident in most agent papers. We need to go further and deeper in order to
understand the forces and context of the problems that give rise to the proposed solutions. These are the
undocumented and often misunderstood features of the research elements, which need to be elaborated before agent
systems can enter the mainstream of software engineering and business applications.
Since many are not familiar with software patterns, and those that are think of them as only problem and solution
pairs, we introduce patterns and pattern languages in order to help with their understanding. Next, we enhance our
argument as to why agent patterns are important for agent research. We then compare and contrast agent patterns with
their object-oriented counterparts. Finally, we present the current layout of the agent pattern landscape, identifying
what some have started to do and what else we feel needs to be done.
• A three-part rule which expresses a relation between a certain context, a problem, and a solution.
• As an element in the world, each pattern is a relationship between a certain context, a certain system
of forces which occurs repeatedly in that context, and a certain spatial configuration which allows
these forces to resolve themselves.
• As an element of language, a pattern is an instruction, which shows how the spatial configuration
can be used, repeatedly, to resolve the given system of forces, wherever the context makes it
relevant.
• The pattern is, in short, at the same time a thing, which happens in the world, and the rule which
tells us how to create that thing, and when we must created it. It is both a process and a thing; both a
description of a thing which is alive, and a description of the process which will generate the thing
Although there are different pattern formats, the minimal format contains the following headings or ones dealing
with similar subject matters.
• Name: As the saying goes in the object-oriented community, a good variable name is worth a thousand
words and a good pattern name, although just a short phrase, should contain more information than just
the number of words would initially suggest. Would the word agent be a good pattern name? The answer
is no. Although it means a lot more than the single word suggests, it has too many meanings! One should
strive for a short phrase that still says it all.
• Problem: A precise statement of the problem to be solved. Think of the perspective of a software
engineer asking himself, How do I … .? A good problem for a pattern is one that software engineers will
ask themselves often.
• Context: A description of a situation when the pattern might apply. However, in itself the context does
not provide the only determining factor as to situations in which the pattern should be applied. Every
pattern will have a number of forces that need to be balanced before applying the pattern. The context
helps one determine the impact of the forces.
• Forces: A description of an item that influences the decision as to when to apply the pattern in a context.
Forces can be thought of as items that push or pull the problem towards different solutions or that
indicate trade-offs that might be made [Coplien 96].
• Solution: A description of the solution in the context that balances the forces.
Other sections such as resulting context, rationale, known uses, related patterns and implementation with sample
code are usually included to help with the pattern’s description.
A good pattern provides more than just the details of these sections; it should also be generative. Patterns are not
solutions; rather patterns generate solutions. You take your 'design problem' and look for a pattern to apply in order to
create the solution. The greater the potential for application of a pattern, the more generative it is. Although very
specific patterns are of use, a truly great pattern has many applications. For this to happen, pattern writers spend
considerable time and effort attempting to understand all aspects of their patterns and the relationships between those
aspects. This generative quality is so difficult to describe that Alexander calls it "the quality without a name", but you
will know a pattern that has it once you read it. It is often a matter of simplicity in the face of complexity.
Although useful at solving specific design problems, we can enhance the generative quality of patterns by
assembling related ones, positioning them among one another, to form a pattern language, enabling us to use them to
build systems. For example, individual patterns might help you design a specific aspect of your mobile agent, such as
how it models beliefs, but a pattern language might be able to help you build all types of mobile reactive agents.
Agent pattern languages are very important for agent patterns to be successful. Forcing each pattern to identify its
position within the space of existing patterns is not only good practice, it is also good research. In other words, all
agent patterns should be part of an agent pattern language. It is not only helpful to you, but to all those other software
engineers who will use the patterns to develop their systems in the future.
Why is Research into Patterns Important for Agent Research?
For any software system to be successful and run safely, it must be constructed using sound software engineering
principles, and not constructed in an add-hoc fashion. Unfortunately, much of agent development to date has been
done ad hoc [Bradshaw, et al., 1997], creating many problems – the first three noted by [Kendall et, al, 1998]:
These problems limit the extent to which “industrial applications” can be built using agent technology, as the
building blocks have yet to be exposed. Objects and their associated patterns have provided an important shift in the
way we develop applications today, since the level of abstraction that we develop at is greater than doing functional
and imperative programming. Since we believe that agents are the next major software abstraction, we find it essential
to begin an effort to document that abstraction so that others can share in the vision. Patterns provide a good means of
documenting these building blocks in a format already accepted by the software engineering community. Patterns also
have the added benefit that no unusual skills, language features, or other tricks are needed to benefit from them [Lange
and Oshima, 1998].
• Agent Patterns: deal with the architectures of agents and agent-based applications [Kendall et al. 98, 97;
Silva and Delgado 98; Aridor and Lange, 98].
• Communication Patterns: deal with the way agents communicate with one another [Deugo and Weiss, 99].
• Travelling Patterns: deal with various aspects of managing the movement of agents such as routing and
quality of service Lange and Oshima 98].
• Task Patterns: deal with the breakdown of tasks and how these tasks are delegated to one or more agents
Lange and Oshima 98].
• Interaction Patterns: deal with the way agents locate one another and facilitate their interactions [Lange and
Oshima 98].
• Coordination Patterns: deal with managing dependencies between agent activities. [Tolksdorf 98]
As a general comment, patterns cover many different levels of abstraction. For example, some of them are used
to describe the structure of an mobile agent system. Other patterns support the structure of agents and their
relationships with different agents. While other patterns can be used to specify the design aspects of individual agents.
The important feature here is not in developing the definitive classification. Rather it is more important for the mobile
agent community to identify, specify and agree on the abstractions so that we can provide a common vocabulary for
discussing and enhancing them, and, more importantly, building industrial strength mobile agent applications based on
well-grounded software engineering principles.
Conclusion
What is in the future of mobile agent pattern research? Our prioritized list is as follows:
• Identify an initial set of agent pattern classifications: These classifications are to help focus pattern writers
on targets that are of the greatest importance to those developing ‘real’mobile agent systems.
• Identify pattern languages within each classification: These pattern languages are for pattern writers to
develop and extend and will permit writers to position their new patterns within a know space of existing
patterns.
• Write the patterns.
It is at MAC3 that we wish to debate and discuss these foundations with the participants in order to fill in the
details of how to proceed and why bother at all. We feel it necessary to remind those involved with mobile agent
research to not only write about solutions. Think, discuss, and write about the problems their solutions are intended to
address and what context and forces led them to that particular solution. In short, we believe that following this
approach, we will not have to read about “yet another mobile agent framework” anymore. Rather, we will be able to
read and understand what problems a mobile agent system solves, and when we should consider using the approach!
References
Aridor, Y., Lange, D., “Agent Design Patterns: Elements of Agent Application Design”, Proceedings of the Second
International Conference on Autonomous Agents (Agents 98), ACM Press, 1998, 10-115.
Bradshaw, J.M., S. Dutfield, P. Benoit, J.D. Woolley, “KaoS: Towards and Industrial-Strength Open Distributed
Agent Architecture”, J.M. Bradshaw (Ed.), Software Agents, AAAI/MIT Press, 1997.
Coplien, J.O., “Software Patterns”, SIGS Management Briefings Series, SIGS Books & Multimedia, 1996.
Deugo, D.L, “Communication as a Means to Differentiate Objects, Components and Agents”, submitted to TOOLS
USA 99, 1999.
Kendall E. A., P.V. Murali Krishna, Chirag V. Pathak, C.B. Suresh, “Patterns of Intelligent and Mobile Agents”,
Autonomous Agents '98 (Agents '98), 1998
Kendall E. A., M.T. Malkoun and C.H. Jiang , “Multiagent System Design Based on Object Oriented Patterns”, The
Report on Object Oriented Analysis and Design in conjunction with The Journal of Object Oriented
Programming, June 1997
Lange, D.B., M. Oshima, “Programming and Deploying Java Mobile Agents with Aglets”, Addison Wesley, 1998.
MAC3, “Mobile Agents in the Context of Competition and Cooperation”, Autonomous Agents ’99 ,
http://mobility.lboro.ac.uk/MAC3, 1999.
Silva A. and J Delgado, “The Agent Patterns: A Perspective from the Mobile Agent System Point of View”,
EuroPLoP ’98, 1998.
Tolksdorf, R., “Coordination Patterns of Mobile Information Agents”, Proceedings of Cooperative Information
Agents II, Second International Workshop, CIA’98, Springer, 1998, 246-261.
MAC3 Workshop Notes Mobile Agent Applications
Mobile Agent
Applications
Abstract
This paper presents Nomad, a mobile agent system for electronic
auctions. It has been integrated with eAuctionHouse, our next gener-
ation Internet auction server. To our knowledge, eAuctionHouse is the
rst Internet auction site that supports combinatorial auctions, bidding
via graphically drawn price-quantity graphs, and participation of mobile
agents. It supports mobile agents so that a user can have her agent ac-
tively participating in the auction(s) while she is disconnected. Mobile
agents that execute on the agent dock which is on (or near) the host
machine of the auction server also reduce the network latency|a key
advantage in time-critical bidding. Our auction server uses the Concor-
dia agent dock to provide mobile agents a safe execution platform from
where they can monitor the auctions, bid, set up auctions, move to other
hosts, etc. The user has the full
exibility of Java programming at her
disposal when designing her agent. We also provide an HTML inter-
face for non-programmers where the user can specify what she wants her
agent to do, and the system automatically generates the Java code for the
corresponding mobile agent, and launches it. Some of these predesigned
agents are alerting tools, others bid optimally on the user's behalf based
on game theoretic analyses. This helps put novice bidders on an equal
footing with experts. Finally, we discuss automated coalition formation
among bidder agents.
1 Introduction
As the Internet gradually moves into mainstream culture, electronic commerce
is becoming an important mechanism for conducting business. It helps mer-
chants and consumers reduce business costs and enables customized delivery
of goods and services. Electronic auctions are emerging as one of the most
successful ecommerce technologies.
Several successful commercial Internet auction sites exist - such as eBay1
and Onsale2 - and academic auction houses have recently appeared on the In-
ternet [4, 9]. Our motivation in developing an auction server, eAuctionHouse,
This material is based upon work supported by the National Science Foundation under
CAREER Award IRI-9703122, Grant IRI-9610122, and Grant IIS-9800994.
1
http://www.ebay.com
2 http://www.onsale.com
is to prototype novel next generation features, and test their feasibility, both
computationally and in terms of consumer ease of use. To our knowledge,
eAuctionHouse is the rst, and currently only, Internet auction site that sup-
ports combinatorial auctions [3, 6, 7, 5], bidding via graphically drawn price-
quantity graphs [8], and mobile agents. This paper focuses on the mobile agent
component.
7 Conclusions
This paper presented Nomad, a mobile agent system for electronic auctions.
It has been integrated with eAuctionHouse, our next generation Internet
auction server. The reader is invited to visit the site and test the agents
(http://ecommerce.cs.wustl.edu).
Our auction house supports mobile agents so that a user can have her
agent actively participating in the auction(s) while she is disconnected. Mobile
agents that execute on the agent dock which is on (or near) the host machine
of the auction server also reduce the network latency|a key advantage in
time-critical bidding. Our auction server uses the Concordia agent dock to
provide mobile agents a safe execution platform from where they can monitor
the auctions, bid, set up auctions, move to other hosts, etc. The user has
the full
exibility of Java programming at her disposal when designing her
agent. We also provide an HTML interface for non-programmers where the
user can specify what she wants her agent to do, and the system automatically
generates the Java code for the corresponding mobile agent, and launches it.
Some of these predesigned agents are alerting tools, others bid optimally on
the user's behalf based on game theoretic analyses. This helps put novice
bidders on an equal footing with experts.
Future research includes developing additional prototype agents based on
new game theoretic analyses. Also, automated coalition formation by bidder
agents brings new challenging problems which will be further studied in the
continuing development of eAuctionHouse and Nomad.
References
[1] P. Milgrom. Auctions and bidding: A primer. Journal of Economic Perspectives,
3(3):3{22, 1989.
[2] E. Rasmusen. Games and Information. Basil Blackwell, 1989.
[3] S. J. Rassenti, V. L. Smith, and R. L. Buln. A combinatorial auction mechanism
for airport time slot allocation. Bell J. of Economics, 13:402{417, 1982.
[4] J. A. Rodriguez-Aguilar, P. Noriega, C. Sierra, and J. Padget. FM96.5: A Java-
based electronic auction house. In In Proceedings of the Second International
Conference on the Practical Application of Intelligent Agents and Multi-Agent
Technology (PAAM'97), 1997.
[5] M. H. Rothkopf, A. Pekec, and R. M. Harstad. Computationally manageable
combinatorial auctions. Management Science, 44(8):1131{1147, 1998.
[6] T. W. Sandholm. An implementation of the contract net protocol based on
marginal cost calculations. In Proceedings of the National Conference on Arti-
cial Intelligence (AAAI), pages 256{262, Washington, D.C., July 1993.
[7] T. W. Sandholm. An algorithm for optimal winner determination in combina-
torial auctions. In Proceedings of the Sixteenth International Joint Conference
on Articial Intelligence (IJCAI), Stockholm, Sweden, 1999. Extended version:
Washington University, Department of Computer Science technical report WUCS-
99-01.
[8] T. W. Sandholm. eMediator: A next generation electronic commerce server. Tech-
nical Report WUCS-99-02, Washington University, Department of Computer Sci-
ence, 1999.
[9] P. R. Wurman, M. P. Wellman, and W. E. Walsh. The Michigan Internet Auction-
Bot: A congurable auction server for human and software agents. In Proceedings
of the Second International Conference on Autonomous Agents (AGENTS), pages
301{308, Minneapolis/St. Paul, MN, May 1998.
A Partitioning Model for Applications in Mobile Environments
Alexander Schill1, Albert Held2, Thomas Ziegert1 and Thomas Springer1
1
Dresden University of Technology, Department of Computer Science, Institute of Operation
Systems, Data Bases and Computer Networks, Mommsenstr. 13, D-01062 Dresden, Germany
{schill, ziegert, springet}@ibdr.inf.tu-dresden.de
2
DaimlerChrysler, Research and Technology 3, Wilhelm-Runge-Str. 11, D89081 Ulm,
Germany albert.a.held@daimlerchrysler.com
Abstract: Today mobile devices are an integral part of the execution environment of many distributed
applications. The new application domain of mobile computing brought up by this fact introduces
problems special to this area. Most of the currently available applications can’t handle mobility and
frequently changing network media. In this paper a partitioning model is introduced which combines
various techniques used to solve the special problems of mobile computing and to facilitate the
adaptation of application behavior according to the execution environment. Main points are the proxy
approach and the use of mobile agents as application components. The model focuses on a pair of
generic proxy agents which are placed at both sides of a wireless connection to control the data transfer
between a mobile host and the wired network.
1
In the literature the phrase disconnected operation is sometimes used for both of the described operations. We use the expressions
“disconnected” and “autonomous” to distinguish between both types.
A general approach to support mobile environments is the partitioning of applications and
distribution of the components between the mobile device and hosts in the wired network. The
aim is the dynamic adaptation of applications in reaction to changes within their execution
environment (e.g. quality of connection to the mobile device and availability of resources).
An often used method is the introduction of an intermediate component placed between client
and server components. This so called proxy senses its execution environment and adapts the
communication over the link to the mobile device according to the available communication
media.
An adaptation of the data stream can be done in the network infrastructure [6]. In this
approach the amount of data is reduced using data type specific lossy compression and
conversion. This functionality is separated from the client and server components and is part of
an intermediate proxy within the network infrastructure.
In [5] the main task of the intermediary is filtering the data stream to the mobile device.
Therefore the following methods are applicable: optimized protocols, selective dropping of
structured data, compression or a deferred data transfer. By using a proxy component, client and
server components can remain unchanged or can be used with very little changes.
The approach of partitioning an application is also used in [3]. Data and functionality of an
application is partitioned into hyperobjects which are linked hierarchical objects managed by the
system. These hyperobjects contain base types such as text, graphics, untyped data and functions.
Based on this structure caching, prefetching and data reduction are used to exploit the wireless
links efficiently. Data reduction is done by selecting a subset of structured data for the transfer
according to the available network resources, application specified data priority and filters.
All the techniques described above can be used to adapt application behavior to the parameters of
the available network connection and execution environment. Filtering, compression and
conversion of data, outlines and lazy evaluation reduce the amount of data which has to be
transferred. These techniques can be implemented as an application component placed at a
stationary host. Code for caching, prefetching and lazy write-back has to be placed on the mobile
device. Beside these restrictions not all techniques can be combined. While lazy evaluation only
transfers data really needed, prefetching transfers data that will possibly never be needed. A
partitioning model which combines some of the described techniques is introduced in the next
section.
subcomponent
server 1
application application
client
related related subcomponent
application
component component server 2
subcomponent
generic generic
component component
application application
related related
component component
server n
4 A Sample Applicatio n
An email application has been implemented to validate our model. It is partitioned using the
described model. The Netscape Navigator Mail represents the client of the existing client/server
application (the client component in figure 1). The application related component on the mobile
device provides a user interface to configure and control all application components (agents) and
to input filter data and the information required to access the email account. New messages are
delivered to the mail server. The application specific component in the wired network is called
email agent. It migrates to the mail server host or a host close to the server. Once there it will ask
for new messages using the information for the email account. New messages are filtered in two
ways using the header information (e.g. sender, receiver or subject) and information in the body
(e.g. body text or attachment data type and size). The filtered messages are sent to the component
at the mobile device. Therefore the generic proxy is used.
The implementation is based on the ObjectSpace Voyager core technology API [7] and the
JDK 1.2 [8]. The communication between agents is based on the RMI mechanism of Java. For
further details see [4].
Table 1 shows the transfer times of messages with and without the indirection over the proxy
agent. We conducted our measurements for 100VGAnyLAN on two 200MHz Pentium Pro,
64MB RAM workstations running WindowsNT and for Ethernet and the wireless LAN on a
ThinkPad 760D (Pentium 166MHz, 64MB RAM) running Windows95 and one of the
workstations mentioned. The values are average times over 500 runs. We transferred an email
containing a JPEG picture with a size of 12204 bytes in high and 4439 bytes low quality. The
decoding and encoding needs an average of 135,6 ms altogether.
The values for 100VGAnyLAN and Ethernet are highly influenced by the
serialization/deserialization times. The use of the proxy components only is advantageous for
disconnection handling. Using the wireless LAN, the transfer time of the compressed data is
significantly lower than the times for transferring uncompressed data. The indirection over the
generic proxy takes also some time but the benefit for disconnection handling and adaptation
justifies this effort.
5 Conclusion
The partitioning model described in this paper enables the dynamic adaptation of applications to
dynamic changes of their execution environment. It introduces two component pairs. These
components contain application related and generic functions to handle disconnections and
variations in connection quality. Generic and application specific techniques are placed in
components where they can access required information to work effectively. While other
approaches focus one special problems like filtering of information [5] or data reduction [6] our
model integrates most of the these techniques. Another advantage is the possibility to share the
generic functionality between applications. The generic proxy provides a robust software
component to adapt data transfer which can be used by all applications of a mobile device and
independently of underlying network protocols. The handling of the data remains independently
configurable for each application. Because of the defined and limited functionality of the generic
proxy, this component is small compared to the application related components. This reduces the
effort necessary after the movement of the mobile device. Only the generic proxy has to be
moved. This decouples the application related parts from the movement of the mobile device so
own migration strategies can be applied, which includes the migration to a server near the most
probable next location of a mobile user.
An important fact is the use of mobile agents as application components which facilitates a
dynamic placement of application parts and the dynamic placement of the proxy during runtime.
The capability of migration is performed by the agent system. The agent system also provides
other services (e.g. naming and locating, security) which can be used by all applications. Mobile
agents also facilitate the execution of autonomous operations as described before. To enable the
adaptation to the execution environment, the environment has to be sensed by the components.
Therefore the agent system must provide additional services for instance to observe the quality of
network connections. By using an agent system based on Java the proxy can be used on any
platform which provides a Java virtual machine. Only the availability of the agent system and the
class files are special requirements in our approach.
References
1. Marc E. Fiuczynski and David Grove: A Programming Methodology for Disconnected
Operation; Technical Report, University of Washington, March 1994
2. James J. Kistler and M. Satyanarayanan: Disconnected Operation in the Coda File System;
ACM Transactions on Computer Systems, 10(1), pp. 3-25, February 1992
3. Terri Watson: Effective Wireless Communication through Application Partitioning; In Proc.
of the Fifth Workshop on Hot Topics in Operation Systems (HotOS-V), May 1995
4. Alexander Schill, Albert Held, Wito Böhmak, Thomas Springer, Thomas Ziegert: An Agent
Based Application for Personalized Vehicular Traffic Management; Lecture Notes in
Computer Science 1477 Mobile Agents, Springer, ISBN 3-540-64959-X, pp. 99-111, 1998
5. Bruce Zenel, Dan Duchamp: A General Purpose Proxy Filtering Mechanism Applied to the
Mobile Environment; The Third Annual ACM/IEEE International Conference on Mobile
Computing and Networking, 1997 pp. 248-259
6. Armando Fox and Steven D. Gribble and Eric A. Brewer and Elan Amir: Adapting to
Network and Client Variability via On-Demand Dynamic Distillation; Proceedings of the
Seventh International Conference on Architectural Support for Programming Languages and
Operating Systems, pp. 160-170, October 1-5, 1996
7. ObjectSpace: Voyager Core Technology User Guide, Version 2.0, 1998
8. Sun Microsystems: The Java Developers Kit, Version 1.2;
http://java.sun.com/products/jdk1.2/index.html, 1998
9. Alexander Schill, Sascha Kümmel, Thomas Springer and Thomas Ziegert: Experiences with
an Adaptive Multimedia Transfer Service for Mobile Environments; Workshop Interactive
Applications of Mobile Computing, Rostock, Germany, November 24-25, 1998
10. Thomas Springer: Masters Thesis (Diplomarbeit): Verteilung von Applikationen in Systemen
mit mobilen Endgeräten; Dresden University of Technology, Department of Computer
Science, Institute of Operating Systems, Data Bases and Computer Networks, 1998
11. Terri Watson: Application Design for Wireless Computing; In Proc. of the 1994 Mobile
Computing Systems and Applications Workshop, December 1994
12. Dirk Gollnick, Sascha Kümmel, Alexander Schill and Thomas Ziegert: Off-Line Verteilung
multimedialer Daten in mobilen Systemen; in GI/ITG-Fachtagung Kommunikation in
Verteilte Systemen, Springer Verlag, pp. 357-371, February 1997
MAC3 Workshop Notes Frameworks for Managing & Understanding
Frameworks for
Managing and
Understanding Mobile
Agent Complexity
Dartmouth College
Hanover, NH 03755
May 1, 1999
Abstract
Mobile-agent systems have gained popularity in use because they ease the applica-
tion design process by giving software engineers greater
exibility. Although the value
of any network is dependent on both the number of users and the number of sites
participating in the network, there is little motivation for systems to donate resources
to arbitrary agents. We propose to remedy the problem by imposing an economic
market on mobile-agent systems where agents purchase resources from host sites and
sell services to users and other agents. Host sites accumulate revenues, which are dis-
tributed to users to be used to launch more agents. We argue for the use of markets to
regulate mobile-agent systems and discuss open issues in implementing market-based
mobile-agent systems.
1 Introduction
One of the more recent items in a network programmer's tool box is code mobility. The tech-
nique is becoming more common in applications programming, network management [BPW98],
video conferencing [BPR98], software distribution and installation, unreliable networked
weather forecasting [Joh98], and client-server networking alternatives [Mul98].
Mobility allows the programmer to easily distribute resource usage throughout the net-
work over time. Resource contention can be mitigated by relocating execution to less utilized
machines on the network. Additionally, since mobile agents are autonomous, they may sched-
ule their own computation at a later time at a remote host, avoiding times of congestion.
We examine some restrictions typically present in mobile-agent systems. Specically, few
mobile-agent applications implement communication with agents from other applications or
submitted by competing users. This shortfall might be surprising considering that agent
technology is often advertised as a unifying design paradigm nurturing both cooperation
and competition.
Many of the restrictions faced by usable mobile-agent systems stem from the distributed
nature of mobility: because decisions are made throughout the network, coordination be-
comes more diÆcult. Human societies have implemented economic markets as a solution for
distributed control. We believe that the same solution can be applied to create societies of
mobile agents.
We propose that mobile agents buy computational resources from their hosts using a
scarce veriable currency. The agents' priority would be governed by limited endowments.
The danger of denial-of-service attacks is bounded by agents' expenditure. Systems can buy
outside computational resources to
exibly expand their computing base. Conversely, idle
resources may be sold to users from other sites. Finally, a fair price system provides valuable
information that allows agents to autonomously and eÆciently balance network load.
We conclude by establishing goals necessary to implement computational markets in
the context of mobile-agent systems: a low-overhead veriable currency system, eÆcient
incentive-compatible pricing mechanisms, a set of standards conveying the rules and bases
of such pricing mechanisms to allow rational planning by agents, and both demand-based
and reservation-based consumption.
2 Motivation
As mobility becomes more commonly used in network programming, we observe that, so
far, applications operate in a closed environment. The range of sites to which an agent can
jump is severely restricted and it is common for all agents in the system to only represent
the interest of a single user or cooperating group of users. Additionally, typically agents only
communicate with other agents of the same application.
The number of sites to which an agent can jump is limited. Why should a host allow any
agents to visit at all? If we ask the analog question in web browsing, in a large number of
situations there is a clear advantage for web servers to supply their resource (information) to
arbitrary clients. This information dissemination is generally done to boost the reputation
of the host site's owners, clients, or products.
Computational resources exported by mobile-agent hosts are much more diÆcult to con-
trol. The host site generally has no assurance that an arbitrary agent's actions will have
any benecial eects. There is little incentive for a host system to provide resources to an
arbitrary agent. Not only is there the additional congestion incurred through normal mobile
agent use, but there are additional risks from denial-of-service attacks and other irresponsible
uses of resources.
A mobile-agent system's value is not only dependent on the number of participating
host sites, but also on the the number of participating users and agents. Most non-research
mobile-agent applications assume that agents are all issued by cooperating owners. Typically,
only one entity issues mobile agents for a task. This entity may be represented by many
users working for a university or company, but the interests of the agents are generally
complementary and it is in agents' best interest to cooperate. Essentially, agents in such
situations can be viewed as having a common owner.
Even if all agents share a common goal, their use distributes decision-making processes
throughout the network. To perform eÆciently, agents must be able to coordinate and assess
the impact of their actions. Ideally, the medium for this information exchange should be fast
and incur minimal overhead.
We see few real-world examples of agents coordinating with agents involved in other
applications. In stark contrast, consider the World Wide Web. A user's browser sends
requests to thousands of host sites to retrieve information. Much of the information retrieval
is more than simply examining an HTML le. Often browsers exchange cookies with servers,
negotiate security protocols, retrieve dynamically produced web pages, download applets,
and forward retrieved information to other applications to be processed. A typical web
browsing-session can involve the use of several dozen application programs. We have the
same goal for mobile-agent systems.
3 Markets
To overcome the limitations currently experienced by mobile agents, we propose to establish
an economic market for computational resources and services. Mobile agents arriving at
a host site will purchase the resources necessary to complete their task. These resources
could include access to the CPU, network and disk interface, data storage, and databases.
Presumably, agents are providing valuable services to their users. It is possible that other
agents would also benet from the service, so agents could sell their services to users and
agents. Eventually, currency will accumulate at host sites. Revenues are then distributed to
local users who in turn disperse their income to their agents completing the cycle.
The currency used in computational markets does not necessarily have to be tied to
legal tender currency. If the currency is exchangeable for real dollars, however, system
administrators can essentially export and import their computational resources. Access
to underutilized resources may be sold to mobile agents (resource export). If local resource
contention is high, then users may launch agents to carry on computation elsewhere (resource
import).
Because currency is scarce, budgets are nite, and all resource consumption is tied to
expenditure, agents' lifetimes are limited. The extent of a denial-of-service attack, wanton
consumption done with the intention of excluding other users from the resource, is limited.
Given that resource pricing is fair, hosts will be happy to entertain a denial-of-service at-
tack to maximize revenues. An eÆcient pricing policy will ensure that demand and price
are positively correlated and make denial-of-service attacks extremely expensive operations,
deterring oenders.
Price, the same mechanism that discourages wasteful consumption, serves as a simple
metric of resource contention and site congestion. Price advertisement provides a simple
means of agent coordination as follows. Revenue maximizing hosts will charge what the
market will bear. High prices due to congestion give agents incentive to distribute themselves
evenly throughout the network or defer execution to a less congested time. Thus a pricing
system eectively implements both temporal and spatial load balancing.
The idea of selling computational resources to mobile programs is not new. We discuss
a few recent implementations next. POPCORN [RN98] is a system that uses markets to
distribute \computelets" through the network to take advantage of idle CPUs. The approach
is intended for parallel programs where interaction among threads is limited.
The Geneva Messengers project [Tsc97] applies market ideas to allocate CPU usage and
memory to visiting messengers, lightweight mobile programs implemented in a Postscript-like
language. Host sites heuristically set prices by examining the amount of resources requested
by the present messengers.
In Telescript [Whi96] agents carry permits to access specic host-site resources. As a
permit is used, hosts trust each other to diminish the permit's power. The result is that
agents' lifetimes are limited. This use of permits can be viewed as a limited form of a
market. Host sites distribute permits for each resource to be controlled, though a permit for
one resource is not easily convertible to another. A more general form of this mechanism
would be to have a universal permit, currency, that could be exchanged for other permits.
An extreme point of view is taken in MarketNet [YDFH98] where currency-resource
exchange is the exclusive form of security. Dierent levels of security access are sold to
users. Sites may discount access to certain populations by setting a lower price in a separate
currency. Presumably this new currency is unusable by users outside the group.
4 The Challenge
There are many hurdles to cross on the way to implementing an eective market system.
Most obviously, there must be some means of exchange such as a secure currency system.
The market should be structured in such a way to reward honest behavior, to facilitate
planning. Finally, this structure should be well known to all entities participating in the
market.
4.1 Accounting
All markets rely on a secure means of exchange. Without this, there is no incentive for
participants to cooperate. Currency should be scarce to reinforce its value. A prerequisite
to this is that currency may only be spent once, i.e. a buyer may not use the same note for
more than one purchase. Ensuring this is the crux of any monetary system and can carry
with it signicant overhead. Electronic currency in the context of mobile-agent systems has
one particular caveat: an agent's money is essentially just data, data to which the host
potentially has access.
There are several micro-currencies designed to minimize the cost of transaction [GMA+ 96,
PHS98]. If the cost of currency exchange is still too large, there are other options to take.
Hosts can establish a local account for each agent or its owner. Deposits into the account
are periodically made with some secure payment method. Agents then withdraw from the
local accounts as they compute, trusting the host site to correctly decrement the account
balance. If the deposits are small or the account is known to be used over a long period of
time, then there is less incentive for hosts to overdraw the local account since the payo for
cheating once is lower than conducting further honest business.
The other option is to scale the level of resource accounting. Ideally, agents would
be charged for every action they take including a precise count of the instructions exe-
cuted or even the number of processor cycles used; bits sent through the network interfaces;
words/milliseconds of storage; etc. Such monitoring is most likely impractical, however, due
to the cost of precise measurement. At the other extreme, agents may pay a xed fee to
execute any set of instructions. Obviously, this is also ineÆcient in that agents will rarely
use the exact level of service for which they pay.
A happy medium between the two extremes must be found. Possibly, proling existing
applications using mobile-agent technology will give some intuition on the appropriate level of
control. It is quite possible that the sorts of applications that can take advantage of mobility
have similar resource requirements and one can tailor an allocation policy accommodating
the majority of applications.
Extending this strategy could allow hosts to oer one of several resource packages and
an appropriate billing plan to agents. Each package-accounting pair would have advantages
to dierent groups of applications depending on preferences and resource demands.
There are two dynamics that drive the construction of economic policy. One is the partici-
pants' goal to maximize utility, while the other is the system's engineers need to enforce an
equitable allocation. These two ideals often con
ict under poorly designed policies. A simple
example is when the market is allowed to create monopoly. Here a monopolist will act to
maximize revenue at the expense of customers. The lesson learned is that either monopolies
should be regulated or that conditions allowing the existence of monopolies should not exist.
It is the responsibility of the designer of the economic system to provide an environment
in which both buyers and sellers are willing to participate. Frequently, this is facilitated
by constructing mechanisms where the parties choose those actions that express their true
intentions, i.e, incentive compatible mechanisms. This open honesty mitigates the cost of
planning and decision making.
A well used example of an incentive-compatible policy is the sealed-bid second-price
auction [Vic61] where potential buyers simultaneously submit a single bid for a good. The
auctioneer chooses the winner to be the participant who submitted the highest bid, but the
winner pays the highest losing bid. Generally, the optimal strategy is for a buyer to submit
a bid equal to the buyer's valuation of the good.
A second issue in policy design: to enforce load balancing, a resource management policy
should provide a strong correlation between the contention for a resource and its price.
Possibly, this might be accomplished through setting a price that increases as the quantity
consumed rises. Alternatively, an auction could be held for the resource and the resource
owner could let the buyers compete to set the price.
Negotiation of price is not suÆcient for market-based resource allocation. The resource
management policy must also take into account resource consumption scheduling. The sys-
tem designer must decide whether to entertain reservations, consumption on demand, or
some combination of the two. Users and agents would likely be willing to pay more for
service guaranteed by reservations, but hosts might be able to sell larger quantities of re-
sources on a demand based scheduler. This is an interesting and valuable issue to study as it
eects planning on both the host and client sides and will likely deal with computationally
complex issues. There is the additional dimension that users will be willing to pay amounts
proportional to the quality of service.
4.3 Standardization
Finally, any eective policy will require that all participants are aware of the guidelines
regulating the system. Sites will have to nd some way of publishing their resource pricing
and allocation policies for their potential users. For agents to be aware of rules either requires
a single standard or some protocol for expressing market parameters.
Again, with this issue, there should be moderation. The point of an \agent" is to shield
the user from all the intricacies of computation by providing an abstraction. The user should
be aware of the service quality they receive as well as a general level of congestion of the
requests to their agents, but it is the agents' responsibility to eÆciently perform the task.
5 Conclusion
We believe that markets are the proper tools to provide an open mobile-agent system. They
enforce an additional level of security and give incentive for agents to autonomously balance
the computational load across the network. Allowing the currency used to buy computational
resources to be exchanged for legal tender allows system administrators to temporarily ex-
pand their domain by importing resources as well as capitalize on idle resources by exporting
them.
Implementation of a mobile-agent computational market will require further research in
electronic currency exchange to minimize the overhead of currency validation. Furthermore,
careful decisions must be made on the part of market designers and host-site owners to
equitably distribute resources among mobile agents and local users while attempting to
maximize revenue. Finally, regardless of the resource-allocation policy, for agents (or their
programmers) to plan appropriately, they must be able to detect which policy is being used.
Policy discovery will likely require either a single standard or a language to describe market
protocols.
Establishing markets will achieve distributed decision making in mobile-agent systems.
We feel that markets are natural solutions to mobile-agent coordination and resource control
and will eventually allow mobile agents to be used in an open multi-application environment,
though much work remains to be done to implement a working system.
Acknowledgments
This work is supported in part by the Navy and Air Force under contracts ONR N00014-
95-1-1204 and MURI F49620-97-1-0382, Rome Labs under contract F30602-98-C-0006, and
DARPA under contract F30602-98-2-0107.
References
[BPR98] Mario Baldi, Gian Peitro Picco, and Fulvio Risso. Designing a videoconference
system for active networks. In In Proceedings of the Second International Work-
shop, Mobile Agents '98, pages 273{284, Stuttgart, Germany, September 1998.
[BPW98] Andrzej Bieszczad, Bernard Pagurek, and Tony White. Mobile agents for network
management. IEEE Communications Surveys, September 1998.
[GMA+ 96] Steve Glassman, Mark Manasse, Martin Abadi, Paul Gauthier, and Patrick
Sobalvarro. The Millicent protocol for inexpensive electronic commerce. World
Wide Web Journal, 1(1), Winter 1996. Also in Fourth International World Wide
Web Conference, December 1995.
[Joh98] Dag Johansen. Mobile agent applicability. In In Proceedings of the Second Inter-
national Workshop, Mobile Agents '98, pages 80{98, Stuttgart, Germany, 1998.
[RN98] Ori Regev and Noam Nisan. The POPCORN market| an online market for
computational resources. In Proceedings of the First International Conference
on Information and Computation Economies, pages 148{157, Charleston, SC,
[Whi96] James E. White. Telescript technology: Mobile agents. General Magic White
Paper, 1996.
[YDFH98] Y. Yemini, A. Dailianas, D. Florissi, and G. Huberman. MarketNet: Market-
based protection of information systems. In Proceedings of the First Interna-
tional Conference on Information and Computation Economies, pages 181{190,
Abstract
Naturally occurring multi-agent systems exhibit remarkable problem solving capabilities
even in the absence of centralized planning. These systems exhibit complex, emergent
behavior that is robust with respect to the failure of individual agents. Such systems are
usually characterized by the interaction of a large number of simple agents that sense and
change their environment locally. In this paper, we discuss mobile agents and how they
represent a novel problem solving paradigm that can exploit naturally occurring multi agent
system (biological) metaphors. We introduce the principle of synthetic ecologies of
chemically inspired agents in order to model problem solving behavior in networks. We
demonstrate the utility of the architectural principles by describing example applications for
problem solving in the communications domain.
1. Introduction
The advantages of mobile agents have largely been discussed in terms of technology [Chess et al.,
97] and the value of individual agent autonomy (see, for example, [Bieszczad et al, 98]). It is possible
to view them as an approach to problem solving where mobility and interactions with the network
locally are stressed. Similarly, coordination mechanisms for mobile agents have been discussed in
terms of blackboard-style algorithms, with the agents tending to be rational, having a knowledge of
self and a goal to be achieved (see, for example, [O’Hare and Jennings, 96]). In fact, several
implementations of such systems are being investigated by the mobile agent community [Picco et al.,
99]. Symbolic systems of this type are often brittle, unable to cope with the failure of a single agent
and may depend upon planning by a central agency in order to achieve coordination. Such systems
often have to cope with the latency problems inherent in centralized systems. We believe that these
limitations undermine the value and power of mobile agent systems.
It is difficult to argue against the effectiveness of naturally occurring multi agent systems and, in
particular, systems exhibiting mobility. Societies of simple agents are capable of complex problem
solving while possessing limited individual abilities [Franks, 89; Hölldobler and Wilson, 94]. They
often possess no central coordination of activity; problem solving is distributed. Societies of such
mobile agents are found at all levels of evolutionary complexity, from bacteria to ants and beyond. It
is common in such societies to observe social coherence although when behavior of the individual is
observed, a large stochastic component is present. Stated another way, such societies exhibit emergent
behavior.
Problem solving by societies of simple agents has a number of common characteristics. Inter-
agent communication is local; no single agent has a global view of the world. Communication is also
achieved using simple signals and these signals are time dependent; e.g. they usually decay with time.
Signal levels provide the driving force for migration patterns. Individual agents sense and contribute
signal energy to the environment. In this description of the problem solving process, there are two
distinct and important agent characteristics. First, there is the role of the agent within the problem
solving process; i.e. how the work of problem solving is distributed to a diverse set of agents. Second
the degree to which the actions of one agent reinforce the actions of other agents in the society of
problem solvers.
The appeal of swarms of biologically inspired agents for industrial problem solving has recently
been appreciated [Parunak, 98]. Research into the problems and potential of multiple, interacting
swarms of mobile agents is just beginning [White and Pagurek, 98].
In the remainder of this paper, we briefly describe the principles of Swarm Intelligence and
Stigmergy. We then use these principles as motivation for the Synthetic Ecology of Chemical Agents
(SynthECA) and provide arguments as to the value of the abstraction. SynthECA is then used to
indicate how several interacting swarms of agents would be capable of problem solving in networks.
The paper then concludes with a review of its important messages.
3. SynthECA
The Synthetic Ecology of Chemical Agents (SynthECA) exploits ant-inspired agents to solve problems
by moving over the nodes and links in a network and interacting with "chemical messages" deposited in
that network. Chemical messages have two attributes, a label and a concentration. These messages are
persistent and are the principal medium of communication used between both swarms and individual
swarm agents. Chemical messages are used for communication rather than raw operational measurements
from the network in order to provide a clean separation of measurement from reasoning. In addition,
chemical messages drive the migration patterns of agents, the messages intended to lead agents to areas of
the network which may require attention. Chemical labels are digitally encoded, having an associated
pattern that uses the alphabet {1, 0, #}. This encoding has been inspired by those used in Genetic
Algorithms and Classifier Systems [Goldberg, 89] (for example). The hash symbol in the alphabet allows
for matching of both one and zero and is, therefore, the "don't care" symbol.
Agents in the SynthECA system can be described by the tuple, #=
'4%/&(O. This definition is
described at length in [White and Pagurek, 98] and will only be briefly described here. SynthECA agents
can be thought of as an implementation of the engineering principles for multi agent systems described in
[Parunak, 98]. Agents in the SynthECA system can be described using five components:
• emitters ('),
• receptors (4),
• chemistry (%),
• a migration decision function (/&(),
• memory (O)
An agent’s emitters and receptors are the means by which the local chemical message environment is
changed and sensed respectively. Both emitters and receptors have rules associated with them in order that
the agent may reason with information sensed from the environment and the local state stored in memory.
The chemistry associated with an agent defines a set of chemical reactions. These reactions represent the
way in which sensed messages can be converted to other messages that can, in turn, be sensed by other
agents within the network. The migration decision function is intended to drive mobile agent migration and
it is in this function that the foraging ant metaphor, as introduced in [Dorigo et al, 91], is exploited.
Migration decision functions have the following forms:
pijk (t) = F(i,j,k,t) / 1k(i,j,t), R < R* (1)
= S(i,j,t) otherwise
where:
pijk (t) is the probability that the kth agent at node i will choose to migrate to node j at time t,
αkp, β are control parameters for the kth agent and pth chemicals,
1k(i,j,t) is a normalization term,
The intention of the migration decision function is to allow an agent to hill climb in the direction of
increasing concentrations of the chemicals that a particular agent can sense, either probabilistically
(equation (3) for F(i,j,k,t)) or deterministically (equation (4) for F(i,j,k,t)1). However, from time to time, a
random migration is allowed, this being the purpose of the function S(i,j,t). This is necessary, as the
network is likely to consist of regions of high concentrations of particular chemical messages connected by
regions of low or even zero, concentrations of the same chemicals. The addition of this random element
assists an agent in escaping from local minima.
4.1 Routing
The foraging behavior of ants and their use of pheromones for route reinforcement map easily and
naturally to the problem of route finding in networks. SynthECA routing agents use distinct chemicals for
particular point-to-point, point-to-multipoint and shortest Hamiltonian cycle routing tasks. Each routing
agent senses a routing chemical (r-chemical), a reliability chemical (R-chemical) and a quality of service
chemical (qos-chemical). Routing agents are sent out from source to destination(s), dropping a quantity of
r-chemical on the return path to the source node having discovered the destination. Path emergence is
considered to have occurred when the majority of the returning routing agents follow the same path (see
[White, Pagurek and Oppacher, 98] for more details and results). Once a route has emerged, an allocator
agent traverses the path and assigns resources to the connection. A quality of service sensing agent (qos-
agent) then monitors the end-to-end quality of the allocated connection. Several examples of the
exploitation of the foraging behavior of ants for routing have also been reported [Schoonderwoerd et al.,
97], [Bonabeau et al., 98], [Di Caro and Dorigo, 97].
4.3 Planning
The R-chemical in the previous section may be used to drive the planning process along with a
chemical resulting from network congestion (c-chemical). Arguably, the R-agent is an example of a
planning agent as it reacts to the synthesis of events (quality of service changes) over an extended period.
Congestion sensing agents (c-agents) circulate in the network, choosing to visit the least recently visited
adjacent neighbor as a migration strategy. They interact with (non-SynthECA) agents that measure the
utilization of resources on that device2 and drop a quantity of c-chemical in proportion to the utilization of
the device. Given that routing agents sense the r-chemical, and choose to avoid resources that are
unreliable, they are likely to cause increasing congestion because of unbalanced network usage. A planning
agent (p-agent) needs to identify regions of the network that are either high congestion or high unreliability
areas. They do so by sensing R-chemical and c-chemical concentrations and initiating the re-planning of a
region of the network for which a function of the two concentrations exceeds some threshold value.
Devices in networks are unreliable and agent loss must be tolerated if multi agent systems are to be
made to function reliably. As this paper has demonstrated, SynthECA agents can be made to sense a
number of chemicals. The fault location and planning agents of the previous two sections require that small
numbers of such agents circulate constantly in the network. Hence, given unreliable transport and devices,
we can expect agents to be lost.
We propose that two classes of agent # =
' 4 % /&( O , # =
' 4 % /&( O , share chemicals
in their emitters and receptors; i.e. ' 4 Ø and ' 4 Ø. One of the emitters of # is used to generate
a chemical that indicates when the agent was last at a given location. This same chemical is a member of
the receptor set of # . # uses the concentration of this chemical to decide whether a member of the #
class has visited a device "sufficiently frequently." Reactions on each device cause these chemicals to
evaporate at a given rate. If # reasons that the visit rate is too low, it spawns a new instance of class # that
then migrates autonomously. Similarly, when an instance of class # visits a device, it senses its "visit
frequency" chemical. If after performing whatever activity it is designed for it reasons that the visit
frequency is too high, it dies. Obviously, the above algorithm can be repeated with indices reversed thereby
leading to symbiotic fault tolerance for the two agent classes.
Simple extensions to multiple classes are possible.
5. Conclusions
We have proposed the exploitation of a number of ideas and principles from naturally occurring multi-
agent systems in this paper in order to provide support for mobile agents as a problem solving technique.
The essential characteristics of SynthECA agents are that they possess simple behaviors, reinforce and
modify each others’ actions through interaction with their environment by chemical messaging. Essentially,
chemical messages are symbols with state. Problem solving is emergent in that routing agents are not
explicitly told how to find a route and fault location agents are not instructed on network fault finding.
2
Presumably, they use a measurement agent such as a Simple Network Management Protocol (SNMP) agent.
The scenarios presented are simple, but compelling, and we believe that considerable insight can be
gained by experimental and analytical study of systems constructed using SynthECA agents.
Acknowledgements
We would like to acknowledge the support of the Communications Information Technology Ontario
(CITO) and the National Science and Engineering Research Council (NSERC) for their financial support of
this work.
Bibliography
[1] G. Beni and J. Wang, Swarm Intelligence in Cellular Robotic Systems, Proceedings of the NATO
Advanced Workshop on Robots and Biological Systems, Il Ciocco, Tuscany, Italy, 1989.
[2] G. Berry and G. Boudol, The Chemical Abstract Machine, Theoretical Computer Science, 96(1), pp.
217-248, 1992.
[3] E. Bonabeau, F. Henaux, S. Guérin, D. Snyers, P. Kuntz and G. Théraulaz, Routing in
Telecommunication Networks with Smart Ant-Like Agents. In Proceedings of the Second
International Workshop on Agents in Telecommunications Applications (IATA ’98), Lectures Notes in
AI vol 1437, Springer Verlag, 1998.
[4] A. Bieszczad, T. White, and B. Pagurek, Mobile Agents for Network Management. In IEEE
Communications Surveys, September, 1998.
[5] R. A. Brooks, Intelligence Without Representation, Artificial Intelligence, Vol. 47, pp. 139-159, 1991.
[6] Chess. D, Harrison C., and Kershenbaum A., Mobile agents: Are they a good idea? In Mobile Object
Systems: Towards the Programmable Internet, pages 46-48. Springer-Verlag, April 1997. Lecture
Notes in Computer Science No. 1222.
[7] G. Di Caro and M. Dorigo, AntNet: A Mobile Agents Approach to Adaptive Routing. Tech. Rep.
IRIDIA/97-12, Université Libre de Bruxelles, Belgium, 1997.
[8] M. Dorigo, V. Maniezzo and A. Colorni, The Ant System: An Autocatalytic Optimizing Process.
Technical Report No. 91-016, Politecnico di Milano, Italy, 1991.
[9] N.R. Franks, Army Ants: A Collective Intelligence, Scientific American, Vol. 77, 1989.
[10] D. Goldberg, Genetic Algorithms in Search, Optimization, and Machine Learning. Reading, MA:
Addison-Wesley, 1989.
[11] P. P. Grassè, La reconstruction du nid et les coordinations inter-individuelles chez Bellicoitermes
natalenis et Cubitermes sp. La theorie de la stigmergie: Essai d'interpretation des termites
constructeurs. In Insect Societies, Vol. 6, pp. 41-83, 1959.
[12] B. Hölldobler and E. O. Wilson, Journey to the Ants. Bellknap Press/Harvard University Press, 1994.
[13] M. M. Millonas, Swarms, Phase Transitions and Collective Intelligence, In Artificial Life III (ed. C. G.
Langton). Santa Fe Institute Studies in the Sciences of Complexity, Proc. Vol XVII. Reading,
Massachussetts: Addison-Wesley, 1994.
[14] G. M. P. O'Hare and N. R. Jennings (eds.), Foundations of Distributed Artificial Intelligence, ISBN 0-
471-00675-0, John Wiley & Sons, 1996.
[15] H. Van Dyke Parunak, Go to the Ant: Engineering Principles from Naturally Multi-Agent Systems, to
appear in Annals of Operations Research. Available as Center for Electronic Commerce report CEC-
03, 1998.
[16] G. P. Picco, A. L. Murphy and G-R. Roman, Lime: Linda Meets Mobility, Accepted for publication in
Proceedings of the 21th International Conference on Software Engineering (ICSE'99), Los Angeles
(USA), May 1999. Also available as Technical Report WUCS-98-21, July 1998, Washington
University in St. Louis, MO, USA.
[17] R. Schoonderwoerd, O. Holland and J. Bruten. Ant-like Agents for Load Balancing in
Telecommunications Networks. In Proceedings of Autonomous Agents ’97, Marina del Rey, CA, ACM
Press pp. 209-216, 1997.
[18] T. White and B. Pagurek, Towards Multi-Swarm Problem Solving in Networks. In Proceedings of the
Third International Conference on Multi-Agent Systems (ICMAS ’98), pp. 333-340, July, 1998.
[19] T. White, A. Bieszczad and B. Pagurek, Distributed Fault Location in Networks Using Mobile Agents.
In Proceedings of the Second International Workshop on Agents in Telecommunications Applications
(IATA ’98), pp. 130-141, July 4th-7th, 1998.
[20] T. White, B. Pagurek and F. Oppacher, Connection Management using Adaptive Agents. In
Proceedings International Conference on Parallel and Distributed Processing Techniques and
Applications (PDPTA’98), pp. 802-809, 12th-16th July, 1998.
http://www.ryerson.ca/~dgrimsha/courses/cps720/Resources/a2f2001/CreateSurvey.java
package cps720.assignment2;
import java.util.Random;
import java.io.*;
/*
* The question is of the form "How do your respond to this statement?
* <the statement>
* 1 = strongly disagree, 10 strongly agree. 5 no opinion.
*
* USAGE: java CreateSurvey <question> <dataFileName>
* (the question string is not stored.)
*/
private String theQuestion;
System.out.print(temp);
}
dos.close();
} catch(IOException ioe) {}
}
private int getRandEquiv(int aRating) {
float g, bigSD, newRating;
do {
g = (float) gauss.nextGaussian();
bigSD = g * STANDARDDEV;
newRating = bigSD + aRating;
} while (newRating < 1.0 || newRating > 10.0);
return Math.round(newRating);
}
package cps720.assignment2;
import ptolemy.plot.*;
import cps720.assignment2.util.Convert;
/**
* Uses PtPlot facilities to create a histogram from comma separated value
* (csv) strings.
* An example string is "3,9,15,20,15,8,2".
* To use this class, ptplot.jar must be in the CLASSPATH.
* Note also that the class cps720.assignment2.util.Convert must be
* available.
*/
public class SurveyHistogram extends Histogram {
this.csvHistogram = csvHistogram;
/*
* Displays the histogram.
*/
public void displayHistogram() {
// test
public static void main(String [] args) {
SurveyHistogram sh = new SurveyHistogram("3,4,5,6,5,4,3");
sh.displayHistogram();
}
The Exam Response (bubble) sheets will be handed out before the exam this year. It would be a good to
come 5-10 minutes before 9:00 so you can your sheet and the exam can be started on time.
Bring an HB pencil to the exam. This type works best on bubble sheets. A good eraser is nice (but dont't
second guess yourself). If you are paranoid about bubble sheets you can also circle answers on the exam
book. (But you must also fill out the bubble sheet.)
When writing your code, please use either an HB pencil or a pen. What I can't see, I can't mark :-).
The CPS720 exam consists of two parts. Part 1 consists of 15 multiple choice
questions, worth 2 marks each. Part 2 consists of 2 programming questions, one
for Aglets, one for JADE. They are worth 10 marks each.
The programming questions will be marked like essays, that is, without a detailed
marking scheme. Some syntax errors are to be expected and will not count against
you provided that they do not become too numerous.
The programs are both basic for each system. For the Aglet program there is
some code in the multiple choice section which should remind you of the
essentials. For the JADE program you might look at the following JADE
constructs:
BasicBehaviour, CyclicBehaviour, action(), setup(), done(), receive(), blockingReceive(), block(),
setPerformative(), getPefromative(), setContent(), getContent(), setName(), setType(), setSender(),
addReceiver(), addtServices(), ACLMessage.INFORM, ACLMessage.QUERY_REF,
ACLMessage.NOT_UNDERSTOOD, send(), doDelete(), addBehaviour(), getAID(),
DFService.register().
See the assignments and the examples. (Of course, assignments 2 and 3 are
considerably more complex.)
The multiple choice questions mostly cover general points discussed in the
course. They are based on the course notes. As you know the course notes have
plenty of links to more detailed and in depth materials such as PhD theses. These
links are for reference. Of course, the more you follow the more you know. The
lecture notes themselves represent the basic minimum.
This year's exam is somewhat similar to last year's exam. However last year's
course did not include JADE. On the other hand it covered XML in more detail
and also include Game Theory which is not on this year’s course.
c720ex2000.doc 1 11/23/01
PART 1. MULTIPLE CHOICE. 24 Marks.
(12 questions, 2 marks each. Answer all questions in this part on your test response
(bubble ) sheet.
A. A user on a client machine on a network does not know the location of a service she
is accessing.
B. References in Java are not visible to the programmer.
C. Programs written in C in such a distributed system are not allowed to use pointers.
D. Only Java may be used to write programs for systems exhibiting referential
transparency.
2. Ferber divides multi-agent systems into two broad categories, situated agents, and
communicative agents. Which of the following statements best describes the
difference between these two categories.
3. According to Oshima and Lange, which of the following properties is NOT essential
to an agent: reactive, autonomous, ability to learn, goal driven, temporally
continuous.
A. autonomous
B. temporally continuous
C. ability to learn
D. reactive
E. goal driven
4. One reason that agents that plan (look) ahead might be more useful that agents that
simply react to stimulants and remember certain states is:
A. They can test future states or situations without committing to them, avoiding costly
physical backtracking.
B. An agent which plans uses less memory than one that does not.
C. Agents which plan ahead can choose the right thing to do more quickly than those
that do not.
D. Planning agents can maximize the utility of their human masters using the methods
of Game Theory.
c720ex2000.doc 2 11/23/01
5. Which of the following best describe a mobile agent on the Net?
A. Present distributed systems (e.g. RMI, CORBA, DCOM), are just Remote Procedure
Calls (RPC). RPC’s are limited to UNIX systems and therefore are not suitable for
the Internet which has many different kinds of servers.
B. Present distributed systems attempt to extend the Inter Process Communication
(IPC) paradigm which is well matched to single von Neumann machines where
processes share memory. But in distributed systems, memory is not shared.
C. Referential transparency is impossible to achieve because only copies of objects
can be sent across networks. Therefore, in this respect, local programs and
distributed programs can never appear to be the same to the user.
D. The basis of the mismatch is the failure to use mobile agents. With mobile agents,
referential transparency can be achieved.
7. In addition to the Aglet itself, the Aglet system provides an Aglet proxy. What is the
main reason for adding a proxy class to the system, rather then just having only the
Aglet class itself?
package exam;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.io.*;
c720ex2000.doc 3 11/23/01
try {
pw = new PrintWriter(new FileWriter(file));
pw.println(md.getMsg());
pw.close();
} catch(IOException e) {}
}
});
}
}
class MyData {
private String msg;
public MyData(String m) {
setMsg(m);
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
This Aglet code is compiled and the resulting class file loaded into a Tahiti Server.
Using the server’s Dispatch command, an attempt is made to move it to a second Tahiti
server. Which of the following statements best describes what happens?
A. The Aglet goes to the second Tahiti server and writes the “Hello world” string to the
file system of the machine hosting the second Tahiti server.
B. The Aglet goes to the second Tahiti server where it throws a security exception
because it does not have the appropriate write permissions.
C. The Aglet refuses to move from its home server because the PrintWriter object is not
serializable.
D. The Aglet refuses to move from its home server because the data it is carrying is not
serializable.
9. In the Sequential Itinerary pattern the Aglet’s mobility (its movement among servers)
is handled by a separate class, rather than being handled by the Aglet class itself.
What advantage does this separation confer?
A. Flexibility. For example, different itineraries could be “plugged into” the same Aglet.
B. Portability. The Aglet can run on more types of servers.
C. Speed. Because the Aglet does not have to handle its travel plans, it can move more
quickly from one server to another.
D. Security. The separation of the itinerary from the task for an Aglet increases security
of the Aglet system.
10. Supplying a DTD with an XML document allows the parser to,
c720ex2000.doc 4 11/23/01
C. Check the validity of an XML document.
D. Create a DOM from the document.
11. There are two standard parsers for XML, DOM and SAX. Which of the following
statements best describes the main difference between these parsers?
A. A DOM parser converts the XML text document into a tree structure stored in
memory. The SAX parser generates events from the XML document and by default
stores nothing at all.
B. A DOM parser generates events and stores in memory whatever parts of the XML
document the programmer chooses. The SAX parser creates a data structure in
memory and then generates events from each node in that structure.
C. There is no significant difference from the programmer’s point of view. The SAX
parser uses events to generate a tree data structure corresponding to the original
XML document. The DOM parser generates the same kind of tree structure but is
not event driven.
D. The DOM parser always uses a DTD whereas with the SAX parser you do not have
to use a DTD except under special circumstances.
12. The Prisoner’s Dilemma is a very famous example from Game Theory. Which of the
following statements best describes its significance.
A. It shows that cooperation can never be achieved because people are too selfish.
B. It shows that cooperation can be achieved if the parties are prepared to take the
chance of being “suckered”.
C. It demonstrates that restaurants in tourist areas are of lower quality than
neighbourhood restaurants because tourists never come back.
D. It explains why Communism lost the Cold War.
1. Discuss why use of mobile agents might, in some situations, reduce network traffic
compared to other methods used to construct distributed systems.
2. There are at least three ways of arranging data and knowledge in distributed
systems, client-server, code on demand (e.g. Applets), and mobile agents. Compare
these three systems, briefly.
3. Speech Act theory divides the generation of speech into three steps (intention,
generation, synthesis), and divides the decoding of speech into four steps
(perception, analysis, disambiguation, incorporation). Briefly explain (or define) any
six of these steps.
4. Interpreting this table as the payoff matrix for a zero sum game with three strategies
for each player, answer the following questions. (The Row player wants the highest
possible score, the Column player wants the lowest possible score.)
c720ex2000.doc 5 11/23/01
8 4 5
3 7 6
5 6 10
A. If the players played pure strategies (using minimax and maximin) what would they
be for each player?
B. Should they stick with the pure strategies found in part A, or should they follow a
mixed strategy? Explain your answer.
Write an XML document which is valid according to this DTD. Include at least one
screwdriver of type, philips. Use any names (or descriptions) you like for the objects in
the toolbox. You can start your XML file with,
<?xml version="1.0"?>
<!DOCTYPE toolbox SYSTEM "toolbox.dtd">
1. Write an Aglet which is to be dispatched from your Tahiti server to a remote Tahiti
server. On the remote server a stationary Aglet is running. This Aglet has put a
property named “prof” in its context. The value of this property is the proxy for this
Aglet. Your Aglet, on arriving at the remote site sends a message “hello” to the
stationary Aglet. The “hello” message contains a String object saying, “All is well”.
The stationary Aglet replies with a message named “response” containing a String
object saying “Message received”. When your Aglet receives this message, it should
dispose of itself. Otherwise it should do nothing.
You do not need to create a “master” Aglet for your server. Just assume you
dispatched your Aglet using the dispatch button on your Tahiti.
c720ex2000.doc 6 11/23/01
http://www.ryerson.ca/~dgrimsha/courses/cps720/Resources/DGa2.jar
Human Agents
Another way to get at what the word, agent, means, we can try to see what characteristics human agents
have in common.
Try making a list of characteristics.
Other animals
Is a dog an agent? An ant? If these are agents too, then what does that acknowledgement add to our
understanding of agency
Some suggestions
Machines
Computer scientists have also taken to the word, agent. The AI community took it up first, but agents are
now appearing in the context of networks and simulations.
Of course, the most obvious AI agent artifact is the robot. Robotics is one of the oldest branches of AI.
Take CPS607!
Classic AI
Recent textbooks in artificial intelligence [Nilsson], [Russell & Norvig], use the idea of agency as a
unifying theme. AI agents are usually individual 'creatures' living in an environment with which they
interact in some way. Such agents are autonomous to a more or less extent. Most AI agents do not
interact with other agents in the same environment. And, they are supposed to have some kind of
intelligence.
Although many AI agents exist only in software, the AI agent paradigm is best illustrated by the robot
interacting with a real world environment.
Distributed AI (DAI)
DAI has existed for many years. Practitioners of DAI consider that Intelligence cannot exist in isolation.
These people hold that intelligence is, in some way, fundamentally social.
The systems of DAI usually consist of a small group of specialist
agents which cooperate to solve problems. This model imitates the In 19th century Germany a child
way teams of human specialists work together. was left to die in the forest But he
grew up by himself (helped by
The classic example of DAI architecture is the so-called blackboard wolves?) and later was found and
brought back to civilization. He was
system, first developed in the 1970's in a system called Hearsay given the name Kaspar Hauser. A
which was used for speech recognition. large number of books have been
written about this case. And also
In the blackboard model the agents are called knowledge sources. there are at least two films .
The "blackboard " is a global memory accessible to all the agents. It
contains the current state of the problem. Actions by the agents
gradually modify the data structures on the blackboard so that
(hopefully) they come to represent the solution state of the problem.
The
"blackboard"
is a metaphor.
Agents
communicate
with one
another by
"writing on the blackboard" as humans might do in
a brainstorming session.
Also of considerable importance is inter-agent communication. Most Internet agents have more or less
elaborate message passing mechanisms. Intelligence for Internet agents is not a particularly high priority,
Network agents must be small if they are going to be mobile. The cannot afford to travel with the
baggage of a large AI program.
So What is an Agent?
Next we consider three different points of view on what constitutes an agent. Click next to continue.
Definition of Agent
Note that agents are capable of acting, not just reasoning. Actions affect the environment which, in turn,
affects future decisions of agents.
Autonomy
A key property of agents is autonomy. They are, at least to some extent, independent. They are not
entirely pre-programmed but can make decisions based on information from their environment or other
agents.
One cans say that agents have "tendencies". Tendencies is a deliberately vague term. Tendencies could be
Mobility
It is interesting that Ferber does not include mobility as a possible property of agents. Lange and Oshima
do discuss this property, which although optional, certainly characterizes some agent systems.
It is interesting to note that in the natural world, agent intelligence is always associated with agent
mobility (animals). Other living things (plants) have no intelligence.
Multi-Agent Systems
The term multi-agent system (MAS) is applied to systems comprising the following elements.
1. is situated in an environment,
2. is driven by a survival/satisfaction function,
3. possesses resources of its own in terms of power and tools,
4. is capable of perceiving its environment (but to a limited extent),
5. has practically no representation of its environment,
6. possesses skills,
7. can perhaps reproduce,
8. has behaviour tending to fulfill its survivor/satisfaction function, taking into account
the resources, perceptions and skills available to it.
A purely communicating agent is distinguished from the concept of agent in general because,
● It has no perception of other agents
● It does not act in a normal, spatial environment, but rather in a computer network.
A purely situated agent do not usually communicate directly, via messages. They react to one another via
preceptors (sensors) and through changes to the environment.
Aglets, which are discussed later in the course are communicating agents (for the most part). JADE agents
are also primarily communicative. Ascape agents, which live on a cellular automaton, are more like
situated agents, although they exist only in a software world.
Agent Perspectives
Today there appear to be two groups using the concept of agent as important tool for designing and
implementing software. The first is the Artificial Intelligence community. The second is the Internet
community.
Agents and AI
Classic AI
Recent textbooks in artificial intelligence [Nilsson], [Russell & Norvig], use the idea of agency as a
unifying theme. AI agents are usually individual 'creatures' living in an environment with which they
interact in some way. Such agents are autonomous to a more or less extent. Most AI agents do not
interact with other agents in the same environment. And, they are supposed to have some kind of
intelligence.
Although many AI agents exist only in software, the AI agent paradigm is best illustrated by the robot
interacting with a real world environment.
Distributed AI (DAI)
DAI has existed for many years. Practitioners of DAI consider that Intelligence cannot exist in isolation.
These people hold that intelligence is, in some way, fundamentally social.
The systems of DAI usually consist of a small group of specialist
agents which cooperate to solve problems. This model imitates the In 19th century Germany a child
way teams of human specialists work together. was left to die in the forrest. But he
grew up by himself (helped by
The classic example of DAI architecture is the so-called blackboard wolves?) and later was found and
brought back to civilization. He was
system, first developed in the 1970's in a system called Hearsay given the name Kaspar Hauser. A
which was used for speech recognition. large number of books have been
written about this case. And also
In the blackboard model the agents are called knowledge sources. there are at least two films .(1 and 2
The "blackboard " is a global memory accessible to all the agents. It and 3).
contains the current state of the problem. Actions by the agents
gradually modify the data structures on the blackboard so that
(hopefully) they come to represent the solution state of the problem.
The
"blackboard"
is a metaphor.
Agents
communicate
with one
another by
"writing on the blackboard" as humans might do in
a brainstorming session.
System perspective
An agent is a software object that
● is situated within an execution environment
❍ Reactive: senses changes in its environment and acts according to those changes
What is an Agent:
An agent is an encapsulated computer system that is situated in some environment and that is
capable of flexible, autonomous action in that environment in order to meet its design objectives
For clear understanding of the definitions, several points must be further elaborated.
Agents are:
● clearly identifiable problem-solving entities with well defined boundaries and interfaces.
● situated (embedded) in a particular environment; they receive inputs related to the state of their
environment and they act on the environment through effectors.
● designed to fulfill a specific purpose; they have particular objectives (goals) to achieve.
● autonomous; they have control both over their internal state and over their behaviour.
● capable of exhibiting flexible problem solving behaviour in pursuit of their design objectives; they
need to be both reactive (able to respond in timely fashion to changes that occur in their
environment) and active (able to act in anticipation of future goals).
According to Parker the most compelling argument for Agent Based Modeling (ABM) can be summed
up as follows: Why don't we model it as it is in the real world?
It basically means that ABM is useful because it offers us a possibility to create models that do away
with generalisations and allow us to explore the world through discrete objects and their interactions.
This by itself allows for a far richer modelling context.
Comment by D.G.
Nikolic's view of agents seems derived from the idea of agents as representatives (or servants) of people,
for example, travel agents. Although autonomous with regard to how to carry out a task, the task itself is
generated outside the agent (by another agent).
On the other hand, Ferber's definitions are more general, with more emphasis on autonomy. In some
ways, Ferber derives his concept of agent from the animal world. His agents are more independent
minded.
Nikolic's perspective is that of a modeller of natural systems. His thesis uses the Ascape agent system to
model the spread of genetically modifed seeds.
[previous] [next]
Rational Agents
[From AI a Modern Approach by Russell & Norvig.]
A siituated agent and its environment is shown schematically in this diagram:
This is a robot, a situated agent. Of course there also softbots in virtual worlds.
Situated agents are the type most often considered in AI. But communicating
(internet) agents have a lot in common with situated agents as we saw before.
Rational Agency
The agent 'examines' its environment and the takes 'appropriate' action.
● A rational agent does the right thing. It carries out its task successfully.
Or, at least, takes actions which, given its knowledge of its environment,
maximizes its chances of success.
To judge an agent's effectiveness you need some kind of performance measure.
Agent autonomy
Artificial Intelligence is concerned with so-called autonomous agents.
● Deterministic agent. The robots used in automobile manufacture on assembly lines would be an
example of a totally non-autonomous, deterministic robot. These are of little interest in AI.
● An autonomous agent (?). Chess playing programs could be considered to be autonomous agents.
The good ones can easily outplay the programmers who made them. The best are as good as the
best human players.
A Dictionary definition
[Merriam-Webster]
Main Entry: au·ton·o·my
Function: noun
Inflected Form(s): plural -mies
Date: circa 1623
1 : the quality or state of being self-governing; especially : the right of self-government
2 : self-directing freedom and especially moral independence
3 : a self-governing state
[top] [previous] [next] Questions?
An Agent Classification
Russell & Norvig classify agents into 4 categories, from least to most complex.
These agents react to immediate stimuli. They have no memory at all. The
percept sequence is just the immediate environment sensed by the agent's sensors.
Nevertheless, they are capable of behaviour of considerable complexity,
especially if they are part of a Multi-Agent system.
These agents are also referred to as stimulus-response agents [Nilsson]. We look
at this type of agent in more detail later.
Note the "condition-action rules" in the diagram. These are production rules.
These agents have a memory of state. They can remember earlier experiences.
These can be combined with current information from sensors to produce a more
sophisticated response to the environment.
Goal based agents can plan ahead before making their actual 'move' in their
environment. They use various more or less sophisticated search methods to
search a state space of potential future environments, as a chess player might do
in his head before actually moving a piece. Future potential 'positions' are
evaluated as to how close they are to the goals of the agent.
At this level agents have acquired human aspects. Utility is an economic term
(from micro economics) related to the concepts of happiness and personal
preferences. This level of ability is beyond the present capabilities of present AI.
[top] [previous] [next] Questions?
Stimulus-Response Agents
[This is Nilsson's term. They are equivalent to Russell & Norvig's basic reactive agents.]
These agents, although very simple, are capable of surprisingly complex behaviour. One is reminded of the
behaviour of certain simple living forms such as insects.
We discuss these agents in some detail in order to make our discussion of agents more concrete, less abstract.
These notes use Nilsson's example from chapter 2 of Artificial Intelligence, a New Synthesis.
To keep things simple there are no "tight spaces". For example, the alcove in the wall in the middle of the
diagram is two squares wide, not one.
Robot sensors
The robot can sense if any of its neighbouring 8 cells are free. The sensor inputs are represented by 8 binary
values, s1 .. s8. These have values 0 if the corresponding cell can be occupied by the robot on its next move (free
cell), and 1, otherwise. For example, if the robot is on the square marked X, then its sensors input (0, 0, 0, 0, 0, 0,
1, 0).
Robot effectors
The robot can move North(up), East(right), South(down), or West(left), (but not diagonally) into an empty square.
If the target square is occupied (part of a wall), nothing happens.
The goal
Specify a function which maps from the robots sensor inputs to effector actions appropriate for its tasks or goals.
The design
It is common to divide the design into two parts.
● Perceptual processing phase. The sensory inputs are mapped to a feature vector
● Action processing. The effector actions are a function of the feature vector.
This division into two phases is arbitrary. One criterion for the division is to put the mapping from common
features to common actions into a reusable library.
It turns out that the feature vector needs only 4 components, x1 .. x4 which take boolean values. The values are
illustrated in this diagram.
Recognizing these features in its environment allows the robot to achieve wall following behaviour.
Consider x1. x1 has value 1 if s2 = 1 and s3 = 0 or s2 = 0 and s3 = 1 or s2 = 1 and s3 = 1.
Features to Actions
Given the features, we need to map them to appropriate actions.The mapping is,
● If x1 = 1 and x2 = 0 then move east
There are many ways of representing these action functions. Two very popular ways are:
● Production rules
● Neural networks
where the c's are conditions and the a's are actions. The c's are conjunctions which evaluate to true or false. The
interpreter goes down the list in order to find the first rule who's condition is true, and then "fires" that rule's
action part, in other words, executes that rule's action part.
The production rules from features to actions for the wall following robot example are
x4 & ~x1 -->north
x3 & ~x4 --> west
x2 & ~x3 --> south
x1 & ~x2 --> east
1 --> north
These rules cause the robot to go to one of the walls and then follow the walls for ever, either clockwise or
counter-clockwise depending on its initial condition.
A variation might be a robot that goes to a corner and stays there. To implement this we would need a corner
detecting feature, call it c. Then we could have production rules
c --> no-action
1 --> b-f
Where b-f refers to the boundary (i.e. wall) following procedure described by the five rules given earlier.
Here the environment is still represented by feature vectors but now the robot
remembers its previous state, its previous feature vector and action, as well as
using the features currently presented by its environment.
Role of memory
Note that the wall-following robot without the sensory impairment managed to
achieve its behaviour without memory of previous inputs, features or actions.
If all of the important aspects of the environment can be sensed at the time the
agent needs to know them, there is no reason to retain a model of the environment
in memory. But sensory abilities are always limited in some way, and thus agents
equipped with stored models of the environment will usually be able to perform
tasks that memoryless agents cannot.
[top] [previous] [next] Questions?
Agent Environments
Two approaches to representing environments for situated agents
● feature based representations
● iconic representations
Feature representation
The wall (boundary) following agents discussed previously use a feature based
representation of their environments. Sensory inputs are converted directly to
features which in turn are used to choose actions.
Iconic representation
The other popular approach is called by Nilsson, iconic representation. The name
iconic implies some sort of picture, or model of the environment. The
environment is simulated in the agent which then extracts features from the
simulation. The simulation is updated as sensory information comes in.
The robot "slides" down the potential "hill" from where it is to the goal, G.
Virtual Agents
Internet agents have attracted some attention recently. Their environments are
servers. Compared to the real world where robots must exist, these virtual
environments are simpler. But they are not toy environments. Such environments
look promising as hosts for useful agents.
The rest of the course concerns mobile agents on the Internet.
[top] [previous] [next] Questions?
Centralized Model
In the centralized model, web pages (text) are brought down and searched to create a database indexing URLs with keywords. Yahoo, AltaVista
keep these huge databases and are continually updating them. You can get your own such programs, such as WebFerrat (a free one) and build
your own personalized web keyword/URL database.
Even thought these programs are called WebCrawler, WebSpider, WebFerrat, name which makes them sound like mobile agents, they are
actually static. The pages (or at least their HEAD part) do the moving. The search engines are immobile.
The result is lots of network traffic.
Distributed Model
This is also a static model. This time however, local databases of keyword/URL indices are created on each server which p rovides the
corresponding web pages. Then the central database is made by merging the databases from all the servers.
The result is less network traffic.
The problem is coordinating all the local search engines. This is the "legacy problem".
In the CORBA/RMI case the client knows methods or procedures on the server which can be invoked remotely. These procedures are
pre-installed and are not changed dynamically at run time.
● Lots of network traffic generated by the calls
These are very similar to those discussed in Lange & Oshima's book.
You can compare these points with Oshima & Lange's chapter 2. There are notes on this site based on the book.
● Some notes on agents
In his lecture, Donszelmann contrasts agents which travel from place to place with a batch program which goes to one place and runs only there.
Summary
State
The agent must carry sufficient state information with it to resume execution when it moves from one
host to another.
An agent's state is a snapshot of its execution.
● Execution state. Includes the program counter and the execution stack.
● Object state. values of instance variables of the agent object.
Java does not allow access to the execution stack so when an Java agent such as an Aglet moves from
one host to another, it loses its execution state. (Even if it could keep this information, it would prove
useless if the next host was a different type of platform from the host just vacated.)
However, usually the information needed to resume the computation can be kept in the object's instance
variables (for example, partial or intermediate results of a calculation). The saved information can be
used as initial values in the resumed calculation.
Implementation
Of course an agent, being a computer program, needs code.
● A mobile agent can get its code in 3 ways,
Interface
The agent's interface allows other agents and systems to interact with it.
Such an interface could provide
Identifier
A unique name which is unchangeable throughout its lifetime.
Principals
These are the humans responsible for the agent's actions. Oshima & Lange suggest a division of
responsibilities.
● Manufacturer. The author of the agent.
● Owner. This person has the moral and legal responsibility for the behaviour of the agent.
Places
Lange and Oshima call the environment provided by the network hosts for the agent to operate in, a
place. In the Aglet world, a place is called a context. Places should be safe places both for the agents and
their hosts!
The place is a kind of operating system for the agent.
There are at least 4 aspects to a place
● Engine. the "workhorse" and virtual machine for one or more places. For aglets, this is the JVM.
● Resources. databases, processors, and other services provided (or not!) by the host.
● Location. The network address of a the place. The IP of the host, and a port on which the place
awaits agents.
● Principals. those legally responsible for the operation of the place. As for the agent, there are two
principals.
See also the CERN course notes on places.
The agent
This is a piece of software which has its own thread of execution. Having a
separate thread gives it a certain autonomy from its operating environment. A
mobile agent is able to "close up shop" on one host, and pack itself off to another.
The environment
On the Net an agent's environment consists of a server program running in a
process,
This server provides a "sandbox" which secures the host computer from possibly
malicious visiting agents.
On the positive side, the environment can allow the visiting agent to access the
host in a controlled way. Therefore the agent's environment usually consists of
the server plus certain parts of the host system.
"Sensors"
The Internet agent's "sensors" are just methods which it can call to read
information from the server or the host.
"Effectors"
Similarly the "effectors" of the internet agent are also methods which write to the
environment, or cause methods of the environment to be executed. The agent
normally interacts with its server, but with permission can also interact with the
host file system, or database, for example.
Note that the concepts of effectors and sensors are rather artificial when applied to Internet agents. They
really belong in the world of situated agents.
Inter-agent communication
In addition to sensing/effecting their environments, most Internet agents also have
some means of communication among one another. Often, a group of agents
collect at one server and interact by sending each other messages, either directly,
of via the environment provided by the server.
Of course, it is also possible for the agents to stay at their home location and send
messages to one another over the Net.
Agent Mobility
When one talks of Agents on the Net, one quite often means mobile agents.
Mobility confers a number of possible advantages, according to Lange & Oshima
(p. 3).
The moral is, sometimes it is better to bring the computation to the data, than to
bring the data to the computation.
An example: Weather forecasting calculations
A server has a database with gigabytes of real time data. Other people at other
locations might want to do analysis of the data. To copy the data to their sites
would take a lot of time and bandwidth. It would be better to encapsulate the
required calculations in an agent, send it to the original site, do the calculations
there, and return the results.
Another example: Searching for a particular document on the Web
Assume there is some criterion for success, not just the title, possibly a string, or
several strings. Suppose you know it is on one of 1000 web sites, some of which
have gigabytes of documents.
You could do the following,
For each web site
For each document
Download the document
Search document using the criterion
If found, stop and inform the user.
This method could take "forever", and clog the Net with hordes of up-needed
documents.
With a mobile agent system you could do the following instead:
Clone 1000 identical search agents
For each agent
Move each agent to a target site
For each document on each target site
Search document using the criterion
If found, send document to user and self destruct
With the rise of mobile computing, the problem of disconnects, either by choice,
or accident, becomes increasingly important. An agent sent from a mobile
computer is autonomous. The sender can disconnect. The agent does its work at a
remote host, and then waits. Whenever the mobile user is ready, she reconnects
and retracts the agent with its result. There need be no synchronization between
the connection and the computation.
A practical difference
As Jeff Nelson points out, the autonomy of agents comes at a price. The agents
must be provided with a "playpen", the "sandbox", at each host. That is, each host
must have a server to provide an environemnt for the agents.
Furthermore, an API must provided to go with the agent and its environment. The
agent is only as powerful as the API provides sufficient methods. In other words,
the agent's "effectors" and "sensors" are predefined in the API. This reduces
flexibility.
Mobile objects are just objects. Their use requires no special servers or API. They
have no autonomous behaviour at all. They are just building blocks, along with
ordinary objects of object oriented distributed systems.
Nelson asks what use agents would be in building a complex point of sale internet
site.
Comment
● While not a point of sale internet site, the case study discussed in Todd Papiaoannou' s PHD
Thesis shows a complex set of business rules implemented in an agent system using Aglets.
● Jeff Nelson's mobile objects are sometimes refrerred to as "code on demand". Code on demand is
certainly a useful paradigm. Applets are an example.
● A deeper discussion is in chapter 2 and 3 of Papiaoannou where he compares mobile agents with
other forms of distributed computing, basing his discussion on the perceived importance or
unimportance of location. A summary discussion of this point is in the next section of these notes.
Network Computing
Paradigms
Where do mobile agents fit into network computing? Lange and Oshima suggest
the following. paradigms, from the perspective of the software developer.
● Client-Server
● Code on demand
● Mobile Agents
These diagrams refer to "know-how" and "resources:. Know-how is the code that
enables the services provided by the system, i.e., access to the resources. This is
the knowledge in the system. The resource in question is often a database of some
sort which supports the services.
Client-Server Paradigm
server side. The client usually just has a web browser which displays HTML
forms to be filled out by the user.
This model gives more power to the client side. Java Applets are the classic
example of this paradigm. Active code is downloaded to the client. Consequently,
the client shares some of the know-how. Knowledge is more distributed than in
the original client-server model.
Code on demand has developed far beyond Applets. One hears of ASP's, Application Service Providers,
as well as ISP's. An interesting implementaion of this technology with Java is Sun's Java Web Start.
Here the watchword is flexibility. Any host on the network can have any
combination of know-how, resources and processing ability. An Agent based
network is a kind of peer to peer network.
Location Transparency
What is location transparency. In a distributed system it is the idea that the resources accessed by a user
can be anywhere on the network without the user having any idea where the resource is located. A file
could be on the user's own PC, or thousands of miles away on another server, for example. The user
would access it in the same way. Sun Microsystems slogan, "The network is the computer" sums this
idea up. Many modern distributed systems illustrate location transparency. Consider, for examples,
Java RMI, CORBA, or Microsoft's DCOM.
Or do they have problems, not just implementation problems, but fundamental architectural problems.
Todd Papaioannou thinks they do.
An Architectural Mismatch
The question arises, why might making location important in the design of distributed systems be better
than hiding location, making it appear invisible, transparent? Todd Papaioannou offers the following
explanation.
The mobile agent paradigm brings us closer to the successful IPC abstraction. IPC is well matched to the
Von Neumann machine architecture using, as it does, shared memory and files for (local)
communication. Mobile agents emphasize, as much as possible in a distributed system, local interactions.
Once settled in on a server, the mobile agent can take advantage of IPC.
[See diagram on p. 51 (63) Structuring Distributed Systems]
Of course the mobile code still must move, at least once in a while, and must also send messages across
the net. With these activities mobile agents run into some of the same problems as RPC based distributed
systems. But the problems are reduced since network traffic is usually reduced. And the agent (or its
programmer) has more choice, choice on whether to stay put, or move. In principle this decision can be
based on dynamic local and network conditions, and on the resources available at servers.
But to do all this, the agent has to know where it is and where it can go to. In short, it needs to know
about location explicitly. This is just the opposite of current distributed systems.
Whether Todd Papaioannou is right to say that mobile agents have significant architectural as advantages
over current "immobile agents" remains to be seen.
● ln -s /software/aglets/public/com
(The second link allows the use of IBM extensions in the com.ibm.agletx directory - see below.)
Find the line aglet.public.root, and change it to point to your public directory.
Examples
Aglets On NT or Win95/98,ME,2000
The Aglets 2.0 release has some features which make setting up the Aglet Server (Tahiti) much easier than
before. You download the version 2.0 zip file from SourceForge and unzip it.
Bundled with Aglets is Apache's ant program. This is a Java replacement of a makefile. To configure the
installation, just go to the bin directory and type, ant. Among other things, ant creates the security files
.java.policy and .keystore. You can also use ant to put these in the right place. Just type ant install-home.
To bring up the Tahiti server with the configuration prodcued by ant, type (in the bin directory),
agletsd -f ..\cnf\aglets.props
The server will run on default port 4434.
Example 1.
The simplest example is examples.simple.DisplayAglet. It is useful to check if the Aglet system is set up
correctly. You load ithe Aglet into Tahiti using the Create button. Notice the fully qualified names for Aglets.
Set up another Tahiti (or have a friend do so) and use the Dispatch button to send the Aglet to the other Tahiti
server. In the list displayed by the Dispatch button, enter the URL of the other server. (Don't forget that the
protocol is atp, not http!)
The Aglet should disappear from your Tahiti and turn up at the other one.
Then use the Retract button to bring your Aglet back home.
Example 2. HelloAglet
The HelloAglet is dispatched from one Tahiti server to another where it says "Hello, world", and then returns
to its origin to be disposed of.
1. Assuming you have set up your directory structure as above, make a hello subdirectory in the examples
directory and copy the file /software/Aglets1.1b3/examples/hello/HelloAglet.java into it.
2. cd into your aglets directory (the parent directory of the examples directory) and compile the HelloAglet,
javac examples/hello/HelloAglet.java.
3. Create two Tahiti servers listening on different ports. You need to first open xterm or command windows
for each server. For example, on jupiter (Solaris) type xterm &. With my setup I could then type,
agletsd -f myaglets.props and agletsd -f myaglets.props -port 8888. The first command sets up Tahiti
to listen on the port specified in the property file. (You must be running X Windows on solaris (or
Linux), or Win 95/98/NT. The HelloApplet will not work with the command line version of Tahiti.)
4. In one of theTahitis, click the Create button. From the list that appears, select examples.hello.HelloAglet
and click the Create button. A line in the Tahiti window notifies you that the Aglet is present.
5. A pop up window also appears. In its Address field type in the address of the other Tahiti server. For
example, atp://jupiter.scs.ryerson.ca:9000, or atp://localhost:9000. You can add this address to the
address list if you wish.
6. Finally, click the go button. The aglet should dispatch to the other Tahiti window where it prints out
"Hello, world". It stays there for a few seconds and returns to its origin Tahiti where it prints out "I'm
Example 3. CirculateAglet.
This aglet travels from Tahiti server to Tahiti server collecting information at each stop. It finally returns to its
origin server and prints out what it has learned to stdout (an xterm or command window). You will have to
modify the supplied code to have the addresses of available servers.
1. In your examples directory, create a subdirectory called itinerary. Then copy all the files from
/software/Aglets1.1b3/examples/itinerary into it. These files belong to the package examples.itinerary.
2. Using your favourite editor edit the file CirculateAglet.java. Locate the three "addPlan" methods.
Change only the first two of these. If you have the same Tahiti servers running as in example 1, change
the address in one of these addPlans, to say, atp://localhost:9000, and the other to
atp://proton.scs.ryerson.ca. You might also replace the getProxy() with a second getLocalInfo() which
produces more interesting information.
3. Because the code is in a package, examples.itinerary, cd back to the parent directory of examples
(directory aglets in my case) and compile with the command javac examples/itinerary/*.java. (This
also compiles another example in the package.)
4. In the origin Tahiti window (the one that is not listening on port 9000 in our examples), create the
itinerary aglet using the Create button and selecting examples.itinerary.CirculateAglet.
5. The Tahiti window shows that the CirculateAglet is loaded. Select it and then click the Dialog button. A
window pops up showing the places the Aglet will visit.
6. Click the Start! button. The Aglet appears briefly in the other Tahiti window on your machine and then
takes off for proton.scs.ryerson.ca. It returns to its original window. Iif you look in the corresponding
xterm window you should see some properties of the machines it visited. You can dispose of the
returned aglet by selecting it in the Tahiti window and clicking the dispose button.
SCS NT labs
Aglets are not set up in these labs. Use Xwin32 and run on jupiter.
Linux
Setting up should be the same as on NT. Just unzip the distribution and run ant. I did find one problem. The ant
file I had was a DOS type file with CR as well as LF as line terminators. I had to remove the CR's before ant
would work.
● Proxy. Represents the aglet. Protects the aglets's public method. Provides location transparency for the aglet. The
aglet's proxy does not move.
com.ibm.aglet.AgletProxy
● Context. The aglet's place or environment. Provides services for the aglet and protects the host from malicious
aglets. Contexts are named, and thus can be located by their host, port and name.
com.ibm.aglet.AgletContext
Fundamental Operations
● Creation. The aglet is loaded into a context. It is initialized and immediately begins execution.
● Cloning. A second way of creating an aglet in a context. An aglet already there is copied. The clone has its own
identifier and starts running at once. Threads are not cloned so the cloned aglet stops executing.
● Dispatching. Moves the aglet to a new context. Its thread does not go with it. Upon arrival it starts running in a
new thread from its starting point. (The Java instruction pointer position cannot be remembered.)
● Retraction. Recalls an aglet from its present context to the context and inserts it into the context from which the
retraction call was executed.
● Activation/Deactivation. An aglet can be stopped and temporarily transferred (serialized) to disk. After a
certain time the aglet can be activated again into the same context.
● Disposal. Gets rid of the aglet and allows the Java garbage collector to remove its remains.
● Message. A message is an object exchanged between aglets. The basic message mechanism is synchronous. The
sender waits for a reply. There is also a simple asynchronous mechanism, the one way message, when no reply is
needed.
● Future Reply. It is also possible to have asynchronous messages when a reply is needed. The sender carries on
while waiting for a reply in the future.
Aglet Mobility
The Aglet system emphasizes mobility. Although it supports inter-aglet messaging, as it must, the
message support is much less elaborate than some other systems such as JADE.
● dispatch()
The Tahiti server also implements dispatching and retracting so the easiest way to move an Aglet is to
create it in Tahiti and then click the approriate buttons!
However, as mentioned in the section on remote messaging, the more usual arrangement is to have a
parent, stationary, Aglet which creates and dispatches child Aglets to remote locations. The parent can
also retract the children from these locations.
Dispatching
There are a number of versions of the dispatch() method
There are two methods. The most commonly used one is,
AgletProxy dispatch(java.net.URL url)
This method is usually called in one Aglet to dispatch another. The first aglet keeps track of the proxy of
the dispatched aglet.
Again there are two versions. The most commonly used is,
void dispatch(java.net.URL url)
This method allows aglets to dispatch themselves to a new location.
Retracting
There is only one method to do this.
● CloneEvent
● PersistencyEvent
Of these, the MobilityEvent is the most used. It is the only one covered in cps720.
To each of these there corresponds a method which must be implemented by any object listening for
● void onArrival(MobilityEvent). Called just after the aglet arrives at its destination, and
before its run() method is executed
● void onReverting(MobilityEvent). Called on the remote host just before the aglet
moves back to where is being retracted to.
Of these, the onArrival() method is used most often.
These methods belong to the MobilityListener interface. Because the MobilityListener interface is an
interface not a class, all three methods must be implemented by any class which implements the
interface. (You can get around this stipulation by using the MobilityAdapter class. This is discussed
later.)
MobilityEvent Methods.
The MobilityEvent class has two useful methods.
● AgletProxy getAgletProxy(). Returns the proxy of the aglet which generated the
mobility event.
● URL getLocation(). Gets the location (the server) where the aglet generated the event.
package cps720.mobile;
import com.ibm.aglet.*;
import java.net.*;
public class BasicMasterAglet extends Aglet {
public void onCreation(Object init) {
try {
AgletContext ac = getAgletContext();
URL homeBase = ac.getHostingURL();
AgletProxy mobileAgletProxy = ac.createAglet(null,
"cps720.mobile.BasicMobileAglet",
homeBase);
mobileAgletProxy.dispatch(new
URL("atp://jupiter.scs.ryerson.ca"));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Notes
● This example introduces three very important classes: Aglet, AgletProxy, and AgletContext.
● The onCreation() method is called by either the Aglet server (Tahiti) as here, or in response to a
createAglet() call, as in the case of the mobile agent.
● The Object argument of onCreation() allows the newly created Aglet to receive initial state
information. The Object referenced by 'homeBase', the third argument to the createAglet() method,
appears as the Object argument in the onCreation() method of the created Aglet. (See the
BasicMobileAglet below.)
● The getHostingURL() method belongs to the AgletContext class. There is also a method called
getAddress() which returns a String.
● If you look in the documentation you will see that many Aglet methods throw multiple exceptions.
You can cover all thses with the plain Exception class. On the other hand you may loose precision
doing this if you are debugging.
package cps720.mobile;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.*;
public class BasicMobileAglet extends Aglet {
private URL homeBase = null;
public void onCreation(Object initInfo) {
homeBase = (URL) initInfo;
addMobilityListener(new MobilityAdapter() {
Notes
● Notice how the home base address is passed to the mobile child agent from the master agent when
it is created.
● Using an anonymous inner adapter class is an important idiom when programming Aglets.
Exercise
This program writes the same message both when the mobile Aglet reaches the remote server and when
it retruns home. Suppose you wanted to write a different message when arriving home? How would you
do it? Also, how would you have the mobile Aglet dispose of itself after writing this return message?
Usage
This program works fine on simple lan (one subnet) or if the Aglet server can resolve the fully qualified
name of the servers (for example, jupiter.scs.ryerson.ca, not just jupiter). If this resolution fails, the
mobile Aglet cannot dispatch itself home. However, it can be retracted in such situation. If you have a
home PC you might try experimenting with this.
package cps720.mobile;
import com.ibm.aglet.*;
import java.net.*;
/**
* A parent stationary Aglet which launches a child mobile agent to
* another server.
* To run, change the target URL to something suitable for your
* system and recompile.
* See also BasicMobileAglet.java
* DG. Sept. 2001
*/
public class BasicMasterAglet extends Aglet {
"cps720.mobile.BasicMobileAglet",
homeBase);
mobileAgletProxy.dispatch(new URL(targetServer));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
package cps720.mobile;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.*;
/**
* A simple movile agent launched by BasicMasterAglet.
* This agent, once launched goes to the target server, writes a message
* and then dispatches itself back to the sender if possible (that is, if
* it has the fully qualified address of the sender host, including the
* domain.
* see also BasicMasterAglet.java
* DG. Sept. 2001
*/
public class BasicMobileAglet extends Aglet {
addMobilityListener(new MobilityAdapter() {
public void onArrival(MobilityEvent me) {
setText("Phew, arrived safely");
}
});
}
Remote Messaging
Aglets can exchange messages across the network. You can have fixed Aglets which interact this way.
Of course, then you no longer have a mobile agent system. Only data moves (the messages) not the code
(the agent).
Nevertheless, remote messaging is an integral part of the Aglet mobile agent system. A frequently used
pattern is to have an agent move to a remote host, do some intensive calculations, send the result back as
a message, and dispose of itself.
● Network latency
Network Latency
In other words, the Net can be slow. This may or may not matter too much but it could leave an Aglet
hanging, waiting for a reply to a message. The Aglet API provides the Future Message to do messaging
asynchronously and avoid hanging.
The pattern of one stationary Aglet sending another to a remote server is a common one. The stationary
Aglet is sometimes called the master, the mobile Aglet the slave, or parent and child.
The parent keeps track of the proxies and ID's of its children. Similarly, the children keep a record of the
parent's proxy and ID. Two way remote messaging becomes possible.
If the mobile, child Aglet can decide on its own to change its location, the problem of tracking comes up.
The parent may lose contact with the child. This can be a difficult problem.
The examples illustrating remote messaging also illustrate the various mobility mechanisms provided by
the Aglet API. Tor understand the examples, you need to know something about these mobillity
mechanisms. These are reviewed next.
Aglet class
● boolean handleMessage(Message)
This is a key method for receiving messages. Note that it returns a boolean. A return of true indicates that the message has been dealt with. A return of
false indicates that this aglet is ignoring the message.In other words, the aglet does not understand the message.
Message class
● boolean sameKind(String)
This method allows the receiving aglet to distinguish among messages the aglet wants to understand and respond to. Its argument is a message key to
be compared with keys of incoming messages.
● void sendReply (Object)
The easiest way to reply to a message is to use the Message object itself to carry a reply to the sender of the message.
import com.ibm.aglet.*;
import java.util.*;
● Message(String)
The simplest of the many overloaded Message constructors. There is no message value defined. The String argument is used to identify the message for
the sameKind() method in the receiver aglet. Can be used just as a notifier (as above), or with setArg(String, Object) to send a Hashtable message (see
below).
● Object sendMessage(Message)
Another important method. The object returned is a possible reply message from the receiver. There is also void sendOnewayMessage(Message) if you
are not interested in a reply, and the more complex, FutureReply sendFutureMessage(Message).
Message msg = new Message("Dave's Message", "Hello"); Message msg = new Meassge("answer", 42)
A simple example.
Inter-Aglet Communication
In multi-agent systems, inter-agent communication is an important topic. Aglets are no exception. The
Aglet API provides a number of communication mechanisms. However, Aglets provide only limited
support for message content. Content is just objects, usually strings or vectors of strings.
There are several ways for Aglets to communicate with other Aglets.
Messages fall into two categories, synchronous, and asynchronous. With the former, the sender waits for
a reply. With the latter, the sender goes on to something else while waiting for the reply, and then deals
with the reply when it comes in.
Local Messages
Example and Discussion
Remote Messages
Example and Discussion
Asynchronous Messages
Example and Discussion
SayItAglet.java
package aglets.mystuff.testtalk;
import com.ibm.aglet.*;
Aglet notes:
● The message is an array of Strings, for no particular reason, other than it is often useful to carry information with
your aglet in an String array or vector.
● The onCreation() method is analogous to the init() method of an applet. It is called once when the aglet is
constructed. You do not normally call the actual aglet constructor. Use create() to initialize your aglet if necessary.
Your version overrides the base version of create() in the Aglet class.
Java notes:
● It is a good idea to put your aglets in a package since they often contain multiple files. Packages are a bit tricky. See
the cps840 notes on packages, or the Java Tutorial.
AgletContext getAgletContext()
The aglet gets a reference to its current environment.
AgletID getAgletID()
The aglet knows its own "name" (a bignm).
HearItAglet.java
package aglets.mystuff.testtalk;
import com.ibm.aglet.*;
Aglet sayItAglet;
try {
sayItAglet = ap.getAglet();
} catch (InvalidAgletException iae) {
sayItAglet = null;
}
if(sayItAglet != null) {
String [] itSaid = ((SayItAglet)sayItAglet).getmsg();
setText(itSaid[0] + " " + itSaid[1]);
} else {
setText("Oops .. no Say It aglet here.");
}
Aglet Notes
● run(). Aglets run in their own threads. Therefore, like any other thread they are supplied with their own run()
method which you can override if you wish to. The run() method is only executed after the onCreation() method
returns. We just used the Aglet class version of run() in SayItAglet and overrode onCreation() for our own purposes.
In HearItAglet we do the reverse. It is important to note that when the aglet is dispatched to a remote context, the
run() method restarts from the beginning (after the onArrival() method is executed).
● You can use the Aglet class's setText() method to put simple one line messages on the Tahiti console. For
debugging simply use System.out.println() to direct output to the console.
● Note the sequence of actions. First the HearItaglet gets a reference to its context. Then it uses the getProperty()
method to get the ID left by the SayITAglet in the context. Now that it has the SayItAglet's ID, the HearITAglet can
get a reference SayItAglet's proxy. Using this reference we can get (a reference to) the aglet itself and use it to call
the public getmsg() method of the SayItAglet. The message appears in the Tahiti window.
Java Notes
● Exceptions. Java can throw many exceptions, especially the network code. Some of these, called "checked"
exceptions, must be caught (i.e.., dealt with), usually using the try/catch mechanism.
● try/catch scope. The scope of things declared in a try block is the try block alone. So, for example, if you were to
declare sayItAglet inside the try, you would get an undeclared variable error at the reference to sayItAglet after the
catch.
● try/catch and initialization. If you left the line sayItAglet = null out of the catch block, the code does not compile
because there is a possibility that sayItAglet would not be initialized when it is referenced in the line
if(sayItAglet != null) {. (The execution could go through the catch if getAglet() failed.) Of course,
you could just have Aglet sayItAglet = null; instead of Aglet sayItAglet; in the line above the
try.
SayItAglet2.java
This is even simpler than SayItAglet.java. It is created and then just sits there. Even though its thread finishes after
creation, it is not garbage collected.
package aglets.mystuff.testtalk;
import com.ibm.aglet.*;
HearItAglet2.java
This is more complicated than HearItAglet.java because of the need to determine which of the proxies one wants to deal
with.
package aglets.mystuff.testtalk;
import com.ibm.aglet.*;
import java.util.*;
Java Notes
● Enumeration interface. This interface is in the package java.util. An enumeration is a list which can be traversed
once, usually using a for loop as shown above. The two most important methods are
❍ boolean hasMoreElements()
❍ Object nextElement()
❍ Note that nextElement() returns a generic object which must be cast to the appropriate type before use.
● The Class class. Every Java class has a Class object associated with it which you can use to obtain information about
the class. The HearItAglet2 aglet shows a simple use of this Class. You can do all kinds of fun things with the class
Class when combined with the java.lang.reflect package. The method getClass() returns a Class object associated
with the Aglet object. The method getName() of the Class class gets the name of the HearAglet2 class as a string.
getName() returns the "fully qualified" name.
Enumeration getAgletProxies()
If you have the context, you can get references to all the proxies of the aglets "living" there. Of course, you need to know
how to use the Java Enumeration interface.
/**
* sayItAglet3.java
* Inter aglet communication.
* This aglet is perpared to receive a "Who are you?" message and reply to
* it.
*/
package aglets.mystuff.testtalk;
import com.ibm.aglet.*;
/**
* HearItAglet3.java
* This sends a message to SayItAGlet3
* You don't need to check which aglets receive the message, since those
* which do not understand the message do not reply.
* On the other hand, this is a waste of energy so it is probably a good idea
* to be selective anyway. (Below the selection method used in HearItAglet2 has been
* commented out.
* DG Sept. 99
*/
package aglets.mystuff.testtalk;
import com.ibm.aglet.*;
import java.util.*;
Remote Aglets
When Aglets are dispatched to remote sites they must be tracked. The mobile Aglets must also keep track of where their home
is. Furthermore, they may need to know enough location information to send messages anong one another.
Different mobile agent API's do this in different ways. The Aglet API has evolved over several years during which changes
have occurred in how Aglets are kept track of. It is not such a good idea to make Aglets too easy to track since a hostile aglet
might take control of your Aglet. Convenience vs. security is an old story on the Internet!
Several changes have been introduced in the Aglet API between versions 1.0 and 1.1. Both changes have been made for
reasons of security.
Significance
Both these methods were used to obtain a reference to the remote aglet's proxy. As you know, to do much with an aglet, you
need to have a reference to its proxy. The changes listed above eliminate two easy ways of getting a reference to a remote
aglet's proxy.
Version 1.1 of the aglet API has substituted other ways of contacting remote aglets. Section 7.3 of Oshima's and Lange's book
describes a basic aglet finder (p.126-130). A more sophisticated finder is included in the 1.1 package. See the documentation.
It is still possible to do useful messaging with remote aglets without using the finder. See the second example below.
The new version 1.1 response of the dispatch() method is illustrated by the following example from the book.
ProxyDispatchExample.java
/*
* @(#)ProxyDispatchExample.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
● After dispatching. The child proxy (called remoteProxy) is remote all right, but not valid. The aglet book on p. 171
claims that the remote proxy is valid. This would be true in version 1.0 but not version 1.1 of the aglet API.
URL getHostingURL()
● Gets the URL of the server serving this aglet context.
AgletProxy dispatch(URL)
● Sends the aglet represented by this proxy to a remote host. Returns the remote proxy of the sent aglet. However it seems
that the this remote proxy is invalid in version 1.1b1 of the aglet API. Note also that there is also a method void
dispatch(URL) belonging to the Aglet class which allows an aglet to dispatch itself to another location.
boolean isRemote()
Checks if a proxy is remote.
boolean isValid()
Checks if the proxy is usable.
● SayItAglet4. The remote aglet. Sends a message "I have arrived safely." when it arrives at a remote host. Replies to the
"Who are you?" message from the HearItAglet4.
● Master4. Creates HearItAglet4 and SayItAglet4 and dispatches the latter to the remote Tahiti server.
Master4.java
package aglets.mystuff.testtalk;
import com.ibm.aglet.*;
import java.net.*;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
Note.
This program implements a MobilityListener in the simplest way. Note that all three mobility listener methods must be
implemented even though only one onArrival() does anything.
What's new
In the MobilityListener interface
● void onArrival(MobilityEvent)
Executes on arriving at a destination. Completes before the run() method is restarted.
● void onDispatching(MobilityEvent)
Executes just before the aglet leaves for a remote destination.
● void onReverting(MobilityEvent)
Executes just after a remote aglet is told to revert to its place of origin.
HearItAglet4.java
package aglets.mystuff.testtalk;
import com.ibm.aglet.*;
import java.util.*;
AgletProxy ap = null;
/*
* @(#)ProxyDispatchExample.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
* INDIRECT CONSEQUENTIAL DAMAGES OR LOST PROFITS EVEN IF
* THE AUTHORS HAS BEEN ADVISED OF THE POSSIBILITY OF
* THEIR OCCURRENCE OR LOSS OF OR DAMAGE TO YOUR RECORDS
* OR DATA. THE AUTHORS WILL NOT BE LIABLE FOR ANY THIRD
* PARTY CLAIMS AGAINST YOU.
*/
package aglets.agletbook.chapter7;
import com.ibm.aglet.*;
import java.net.URL;
"aglets.agletbook.chapter7.ProxyDispatchChild",
null);
print("Finished creating the child.");
pause();
print("Proxy Valid: \'" + proxy.isValid() + "\'");
print("Proxy Remote: \'" + proxy.isRemote() + "\'");
print("Dispatching the child...");
String host = getAgletContext().getHostingURL().toString();
URL destination = new URL("atp://localhost:9000");
print("Destination is \'" + destination.toString() + "\'");
AgletProxy remoteProxy = proxy.dispatch(destination);
print("Finished dispatching the child.");
pause();
print("Proxy Valid: \'" + proxy.isValid() + "\'");
print("Proxy Remote: \'" + proxy.isRemote() + "\'");
print("Remote Proxy Valid: \'" + remoteProxy.isValid() + "\'");
print("Remote Proxy Remote: \'" + remoteProxy.isRemote() + "\'");
} catch (Exception e) {
print("Failed to create and dispose of the child.");
print(e.getMessage());
}
}
/*
* @(#)ProxyDispatchChild.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
* INDIRECT CONSEQUENTIAL DAMAGES OR LOST PROFITS EVEN IF
* THE AUTHORS HAS BEEN ADVISED OF THE POSSIBILITY OF
* THEIR OCCURRENCE OR LOSS OF OR DAMAGE TO YOUR RECORDS
* OR DATA. THE AUTHORS WILL NOT BE LIABLE FOR ANY THIRD
* PARTY CLAIMS AGAINST YOU.
*/
package aglets.agletbook.chapter7;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
package aglets.mystuff.testtalk;
import com.ibm.aglet.*;
import java.net.*;
}
catch (Exception e) {
System.err.println("various possible exceptions");
}
}
/**
* sayItAglet3.java
* Inter aglet communication.
* This aglet is perpared to receive a "Who are you?" message and reply to
* it.
*/
package aglets.mystuff.testtalk;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
/**
* HearItAglet4.java
* This sends a message to SayItAGlet3
* You don't need to check which aglets receive the message, since those
* which do not understand the message do not reply.
* On the other hand, this is a waste of energy so it is probably a good idea
* to be selective anyway. (Below the selection method used in HearItAglet2 has been
* commented out.
* DG Sept. 99
*/
package aglets.mystuff.testtalk;
import com.ibm.aglet.*;
import java.util.*;
_dir = (File)((Object[])args)[0];
_proxy = (AgletProxy)((Object[])args)[1];
addMobilityListener(
new MobilityAdapter() {
Future Replies
Asynchronous messages are supported by aglets. This allows, for example, a master aglet to continue with its work without
waiting for its slave to finish its task. In other words, the master aglet does not block while waiting for a message from the
slave.
import com.ibm.aglet.*;
"aglets.agletbook.chapter6.FutureChild",
null);
print("Finished creating the child.");
pause();
try {
print("Sends a message...");
// you could also use FutureReply sendFutureMessage(Message)
FutureReply future = proxy.sendAsyncMessage(new Message("Please reply"));
print("The message was sent.");
while (!future.isAvailable()) // Checks whether a reply is
available.
doIncrement(); // If not: do incremental
work...
String reply = (String)future.getReply(); // Gets the reply.
print("Got the reply: \'" + reply + "\'");
} catch (NotHandledException e) {
print("Failed to send the message.");
print(e.getMessage());
}
} catch (Exception e) {
print("Failed to create the child.");
print(e.getMessage());
}
}
void doIncrement() {
print("Working...");
shortPause();
}
public static String NAME = "Future";
private void print(String s) {
The child.
FutureChild.java
package aglets.agletbook.chapter6;
import com.ibm.aglet.*;
/*
* @(#)FutureExample.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
* INDIRECT CONSEQUENTIAL DAMAGES OR LOST PROFITS EVEN IF
* THE AUTHORS HAS BEEN ADVISED OF THE POSSIBILITY OF
* THEIR OCCURRENCE OR LOSS OF OR DAMAGE TO YOUR RECORDS
* OR DATA. THE AUTHORS WILL NOT BE LIABLE FOR ANY THIRD
* PARTY CLAIMS AGAINST YOU.
*/
package aglets.agletbook.chapter6;
import com.ibm.aglet.*;
"aglets.agletbook.chapter6.FutureChild",
null);
print("Finished creating the child.");
pause();
try {
print("Sends a message...");
FutureReply future = proxy.sendAsyncMessage(new Message("Please reply"));
print("The message was sent.");
while (!future.isAvailable()) // Checks whether a reply is
available.
doIncrement(); // If not: do incremental work...
String reply = (String)future.getReply(); // Gets the reply.
print("Got the reply: \'" + reply + "\'");
} catch (NotHandledException e) {
print("Failed to send the message.");
print(e.getMessage());
}
} catch (Exception e) {
print("Failed to create the child.");
print(e.getMessage());
}
}
void doIncrement() {
print("Working...");
shortPause();
}
/*
* @(#)FutureChild.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
* INDIRECT CONSEQUENTIAL DAMAGES OR LOST PROFITS EVEN IF
* THE AUTHORS HAS BEEN ADVISED OF THE POSSIBILITY OF
* THEIR OCCURRENCE OR LOSS OF OR DAMAGE TO YOUR RECORDS
* OR DATA. THE AUTHORS WILL NOT BE LIABLE FOR ANY THIRD
* PARTY CLAIMS AGAINST YOU.
*/
package aglets.agletbook.chapter6;
import com.ibm.aglet.*;
■ AgletContext
■ AgletProxy
■ Message
The AgletProxy is intended to shield aglets proper from outside scrutiny. For example, communication
via messages is handled by the aglet proxies.
The AgletContext provides an environment for the aglets. For example, the Tahiti server provides such
an environment. This environment is closed off from the host operating system (a "sandbox" as for
applets). Thus the host is protected from malicious aglets.
Basic Example
To introduce the most important concepts, consider this example. There are two aglets, BasicMaster and
BasicChild. The user sets up two Tahiti servers. (In the example, one at default port 4434 and the other at
9000. On the 4434 Tahiti, the user creates BaseMaster. In turn, BaseMaster creates BaseChild and
dispatches it to the 9000 Tahiti. On arriving, the child sends a messsage to the master saying it has
arrived. The master responds to this message by retracting the child back to the 4434 Tahiti. The master
does not move.
Here is BasicMaster. Important Aglet items are shown in bold red.
/** BasicMaster.java
*
*/
package aglets.mystuff.basic;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.URL;
Notes on BasicMaster
● Aglets can find out where they are using the method getContext() of the Aglet class.
● The method createAglet() belongs to the AgletContext class. It takes three arguments:
❍ The codebase of the aglet beiing created. Use null for aglets created from local code, that is,
classes in a subldirectory of AGLET_PATH. (or, see aglets.class.path entry in the .props
file).
❍ The fully qualified name of the aglet class (without the .class extension) as a string.
❍ A reference to an Object which the aglet system will pass as argument ot the created aglet's
onCreation() method. Null if you do not wish to pass anything to the child.
● The child is given the master's proxy so it can send the master messages from a remote location.
● Note that the master aglet remembers the child's ID for use in the retractAglet() method.
● The handleMessage() ands sameKind() methods are the standard way of receiving messages.
Here is the mobile agent BasicChild.
/** BasicChild.java
*
*/
package aglets.mystuff.basic;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
} else {
setText("Home, sweet home.");
}
}
}
Notes on BasicChild
● To send a message back to the aglet that created it, BasicChild needs to know the proxy of its
master. This is passed to it via the argument to the important message onCreation(). (onCreation()
belongs to the Aglet class.)
● run() is available to all aglets because they run on separate threads. run() is executed after
onArrival() if onArrival() exists. It is always executed "from the top" at each stop the aglet makes
because Java cannot save the complete state of the computation (i.e., the instruction pointer cannot
be saved).
● You need some kind of switch to distinguish arrivals at a remote host from arrivals "back home".
The if(athome) ... statement, above, takes care of this in this example.
● Messages are most often sent with the sendMessage() method because a reply is usually expected.
In this case, sendOnewayMessage() is used because a reply is not expected, and, in fact, causes a
crash.
/** BasicMaster.java
*
*/
package aglets.mystuff.basic;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.URL;
"aglets.mystuff.basic.BasicChild",
masterProxy);
childID = childProxy.getAgletID();
childProxy.dispatch(target);
} catch (Exception e) {}
}
public boolean handleMessage(Message msg) {
if(msg.sameKind("arrived")) {
System.out.println("Received message");
try {
getAgletContext().retractAglet(target, childID);
} catch (Exception e) {
System.err.println(e.toString());
}
return true;
}
return false;
}
}
/** BasicChilld.java
*
*/
package aglets.mystuff.basic;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.URL;
BoomerangAglet.java
package aglets.mystuff.boomerang;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
BoomerangItinerary.java
package aglets.mystuff.boomerang;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.URL;
if(atOrigin(mev.getLocation()) == false) {
// this test always returns false if the
// sender is the default port 4434 !?
// Bug in beta 1.1 ?
System.out.println(mev.getLocation().toString());
try {
target.dispatch(new URL(origin));
}
catch (Exception e) {}
}
}
}
}
package aglets.mystuff.boomerang;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
package aglets.mystuff.boomerang;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.URL;
if(atOrigin(mev.getLocation()) == false) {
// this test always returns false if the
// sender is the default port 4434 !?
// Bug in beta 1.1 ?
System.out.println(mev.getLocation().toString());
try {
target.dispatch(new URL(origin));
}
catch (Exception e) {}
}
}
Aglet Cloning
The Aglet API provides a cloning facility for Aglets. This is actually a second way to create new Aglets -
by making copies of already existing Aglets. Cloning can be useful if parallel processing is needed.
The only diffrence between an Aglet and its clone is that they have different AgletID's (which means that
their proxies are not quite the same).
Creating clones
There are various clone() methods to do this.
A Cloning Example
This example prints out the names of 7 clones created from one original. Notice how the clone code is
separated from that of the original. All 8 Aglets have their own threads.
CloneExampleAglet.java
The code:
package aglets.cloneexample;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.util.*;
/**
* Illustrates cloning. 7 clones are created and survive 2 seconds.
*/
public class CloneExampleAglet extends Aglet {
boolean isClone = false;
private Vector dwarfs;
private String dwarfName = null;
dwarfs.addElement("grumpy");
dwarfs.addElement("sneezy");
dwarfs.addElement("happy");
dwarfs.addElement("bashful");
dwarfs.addElement("doc");
addCloneListener(new CloneAdapter() {
public void onClone(CloneEvent ce) {
isClone = true;
}
} );
}
public void run() {
if(!isClone) {
for(Enumeration e = dwarfs.elements();
e.hasMoreElements();) {
dwarfName = (String) e.nextElement();
try {
clone();
} catch(Exception ex) {
System.err.println(ex);
}
}
} else {
System.out.println("HiHo, HiHo .. I'm " + dwarfName);
setText("HiHo, HiHo .. I'm " + dwarfName);
pause(2000);
dispose();
}
}
package aglets.cloneexample;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.util.*;
/**
* Illustrates cloning. 7 clones are created and survive 2 seconds.
*/
public class CloneExampleAglet extends Aglet {
boolean isClone = false;
private Vector dwarfs;
private String dwarfName = null;
addCloneListener(new CloneAdapter() {
public void onClone(CloneEvent ce) {
isClone = true;
}
} );
}
public void run() {
if(!isClone) {
for(Enumeration e = dwarfs.elements(); e.hasMoreElements();) {
dwarfName = (String) e.nextElement();
try {
clone();
} catch(Exception ex) {
System.err.println(ex);
}
}
} else {
System.out.println("HiHo, HiHo .. I'm " + dwarfName);
setText("HiHo, HiHo .. I'm " + dwarfName);
pause(2000);
dispose();
}
}
Aglet Patterns
Master-Slave Pattern
This is the simplest design pattern. Design patterns are discussed under the following headings.
● Definition
● Purpose
● Applicability
● Participants
● Collaboration
● Consequences
● Implementation
Definition
A pattern where a master can delegate a task to a slave.
Purpose
A task is split between two computers. A parallel process is possible. While the slave is away doing its task, the master can
continue with its task. The slave usually sends the result of its taks back to the master.
Applicability
parallleism is needed
the master needs to get something done on another machine
Participants
● Abstract slave
● Concrete slave
● Master
Collaboration
The master-slave participants cooperate as follows:
1. A master aglet creates a slave aglet
2. The slave initializes its task
3. The slave moves to a remote host and executes its task.
4. The slave sends the result of its task to the master
5. The slave disposes itself
Consequences
The constant parts of the design are separated from the variable parts. The constant parts need only be implemented once, and
developers can concentrate on the variable point.
Implementation
(Aglet book, chapter 8)
The implementation is built aound a foundation abstract class: (called Slave.java in the textbook).
Slave1.java
package aglets.agletbook.chapter8;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.*;
package aglets.agletbook.chapter8.MySlave;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.*;
package aglets.agletbook.chapter8;
import com.ibm.aglet.*;
import java.net.URL;
import java.util.*;
"aglets.agletbook.chapter8.MySlave",
args);
print("Finished creating the child.");
} catch (Exception e) {
print("Failed to create the child.");
print(e.getMessage());
}
}
public boolean handleMessage(Message msg) {
if (msg.sameKind("Result"))
print("Received a result: \'" + msg.getArg() + "\'");
return true;
}
static public String NAME = "MyMaster";
private void print(String s) { System.out.println(NAME + ": " +
s); }
private static long SLEEP = 3000;
private void pause() { try { Thread.sleep(SLEEP); } catch
(InterruptedException ie) { } }
}
A typical ouput on the home server would be:
MYMASTER: STARTING ----------------------
MYMASTER: Creating the child ...
MYMASTER: Finished createing the child.
MySlave: Intitializing ...
MyMaster: Received a result: 'Some result ...'
/*
* @(#)Slave1.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
* INDIRECT CONSEQUENTIAL DAMAGES OR LOST PROFITS EVEN IF
* THE AUTHORS HAS BEEN ADVISED OF THE POSSIBILITY OF
* THEIR OCCURRENCE OR LOSS OF OR DAMAGE TO YOUR RECORDS
* OR DATA. THE AUTHORS WILL NOT BE LIABLE FOR ANY THIRD
* PARTY CLAIMS AGAINST YOU.
*/
package aglets.agletbook.chapter8;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.*;
/*
* @(#)MySlave.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
* INDIRECT CONSEQUENTIAL DAMAGES OR LOST PROFITS EVEN IF
* THE AUTHORS HAS BEEN ADVISED OF THE POSSIBILITY OF
* THEIR OCCURRENCE OR LOSS OF OR DAMAGE TO YOUR RECORDS
* OR DATA. THE AUTHORS WILL NOT BE LIABLE FOR ANY THIRD
* PARTY CLAIMS AGAINST YOU.
*/
package aglets.agletbook.chapter8;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.*;
/*
* @(#)MyMaster.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
* INDIRECT CONSEQUENTIAL DAMAGES OR LOST PROFITS EVEN IF
* THE AUTHORS HAS BEEN ADVISED OF THE POSSIBILITY OF
* THEIR OCCURRENCE OR LOSS OF OR DAMAGE TO YOUR RECORDS
* OR DATA. THE AUTHORS WILL NOT BE LIABLE FOR ANY THIRD
* PARTY CLAIMS AGAINST YOU.
*/
package aglets.agletbook.chapter8;
import com.ibm.aglet.*;
import java.net.URL;
import java.util.*;
Itinerary Pattern
(chapter 8)
Definition
This pattern objectifies trips of aglets to multiple destinations
Purpose
Responsibility for navigation is off loaded from the aglet itself to an associated itinerary object. This separation of the
navigation control from the aglet proper increases flexibility. The same itinerary can be plugged into different aglets. Or aglets
can be given different types of itinerary without having to modify the aglet's own code.
Applicability
Use this pattern when
● You want to hide the aglet travel plan from its behaviour in order to promote modularity.
Participants
● Abstract Itinerary. Defines a model for an itinerary with two abstract methods, go() and hasMoreDestinations().
● ConcreteItinerary. Implements the abstract methods of the Itinerary class and keeps track of the current destination of
the aglet.
● Aglet. The aglet following the itinerary.
The aglet and itinerary must be connected. The aglet creates the itinerary and initializes it with,
1. A list of destinations to be visited sequentially
2. A reference to the aglet.
The aglet uses the itinerary's go() method to dispatch itself, and its companion itinerary object.
Collaboration
● The ConcreteItinerary object is initialized by the aglet.
● The ConcreteItinerary object dispatches the aglet to the first destination.
● When the aglet invokes the itinerary's go() method, it is dispatched to the next destination.
Consequences
The pattern supports variations in navigation. For example, by changing the failure to dispatch exception handling, various
behaviours can be generated when the destination is not available. Such changes will not require the aglet itself to be modified.
Different aglets can also be made to share travel plans as embodied in itinerary objects.
Implementation
The three participants in this pattern are implemented in 3 files:
● Itinerary.java
● SeqIntinerary.java
● ItinerantAglet.java
package aglets.agletbook.chapter8a;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.*;
import java.util.*;
"aglets.agletbook.chapter8a.ItinerantAglet",
new SeqItinerary(origin,
destinations));
} catch (Exception e) {
print("Failed to initalize the itinerary.");
print(e.getMessage());
}
}
static public String NAME = "ParentItinerantAglet";
void print(String s) { System.out.println(NAME + ": " + s); }
}
Note how the travelling aglet, ItineraryAglet, is created knowing the home proxy of its parent, and carrying a list (Vector) of
package aglets.agletbook.chapter8a;
import com.ibm.aglet.*;
import java.net.*;
import java.io.*;
● Go is overloaded. The go(URL) just invokes dispatch to move the aglet to its next destination. The go() with no
arguments is more general, and can be used recursively. It is implemented to control the whole journey.
SeqItinerary.java
package aglets.agletbook.chapter8a;
import com.ibm.aglet.*;
import java.net.*;
import java.io.*;
import java.util.*;
package aglets.agletbook.chapter8a;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.*;
import java.util.*;
}
}
);
print("Going...");
_itinerary.init(this);
} catch (Exception e) {
print("Failed to initalize the itinerary.");
print(e.getMessage());
}
}
static public String NAME = "ItinerantAglet";
void print(String s) { System.out.println(NAME + ": " + s); }
}
Notes.
● Remember that parts of this code is executed on the home server, and parts at various servers on the trip. The parts in
onArrival() are executed on remote sites in this case. (If the travelling aglet returned home, onArrival() would execute
there too.) The line _Itinerary.init(this) is executed on the home server.
● The aglet code is very simple. To put itself in motion it just has to execute the lines highlighted by the different colour.
● To make the aglet do something, we need to combine the itinerary pattern with the master slave pattern. This is quite
easy to do.
/*
* @(#)Parent.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
* INDIRECT CONSEQUENTIAL DAMAGES OR LOST PROFITS EVEN IF
* THE AUTHORS HAS BEEN ADVISED OF THE POSSIBILITY OF
* THEIR OCCURRENCE OR LOSS OF OR DAMAGE TO YOUR RECORDS
* OR DATA. THE AUTHORS WILL NOT BE LIABLE FOR ANY THIRD
* PARTY CLAIMS AGAINST YOU.
*/
package aglets.agletbook.chapter8a;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.*;
import java.util.*;
/*
* @(#)Itinerary.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
* INDIRECT CONSEQUENTIAL DAMAGES OR LOST PROFITS EVEN IF
* THE AUTHORS HAS BEEN ADVISED OF THE POSSIBILITY OF
* THEIR OCCURRENCE OR LOSS OF OR DAMAGE TO YOUR RECORDS
* OR DATA. THE AUTHORS WILL NOT BE LIABLE FOR ANY THIRD
* PARTY CLAIMS AGAINST YOU.
*/
package aglets.agletbook.chapter8a;
import com.ibm.aglet.*;
import java.net.*;
import java.io.*;
/*
* @(#)SeqItinerary.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
* INDIRECT CONSEQUENTIAL DAMAGES OR LOST PROFITS EVEN IF
* THE AUTHORS HAS BEEN ADVISED OF THE POSSIBILITY OF
* THEIR OCCURRENCE OR LOSS OF OR DAMAGE TO YOUR RECORDS
* OR DATA. THE AUTHORS WILL NOT BE LIABLE FOR ANY THIRD
* PARTY CLAIMS AGAINST YOU.
*/
package aglets.agletbook.chapter8a;
import com.ibm.aglet.*;
import java.net.*;
import java.io.*;
import java.util.*;
/*
* @(#)ItinearntAglet.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
* INDIRECT CONSEQUENTIAL DAMAGES OR LOST PROFITS EVEN IF
* THE AUTHORS HAS BEEN ADVISED OF THE POSSIBILITY OF
* THEIR OCCURRENCE OR LOSS OF OR DAMAGE TO YOUR RECORDS
* OR DATA. THE AUTHORS WILL NOT BE LIABLE FOR ANY THIRD
* PARTY CLAIMS AGAINST YOU.
*/
package aglets.agletbook.chapter8a;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.*;
import java.util.*;
Note that each time the slave does its task at a server, it immediately sends the result back a s a message to its master.
Slave2.java
package aglets.agletbook.chapter8a;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.*;
initializeTask();
addMobilityListener(
new MobilityAdapter() {
print(e.getMessage());
}
}
}
);
itinerary.init(this);
} catch (Exception e) {
print("Failed to create slave.");
print(e.getMessage());
}
}
abstract void initializeTask();
abstract Object doTask();
package aglets.agletbook.chapter8a;
import com.ibm.aglet.*;
import java.net.URL;
import java.util.*;
getAgletContext().getAgletProxy(getAgletID());
Object[] args = new Object[] { itinerary, thisProxy };
getAgletContext().createAglet(getCodeBase(),
"aglets.agletbook.Slave2",
args);
print("Finished creating the child.");
} catch (Exception e) {
print("Failed to create the child.");
print(e.getMessage());
}
}
public boolean handleMessage(Message msg) {
if (msg.sameKind("Result")) {
print("Received a result: \'" + msg.getArg() + "\'");
return true;
}
return false;
}
static public String NAME = "MyMaster1";
private void print(String s) { System.out.println(NAME + ": " +
s); }
private static long SLEEP = 3000;
private void pause() { try { Thread.sleep(SLEEP); } catch
(InterruptedException ie) { } }
}
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="Adobe PageMill 3.0 Win">
<TITLE>Aglet Patterns - Mater-Slave</TITLE>
<link rel="stylesheet" href="cps.css">
</HEAD>
<BODY BGCOLOR="#ffffff">
<UL>
<LI>Definition
<LI>Purpose
<LI>Applicability
<LI>Participants
<LI>Collaboration
<LI>Consequences
<LI>Implementation
</UL>
<H2>Definition</H2>
<H2>Purpose</H2>
<H2>Applicability</H2>
<P>parallleism is needed</P>
<H2>Participants</H2>
<UL>
<LI>Abstract slave
<LI>Concrete slave
<LI>Master
</UL>
<H2>Collaboration</H2>
<OL>
<LI>A master aglet creates a slave aglet
<LI>The slave initializes its task
<LI>The slave moves to a remote host and executes its task.
<LI>The slave sends the result of its task to the master
<LI>The slave disposes itself
</OL>
<H2>Consequences</H2>
<P>The constant parts of the design are separated from the variable
parts. The constant parts need only be implemented once, and developers
can concentrate on the variable point.</P>
<H2>Implementation</H2>
<P><A HREF="sourceCode/patterns/masterSlave/Slave1.java">Slave1.java</A></P>
<P><A HREF="sourceCode/patterns/masterSlave/MySlave.java">MySlave.java</A></P>
<PRE><B><CODE><FONT COLOR="#ff0000">package
aglets.agletbook.chapter8.MySlave;</FONT></CODE></B>
<B><CODE><FONT COLOR="#ff0000">import com.ibm.aglet.*;</FONT></CODE></B>
<B><CODE><FONT COLOR="#ff0000">import com.ibm.aglet.event.*;</FONT></CODE></B>
<B><CODE><FONT COLOR="#ff0000">import java.net.*;</FONT></CODE></B>
<P>A master aglet at home creates the concrete slave and sends
it off to do its thing.</P>
<P><A HREF="sourceCode/patterns/masterSlave/MyMaster.java">MyMaster.java</A></P>
<DL>
<DD>MYMASTER: STARTING ----------------------
<DD>MYMASTER: Creating the child ...
<DD>MYMASTER: Finished createing the child.
<DD>MySlave: Intitializing ...
<DD>MyMaster: Received a result: 'Some result ...'
</DL>
<P> </P>
<P> </P>
<P> </P>
<P>
</BODY>
</HTML>
/*
* @(#)Slave2.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
* INDIRECT CONSEQUENTIAL DAMAGES OR LOST PROFITS EVEN IF
* THE AUTHORS HAS BEEN ADVISED OF THE POSSIBILITY OF
* THEIR OCCURRENCE OR LOSS OF OR DAMAGE TO YOUR RECORDS
* OR DATA. THE AUTHORS WILL NOT BE LIABLE FOR ANY THIRD
* PARTY CLAIMS AGAINST YOU.
*/
package aglets.agletbook.chapter8a;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import java.net.*;
/*
* @(#)MyMaster1.java
*
* (c) Copyright Danny B. Lange & Mitsuru Oshima, 1998
*
* THIS ROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE WARRANTY OF NON-INFRINGEMENT AND THE WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* THE AUTHORS WILL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
* BY YOU AS A RESULT OF USING THIS SAMPLE PROGRAM. IN NO
* EVENT WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
* INDIRECT CONSEQUENTIAL DAMAGES OR LOST PROFITS EVEN IF
* THE AUTHORS HAS BEEN ADVISED OF THE POSSIBILITY OF
* THEIR OCCURRENCE OR LOSS OF OR DAMAGE TO YOUR RECORDS
* OR DATA. THE AUTHORS WILL NOT BE LIABLE FOR ANY THIRD
* PARTY CLAIMS AGAINST YOU.
*/
package agletbook;
import com.ibm.aglet.*;
import java.net.URL;
import java.util.*;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import com.ibm.agletx.util.*;
slaveTrip.addPlan("atp://localhost:9000");
slaveTrip.addPlan("atp://localhost:9001");
slaveTrip.addPlan("atp://localhost:9002");
slaveTrip.addPlan("atp://localhost:9003");
slaveTrip.addPlan("atp://localhost:9004");
slaveTrip.startTrip();
}
public void run() {
.
if(slaveTrip.atLastDestination()) {
try {
parent.sendOnewayMessage(new Message("finished", "At last stop"));
} catch(Exception e) {
System.out.println("Message failed");
}
finally {
dispose();
}
}
}
}
}
}
● The SeqItinerary and SlaveItinerary classes provide a number of useful methods. Note also the Task class
which has only one method, void execute(SeqItinerary). As you can see, you don't actually call this yourself.
● The SlaveItineray class is smart enough to skip unavailable destinations automatically.
● Another useful class in the agletx.util package is the SeqPlanItinerary class. See the documentation.
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import com.ibm.agletx.util.*;
getCodeBase(),
"aglets.mystuff.chapter8c.ItinerantAglet3",
this.getProxy());
} catch (Exception e) {}
addMobilityListener(new StopDispatch());
}
}
}
}
This class also shows a simple way to keep an aglet immobile.
/**
* ItinerantAglet.java
* Uses the agletx.util package classes, SeqItinerary, SlaveItinerary, and Task.
* Compare this to the methods in Chapter 8 of Lange and Oshima.
* This aglet is created by Parent3 aglet in Parent3.java.
* ItinerantAglet goes to the hosts listed below, prints a message on each. At the
* last host in the trip it also sends a string message back home.
* DG. Oct. 99
*/
package aglets.mystuff.chapter8c;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import com.ibm.agletx.util.*;
slaveTrip.startTrip();
package aglets.mystuff.chapter8c;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import com.ibm.agletx.util.*;
try {
slaveAgletProxy = getAgletContext().createAglet(
getCodeBase(),
"aglets.mystuff.chapter8c.ItinerantAglet3",
this.getProxy());
} catch (Exception e) {}
addMobilityListener(new StopDispatch());
}
Aglets as Agents
Earlier in these notes we discussed Russell and Norvig's agent classification scheme and looked at
Nilsson's reactive wall following robot agent. How do aglets fit into these AI pictures?
Aglets live in an environment provided by the Tahiti servers. Aglets have sensors and effectors, which
are various methods provided by the aglet API. Among these are:
Sensors
● Object getProperty(String). A method of the AgletContext class which the aglet can access by
calling getContext()
● Various methods of the Reader and InputStream classes and their subclasses, with the permission
of the Tahiti server security manager.
● boolean handleMessage(Message). A method of the Aglet class which allows an aglet to detect
messages sent by other aglets.
Effectors
● void setProperty(String, Object). This method allows the aglet to change its immediate
environment.
● Various methods of the Writer and OutputStream classes and their subclasses, with the permission
of the Tahiti server security manager.
● Object sendMessage(Message). Allows the aglet to effect the behavioiur of other aglets. There aer
several variations on this method supplied by the API.
The basic aglet is a reactive agent with state. It has the added feature of mobility, and thanks to the
Internet, the ability to influence remote environments as well as local ones.
KQML in InfoSleuth
Here is an excerpt from the paper, Nigel Jacobs and Ray Shea, The Role of Java in InfoSleuth:
Agent-based Exploitation of Heterogeneous Information Resources. Click here for the whole original paper.
InfoSleuth is an experimental multi-agent system. The system is shown in Figure 3 below.
5 Query Views
Query views are database applications implemented as Java applets which can be used to retrieve and
manipulate data from the network. Query views take advantage of the core capabilities that Java has to offer.
Query view applets are written on top of a query API layer which provides an abstract, high-level method for
modifying ontologies, constructing queries against the ontologies, executing the queries, and retrieving the
results. The underlying functionality of the API is actually carried out by the agent network; in essence, the API
is a wrapper to the query implementation provided by the network of query agents.
Query views can implement either general purpose or domain-specific metaphors for query construction and
data visualization. The viewer server, which maintains the repository of query views, can fulfill requests for
query view applets based on the desired functionality and the ontology or domain model which the query view
supports. When the user selects a domain (or ontology) and a task or set of tasks he wishes to accomplish, the
user agent retrieves the necessary set of applets for accomplishing this from one or more viewer servers on the
network, and allow the user to load and use these applets, then discard them.
This is a very powerful paradigm. With Java, we have extended the notion of using a network of agents to find
and retrieve data, and now use that same network of agents to dynamically find, retrieve, and load the proper
GUI applets for interacting with that data, based on the task domain and qualities of the data itself. In a sense,
we are automating the software distribution process using the same techniques with which we are automating
the data retrieval process.
One can think of the InfoSleuth network as a cloud of agents (Figure 3), through which data passes back and
forth between users and data resources. All communication within this cloud is conducted by means of KQML
and high-level ontologies. The user interacts with data resources (the existence of which may be unknown at the
time requests are made) by passing requests into the cloud via his personal user agent, with which he
communicates via Java applets. At the other end, a data resource (for example, an Oracle database) accepts
requests from the cloud via its own resource agent, which translates the KQML/ontology-based query into the
query language understood by the local resource (for example, SQL).
The user agent is the user's intelligent gateway to the network of InfoSleuth agents. As such, it is primarily
responsible for handling requests from the user via Java applets, routing those requests to appropriate server
agents, and passing responses back to the user. The user agent is persistent and autonomous, thus it is able to
maintain the user's context beyond a single browser session, allowing long-term autonomous data retrieval and
other tasks to continue in the user's absence. It is capable of storing information (data and queries) for the user,
maintaining a user model, and can act as a resource for other agents, for instance as a means of sharing
information with other user agents. The user agent is implemented as a stand-alone Java application.
6.2 Monitor
● · accept Java applets via the user agent and place them in the proper directories so that they can be
accessed by the user. (See Section 9, "Security Concerns").
This agent is closely tied to the user agent, and like it, is implemented in Java.
The broker agent acts as a matchmaker which pairs requests from agents to other agent services that can fulfill
that request. As agents come on line, they can advertise their services to the broker via KQML. Any agent can
ask the broker for a recommendation on how to fulfill a particular request, and the broker will respond with the
addresses of the agents that have advertised that service. Possible future capabilities for the broker include
delegation (i.e., "passing the buck"), and subscription, allowing requesting agents to subscribe to various kinds
of information, enabling asynchronous notification when the desired resources become available. The broker is
a Java application.
The ontology server is responsible for managing the creation, update and querying of multiple ontologies. KIF
is used both to query the ontologies and to express the query results. Ontologies may be imported and exported
in KIF and several other representation languages. Different ontology formats (e.g., relational or object database
schema, entity-relationship models) are described via ontology meta-models. Ontologies may be nested, and
references may be made between ontologies. The ontology server maintains internal consistency. Many
ontology servers may be deployed, with each server advertising the ontologies it maintains via the broker
agents. The server is currently implemented as a Java application.
The execution agent is responsible for high-level execution of ontology-based queries. It accepts KQML
messages containing KIF-based queries, decomposes the queries into sub-queries based on its knowledge of
appropriate resource agents that can satisfy the query, and sends the high-level sub-queries off to the resource
agents. It then can merge the results received and transmit them to the agent which originated the query. The
execution agent is implemented in Java with embedded CLIPS functions.
The resource agent is to the local database what the user agent is to the user. It acts as an intelligent front-end
interface for the relatively dumb DBMS or other data store, accepting high-level ontology-based queries from
the network and translating them into whatever local query language (e.g., SQL) is necessary to execute the
queries against the local database. Results are then translated back into the terms of the ontology and returned to
the requesting agent. Just as the user agent maintains the user context, the resource agent is able to maintain
resource context, allowing for incremental retrieval of query results by requesting agents. Additionally, resource
agents are able to obtain, store, and advertise meta-information about the contents of their local resource.
Current resource agents are implemented in Java and LDL++, with ODBC and SQL versions under
development, and JDBC versions [13] planned.
Data analysis agents perform various analysis, knowledge mining, and pattern recognition tasks on data returned
by a query. These agents are implemented in Java, CLIPS, LDL++, and LISP.
The viewer server is a specialized resource agent, in that it maintains a storehouse of Java applets which are
designed to manipulate KIF ontologies and queries based on those ontologies, via a standard InfoSleuth
meta-model query API. In a sense, the viewer server is an applet broker which serves database applications,
query editors, and visualization tools for manipulating and displaying query results. It is implemented as a
stand-alone Java process.
7 Sample Scenario
Suppose the user is interested in locating real estate data stored in a variety of distributed databases, based on
various factors such as price, location, zoning, etc. Using InfoSleuth, she logs in to her user agent via a login
applet in Netscape, and requests recommendations for ontologies and applications that are appropriate to the
problem domain. The user agent queries a broker agent for servers that could fulfill the request for ontologies,
and is directed to an ontology server. The ontology server recommends a list of ontologies it knows about that
relate to the problem domain, and the user agent allows the user to select one.
Now that the particular ontology is selected, the user agent again asks the broker to recommend a server that can
supply query and visualization applets that work with the selected ontology. Again the broker recommends a
viewer server, the user agent sends the request to the viewer server, and the server responds by sending one or
more Java applets that fulfill the requirements. Assuming verification of the trustworthiness of the applets is
done (see Section 9, "Security Concerns"), the user agent passes the applets to the security monitor, which
places the applets in the appropriate codebase hierarchy for access by the user. At this point the user agent send
the names of the applets to the login applet, which permits the user to load them.
The user iteratively constructs an appropriate query via the domain-specific applet, using concepts from the
selected ontology. She can then submit the queries for execution. The user agent consults the broker for
recommendations on how to execute the query, and is directed toward an execution agent. The execution agent
decomposes the query into sub-queries, submits the sub-queries to one or more resource agents, which resolve
the sub-queries against their respective local databases and return the results to the execution agent, which
collates the results and passes them back, via the user agent, to the user.
NewsFactor.com
Explore:
| Worldwide
| Front Page | E-Business | Technology | Opinion | Culture Tech
| Special
Reports | Monster Deals | Trends | Cybercrime | Cartoon | Innovation
Teaching logic to machines and systems while maintaining flexibility is a tall order, and
critics of the Semantic Web say it cannot be done.
NAS 1898.58 -1.99
The latest effort to organize the Web's vast store of information is called the S&P 1138.65 -3.59
"Semantic Web," and while it remains to be seen whether it can live up to its
billing, it is promising enough to have attracted scientists from a variety of DOW 9866.99 -5.40
disciplines, including Tim Berners-Lee, director of the World Wide Web Consortium
(W3C) at the Massachusetts Institute of Technology.
The Semantic Web hopes to make our Web experience better by enabling our
machines to talk intelligently with other machines. It would be an extension of the
current Web, a place where "information is given well-defined meaning, better
enabling computers and people to work in cooperation," according to Berners-Lee.
"Right now, the Web works by allowing people all over the world to link to each
Gateway Makes House
other," Miller said. "Current technology allows us to say "links to," and what we Calls for Wireless Networking
really want to say is "talks to." Full Story
"It's a way of providing some additional contextual relationships with the things Dell Defies Poor Economy
we're interacting with daily. It helps make it clear to machines and humans how To Chart Profits, Market Gains
Full Story
these things relate."
Whatever Happened to
Commercials to Keats Dot-Com Stunts?
Full Story
In order for the Semantic Web to work, computers will need a common
vocabulary as well as rules. The Web now contains mostly documents written for Tech Innovators Learn How
people, rather than data and information that can be processed automatically by To Avoid Washing Out
the Semantic Web. Full Story
Computers simply cannot comprehend rich, varied and often confusing human Motorola To Offer New
Mobile Messaging System
language, which ranges from the mundane -- tire commercial text -- to the lofty Full Story
-- the poetry of John Keats.
Starwood Cultivates
Computer language that will help the Semantic Web evolve already exists, Loyalty with New Web Site
experts say, in the form of Extensible Markup Language, which gives more Full Story
structure to Web pages.
Can We Stop the Terrorist
Tech Trade?
Resource Description Framework (RDF) is the language of the Semantic Web in Full Story
much the same way that HTML is the language of the current Web. RDF
integrates information from multiple sources, and is itself a framework for Gates Sells First Xbox
"metadata" -- data about data. Game Console
Full Story
Logical and Flexible
Hewlett-Packard Earnings
According to the W3C, computers must have access to "structured collections of May Doom Union with Compaq
Full Story
information and sets of inference rules that they can use to conduct automated
reasoning." Yahoo! To Cut Workforce
10 Percent
Artificial intelligence experts have studied this field for decades. Such systems are Full Story
often called "knowledge representation," and have traditionally been very
centralized -- where everyone shares exactly the same definition of specific Amazon Reorganizes,
words, like "head" or "director." Emphasizing Third-Party
Services
Full Story
These systems limit what questions can be asked so that the computer can
answer correctly, if it answers at all. FBI: Old-Tech Fingerprints
Still Best Clues
Teaching logic to machines and systems while maintaining flexibility is a tall Full Story
order, and critics of the Semantic Web say it cannot be done. But Miller says that
by taking it slowly, it can. After the Fall: The Future
of CRM, Part 4
Full Story
"We have very much in the Semantic Web an eye toward the future goals through
well-established incremental steps," Miller said. "We have the notion of making
Headset Highlighted By
the simple steps simple, and the complex stuff possible." What You Don't Hear
Full Story
Talkback: Click here to add your comment about this story...
Shipping Just Gets Harder
for E-tailers
Full Story
See Related Stories
Tech Cartoon
Just for Fun
Friday's Cybercrime
Report
Full Story
Sponsored Links
Join a webinar series on Electronic Software Delivery & Management.
NewsFactor.com
Front Page | Special Reports | Worldwide Tech | E-Business | Monster Deals | Tech Stocks | Technology
Trends | Opinion | CyberCrime | Culture | Cartoon | Editorial Corrections
© 1998-2001 Triad Commerce Group, LLC. All rights reserved. See Terms of Use and Privacy notice.
Communicative Acts
In the Aglet examples, communcation among agents is purely syntactic. It consists of matching strings.
These strings carry no meaing as far as the Aglets are concerned. If artificial agents are to have more
sophisticated communication among themselves, communication which carries meaning, more complex
communication methods are needed.
A Communicative Act (a "language game")/
As usual in AI, researchres look to human examples. In the case of communication they found a suitable
theory in so-called speech acts, a development of linguistic philosophy.
In these notes we first look at this philosophical background. Then we see how FIPA, the Foundation for
Intelligent Physicall Agents has adapted speech acts to the computer world to create an international
standard agent commuication language (ACL). We also look at a related standard, the Semantic
Language (SL) used to describe the content of communications. Finally, we look at an actual system,
JADE, the Java Agent Development Envirionment, which implements these ideas.
Some Philosophical Background
Summary
positivist eye. There are more types of meaning than just verifiable (true/false) empirical or logical
statements. Under the lead of Ludwig Wittgenstein philosophers began to study and analyze ordinary
language and its meanings. (If you have the courage, you might like to look at Wittgenstein on meaning,
here.)
This is a promise, and, strictly speaking it has no truth value. It is not verifiable at the time it is made.
Logical positivists would say it has no meaning.
John Austin would say that it does have a meaning provided you have the means to carry out your
promise, and provided there is a reasonable possibility that the person to whom the message is addressed
can also get to the show. You could contrast this sentence with a similar one,
● I will meet you on Mars.
❍ illocutionary force
❍ propositional act
■ referring act
■ predicating act
An illocutionary act is just another name for speech act (using Latin :-) ).
For a communication to properly take place, all the component of the speech ("illocutionarty") act must
be present.
Here are Searle's own examples used to illustrate the above tree structure.
1. Sam smokes habitually.
2. Does Sam smoke habitually?
3. Sam, smoke habitually! [An unlikely order. ]
4. Would that Sam smoked habitually. [an unlikely wish.]
In all four of these sentences the referring act is the same: Sam.
The predicating act is also the same in each: smoking habitually.
Taken together, the referring content and the predicating content compose the propositional act. The
propositional act tells us what is being talked about, namely, Sam's smoking habits.
But what is being said about the subject being talked about? This is where the illocutionary force
comes in. In the above sentences the illocutionary force is implemented using word order, a common
means in English. Punctuation is also used.
So in #1 we have an assertion. This will become an INFORM perforaative in the Agent Communication
Language (ACL).
In #2 we have a question, which is either a QUERY-IF or QUERY-REF in ACL.
In #3 we have a command, which becomes REQUEST in ACL (because computer people are so polite).
#4 is a wish. At present, artificial agents are not capable of wishing.
Speech Acts
(This page summarizes ideas from chapter 22 of Artificial Intelligence, a Modern Approach by Stuart
Russell and Peter Norvig.)
"In general, communication is the intentional exchange of information brought about by the
production and perception of signs drawn from a shared system of conventional signs."
Foraging. A special loud bark from one. All head for trees. They have been warned of a stalking leopard.
These monkeys have other signals as well.Different calls for different predators (short cough for eagles,
chatter for snakes), and for other activities such as different grunts depending on whether the other
monkey is dominant or inferior
Humans
Also use signs. For example, smiles, frowns, hand shakes. But mainly humans use a complex system of
signs and signifiers called language.
Language allows humans to communicate "an unbounded number of qualitatively different messages."
Communication as action
One action an agent can perform is to produce language. Because the original study of these acts came
from linguistics, they are called speech acts. (Here "speech" is used as in the phrase "free speech". That
is, typing, sky-writing and sign language, for example, are acts of speech.)
Terms used. speaker, hearer, utterance, words.
● query
● answer
● request or command
● acknowledge
● share
The hard part of acts of speech is deciding what to say. This is a complex planning problem. rather like
game playing: I move (i.e., say something) anticipating your reply, and perhaps my reply to your reply,
etc. The philosopher Ludwig Witgenstein spoke of "language games".
Note that analysis has two parts, parsing and semantic analysis.
The fact that the two KB's are assumed the same means that they not only have the same structure, but
that they have the same names for the objects therein. What happens, if the agents, independently moving
around their respective environments, learn new things, and name them differently? This is a major
weakness of this communication mechanism. Language is necessary.
In other words, with this system, assuming independent learning, the ontologies of the communicating
agents might be very hard to synchronize.
Using an external communication language is clearly more flexible, but more complicated, than shared
internal representation method. Especially for autonomous agents that learn, an external communication
language is necessary.
Research in the last few years has developed a language to implement a set of standard, common and
useful, speech acts. The earlies such language to gain fame was is KQML, the Knowledge Query and
Manipulation Language together with KIF, the knowledge interchange format.
The Foundation for Intelligent Physical Agents (FIPA) is a consortium or corporations and universities
from all over the world whose aim is to standardize agent communication. It was founded in 1996.
Currently the two main communication standars are the Agent Communication Language (ACL) and the
Semantic Language (SL), but there are other contenders as well. FIPA also constructs standards for many
other aspects of agent systems.
The trouble with this method, quite apart formt he lack of a transport medium (bran waves?) is that it requires too much knowledge of
the internal behaviour of the other agent's brain. The two KB's would have to be the same, or very similary, an unlikely happening
with autonous agents.
In the computer world (e.g., aglets) this situation correponds to each agent calling the methods of the others. (As in Sayit and HearIt
aglets 1 and 2). For most cases doing this destroys agent autonomy and requires too much knowledge of the insides of the agents.
So, for hunan,animal and computer agents it is better to have an external communication language as illustrated in the following
diagram:
With an external communication language, no knowledge of the inner workings of the agents is required.
From the above site we have the orginal Jabberwocky poem and a "corrected" version created with the help of a computer spell
checker.
He took his vorpal sword in hand: The teeth that bite, the Claus that catch.
Long time the manxome foe he sought— Beware the Subjects bird, and shred
And as in uffish thought he stood, Long time the monitors fog he sought,
Came whiffling through the tulgey wood, And stood a while in thought.
Twas brillig, and the slithy toves "And host Thai slash the tablespoon?
Did gyre and gimble in the wabe; Come to my arms my bearish boy.
All mimsy were the borogoves, Oh various day! Cartoon! Cathay!"
And the mome raths outgrabe. He charted in his joy.
Note that the original text, although full of apparently meaningless words still tells a story which human readers can decode with a
little imagination. On the other hand, the spell checker text, although it contains nothing but meaningful words, is complete nonsense.
The human brain has amazing abilities to dig meaning out of language. It will be a long time before computers will compare with this
intelligence.
More nonsense
Ludwig Wittgenstein, John Austin and John Searle investigated the nature of meaning in everyday language. The wished to analyse
the what makes a sentence such as "I'll meet you tomorrow at the show." and "I'll meet you tomorrow on Mars.". Their study lead to
the idea of communication as a performace, as an action. For them speech is action.
Communicative Acts
Communicative (speech) acts have a tree structure of components:
Communicative Act
performative (illocutionary force)
proposition
referent(s)
predicate
The predicate is the content of the speech act. But the meaning, what you are doing with the content, must also be considered in
determining the meaing of a speech act.
You will see the structure of speech acts reflected in the agent communication languages designed by FIPA.
ACL
ACL, the Agent Communication Language, is an based on KQML and represents the world standard for agent communication as proposed by FIPA. Quite a
few agent systems "speak" ACL. FIPA defines a library of allowed communicative acts.
FIPA Communicative Act Library Specification for ACL
● pdf (local) version
● html version
You can see that ACL is closely related to KQML. In fact, ACL represents a smaller version of KQML which is more precidely defined.
XML
XML has become quite popular. There is a standard version of ACL written in XML and sponsored by FIPA.
FIPA xmlacl specification (DTD)
REQUEST
REQUEST asks the receiver to take some action. The action can, of course, be a speech act, often INFORM. The :content language can be a string
containing anything, vene Visual Basic! Of course the receiving agent has to understand the content language.
QUERY-REF
This one is a bit more complicated. The content language in the example is SL.
QUERY-REF is used to refer to objects that the receiver knows about but which the names are not known to the sender. So the sender sends a description of
the required object or objects. In other words, the sender sends an expression, the value of which references the desired objects.
In the above example, the sender used the variable ?x as a reference to the objects which match the description "available services offered by agent j". Agent
j responds with an INFORM message.
You can see from this example that SL is quite a tricky language. Fortunately, as of version 2.4, JADE has some helpful packages to help out.
● .An environment of KQML speaking agents may be enriched with special agents, called facilitators, that provide to the agents additional functions
to deal with networking (association of physical addresses with symbolic names, registration of agents and/or services offered and sought by
agents, enhanced communication services as forwarding, brokering, broadcasting...).
KQML may be considered as a communication language for the exchange of information and knowledge between agents, through the use of a set of
standard message types. Next is an example of KQML message.
(ask-if
:sender A
:receiver B
:language Prolog
:ontology foo
:reply-with id1
:content ``bar(a,b)'' )
In KQML terminology, ask-if is a performative. A performative sets parameters that are introduced by keywords. In this example, the agent named A
(:sender) is querying the agent B (:receiver), in Prolog (:language) about the truth status of ``bar(a,b)'' (:content). Any response to this KQML message
will be identified by id1 (:reply-with). The ontology name foo may provide additional information regarding the interpretation of the :content. Let's
What is an ontology?
KQML Performatives
● to send a recommend-one or a recommend-all to get the relevant advertise message and directly contact agent(s) that may process their queries.
Agents can access agents in other domain through their facilitator, or directly. The term facilitator is used to refer to all kinds of special services that may
be provided by specialised agents, such as Agent Name Servers, proxy agents, traders or brokers.
● It also proposes performatives to permit an agent to reply to another one (tell, eos, sorry...).
● Other performatives are able to support generic information exchange (tell, untell, deny...), functionality transfer (insert, tell...) and capability
definition (advertise, subscribe...).
● An important number of reserved performatives are concerned by networking and group facilities: register, forward, broadcast, recommend,
broker...
● the :content parameter of a performative is an opaque message. This constitutes an important benefit that KQML may bring to improve
● Since KQML is still an open and evolving specification language (you may add yours own performatives with respect to the specifications), it
might be attractive to define a specific set of performatives dedicated to the particular interactions between NM agents.
● Is an implementation of KQML easily realisable? What is the most suitable/efficient transport protocol to support all the networking facilities
proposed by KQML?
We started to study the last issue by developing a KQML implementation based on CORBA. The next section gives an overview of a KQML-CORBA
based architecture able to support cooperative services and NM applications.
What is an Ontology?
Tom Gruber <gruber@ksl.stanford.edu>
Short answer:
An ontology is a specification of a conceptualization.
The word "ontology" seems to generate a lot of controversy in discussions about AI. It has a long history
in philosophy, in which it refers to the subject of existence. It is also often confused with epistemology,
which is about knowledge and knowing.
In the context of knowledge sharing, I use the term ontology to mean a specification of a
conceptualization. That is, an ontology is a description (like a formal specification of a program) of the
concepts and relationships that can exist for an agent or a community of agents. This definition is
consistent with the usage of ontology as set-of-concept-definitions, but more general. And it is certainly a
different sense of the word than its use in philosophy.
What is important is what an ontology is for. My colleagues and I have been designing ontologies for the
purpose of enabling knowledge sharing and reuse. In that context, an ontology is a specification used for
making ontological commitments. The formal definition of ontological commitment is given below. For
pragmetic reasons, we choose to write an ontology as a set of definitions of formal vocabulary. Although
this isn't the only way to specify a conceptualization, it has some nice properties for knowledge sharing
among AI software (e.g., semantics independent of reader and context). Practically, an ontological
commitment is an agreement to use a vocabulary (i.e., ask queries and make assertions) in a way that is
consistent (but not complete) with respect to the theory specified by an ontology. We build agents that
commit to ontologies. We design ontologies so we can share knowledge with and among these agents.
This definition is given in the article:
T. R. Gruber. A translation approach to portable ontologies. Knowledge Acquisition, 5(2):199-220, 1993.
Available on line.
We use common ontologies to describe ontological commitments for a set of agents so that they can
communicate about a domain of discourse without necessarily operating on a globally shared theory. We
say that an agent commits to an ontology if its observable actions are consistent with the definitions in
the ontology. The idea of ontological commitments is based on the Knowledge-Level perspective
(Newell, 1982) . The Knowledge Level is a level of description of the knowledge of an agent that is
independent of the symbol-level representation used internally by the agent. Knowledge is attributed to
agents by observing their actions; an agent "knows" something if it acts as if it had the information and is
acting rationally to achieve its goals. The "actions" of agents---including knowledge base servers and
knowledge-based systems--- can be seen through a tell and ask functional interface (Levesque, 1984) ,
where a client interacts with an agent by making logical assertions (tell), and posing queries (ask).
Pragmatically, a common ontology defines the vocabulary with which queries and assertions are
exchanged among agents. Ontological commitments are agreements to use the shared vocabulary in a
coherent and consistent manner. The agents sharing a vocabulary need not share a knowledge base; each
knows things the other does not, and an agent that commits to an ontology is not required to answer all
queries that can be formulated in the shared vocabulary.
In short, a commitment to a common ontology is a guarantee of consistency, but not completeness, with
respect to queries and assertions using the vocabulary defined in the ontology.
Notes
[1] Ontologies are often equated with taxonomic hierarchies of classes, but class definitions, and the
subsumption relation, but ontologies need not be limited to these forms. Ontologies are also not limited
to conservative definitions, that is, definitions in the traditional logic sense that only introduce
terminology and do not add any knowledge about the world (Enderton, 1972) . To specify a
conceptualization one needs to state axioms that do constrain the possible interpretations for the defined
terms.
Geneva, Switzerland
Notice
Use of the technologies described in this specification may infringe patents, copyrights or other intellectual property rights
of FIPA Members and non-members. Nothing in this specification should be construed as granting permission to use any
of the technologies described. Anyone planning to make use of technology covered by the intellectual property rights of
others should first obtain permission from the holder(s) of the rights. FIPA strongly encourages anyone implementing any
part of this specification to determine first whether part(s) sought to be implemented are covered by the intellectual
property of others, and, if so, to obtain appropriate licenses or other permission from the holder(s) of such intellectual
property prior to implementation. This specification is subject to change without notice. Neither FIPA nor any of its
Members accept any responsibility whatsoever for damages or liability, direct or consequential, which may result from the
use of this specification.
Foreword
The Foundation for Intelligent Physical Agents (FIPA) is an international organization that is dedicated to promoting the
industry of intelligent agents by openly developing specifications supporting interoperability among agents and agent-
based applications. This occurs through open collaboration among its member organizations, which are companies and
universities that are active in the field of agents. FIPA makes the results of its activities available to all interested parties
and intends to contribute its results to the appropriate formal standards bodies.
The members of FIPA are individually and collectively committed to open competition in the development of agent-based
applications, services and equipment. Membership in FIPA is open to any corporation and individual firm, partnership,
governmental body or international organization without restriction. In particular, members are not bound to implement or
use specific agent-based standards, recommendations and FIPA specifications by virtue of their participation in FIPA.
The FIPA specifications are developed through direct involvement of the FIPA membership. The status of a specification
can be either Preliminary, Experimental, Standard, Deprecated or Obsolete. More detail about the process of specification
may be found in the FIPA Procedures for Technical Work. A complete overview of the FIPA specifications and their
current status may be found in the FIPA List of Specifications. A list of terms and abbreviations used in the FIPA
specifications may be found in the FIPA Glossary.
FIPA is a non-profit association registered in Geneva, Switzerland. As of January 2000, the 56 members of FIPA
represented 17 countries worldwide. Further information about FIPA as an organization, membership information, FIPA
specifications and upcoming meetings may be found at http://www.fipa.org/.
ii
Contents
1 Introduction ..................................................................................................................................................... 1
2 Overview ......................................................................................................................................................... 2
2.1 Status of a FIPA-Compliant Communicative Act........................................................................................... 2
2.2 FIPA Communicative Act Library Maintenance............................................................................................. 2
2.3 Inclusion Criteria ....................................................................................................................................... 3
3 FIPA Communicative Acts................................................................................................................................ 4
3.1 Accept Proposal ....................................................................................................................................... 4
3.2 Agree....................................................................................................................................................... 5
3.3 Cancel ..................................................................................................................................................... 6
3.4 Call for Proposal........................................................................................................................................ 7
3.5 Confirm .................................................................................................................................................... 8
3.6 Disconfirm ................................................................................................................................................ 9
3.7 Failure.....................................................................................................................................................10
3.8 Inform......................................................................................................................................................11
3.9 Inform If ...................................................................................................................................................12
3.10 Inform Ref ............................................................................................................................................13
3.11 Not Understood ....................................................................................................................................15
3.12 Propagate............................................................................................................................................17
3.13 Propose...............................................................................................................................................19
3.14 Proxy ..................................................................................................................................................20
3.15 Query If................................................................................................................................................22
3.16 Query Ref ............................................................................................................................................23
3.17 Refuse.................................................................................................................................................24
3.18 Reject Proposal....................................................................................................................................25
3.19 Request...............................................................................................................................................26
3.20 Request When .....................................................................................................................................27
3.21 Request Whenever................................................................................................................................28
3.22 Subscribe ............................................................................................................................................29
4 References.....................................................................................................................................................30
5 Informative Annex A — Formal Basis of ACL Semantics ....................................................................................31
5.1 Introduction to the Formal Model................................................................................................................31
5.2 The Semantic Language ...........................................................................................................................32
5.2.1 Basis of the Semantic Language Formalism ........................................................................................32
5.2.2 Abbreviations ....................................................................................................................................33
5.3 Underlying Semantic Model.......................................................................................................................34
5.3.1 Property 1.........................................................................................................................................34
5.3.2 Property 2.........................................................................................................................................34
5.3.3 Property 3.........................................................................................................................................35
5.3.4 Property 4.........................................................................................................................................35
5.3.5 Property 5.........................................................................................................................................35
5.3.6 Notation............................................................................................................................................35
5.3.7 Note on the Use of Symbols in Formulae.............................................................................................36
5.3.8 Supporting Definitions ........................................................................................................................36
5.4 Primitive Communicative Acts ...................................................................................................................36
5.4.1 The Assertive Inform ..........................................................................................................................36
5.4.2 The Directive Request ........................................................................................................................37
5.4.3 Confirming an Uncertain Proposition: Confirm.......................................................................................37
5.4.4 Contradicting Knowledge: Disconfirm...................................................................................................37
5.5 Composite Communicative Acts ................................................................................................................38
5.5.1 The Closed Question Case.................................................................................................................38
5.5.2 The Query If Act ................................................................................................................................39
5.5.3 The Confirm/Disconfirm Question Act ..................................................................................................39
iii
5.5.4 The Open Question Case...................................................................................................................40
5.6 Inter-Agent Communication Plans ..............................................................................................................41
iv
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
1 Introduction
This document contains specifications for structuring the FIPA Communicative Act Library (FIPA CAL) including: status of
a FIPA-compliant communicative act, maintenance of the library and inclusion criteria.
This document is primarily concerned with defining the structure of the FIPA CAL and the requirements for a proposed
communicative act to be included in the library. The elements of the library are listed in this document.
This document also contains the formal basis of FIPA ACL semantics in the annex for the semantic characterization of
each FIPA communicative act.
1
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
2 Overview
This document focuses on the organization, structure and status of the FIPA Communicative Act Library, FIPA CAL and
discusses the main requirements that a communicative act must satisfy in order to be FIPA-compliant.
The objectives of standardizing and defining a library of FIPA compliant communicative acts are:
• To help ensure interoperability by providing a standard set of composite and macro communicative acts, derived from
the FIPA primitive communicative acts,
• To provide a well-defined process for maintaining a set of communicative acts and act labels for use in the FIPA ACL.
In the following, we present the basic principles of the FIPA CAL. These principles help to guarantee that the CAL is
stable, that there are public rules for the inclusion and maintenance of the CAL and that developers seeking
communicative acts for their applications can use the CAL.
By collecting communicative act definitions in a single, publicly accessible registry, the FIPA CAL facilitates the use of
standardized Communicative Acts by agents developed in different contexts. It also provides a greater incentive to
developers to make any privately developed communicative acts generally available.
The name assigned to a proposed communicative act must uniquely identify which communicative act is used within a
FIPA ACL message. It must not conflict with any names currently in the library, and must be an English word or
abbreviation that is suggestive of the semantics. The FIPA Agent Communication Technical Committee is the initial judge
of the suitability of a name.
FIPA is responsible for maintaining a consistent list of approved and proposed communicative act names and for making
this list publicly available to FIPA members and non-members. This list is derived from the FIPA Communicative Act
Library.
In addition to the semantic characterization and descriptive information that is required, each Communicative Act in the
FIPA CAL may specify additional information, such as stability information, versioning, contact information, different
support levels, etc.
FIPA will designate a Technical Committee to maintain the FIPA CAL. The FIPA CAL will be managed by this technical
committee, which will be responsible for the following items:
2
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
• Collecting feedback and the comments about communicative acts in the FIPA CAL. Depending on interest, the
technical committee may organize more specific Working Groups. These groups would be responsible for maintaining
public lists referring to projects and people who are currently working on different communicative acts.
• Inviting contributions in various forms: e-mail comments, written reports, papers, technical documents, and so forth.
The current email address of the technical committee is specified on the first page of this document.
• All technical committee members will be notified about contributions, comments or proposed changes and should be
able to access them.
• The proposed updates to the FIPA CAL must be discussed and approved during an official FIPA meeting, in order that
the FIPA community may be involved with and informed of all of the FIPA approved communicative acts in the library
• In the future, FIPA intends to supply templates (publicly accessible from the FIPA web site) in order to facilitate
submission of candidate communicative acts to the FIPA CAL, and to ensure that agent language developers
understand and can easily satisfy the requirements for the submission of a new communicative act to the FIPA CAL.
The minimal criteria that must be satisfied for a communicative act to be included in the FIPA CAL are:
• A summary of the candidate act's semantic force and content type are required.
• A detailed natural language description of the act and its consequences are required.
• A formal model, written in SL, of the act's semantics, its formal preconditions, and its rational effects is required.
• Substantial and clear documentation must be provided. This means that the proposal must be already well structured.
FIPA members are in no way responsible for translating submitted communicative acts into an acceptable form. See
the form of the acts in the library for a sample.
• The utility of such a new communicative act should be made clear. In particular, it should be clear that the need it
solves is reasonably general, and that this need would be cumbersome to meet by combining existing communicative
acts.
FIPA does not enforce the use of any particular communicative act, except for the case of not-understood, and those acts
which are required to meet the agent management needs of the agent.
3
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
The proposition given as part of the acceptance indicates the preconditions that the agent is
attaching to the acceptance. A typical use of this is to finalize the details of a deal in some
protocol. For example, a previous offer to "hold a meeting anytime on Tuesday" might be accepted
with an additional condition that the time of the meeting is 11.00.
Note for future extension: an agent may intend that an action become done without necessarily
intending the precondition. For example, during negotiation about a given task, the negotiating
parties may not unequivocally intend their opening bids: agent a may bid a price p as a
precondition, but be prepared to accept price p'.
Formal Model <i, accept-proposal (j, <j, act>, φ))> ≡
<i, inform (j, Ii Done (<j, act>, φ))>
FP: Bi α ∧ ¬Bi (Bifj α ∨ Uifj α)
RE: Bj α
Where:
(accept-proposal
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:in-reply-to bid089
:content
((action (agent-identifier :name j)
(stream-content movie1234 19))
(B (agent-identifier :name j)
(ready customer78)))
:language FIPA-SL)
4
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.2 Agree
Summary The action of agreeing to perform some action, possibly in the future.
Message A tuple, consisting of an action expression denoting the action to be done, and a proposition giving
Content the conditions of the agreement.
Description Agree is a general-purpose agreement to a previously submitted request to perform some action.
The agent sending the agreement informs the receiver that it does intend to perform the action, but
not until the given precondition is true.
The proposition given as part of the agree act indicates the qualifiers, if any, that the agent is
attaching to the agreement. This might be used, for example, to inform the receiver when the agent
will execute the action which it is agreeing to perform.
Pragmatic note: The precondition on the action being agreed to can include the perlocutionary
effect of some other CA, such as an inform act. When the recipient of the agreement (for example,
a contract manager) wants the agreed action to be performed, it should then bring about the
precondition by performing the necessary CA. This mechanism can be used to ensure that the
contractor defers performing the action until the manager is ready for the action to be done.
Formal Model <i, agree (j, <i, act>, φ))> ≡
<i, inform (j, Ii Done (<i, act>, φ))>
FP: Bi α ∧ ¬Bi (Bifj α ∨ Uifj α)
RE: Bj α
Where:
α = Ii Done(<i, act>, φ)
Note that the formal difference between the semantics of agree and the semantics of accept-
proposal rests on which agent is performing the action.
Example Agent i (a job-shop scheduler) requests j (a robot) to deliver a box to a certain location. J answers
that it agrees to the request but it has low priority.
(request
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
((action (agent-identifier :name j)
(deliver box017 (loc 12 19))))
:protocol fipa-request
:language FIPA-SL
:reply-with order567)
(agree
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
((action (agent-identifier :name j)
(deliver box017 (loc 12 19)))
(priority order567 low))
:in-reply-to order567
:protocol fipa-request
:language FIPA-SL)
5
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.3 Cancel
Summary The action of one agent informing another agent that the first agent no longer has the intention that
the second agent perform some action.
Message An action expression denoting the action that is no longer intended.
Content
Description Cancel allows an agent i to inform another agent j that i no longer intends that j perform a
previously requested action. This is not the same as i informing j that i intends that j not perform
the action or stop performing an action. Cancel is simply used to let an agent know that another
agent no longer has a particular intention. (In order for i to stop j from performing an action, i
should request that j stop that action. Of course, nothing in the ACL semantics guarantees that j
will actually stop performing the action; j is free to ignore i’s request.) Finally, note that the action
that is the object of the act of cancellation should be believed by the sender to be ongoing or to be
planned but not yet executed.
Formal Model <i, cancel (j, a)> ≡
<i, disconfirm (j, Ii Done (a))>
FP: ¬Ii Done (a) ∧ Bi (Bj Ii Done (a) ∨ Uj Ii Done (a))
RE: Bj ¬Ii Done (a)
Cancel applies to any form of requested action. Suppose an agent i has requested an agent j to
perform some action a, possibly if some condition holds. This request has the effect of i informing j
that i has an intention that j perform the action a. When i comes to drop its intention, it can inform
j that it no longer has this intention with a disconfirm.
Example Agent j asks i to cancel a previous request-whenever by quoting the action.
(cancel
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
((action (agent-identifier :name j)
(request-whenever
:sender (agent-identifier :name j)
:receiver (set(agent-identifier :name i))
:content1
"((action (agent-identifier :name i)
(inform-ref
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content2
\"((iota ?x
(=(price widget) ?x))\")
(> (price widget) 50))"
…)))
:langage FIPA-SL
…)
1
The request-whenever message’s :content parameter in the context of the cancel message is an embedded action expression. So, since this
example uses SL as a content language, the content tuple of the request-whenever message must be converted into a Term of SL.
2
The content of this inform-ref is further embedded in an embedded request-whenever message’s content. So, because this example uses SL as
a content language, the quote mark is itself escaped by '\'.
6
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
In normal usage, the agent responding to a cfp should answer with a proposition giving the value of
the parameter in the original precondition expression (see the statement of cfp's rational effect).
For example, the cfp might seek proposals for a journey from Frankfurt to Munich, with a condition
that the mode of travel is by train. A compatible proposal in reply would be for the 10.45 express
train. An incompatible proposal would be to travel by airplane.
Note that cfp can also be used to simply check the availability of an agent to perform some action.
Also note that this formalization of cfp is restricted to the common case of proposals
characterized by a single parameter (x) in the proposal expression. Other scenarios might involve
multiple proposal parameters, demand curves, free-form responses, and so forth.
Formal Model <i, cfp (j, <j, act>, Ref x φ(x))> ≡
<i, query-ref (j, Ref x (Ii Done (<j, act>, φ(x)) ⇒
(Ij Done (<j, act>, φ(x))))>
FP: ¬Brefi(Ref x α(x)) ∧ ¬Urefi(Ref x α(x)) ∧
¬Bi Ij Done (<j, inform-ref (i, Ref x α(x))>)
RE: Done (<j, inform (i, Ref x α(x) = r1)> | … |
<j, inform (i, Ref x α(x) = rk)>)
Where:
Agent i asks agent j: "What is the 'x' such that you will perform action 'act' when 'φ (x)' holds?"
Note: Ref x δ(x) is one of the referential expressions: ιx δ(x), any x δ(x) or all x
δ(x).
Note: The RE of this is not a proposal by the recipient. Rather, it is the value of the proposal
parameter. See the example in the definition of the propose act.
Example Agent j asks i to submit its proposal to sell 50 boxes of plums.
(cfp
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
((action (agent-identifier :name i)
(sell plum 50))
(any ?x (and (= (price plum) ?x) (< ?x 10))))
:ontology fruit-market)
7
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.5 Confirm
Summary The sender informs the receiver that a given proposition is true, where the receiver is known to be
uncertain about the proposition.
Message A proposition.
Content
Description The sending agent:
• intends that the receiving agent also comes to believe that the proposition is true, and,
The first two properties defined above are straightforward: the sending agent is sincere3, and has
(somehow) generated the intention that the receiver should know the proposition (perhaps it has
been asked). The last pre-condition determines when the agent should use confirm vs. inform vs.
disconfirm: confirm is used precisely when the other agent is already known to be uncertain about
the proposition (rather than uncertain about the negation of the proposition).
From the receiver's viewpoint, receiving a confirm message entitles it to believe that:
• the sender believes the proposition that is the content of the message, and,
Whether or not the receiver does, indeed, change its mental attitude to one of belief in the
proposition will be a function of the receiver's trust in the sincerity and reliability of the sender.
Formal Model <i, confirm (j, φ)>
FP: Biφ ∧ BiUjφ
RE: Bjφ
Examples Agent i confirms to agent j that it is, in fact, true that it is snowing today.
(confirm
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
"weather (today, snowing)"
:language Prolog)
3
Arguably there are situations where an agent might not want to be sincere, for example to protect confidential information. We consider these
cases to be beyond the current scope of this specification.
8
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.6 Disconfirm
Summary The sender informs the receiver that a given proposition is false, where the receiver is known to
believe, or believe it likely that, the proposition is true.
Message A proposition.
Content
Description The disconfirm act is used when the agent wishes to alter the known mental attitude of another
agent.
• intends that the receiving agent also comes to believe that the proposition is false, and,
• believes that the receiver either believes the proposition, or is uncertain of the proposition.
The first two properties defined above are straightforward: the sending agent is sincere3, and has
(somehow) generated the intention that the receiver should know the proposition (perhaps it has
been asked). The last pre-condition determines when the agent should use confirm vs. inform vs.
disconfirm: disconfirm is used precisely when the other agent is already known to believe the
proposition or to be uncertain about it.
From the receiver's viewpoint, receiving a disconfirm message entitles it to believe that:
• the sender believes that the proposition that is the content of the message is false, and,
• the sender wishes the receiver to believe the negated proposition also.
Whether or not the receiver does, indeed, change its mental attitude to one of disbelief in the
proposition will be a function of the receiver's trust in the sincerity and reliability of the sender.
Formal Model <i, disconfirm (j, φ)>
FP: Bi¬φ ∧ Bi(Ujφ ∨ Bjφ)
RE: Bj¬φ
Example Agent i, believing that agent j thinks that a shark is a mammal, attempts to change j's belief.
(disconfirm
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
((mammal shark))
:language FIPA-SL)
9
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.7 Failure
Summary The action of telling another agent that an action was attempted but the attempt failed.
Message A tuple, consisting of an action expression and a proposition giving the reason for the failure.
Content
Description The failure act is an abbreviation for informing that an act was considered feasible by the sender,
but was not completed for some given reason.
• the action is (or, at the time the agent attempted to perform the action, was) feasible
The (causal) reason for the failure is represented by the proposition, which is the second element
of the message content tuple. It may be the constant true. Often it is the case that there is little
either agent can do to further the attempt to perform the action.
Formal Model <i, failure (j, a, φ)> ≡
<i, inform (j, (∃e) Single (e) ∧ Done (e, Feasible (a) ∧
Ii Done (a)) ∧ φ ∧ ¬Done (a) ∧ ¬Ii Done (a))>
FP: Bi α ∧ ¬Bi (Bifj α ∨ Uifj α)
RE: Bj α
Where:
Agent i informs agent j that, in the past, i had the intention to do action a and a was feasible. i
performed the action of attempting to do a (that is, the action/event e is the attempt to do a), but
now a has not been done and i no longer has the intention to do a, and φ is true.
The informal implication is that φ is the reason that the action failed, though this causality is not
expressed formally in the semantic model.
Example Agent j informs i that it has failed to open a file.
(failure
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
((action (agent-identifier :name j)
(open "foo.txt"))
(error-message "No such file: foo.txt"))
:language FIPA-SL)
10
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.8 Inform
Summary The sender informs the receiver that a given proposition is true.
Message A proposition.
Content
Description The sending agent:
• intends that the receiving agent also comes to believe that the proposition is true, and,
• does not already believe that the receiver has any knowledge of the truth of the proposition.
The first two properties defined above are straightforward: the sending agent is sincere, and has
(somehow) generated the intention that the receiver should know the proposition (perhaps it has
been asked). The last property is concerned with the semantic soundness of the act. If an agent
knows already that some state of the world holds (that the receiver knows proposition p), it cannot
rationally adopt an intention to bring about that state of the world (i.e. that the receiver comes to
know p as a result of the inform act). Note that the property is not as strong as it perhaps appears.
The sender is not required to establish whether the receiver knows p. It is only the case that, in
the case that the sender already happens to know about the state of the receiver's beliefs, it
should not adopt an intention to tell the receiver something it already knows.
From the receiver's viewpoint, receiving an inform message entitles it to believe that:
• the sender believes the proposition that is the content of the message, and,
Whether or not the receiver does, indeed, adopt belief in the proposition will be a function of the
receiver's trust in the sincerity and reliability of the sender.
Formal Model <i, inform (j, φ )>
FP: Biφ ∧ ¬ Bi(Bifjφ ∨ Uifjφ)
RE: Bjφ
Examples Agent i informs agent j that (it is true that) it is raining today.
(inform
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
"weather (today, raining)"
:language Prolog)
11
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.9 Inform If
Summary A macro action for the agent of the action to inform the recipient whether or not a proposition is
true.
Message A proposition.
Content
Description The inform-if macro act is an abbreviation for informing whether or not a given proposition is
believed. The agent which enacts an inform-if macro-act will actually perform a standard inform
act. The content of the inform act will depend on the informing agent's beliefs. To inform-if on some
closed proposition φ:
• if the agent believes the proposition, it will inform the other agent that φ, and,
• if it believes the negation of the proposition, it informs that φ is false, that is, ¬φ.
Under other circumstances, it may not be possible for the agent to perform this plan. For example,
if it has no knowledge of φ, or will not permit the other party to know (that it believes) φ, it will send
a refuse message.
Formal Model <i, inform-if (j, φ)> ≡
<i, inform (j, φ)>|<i, inform (j, ¬φ)>
FP: Bifi φ ∧ ¬Bi (Bifj φ ∨ Uifj φ)
RE: Bifj φ
Inform-if represents two possible courses of action: i informs j that φ, or i informs j that not φ.
Examples Agent i requests j to inform it whether Lannion is in Normandy.
(request
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
((action (agent-identifier :name j)
(inform-if
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
"in( lannion, normandy)"
:language Prolog)))
:language FIPA-SL)
(inform
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
"\+ in (lannion, normandy)"
:language Prolog)
12
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
inform-ref is a macro action, since it corresponds to a (possibly infinite) disjunction of inform acts,
each of which informs the receiver that "the object corresponding to name is x" for some given x.
For example, an agent can plan an inform-ref of the current time to agent j, and then perform the
act "inform j that the time is 10.45".
The agent performing the act should believe that the object or set of objects corresponding to the
reference expression is the one supplied, and should not believe that the receiver of the act
already knows which object or set of objects corresponds to the reference expression. The agent
may elect to send a refuse message if it is unable to establish the preconditions of the act.
Formal Model <i, inform-ref (j, Ref x δ(x))> ≡
<i, inform (j, Ref x δ(x) = r1)> | ... |
(<i, inform (j, Ref x δ(x) = rk)>
FP: Brefi Ref x δ(x) ∧ ¬Bi(Brefj Ref x δ(x) ∨ Urefj Ref x δ(x))
RE: Brefj Ref x δ(x)
Note: Ref x δ(x) is one of the referential expressions: ιx δ(x), any x δ(x) or all x δ(x).
Inform-ref represents an unbounded, possibly infinite set of possible courses of action, in which i
informs j of the referent of x.
Example Agent i requests j to tell it the current Prime Minister of the United Kingdom:
(request
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
((action (agent-identifier :name j)
(inform-ref
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
"((iota ?x (UKPrimeMinister ?x)))"
:ontology world-politics
:language FIPA-SL)))
:reply-with query0
:language FIPA-SL)
Agent j replies:
(inform
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
((= (iota ?x (UKPrimeMinister ?x)) "Tony Blair"))
:ontology world-politics
:in-reply-to query0)
13
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
Note that a standard abbreviation for the request of inform-ref used in this example is the act
query-ref.
14
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
The second element of the message content tuple is a proposition representing the reason for the
failure to understand. There is no guarantee that the reason is represented in a way that the
receiving agent will understand. However, a co-operative agent will attempt to explain the
misunderstanding constructively.
Note: It is not possible to fully capture the intended semantics of an action not being understood
by another agent. The characterization below captures that an event happened and that the
recipient of the not-understood message was the agent of that event.
φ must be a well formed formula of the content language of the sender agent. If the sender uses
the bare textual message, that is, 'String' in the syntax definition, as the reason φ, it must be a
propositional assertive statement and (at least) the sender can understand that (natural language)
message and calculate its truth value, that is, decide its assertion is true or false. So, for
example, in the SL language, to use textual message for the convenience of humans, it must be
encapsulated as the constant argument of a predicate defined in the ontology that the sender
uses, for example:
(error "message")
Formal Model <i, not-understood(j, a, φ)> ≡
<i, inform( j, α) >
FP: Bi α ∧ ¬Bi (Bifj α ∨ Uifj α)
RE: Bj α
Where:
15
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
Examples Agent i did not understand a query-if message because it did not recognize the ontology.
(not-understood
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
((action (agent-identifier :name j)
(query-if
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
"<fipa-ccl content expression>"
:ontology www
:language FIPA-CCL))
(unknown (ontology "www")))
:language FIPA-SL)
16
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.12 Propagate
Summary The sender intends that the receiver treat the embedded message as sent directly to the receiver,
and wants the receiver to identify the agents denoted by the given descriptor and send the received
propagate message to them.
Message A tuple of a descriptor, that is, a referential expression, denoting an agent or agents to be
Content forwarded the propagate message, an embedded ACL communicative act, that is, an ACL
message, performed by the sender to the receiver of the propagate message and a constraint
condition for propagation, for example, timeout.
Description This is a compound action of the following two actions. First, the sending agent requests the
recipient to treat the embedded message in the received propagate message as if it is directly
sent from the sender, that is, as if the sender performed the embedded communicative act directly
to the receiver. Second, the sender wants the receiver to identify agents denoted by the given
descriptor and to send a modified version of the received propagate message to them, as
described below.
On forwarding, the :receiver parameter of the forwarded propagate message is set to the
denoted agent(s) and the :sender parameter is set to the receiver of the received propagate
message. The sender and receiver of the embedded communicative act of the forwarded propagate
message is also set to the same agent as the forwarded propagate message's sender and
receiver, respectively.
This communicative act is designed for delivering messages through federated agents by creating
a chain (or tree) of propagate messages. An example of this is instantaneous brokerage requests
using a proxy message, or persistent requests by a request-when/request-whenever message
embedding a proxy message.
Formal Model <i, propagate (j, Ref x δ(x), <i, cact>, φ)> ≡
<i, cact(j)>;
<i, inform (j, Ii((∃y) (Bj (Ref x δ(x) = y) ∧
Done (<j, propagate (y, Ref x δ(x), <j, cact>, φ)>, Bj φ))))>
FP: FP (cact) ∧ Bi α ∧ ¬Bi (Bifj α ∨ Uifj α)
RE: Done (cact) ∧ Bj α
Where :
Agent i performs the embedded communicative act to j: <i, cact(j)> and i wants j to send the
propagate message to the denoted agent(s) by Ref x δ(x).
Note that <i,cact> in the propagate message is the ACL communicative act without the
:receiver parameter.
Note: Ref x δ(x) is one of the referential expressions: ιx δ(x), any x δ(x) or all x δ(x).
17
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
Example Agent i requests agent j and its federating other brokerage agents to do brokering video-on-
demand server agent to get "SF" programs.
(propagate
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :neme j))
:content
((any ?x (registered
(agent-description
:name ?x
:services (set
(service-description
:name agent-brokerage))))
(action (agent-identifier :name i)
(proxy
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
"((all ?y (registered
(agent-description
:name ?y
:services (set
(service-description
:name video-on-demand)))))
(action (agent-identifier :name j)
(request
:sender (agent-identifier :name j)
:content
\"((action ?z4
(send-program (category "SF"))))\"
:ontology vod-server-ontology
:protocol fipa-reqest …))
true)"
:ontology brokerage-agent-ontology
:conversation-id vod-brokering-2
:protocol fipa-brokering …))
(< (hop-count) 5))
:ontology brokerage-agent-ontology
…)
4
We cannot specify the concrete actor name when agent i sends the propagate message because it is identified by the referential expression
(all ?y …). In the above example, a free variable ?z is used as the mandatory actor agent part of the action expression send-program in
the content of embedded request message.
18
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.13 Propose
Summary The action of submitting a proposal to perform a certain action, given certain preconditions.
Message A tuple containing an action description, representing the action that the sender is proposing to
Content perform, and a proposition representing the preconditions on the performance of the action.
Description Propose is a general-purpose action to make a proposal or respond to an existing proposal during
a negotiation process by proposing to perform a given action subject to certain conditions being
true. The actual protocol under which the negotiation process is being conducted is known either
by prior agreement, or is explicitly stated in the :protocol parameter of the message.
The proposer (the sender of the propose) informs the receiver that the proposer will adopt the
intention to perform the action once the given precondition is met, and the receiver notifies the
proposer of the receiver's intention that the proposer performs the action.
A typical use of the condition attached to the proposal is to specify the price of a bid in an
auctioning or negotiation protocol.
Formal Model <i, propose (j, <i, act>, φ)> ≡
<i, inform (j, Ij Done (<i, act>, φ) ⇒ Ii Done (<i, act>, φ))>
FP: Bi α ∧ ¬Bi (Bifj α ∨ Uifj α)
RE: Bj α
Where:
Agent i informs j that, once j informs i that j has adopted the intention for i to perform action act,
and the preconditions for i performing act have been established, i will adopt the intention to
perform act.
Example Agent j proposes to i to sell 50 boxes of plums for $5. This example continues the example of cfp.
(propose
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
((action j (sell plum 50))
(= (any ?x (and (= (price plum) ?x) (< ?x 10))) 5)
:ontology fruit-market
:in-reply-to proposal2
:language FIPA-SL)
19
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.14 Proxy
Summary The sender wants the receiver to select target agents denoted by a given description and to send
an embedded message to them.
Message A tuple of a descriptor, that is, a referential expression, that denotes the target agents, an ACL
Content communicative act, that is, an ACL message, to be performed to the agents, and a constraint
condition for performing the embedded communicative act, for example, the maximum number of
agents to be forwarded, etc.
Description The sending agent informs the recipient that the sender wants the receiver to identify agents that
satisfy the given descriptor, and to perform the embedded communicative act to them, that is, the
receiver sends the embedded message to them.
On performing the embedded communicative act, the :receiver parameter is set to the denoted
agent and the :sender is set to the receiver of the proxy message. If the embedded
communicative act contains a :reply-to parameter (for example, in the recruiting case where
the :protocol parameter is set to fipa-recruiting), it should be preserved in the performed
message.
In the case of a brokering request (that is, the :protocol parameter is set to fipa-brokering), the
brokerage agent (the receiver of the proxy message) must record some parameters, for example,
:conversation-id, :reply-with, :sender, etc.) of the received proxy message to forward
back the reply message(s) from the target agents to the corresponding requester agent (the
sender of the proxy message).
Formal Model <i, proxy (j, Ref x δ(x), <j, cact>, φ)> ≡
<i, inform (j, Ii((∃y)(Bj (Ref x δ(x) = y) ∧
Done (<j, cact(y)>, Bj φ))))>
FP: Bi α ∧ ¬Bi (Bifj α ∨ Uifj α)
RE: Bj α
Where:
Agent i wants j to perform the embedded communicative act to the denoted agent(s) (y) by Ref
x δ(x).
Note that <j,cact> in the proxy message is the ACL communicative act without the
:receiver parameter. Its receiver is denoted by the given Ref x δ(x) by the agent j.
Note: Ref x δ(x) is one of the referential expressions: ιx δ(x), any x δ(x) or all x δ(x).
Two types of proxy can be distinguished. We will call the type of proxy defined above strong,
because it is a feasibility precondition of j's communicative act to y that j satisfies the feasibility
preconditions of the proxied communicative act. So, if i proxies an inform of the proposition ψ to y
via j, j must believe ψ before it sends the proxied inform message to y.
In addition, we could define weak -proxy, where we do not suppose that j is required to believe ψ. In
this case, j cannot directly inform y of ψ, because j does not satisfy the feasibility preconditions of
inform. In this case, j can only inform y that the original sender i has the intention that the inform
of ψ should happen. More generally, weak -proxy can be expressed as an instance of proxy where
the action <j,cact(y)> is replaced by <j, inform(y, Ii Done (<i, cact(y)>))>.
20
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
Example Agent i requests agent j to do recruiting and request a video-on-demand server to send "SF"
programs.
(proxy
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
((all ?x (registered(agent-description
:name ?x
:services (set
(service-description
:name video-on-demand)))))
(action (agent-identifier :name j)
(request
:sender (agent-identifier :name j)
:content
"((action ?y5
(send-program (category "SF"))))"
:ontology vod-server-ontology
:language FIPA-SL
:protocol fipa-request
:reply-to (set (agent-identifier :name i))
:conversation-id request-vod-1)
true)
:language FIPA-SL
:ontology brokerage-agent
:protocol fipa-recruiting
:conversation-id vod-brokering-1 …)
5
We cannot specify the concrete actor name when agent i sends the proxy message because it is identified by the referential expression (all
?x …). In the above example, a free variable ?x is used as the mandatory actor agent part of the action expression send-program in the
content of embedded request message.
21
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.15 Query If
Summary The action of asking another agent whether or not a given proposition is true.
Message A proposition.
Content
Description Query-if is the act of asking another agent whether (it believes that) a given proposition is true. The
sending agent is requesting the receiver to inform it of the truth of the proposition.
• believes that the other agent can inform the querying agent if it knows the truth of the
proposition.
Formal Model <i, query-if (j, φ)> ≡
<i, request (j, <j, inform-if (i, φ)>)>
FP: ¬Bifiφ ∧ ¬Uifiφ ∧ ¬Bi Ij Done(<j, inform-if (i, φ)>)
RE: Done (<j, inform(i, φ)>|<j, inform (i, ¬φ)>)
Example Agent i asks agent j if j is registered with domain server d1:
(query-if
:sender (agent-identifier :name i)
:receiver (set (agent-identitfier :name j))
:content
((registered (server d1) (agent j)))
:reply-with r09
…)
(inform
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content ((not (registered (server d1) (agent j))))
:in-reply-to r09)
22
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
• does not know which object or set of objects corresponds to the descriptor, and,
• believes that the other agent can inform the querying agent the object or set of objects that
correspond to the descriptor.
Formal Model <i, query-ref (j, Ref x δ(x))> ≡
<i, request (j, <j, inform-ref (i, Ref x δ(x))>)>
FP: ¬Brefi(Ref x δ(x)) ∧ ¬Urefi(Ref x δ(x)) ∧
¬Bi Ij Done(<j, inform-ref (i, Ref x δ(x))>)
RE: Done(<i, inform (j, Ref x δ(x) = r1)> |...|
<i, inform (j, Ref x δ(x) = rk)>)
Note: Ref x δ(x) is one of the referential expressions: ιx δ(x), any x δ(x) or all x
δ(x).
Example Agent i asks agent j for its available services.
(query-ref
:sender (agent-identinfier :name i)
:receiver (set (agent-identifier :name j))
:content
((all ?x (available-service j ?x)))
…)
(inform
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
((= (all ?x (available-service j ?x))
(set (reserve-ticket train)
(reserve-ticket plane)
(reserve automobile))))
…)
23
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.17 Refuse
Summary The action of refusing to perform a given action, and explaining the reason for the refusal.
Message A tuple, consisting of an action expression and a proposition giving the reason for the refusal.
Content
Description The refuse act is an abbreviation for denying (strictly speaking, disconfirming) that an act is
possible for the agent to perform, and stating the reason why that is so.
The refuse act is performed when the agent cannot meet all of the preconditions for the action to
be carried out, both implicit and explicit. For example, the agent may not know something it is
being asked for, or another agent requested an action for which it has insufficient privilege.
• the action is not feasible (from the point of view of the sender of the refusal), and,
• the (causal) reason for the refusal is represented by the a proposition which is the second
element of the message content tuple, (which may be the constant true). There is no
guarantee that the reason is represented in a way that the receiving agent will understand.
However, a cooperative agent will attempt to explain the refusal constructively. See the
description at not-understood.
Formal Model <i, refuse (j, <i, act>, φ)> ≡
<i, disconfirm (j, Feasible(<i, act>))>;
<i, inform (j, φ ∧ ¬Done (<i, act>) ∧ ¬Ii Done (<i, act>))>
FP: Bi ¬Feasible (<i, act>) ∧ Bi (Bj Feasible (<i, act>) ∨
Uj Feasible (<i, act>)) ∧ Bi α ∧ ¬Bi (Bifj α ∨ Uifj α)
RE: Bj ¬Feasible (<i, act>) ∧ Bj α
Where:
Agent i informs j that action act is not feasible, and further that, because of proposition φ, act has
not been done and i has no intention to do act.
Example Agent j refuses to i reserve a ticket for i, since there are insufficient funds in i's account.
(refuse
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
((action (agent-identifier :name j)
(reserve-ticket LHR MUC 27-sept-97))
(insufficient-funds ac12345))
:language FIPA-SL)
24
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
The additional proposition represents a reason that the proposal was rejected. Since it
is in general hard to relate cause to effect, the formal model below only notes that the
reason proposition was believed true by the sender at the time of the rejection.
Syntactically the reason should be treated as a causal explanation for the rejection,
even though this is not established by the formal semantics.
Formal Model <i, reject-proposal (j, <j, act>, φ, ψ)> ≡
<i, inform (j, ¬Ii Done (<j, act>, φ) ∧ ψ)>
FP : Bi α ∧ ¬Bi (Bifj α ∨ Uifj α)
RE : Bj α
Where:
Agent i informs j that, because of proposition ψ, i does not have the intention for j to
perform action act with precondition φ.
Example Agent i informs j that it rejects an offer from j to sell.
(reject-proposal
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
((action (agent-identifier :name j)
(sell plum 50))
(cost 200)
(price-too-high 50))
:in-reply-to proposal13)
25
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.19 Request
Summary The sender requests the receiver to perform some action.
One important class of uses of the request act is to request the receiver to perform another
communicative act.
Message An action expression.
Content
Description The sender is requesting the receiver to perform some action. The content of the message is a
description of the action to be performed, in some language the receiver understands. The action
can be any action the receiver is capable of performing: pick up a box, book a plane flight,
change a password, etc.
An important use of the request act is to build composite conversations between agents, where
the actions that are the object of the request act are themselves communicative acts such as
inform.
Formal Model <i, request (j, a )>
FP: FP (a) [i\j] ∧ Bi Agent (j, a) ∧ ¬Bi Ij Done (a)
RE: Done (a)
FP(a) [i\j] denotes the part of the FPs of a which are mental attitudes of i.
Examples Agent i requests j to open a file.
(request
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
"open \"db.txt\" for input"
:language vb)
26
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
The agent receiving a request-when should either refuse to take on the commitment, or should
arrange to ensure that the action will be performed when the condition becomes true. This
commitment will persist until such time as it is discharged by the condition becoming true, the
requesting agent cancels the request-when, or the agent decides that it can no longer honour the
commitment, in which case it should send a refuse message to the originator.
No specific commitment is implied by the specification as to how frequently the proposition is re-
evaluated, nor what the lag will be between the proposition becoming true and the action being
enacted. Agents that require such specific commitments should negotiate their own agreements
prior to submitting the request-when act.
Formal Model <i, request-when (j, <j, act>, φ)> ≡
<i, inform (j, (∃e') Done (e') ∧ Unique (e') ∧
Ii Done (<j, act>, (∃e) Enables (e, Bj φ) ∧
Has-never-held-since (e', Bj φ)))>
FP: Bi α ∧ ¬Bi (Bifj α ∨ Uifj α
RE: Bj α
Where:
Agent i informs j that i intends for j to perform some act when j comes to believe φ.
Examples Agent i tells agent j to notify it as soon as an alarm occurs.
(request-when
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
((action (agent-identifier :name j)
(inform
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
"((alarm \"something alarming!\"))"))
(Done( alarm )))
…)
27
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
No specific commitment is implied by the specification as to how frequently the proposition is re-
evaluated, nor what the lag will be between the proposition becoming true and the action being
enacted. Agents who require such specific commitments should negotiate their own agreements
prior to submitting the request-when act.
Formal Model <i, request-whenever (j, <j, act>, φ)> ≡
<i, inform (j, Ii Done (<j, act>, (∃e) Enables (e, Bj φ)))>
FP: Bi α ∧ ¬Bi (Bifj α ∨ Uifj α)
RE: Bj α
Where:
Agent i informs j that i intends that j will perform some act whenever some event causes j to
believe φ.
Examples Agent i tells agent j to notify it whenever the price of widgets rises from less than 50 to more than
50.
(request-whenever
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
((action (agent-identifier :name j)
(inform-ref
:sender (agent-identifier :name j)
:receiver (set (agent-identifier :name i))
:content
"((iota ?x (= (price widget) ?x)))"))
(> (price widget) 50))
…)
28
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
3.22 Subscribe
Summary The act of requesting a persistent intention to notify the sender of the value of a reference, and to
notify again whenever the object identified by the reference changes.
Message A descriptor (a referential expression).
Content
Description The subscribe act is a persistent version of query-ref, such that the agent receiving the subscribe
will inform the sender of the value of the reference, and will continue to send further informs if the
object denoted by the description changes.
Where:
Note: Ref x δ(x) is one of the referential expressions: ιx δ(x), any x δ(x) or all x δ(x).
Examples Agent i wishes to be updated on the exchange rate of Francs to Dollars, and makes a subscription
agreement with j (an exchange rate server).
(subscribe
:sender (agent-identifier :name i)
:receiver (set (agent-identifier :name j))
:content
((iota ?x (= ?x (xch-rate FFR USD)))))
29
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
4 References
[Cohen90] Cohen, P. R. and Levesque, H. J., Intention is Choice with Commitment. In: Artificial Intelligence, 42(2-3),
pages 213-262, 1990.
[FIPA00008] FIPA SL Content Language Specification. Foundation for Intelligent Physical Agents, 2000.
http://www.fipa.org/specs/fipa00008/
[FIPA00025] FIPA Interaction Protocol Library Specification. Foundation for Intelligent Physical Agents, 2000.
http://www.fipa.org/specs/fipa00025/
[FIPA00070] FIPA ACL Message Representation in String. Foundation for Intelligent Physical Agents, 2000.
http://www.fipa.org/specs/fipa00070/
[Garson84] Garson, G. W., Quantification in Modal Logic. In: Handbook of Philosophical Logic, Volume II:
Extensions of Classical Logic, Gabbay, D., & Guentner, F., editors. D. Reidel Publishing Company,
pages 249-307, 1984.
[Halpern85] Halpern, J. Y. and Moses, Y., A Guide to the Modal Logics of Knowledge and Belief: A Preliminary Draft.
In: Proceedings of the IJCAI-85, 1985.
[Sadek90] Sadek, M. D., Logical Task Modelling for Man-Machine Dialogue. In: Proceedings of AAAI90, pages 970-
975, Boston, USA, 1990.
[Sadek91a] Sadek, M. D., Attitudes Mentales et Interaction Rationnelle: Vers une Théorie Formelle de la
Communication. Thèse de Doctorat Informatique, Université de Rennes I, France, 1991.
[Sadek91b] Sadek, M. D., Dialogue Acts are Rational Plans. In: Proceedings of the ESCA/ETRW Workshop on the
Structure of Multimodal Dialogue, pages 1-29, Maratea, Italy, 1991.
[Sadek92] Sadek, M. D., A Study in the Logic of Intention. In: Proceedings of the 3rd Conference on Principles of
Knowledge Representation and Reasoning (KR92), pages 462-473, Cambridge, USA, 1992.
[Searle69] Searle, J.R., Speech Acts. Cambridge University Press, 1969.
30
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
Note also that conformance testing, that is, demonstrating in an unambiguous way that a given agent implementation is
correct with respect to this formal model, is not a problem which has been solved in this FIPA specification. Conformance
testing will be the subject of further work by FIPA.
Other than the special case of agents that operate singly and interact only with human users or other software interfaces,
agents must communicate with each other to perform the tasks for which they are responsible. Consider the basic case
shown in Figure 1.
Goal G
Agent i Agent j
Intent I
Speech act
Message M
Msg M
Convert to transport form Convert from transport form
Suppose that, in abstract terms, Agent i has amongst its mental attitudes the following: some goal or objective G and
some intention I. Deciding to satisfy G, the agent adopts a specific intention, I. Note that neither of these statements
entail a commitment on the design of Agent i: G and I could equivalently be encoded as explicit terms in the mental
structures of a BDI agent, or implicitly in the call stack and programming assumptions of a simple Java or database
agent.
Assuming that Agent i cannot carry out the intention by itself, the question then becomes which message or set of
messages should be sent to another agent (j in Figure 1) to assist or cause intention I to be satisfied? If Agent i is
behaving in some reasonable sense rationally, it will not send out a message whose effect will not satisfy the intention
and hence achieve the goal. For example, if Harry wishes to have a barbecue (G = "have a barbecue"), and thus derives a
goal to find out if the weather will be suitable (G' = "know if it is raining today"), and thus intends to find out the weather (I
= "find out if it is raining"), he will be ill-advised to ask Sally "have you bought Acme stock today?" From Harry's
perspective, whatever Sally says, it will not help him to determine whether it is raining today.
31
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
Continuing the example, if Harry, acting more rationally, asks Sally "can you tell me if it is raining today?", he has acted
in a way he hopes will satisfy his intention and meet his goal (assuming that Harry thinks that Sally will know the
answer). Harry can reason that the effect of asking Sally is that Sally would tell him, hence making the request fulfils his
intention. Now, having asked the question, can Harry actually assume that, sooner or later, he will know whether it is
raining? Harry can assume that Sally knows that he does not know, and that she knows that he is asking her to tell him.
But, simply on the basis of having asked, Harry cannot assume that Sally will act to tell him the weather: she is
independent, and may, for example, be busy elsewhere.
In summary: an agent plans, explicitly or implicitly (through the construction of its software) to meet its goals ultimately
by communicating with other agents, that is, sending messages to them and receiving messages from them. The agent
will select acts based on the relevance of the act's expected outcome or rational effect to its goals. However, it cannot
assume that the rational effect will necessarily result from sending the messages.
• φ and ψ are formula schemas, which stand for any closed proposition,
The mental model of an agent is based on the representation of three primitive attitudes: belief, uncertainty and choice (or,
to some extent, goal). They are respectively formalised by the modal operators B, U, and C. Formulas using these
operators can be read as:
• Uip "i is uncertain about p but thinks that p is more likely than ¬p", and,
The logical model for the operator B is a KD45 possible-worlds-semantics Kripke structure (see, for example, [Halpern85])
with the fixed domain principle (see, for example, [Garson84]).
To enable reasoning about action, the universe of discourse involves, in addition to individual objects and agents,
sequences of events. A sequence may be formed with a single event. This event may be also the void event. The
language involves terms (in particular a variable e) ranging over the set of event sequences.
To talk about complex plans, events (or actions) can be combined to form action expressions:
6
SL is also used for the content language of the FIPA ACL messages (see [FIPA00008]).
7
This logical framework is similar in many aspects to that of [Cohen90].
32
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
The operators Feasible, Done and Agent are introduced to enable reasoning about actions, as follows:
• Feasible (a, p) means that a can take place and if it does p will be true just after that,
• Done (a, p) means that a has just taken place and p was true just before that,
• Agent (i, a) means that i denotes the only agent that ever performs (in the past, present or future) the actions which
appear in action expression a,
• Single (a) means that a denotes an action expression that is not a sequence. Any individual action is Single. The
composite act a ; b is not Single. The composite act a | b is Single iff both a and b are Single.
From belief, choice and events, the concept of persistent goal is defined. An agent i has p as a persistent goal, if i has p
as a goal and is self-committed toward this goal until i comes to believe that the goal is achieved or to believe that it is
unachievable. Intention is defined as a persistent goal imposing the agent to act. Formulas as PGip and IiP are intended
to mean that "i has p as a persistent goal" and "i has the intention to bring about p", respectively. The definition of I
entails that intention generates a planning process. See [Sadek92] for the details of a formal definition of intention.
Note that there is no restriction on the possibility of embedding mental attitude or action operators. For example, formula
Ui Bj Ij Done (a, Bip) informally means that agent i believes that, probably, agent j thinks that i has the intention that action
a be done before which i has to believe p.
A fundamental property of the proposed logic is that the modelled agents are perfectly in agreement with their own mental
attitudes. Formally, the following schema is valid:
φ ⇔ B iφ
5.2.2 Abbreviations
In the text below, the following abbreviations are used:
33
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
Uref i ιxδ(x) has the same meaning as Bref i ιxδ(x), except that agent i has an uncertainty attitude with respect to δ(x)
instead of a belief attitude.
8. ABn,i,jφ ≡ BiBjBi … φ
introduces the concept of alternate beliefs, n is a positive integer representing the number of B operators alternating
between i and j.
In the text, the term "knowledge" is used as an abbreviation for "believes or is uncertain of".
5.3.1 Property 1
To give an agent the capability of planning an act whenever the agent intends to achieve its RE, the agent should adhere
to the following property:
1. (∃x) Biak = x
2. p is the RE of ak and
Where:
This property says that an agent's intention to achieve a given goal generates an intention that one of the acts known to
the agent be done. Further, the act is such that its rational effect corresponds to the agent's goal, and that the agent has
no reason for not doing it.
The set of feasibility preconditions for a CA can be split into two subsets: the ability preconditions and the context-
relevance preconditions. The ability preconditions characterise the intrinsic ability of an agent to perform a given CA. For
instance, to sincerely assert some proposition p, an agent has to believe that p. The context-relevance preconditions
characterise the relevance of the act to the context in which it is performed. For instance, an agent can be intrinsically
able to make a promise while believing that the promised action is not needed by the addressee. The context-relevance
preconditions correspond to the Gricean quantity and relation maxims.
5.3.2 Property 2
This property imposes on an agent an intention to seek the satisfiability of its FPs, whenever the agent elects to perform
an act by virtue of property 19:
8
Rational effect is also referred to as the perlocutionary effect in some of the work prior to this specification (see [Sadek90]).
9
See [Sadek91b] for a generalised version of this property.
34
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
5.3.3 Property 3
If an agent has the intention that (the illocutionary component of) a communicative act be performed, it necessarily has
the intention to bring about the rational effect of the act. The following property formalises this idea:
Where:
5.3.4 Property 4
Consider now the complementary aspect of CA planning: the consuming of CAs. When an agent observes a CA, it should
believe that the agent performing the act has the intention (to make public its intention) to achieve the rational effect of the
act. This is called the intentional effect. The following property captures this intuition:
Note, for completeness only, that a strictly precise version of this property is as follows:
5.3.5 Property 5
Some FPs persist after the corresponding act has been performed. For the particular case of CAs, the next property is
valid for all the FPs which do not refer to time. In such cases, when an agent observes a given CA, it is entitled to believe
that the persistent feasibility preconditions hold:
5.3.6 Notation
A communicative act model will be presented as follows:
where i is the agent of the act, j the recipient, act the name of the act, C stands for the semantic content or propositional
content 10, and φ1 and φ2 are propositions. This notational form is used for brevity, only within this section on the formal
basis of ACL. The correspondence to the standard transport syntax (see [FIPA00070]) adopted above is illustrated by a
simple translation of the above example:
(act
:sender i
:receiver j
:content
C)
10
See [Searle69] for the notions of propositional content (and illocutionary force) of an illocutionary act.
35
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
Note that this also illustrates that some aspects of the operational use of the FIPA ACL fall outside the scope of this
formal semantics but are still part of the specification. For example, the above example is actually incomplete without
:language and :ontology parameters to given meaning to C, or some means of arranging for these to be known.
Symbol Usage
a Used to denote an action. Example: a = <i, inform (j, p)>
act Used to denote an action type. Example: act = inform (j, p)
Thus, if a = <i, inform (j, p)> and act = inform (j, p) then a = <i, act>.
cact Used to denace only an ACL communicative act type.
φ Used to denote any closed proposition (without any restriction).
p Used to denote a given proposition. Thus 'φ' is a formula schema, that is, a variable that denotes a
formula, and 'p' is a formula (not a variable).
Ii φ ⇒ ¬Bi φ,
Bi (Feasible (a) ⇔ p)
Has-never-held-since (e', φ) = (∀e1) (∀e2) Done (e'; e1 ; e2) ⇒ Done (e2, ¬φ)
36
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
The FPs for inform have been constructed to ensure mutual exclusiveness between CAs, when more that one CA might
deliver the same rational effect.
Note, for completeness only, that the above version of the inform model is the operationalised version. The complete
theoretical version (regarding the FPs) is the following:
Where:
• FP (a) [i\j] denotes the part of the FPs of a which are mental attitudes of i.
In view of this analysis, the following is the model for the act confirm:
37
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
However, a large class of other useful acts is defined by composition using the disjunction operator (written "|"). By the
meaning of the operator, only one of the disjunctive components of the act will be performed when the act is carried out. A
good example of these macro-acts is the inform-ref act. Inform-ref is a macro act defined formally by:
where n may be infinite. This act may be requested (for example, j may request i to perform it), or i may plan to perform
the act in order to achieve the (rational) effect of j knowing the referent of δ(x). However, when the act is actually
performed, what is sent, and what can be said to be Done, is an inform act.
Finally an inter-agent plan is a sequence of such communicative acts, using either composition operator, involving two or
more agents. FIPA interaction protocols (see [FIPA00025]) are primary examples of pre-enumerated inter-agent plans.
In fact, as mentioned above, the semantic content of a directive refers to an action expression; so, this can be a
disjunction between two or more acts. Hence, by using the utterance "Is p?", what an agent i requests an agent j to do is
the following action expression:
It seems clear that the semantic content of a directive realised by a yes/no-question can be viewed as an action
expression characterising an indefinite choice between two CAs inform. In fact, it can also be shown that the binary
character of this relation is only a special case: in general, any number of CAs inform can be handled. In this case, the
addressee of a directive is allowed to choose one among several acts. This is not only a theoretical generalisation: it
accounts for classical linguistic behaviour traditionally called alternatives question. An example of an utterance realising
an alternative question is "Would you like to travel in first class, in business class, or in economy class?" In this case,
the semantic content of the request realised by this utterance is the following action expression:
<j, INFORM (i, p1)> | <j, INFORM (i, p2)> | <j, INFORM (i, p3 )>
Where p1, p2 and p3 are intended to mean respectively that j wants to travel in first class, in business class, or in economy
class.
As it stands, the agent designer has to provide the plan-oriented model for this type of action expression. In fact, it would
be interesting to have a model which is not specific to the action expressions characterising the non-deterministic choice
between CAs of type inform, but a more general model where the actions referred to in the disjunctive relation remain
unspecified. In other words, to describe the preconditions and effects of the expression a1 | a2 | … | an where a1, a2, …, an
are any action expressions. It is worth mentioning that the goal is to characterise this action expression as a disjunctive
38
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
macro-act which is planned as such; we are not attempting to characterise the non-deterministic choice between acts
which are planned separately. In both cases, the result is a branching plan but in the first case, the plan is branching in
an a priori way while in the second case it is branching in an a posteriori way.
An agent will plan a macro-act of non-deterministic choice when it intends to achieve the rational effect of one of the acts
composing the choice, no matter which one it is. To do that, one of the feasibility preconditions of the acts must be
satisfied, no matter which one it is. This produces the following model for a disjunctive macro-act:
a1 | a2 | … | an
FP: FP (a1) ∨ FP (a2) ∨ ... ∨ FP (an)
RE: RE (a1) ∨ RE (a2) ∨ ... ∨ RE (an)
Where FP (ak) and RE (ak) represent the FPs and the RE of the action expression ak, respectively.
Because the yes/no-question, as shown, is a particular case of alternatives question, the above model can be specialised
to the case of two acts inform having opposite semantic contents. Thus, we get the following model:
In the same way, we can derive the disjunctive macro-act model which gathers the acts confirm and disconfirm. We will
use the abbreviation <i, CONFDISCONF (j, φ)> to refer to the following model:
11
For more details about this transformation, called the double-mirror transformation, see [Sadek91a] and [Sadek91b].
39
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
A formal plan-oriented model for the wh-questions is required. In the model below, from the addressee's viewpoint, this
type of question can be viewed as a closed question where the suggested choice is not made explicit because it is too
wide. Indeed, a question such as "What is your destination?" can be restated as "What is your destination: Paris,
Rome,... ?".
The problem is that, in general, the set of definite descriptions among which the addressee can (and must) choose is
potentially an infinite set, not because, referring to the example above, there may be an infinite number of destinations,
but because, theoretically, each destination can be referred to in potentially an infinite number of ways. For instance,
Paris can be referred to as "the capital of France", "the city where the Eiffel Tower is located", "the capital of the country
where the Man-Rights Chart was founded", etc. However, it must be noted that in the context of man-machine
communication, the language used is finite and hence the number of descriptions acceptable as an answer to a wh-
question is also finite.
When asking a wh-question, an agent j intends to acquire from the addressee i an identifying referring expression (IRE)
[Sadek90] for a definite description, in the general case. Therefore, agent j intends to make his interlocutor i perform a CA
which is of the following form:
Where r is an IRE, for example, a standard name or a definite description, and ιxδ(x) is a definite description. Thus, the
semantic content of the directive performed by a wh-question is a disjunctive macro-act composed with acts of the form of
the act above. Here is the model of such a macro-act:
Where rk are IREs. To deal with the case of closed questions, the generic plan-oriented model proposed for a disjunctive
macro-act can be instantiated for the account of the macro-act above. Note that the following equivalence is valid:
This produces the following model, which is referred to as <i, INFORM-REF( j, ιx δ(x) )>:
Where Brefj ιxδ(x) and Urefj ιxδ(x) are abbreviations introduced above, and αrefj ιxδ(x) is an abbreviation
defined as:
Provided the act models <j, INFORM-REF (i, ιx δ(x))> and <i, REQUEST (j, a)>, the wh-question act model
can be built up in the same way as for the yn-question act model. Applying the same transformation to the FPs of the act
schema <j, INFORM-REF (i, ιxδ(x))>, and by virtue of property 3, the following model is derived:
<i, QUERY-REF ( j, φ)>?≡ <i, REQUEST (j, <j, INFORM-REF (i, ιx δ(x)>)>
FP: ¬αrefi ιxδ(x) ∧ Bi ¬PGj Done (<j, INFORM-REF (i, ιxδ(x))>)
RE: Done (<j, INFORM (i, ιxδ(x) = r1 )> | … | <j, INFORM (i, ιxδ(x) = rk )>)
40
© 2000 Foundation for Intelligent Physical Agents FIPA Communicative Act Library
With this method, it can be shown that what are usually called "dialogue acts" and for which models are postulated, are,
in fact, complex plans of interaction. These plans can be derived from primitive acts, by using the principles of rational
behaviour. The following is an example of how such plans are derived.
The interaction plan "hidden" behind a question act can be more or less complex depending on the agent mental state
when the plan is generated.
Let a direct question be a question underlain by a plan which is limited to the reaction strictly legitimised by the question.
Suppose that the main content of i's mental state is:
Bi Bifj φ, Ii Bifi φ
By virtue of property 1, the intention is generated that the act <j, INFORM-IF (i, φ)> be performed. Then, according
to property 2, there follows the intention to bring about the feasibility of this act. Then, the problem is to know whether the
following belief can be derived at that time from i's mental state:
This is the case with i's mental state. By virtue of properties 1 and 2, the intention that the act <i, REQUEST (j, <j,
INFORM-IF (i, φ)>)> be done and then the intention to achieve its feasibility, are inferred. The following belief is
derivable:
Bi(¬Bifi φ ∧ ¬Uifi φ)
Now, no intention can be inferred. This terminates the planning process. The performance of a direct strict-yn-question
plan can be started by uttering a sentence such as "Has the flight from Paris arrived?", for example.
Given the FPs and the RE of the plan above, the following model for a direct strict-yn-question plan can be established:
41
XML and Agent Communication
XML lends itself well to expressing ontologies. The DTD allows people to define the structural
relationships anong agreed upon terms. The resulting XML documents are then readable by humans and
usable, without modification, by machines. Becaue of this convenience, a XML is increasing used to
write standards, such as agent communiction standards.
Both FIPA and JADE have integrated some XML into their work. Here are some examples.
Here is the DTD from that document. You can see the influence of speech act theory, just as in the case
of KQML.
<!-- Document Type: XML DTD
Document Purpose: Encoding of FIPA ACL messages in XML
(see [FIPA00067]) and http://www.fipa.org/)
Last Revised: 2000/03/07
-->
<!-- Attribute for the fipa-message - the communicative act itself and
the conversation id (which is here so an ID value can be used).
-->
<!ATTLIST fipa-message act (%communicative-acts;) #REQUIRED
conversation-id ID #IMPLIED>
RDF in XML
One of the newest semantic languages used for agent communcation is the Resource Description
Framework (RDF). FIPA sets the standard for this and the JADE team is promising to have an
implementation by the end of 2001. RDF is a content language, a competitor for SL. RDF is supported
by yet another important standards setting body, W3C, the World Wide Web Consortium.
RDF Specification HTML pdf (local)
FIPA SL Specification
● pdf format (local)
● HTML format
SL is a subtle language and not easy to use. Not surprising since it is concerned with semantics, always a
difficult topic. The JADE system uses it by default.
RDF
RDF stands for Resource Description Framework. It is quite new and has the advantage of being written
in XML.
FIPA RDF specification
Geneva, Switzerland
Notice
Use of the technologies described in this specification may infringe patents, copyrights or other intellectual property rights
of FIPA Members and non-members. Nothing in this specification should be construed as granting permission to use any
of the technologies described. Anyone planning to make use of technology covered by the intellectual property rights of
others should first obtain permission from the holder(s) of the rights. FIPA strongly encourages anyone implementing any
part of this specification to determine first whether part(s) sought to be implemented are covered by the intellectual
property of others, and, if so, to obtain appropriate licenses or other permission from the holder(s) of such intellectual
property prior to implementation. This specification is subject to change without notice. Neither FIPA nor any of its
Members accept any responsibility whatsoever for damages or liability, direct or consequential, which may result from the
use of this specification.
Foreword
The Foundation for Intelligent Physical Agents (FIPA) is an international organization that is dedicated to promoting the
industry of intelligent agents by openly developing specifications supporting interoperability among agents and agent-
based applications. This occurs through open collaboration among its member organizations, which are companies and
universities that are active in the field of agents. FIPA makes the results of its activities available to all interested parties
and intends to contribute its results to the appropriate formal standards bodies.
The members of FIPA are individually and collectively committed to open competition in the development of agent-based
applications, services and equipment. Membership in FIPA is open to any corporation and individual firm, partnership,
governmental body or international organization without restriction. In particular, members are not bound to implement or
use specific agent-based standards, recommendations and FIPA specifications by virtue of their participation in FIPA.
The FIPA specifications are developed through direct involvement of the FIPA membership. The status of a specification
can be either Preliminary, Experimental, Standard, Deprecated or Obsolete. More detail about the process of specification
may be found in the FIPA Procedures for Technical Work. A complete overview of the FIPA specifications and their
current status may be found in the FIPA List of Specifications. A list of terms and abbreviations used in the FIPA
specifications may be found in the FIPA Glossary.
FIPA is a non-profit association registered in Geneva, Switzerland. As of January 2000, the 56 members of FIPA
represented 17 countries worldwide. Further information about FIPA as an organization, membership information, FIPA
specifications and upcoming meetings may be found at http://www.fipa.org/.
ii
Contents
1 Introduction ..................................................................................................................................................... 1
1.1 A Summary of RDF ................................................................................................................................... 1
2 RDF as a FIPA Content Language..................................................................................................................... 2
2.1 Objects .................................................................................................................................................... 2
2.2 Propositions ............................................................................................................................................. 2
2.3 Actions .................................................................................................................................................... 4
2.4 Action Implementations ............................................................................................................................. 6
3 Exchange of Rules Extensions ........................................................................................................................11
3.1 Introduction..............................................................................................................................................11
3.2 Rules in XML/RDF....................................................................................................................................11
3.3 Exchanging Rules as Programming Code...................................................................................................12
3.4 Using Rules with FIPA Communicative Acts ...............................................................................................13
3.5 Further Remarks ......................................................................................................................................13
4 Examples of Use............................................................................................................................................15
4.1 RDF Schemas for FIPA RDF 0..................................................................................................................15
4.2 RDF Schemas for FIPA RDF 1..................................................................................................................17
5 References.....................................................................................................................................................18
iii
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
1 Introduction
This specification describes how the Resource Description Framework (RDF - see [W3crdf]) can be used as content
language in a FIPA message. Although FIPA does not require that a content language is able to represent actions 1, a lot
of communicative acts require actions in their content. Therefore, we will show how RDF schemas can be defined
extending its model to express:
• Objects which are constructs that represent an identifiable entity (be it abstract or concrete) in the domain of
discourse,
• Propositions which are statements expressing that some sentence in a language is true or false, and,
• Actions which try to express an activity that can be carried out by an object.
By means of existing mechanisms in RDF (schema definitions), modular RDF extensions will be proposed, based on the
fipa-rdf0 content language. Those extensions will be able to tackle for example rules, logic algebra constructs, and
others. These extensions can then be labelled as fipa-rdf1, fipa-rdf2, etc.
The general motivation behind this approach is to enable and ease the use of RDF Schemas emerging on the Web such
as CC/PP, and to define one common standard approach here to increase the level of interoperability. The main strengths
of the RDF language are in its extensibility, reusability and simplicity. Another advantage of RDF is that data and
schemas are exchanged in a similar way.
The RDF model proposes the eXtensible Markup Language (XML - see [W3Cxml]) as an encoding syntax, but does not
prevent anyone from using alternative encoding schemes. All fipa-rdf examples will therefore use an XML encoding,
although, in principle, other encoding schemes could be used.
In addition to the RDF Data Model, the RDF Schemas (see [W3Crdfsch]) specification provides a typing system for the
resources and properties used in the RDF data. It defines concepts such as classes, subclasses, properties or sub-
properties. It also allows expressing constraints. Both the RDF Data Model and RDF Schema propose XML as a
serialization syntax.
RDF is a "foundation for processing meta-data in the way that it provides interoperability between applications that
exchange machine-understandable information." This suggests that RDF could be most useful to facilitate knowledge
sharing and exchange between agents.
1
A content language must be able to express at least any of propositions, objects or actions.
1
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
We suggest to use the name fipa-rdf0, for the combined use of RDF and the basic schemas which define the
extensions needed for FIPA.
2.1 Objects
Taking the above into account, it is obvious to see an analogy between an ACL object and an RDF resource, since both
are defined as descriptions of a certain identifiable entity. This enables us to use RDF resource identifiers and references
as ACL object identifiers and references. This means that to resolve an RDF reference, we can use a the FIPA
communicative act query-ref (see [FIPA00054]), which will then be followed by an 'inform' message, describing this
object.
2.2 Propositions
In the same context it seems logical to model ACL propositions using RDF statements. An RDF statement is composed
out of three parts: subject (resource), predicate (property) and object (literal/value). As an example, consider the sentence
"W. Richard Stevens is the author of TCP/IP Illustrated". The RDF components of this proposition are the subject (TCP/IP
Illustrated), the predicate (Author) and the object (W. Richard Stevens). This sentence/statement can then be described in
RDF in the following manner:
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:s="http://description.org/schema/">
Figure 1 represents this in RDF graph form. This way we have a starting point to state logical expressions in our content.
Taking this one step further, we can say that by expressing this statement, we indicate our belief in this statement. In this
way we can say that we always assume that an RDF statement expresses a belief. This approach would be sufficient in
any context where the level of logic involved is limited.
To overcome this shortcoming however, we will explain how logical belief or disbelief of a certain statement could be
expressed explicitly using RDF. To express that we believe a statement to be true or false, we have to model the original
statement as a reified statement, that is, a resource with four predefined properties:
• The subject property identifies the resource being described by the modelled statement; that is, the value of this
property is the resource about which the original statement was made.
• The predicate property identifies the property of the original statement; that is, the value is the specific property in
the original statement.
2
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
• The object property identifies the property value in the original statement; that is, the value is the object in the original
statement.
• The value of the type property describes the type of the new resource. All reified statements are instances of
rdf:Statement.
A new resource with the above four properties represents the original statement and can both be used as the object of
another statement and have additional statements made about it. The resource with these four properties is not a
replacement for the original statement, but it is a model of the statement.
By extending the RDF syntax model with the following elements, a means to express belief or disbelief of a statement is
allowed (the complete schema of the RDF extensions can be found in Section 4.1, RDF Schemas for FIPA RDF 1):
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/TR/1999/PR-rdf-schema-19990303#">
<rdfs:Class rdf:ID="http://www.fipa.org/schemas#Proposition">
<rdfs:label xml:lang="en">proposition</rdfs:label>
<rdfs:label xml:lang="fr">proposition</rdfs:label>
<rdfs:comment>This describes the set of propositions</rdfs:comment>
<rdfs:subClassOf rdf:resource=
"http://www.w3.org/1999/02/22-rdf-syntax-ns#Statement"/>
</rdfs:Class>
<rdfs:ConstraintProperty rdf:ID="http://www.fipa.org/schemas#belief">
<rdfs:label xml:lang="en">belief</rdfs:label>
<rdfs:label xml:lang="fr">acte</rdfs:label>
<rdfs:domain rdf:resource="#Proposition"/>
<rdfs:range rdf:resource=
"http://www.w3c.org/TR/1999/PR-rdf-schema-19990303#Literal"/>
</rdfs:ConstraintProperty>
</rdf:RDF>
Using this method we can easily describe ACL propositions in RDF. As an example, the following proposition will be
modelled: "The statement 'W. Richard Stevens is the author of TCP/IP Illustrated' is true". One way to do this is as
follows:
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:fipa=http://www.fipa.org/schemas/fipa-rdf0#">
<fipa:Proposition>
<rdf:subject>TCP/IP Illustrated</rdf:subject>
<rdf:predicate rdf:resource="http://description.org/ schema#author"/>
<rdf:object>W. Richard Stevens</rdf:object/>
<fipa:belief>true</fipa:belief>
</fipa:Proposition>
</rdf:RDF>
Expressing that the same statement is false, is equally easy by replacing the value 'true' with 'false'. The RDF graph
representation of the 'false' statement is presented in Figure 2.
3
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
TCP/IP Illustrated
W. Richard Stevens
rdf:subject
rdf:obj
ect
rdf:type rdf:predicate
false
2.3 Actions
An action expresses an activity, carried out by an object. There are three different properties related to an 'action':
• An act identifies the operative part of the action; it can serve to identify the type of act or merely to describe the act.
In the latter case specific types of action classes can be derived from the Action class.
• An actor identifies the entity responsible for the execution of the action, that is, the value is the specific entity which
will/can/should perform the act (often the receiver, but possibly another agent/entity under "control" of the receiver).
• An argument identifies an (optional) entity which can be used for the execution of the action; that is, the value is
entity which is used by the actor to perform the act. An action can have multiple arguments.
When looking at an action this way, there is a structural analogy with a RDF statement.
To model an action, the RDF syntax model can be extended with a new RDF type fipa:Action which has these
properties. As an example, the following action will be modelled: "John opens door1 and door2". In this small example,
the properties are the act (Open), the actor (John) and the arguments (door1 and door2). In RDF, this action can then be
described as:
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:fipa="http://www.fipa.org/schemas/fipa-rdf0#">
<fipa:Action rdf:ID="JohnAction1">
<fipa:actor>John</fipa:actor>
<fipa:act>open</fipa:act>
<fipa:argument>
<rdf:bag>
<rdf:li>door1</rdf:li>
<rdf:li>door2</rdf:li>
</rdf:bag>
</fipa:argument>
</fipa:Action>
</rdf:RDF>
4
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
According to the RDF specification, the resource type defined in the schema corresponding to the type property can be
used directly as an element name when the Description element contains a type property. So, a shorter version of the
above example could be written as follows:
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:fipa="http://www.fipa.org/schemas#">
<fipa:Action rdf:ID="JohnAction1">
<fipa:actor>John</fipa:actor>
<fipa:act>open</fipa:act>
<fipa:argument>
<rdf:bag>
<rdf:li>door1</rdf:li>
<rdf:li>door2</rdf:li>
</rdf:bag>
</fipa:argument>
</fipa:Action>
</rdf:RDF>
The model above still lacks the ability to state whether some action has finished or what the result is of the action. this
can be solved by simply adding extra properties to the description of the action.
As an example, suppose Mary requests John to open door 1 and door 2 and then wants John to inform her if he performed
the action and what the result is. This little scenario exists of two messages:
• Request from Mary to John containing the description of the action, and,
• Inform from John to Mary, referring to the action and stating the completion of the action.
Using FIPA ACL combined with RDF content, the first messages could be expressed as:
(request
:sender Mary
:receiver John
:content (
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:fipa="http://www.fipa.org/schemas#">
<fipa:Action rdf:ID="JohnAction1">
<fipa:actor>John</rdf:actor>
<fipa:act>open</rdf:act>
<fipa:argument>
<rdf:bag>
<rdf:li>door1</rdf:li>
<rdf:li>door2</rdf:li>
</rdf:bag>
</fipa:argument>
</fipa:Action>
</rdf:RDF>)
:language fipa-rdf0)
5
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
door1 door2
rdf:_1 rdf:_2
rdf:type
rdf:Bag
fipa:argument John
fipa:actor
rdf:type fipa:act
fipa:Action JohnAction open
(inform
:sender John
:receiver Mary
:content (
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:fipa="http://www.fipa.org/schemas#">
<rdf:Description about="#JohnAction1">
<fipa:done>true</fipa:done>
<fipa:result>doors closed</fipa:result>
</rdf:Description>
</rdf:RDF> )
:language fipa-rdf0)
Note the ability offered by RDF to include previous actions by means of a reference instead of repeating the whole action.
The RDF graph representation of the complete action description is presented in Figure 3.
JohnAction
fipa:done
fipa:result
6
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
When an agent does not know how to perform an action and needs a more explicit representation of this action, the
sender agent can specify the code which implements the action. For this purpose a new property for actions is
introduced, called implementedBy, which has a resource of the type Code as property its value.
A first possibility is that the property implementedBy contains a reference (a URI) to an external software module
written in a specific programming language. For this purposes the Code resource therefore has a property language and
a property code-uri. For reasons of simplicity, it is assumed that the language used is either Java or a scripting
language such as JScript or ECMAscript. So, the property code-uri is a reference to the location of code where the
method or function can be found (for Java a code base followed by a class name).
When a Java class is referenced, code-uri can contain the Java code-base. The receiving agent can then download this
class, instantiate it (if needed), and perform the required action (or not). When a non-static class is being referred, we
assume that there is always a zero-argument constructor (cfr. the requirement for JavaBeans).
In addition, we assume that there always exists a one-to-one correspondence between the FIPA arguments and fipa
result property, into the method's arguments resp. return value. When multiple arguments are used, and the sequence of
those is important, one should use the rdf:Seq container to separate them.
As an example, suppose agent 'Student' requests agent 'Mathematician' to find the next prime following after '7'. The
request message is as follows (see Figure 5):
(request
:sender Student
:receiver Mathematician
:content (
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:fipa="http://www.fipa.org/schemas/fipa-rdf0#">
<fipa:Action rdf:ID="studreq01">
<fipa:actor>Mathematician</fipa:actor>
<fipa:act>findNextPrime</fipa:act>
<fipa:argument>7</fipa:argument>
<fipa:implementedBy>
<fipa:Code>
<fipa:language>Java</fipa:language>
<fipa:code-uri>
http://www.mathagent.com/math.utility.prime
</fipa:code-uri>
</fipa:Code>
</fipa:implementedBy>
</fipa:argument>
</fipa:Action>
</rdf:RDF> )
:language fipa-rdf0)
7
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
7
fipa:actor MathAgent
fipa:argument
http://www.mathagent.com/math.utility.prime
In the previous example, it is assumed that there exists a function or method in the static class
math.utility.prime.class with the same name of the FIPA act (findNextPrime). If the name of the method is
different from the FIPA act's name, then the method name should be included after the hash sign (#) of the property value
code-uri. For example:
<fipa:implementedBy>
<fipa:Code>
<fipa:language>Java</fipa:language>
<fipa:code-uri >
http://www.mathagent.com/math.utility.prime#nextPrime
</fipa:code-uri>
</fipa:Code>
</fipa:implementedBy>
(inform
:sender Mathematician
:receiver Student
:content (
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:fipa="http://www.fipa.org/schemas/fipa-rdf0#">
<fipa:Action rdf:about="#studreq01">
<fipa:done>true</fipa:done>
<fipa:result>11</fipa:result>
</fipa:Action>
</rdf:RDF>)
:language fipa-rdf0)
studreq01
fipa:done fipa:result
true 11
Sometimes, multiple implementations can be associated with one specific action so the implementedBy property can
contain an rdf:Alt container of Code classes. In some cases, the method implementation of the code may need to
refer to values of the RDF data model and conventions are needed to establish a mapping between the RDF data and
8
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
(Java) object model. Although no real standards already exist, several initiatives are taking off to define such a binding.
Examples include:
• GINF: the interfaces specified in the Generic Interoperability Framework (see [Melnik99]),
• Other Java API's have been suggested on the RDF-DEV mailing lists.
(request
:sender agent-dealer
:receiver agent-carshop
:content (
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:fipa="http://www.fipa.org/schemas/fipa-rdf0#">
<fipa:Action rdf:ID="price-update1">
<fipa:actor>agent-carshop</rdf:actor>
<fipa:act>addNewPrices</rdf:act>
<fipa:implementedBy>
<fipa:Code>
<fipa:language>Java</fipa:language>
<fipa:binding>DATAX</fipa:binding>
<fipa:codeURI>
http://www.carshop.com/bin/CarStock
</fipa:codeURI>
</fipa:Code>
</fipa:implementedBy>
</fipa:Action>
</rdf:RDF> )
:language fipa-rdf0)
import com.muze.datax.*;
import com.muze.datax.rdf.*;
public CarStock() { }
void addNewPrices() {
EntitySet entities = new RDFReader().read("carstock.rdf");
DATAXFactory f = new DefaultDATAXFactory();
Iterator it = entities.iterator();
while (it.hasNext()) {
Entity e = (Entity)it.next();
Property p = e.getProperty("http://www.carshop.com/schemas#price");
Float price = Float.valueOf(p.getValue());
p-new = f.createProperty(Property.ATTRIBUTE,
9
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
"newprice", 1.05*price.floatValue());
e.add(p-new);
}
}
In this example, the car dealer requests the car shop to attach new prices to their car stock: the new prices should
become 5% higher than the old ones. In the Java file, the DATAX model is used to map the RDF data model into Java
objects.
A second possibility is that the fipa:implementedBy property includes code which is directly embedded as a (Java)
script. The property fipa:script of the resource fipa:Code can be used these for purposes. Once again,
conventions are needed to map the RDF data and the Java (script) model. For an example, see Section 3.3, .
10
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
3.1 Introduction
Using the fipa-rdf1 language, agents can exchange knowledge about rules. An agent can inform another agent about
one of its own "house" rules, but may also request to fire a particular rule on (a subset of) their knowledge base. In
general, we leave it up to the implementer of the agent how to use the exchanged rules. The fipa-rdf1 builds on top of
the fipa-rdf0 schemas, and provides extra schema information for expressing rules.
We will distinguish between two different approaches for dealing with rules:
In order to select parts of the RDF data resources, one can use an RDF query language. No real standards do exist at the
moment, but various specifications are available which define how to query/select particular RDF resources including:
The selection results will be put in an RDF container, identified by the property fipa:selection-result of the rule.
The manipulation part will then give an RDF description for all resources contained in the container of the selection
results. The following is an example of an RDF encoded rule:
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/TR/REC-rdf-syntax#"
xmlns:fipa="http://www.fipa.org/schemas/fipa-rdf1#"
xmlns:car="http://www.cars.org/schemas#"
xmlns:rdfq="http://www.w3.org/TandS/QL/QL98/pp/rdfquery.html">
<fipa:Rule rdf:ID="categorizeCars1">
<fipa:selection-result rdf:ID="speedycars"/>
<fipa:selection>
<rdfq:rdfquery>
<rdfq:From eachResource="http://www.carshop.com/res/">
<rdfq:Select>
<rdfq:Condition>
<rdfq:equals>
<rdfq:Property name="rdf:type"/>
<rdfq:String>
http://www.cars.org/schemas#Car
</rdfq:String>
</rdfq:equals>
11
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
<rdfq:greaterThan>
<rdfq:Property name="http://www.cars.org/schemas#speed"/>
<rdfq:Integer>200</rdfq:Integer>
</rdfq:greaterThan>
</rdfq:Condition>
</rdfq:Select>
</rdfq:From>
</rdfq:rdfquery>
</fipa:selection>
<fipa:manipulation>
<rdf:Description rdf:aboutEach="speedycars">
<car:category>speed-car</car:category>
</rdf:Description>
</fipa:manipulation>
</fipa:selection-result>
</fipa:Rule>
</rdf:RDF>
In the above example, first all cars are selected from all resources contained in http://www.carshop.com/res/ for
which the maximum speed exceeds 200 (km/h). In the manipulation part, for all resources contained in the resulting
collection, the value of the property car:category is set to speed-car.
The following example states that "for all cars for which the property speed exceeds 200 (km/h), the property category
should be set to race-car:
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/TR/REC-rdf-syntax#"
xmlns:car="http://www.cars.org/schemas#"
xmlns="http://www.fipa.org/schemas/fipa-rdf1#">
<fipa:Rule rdf:ID="categorizeCars2">
<fipa:implementedAs>
<fipa:Code>
<fipa:language>ECMAScript</fipa:language>
<fipa:binding>3AP</fipa:binding>
<fipa:script>
NodeSelection selection = new NodeSelection("");
Iterator it = selection.iterator();
while (it.hasNext()) {
Node n = (Node)it.next();
12
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
</fipa:Code>
</fipa:implementedAs>
</fipa:Rule>
</rdf:RDF>
This script uses the 3AP APIs to map the RDF data with the Java object model.
(request
:sender i
:receiver j
:content (
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/TR/REC-rdf-syntax#"
xmlns="http://www.fipa.org/schemas/fipa-rdf1#">
<FireRule>
<rdf:type rdf:resource="http://www.fipa.org/schemas#Action"/>
<argument rdf:resource="#categorizeCars2">
</FireRule>
</rdf:RDF> )
:language fipa-rdf1 )
The rules engine will then have an impact on the properties of all car instances.
Another use is that an agent informs another agent about its (implicit) belief in the correctness of a rule:
(inform
:sender i
:receiver j
:content (
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/TR/REC-rdf-syntax#"
xmlns="http://www.fipa.org/schemas/fipa-rdf1#">
<fipa:Rule about="#categorizeCars2"/>
</rdf:RDF> )
:language fipa-rdf0)
The receiving agent may then decide to apply the rule (or not).
• The RDF specification itself has been foreseen in a number of alternative 'abbreviated forms'.
• Binary encodings can be used instead, as defined by the XML Token specification (see [W3Cxml]).
• Some parts of the content can be defined in advance by unique XML identifiers (URIs) and then used in subsequent
messages. This may be especially useful when the negotiation focuses only on one specific service parameter.
13
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
To support the latter mechanism of cross-referencing parts of the RDF content, we suggest the usage of the query-ref
and inform (see [FIPA00046]) FIPA communicative acts.
14
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
4 Examples of Use
A number of companies and organisations in the FACTS project (see [FACTS]) have used FIPA RDF as content language
for agent-based provisioning of virtual private networks.
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/TR/1999/PR-rdf-schema-19990303#">
<rdfs:Class rdf:ID="Proposition">
<rdfs:label xml:lang="en">proposition</rdfs:label>
<rdfs:label xml:lang="fr">proposition</rdfs:label>
<rdfs:subClassOf rdf:resource=
"http://www.w3c.org/1999/02/22-rdf-syntax-ns#Statement"/>
<rdfs:comment>This describes the set of propositions</rdfs:comment>
</rdfs:Class>
<rdfs:ConstraintProperty rdf:ID="belief">
<rdfs:label xml:lang="en">belief</rdfs:label>
<rdfs:label xml:lang="fr">acte</rdfs:label>
<rdfs:domain rdf:resource="#Proposition"/>
<rdfs:range rdf:resource=
"http://www.w3c.org/TR/1999/PR-rdf-schema-19990303#Literal"/>
</rdfs:ConstraintProperty>
<rdfs:Class rdf:ID="Action">
<rdfs:label xml:lang="en">action</rdfs:label>
<rdfs:label xml:lang="fr">action</rdfs:label>
<rdfs:subClassOf rdf:resource=
"http://www.w3c.org/TR/1999/PR-rdf-schema-19990303#Resource"/>
<rdfs:comment>This describes the set of actions</rdfs:comment>
</rdfs:Class>
<rdfs:ConstraintProperty rdf:ID="act">
<rdfs:label xml:lang="en">act</rdfs:label>
<rdfs:label xml:lang="fr">acte</rdfs:label>
<rdfs:domain rdf:resource="#Action"/>
</rdfs:ConstraintProperty>
<rdfs:ConstraintProperty rdf:ID="actor">
<rdfs:label xml:lang="en">actor</rdfs:label>
<rdfs:label xml:lang="fr">acteur</rdfs:label>
<rdfs:domain rdf:resource="#Action"/>
</rdfs:ConstraintProperty>
<rdfs:ConstraintProperty rdf:ID="argument">
<rdfs:label xml:lang="en">argument</rdfs:label>
<rdfs:label xml:lang="fr">argument</rdfs:label>
<rdfs:domain rdf:resource="#Action"/>
</rdfs:ConstraintProperty>
15
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
<rdfs:ConstraintProperty rdf:ID="done">
<rdfs:label xml:lang="en">done</rdfs:label>
<rdfs:label xml:lang="fr">fini</rdfs:label>
<rdfs:domain rdf:resource="#Action"/>
</rdfs:ConstraintProperty>
<rdfs:ConstraintProperty rdf:ID="result">
<rdfs:label xml:lang="en">result</rdfs:label>
<rdfs:label xml:lang="fr">resultat</rdfs:label>
<rdfs:domain rdf:resource="#Action"/>
</rdfs:ConstraintProperty>
<rdfs:ConstraintProperty rdf:ID="implementedBy">
<rdfs:label xml:lang="en">implementedBy</rdfs:label>
<rdfs:label xml:lang="fr">implemente par</rdfs:label>
<rdfs:domain rdf:resource="#Action"/>
</rdfs:ConstraintProperty>
<rdfs:Class rdf:ID="Code">
<rdfs:label xml:lang="en">code</rdfs:label>
<rdfs:label xml:lang="fr">code</rdfs:label>
<rdfs:comment>This describes the code implementation</rdfs:comment>
</rdfs:Class>
<rdfs:ConstraintProperty rdf:ID="language">
<rdfs:label xml:lang="en">language</rdfs:label>
<rdfs:label xml:lang="fr">langue</rdfs:label>
<rdfs:domain rdf:resource="#Code"/>
<rdfs:range rdf:resource=
"http://www.w3c.org/TR/1999/PR-rdf-schema-19990303#Literal"/>
</rdfs:ConstraintProperty>
<rdfs:ConstraintProperty rdf:ID="binding">
<rdfs:label xml:lang="en">binding</rdfs:label>
<rdfs:label xml:lang="fr">binding</rdfs:label>
<rdfs:domain rdf:resource="#Code"/>
<rdfs:range rdf:resource=
"http://www.w3c.org/TR/1999/PR-rdf-schema-19990303#Literal"/>
</rdfs:ConstraintProperty>
<rdfs:ConstraintProperty rdf:ID="code-uri">
<rdfs:label xml:lang="en">code-uri</rdfs:label>
<rdfs:label xml:lang="fr">code-uri</rdfs:label>
<rdfs:domain rdf:resource="#Code"/>
<rdfs:range rdf:resource=
"http://www.w3c.org/TR/1999/PR-rdf-schema-19990303#Literal"/>
</rdfs:ConstraintProperty>
<rdfs:ConstraintProperty rdf:ID="script">
<rdfs:label xml:lang="en">script</rdfs:label>
<rdfs:label xml:lang="fr">script</rdfs:label>
<rdfs:domain rdf:resource="#Code"/>
<rdfs:range rdf:resource=
"http://www.w3c.org/TR/1999/PR-rdf-schema-19990303#Literal"/>
</rdfs:ConstraintProperty>
</rdf:RDF>
16
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/TR/1999/PR-rdf-schema-19990303#"
xmlns:fipa="http://www.fipa.org/schemas/fipa-rdf0#">
<rdfs:Class rdf:ID="Rule">
<rdfs:label xml:lang="en">rule</rdfs:label>
<rdfs:label xml:lang="fr">regle</rdfs:label>
</rdfs:Class>
<rdfs:ConstraintProperty rdf:ID="selection">
<rdfs:comment>The selection part </rdfs:comment>
<rdfs:domain rdf:resource="Rule"/>
</rdfs:ConstraintProperty>
<rdfs:ConstraintProperty rdf:ID="manipulation">
<rdfs:comment>The manipulation part</rdfs:comment>
<rdfs:domain rdf:resource="Rule"/>
</rdfs:ConstraintProperty>
<rdfs:ConstraintProperty rdf:ID="selection-result">
<rdfs:comment>
Identifies the container filled with selection results
</rdfs:comment>
<rdfs:domain rdf:resource="Rule"/>
<rdfs:range rdf:resource=
"http://www.w3c.org/TR/1999/PR-rdf-schema-19990303#Bag"/>
</rdfs:ConstraintProperty>
<rdfs:ConstraintProperty rdf:ID="implementedAs">
<rdfs:label xml:lang="en">implemented as</rdfs:label>
<rdfs:label xml:lang="fr">implemente comme</rdfs:label>
<rdfs:domain rdf:resource="Rule"/>
</rdfs:ConstraintProperty>
</rdf:RDF>
17
© 2000 Foundation for Intelligent Physical Agents FIPA RDF Content Language
5 References
[DATAX] DATAX: Data Exchange in XML. 1999.
http://www.megginson.com/DATAX/
[Decker98] A Query and Inference Service for RDF, Decker, S, Brickley, D, Saarela, J and Angele, J. 1998.
http://www.ilrt.bris.ac.uk/discovery/rdf-dev/purls/papers/QL98-
queryservice/
[FACTS] FIPA Agent Communication Technologies and Services (FACTS).
http://www.labs.bt.com/profsoc/facts/
[FIPA00046] FIPA Inform Communicative Act Specification. Foundation for Intelligent Physical Agents, 2000.
http://www.fipa.org/specs/fipa00046/
[FIPA00054] FIPA Query Ref Communicative Act Specification. Foundation for Intelligent Physical Agents, 2000.
http://www.fipa.org/specs/fipa00054/
[Melnik99] Generic Interoperability Framework (GINF) Working Paper, Melnik, S. Stanford University, 1999.
[W3Crdf] Status for Resource Description Framework (RDF) Model and Syntax Specification (Proposed
Recommendation). World Wide Web Consortium, 1999.
http://www.w3.org/TR/REC-rdf-syntax/
[W3Crdfquery] RDF Query Specification (Technical Contribution). World Wide Web Consortium, 1998.
http://www.w3.org/TandS/QL/QL98/pp/rdfquery.html
[W3Crdfsch] Resource Description Framework (RDF) Schema Specification 1.0 (Candidate Recommendation). World
Wide Web Consortium, 2000.
http://www.w3.org/TR/rdf-schema/
[W3Cxml] Extensible Markup Language (XML) 1.0 Specification (Recommendation). World Wide Web Consortium,
1998.
http://www.w3c.org/TR/REC-xml/
18
1
10
11
12
13
14
15
16
18 Geneva, Switzerland
Notice
Use of the technologies described in this specification may infringe patents, copyrights or other intellectual property
rights of FIPA Members and non-members. Nothing in this specification should be construed as granting permission to
use any of the technologies described. Anyone planning to make use of technology covered by the intellectual property
rights of others should first obtain permission from the holder(s) of the rights. FIPA strongly encourages anyone
implementing any part of this specification to determine first whether part(s) sought to be implemented are covered by
the intellectual property of others, and, if so, to obtain appropriate licenses or other permission from the holder(s) of
such intellectual property prior to implementation. This specification is subject to change without notice. Neither FIPA
nor any of its Members accept any responsibility whatsoever for damages or liability, direct or consequential, which
may result from the use of this specification.
19 Foreword
20 The Foundation for Intelligent Physical Agents (FIPA) is an international organization that is dedicated to promoting the
21 industry of intelligent agents by openly developing specifications supporting interoperability among agents and agent-
22 based applications. This occurs through open collaboration among its member organizations, which are companies and
23 universities that are active in the field of agents. FIPA makes the results of its activities available to all interested parties
24 and intends to contribute its results to the appropriate formal standards bodies.
25 The members of FIPA are individually and collectively committed to open competition in the development of agent-
26 based applications, services and equipment. Membership in FIPA is open to any corporation and individual firm,
27 partnership, governmental body or international organization without restriction. In particular, members are not bound to
28 implement or use specific agent-based standards, recommendations and FIPA specifications by virtue of their
29 participation in FIPA.
30 The FIPA specifications are developed through direct involvement of the FIPA membership. The status of a
31 specification can be either Preliminary, Experimental, Standard, Deprecated or Obsolete. More detail about the process
32 of specification may be found in the FIPA Procedures for Technical Work. A complete overview of the FIPA
33 specifications and their current status may be found in the FIPA List of Specifications. A list of terms and abbreviations
34 used in the FIPA specifications may be found in the FIPA Glossary.
35 FIPA is a non-profit association registered in Geneva, Switzerland. As of January 2000, the 56 members of FIPA
36 represented 17 countries worldwide. Further information about FIPA as an organization, membership information, FIPA
37 specifications and upcoming meetings may be found at http://www.fipa.org/.
ii
38 Contents
39 1 Scope .......................................................................................................................................................................... 1
40 2 Grammar FIPA SL Concrete Syntax........................................................................................................................... 2
41 2.1 Lexical Definitions ................................................................................................................................................ 3
42 3 Notes on FIPA SL Semantics ..................................................................................................................................... 5
43 3.1 Grammar Entry Point: FIPA SL Content Expression ........................................................................................... 5
44 3.2 Well-Formed Formulas ........................................................................................................................................ 5
45 3.3 Atomic Formula.................................................................................................................................................... 6
46 3.4 Terms................................................................................................................................................................... 7
47 3.5 Referential Operators .......................................................................................................................................... 7
48 3.5.1 Iota................................................................................................................................................................ 7
49 3.5.2 Any ............................................................................................................................................................... 9
50 3.5.3 All................................................................................................................................................................ 10
51 3.6 Functional Terms ............................................................................................................................................... 11
52 3.7 Result Predicate ................................................................................................................................................ 12
53 3.8 Actions and Action Expressions ........................................................................................................................ 12
54 3.9 Agent Identifiers ................................................................................................................................................. 13
55 3.10 Numerical Constants ......................................................................................................................................... 13
56 3.11 Date and Time Constants.................................................................................................................................. 13
57 4 Reduced Expressivity Subsets of FIPA SL ............................................................................................................... 14
58 4.1 FIPA SL0: Minimal Subset ................................................................................................................................. 14
59 4.2 FIPA SL1: Propositional Form ........................................................................................................................... 15
60 4.3 FIPA SL2: Decidability Restrictions ................................................................................................................... 16
61 5 References................................................................................................................................................................ 19
62 6 Annex A — Syntax and Lexical Notation .................................................................................................................. 20
63
iii
63 1 Scope
64 This specification defines a concrete syntax for the FIPA Semantic Language (SL) content language. This syntax and
65 its associated semantics are suggested as a candidate content language for use in conjunction with the FIPA Agent
66 Communication Language (see [FIPA00037]). In particular, the syntax is defined to be a sub-grammar of the very
67 general s-expression syntax specified for message content given in [FIPA00037].
68
69 This content language is included in the specification on an informative basis. It is not mandatory for any FIPA
70 implementation to implement the computational mechanisms necessary to process all of the constructs in this
71 language. However, FIPA SL is a general purpose representation formalism that may be suitable for use in a number of
72 different agent domains.
73
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
2
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
3
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
196
197 ParameterName = ":" String.
198
199 VariableIdentifier = "?" String.
200
201 Sign = [ "+" , "-" ].
202
203 Integer = Sign? DecimalLiteral+
204 | Sign? "0" ["x", "X"] HexLiteral+.
205
206 Dot = "."
207
208 Float = Sign? FloatMantissa FloatExponent?
209 | Sign? DecimalLiteral+ FloatExponent.
210
211 FloatMantissa = DecimalLiteral+ Dot DecimalLiteral*
212 | DecimalLiteral* Dot DecimalLiteral+.
213
214 FloatExponent = Exponent Sign? DecimalLiteral+.
215
216 Exponent = ["e","E"].
217
218 DecimalLiteral = ["0" - "9"].
219
220 HexLiteral = ["0" - "9", "A" - "F", "a" - "f"].
221
222 StringLiteral = "\""( [~ "\""]
223 | "\\\"" )*"\"".
224
225 DateTime = Year Month Day "T" Hour Minute
226 Second MilliSecond TypeDesignator?.
227
228 Year = DecimalLiteral DecimalLiteral DecimalLiteral DecimalLiteral.
229
230 Month = DecimalLiteral DecimalLiteral.
231
232 Day = DecimalLiteral DecimalLiteral.
233
234 Hour = DecimalLiteral DecimalLiteral.
235
236 Minute = DecimalLiteral DecimalLiteral.
237
238 Second = DecimalLiteral DecimalLiteral.
239
240 MilliSecond = DecimalLiteral DecimalLiteral DecimalLiteral.
241
242 TypeDesignator = ["a" - "z" , "A" – "Z"].
243
244
4
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
1
If and only if.
5
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
293 Existential quantification. The quantified expression is true if there is at least one value for the variable for which
294 Wff is true.
295
296 (B <agent> <expression>)
297 Belief. It is true that agent believes that expression is true.
298
299 (U <agent> <expression>)
300 Uncertainty. It is true that agent is uncertain of the truth of expression. Agent neither believes expression
301 nor its negation, but believes that expression is more likely to be true than its negation.
302
303 (I <agent> <expression>)
304 Intention. It is true that agent intends that expression becomes true and will plan to bring it about.
305
306 (PG <agent> <expression>)
307 Persistent goal. It is true that agent holds a persistent goal that expression becomes true, but will not
308 necessarily plan to bring it about.
309
310 (feasible <ActionExpression> <Wff>)
311 It is true that ActionExpression (or, equivalently, some event) can take place and just afterwards Wff will be
312 true.
313
314 (feasible <ActionExpression>)
315 Same as (feasible <ActionExpression> true).
316
317 (done <ActionExpression> <Wff>)
318 It is true that ActionExpression (or, equivalently, some event) has just taken place and just before that Wff was
319 true.
320
321 (done <ActionExpression>)
322 Same as (done <ActionExpression> true).
323
6
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
347 The > operator relies on an order relation defined to be the usual numeric ordering for numerical constants and the
348 usual alphabetical ordering for literal constants. Under this order relation, Constant1 denotes an object that
349 comes after the object denoted by Constant2, under the semantics of the domain.
350
351 (>= Constant1 Constant2)
352 The >= operator relies on an order relation defined to be the usual numeric ordering for numerical constants and
353 the usual alphabetical ordering for literal constants. Under this order relation, Constant1 denotes an object that
354 comes after or is the same object as the object denoted by Constant2, under the semantics of the domain.
355
356 (< Constant1 Constant2)
357 The < operator relies on an order relation defined to be the usual numeric ordering for numerical constants and the
358 usual alphabetical ordering for literal constants. Under this order relation, Constant1 denotes an object that
359 comes before the object denoted by Constant2, under the semantics of the domain.
360
361 (=< Constant1 Constant2)
362 The =< operator relies on an order relation defined to be the usual numeric ordering for numerical constants and
363 the usual alphabetical ordering for literal constants. Under this order relation, Constant1 denotes an object that
364 comes before or is the same object as the object denoted by Constant2, under the semantics of the domain.
365
366 (member Term Collection)
367 The object denoted by Term, under the semantics of the domain, is a member of the collection (either a set or a
368 sequence) denoted by Collection under the semantics of the domain.
369
370 (contains Collection1 Collection2)
371 If Collection1 and Collection2 denote sets, this proposition means the set denoted by Collection1
372 contains the set denoted by Collection2. If the arguments are sequences, then the proposition means that all of
373 the elements of the sequence denoted by Collection2 appear in the same order in the sequence denoted by
374 Collection1.
375
376 Other predicates may be defined over a set of arguments, each of which is a term, by using the (PredicateSymbol
377 Term+) production.
378
379 The FIPA SL representation does not define a meaning for other symbols in atomic formulae: this is the responsibility of
380 the domain language representation and the relative ontology.
381
7
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
397 FIPA SL expression. The expression (iota x (P x)) may be read as "the x such that P [is true] of x". The iota
398 operator is a constructor for terms which denote objects in the domain of discourse.
399
400 Formal Definition
401 A iota expression can only be evaluated with respect to a given theory. Suppose KB is a knowledge base such
402 that T(KB) is the theory generated from KB by a given reasoning mechanism. Formally, ( , ) iff is a term that
403 belongs to the set { : T(KB)} and is a singleton; or ( , ) is undefined if is not a singleton. In this
404 definition is a most general variable substitution, is the result of applying to , and is the result of applying
405 to . This implies that a failure occurs if no object or more than one object satisfies the condition specified in the
406 iota operator.
407
408 Example 1
409 This example depicts an interaction between agent A and B that makes use of the iota operator, where agent A is
410 supposed to have the following knowledge base KB={P(A), Q(1, A), Q(1, B)}.
411
412 (query-ref
413 :sender (agent-idenfier :name B)
414 :receiver (set (agent-identifier :name A))
415 :content
416 ((iota ?x (p ?x)))
417 :language FIPA-SL
418 :reply-with query1)
419
420 (inform
421 :sender (agent-identifier :name A)
422 :receiver (set (agent-identifier :name B)
423 :content
424 ((= (iota ?x (p ?x)) a))
425 :language FIPA-SL
426 :in-reply-to query1)
427
428 The only object that satisfies proposition P(x) is a, therefore, the query-ref message is replied by the inform
429 message as shown.
430
431 Example 2
432 This example shows another successful interaction but more complex than the previous one.
433
434 (query-ref
435 :sender (agent-identifier :name B)
436 :receiver (set (agent-identifier :name A))
437 :content
438 ((iota ?x (q ?x ?y)))
439 :language FIPA-SL
440 :reply-with query2)
441
442 (inform
443 :sender (agent-identifier :name A)
444 :receiver (set (agent-identifier :name B))
445 :content
446 ((= (iota ?x (q ?x ?y)) 1))
447 :language FIPA-SL
448 :in-reply-to query2)
449
450 The most general substitutions such that Q(x, y) can be derived from KB are 1 {x/1, y/A} and 2 {x/1, y/B}.
451 Therefore, the set { : T(KB)} {{x/1, y/A}x, {x/1, y/B}x } {1} is a singleton and hence (iota ?x (q ?x ?y))
452 represents the object 1.
453
454 Example 3
8
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
455 Finally, this example shows an unsuccessful interaction using the iota operator. In this case, agent A cannot
456 evaluate the iota expression and therefore a failure message is returned to agent B
457
458 (query-ref
459 :sender (agent-identifier :name B)
460 :receiver (set (agent-identifier :name A))
461 :content
462 ((iota ?y (q ?x ?y)))
463 :language FIPA-SL
464 :reply-with query3)
465
466 (failure
467 :sender (agent-identifier :name A)
468 :receiver (set (agent-identifier :name B))
469 :content
470 ((action (agent-identifier :name A)
471 (inform-ref
472 :sender (agent-identifier :name A)
473 :receiver (set (agent-identifier :name B))
474 :content
475 "((iota ?y (q ?x ?y)))"
476 :language FIPA-SL
477 :in-reply-to query3))
478 more-than-one-answer)
479 :language FIPA-SL
480 :in-reply-to query3)
481
482 The most general substitutions that satisfy Q(x, y) are 1 {x/1, y/a} and 2 {x/1, y/b}, therefore, the set { :
483 T(KB)} {{x/1, y/A}y, {x/1, y/B}y} {A, B}, which is not a singleton. This means that the iota expression used in
484 this interaction is not defined.
485
9
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
10
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
570
571 (query-ref
572 :sender (agent-identifier :name B)
573 :receiver (set (agent-identifier :name A))
574 :content
575 ((all (sequence ?x ?y) (q ?x ?y)))
576 :language FIPA-SL
577 :reply-with query1)
578
579 (inform
580 :sender (agent-identifier :name A)
581 :receiver (set (agent-identifier :name B))
582 :content
583 (( = (all (sequence ?x ?y) (q ?x ?y)) (set(sequence 1 a)(sequence 1 b))))
584 :language FIPA-SL
585 :in-reply-to query1)
586
587 The set of the most general substitutions such that Q(x, y) can be derived from KB is {{x/1, y/A}, {x/1, y/B}},
588 therefore all(Sequence(x, y), Q(x, y)) {Sequence(1, A), Sequence(1, B)}.
589
590 Example 7
591 Following Example 6, if there is no possible answer to a query making use of the all operator, then the agent
592 should return the empty set.
593
594 (query-ref
595 :sender (agent-identifier :name B)
596 :receiver (set (agent-identifier :name A))
597 :content
598 ((all ?x (q ?x c)))
599 :language FIPA-SL
600 :reply-with query2)
601
602 (inform
603 :sender (agent-identifier :name A)
604 :receiver (set (agent-identifier :name B))
605 :content
606 ((= (all ?x (q ?x c))(set)))
607 :language FIPA-SL
608 :in-reply-to query2)
609
610 Since there is no possible substitution for x such that Q(x, C) can be derived from KB, then all(x, Q(x, c))={}. In this
611 interaction the term (set) represents the empty set.
612
11
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
12
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
662 Notice that a specific type of action is an ACL communicative act (CA). When expressed in FIPA SL, syntactically an
663 ACL communicative act is an action where the term denotes the CA including all its parameters, as referred by the used
664 ontology. Example 5 includes an example of an ACL CA, encoded as a String, whose content embeds another CA.
665
666 Two operators are used to build terms denoting composite CAs:
667
668 the sequencing operator (;) denotes a composite act in which the first action (represented by the first operand) is
669 followed by the second action, and,
670
671 the alternative operator (|) denotes a composite act in which either the first action occurs, or the second, but not
672 both.
673
13
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
14
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
754
755 Constant = NumericalConstant
756 | String
757 | DateTime.
758
759 Set = "(" "set" Term* ")".
760
761 Sequence = "(" "sequence" Term* ")".
762
763 NumericalConstant = Integer
764 | Float.
765
766 The same lexical definitions described in Section 2.1, Lexical Definitions apply for FIPA SL0.
767
15
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
16
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
876
877 ExistQuantExpression = "(" "exists" Variable Wff ")"
878 | "(" "exists" Variable ExistQuantExpression ")".
879
880 Term = Variable
881 | FunctionalTerm
882 | ActionExpression
883 | IdentifyingExpression
884 | Constant
885 | Sequence
886 | Set.
887
888 IdentifyingExpression = "(" ReferentialOp Term Wff ")".
889
890 ReferentialOp = "iota"
891 | "any"
892 | "all".
893
894 FunctionalTerm = "(" FunctionSymbol Term* ")"
895 | "(" FunctionSymbol Parameter* ")".
896
897 Parameter = ParameterName ParameterValue.
898
899 ParameterValue = Term.
900
901 ActionExpression = "(" "action" Agent Term ")"
902 | "(" "|" ActionExpression ActionExpression ")"
903 | "(" ";" ActionExpression ActionExpression ")".
904
905 Variable = VariableIdentifier.
906
907 Agent = Term.
908
909 FunctionSymbol = String.
910
911 Constant = NumericalConstant
912 | String
913 | DateTime.
914
915 ModalOp = "B"
916 | "U"
917 | "PG"
918 | "I".
919
920 ActionOp = "feasible"
921 | "done".
922
923 PropositionSymbol = String.
924
925 PredicateSymbol = String.
926
927 Set = "(" "set" Term* ")".
928
929 Sequence = "(" "sequence" Term* ")".
930
931 NumericalConstant = Integer
932 | Float.
933
934
935 The same lexical definitions described in Section 2.1, Lexical Definitions apply for FIPA SL2.
936
937 The Wff production of FIPA SL2 no longer directly contains the logical quantifiers, but these are treated separately to
938 ensure only prefixed quantified formulas, such as:
17
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
939
940 (forall ?x1
941 (forall ?x2
942 (exists ?y1
943 (exists ?y2
944 (Phi ?x1 ?x2 ?y1 ?y2)))))
945
946 Where (Phi ?x1 ?x2 ?y1 ?y2) does not contain any quantifier.
947
948 The grammar of FIPA SL2 still allows for quantifying-in inside modal operators. For example, the following formula is
949 still admissible under the grammar:
950
951 (forall ?x1
952 (or
953 (B i (p ?x1))
954 (B j (q ?x1))))
955
956 It is not clear that formulae of this kind are decidable. However, changing the grammar to express this context
957 sensitivity would make the EBNF form above essentially unreadable. Thus, the following additional mandatory
958 constraint is placed on well-formed content expressions using FIPA SL2:
959
960 Within the scope of an SLModalOperator only closed formulas are allowed, that is, formulas without free variables.
961
962
18
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
962 5 References
963 [FIPA00023] FIPA Agent Management Specification. Foundation for Intelligent Physical Agents, 2000.
964 http://www.fipa.org/specs/fipa00023/
965 [FIPA00037] FIPA Agent Communication Language Overview. Foundation for Intelligent Physical Agents, 2000.
966 http://www.fipa.org/specs/fipa00037/
967 [ISO8601] Date Elements and Interchange Formats, Information Interchange-Representation of Dates and Times.
968 International Standards Organisation, 1998.
969 http://www.iso.ch/cate/d15903.html
970
971
19
© 2000 Foundation for Intelligent Physical Agents FIPA SL Content Language
20
Ontology
Ontology
In the discussion of speech acts, the sentence,
● I will meet you on Mars.
was presented as a speech act that in some sense (but not a logical sense) was false.
On the other hand, the sentence,
● I will meet you at the show.
makes sense.
How do we know whyone is nonsense and the other, sensible. Because we share an ontology which we
have learned by "being in the world". We know what the words "Mars", and "show" refer to.
Furthermore, we know certain relationships between the referents of these words. For example, we know
quite well that we live on Earth which is a long way from Mars.
This shared ontolgy allows us to communicate with one another. The same idea is carried over to the
worlds of artificial agents. For artificial agents to communicate they also must share ontologies.
What is an ontology?
Protege-2000
Wine Ontology
1
of time. This representation includes the notions of time intervals, points in time, relative
measures of time, and so on. If one group of researchers develops such an ontology in detail,
others can simply reuse it for their domains. Additionally, if we need to build a large ontology,
we can integrate several existing ontologies describing portions of the large domain. We can also
reuse a general ontology, such as the UNSPSC ontology, and extend it to describe our domain of
interest.
Making explicit domain assumptions underlying an implementation makes it possible to change
these assumptions easily if our knowledge about the domain changes. Hard-coding assumptions
about the world in programming-language code makes these assumptions not only hard to find
and understand but also hard to change, in particular for someone without programming
expertise. In addition, explicit specifications of domain knowledge are useful for new users who
must learn what terms in the domain mean.
Separating the domain knowledge from the operational knowledge is another common use of
ontologies. We can describe a task of configuring a product from its components according to a
required specification and implement a program that does this configuration independent of the
products and components themselves (McGuinness and Wright 1998). We can then develop an
ontology of PC-components and characteristics and apply the algorithm to configure made-to-
order PCs. We can also use the same algorithm to configure elevators if we “feed” an elevator
component ontology to it (Rothenfluh et al. 1996).
Analyzing domain knowledge is possible once a declarative specification of the terms is
available. Formal analysis of terms is extremely valuable when both attempting to reuse existing
ontologies and extending them (McGuinness et al. 2000).
Often an ontology of the domain is not a goal in itself. Developing an ontology is akin to
defining a set of data and their structure for other programs to use. Problem-solving methods,
domain-independent applications, and software agents use ontologies and knowledge bases built
from ontologies as data. For example, in this paper we develop an ontology of wine and food and
appropriate combinations of wine with meals. This ontology can then be used as a basis for some
applications in a suite of restaurant-managing tools: One application could create wine
suggestions for the menu of the day or answer queries of waiters and customers. Another
application could analyze an inventory list of a wine cellar and suggest which wine categories to
expand and which particular wines to purchase for upcoming menus or cookbooks.
2
an ontology are different from the structure for a similar domain in an object-oriented program.
It is impossible to cover all the issues that an ontology developer may need to grapple with and
we are not trying to address all of them in this guide. Instead, we try to provide a starting point;
an initial guide that would help a new ontology designer to develop ontologies. At the end, we
suggest places to look for explanations of more complicated structures and design mechanisms if
the domain requires them.
Finally, there is no single correct ontology-design methodology and we did not attempt to define
one. The ideas that we present here are the ones that we found useful in our own ontology-
development experience. At the end of this guide we suggest a list of references for alternative
methodologies.
2 What is in an ontology?
The Artificial-Intelligence literature contains many definitions of an ontology; many of these
contradict one another. For the purposes of this guide an ontology is a formal explicit description
of concepts in a domain of discourse (classes (sometimes called concepts)), properties of each
concept describing various features and attributes of the concept (slots (sometimes called roles
or properties)), and restrictions on slots (facets (sometimes called role restrictions)). An
ontology together with a set of individual instances of classes constitutes a knowledge base. In
reality, there is a fine line where the ontology ends and the knowledge base begins.
Classes are the focus of most ontologies. Classes describe concepts in the domain. For example,
a class of wines represents all wines. Specific wines are instances of this class. The Bordeaux
wine in the glass in front of you while you read this document is an instance of the class of
Bordeaux wines. A class can have subclasses that represent concepts that are more specific than
the superclass. For example, we can divide the class of all wines into red, white, and rosé wines.
Alternatively, we can divide a class of all wines into sparkling and non-sparkling wines.
Slots describe properties of classes and instances: Château Lafite Rothschild
Pauillac wine has a full body; it is produced by the Château Lafite Rothschild
winery. We have two slots describing the wine in this example: the slot body with the value full
and the slot maker with the value Château Lafite Rothschild winery. At the class level,
we can say that instances of the class Wine will have slots describing their flavor, body,
sugar level, the maker of the wine and so on.1
All instances of the class Wine, and its subclass Pauillac, have a slot maker the value of which
is an instance of the class Winery (Figure 1). All instances of the class Winery have a slot
produces that refers to all the wines (instances of the class Wine and its subclasses) that the
winery produces.
In practical terms, developing an ontology includes:
• defining classes in the ontology,
• arranging the classes in a taxonomic (subclass–superclass) hierarchy,
• defining slots and describing allowed values for these slots,
• filling in the values for slots for instances.
We can then create a knowledge base by defining individual instances of these classes filling in
specific slot value information and additional slot restrictions.
1
We capitalize class names and start slot names with low-case letters. We also use typewriter font for
all terms from the example ontology.
3
Figure 1. Some classes, instances, and relations among them in the wine domain. We used black for
classes and red for instances. Direct links represent slots and internal links such as instance-of and
subclass-of.
4
Step 1. Determine the domain and scope of the ontology
We suggest starting the development of an ontology by defining its domain and scope. That is,
answer several basic questions:
• What is the domain that the ontology will cover?
• For what we are going to use the ontology?
• For what types of questions the information in the ontology should provide answers?
• Who will use and maintain the ontology?
The answers to these questions may change during the ontology-design process, but at any given
time they help limit the scope of the model.
Consider the ontology of wine and food that we introduced earlier. Representation of food and
wines is the domain of the ontology. We plan to use this ontology for the applications that
suggest good combinations of wines and food.
Naturally, the concepts describing different types of wines, main food types, the notion of a good
combination of wine and food and a bad combination will figure into our ontology. At the same
time, it is unlikely that the ontology will include concepts for managing inventory in a winery or
employees in a restaurant even though these concepts are somewhat related to the notions of
wine and food.
If the ontology we are designing will be used to assist in natural language processing of articles
in wine magazines, it may be important to include synonyms and part-of-speech information for
concepts in the ontology. If the ontology will be used to help restaurant customers decide which
wine to order, we need to include retail-pricing information. If it is used for wine buyers in
stocking a wine cellar, wholesale pricing and availability may be necessary. If the people who
will maintain the ontology describe the domain in a language that is different from the language
of the ontology users, we may need to provide the mapping between the languages.
Competency questions.
One of the ways to determine the scope of the ontology is to sketch a list of questions that a
knowledge base based on the ontology should be able to answer, competency questions
(Gruninger and Fox 1995). These questions will serve as the litmus test later: Does the
ontology contain enough information to answer these types of questions? Do the answers require
a particular level of detail or representation of a particular area? These competency questions are
just a sketch and do not need to be exhaustive.
In the wine and food domain, the following are the possible competency questions:
• Which wine characteristics should I consider when choosing a wine?
• Is Bordeaux a red or white wine?
• Does Cabernet Sauvignon go well with seafood?
• What is the best choice of wine for grilled meat?
• Which characteristics of a wine affect its appropriateness for a dish?
• Does a bouquet or body of a specific wine change with vintage year?
• What were good vintages for Napa Zinfandel?
Judging from this list of questions, the ontology will include the information on various wine
characteristics and wine types, vintage years—good and bad ones—classifications of foods that
matter for choosing an appropriate wine, recommended combinations of wine and food.
5
Step 2. Consider reusing existing ontologies
It is almost always worth considering what someone else has done and checking if we can refine
and extend existing sources for our particular domain and task. Reusing existing ontologies may
be a requirement if our system needs to interact with other applications that have already
committed to particular ontologies or controlled vocabularies. Many ontologies are already
available in electronic form and can be imported into an ontology-development environment that
you are using. The formalism in which an ontology is expressed often does not matter, since
many knowledge-representation systems can import and export ontologies. Even if a knowledge-
representation system cannot work directly with a particular formalism, the task of translating an
ontology from one formalism to another is usually not a difficult one.
There are libraries of reusable ontologies on the Web and in the literature. For example, we can
use the Ontolingua ontology library (http://www.ksl.stanford.edu/software/ontolingua/) or the
DAML ontology library (http://www.daml.org/ontologies/). There are also a number of publicly
available commercial ontologies (e.g., UNSPSC (www.unspsc.org), RosettaNet
(www.rosettanet.org), DMOZ (www.dmoz.org)).
For example, a knowledge base of French wines may already exist. If we can import this
knowledge base and the ontology on which it is based, we will have not only the classification of
French wines but also the first pass at the classification of wine characteristics used to
distinguish and describe the wines. Lists of wine properties may already be available from
commercial Web sites such as www.wines.com that customers consider use to buy wines.
For this guide however we will assume that no relevant ontologies already exist and start
developing the ontology from scratch.
6
the Wine class by creating some of its subclasses: White wine, Red wine, Rosé
wine. We can further categorize the Red wine class, for example, into Syrah, Red
Burgundy, Cabernet Sauvignon, and so on.
• A bottom-up development process starts with the definition of the most specific classes,
the leaves of the hierarchy, with subsequent grouping of these classes into more general
concepts. For example, we start by defining classes for Pauillac and Margaux
wines. We then create a common superclass for these two classes—Medoc—which in
turn is a subclass of Bordeaux.
• A combination development process is a combination of the top-down and bottom-up
approaches: We define the more salient concepts first and then generalize and specialize
them appropriately. We might start with a few top-level concepts such as Wine, and a
few specific concepts, such as Margaux . We can then relate them to a middle-level
concept, such as Medoc. Then we may want to generate all of the regional wine classes
from France, thereby generating a number of middle-level concepts.
Figure 2 shows a possible breakdown among the different levels of generality.
Top
level
Middle
level
Bottom
level
Figure 2. The different levels of the Wine taxonomy: Wine is the most general concept. Red wine,
White wine, and Rosé wine are general top level concepts. Pauillac and Margaux are the
most specific classes in the hierarchy (or the bottom level concepts).
None of these three methods is inherently better than any of the others. The approach to take
depends strongly on the personal view of the domain. If a developer has a systematic top-down
view of the domain, then it may be easier to use the top-down approach. The combination
approach is often the easiest for many ontology developers, since the concepts “in the middle”
tend to be the more descriptive concepts in the domain (Rosch 1978).
If you tend to think of wines by distinguishing the most general classification first, then the top-
down approach may work better for you. If you’d rather start by getting grounded with specific
examples, the bottom-up approach may be more appropriate.
Whichever approach we choose, we usually start by defining classes. From the list created in
7
Step 3, we select the terms that describe objects having independent existence rather than terms
that describe these objects. These terms will be classes in the ontology and will become anchors
in the class hierarchy.2 We organize the classes into a hierarchical taxonomy by asking if by
being an instance of one class, the object will necessarily (i.e., by definition) be an instance of
some other class.
If a class A is a superclass of class B, then every instance of B is also an
instance of A
In other words, the class B represents a concept that is a “kind of” A.
For example, every Pinot Noir wine is necessarily a red wine. Therefore the Pinot Noir class
is a subclass of the Red Wine class.
Figure 2 shows a part of the class hierarchy for the Wine ontology. Section 4 contains a detailed
discussion of things to look for when defining a class hierarchy.
Figure 3. The slots for the class Wine and the facets for these slots. The “I” icon next to the maker
slot indicates that the slot has an inverse (Section 5.1)
2
We can also view classes as unary predicates—questions that have one argument. For example, “Is this
object a wine?” Unary predicates (or classes) contrast with binary predicates (or slots)—questions that
have two arguments. For example, “Is the flavor of this object strong?” “What is the flavor of this object?”
8
• relationships to other individuals; these are the relationships between individual
members of the class and other items (e.g., the maker of a wine, representing a
relationship between a wine and a winery, and the grape the wine is made from.)
Thus, in addition to the properties we have identified earlier, we need to add the following slots
to the Wine class: name, area, maker, grape. Figure 3 shows the slots for the class Wine.
All subclasses of a class inherit the slot of that class. For example, all the slots of the class Wine
will be inherited to all subclasses of Wine, including Red Wine and White Wine. We will
add an additional slot, tannin level (low, moderate, or high), to the Red Wine class. The
tannin level slot will be inherited by all the classes representing red wines (such as
Bordeaux and Beaujolais).
A slot should be attached at the most general class that can have that property. For instance,
body and color of a wine should be attached at the class Wine, since it is the most general
class whose instances will have body and color.
Slot cardinality
Slot cardinality defines how many values a slot can have. Some systems distinguish only between
single cardinality (allowing at most one value) and multiple cardinality (allowing any number of
values). A body of a wine will be a single cardinality slot (a wine can have only one body).
Wines produced by a particular winery fill in a multiple-cardinality slot produces for a
Winery class.
Some systems allow specification of a minimum and maximum cardinality to describe the
number of slot values more precisely. Minimum cardinality of N means that a slot must have at
least N values. For example, the grape slot of a Wine has a minimum cardinality of 1: each
wine is made of at least one variety of grape. Maximum cardinality of M means that a slot can
have at most M values. The maximum cardinality for the grape slot for single varietal wines is
1: these wines are made from only one variety of grape. Sometimes it may be useful to set the
maximum cardinality to 0. This setting would indicate that the slot cannot have any values for a
particular subclass.
Slot-value type
A value-type facet describes what types of values can fill in the slot. Here is a list of the more
common value types:
• String is the simplest value type which is used for slots such as name: the value is a
simple string
• Number (sometimes more specific value types of Float and Integer are used) describes
slots with numeric values. For example, a price of a wine can have a value type Float
9
• Boolean slots are simple yes–no flags. For example, if we choose not to represent
sparkling wines as a separate class, whether or not a wine is sparkling can be represented
as a value of a Boolean slot: if the value is “true” (“yes”) the wine is sparkling and if the
value is “false” (“no”) the wine is not a sparkling one.
• Enumerated slots specify a list of specific allowed values for the slot. For example, we
can specify that the flavor slot can take on one of the three possible values: strong,
moderate, and delicate. In Protégé-2000 the enumerated slots are of type Symbol.
• Instance-type slots allow definition of relationships between individuals. Slots with
value type Instance must also define a list of allowed classes from which the instances
can come. For example, a slot produces for the class Winery may have instances of
the class Wine as its values.3
Figure 4 shows a definition of the slot produces at the class Winery.
Figure 4. The definition of a slot produces that describes the wines produced by a winery. The slot
has cardinality multiple, value type Instance, and the class Wine as the allowed class for its values.
3
Some systems just specify value type with a class instead of requiring a special statement of instance type
slots.
10
general: all the classes in the domain of a slot should be described by the
slot and instances of all the classes in the range of a slot should be
potential fillers for the slot. Do not choose an overly general class for
range (i.e., one would not want to make the range THING) but one would
want to choose a class that will cover all fillers
Instead of listing all possible subclasses of the Wine class for the range of the produces slot,
just list Wine. At the same time, we do not want to specify the range of the slot as THING—the
most general class in an ontology.
In more specific terms:
If a list of classes defining a range or a domain of a slot includes a class
and its subclass, remove the subclass.
If the range of the slot contains both the Wine class and the Red Wine class, we can remove
the Red Wine from the range because it does not add any new information: The Red Wine is
a subclass of Wine and therefore the slot range already implicitly includes it as well as all other
subclasses of the Wine class.
If a list of classes defining a range or a domain of a slot contains all
subclasses of a class A, but not the class A itself, the range should contain
only the class A and not the subclasses.
Instead of defining the range of the slot to include Red Wine, White Wine, and Rose Wine
(enumerating all the direct subclasses of Wine), we can limit the range to the class Wine itself.
If a list of classes defining a range or a domain of a slot contains all but a
few subclasses of a class A, consider if the class A would make a more
appropriate range definition.
In systems where attaching a slot to a class is the same as adding the class to the domain of the
slot, the same rules apply to slot attachment: On the one hand, we should try to make it as general
as possible. On the other hand, we must ensure that each class to which we attach the slot can
indeed have the property that the slot represents. We can attach the tannin level slot to each
of the classes representing red wines (e.g., Bordeaux, Merlot, Beaujolais, etc.).
However, since all red wines have the tannin-level property, we should instead attach the slot to
this more general class of Red Wines. Generalizing the domain of the tannin level slot
further (by attaching it to the Wine class instead) would not be correct since we do not use
tannin level to describe white wines for example.
11
• Maker: Chateau-Morgon (instance of the Winery class)
• Region: Beaujolais (instance of the Wine-Region class)
• Sugar: Dry
Figure 5. The definition of an instance of the Beaujolais class. The instance is Chateaux
Morgon Beaujolais from the Beaujolais region, produced from the Gamay grape by the Chateau
Morgon winery. It has a light body, delicate flavor, red color, and low tannin level. It is a dry wine.
12
as representing the “kind-of” relationship, the modeling error becomes clear: a single Wine is
not a kind of Wines. The best way to avoid such an error is always to use either singular or
plural in naming classes (see Section 6 for the discussion on naming concepts).
13
must also be instances of the class B.
How many is too many and how few are too few?
There are no hard rules for the number of direct subclasses that a class should have. However,
many well-structured ontologies have between two and a dozen direct subclasses. Therefore, we
have the following two guidelines:
If a class has only one direct subclass there may be a modeling problem or
the ontology is not complete.
If there are more than a dozen subclasses for a given class then additional
intermediate categories may be necessary.
The first of the two rules is similar to a typesetting rule that bulleted lists should never have only
one bullet point. For example, most of the red Burgundy wines are Côtes d’Or wines. Suppose
we wanted to represent only this majority type of Burgundy wines. We could create a class Red
Burgundy and then a single subclass Cotes d’Or (Figure 6a). However, if in our
representation red Burgundy and Côtes d’Or wines are essentially equivalent (all red Burgundy
wines are Côtes d’Or wines and all Côtes d’Or wines are red Burgundy wines), creating the
Cotes d’Or class is not necessary and does not add any new information to the representation.
If we were to include Côtes Chalonnaise wines, which are cheaper Burgundy wines from the
region just South of Côtes d’Or, then we will create two subclasses of the Burgundy class:
Cotes d’Or and Cotes Chalonnaise (Figure 6b).
Figure 6. Subclasses of the Red Burgundy class. Having a single subclass of a class usually points to
a problem in modeling.
Suppose now that we list all types of wines as direct subclasses of the Wine class. This list
would then include such more general types of wine as Beaujolais and Bordeaux, as well as more
specific types such as Paulliac and Margaux (Figure 6a). The class Wine has too many direct
14
subclasses and, indeed, for the ontology to reflect the different types of wine in a more organized
manner, Medoc should be a subclass of Bordeaux and Cotes d’Or should be a subclass of
Burgundy. Also having such intermediate categories as Red wine and White wine would
also reflect the conceptual model of the domain of wines that many people have (Figure 6b).
However, if no natural classes exist to group concepts in the long list of siblings, there is no need
to create artificial classes—just leave the classes the way they are. After all, the ontology is a
reflection of the real world, and if no categorization exists in the real world, then the ontology
should reflect that.
Figure 7. Categorizing wines. Having all the wines and types of wine versus having several levels of
categorization.
15
dessert wines, the Dessert wine class. The Port wine is both a red wine and a dessert wine.4
Therefore, we define a class Port to have two superclasses: Red wine and Dessert wine.
All instances of the Port class will be instances of both the Red wine class and the
Dessert wine class. The Port class will inherit its slots and their facets from both its
parents. Thus, it will inherit the value SWEET for the slot Sugar from the Dessert wine
class and the tannin level slot and the value for its color slot from the Red wine class.
4
We chose to represent only red Ports in our ontology: white Ports do exist but they are extremely
uncommon.
16
moderate wine, and so on. When defining a class hierarchy, our goal is to strike a balance
between creating new classes useful for class organization and creating too many classes.
5
Here we assume that each anatomical organ is a class since we would also like to talk about “John’s 1st left
rib.” Individual organs of existing people would be represented as individuals in our ontology.
17
class for each of the ribs. That is, if we want to represent details adjacency and location
information (which is different for each rib) as well as specific functions that each rib playa and
organs it protects, we want the classes. If we are modeling anatomy at a slightly lesser level of
generality, and all ribs are very similar as far as our potential applications are concerned (we just
talk about which rib is broken on the X-Ray without implications for other parts of the body), we
may want to simplify our hierarchy and have just the class Rib, with two slots: lateral
position, order.
18
Figure 8. Hierarchy of wine regions. The "A" icons next to class names indicate that the classes are
abstract and cannot have any direct instances.
The same class hierarchy would be incorrect if we omitted the word “region” from the class
names. We cannot say that the class Alsace is a subclass of the class France: Alsace is not a
kind of France. However, Alsace region is a kind of a French region.
Only classes can be arranged in a hierarchy—knowledge-representation systems do not have a
notion of sub-instance. Therefore, if there is a natural hierarchy among terms, such as in
terminological hierarchies from Section 4.2, we should define these terms as classes even though
they may not have any instances of their own.
19
Experimenter performing an experiment (with his name, affiliation, etc.). It is true that an
experimenter, as a person, also happens to be a biological organism. However, we probably
should not incorporate this distinction in the ontology: for the purposes of this representation an
experimenter is not a biological organism and we will probably never conduct experiments on
the experimenters themselves. If we were representing everything we can say about the classes in
the ontology, an Experimenter would become a subclass of Biological Organism.
However, we do not need to include this knowledge for the foreseeable applications. In fact,
including this type of additional classification for existing classes actually hurts: now an instance
of an Experimenter will have slots for weight, age, species, and other data pertaining to a
biological organism, but absolutely irrelevant in the context of describing an experiment.
However, we should record such design decision in the documentation for the benefit of the users
who will be looking at this ontology and who may not be aware of the application we had in
mind. Otherwise, people intending to reuse the ontology for other applications may try to use
experimenter as a subclass of person without knowing that the original modeling did not include
that fact.
20
produces slot of the corresponding Winery instance. For instance, when we say that Sterling
Merlot is produced by the Sterling Vineyard winery, the system would automatically add Sterling
Merlot to the list of wines that the Sterling Vineyard winery produces. (Figure 9).
Figure 9. Instances with inverse slots. The slot produces for the class Winery is an inverse of the
slot maker for the class Wine. Filling in one of the slots triggers an automatic update of the other.
6 What’s in a name?
Defining naming conventions for concepts in an ontology and then strictly adhering to these
conventions not only makes the ontology easier to understand but also helps avoid some common
modeling mistakes. There are many alternatives in naming concepts. Often there is no particular
reason to choose one or another alternative. However, we need to
21
Define a naming convention for classes and slots and adhere to it.
The following features of a knowledge representation system affect the choice of naming
conventions:
• Does the system have the same name space for classes, slots, and instances? That is, does
the system allow having a class and a slot with the same name (such as a class winery
and a slot winery)?
• Is the system case-sensitive? That is, does the system treat the names that differ only in
case as different names (such as Winery and winery)?
• What delimiters does the system allow in the names? That is, can names contain spaces,
commas, asterisks, and so on?
Protégé-2000, for example, maintains a single name space for all its frames. It is case-sensitive.
Thus, we cannot have a class winery and a slot winery. We can, however, have a class
Winery (note the upper-case) and a slot winery. CLASSIC, on the other hand, is not case
sensitive and maintains different name spaces for classes, slots, and individuals. Thus, from a
system perspective, there is no problem in naming both a class and a slot Winery.
22
6.3 Prefix and suffix conventions
Some knowledge-base methodologies suggest using prefix and suffix conventions in the names to
distinguish between classes and slots. Two common practices are to add a has- or a suffix –of
to slot names. Thus, our slots become has-maker and has-winery if we chose the has-
convention. The slots become maker-of and winery-of if we chose the of- convention.
This approach allows anyone looking at a term to determine immediately if the term is a class or
a slot. However, the term names become slightly longer.
7 Other Resources
We have used Protégé-2000 as an ontology-developing environment for our examples. Duineveld
and colleagues (Duineveld et al. 2000) describe and compare a number of other ontology-
development environments.
We have tried to address the very basics of ontology development and have not discussed many
of the advanced topics or alternative methodologies for ontology development. Gómez-Pérez
(Gómez-Pérez 1998) and Uschold (Uschold and Gruninger 1996) present alternative
ontology-development methodologies. The Ontolingua tutorial (Farquhar 1997) discusses some
formal aspects of knowledge modeling.
Currently, researchers emphasize not only ontology development, but also ontology analysis. As
more ontologies are generated and reused, more tools will be available to analyze ontologies. For
example, Chimaera (McGuinness et al. 2000) provides diagnostic tools for analyzing
ontologies. The analysis that Chimaera performs includes both a check for logical correctness of
an ontology and diagnostics of common ontology-design errors. An ontology designer may want
to run Chimaera diagnostics over the evolving ontology to determine the conformance to
common ontology-modeling practices.
8 Conclusions
In this guide, we have described an ontology-development methodology for declarative frame-
based systems. We listed the steps in the ontology-development process and addressed the
complex issues of defining class hierarchies and properties of classes and instances. However,
after following all the rules and suggestions, one of the most important things to remember is the
following: there is no single correct ontology for any domain. Ontology design is a creative
process and no two ontologies designed by different people would be the same. The potential
23
applications of the ontology and the designer’s understanding and view of the domain will
undoubtedly affect ontology design choices. “The proof is in the pudding”—we can assess the
quality of our ontology only by using it in applications for which we designed it.
Acknowledgments
Protégé-2000 (http://protege.stanford.edu) was developed by Mark Musen’s group at Stanford
Medical Informatics. We generated some of the figures with the OntoViz plugin to Protégé-2000.
We imported the initial version of the wine ontology from the Ontolingua ontology library
(http://www.ksl.stanford.edu/software/ontolingua/) which in turn used a version published by
Brachman and colleagues (Brachman et al. 1991) and distributed with the CLASSIC
knowledge representation system. We then modified the ontology to present conceptual-
modeling principles for declarative frame-based ontologies. Ray Fergerson’s and Mor Peleg’s
extensive comments on earlier drafts greatly improved this paper.
References
Booch, G., Rumbaugh, J. and Jacobson, I. (1997). The Unified Modeling Language user guide:
Addison-Wesley.
Brachman, R.J., McGuinness, D.L., Patel-Schneider, P.F., Resnick, L.A. and Borgida, A. (1991).
Living with CLASSIC: When and how to use KL-ONE-like language. Principles of Semantic
Networks. J. F. Sowa, editor, Morgan Kaufmann: 401-456.
Brickley, D. and Guha, R.V. (1999). Resource Description Framework (RDF) Schema
Specification. Proposed Recommendation, World Wide Web Consortium:
http://www.w3.org/TR/PR-rdf-schema.
Chimaera (2000). Chimaera Ontology Environment. www.ksl.stanford.edu/software/chimaera
Duineveld, A.J., Stoter, R., Weiden, M.R., Kenepa, B. and Benjamins, V.R. (2000).
WonderTools? A comparative study of ontological engineering tools. International Journal of
Human-Computer Studies 52(6): 1111-1133.
Farquhar, A. (1997). Ontolingua tutorial. http://ksl-web.stanford.edu/people/axf/tutorial.pdf
Gómez-Pérez, A. (1998). Knowledge sharing and reuse. Handbook of Applied Expert Systems.
Liebowitz, editor, CRC Press.
Gruber, T.R. (1993). A Translation Approach to Portable Ontology Specification. Knowledge
Acquisition 5: 199-220.
Gruninger, M. and Fox, M.S. (1995). Methodology for the Design and Evaluation of Ontologies.
In: Proceedings of the Workshop on Basic Ontological Issues in Knowledge Sharing, IJCAI-95,
Montreal.
Hendler, J. and McGuinness, D.L. (2000). The DARPA Agent Markup Language. IEEE
Intelligent Systems 16(6): 67-73.
Humphreys, B.L. and Lindberg, D.A.B. (1993). The UMLS project: making the conceptual
connection between users and the information they need. Bulletin of the Medical Library
Association 81(2): 170.
McGuinness, D.L., Abrahams, M.K., Resnick, L.A., Patel-Schneider, P.F., Thomason, R.H.,
Cavalli-Sforza, V. and Conati, C. (1994). Classic Knowledge Representation System Tutorial.
http://www.bell-labs.com/project/classic/papers/ClassTut/ClassTut.html
24
McGuinness, D.L., Fikes, R., Rice, J. and Wilder, S. (2000). An Environment for Merging and
Testing Large Ontologies. Principles of Knowledge Representation and Reasoning: Proceedings
of the Seventh International Conference (KR2000). A. G. Cohn, F. Giunchiglia and B. Selman,
editors. San Francisco, CA, Morgan Kaufmann Publishers.
McGuinness, D.L. and Wright, J. (1998). Conceptual Modeling for Configuration: A Description
Logic-based Approach. Artificial Intelligence for Engineering Design, Analysis, and
Manufacturing - special issue on Configuration.
Musen, M.A. (1992). Dimensions of knowledge sharing and reuse. Computers and Biomedical
Research 25: 435-467.
Ontolingua (1997). Ontolingua System Reference Manual. http://www-ksl-
svc.stanford.edu:5915/doc/frame-editor/index.html
Price, C. and Spackman, K. (2000). SNOMED clinical terms. BJHC&IM-British Journal of
Healthcare Computing & Information Management 17(3): 27-31.
Protege (2000). The Protege Project. http://protege.stanford.edu
Rosch, E. (1978). Principles of Categorization. Cognition and Categorization. R. E. and B. B.
Lloyd, editors. Hillside, NJ, Lawrence Erlbaum Publishers: 27-48.
Rothenfluh, T.R., Gennari, J.H., Eriksson, H., Puerta, A.R., Tu, S.W. and Musen, M.A. (1996).
Reusable ontologies, knowledge-acquisition tools, and performance systems: PROTÉGÉ-II
solutions to Sisyphus-2. International Journal of Human-Computer Studies 44: 303-332.
Rumbaugh, J., Blaha, M., Premerlani, W., Eddy, F. and Lorensen, W. (1991). Object-oriented
modeling and design. Englewood Cliffs, New Jersey: Prentice Hall.
Uschold, M. and Gruninger, M. (1996). Ontologies: Principles, Methods and Applications.
Knowledge Engineering Review 11(2).
25
Getting Started with JADE
This is the main reference for running JADE. It is quite detailed and somewhat terse. To supplement this
guide, here aresome step by step tutorials.
Running JADE with one (MAIN) container.
Authors: Fabio Bellifemine, Giovanni Caire, Tiziana Trucco (TILAB S.p.A., formerly CSELT)
Giovanni Rimassa (University of Parma)
JADE - Java Agent DEvelopment Framework is a framework to develop multi-agent systems in compliance with
the FIPA specifications. JADE successfully passed the 1st FIPA interoperability test in Seoul (Jan. 99) and the 2nd FIPA
interoperability test in London (Apr. 01).
Copyright (C) 2000 CSELT S.p.A., 2001 TILab S.p.A., 2002 TILab S.p.A.
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General
Public License as published by the Free Software Foundation, version 2.1 of the License.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this library; if not, write
to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
1
JADE Programmer’s GUIDE
TABLE OF CONTENTS
1 INTRODUCTION 4
2.5 Support for inter-platform messaging with plug-in Message Transport Protocols 9
2.5.1 Command line options for MTP management 10
2.5.2 Configuring MTPs from the graphical management console. 10
2.5.3 Agent address management 11
2.5.4 Writing new MTPs for JADE 11
2.5.4.1 The Basic IIOP MTP 11
2.5.4.2 The ORBacus MTP 12
2.5.4.3 The HTTP MTP 12
4.2 DummyAgent 18
4.3 DF GUI 19
2
JADE Programmer’s GUIDE
3
JADE Programmer’s GUIDE
1 INTRODUCTION
This administrator's guide describes how to install and launch JADE. It is complemented by
the HTML documentation available in the directory jade/doc and the JADE Programmer's Guide.
If and where conflict arises between what is reported in the HTML documentation and this guide,
preference should be given to the HTML documentation that is updated more frequently.
The only software requirement to execute the system is the Java Run Time Environment
version 1.2.
In order to build the system the JDK1.2 is sufficient because pre-built IDL stubs and Java
parser classes are included with the JADE source distribution. Those users, who wish to
regenerate IDL stubs and Java parser classes, should also have the JavaCC parser generator
(version 0.8pre or version 1.1; available from http://www.metamata.com), and the IDL to Java
compiler (available from the Sun Developer Connection). Notice that the old idltojava compiler
available with JDK1.2 generates wrong code and it should never be used, instead the new idlj
compiler, that is distributed with JDK1.3, should be used.
2.2 Getting the software
All the software is distributed under the LGPL license limitations and it can be downloaded
from the JADE web site http://jade.cselt.it/. Five compressed files are available:
1. The source code of JADE
2. The source code of the examples
3. The documentation, including the javadoc of the JADE API and this programmer's guide
4. The binary of JADE, i.e. the jar files with all the Java classes
5. A full distribution with all the previous files
2.3 Running JADE from the binary distribution
Having uncompressed the archive file, a directory tree is generated whose root is jade and
with a lib subdirectory. This subdirectory contains some JAR files that have to be added to the
CLASSPATH environment variable.
Having set the classpath, the following command can be used to launch the main container
of the platform. The main container is composed of the DF agent, the AMS agent, and the RMI
registry (that is used by JADE for intra-platform communication).
java jade.Boot [options] [AgentSpecifier list]
Additional agent containers can be then launched on the same host, or on remote hosts, that
connect themselves with the main container of the Agent Platform, resulting in a distributed
system that seems a single Agent Platform from the outside.
An Agent Container can be started using the command:
java jade.Boot –container [options] [AgentSpecifier list]
4
JADE Programmer’s GUIDE
An alternative way of launching JADE is to use the following command, that does not need
to set the CLASSPATH:
java –jar lib\jade.jar –nomtp [options] [AgentSpecifier list]
Remind to use the “–nomtp” option, otherwise an exception will be thrown because the
library iiop.jar is not found.
The full EBNF syntax of the command line is the following, where common rules apply for
the token definitions:
Option = "-container"
| "-host" HostName
| "-port" PortNumber
| "-name" PlatformName
| "-gui"
| "-mtp" ClassName "(" Argument* ")"
(";" ClassName "(" Argument* ")")*
| "-nomtp"
| "-aclcodec" ClassName (";" ClassName )*
| "-nomobility"
| "-version"
| "-help"
| "-conf" FileName?
PortNumber = Number
AgentName = Word
PlatformName = Word
-container specifies that this instance of JADE is a container and, as such, that it must join
with a main-container (by default this option is unselected)
-host specifies the host name where the RMI registry should be created (for the main -
5
JADE Programmer’s GUIDE
-port this option allows to specify the port number where the RMI registry should be
created (for the main-container) / located (for the ordinary containers). By default
the port number 1099 is used.
-name this option specifies the symbolic name to be used as the platform name; this
option will be considered only in the case of a main container; the default is to
generate a unique name from the values of the main container's host name and
port number. Please note that this option is strongly discouraged since uniqueness
of the HAP is not enforced. This might result in non-unique agent names.
-gui specifies that the RMA (Remote Monitoring Agent) GUI of JADE should be
launched (by default this option is unselected)
-nomtp has precedence over -mtp and overrides it. It should be used to override the default
behaviour of the main -container (by default the -nomtp option unselected)
-aclcodec By default all messages are encoded by the String-based ACLCodec. This option
allows to specify a list of additional ACLCodec that will become available to the
agents of the launched container in order to encode/decode messages. JADE will
provide automatically to use these codec when agents set the right value in the
field aclRepresentation of the Envelope of the sent/received ACLMessages. Look
at the FIPA specifications for the standard names of these codecs
-nomobility disable the mobility and cloning support in the launched container. In this way the
container will not accept requests for agent migration or agent cloning, option that
might be useful to enhance the level of security for the host where this container is
running. Notice that the platform can include both containers where mobility is
enabled and containers where it is disabled. In this case an agent that tries to move
from/to the containers where mobility is disabled will die because of a Runtime
Exception.
Notice that, even if this option was selected, the container would still be able to
launch new agents (e.g. via the RMA GUI) if their class can be reached via the
local CLASSPATH.
By default this option is unselected.
-version print on standard output the versioning information of JADE (by default this
option is unselected)
6
JADE Programmer’s GUIDE
-help print on standard output this help information (by default this option is unselected)
-conf if no filename is specified after this option, then a graphical interface is displayed
that allows to load/save all the JADE configuration parameters from a file. If a
filename is specified, instead, then all the options specified in that file are used to
launch JADE. By default this option is not selected
A list of agents can be launched directly from the command line. As described above, the
[AgentSpecifier list] part of the command is a sequence of strings separated by a
space.
Each string is broken into three parts. The first substring (delimited by the colon ‘:’
character) is taken as the agent name; the remaining substring after the colon (ended with a space
or with an open parenthesis) is the name of the Java class implementing the agent. The Agent
Container will dynamically load this class. Finally, a list of string arguments can be passed
delimited between parentheses.
For example, a string Peter:myAgent means "create a new agent named Peter whose
implementation is an object of class myAgent". The name of the class must be fully qualified,
(e.g. Peter:myPackage.myAgent) and will be searched for according to CLASSPATH
definition.
Another example is the string Peter:myAgent(“today is raining” 123) that
means "create a new agent named Peter whose implementation is an object of class myAgent
and pass an array of two arguments to its constructor: the first is the string today is
raining and the second is the string 123". Notice that, according to the Java convention, the
quote symbols have been removed and the number is still a string.
2.3.4 Example
First of all set the CLASSPATH to include the JAR files in the lib subdirectory and the
current directory. For instance, for Windows 9x/NT use the following command:
set CLASSPATH=%CLASSPATH%;.;c:\jade\lib\jade.jar;
c:\jade\lib\jadeTools.jar;c:\jade\lib\Base64.jar;c:\jade\lib
\iiop.jar
Execute the following command to start the main-container of the platform. Let's suppose
that the hostname of this machine is "kim.cselt.it"
prompt> java jade.Boot –gui
Execute the following command to start an agent container on another machine, by telling it
to join the Agent Platform running on the host "kim.cselt.it", and start one agent (you must
download and compile the examples agents to do that):
prompt> java jade.Boot -host kim.cselt.it -container
sender1:examples.receivers.AgentSender
where "sender1" is the name of the agent, while
examples.receivers.AgentSender is the code that implements the agent.
7
JADE Programmer’s GUIDE
Execute the following command on a third machine to start another agent container telling it
to join the Agent Platform, called "facts" running on the host "kim.cselt.it", and then start two
agents.
prompt> java jade.Boot –host kim.cselt.it –container
receiver2:examples.receivers.AgentReceiver
sender2:examples.receivers.AgentSender
where the agent named sender2 is impleme nted by the class
examples.receivers.AgentSender, while the agent named receiver2 is implemented
by the class examples.receivers.AgentReceiver.
2.4 Building JADE from the source distribution
If you downloaded JADE in source form and want to compile it, you basically have two
methods: either you use the provided makefiles (for GNU make), or you run the Win32 .BAT
files that you find in the root directory of the package. Of course, using makefiles yields more
flexibility because they just build what is needed; JADE makefiles have been tested under Sun
Solaris 7 with JDK 1.2.0 and under Linux under JDK 1.2.2 RC4 and JDK 1.3. The batch files
have been tested under Windows NT 4.0 and under Windows 95, both with JDK 1.2.2 or JDK1.3
8
JADE Programmer’s GUIDE
make doc
With batch files, type
makedoc
You will end up with Javadoc generated HTML pages, integrated within the overall
documentation. Beware that the Programmer’s Guide is a PDF file that cannot be generated at
your site, but you must download it (it is, of course, in the JADE documentation distribution).
If you downloaded the examples/demo archive and have unpacked it within the same source
tree, you will have to set your CLASSPATH to contain either the classes directory or the JAR
files in the lib directory, depending on your JADE distribution, and then type:
make examples
with makefiles, or
makeexamples
with batch files.
In order to compile the Jess-based example, it is necessary to have the JESS system and to
set the CLASSPATH to include it. The example can be compiled by typing:
make jessexample
with makefiles, or
makejessexample
with batch files.
If you type
make clean
with makefiles, or if you type
clean
with batch files, you will remove all generated files (classes, HTML pages, JAR files, etc.)
from the source tree. If you use makefiles, you will find some other make targets you can use.
Feel free to try them, especially if you are modifying JADE source code, but be aware that these
other make targets are for internal use only, so they have not been documented.
2.5 Support for inter -platform messaging with plug -in Message Transport Protocols
The FIPA 2000 specification proposes a number of different Message Transport Protocols
(MTPs for short) over which ACL messages can be delivered in a compliant way.
JADE comprises a framework to write and deploy multiple MTPs in a flexible way. An
implementation of a FIPA compliant MTP can be compiled separately and put in a JAR file of its
own; the code will be dynamically loaded when an endpoint of that MTP is activated. Moreover,
every JADE container can have any number of active MTPs, so that the platform administrator
can choose whatever topology he or she wishes.
JADE performs message routing for both incoming and outgoing messages, using a single -
hop routing table that requires direct visibility among containers.
9
JADE Programmer’s GUIDE
When a new MTP is activated on a container, the JADE platform gains a new address that is
added to the list in the platform profile (that can be obtained from the AMS using the action
get-description). Moreover, the new address is added to all the ams-agent-
description objects contained within the AMS knowledge base.
When a JADE container is started, it is possible to activate one ore more communication
endpoints on it, using suitable command line options. The –mtp option activates a new
communication endpoint on a container, and must be given the name of the class that provides the
MTP functionality. If the MTP supports activation on specific addresses, then the address URL
can be given right after the class name, enclosed in brackets. If multiple MTPs are to be activated,
they can be listed together using commas as separators.
For example, the following option activates an IIOP endpoint on a default address.
-mtp jade.mtp.iiop.MessageTransportProtocol
The following option activates an IIOP endpoint that uses an ORBacus-based1 IIOP MTP on
a fixed, given address.
-mtp
orbacus.MessageTransportProtocol(corbaloc:iiop:sharon.cselt.it:12
34/jade)
The following option activates two endpoints that correspond to two ORBacus -based IIOP
MTP on two different addresses:
-mtp
orbacus.MessageTransportProtocol(corbaloc:iiop:sharon.cselt.it:12
34/jade);orbacus.MessageTransportProtocol(corbaloc:iiop:sharon.cs
elt.it:5678/jade)
When a container starts, it prints on the standard output all the active MTP addresses,
separated by a carriage return. Moreover, it writes the same addresses in a file, named:
MTPs-<Container Name>.txt.
If no MTP related option is given, by default a basic IIOP MTP is activated on the Main
Container and no MTP are activated on an ordinary container. To inhibit the creation of the
default IIOP endpoint, use the –nomtp option.
Using the –mtp command line option, a transport endpoint lives as long as its container is
up; when a container is shut down, all its MTPs are deactivated and the AMS information is
updated accordingly. The JADE RMA console enables a more flexible management of the MTPs,
allowing activating and deactivating transport protocols during normal platform operations. In the
leftmost panel of the RMA GUI, right-clicking on an agent container tree node brings up the
popup menu with an Install a new MTP and Uninstall an MTP.
1
ORBacus is a CORBA 2.3 ORB for C++ and Java. It is available from Object Oriented Concepts, Inc. at
http://www.ooc.com. An alternate IIOP MTP for JADE, exploiting ORBacus features, is available in the download area
of the JADE web site: http://jade.cselt.it/.
10
JADE Programmer’s GUIDE
Choosing Install a new MTP a dialog is shown where the user can select the container to
install the new MTP on, the fully qualified name of the class implementing the protocol, and (if it
is supported by the chosen protocol) the transport address that will be used to contact the new
MTP. For example, to install a new IIOP endpoint, using the default JDK 1.3 ORB, one would
write jade.mtp.iiop.MessageTransportProtocol as the class name and nothing as
the address. In order to install a new IIOP endpoint, using the ORBacus based implementation,
one would write orbacus.MessageTransportProtocol as the class name and (if the
endpoint is to be deployed at host sharon.cselt.it, on the TCP port 1234, with an object
ID jade) corbaloc:iiop:sharon.cselt.it:1234/jade as the transport address.
Choosing Uninstall an MTP, a dialog is shown where the user can select from a list one of
the currently installed MTPs and remove it from the platform.
As a consequence of the MTP management described above, during its lifetime a platform,
and its agents, can have more than one address and they can be activated and deactivated during
the execution of the system. JADE takes care of maintaining consistence within the platform and
the addresses in the platform profile, the AMS knowledge base, and in the AID value returned by
the method getAID() of the class Agent.
For application-specific purposes, an agent can still decide to choose explicitly a subset of
the available addresses to be contacted by the rest of the world. In some cases, the agent could
even decide to activate some application specific MTP, that would not belong to the whole
platform but only to itself. So, the preferred addresses of an agent are not necessarily the same as
the available addresses for its platform. In order to do that, the agent must take care of managing
its own copy of agent ID and set the sender of its ACLMessages to its own copy of agent ID
rather than the value returned by the method getAID().
To write a new MTP that can be used by JADE, all that is necessary is to implement a couple
of Java interfaces, defined in the jade.mtp package. The MTP interface models a bi-directional
channel that can both send and receive ACL messages (this interface extends the OutChannel
and InChannel interfaces that represent one-way channels). The TransportAddress
interface is just a simple representation for an URL, allowing separately reading the protocol,
host, port and file part.
An implementation of the FIPA 2000 IIOP-based transport protocol is included with JADE.
This implementation relies on the JDK 1.2 ORB (but can also use the JDK 1.3 ORB, requiring
recompilation of the jade.mtp.iiop package). This implementation fully supports IOR
representations such as IOR:000000000000001649444c644f4…, and does not allow to
choose the port number or the object key. These limitations are due to the underlying ORB, and
can be solved with other JADE MTPs exploiting more advanced CORBA ORBs. The MTP
implementation is contained within the jade.mtp.iiop.MessageTransportProtocol
class, so this is the name to be used when starting the protocol. Due to the limitation stated above,
choosing the address explicitly is not supported.
11
JADE Programmer’s GUIDE
The default IIOP MTP also supports a limited form of corbaloc: addressing: A
corbaloc: address, generated by some other more advanced ORB and pointing to a different
platform, can be used to send ACL messages. Interoperability between a JADE platform using
ORBacus and a JADE platform using the JDK 1.3 ORB has been successfully tested. In a first
test, the first platform exported a corbaloc: address generated by ORBacus, and then the
second platform used that address with the JDK 1.3 ORB to contact the first one. In a second test,
the IOR generated by the second platform was converted into a corbaloc: URL via the
getURL() method call in the IIOPAddress inner class (a non-public inner class of the
jade.mtp.iiop.MessageTransportProtocol class); then the first platform used that
address to contact the second one.
So, the corbaloc: support is almost complete. The only limitation is that it’s not possible
to export corbaloc: addresses with the JDK 1.3 ORB. JADE is able to convert IORs to
corbaloc: URLs, but the CORBA object key is an arbitrary octet sequence, so that the
resulting URL contains forbidden characters that are escaped using ‘%’ and their hexadecimal
value. While this conversion complies with CORBA 2.4 and RFC 2396, the resulting URL is just
as unreadable as the plain old IOR. The upcoming JDK 1.4 is stated to feature an ORB that
complies with the POA and INS specifications, so that it has persistent object references, and
natively supports corbaloc: and corbaname: addresses. It is likely that a more complete
IIOP MTP will be provided for the JDK 1.4, when it will be widely available.
A Message Transport Protocol implementation that complies with FIPA and exploits the
ORBacus ORB implementation can be download as an add-on from the JADE web site. A tutorial
is available in the JADE documentation that describes how to download, install, compile and use
this MTP. This MTP fully supports IOR:, corbaloc: and corbaname: addresses.
According to the OMG specifications, three syntaxes are allowed for an IIOP address (all
case -insensitive):
Notice that, in the third case, BIG_ENDIAN is assumed by default, while in the first and
second case, the endianess information is contained within the IOR definition. In the second form,
HostName and PortNumber refer to the host where the CORBA Naming Service is running.
A Message Transport Protocol implementation that complies to FIPA and uses the HTTP
protocol can be download as an add-on from the JADE web site. A tutorial is available in the
JADE documentation that describes how to download, install, compile and use this MTP.
12
JADE Programmer’s GUIDE
By default, all ACLMessages are encoded via the String format defined by FIPA. However,
at configuration time it is possible to add additional ACLCodecs that can be used by agents on
that container. The command line option –aclcodec should be used for this purpose. Agents
wishing to send messages with non-default encodings should set the right value in the
aclRepresentation field of the Envelope.
An XML-based implementation of the ACLCodec can be download from the JADE site as
an add-on. A tutorial is available in the JADE documentation that describes how to download,
install, compile and use this codec.
A bit-efficient implementation of the ACLCodec can be download from the JADE site as an
add-on. A tutorial is available in the JADE documentation that describes how to download,
install, compile and use this codec. Take care that this codec is available under a different license,
not LGPL.
3 AGENT IDENTIFIERS AN D S E N D I N G M E S S A G E S T O R E M O T E A G E N T S
According to the FIPA specifications, each agent is identified by an Agent Identifier (AID).
An Agent Identifier (AID) labels an agent so that it may be distinguished unambiguously within
the Agent Universe.
The AID is a structure composed of a number of slots, the most important of which are name
and addresses.
The name parameter of an AID is a globally unique identifier that can be used as a unique
referring expression of the agent. JADE uses a very simple mechanism to construct this globally
unique name by concatenating a user-defined nickname to its home agent platform name (HAP),
separated by the '@' character. Therefore, a full va lid name in the agent universe, a so-called
GUID (Globally Unique Identifier), is peter@kim:1099/JADE where ‘peter’ is the agent
nickname that was specified at the agent creation time, while ‘kim:1099/JADE’ is the platform
name. Only full valid names should be used within ACLMessages.
The addresses slot, instead, should contain a number of transport addresses at which the can
be contacted. The syntax of these addresses is just a sequence of URI. When using the default
IIOP MTP, the URI for all the local addresses is the IOR printed on stdout. The address slot is
defaulted to the addresses of the local agent platform.
13
JADE Programmer’s GUIDE
4 G R A P H I C A L U S E R I N T E R F A C E T O M A N A G E A N D MO N I T O R T H E A P A C T I V IT Y
To support the difficult task of debugging multi-agent applications, some tools have been
developed. Each tool is packaged as an agent itself, obeying the same rules, the same
communication capabilities, and the same life cycle of a generic application agent.
4.1 Remote Monitoring Agent
The Remote Monitoring Agent (RMA) allows controlling the life cycle of the agent platform
and of all the registered agents. The distributed architecture of JADE allows also remote
controlling, where the GUI is used to control the execution of agents and their life cycle from a
remote host.
An RMA is a Java object, instance of the class jade.tools.rma.rma and can be
launched from the command line as an ordinary agent (i.e. with the command java
jade.Boot myConsole:jade.tools.rma.rma), or by supplying the ‘-gui’ option the
command line parameters (i.e. with the command java jade.Boot –gui).
More than one RMA can be started on the same platform as long as every instance has a
different local name, but only one RMA can be executed on the same agent container.
14
JADE Programmer’s GUIDE
The followings are the commands that can be executed from the menu bar (or the tool bar) of
the RMA GUI.
♦ File menu:
This menu contains the general commands to the RMA.
♦ Close RMA Agent
Terminates the RMA agent by invoking its doDelete() method. The closure of
the RMA window has the same effect as invoking this command.
♦ Exit this Container
Terminates the agent container where the RMA is living in, by killing the RMA and
all the other agents living on that container. If the container is the Agent Platform
Main-Container, then the whole platform is shut down.
♦ Shut down Agent Platform
Shut down the whole agent platform, terminating all connected containers and all the
living agents.
♦ Actions menu:
This menu contains items to invoke all the various administrative actions needed on the
platform as a whole or on a set of agents or agent containers. The requested action is
performed by using the current selection of the agent tree as the target; most of these
actions are also associated to and can be executed from toolbar buttons.
♦ Start New Agent
This action creates a new agent. The user is prompted for the name of the new
agent and the name of the Java class the new agent is an instance of. Moreover, if an
agent container is currently selected, the agent is created and started on that container;
otherwise, the user can write the name of the container he wants the agent to start on.
If no container is specified, the agent is launched on the Agent Platform Main-
Container.
♦ Kill Selected Items
This action kills all the agents and agent containers currently selected. Killing an
agent is equivalent to calling its doDelete() method, whereas killing an agent
container kills all the agents living on the container and then de-registers that
container from the platform. Of course, if the Agent Platform Main-Container is
currently selected, then the whole platform is shut down.
♦ Suspend Selected Agents
This action suspends the selected agents and is equivalent to calling the
doSuspend() method. Beware that suspending a system agent, particularly the
AMS, deadlocks the entire platform.
♦ Resume Selected Agents
This action puts the selected agents back into the AP_ACTIVE state, provided
they were suspended, and works just the same as calling their doActivate()
method.
♦ Send Custom Message to Selected Agents
This action allows to send an ACL message to an agent. When the user selects
this menu item, a special dialog is displayed in which an ACL message can be
15
JADE Programmer’s GUIDE
♦ Migrate Agent
16
JADE Programmer’s GUIDE
This action allows to migrate an agent. When the user selects this menu item, a
special dialog is displayed in which the user must specify the container of the platform
where the selected agent must migrate. Not all the agents can migrate because of lack
of serialization support in their implementation. In this case the user can press the
cancel button of this dialog.
♦ Clone Agent
This action allows to clone a selected agent. When the user selects this menu
item a dialog is displayed in which the user must write the new name of the agent and
the container where the new agent will start.
♦ Tools menu:
This menu contains the commands to start all the tools provided by JADE to
application programmers. These tools will help developing and testing JADE based agent
systems.
♦ RemotePlatforms menu:
This menu allows controlling some remote platforms that comply with the FIPA
specifications. Notice that these remote platforms can even be non-JADE platforms.
♦ Add Remote Platform via AMS AID
This action allows getting the description (called APDescription in FIPA
terminology) of a remote Agent Platform via the remote AMS. The user is
requested to insert the AID of the remote AMS and the remote platform is then
added to the tree showed in the RMA GUI.
♦ Add Remote Platform via URL
This action allows getting the description (called APDescription in FIPA
terminology) of a remote Agent Platform via a URL. The content of the URL
must be the stringified APDescription, as specified by FIPA. The user is
requested to insert the URL that contains the remote APDescription and the
remote platform is then added to the tree showed in the RMA GUI.
♦ View APDescription
To view the AP Description of a selected platform.
♦ Refresh APDescription
This action asks the remote AMS for the APDescription and refresh the old one.
♦ Remove Remote Platform
This action permits to remove from the GUI the selected remote platform.
♦ Refresh Agent List
This action performs a search with the AMS of the Remote Platform and
the full list of agents belonging to the remote platform are then displayed
in the tree.
17
JADE Programmer’s GUIDE
4.2 DummyAgent
The DummyAgent tool allows users to interact with JADE agents in a custom way. The GUI
allows composing and sending ACL messages and maintains a list of all ACL messages sent and
received. This list can be examined by the user and each message can be viewed in detail or even
edited. Furthermore, the message list can be saved to disk and retrieved la ter. Many instances of
the DummyAgent can be started as and where required.
The DummyAgent can both be launched from the Tool menu of the RMA and from the
command line, as follows:
Java jade.Boot theDummy:jade.tools.DummyAgent.DummyAgent
18
JADE Programmer’s GUIDE
4.3 DF GUI
A GUI of the DF can be launched from the Tools menu of the RMA. This action is actually
implemented by sending an ACL message to the DF asking it to show its GUI. Therefore, the
GUI can just be shown on the host where the platform (main-container) was executed.
By using this GUI, the user can interact with the DF: view the descriptions of the registered
agents, register and deregister agents, modify the description of registered agent, and also search
for agent descriptions.
The GUI allows also to federate the DF with other DF's and create a complex network of
domains and sub-domains of yellow pages. Any federated DF, even if resident on a remote non-
JADE agent platform, can also be controlled by the same GUI and the same basic operations
(view/register/deregister/modify/search) can be executed on the remote DF.
19
JADE Programmer’s GUIDE
As the name itself points out, the Sniffer Agent is basically a Fipa-compliant Agent with
sniffing features.
When the user decides to sniff an agent or a group of agents, every message directed to/from
that agent / agentgroup is tracked and displayed in the sniffer Gui. The user can view every
message and save it to disk. The user can also save all the tracked messages and reload it from a
single file for later analysis.
This agent can be started both from the Tools menu of the RMA and also from the command
line as follows:
java jade.Boot sniffer:jade.tools.sniffer.Sniffer
The figure shows a snapshot of the GUI.
20
JADE Programmer’s GUIDE
This tool allows to monitor and control the life-cycle of a running agent and its exchanged
messages, both the queue of sent and received messages.
21
JADE Programmer’s GUIDE
5 L I S T O F A C R O N Y M S A N D ABBREVIATED TERMS
22
Tutorial 1: Starting with JADE
● Booting Jade
Then boot Jade (from the jade directory),
runjad -gui
You see this window (after you display the tree),
● Jade agent platforms have containers to hold agents. A platform can have many containers, not necessarily on
the same computer. One container on a platform is "privileged". This main container resides on the host which
also runs the platform's RMI server. Agents on various containers on a platform use the RMI protocol to
communicate.
● The image above shows the GUI of the Remote Monitoring Agent (RMA) which appears when you use the
-gui switch. In addition to itself, the RMA shows the presence of two other agents in the Main Container. The
ams is the Agent Management System. An agent itself, it provides an environment with many services for
agents on the platform. The df is the Directory Facilitator. It is an agent which provides a "yellow pages" for
agents known to the platform.
● Agents must have globally unique names. A name is a "nickname" and an address separated by the at (@) sign.
For example, RMA@IBM:1099/JADE is an agent with nickname RMA at the address IBM:1099/JADE.
("IBM" is the name of my Win2000 machine on a LAN.
● The addresses are in RMI format in this case. RMI is used for intra platform communication. (CORBA or
HTTP are used for inter platform communication.) The address consists of a host name, in this case IBM, and a
port on which the RMI naming service is active, in this case, 1099, the default port for RMI. The name JADE
distinguishes Jade RMI invocations from other possible RMI services. Note that in this case, the host name
does not have a domain attached. If you wanted a full name you can use the -host switch: java jade.Boot -gui
-host jupiter.scs.ryerson.ca, for example. There is also a -port switch if you don't like 1099.
Enter a name for the agent, say ping0. (In this window just use the nickname of the agent, that is, leave out the
address. The address will be filled in by the system.)
Then enter the fully qualified agent class name. In this case, examples.PingAgent.PingAgent. If your class paths are
set correctly, after you click OK, the name ping0@IBM:1099/JADE will appear in the Main Container listing. (Of
course, the host name will be yours, not mine :-).) If the class cannot be found, JADE will ignore your and may print
an error on the Java Console (maybe).
Loading Agents when booting JADE
To carry out the same task as above you could have typed,
runjade -gui ping0:examples.PingAgent.PingAgent
and loaded the Ping Agent right away. Note the syntax with the agent nickname separated from its fully qualified
class name by a colon.
A formidable form indeed. The form is set up to allow you to describe a Communicative (speech) Act.
Fortunately, at this stage you don't need to know anything about SL. Nor do you have to fill in many fields. The fields
you do need to deal with are, receivers, communicative act, and content.
receivers. The receiver is the ping0 agent. With its pointer on the receivers box, right click the mouse and select
"add". The AID (Agent ID) window appears.
Fill in the form in the manner shown (using your own host name). In the case of the address right click the mouse on
the text field.
Note the check box. Checking it means the name is local (ping0) in this case. If you don't check it you need to enter
the full agent name: ping0@IBM:1099/JADE.
Back in the DummyAgent window, select QUERY-REF for the communicative act. In the request field, type in the
word "ping". (See comment on the PingAgent.java source file.)
Send a message
Finally click the send the message by clicking the send button (second from left).
In the right pane of the DummyAgent window two lines appear, one red, the other blue. The most recent is the
topmost. Blue refers to sent messages, red to received messages. You have something like this:
You can examine the received INFORM message (sent by the ping0@IBM:1099/JADE agent by selecting it and then
clicking the button with the "glasses" icon.
The ping agent has replied "alive". [In versions of JADE previous to version 2.5, the Ping Agent replies "(pong)".]
Remote Containers
So far, this tutorial is just a repeat of Tutorial 1. It is not surprising to find that you can send messages
from agent to agent on the same platform whether they are in different containers or not. More interesting
is that JADE is a distributed system. A platform can have containers on remote systems as well as
locally. So if you have a second computer networked to the first, try this.
On the second computer set up and run a JADE container with a PingAgent in it. In other words, simply,
type,
runjade -host Frodo -container ping1:examples.PingAgent.PingAgent.
This is exactly the same command as used above to create a container on machine Frodo itself! Thanks to
RMI, the system is transparent with respect to hosts. Notice that, since an agent nicknamed ping0 already
exists on this platform, I must use a different nickname for this second PingAgent, even though the new
agent is running on a different machine.
Looking on the original machine (Frodo in my case) I see that a new container, Container-2 has appeared
on the RMA agent window in which ping1 is listed. I can, once again, send the usual message from the
DummyAgent on Frodo to ping1 which lives on another machine (named IBM in my case). The location
of ping1 is transparent to the user of RMA on Frodo. It could be anywhere.
The container on the other computer is a client of the RMI server running on Frodo. So is ping0 a client
which happens to exist on the same machine as the RMI server itself.
● java.tools.rma.rma
So start another container with these two agents and yet another ping agent, ping2, on some machine
connected to the JADE platform machine. For example,
runjade -host Frodo -container dummy0:jade.tools.DummyAgent.DummyAgent
RMA1:jade.tools.rma.rma
(Don't forget to include a nickname for your agents! AND make sure the names don't clash with names
on other containers on the platform. Note RMA1 not RMA.)
You will get the windows for the two agents on the remote machine. RMA1 will show all the containers
and agents on the platform, just like RMA on the main platform server. Try sending one of the ping
agents the usual message from dummy0.
Note
● If you just launch the RMA agent on the remote machine and try using its button to launch the
Dummy Agent, the Dummy Agent fails to appear if one is running elsewhere. Instead, select the
container, right click and choose Start New Agent. Choose a none-clashing nickname for the new
Dummy Agent, and enter its full class name jade.tools.DummyAgent.DummyAgent.
● A JADE platform is a cooperative system. If you hook up to the main platform server from a
remote machine and run an RMA agent on the remote machine you can use that agent to destroy
the whole platform! Be nice. Security will eventually be added to JADE.
Setting Up
Boot a JADE platform on each of two computers in the usual way. For example, on host Frodo
runjade -host Frodo -gui
and
runjade -host IBM -gui
on host IBM.
Now, as usual, we want to send a message from a DummyAgent to a PingAgent, this time with the agents residing on separate platforms, not just in separate containers on the same platform. To do this we use the IOR's as the addresses for the agents.
End Points
The IIOP IOR (endpoint) of a platform is automatically stored in a file called MTP-Main-Contairner.txt. A sender of a message must know the receivers IOR so somehow, the sender must get a hold of the MTP-Main-Container.txt file of the receiver. One could use ftp. On a LAN with MS Windows you can just copy the
file or even just cut and paste its contents.
The platform with the DummyAgent needs to know the IOR of the platform with the PingAgent in order to send it a message. (Of course it knows its own IOR.)
In this tutorial we just use "Network Neighborhood" with the editor NotePad to open the receiver's file and copy the IOR to the Receiver field of the DummyAgent.
On MS Windows you type ctrl-v to do the pasting.
Recall that to add a receiver to the DummyAgent
Remember to remove the cr/lf from the end of the IOR. You can see from the pictures below that you get a visual clue if you have entered the IOR correctly. right click on the receivers field and choose add. This
brings up the AID window. Enter the full name of the
PingAgent, e.g., ping0@Frodo:1099/JADE. Then
The IOR with a cr/lf (bad) right click the address field in the AID window and
use ctrl-v to paste the IOR into this field.
(This may not happen in version 2.5.
)
Do not check the box indicating a local name. Fill in the full,global name (with the @ sign.)
Click OK and then send the message to the ping0 agent.
Comment
Using the JDK 1.3 CORBA/IIOP ORB is clearly very awkward. It would be well to install the Orbacus ORB add on (see the distribution documentation on doing this) which allows the standard host:port addressing for the endpoints.
Many people use the HTTP MTP add-on for inter platform communication. Tutorial 4 of these notes shows how to do this.
http://IBM:7778/acc
Agent container Main-Container@JADE-IMTP://IBM is ready.
http://IBM:7778/acc is the address of the platform on the host "IBM" on the default port 7778. You can
override the defaults with -port and -host as usual.
Similarly run another platform on another host. In my case this is a computer called Frodo, so the platform
has the address http://Frodo:7778/acc.
(Reminder: If you need the full name of the host, including the domain, specify it with -host, e.g.
Frodo.scss.ryerson.ca, on the command line.)
Select "Add Platform via AMS AID". This window appears. (Shown filled out>)
Notice the name of the ams agent on the remote platform. The host part of the name is in RMI format.
Note also that the checkbox is unselected. We need the Global Agent Identifier for the remote AMS.
On the other hand the address of the platform is HTTP since we added the HTTP MTP for inter platform
communication.
After you click OK, and expand the platform you get this:
Nice, but where are the agents? To see them, select "frodo:1099/JADE" (actually, your equivalent to this),
and right click the mouse. Then choose "refresh agent list", and there they are, like so:
Since JADE 2.1, FIPA-compliant Message Transport Protocols can be plugged and activated at run-time on
any JADE container. By default, the platform uses an IIOP based MTP which relies on the ORB provided
with jdk1.2. However, HTTP can be used as an alternative transport. This tutorial describes how to install
and use the HTTP MTP with JADE.
Installation.
In order to install HTTP the following steps must be performed:
● The HTTP MTP must be downloaded from the JADE download page.
● after downloading you MUST unzip the HTTP MTP package under the root of the jade distribution
tree. You should end having a hierarchy like jade/add-ons/http.
● A SAX parser must be downloaded and installed into the system. See below a list of known parsers
and configuration options.
● The xml parser jar file must be added to the CLASSPATH or specified in the -classpath argument
when starting the virtual machine
Compiling
The default Makefile rules don't take the HTTP MTP into account. For handling the compilation process of
the HTTP MTP you have to use the Makefile located in the http directory. The following rules are
available:
● make - compiles the http classes
● make clean - removes the compiled classes and the http.jar archive
The current configuration uses Crimson as the default parser. So if you don't want to make any changes you
just have to download Crimson from the link provided above and make sure it is added to the classpath
when starting ( either by including it into the $CLASSPATH environment variable - %CLASSPATH%
under windows or by specifing it on the command line ) .
Here is an example of how you would start the platform assuming that you copied crimson.jar from the
initial distribution to the jade/lib directory:
java -classpath
./lib/jade.jar:./lib/jadeTools.jar:./lib/crimson.jar:./http/lib/http.jar
jade.Boot ( for Unix )
or
java -classpath
.\lib\jade.jar;.\lib\jadeTools.jar;.\lib\crimson.jar;.\http\lib\http.jar
jade.Boot ( for Windows )
If you want to use another parser suplementary you have to specify in the command line the system
property org.xml.sax.parser as in the following example ( also assuming that you have copied xerces.jar
from the initial distribution to the jade/lib directory ) :
java -Dorg.xml.sax.parser=org.apache.xerces.parsers.SAXParser -classpath
./lib/jade.jar:./lib/jadeTools.jar:./lib/xerces.jar:./http/lib/http.jar
jade.Boot ( for Unix )
or
java -Dorg.xml.sax.parser=org.apache.xerces.parsers.SAXParser -classpath
.\lib\jade.jar;.\lib\jadeTools.jar;.\lib\xerces.jar;.\http\lib\http.jar
jade.Boot ( for Windows )
It is possible to activate one ore more communication endpoints. There are two main ways for doing such
an activation:
● from the command line when you start a JADE container.
● the fully qualified name of the class implementing the jade.mtp.MTP interface, and (if it is supported
by the chosen protocol)
● optionally the transport address that will be used to contact the new MTP.
For example, in order to install a new HTTP endpoint on the default local port by using the HTTP MTP,
one should write jamr.jademtp.http.MessageTransportProtocol as the class name and nothing as the
address. In order to use the transport on a different port or a particular interface of the current machine you
could provide as the transport address a standard http url: http://mymachinename.org:8978 ( where 8978
would be the port number on which the transport will bind ).
Choosing Uninstall an MTP shows a dialog where the user can select from a list one of the currently
installed MTPs and remove it from the platform.
Notes:
When activated the HTTP MTP uses by default the local port 7778. Please take into consideration that
using other dedicated ports ( such as 80, 8080, etc. on a machine running a web server or a proxy server )
might result in configuration conflicts and unpredictable results.
When activating the HTTP MTP from the command line it is preferable to specify also the full transport
address - preventing the binding of the server socket to addresses not accessible from outside the domain.
JADE is a trademark of CSELT. JADE has been developed jointly by CSELT and the Computer Engineering
Group of the University of Parma.
The HTTP MTP implementation was developed in the Artificial Inteligence Laboratory ( LIA ) at the Swiss Federal
Institute of Technology Lausanne ( EPFL ) by Ion Constantinescu.
This is the GUI of the RMA (Remote Management Agent). The RMA is the main tool for managing
JADE.
Agents live in containers. Containers can be connected via RMI. They can be both local or remote. The
Main container is associated with the RMI registry. The RMA can see all the containers. You can also
have multiple RMA agents in different containers (but only one per container).
The JADE system itself is made up of agents. The two key ones are the AMS (Agent Management System
agent ) and the DF (directory facilitator). The characteristics of these agents are specified by FIPA. (see
XC00023).
Every agent that wishes to publicise its services to other agents, should find an appropriate DF
and request the registration of its agent description. There is no intended future commitment or
obligation on the part of the registering agent implied in the act of registering. For example, an agent
can refuse a request for a service which is advertised through a DF. Additionally, the DF cannot
guarantee the validity or accuracy of the information that has been registered with it, neither can it
control the life cycle of any agent. An object description must be supplied containing values for all
of the mandatory parameters of the description. It may also supply optional and private parameters,
containing non-FIPA standardised information that an agent developer might want included in the
directory. The deregistration function has the consequence that there is no longer a commitment on
behalf of the DF to broker information relating to that agent. At any time, and for any reason, the
agent may request the DF to modify its agent description.
An agent may search in order to request information from a DF. The DF does not guarantee the
validity of the information provided in response to a search request, since the DF does not place any
restrictions on the information that can be registered with it. However, the DF may restrict access to
information in its directory and will verify all access permissions for agents which attempt to inform
it of agent state changes.
● deregister
● modify
● search
The AMS represents the managing authority of an AP and if the AP spans multiple machines, then
the AMS represents the authority across all machines. An AMS can request that an agent performs a
specific management function, such as quit (that is, terminate all execution on its AP) and has the
authority to forcibly enforce the function if such a request is ignored.
The AMS maintains an index of all the agents that are currently resident on an AP, which
includes the AID of agents. Residency of an agent on the AP implies that the agent has been
registered with the AMS. Each agent, in order to comply with the FIPA reference model, must
register with the AMS of its HAP. Registration with the AMS, implies authorisation to access the
MTS of the AP in order to send or receive messages. The AMS will check the validity of the passed
agent description and, in particular, the local uniqueness of the agent name in the AID.
Agent descriptions can be later modified at any time and for any reason. Modification is restricted
by authorisation of the AMS. The life of an agent with an AP terminates with its deregistration from
the AMS. After deregistration, the AID of that agent can be removed by the directory and can be
made available to other agents who should request it.
Agent description can be searched with the AMS and access to the directory of
ams-agent-descriptions is further controlled by the AMS; no default policy is specified by this
specification.
The AMS is also the custodian of the AP description that can be retrieved by requesting the action
get-description.
● deregister
● modify
● search
● get-description
In addition to the management functions exchanged between the AMS and agents on the AP, the
AMS can instruct the underlying AP to perform the following operations:
● Suspend agent,
● Terminate agent,
● Create agent,
● Invoke agent,
● Resource management.
Authors: Fabio Bellifemine, Giovanni Caire, Tiziana Trucco (ex CSELT now TILab)
Giovanni Rimassa (University of Parma)
JADE - Java Agent DEvelopment Framework is a framework to develop multi-agent systems in compliance with
the FIPA specifications. JADE successfully passed the 1st FIPA interoperability test in Seoul (Jan. 99) and the 2nd FIPA
interoperability test in London (Apr. 01).
Copyright (C) 2000 CSELT S.p.A.
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General
Public License as published by the Free Software Foundation, version 2.1 of the License.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this library; if not, write
to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
1
JADE Programmer’s GUIDE
TABLE OF CONTENTS
1 INTRODUCTION 4
2 JADE FEATURES 6
2
JADE Programmer’s GUIDE
3.5.1.1 AchieveREInitiator 35
3.5.1.2 AchieveREResponder 36
3.5.1.3 Example of using these two generic classes for implementing a specific FIPA protocol
37
3.5.2 FIPA-Contract-Net 38
3.5.2.1 FipaContractNetInitiatorBehaviour 38
3.5.3 FipaContractNetResponderBehaviour 39
3.5.4 Generic states of interaction protocols 39
3.5.4.1 HandlerSelector class 39
3.5.4.2 MsgReceiver class 39
3
JADE Programmer’s GUIDE
1 INTRODUCTION
This programmer's guide is complemented by the administrator's guide and the HTML
documentation available in the directory jade/doc. If and where conflict arises between what is
reported in the HTML documentation and this guide, preference should be given to the HTML
documentation that is updated more frequently.
JADE (Java Agent Development Framework) is a software development framework aimed
at developing multi-agent systems and applications conforming to FIPA standards for intelligent
agents. It includes two main products: a FIPA-compliant agent platform and a package to develop
Java agents. JADE has been fully coded in Java and an agent programmer, in order to exploit the
framework, should code his/her agents in Java, following the implementation guidelines
described in this programmer's guide.
This guide supposes the reader to be familiar with the FIPA standards1, at least with the
Agent Management specifications (FIPA no. 23), the Agent Communication Language, and the
ACL Message Structure (FIPA no. 61).
JADE is written in Java language and is made of various Java packages, giving application
programmers both ready-made pieces of functionality and abstract interfaces for custom,
application dependent tasks. Java was the programming language of choice because of its many
attractive features, particularly geared towards object-oriented programming in distributed
heterogeneous environments; some of these features are Object Serialization, Reflection API and
Remote Method Invocation (RMI).
JADE is composed of the following main packages.
jade.core implements the kernel of the system. It owns the Agent class that must be
extended by application programmers; besides, a Behaviour class hierarchy is contained in
jade.core.behaviours sub-package. Behaviours implement the tasks, or intentions, of an
agent. They are logical activity units that can be composed in various ways to achieve complex
execution patterns and that can be concurrently executed. Application programmers define agent
operations writing behaviours and agent execution paths interconnecting them.
The jade.lang package has a sub-package for every language used in JADE. In particular,
a jade.lang.acl sub-package is provided to process Agent Communication Language
according to FIPA standard specifications. jade.lang.sl contains the SL-0 codec2 , both the
parser and the encoder.
The jade.onto package contains a set of classes to support user-defined ontologies. It has
a subpackage jade.onto.basic containing a set of basic concepts (i.e. Action, TruePredicate,
FalsePredicate, …) that are usually part of every ontology, and a BasicOntology that can be
joined with user-defined ontologies.
The jade.domain package contains all those Java classes that represent the Agent
Management entities defined by the FIPA standard, in particular the AMS and DF agents, that
provide life-cycle, white and yellow page services. The subpackage
jade.domain.FIPAAgentManagement contains the FIPA-Agent-Management Ontology and
all the classes representing its concepts. The subpackage
1
See http://www.fipa.org/
2
refer to FIPA document no. 8 for the specifications of the SL content language.
4
JADE Programmer’s GUIDE
5
JADE Programmer’s GUIDE
way to control the knowledge base of a DF, to federate a DF with other DF's, and to
remotely control (register/deregister/modify/search) the knowledge base of the parent
DF's and also the children DF's (implementing the network of domains and sub-
domains).
JADE is a trade mark registered by CSELT3 .
2 JADE FEATURES
The following is the list of features that JADE offers to the agent programmer:
- Distributed agent platform. The agent platform can be split among several hosts (provided
they can be connected via RMI). Only one Java application, and therefore only one Java
Virtual Machine, is executed on each host. Agents are implemented as Java threads and live
within Agent Containers that provide the runtime support to the agent execution.
- Graphical user interface to manage several agents and agent containers from a remote host.
- Debugging tools to help in developing multi agents applications based on JADE.
- Intra-platform agent mobility, including state and code of the agent.
- Support to the execution of multiple, parallel and concurrent agent activities via the behaviour
model. JADE schedules the agent behaviours in a non-preemptive fashion.
- FIPA-compliant Agent Platform, which includes the AMS (Agent Management System), the
DF (Directory Facilitator), and the ACC (Agent Communication Channel). All these three
components are automatically activated at the agent platform start-up.
- Many FIPA-compliant DFs can be started at run time in order to implement multi-domain
applications, where a domain is a logical set of agents, whose services are advertised through
a common facilitator. Each DF inherits a GUI and all the standard capabilities defined by
FIPA (i.e. capability of registering, deregistering, modifying and searching for agent
descriptions; and capability of federating within a network of DF's).
- Efficient transport of ACL messages inside the same agent platform. Infact, messages are
transferred encoded as Java objects, rather than strings, in order to avoid marshalling and
unmarshalling procedures. When crossing platform boundaries, the message is automatically
converted to/from the FIPA compliant syntax, encoding, and transport protocol. This
conversion is transparent to the agent implementers that only need to deal with Java objects.
- Library of FIPA interaction protocols ready to be used.
- Automatic registration and deregistration of agents with the AMS.
- FIPA-compliant naming service: at start-up agents obtain their GUID (Globally Unique
Identifier) from the platform.
- Support for application-defined content languages and ontologies.
- InProcess Interface to allow external applications to launch autonomous agents.
This chapter describes the JADE classes that support the development of multi-agent
systems. JADE warrants syntactical compliance and, where possible, semantic comp liance with
FIPA specifications.
3
Since March 2001, the name of the company is changed into TILab.
6
JADE Programmer’s GUIDE
The Agent Management System (AMS) is the agent who exerts supervisory control over
access to and use of the Agent Platform. Only one AMS will exist in a single platform. The AMS
provides white-page and life-cycle service, maintaining a directory of agent identifiers (AID) and
agent state. Each agent must register with an AMS in order to get a valid AID.
The Directory Facilitator (DF) is the agent who provides the default yellow page service in
the platform.
The Message Transport System, also called Agent Communication Channel (ACC), is the
software component controlling all the exchange of messages within the platform, including
messages to/from remote platforms.
JADE fully complies with this reference architecture and when a JADE platform is launched,
the AMS and DF are immediately created and the ACC module is set to allow message
communication. The agent platform can be split on several hosts. Only one Java application, and
therefore only one Java Virtual Machine (JVM), is executed on each hos t. Each JVM is a basic
container of agents that provides a complete run time environment for agent execution and allows
several agents to concurrently execute on the same host. The main-container, or front-end, is the
agent container where the AMS and DF lives and where the RMI registry, that is used internally
by JADE, is created. The other agent containers, instead, connect to the main container and
provide a complete run-time environment for the execution of any set of JADE agents.
7
JADE Programmer’s GUIDE
Application Agent
Application Agent
Application Agent
Application Agent
Application Agent
Application Agent
Application Agent
Application Agent
Application Agent
According to the FIPA specifications, DF and AMS agents communicate by using the
FIPA-SL0 content language, the fipa-agent-management ontology, and the fipa-
request interaction protocol. JADE provides compliant implementations for all these
components:
- the SL-0 content language is implemented by the class jade.lang.sl.SL0Codec.
Automatic capability of using this language can be added to any agent by using the method
Agent.registerLanguage(SL0Codec.NAME, new SL0Codec());
- concepts of the ontology (apart from Agent Identifier, implemented by jade.core.AID)
are implemented by classes in the jade.domain.FIPAAgentManagement package.
The FIPAAgentManagementOntology class defines the vocabulary with all the
constant symbols of the ontology. Automatic capability of using this ontology can be added
to any agent by using the fillowing code:
Agent.registerOntology(FIPAAgentManagementOntology.NAME,
FIPAAgentManagement Ontology.instance());
- finally, the fipa-request interaction protocol is implemented as ready-to-use behaviours
in the package jade.proto.
8
JADE Programmer’s GUIDE
1) The attribute type is a single value; then it can be read with attrType
getAttrName() and written with void setAttrName(attrType a), where
every call to setAttrName() overwrites any previous value of the attribute.
2) The attribute type is a set or a sequence of values; then there is an void
addAttrName(attrType a) method to insert a new value and a void
clearAllAttrName() method to remove all the values (the list becomes empty).
Reading is performed by a Iterator getAllAttrName() method that returns an
Iterator object that allows the programmer to walk through the List and cast its
elements to the appropriate type.
Refer to the HTML documentation for a complete list of these classes and their interface.
JADE features described so far allow complete interactions between FIPA system agents and
user defined agents, simply by sending and receiving messages as defined by the standard.
However, because those interactions have been fully standardized and because they are very
common, the following classes allow to successfully accomplish this task with a simplified
interface.
Two methods are implemented by the class Agent to get the AID of the default DF and
AMS of the platform: getDefaultDF() and getAMS() .
3.1.2.1 DFServiceCommunicator
jade.domain.DFServiceCommunicator implements a set of static methods to
communicate with a standard FIPA DF service (i.e. a yellow pages agent).
It includes methods to request register, deregister, modify and search
actions from a DF. Each of this method has a version with all the needed parameters, and one
with a subset of them where the omitted parameters are given default values.
Notice that these methods block every agent activity until the action is successfully executed
or a jade.domain.FIPAException exception is thrown (e.g. because a failure message
has been received by the DF), that is, until the end of the conversation.
In some cases, instead, it is more convenient to execute this task in a non-blocking way. The
method getNonBlockingBehaviour() returns a non-blocking behaviour (of type
RequestFIPAServiceBehaviour) that can be added to the agent behaviours, as usual, by
using Agent.addBehaviour(). Several ways are availa ble to get the result of this behaviour
and the programmer can select one according to his preferred programming style:
9
JADE Programmer’s GUIDE
3.1.2.2 AMSServiceCommunicator
This class is dual of DFServiceCommunicator class, accessing services provided by a
standard FIPA AMS agent and its interface completely corresponds the the
DFServiceCommunicator one.
Notice that JADE calls automatically the register and deregister methods with the
default AMS respectively before calling setup() method and just after takeDown() method
returns; so there is no need for a normal programmer to call them.
However, under certain circumstances, a programmer might need to call its methods. To give
some examples: when an agent wishes to register with the AMS of a remote agent platform, or
when an agent wishes to modify its description by adding a private address to the set of its
addresses, …
3.2 The Agent class
The Agent class represents a common base class for user defined agents. Therefore, from
the programmer’s point of view, a JADE agent is simply an instance of a user defined Java class
that extends the base Agent class. This implies the inheritance of features to accomplish basic
interactions with the agent platform (registration, configuration, remote management, …) and a
basic set of methods that can be called to m i plement the custom behaviour of the agent (e.g.
send/receive messages, use standard interaction protocols, register with several domains, …).
The computational model of an agent is multitask, where tasks (or behaviours) are executed
concurrently. Each functionality/service provided by an agent should be implemented as one or
more behaviours (refer to section 3.4 for implementation of behaviours). A scheduler, internal to
the base Agent class and hidden to the programmer, automatically manages the scheduling of
behaviours.
10
JADE Programmer’s GUIDE
Waiting Suspended
Wait Resume
Wake Up Suspend
Unknown
Destroy
Active
Quit
Move
Invoke
Create
Execute
Transit Initiated
A JADE agent can be in one of several states, according to Agent Platform Life Cycle in
FIPA specification; these are represented by some constants in Agent class. The states are:
- AP_INITIATED : the Agent object is built, but hasn't registered itself yet with the AMS,
has neither a name nor an address and cannot communicate with other agents.
- AP_ACTIVE : the Agent obje ct is registered with the AMS, has a regular name and address
and can access all the various JADE features.
- AP_SUSPENDED : the Agent object is currently stopped. Its internal thread is suspended
and no agent behaviour is being executed.
- AP_WAITING : the Agent object is blocked, waiting for something. Its internal thread is
sleeping on a Java monitor and will wake up when some condition is met (typically when a
message arrives).
- AP_DELETED : the Agent is definitely dead. The internal thread has terminated its
execution and the Agent is no more registered with the AMS.
- AP_TRANSIT: a mobile agent enters this state while it is migrating to the new location. The
system continues to buffer messages that will then be sent to its new location.
- AP_COPY: this state is internally used by JADE for agent being cloned.
- AP_GONE: this state is internally used by JADE when a mobile agent has migrated to a new
location and has a stable state.
The Agent class provides public methods to perform transitions between the various states;
these methods take their names from a suitable transition in the Finite State Machine shown in
FIPA specification Agent Management. For example, doWait() method puts the agent into
AP_WAITING state from AP_ACTIVE state, doSuspend()method puts the agent into
11
JADE Programmer’s GUIDE
12
JADE Programmer’s GUIDE
agents, but just after the takeDown()method is completed, the agent will be de-registered and
its thread destroyed. The intended purpose of this method is to perform application specific
cleanup operations, such as de-registering with DF agents.
The Agent class also provides a set of methods for inter-agent communication. According
to the FIPA specification, agents communicate via asynchronous message passing, where objects
of the ACLMessage class are the exchanged payloads. See also section 3.3 for a description of
the ACLMessage class. Some of the interaction protocols defined by FIPA are also available as
ready-to-use behaviours that can be scheduled for agent activities; they are part of the
jade.proto package.
The Agent.send() method allows to send an ACLMessage . The value of the receiver slot
holds the list of the receiving agent IDs. The method call is completely transparent to where the
agent resides, i.e. be it local or remote, it is the platform that takes care of selecting the most
appropriate address and transport mechanism.
An application, that is structured as a Multi Agent System, still needs to interact with its users.
So, it is often necessary to provide a GUI for at least some agents in the application. This need
raises some problems, though, stemming from the mismatch between the autonomous nature of
agents and the reactive nature of ordinary graphical user interfaces. When JADE is used, the
thread-per-agent concurrency model of JADE agents must work together with the Swing
concurrency model.
13
JADE Programmer’s GUIDE
14
JADE Programmer’s GUIDE
15
JADE Programmer’s GUIDE
// ...
}
class rma extends Agent implements RMAExternal {
private MainWindow myGUI;
protected void setup() {
myGUI = new MainWindow(this);//Parameter 'this' typed as RMAExternal
// ...
}
}
With the schema above, the GUI will be able to call only the external methods of the RMA
agent.
16
JADE Programmer’s GUIDE
}
};
SwingUtilities.invokeLater(addIt);
}
As can be seen from the above code, all the accesses to the agent tree are encapsulated inside a
Runnable that is submitted for execution to the Event Dispatcher thread using the
SwingUtilities.invokeLater() method. The whole process of Runnable creation and
submission is contained within the addAgent() method of the MainWindow class, so that the
rma agent does not directly deal with Swing calls (it does not even have to import Swing related
classes).
If we consider the whole MainWindow as an active object whose thread is the Event Dispatcher
thread, then the addAgent() method is clearly an external method and this approach mirrors
exactly the technique used in the section above. However, since the GUI is not to be seen as an
autonomous software component, the choice of using external methods or not is just a matter of
software structure, without particular conceptual meaning.
A thread (in particular the GUI) wishing to notify an event to an agent should create a new
object of type jade.gui.GuiEvent and pass it as a parameter to the call of the method
postGuiEvent() of the jade.gui.GuiAgent object. After the method postGuiEvent() is
called, the agent reacts by waking up all its active behaviours, and in particular the behaviour
above mentioned that causes the agent thread to execute the method onGuiEvent(). Notice that
an object GuiEvent has two mandatory attributes (i.e. the source of the event and an integer
identifying the type of event) and an optional list of parameters4 that can be added to the event
object.
As a consequence, an agent wishing to receive events from another thread (in particular its
GUI) should define the types of events it intends to receive and then implement the method
onGuiEvent() . In general, this method is a big switch, one case for each type of event. The
example mobile, distributed with JADE, is a good example of this feature.
In order to explain further the previous concepts, in the following are reported some
interesting points of the code of the example concerning the MobileAgent .
File MobileAgent.java
4
The type of each parameter must extend java.lang.Object; therefore primitive objects (e.g. int) should before be
wrapped into appropriate objects (e.g. java.lang.Integer).
17
JADE Programmer’s GUIDE
……
……
public void setup() {
……
// creates and shows the GUI
gui = new MobileAgentGui(this);
gui.setVisible(true);
……
}
……
18
JADE Programmer’s GUIDE
doClone(nextSite,"clone"+cnt+"of"+getName());
break;
case STOP_EVENT:
stopCounter();
break;
case CONTINUE_EVENT:
continueCounter();
break;
case REFRESH_EVENT:
addBehaviour(new
GetAvailableLocationsBehaviour(this));
break;
}
}
}
File MobileAgentGui.java
package examples.mobile;
// Constructor
MobileAgentGui(MobileAgent a)
{
super();
myAgent = a;
……
19
JADE Programmer’s GUIDE
b.addActionListener(this);
…
b = new JButton(MOVELABEL);
b.addActionListener(this);
…
b = new JButton(CLONELABEL);
b.addActionListener(this);
…
b = new JButton(EXITLABEL);
b.addActionListener(this);
……
}
……
GuiEvent ev = new
GuiEvent((Object)this,myAgent.MOVE_EVENT);
ev.addParameter(dest);
myAgent.postGuiEvent(ev);
}
// CLONE
else if (command.equalsIgnoreCase(CLONELABEL)) {
Location dest;
int sel = availableSiteList.getSelectedRow();
if (sel >= 0)
dest = availableSiteListModel.getElementAt(sel);
else
dest = availableSiteListModel.getElementAt(0);
GuiEvent ev = new
GuiEvent((Object)this,myAgent.CLONE_EVENT);
20
JADE Programmer’s GUIDE
ev.addParameter(dest);
myAgent.postGuiEvent(ev);
}
// EXIT
else if (command.equalsIgnoreCase(EXITLABEL)) {
GuiEvent ev = new GuiEvent(null,myAgent.EXIT);
myAgent.postGuiEvent(ev);
}
else if (command.equalsIgnoreCase(PAUSELABEL)) {
GuiEvent ev = new GuiEvent(null,myAgent.STOP_EVENT);
myAgent.postGuiEvent(ev);
}
else if (command.equalsIgnoreCase(CONTINUELABEL)){
GuiEvent ev = new GuiEvent(null,myAgent.CONTINUE_EVENT);
myAgent.postGuiEvent(ev);
}
else if (command.equalsIgnoreCase(REFRESHLABEL)) {
GuiEvent ev = new GuiEvent(null,myAgent.REFRESH_EVENT);
myAgent.postGuiEvent(ev);
}
}
……
}
A list of arguments can be passed to an Agent and they can be retrieved by calling the
method Object[] getArguments(). Notice that the arguments are transient and they do not
migrate with the agent neither they are cloned with the agent.
- a list of agents can be specified on the command line, by using the syntax described in the
Administrator’s Guide. Arguments, embedded within parenthesis, can be passed to each
agent. This is the most common optio n and the option that best matches the theoretical
requirement of agent autonomy.
- an agent can be launched by an administrator by using the RMA (Remote Monitoring Agent)
GUI, as described in the Administrator’s Guide. Arguments, embedded within parenthesis ,
can be passed to each agent.
- finally, an agent can also be launched by any external Java program by using the InProcess
Interface as described in section 3.8
21
JADE Programmer’s GUIDE
The class ACLMessage represents ACL messages that can be exchanged between agents. It
contains a set of attributes as defined by the FIPA specifications.
An agent willing to send a message should create a new ACLMessage object, fill its
attributes with appropriate values, and finally call the method Agent.send(). Likewise, an
agent willing to receive a message should call receive() or blockingReceive()
methods, both implemented by the Agent class and described in section 3.2.2.
Sending or receiving messages can also be scheduled as independent agent activities by
adding the behaviours ReceiverBehaviour and SenderBehaviour to the agent queue of
tasks.
All the attributes of the ACLMessage object can be accessed via the
set/get<Attribute>() access methods. All attributes are named after the names of the
parameters, as defined by the FIPA specifications. Those parameters whose type is a set of values
(like receiver, for instance) can be accessed via the methods add/getAll<Attribute>()
where the first method adds a value to the set, while the second method returns an Iterator
over all the values in the set. Notice that all the get() methods return null when the attribute
has not been yet set.
Furthermore, this class also defines a set of constants that should be used to refer to the FIPA
performatives, i.e. REQUEST, INFORM, etc. When creating a new ACLMessage object, one of
these constants must be passed to ACLMessage class constructor, in order to select the message
performative. The reset() method resets the values of all message fields.
The toString() method returns a string representing the message. This method should be
just used for debugging purposes.
According to FIPA specifications, a reply message must be formed taking into account a set
of well-formed rules, such as setting the appropriate value for the attribute in-reply-to, using the
same conversation-id, etc. JADE helps the programmer in this task via the method
createReply() of the ACLMessage class. This method returns a new ACLMessage object
that is a valid reply to the current one. Then, the programmer only needs to set the application-
specific communicative act and message content.
Some applications may benefit from transmitting a sequence of bytes over the content of an
ACLMessage. A typical usage is passing Java objects between two agents by exploiting the Java
serialization. The ACLMessage class supports the programmer in this task by allowing the usage
of Base64 encoding through the two methods setContentObject() and
getContentObject(). Refer to the HTML documentation of the JADE API and to the
examples in examples/Base64 directory for an example of usage of this feature.
It must be noticed that this feature does not comply to FIPA and that any agent platform can
recognize automatically the usage of Base64 encoding5 , so the methods must appropriately used
5
The implementation of this feature uses the source code contained within the src/starlight directory. This code is
covered by the GNU General Public License, as decided by the copyright owner Kevin Kelley. The GPL license itself
has been included as a text file named COPYING in the same directory. If the programmer does not need any support
for Base64 encoding, then this code is not necessary and can be removed.
22
JADE Programmer’s GUIDE
by the programmers and should suppose that communicating agents know a-priori the usage of
these methods.
Under normal conditions, agents never need to call explicitly the codec of the ACL messages
because it is done automatically by the platform. However, when needed for some special
circumstances, the programmer should use the methods provided by the class
StringACLCodec to parse and encode ACL messages in String format.
The JADE behaviour model allows an agent to execute several parallel tasks. However any
agent should be provided with the capability of carrying on also many simultaneous
conversations. Because the queue of incoming messages is shared by all the agent behaviours, an
access mode to that queue based on pattern matching has been implemented (see 3.2.2.1).
The MessageTemplate class allows to build patterns to match ACL messages against.
Using the methods of this class the programmer can create one pattern for each attribute of the
ACLMessage. Elementary patterns can be combined with AND, OR and NOT operators, in
order to build more complex matching rules. In such a way, the queue of incoming ACL
messages can be accessed via pattern-matching rather than FIFO.
The user can also define application specific patterns extending the MatchExpression
interface in order to provide a new match() method to use in the pattern matching phase.
The example WaitAgent in the MessageTemplate directory of the package examples, shows
a way to create an application-specific MessageTemplate:
23
JADE Programmer’s GUIDE
}
class WaitBehaviour extends SimpleBehaviour {
public WaitBehaviour(Agent a, MessageTemplate mt) {
……}
public void action() {
……
ACLMessage msg = blockingReceive(template);
……
}
……
} //End class WaitBehaviour
MessageTemplate mt =
MessageTemplate.and(myTemplate,MessageTemplate.MatchPerformative(
ACLMessage.REQUEST));
An agent must be able to carry out several concurrent tasks in response to different external
events. In order to make agent management efficient, every JADE agent is composed of a single
execution thread and all its tasks are modelled and can be implemented as Behaviour objects.
Multi-threaded agents can also be implemented but no specific support (except synchronizing the
ACL message queue) is provided by JADE.
The developer who wants to implement an agent-specific task should define one or more
Behaviour subclasses, instantiate them and add the behaviour objects to the agent task list. The
Agent class, which must be extended by agent programmers, exposes two methods:
addBehaviour(Behaviour) and removeBehaviour(Behaviour), which allow to
24
JADE Programmer’s GUIDE
manage the ready tasks queue of a specific agent. Notice that behaviours and sub-behaviours can
be added whenever is needed, and not only within Agent.setup() method. Adding a
behaviour should be seen as a way to spawn a new (cooperative) execution thread within the
agent.
A scheduler, implemented by the base Agent class and hidden to the programmer, carries
out a round-robin non-preemptive scheduling policy among all behaviours available in the ready
queue, executing a Behaviour-derived class until it will release control (this happens when
action() method returns). If the task relinquishing the control has not yet completed, it will be
rescheduled the next round. A behaviour can also block, waiting for a message to arrive. In detail,
the agent scheduler executes action() method of each behaviour present in the ready
behaviours queue; when action() returns, the method done() is called to check if the
behaviour has completed its task. If so, the behaviour object is removed from the queue.
Behaviours work just like co-operative threads, but there is no stack to be saved. Therefore,
the whole computation state must be maintained in instance variables of the Behaviour and its
associated Agent.
In order to avoid an active wait for messages (and, as a consequence, a waste of CPU time),
every single Behaviour is allowed to block its computation. The method block() puts the
behaviour in a queue of blocked behaviours as soon as the action() method returns. Notice,
therefore, that the blocking effect is not achieved immediately after calling the block()
method, but just after returning from the action() method. All blocked behaviours are
rescheduled as soon as a new message arrives, therefore the programmer must take care of
blocking again a behaviour if it was not interested in the arrived message. Moreover, a behaviour
object can block itself for a limited amount of time passing a timeout value to block() method.
In future releases of JADE, more wake up events will be probably considered.
Because of the non preemptive multitasking model chosen for agent behaviours, agent
programmers must avoid to use endless loops and even to perform long operations within
action() methods. Remember that when some behaviour’s action() is running, no
other behaviour can go on until the end of the method (of course this is true only with respect
to behaviours of the same agent: behaviours of other agents run in different Java threads and can
still proceed independently).
Besides, since no stack contest is saved, every time action() method is run from the
beginning: there is no way to interrupt a behaviour in the middle of its action(), yield the CPU
to other behaviours and then start the original behaviour back from where it left.
For example, suppose a particular operation op() is too long to be run in a single step and is
therefore broken in three sub-operations, named op1(),op2() and op3(). To achieve desired
functionality one must call op1() the first time the behaviour is run, op2() the second time and
op3() the third time , after which the behaviour must be marked as terminated. The code will
look like the following:
25
JADE Programmer’s GUIDE
Following this idiom, agent behaviours can be described as finite state machines, keeping
their whole state in their instance variables.
When dealing with complex agent behaviours (as agent interaction protocols) using explicit
state variables can be cumbersome; so JADE also supports a compositional technique to build
more complex behaviours out of simpler ones.
The framework provides ready to use Behaviour subclasses that can contain sub-
behaviours and execute them according to some policy. For example, a
SequentialBehaviour class is provided, that executes its sub-behaviours one after the other
for each action() invocation.
The following figure is an annotated UML class diagram for JADE behaviours.
26
JADE Programmer’s GUIDE
Behaviour
<<abstract>> action()
0..* <<abstract>> done() Models a generic
onStart() task
onEnd()
block()
restart()
Models a complex
task i.e. a task that is Models a simple task
made up by CompositeBehaviour i.e. a task that is not SimpleBehaviour
composing a number composed of sub-tasks
of other tasks.
OneShotBehaviour CyclicBehaviour
FSMBehaviour
SequentialBehaviour ParallelBehaviour
registerState()
registerTransition() addSubBehaviour() addSubBehaviour()
Starting from the basic class Behaviour, a class hierarchy is defined in the
jade.core.behaviour package of the JADE framework.
A complete description of all these classes follows.
This abstract class provides an abstract base class for modelling agent tasks, and it sets the
basis for behaviour scheduling as it allows for state transitions (i.e. starting, blocking and
restarting a Java behaviour object).
The block() method allows to block a behaviour object until some event happens
(typically, until a message arrives). This method leaves unaffected the other behaviours of an
agent, thereby allowing finer grained control on agent multitasking. This method puts the
behaviour in a queue of blocked behaviours and takes effect as soon as action() returns. All
blocked behaviours are rescheduled as soon as a new message arrives. Moreover, a behaviour
27
JADE Programmer’s GUIDE
object can block itself for a limited amount of time passing a timeout value to block() method,
expressed in milliseconds. In future releases of JADE, more wake up events will be probably
considered. A behaviour can be explicitly restarted by calling its restart() method.
Summarizing, a blocked behaviour can resume execution when one of the following three
conditions occurs:
1. An ACL message is received by the agent this behaviour belongs to.
2. A timeout associated with this behaviour by a previous block() call expires.
3. The restart() method is explicitly called on this behaviour.
The Behaviour class also provides two placeholders methods, named onStart() and
onEnd(). These methods can be overrid den by user defined subclasses when some actions are
to be executed before and after running behaviour execution.
onEnd() returns an int that represents a termination value for the behaviour.
It should be noted that onEnd() is called after the behaviour has completed and has been removed
from the pool of agent behaviours. Therefore calling reset() inside onEnd() is not sufficient to
cyclically repeat the task represented by that behaviour; besides that the behaviour should be
added again to the agent as in the following example
public int onEnd() {
reset();
myAgent.addBehaviour(this);
return 0;
}
This class provides also a couple of methods to get and set a DataStore for the behaviour.
The DataStore can be a useful repository for exchanging data between behaviours, as done, for
instance, by the classes jade.proto.AchieveREInitiator/Responder. Notice that the DataStore is
cleaned and all the contained data are lost when the behaviour is reset.
This abstract class models simple atomic behaviours. Its reset() method does nothing by
default, but it can be overridden by user defined subclasses.
This abstract class models atomic behaviours that must be executed only once and cannot be
blocked. So, its done() method always returns true.
This abstract class models atomic behaviours that must be executed forever. So its done()
method always returns false.
This abstract class models behaviours that are made up by composing a number of other
behaviours (children). So the actual operations performed by executing this behaviour are not
defined in the behaviour itself, but inside its children while the composite behaviour takes only
28
JADE Programmer’s GUIDE
6
Each time the action() method of a complex behaviour is called this results in calling the action() method of one
of its children. The scheduling policy determines which children to select at each round.
29
JADE Programmer’s GUIDE
Encapsulates an atomic operation which realises the “receive” action. Its action terminates
when a message is received. If the message queue is empty or there is no message matching the
MessageTemplate parameter, action() method calls block() and returns. The received
message is copied into a user specified ACLMessage, passed in the constructor. Two more
constructors take a timeout value as argument, expressed in milliseconds; a
ReceiverBehaviour created using one of these two constructors will terminate after the
timeout has expired, whether a suitable message has been received or not. An Handle object is
used to access the received ACL message; when trying to retrieve the message suitable
exceptions can be thrown if no message is available or the timeout expired without any useful
reception.
This abstract class implements a OneShot task that must be executed only once just after a
given timeout is elapsed.
3.4.12 Examples
In order to explain further the previous concepts, an example is reported in the following. It
illustrates the implementation of two agents that, respectively, send and receive messages. The
behaviour of the AgentSender extend the SimpleBehaviour class so it simply sends some
messages to the receiver and than kills itself. The AgentReceiver has instead a behaviour
that extends CyclicBehaviour class and shows different kinds to receive messages.
File AgentSender.java
package examples.receivers;
import java.io.*;
import jade.core.*;
import jade.core.behaviours.*;
import jade.lang.acl.*;
30
JADE Programmer’s GUIDE
File AgentReceiver.java
package examples.receivers;
import java.io.*;
import jade.core.*;
import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
31
JADE Programmer’s GUIDE
32
JADE Programmer’s GUIDE
if (msg!= null){
System.out.println("\nAgent "+ getLocalName() +
" received the following message in state 1.1: " +
msg.toString());
return true;
}
else {
System.out.println("\nNo message received in state 1.1");
block();
return false;
}
33
JADE Programmer’s GUIDE
else
System.out.println("\nNo message received in state 1.3");
}
} // End of my3StepBehaviour class
34
JADE Programmer’s GUIDE
before an agent can execute the action, i.e. before the message can be sent) and the Rational
Effect, i.e. the expected effect of the action or, in other terms, the reason why the message is sent.
The standard specifies also that, having performed the act (i.e. having sent the message), the
sender agent is not entitled to believe that the rational effect necessarily holds; for instance, given
its autonomy, the receiver agent might simply decide to ignore the received message. That is not
desirable in most applications because it generates an undesirable level of uncertainty. For this
reason, instead of sending a single message, an interaction protocol should be initiated by the
sender agent that allows to verify if the expected rational effect has been achieved or not.
FIPA has already specified a number of these interaction protocols, like FIPA-Request,
FIPA-query, FIPA-propose, FIPA-Request-When, FIPA-recruiting, FIPA-brokering, FIPA-
subscribe, that allows the initiator to verify if the expected rational effect of a single
communicative act has been achieved. Because they share the same structure, JADE provides the
AchieveREInitiator/Responder couple of classes which are a single homogeneous
implementation of all these kind of interaction protocols.
Figure 5 shows the structure of these interaction protocols. The initiator sends a message (in
general it performs a communicative act, as shown in the white box). The responder can then
reply by sending a not-understood, or a refuse to achieve the rational effect of the
communicative act, or also an agree message to communicate the agreement to perform (possibly
in the future) the communicative act, as shown in the first row of shaded boxes. The responder
performs the action and, finally, must respond with an inform of the result of the action
(eventually just that the action has been done) or with a failure if anything went wrong. Notice
that we have extended the protocol to make optional the transmission of the agree message.
Infact, in most cases performing the action takes so short time that sending the agree message is
just an useless and uneffective overhead; in such cases, the agree to perform the communicative
act is subsumed by the reception of the following message in the protocol.
communicative act
3.5.1.1 AchieveREInitiator
An instance of this class can be easily constructed by passing, as argument of its constructor,
the message used to initiate the protocol. It is important that this message ha s the right value for
the protocol slot of the ACLMessage as defined by the constants in the interface
FIPAProtocolNames.
Notice that this ACLMessage object might also be incomplete when the constructor of this
class is created; the method prepareRequests can be overridden in order to return the complete
ACLMessage or, more exactly (because this initiator allows to manage a 1:N conversation) a
Vector of ACLMessage objects to be sent.
35
JADE Programmer’s GUIDE
The class can be easily extended by overriding one (or all) of its handle... methods which
provide hooks to handle all the states of the protocol. For instance the method handleRefuse is
called when a refuse message is received.
Skilled programmers might find useful, instead of extending this class and overriding some
of its methods, registering application-specific Behaviours as handler of the states of the protocol,
including, for instance, another AchieveREInitiator behaviour to request a password before
agreeing to perform the communicative act. The methods registerHandle... allow to do that. A
mix of overridden methods and registered behaviours might often be the best solution.
It is worth clarifying the distinction between the following three handlers:
- handleOutOfSequence handles all the unexpected received messages which have the proper
conversation-id or in-reply-to value
- handleAllResponses handles all the received first responses (i.e. not-understood, refuse,
agree) and it is called after having called handleNotUnderstood/Refuse/Agree for each single
response received. In case of 1:N conversations the override of this method might be more
useful than the override of the other methods because this one allows to handle all the
messages in a single call.
- handleAllResultNotifications handles all the received second responses (i.e. failure, inform)
and it is called after having called handleFailure/Inform for each single response received. In
case of 1:N conversations the override of this method might be more useful than the override
of the other methods because this one allows to handle all the messages in a single call.
A set of variables (they are not constants!) is available (..._KEY) that provide the keys to
retrieve the following information from the dataStore of this Behaviour:
- getDataStore().get(ALL_RESPONSES_KEY) returns a Vector of ACLMessage object with all
the first responses (i.e. not-understood, refuse, agree)
- getDataStore().get(ALL_RESULT_NOTIFICATIONS_KEY) returns a Vector of ACLMessage
object with all the second responses (i.e. failure, inform)
- getDataStore().g et(REQUEST_KEY) returns the ACLMessage object passed in the
constructor of the class
- getDataStore().get(ALL_REQUESTS_KEY) returns the Vector of ACLMessage objects
returned by the prepareRequests method. Remind that if a Behaviour is registered as handler
of the PrepareRequests state, it is responsibility of this behaviour to put into the datastore the
proper Vector of ACLMessage objects (bound at the right key) to be sent by this initiator.
This implementation manages the expiration of the timeout, as expressed by the value of the
reply -by slot of the sent ACLMessage objects. In case of 1:N conversation, the minimum is
evaluated and used between the values of all the reply-by slot of the sent ACLMessage objects.
Notice that, as defined by FIPA, this timeout refers to the time when the first response (e.g. the
agree message) has to be received. If applications need to limit the timeout for receiving the last
inform message, they must embed this limit into the content of the message by using application-
specific ontologies.
3.5.1.2 AchieveREResponder
This class is the implementation of the responder role. It is very important to pass the right
message template as argument of its constructor, in fact it is used to select which received
ACLMessage should be served. The method createMessageTemplate can be used to create a
message template for a given interaction protocol, but also more selective templates might be
useful in some cases, for example to have an instance of this class for each possible sender agent.
36
JADE Programmer’s GUIDE
The class can be easily extended by overriding one (or all) of its prepare... methods which
provide hooks to handle the states of the protocol and, in particular, to prepare the response
messages. The method prepareResponse is called when an initiator’s message is received and the
first response (e.g. the agree) must be sent back; the method prepareResultNotification is called,
instead, when the rational effect must be achieved (for instance the action must be performed in
case of a FIPa-Request protocol) and the final response message must be sent back (e.g. the
inform(done)). Take care in returning the proper message and setting all the needed slots of the
ACLMessage; in general it is highly recommended to create the reply message by using the
method createReply() of the class ACLMessage.
Skilled programmers might find useful, instead of extending this class and overriding some
of its methods, registering application-specific Behaviours as handler of the states of the protocol.
The methods registerPrepare... allow to do that. A mix of overridden methods and registered
behaviours might often be the best solution.
A set of variables (they are not constants!) is available (..._KEY) that provide the keys to
retrieve the following information from the dataStore of this Behaviour:
- getDataStore().get(REQUEST_KEY) returns the ACLMessage object received by the initiator
- getDataStore().get(RESPONSE_KEY) returns the first ACLMessage object sent to the
initiator
- getDataStore().get(RESULT_NOTIFICATION_KEY) returns the second ACLMessage object
sent to the initiator
Remind that if a Behaviour is registered as handler of the Prepare... states, it is
responsibility of this behaviour to put into the datastore (bound at the right key) the proper
ACLMessage object to be sent by this responder.
3.5.1.3 Example of using these two generic classes for implementing a specific FIPA
protocol
The two classes described above can easily be used for implementing the interaction
protocols defined by FIPA.
The following example shows how to add a FIPA-Request initiator behaviour:
ACLMessage request = new ACLMessage(ACLMessage.REQUEST);
request.setProtocol(FIPAProtocolNames.FIPA_REQUEST);
request.addReceiver(new AID(“receiver”, AID.ISLOCALNAME));
myAgent.addBehaviour( new AchieveREInitiator(myAgent, request) {
protected void handleInform(ACLMessage inform) {
System.out.println(“Protocol finished. Rational Effect achieved.
Received the following message: ”+inform);
}
});
The following example shows instead how to add a FIPA-Request responder behaviour:
MessageTemplate mt =
AchieveREResponder.createMessageTemplate(FIPAProtocolNames.FIPAREQUEST);
myAgent.addBehaviour( new AchieveREResponder(myAgent, mt) {
protected ACLMessage prepareResultNotification(ACLMessage request, ACLMessage
response) {
System.out.println(“Responder has received the following message: ” +
request);
ACLMessage informDone = request.createReply();
informDone.setPerformative(ACLMessage.INFORM);
37
JADE Programmer’s GUIDE
informDone.setContent(“inform done”);
return informDone;
}
});
3.5.2 FIPA-Contract-Net
This interaction protocol allows the Initiator to send a Call for Proposal to a set of
responders, evaluate their proposals and then accept the preferred one (or even reject all of them).
The interaction protocol is deeply described in the FIPA specifications while the following figure
is just a simplification for the programmer.
cfp
action
preconditions1
reject-proposal accept-proposal
reason proposal
3.5.2.1 FipaContractNetInitiatorBehaviour
This abstract behaviour implements the fipa-contract-net interaction protocol from the point
of view of the agent initiating the protocol, that is the agent that sends the cfp (call for proposal)
message.
The constructor of this behaviour takes 3 parameters
public FipaContractNetInitiatorBehaviour(Agent a, ACLMessage msg, List
responders)
the calling agent, the CFP message to be sent and the group of agents to which the message
should be sent. In fact, the protocol is implemented 1:N with one initiator and several responders.
The programmer should implement the two methods handleProposeMessages and
handleFinalMessages to handle the two states of the protocol from the point of view of the
initiator.
38
JADE Programmer’s GUIDE
Under some circumstances, for instance when using the SL-0 content language, the content
of the CFP message needs to be adapted to each receiver. For this reason, the method
createcfpcontent is called before sending each message. The default implementation
returns exactly the same content independently of the receiver; the programmer might also wish
to override this default implementation.
The behaviour takes also care of handling timeouts in waiting for the answers. The timeout is
got from the reply-by field of the ACLMessage passed in the constructor; if it was not set,
then an infinite timeout is used. If the timeout expires without having received any answer, the
method handleXXXMessages is executed by passing an empty vector of messages. Of course,
late answers that arrive after the timeout expires are not consumed and remain in the private
queue of incoming ACLmessages. Because this queue has a maximum size, these messages will
be removed after the queue becomes full.
3.5.3 FipaContractNetResponderBehaviour
This abstract behaviour class implements the fipa-contract-net interaction protocol from the
point of view of a responder to a call for proposal (cfp) message.
The programmer should extend this class by implementing the handleXXX methods that
are called to handle the types of messages that can be received in this protocol.
39
JADE Programmer’s GUIDE
3.6.1 Rationale
It is clear however that if on the one hand information handling inside an agent is eased, on
the other hand each time agent A sends a piece of information I to agent B,
1) A needs to convert his internal representation of I into the corresponding ACL content
expression representation and B needs to perform the opposite conversion.
2) Moreover B should also check that I complies with the rules (i.e. for instance that the age of
Giovanni is actually an integer value) of the ontology by means of which both A and B
ascribe a proper meaning to I.
40
JADE Programmer’s GUIDE
The support for application-defined ontology and content languages provided by JADE is
designed to support agent internal representation of information as Java objects, as described
above, by minimizing the developer effort in performing the above conversion and check
operations.
Each time an information has to be inserted into or extracted from an ACL content
expression the JADE framework automatically performs the pipeline depicted in figure.
Content
Language Ontology
Codec
Parser Parser
Encoder Encoder
First an appropriate content language codec object is able to parse a content expression and
to convert it into a t-uple 7 of Frame8 objects.
An appropriate ontology object is then able to check whether a Frame object is consistent
with one of the schemas defining the roles9 included in the ontology and, in this case, to convert
7
A content expression can include more than one entity in the domain of discourse. E.g. the content of a REFUSE ACL
message is a t-uple with 2 elements: an action expression and the reason why the agent sending the message refuses to
accomplish that action.
8
The JADE Framework uses an internal representation of information based on the class Frame. A Frame object has
a name and a set of slots each one being characterized by a name, a position (within the frame) and an untyped value.
Whatever entity in the domain of discourse (i.e. whatever information) can be represented as a Frame object.
9
An ontology basically includes all the concepts, predicates and actions, collectively called roles, that are meaningful
for the agents sharing this ontology . For instance the concepts Company and Person, the predicate WorfsFor and the
action Engage can be roles in an ontology dealing with employees. All elements in the domain of discourse (e.g. the
person Giovanni) are instances of one of the roles composing the ontology.
41
JADE Programmer’s GUIDE
the Frame object into a properly initialized instance of the application-specific class (e.g. the
Person class mentioned above) representing the matched role.
The opposite pipeline allows to convert a sentence belonging to the domain of discourse, and
represented as a Java object, into the appropriate content language and encoding.
The JADE framework hides the stages of this pipeline to the programmer who just needs to
call the following methods of the Agent class.
As already mentioned the content of an ACL message is in general a t-uple of entity inn the
domain of discourse. In Java this is represented as a List.
The programmer however has to create and add to the resources of the agent the codec and
ontology objects mentioned above as described in the followings.
Each content language codec in JADE must implement the interface jade.lang.Codec
and, in particular, the two methods decode() and encode() to respectively
• parse the content in an ACL message and convert it into a List of Frame objects.
• encode the content from a List of Frame objects into the content language syntax and
encoding.
The Frame class is a neutral type (i.e. it does not distinguish between concepts, actions and
predicates), that has been designed in order to allow accessing its slots both by name (e.g. (divide
:dividend 10 :divisor 2)) and by position (e.g. (divide 10 2)).
This Codec object must then be added to the resources of each agent, which wishes to use
that language, by using the method registerLanguage() available in the Agent class.
By means of this operation a Codec object is associated to a content language name. When
the fillContent() and extractContent() methods are called the Codec object associated
to the content language indicated in the :language slot of the ACL message will be used to
perform the conversion pipeline described in previous chapter.
Notice that JADE already includes the Codec for SL-0 (one of the standard content
languages defined by FIPA) that is the class jade.lang.sl.SL0Codec. For an agent using
SL0 it will be therefore sufficient to insert the instruction
registerLanguage(“SL0”, new SL0Codec());
42
JADE Programmer’s GUIDE
43
JADE Programmer’s GUIDE
44
JADE Programmer’s GUIDE
Code for adding the Address, Company and Engage roles to the ontology.
myOnto.addRole(
“Address”,
new SlotDescriptor[]{
new SlotDescriptor(“street”, Ontology.PRIMITIVE_SLOT,
Ontology.STRING_TYPE, Ontology.M),
new SlotDescriptor(“number”, Ontology.PRIMITIVE_SLOT,
Ontology.INTEGER_TYPE,Ontology.M)
new SlotDescriptor(“city”, Ontology.PRIMITIVE_SLOT,
Ontology.SRING_TYPE,Ontology. M)
},
Address.class
);
myOnto.addRole(
“Company”,
new SlotDescriptor[]{
new SlotDescriptor(“name”, Ontology.PRIMITIVE_SLOT,
Ontology.STRING_TYPE, Ontology.M),
new SlotDescriptor(“address”, Ontology.FRAME_SLOT,
“Address” ,Ontology.O)
},
Company.class
);
myOnto.addRole(
“engage”,
new SlotDescriptor[]{
new SlotDescriptor(Ontology.FRAME_SLOT, “Person”
Ontology.M),
new SlotDescriptor(Ontology.FRAME_SLOT, “Company”,
Ontology.M)
},
Engage.class;
45
JADE Programmer’s GUIDE
);
The ontology object must finally be added to the resources of each agent wishing to use it,
by using the method registerOntology() available in the Agent class.
By means of this operation an Ontology object is associated to a name. When the
fillContent() and extractContent() methods are called the Ontology object
associated to the content language indicated in the :ontology slot of the ACL message will be
used to perform the conversion pipeline described in section 3.6.2.
2) For each slot in the represented role named XXX, of category Ontology.SET_SLOT or
Ontology.SEQUENCE_SLOT and with elements of type T, the class must have two accessible
methods with the following signature:
public Iterator getAllXXX();
public void addXXX(T t);
3) For each unnamed slot use “_p” (being p the position of the slot) instead of the slot name
for the get and set methods (see the Engage class mentioned above for an example).
4) In all previous cases the type T cannot be a primitive type such as int, float or
boolean. Use Integer, Float, Boolean …. instead.
3.6.6 Discovering the ontological role of a Java object representing an entity in the domain of
discourse
As already mentioned, when an ACL message is received, provided that the proper ontology
and content language codec objects has been previously registered, the content of the ACL
message can be easily converted into a list of proper Java objects by means of the
extractContent() method .
In general however the receiving agent does not know a-priori the role of each Java object in
the list. In order to discover it the ontology object must be used as described in the example below
refering to the first object in the list.
46
JADE Programmer’s GUIDE
The lookupOntology() is a method of the Agent class that returns the ontology object
previously associated to a given name by calling the registerOntology() method.
Once discovered the role of the entity represented by an object it will be possible to cast it to
the application specific cla ss representing that role.
Having registered a content language codec and an ontology with the agent, it is possible to
exploit the automatic support of the JADE framework to set and get the content of an ACL
message. The Agent class provides two methods for this purpose: extractContent() and
fillContent() to implement parsing and encoding operations on the message content,
respectively.
The first method extracts the content from an ACL message and returns a List of Java
objects (one object for each element of the t-uple in the content) by calling the appropriate
content language Codec (according to the value of the :language parameter of the ACL
message) and the appropriate Ontology (according to the value of the :ontology parameter of the
ACL message).
The second method, instead, makes the opposite operation, that is it fills in the content of an
ACL message by interpreting a List of Java objects with the appropriate Ontology and
content language Codec, as specified by the values of the :ontology and the :language parameter
of the ACL message.
Refer to the javadoc documentation for a detailed description of the usage of these two
methods.
3.7 Support for Agent Mobility
Using JADE, application developers can build mobile agents, which are able to migrate or
copy themselves across multiple network hosts. In this version of JADE, only intra-platform
mobility is supported, that is a JADE mobile agent can navigate across different agent containers
but it is confined to a single JADE platform.
Moving or cloning is considered a state transition in the life cycle of the agent. Just like all
the other life cycle operation, agent motion or cloning can be initiated either by the agent itself or
by the AMS. The Agent class provides a suitable API, whereas the AMS agent can be accessed
via FIPA ACL as usual.
Mobile agents need to be location aware in order to decide when and where to move.
Therefore, JADE provides a proprietary ontology, named jade-mobility-ontology, holding the
necessary concepts and actions.
This ontology is contained within the jade.domain.MobilityOntology class, and it
is an example of the new application-defined ontology support.
47
JADE Programmer’s GUIDE
The two public methods doMove() and doClone() of the Agent class allow a JADE
agent to migrate elsewhere or to spawn a remote copy of itself under a different name. Method
doMove() takes a jade.core.Location as its single parameter, which represents the
intended destination for the migrating agent. Method doClone() also takes a
jade.core.Location as parameter, but adds a String containing the name of the new
agent that will be created as a copy of the current one.
Looking at the documentation, one finds that jade.core.Location is an abstract
interface, so application agents are not allowed to create their own locations. Instead, they must
ask the AMS for the list of the available locations and choose one. Alternatively, a JADE agent
can also request the AMS to tell where (at which location) another agent lives.
Moving an agent involves sending its code and state through a network channel, so user
defined mobile agents must manage the serialization and unserialization process. Some among the
various resources used by the mobile agent will be moved along, while some others will be
disconnected before moving and reconnected at the destination (this is the same distinction
between transient and non-transient fields used in the Java Serialization API). JADE
makes available a couple of matching methods in the Agent class for resource management.
For agent migration, the beforeMove() method is called at the starting location just
before sending the agent through the network (with the scheduler of behaviours already stopped),
whereas the afterMove() method is called at the destination location as soon as the agent has
arrived and its identity is in place (but the scheduler has not restarted yet).
For agent cloning, JADE supports a corresponding method pair, the beforeClone() and
afterClone() methods, called in the same fashion as the beforeMove() and
afterMove() above. The four methods above are all protected methods of the Agent
class, defined as empty placeholders. User defined mobile agents will override the four methods
as needed.
The jade-mobility-ontology ontology contains all the concepts and actions needed to support
agent mobility. JADE provides the class jade.domain.MobilityOntology, working as a
Singleton and giving access to a single, shared instance of the JADE mobility ontology through
the instance() method.
The ontology contains ten frames (six concepts and four actions), and a suitable inner class is
associated with each frame using a RoleEntityFactory object (see Section 3.6.4 for details).
The following list shows all the frames and their structure.
q Mobile-agent-description; describes a mobile agent going somewhere. It is
represented by the MobilityOntology.MobileAgentDescription inner class.
Slot Name Slot Type Mandatory/Optional
name AID Mandatory
destination Location Mandatory
mobile-agent-
agent-profile Optional
profile
agent-version String Optional
signature String Optional
48
JADE Programmer’s GUIDE
49
JADE Programmer’s GUIDE
q where-is-agent; the action of requesting the location where a given agent is running. It
is represented by the MobilityOntology.WhereIsAgent inner class.
This action has a single, unnamed slot of type AID. The argument is mandatory.
The JADE AMS has some extensions that support the agent mobility, and it is capable of
performing all the four actions present in the jade-mobility-ontology. Every mobility related
action can be requested to the AMS through a FIPA-request protocol, with jade-mobility -ontology
as ontology value and FIPA-SL0 as language value.
The move-agent action takes a mobile-agent-description as its parameter. This
action moves the agent identified by the name and address slots of the mobile-agent-
description to the location present in the destination slot.
For example, if an agent wants to move the agent Peter to the location called Front-End, it must
send to the AMS the following ACL request message:
(REQUEST
:sender (agent-identifier :name RMA@Zadig:1099/JADE)
:receiver (set (agent-identifier :name ams@Zadig:1099/JADE ))
:content (
(action (agent-identifier :name ams@Zadig:1099/JADE)
(move-agent (mobile-agent-description
50
JADE Programmer’s GUIDE
The above message was captured using the JADE sniffer, using the MobileAgent example and the
RMA support for moving and cloning agents.
Using JADE ontology support, an agent can easily add mobility to its capabilities, without having
to compose ACL messages by hand.
First of all, the agent has to create a new MobilityOntology.MoveAction object, fill its
argument with a suitable MobilityOntology.MobileAgentDescription object, filled
in turn with the name and address of the agent to move (either itself or another mobile agent) and
with the MobilityOntology.Location object for the destination. Then, a single call to the
Agent.fillContent() method can turn the MoveAction Java object into a String and
write it into the content slot of a suitable request ACL message.
The clone-agent action works in the same way, but has an additional String argument to
hold the name of the new agent resulting from the cloning process.
The where-is-agent action has a single AID argument, holding the identifier of the agent to
locate. This action has a result, namely the location for the agent, that is put into the content
slot of the inform ACL message that successfully closes the protocol.
For example, the request message to ask for the location where the agent Peter resides would
be:
(REQUEST
:sender (agent-identifier :name da1@Zadig:1099/JADE)
:receiver (set (agent-identifier :name ams@Zadig:1099/JADE))
:content (( action
(agent-identifier :name ams@Zadig:1099/JADE)
(where-is-agent (agent-identifier :name Peter@Zadig:1099/JADE))
))
:language FIPA-SL0
:ontology jade-mobility-ontology
:protocol fipa-request
)
51
JADE Programmer’s GUIDE
The resulting Location would be contained within an inform message like the following:
(INFORM
:sender (agent-identifier :name ams@Zadig:1099/JADE)
:receiver (set (agent-identifier :name da1@Zadig:1099/JADE))
:content ((result
(action
(agent-identifier :name ams@Zadig:1099/JADE)
(where-is-agent (agent-identifier :name Peter@Zadig:1099/JADE))
)
(set (location
:name Container-1
:protocol JADE-IPMT
:address Zadig:1099/JADE.Container-1
))
))
:reply-with da1@Zadig:1099/JADE976984777740
:language FIPA-SL0
:ontology jade-mobility-ontology
:protocol fipa-request
)
The query-platform-locations action takes no arguments, but its result is a set of all the
Location objects available in the current JADE platform. The message for this action is very
simple:
( REQUEST
:sender (agent-identifier :name Johnny)
:receiver (set (Agent-Identifier :name AMS))
:content (( action (agent-identifier :name AMS)
( query-platform-locations ) ))
:language FIPA-SL0
:ontology jade-mobility-ontology
:protocol fipa-request
)
If the current platform had three containers, the AMS would send back the following inform
message:
( INFORM
:sender (Agent-Identifier :name AMS)
:receiver (set (Agent-Identifier :name Johnny))
:content (( Result ( action (agent-identifier :name AMS)
( query-platform-locations ) )
(set (Location
:name Container-1
:transport-protocol JADE-IPMT
52
JADE Programmer’s GUIDE
:transport-address IOR:000….Container-1 )
(Location
:name Container-2
:protocol JADE-IPMT
:address IOR:000….Container-2 )
(Location
:name Container-3
:protocol JADE-IPMT
:address IOR:000….Container-3 )
)))
:language FIPA-SL0
:ontology jade-mobility-ontology
:protocol fipa-request
)
10
see also the Administrator’s Guide for this functionality
53
JADE Programmer’s GUIDE
import jade.core.Runtime;
import jade.core.Profile;
import jade.core.ProfileImpl;
import jade.wrapper.*;
...
// Get a hold on JADE runtime
Runtime rt = Runtime.instance();
// Create a default profile
Profile p = new ProfileImpl();
// Create a new non-main container, connecting to the default
// main container (i.e. on this host, port 1099)
AgentContainer ac = rt.createAgentContainer(p);
// Create a new agent, a DummyAgent
// and pass it a reference to an Object
Object reference = new Object();
Object args[] = new Object[1];
args[0]=reference;
Agent dummy = ac.createAgent("inProcess",
"jade.tools.DummyAgent.DummyAgent", reference);
// Fire up the agent
dummy.start();
...
Notice that this mechanism allows several different configurations for a JADE platform,
such as a complete in-process platform composed of several containers on the same JVM, a
platform partly in-process (i.e. containers launched by an external Java application) and partly
out-of-process (i.e. containers launched from the command line).
4 A S A M P L E A G E N T S Y S T EM
We are presenting an example of an agent system explaining how to use the features
available in JADE framework. In particular we will show the possibility of organising the
behaviour of a single agent in different sub-behaviours and how the message exchange among
agents takes place.
The agent system, in the example, is made of two agents communicating through FIPA
request protocol.
This section is still to do. Please refer to JADE examples present in src/examples directory.
Refer also to the README file in src/examples directory to get some explanations of each
example program.
54
JADE Programmer’s GUIDE
5 A P P E N D I X A : C O N T E N T-L A N G U A G E I N D E P E N D E N T A P I
F E D E R I C O B E R G E N T I ( UN I V E R S I T Y O F P A R M A )
Application-specific ontologies describe the elements that agents use to create the content of
messages, e.g., application-specific predicates and actions. The package jade.content (and
its sub-packages) allows to create application-specific ontologies and to use them independently
of the adopted content language: the code that implements the ontology and the code that sends
and receives messages do not depend on the content language. The following is a description of
such a package that uses src/example/content as a running example.
5.1 Creating an Application-Specific Ontology
An ontology defines a vocabulary and a set of relationships between the elements of the
vocabulary. The relationships can be:
1) structural, e.g., the predicate fatherOf is defined over two parameters, a father and a
set of children because we want to use it to say fatherOf(John, (Mary,
Lisa));
2) semantic, e.g., a concept belonging to the class Man also belongs to the class Person.
An application-specific ontology is implemented through one object of class
FullOntology and it is characterized by:
1) one name;
2) one base ontology at most, i.e., an ontology that it extends;
3) a vocabulary;
4) a set of element schemata.
The following code implements the People ontology: it defines a constant for each element
(concept, action, predicate , etc.) that we want to include in the vocabulary.
// Predicates
public static final String FATHER_OF = "FATHER_OF";
public static final String MOTHER_OF = "MOTHER_OF";
55
JADE Programmer’s GUIDE
// Actions
public static final String MARRY = "MARRY";
// Arguments in actions
public static final String HUSBAND = "HUSBAND";
public static final String WIFE = "WIFE";
The constructor calls super() to assign a name to the ontology and to declare that it
extends the ACLOntology. People ontology, and reasonably all ontologies, extends
jade.content.onto.ACLOntology because we want to use in our messages the elements
of such an ontology, e.g., variables and the Done predicate. If you do not need ACL concepts,
you can extend jade.content.onto.BasicOntology in order to have only basic types,
i.e., lists, strings and numbers. ACLOntology extends the BasicOntology.
The definition of the ontology in the example is not complete, we have to substitute dots
with the definition of the element schemata. Element schemata are objects describing the
structure of concepts, actions, predicate, etc. that we allow in our messages. In the People
ontology they describe what a person is, what an address is, what a father is, etc. The following is
the element schema for the concept of Person. This schema states that a Person is
characterized by a name and an address:
56
JADE Programmer’s GUIDE
PERSON, NAME and ADDRESS are string defined in the vocabulary and addressSchema
has been defined before (not shown). Schemata that describe concepts support inheritance11 . You
can define the concept of Man as a refinement of the concept of Person:
Element schema describe, in some way, the structure of a class of objects and therefore they
can be associated with Java classes. This maps elements of the ontology that comply with a
schema with Java objects of that class. The following is a class that might be associated with the
Person concept:
The association between the class and the schema is performed when registering the concept
in the ontology using the following statement:
11
Only concept schemata support inheritance, all other schemata, e.g., predicate schemata, action schemata, etc do not .
57
JADE Programmer’s GUIDE
Associating classes with schemata is not mandatory, but helps because it support easier APIs,
as shown later. In order to associate a class with a schema, the class must:
1) extend a class in jade.content, e.g., Person extends Concept because we want to
associate it with a concept schema;
2) provide public get/set methods for each attribute (you can use basic types like int or
boolean);
3) provide a constructor with no parameters, i.e., the default contructor.
Defining actions, predicates, etc. is just like defining concepts. Figure 8 shows the classes
that corresponds to the elements we can use in our ontologies.
ContentElement
fatherOfSchema.add(FATHER, manSchema);
fatherOfSchema.add(CHILDREN, childrenSchema);
58
JADE Programmer’s GUIDE
First we define a new schema to describe the set of children. Then we define the predicate
schema for fatherOf by introducing two roles: the father and the children. Finally we
register fatherOfSchema with the ontology associating it with the following class:
Note that we use jade.util.leap.List where the schema declares an aggregate, i.e.,
the BasicOntology associates any aggregate with List.
5.2 Sending and Receiving Messages
We restrict the description of ontologies to the features that support inter-agent communication.
Other models, e.g., DAML+OIL, use description logics to provide richer description that support
reasoning about concepts, predicates, actions, etc. In order to send and receive messages, we need
(i) an ontology to provides the vocabulary and (ii) a codec (coder/encoder) to handle the syntax of
the content language. These are registered with JADE through the content manager. The content
manager provides methods for encoding and decoding the content of messages exploiting the
registered ontologies and codecs. The following code registers the People ontology with the
content manager and it also registers a codec called jade.content.lang.j.JCodec.
getContentManager().registerOntology(PeopleOntology.getInstance());
getContentManager().registerLanguage(new JCodec());
The JCodec uses Java serialization to encode and decode the content of messages; the
jade.content.lang.leap.LEAPCodec provides CLDC-compliant encoding and
decoding. The choice of the codec is not so relevant because the rest of the API is content-
59
JADE Programmer’s GUIDE
language independent. The registration of ontologies and codecs is typically provided in the
setup() method of the agent.
In order to send a message, we have two possibilities: through concrete objects or through
abstract descriptors. The first approach is the easiest to use, but it is limited:
1) we create our content in terms of objects that belongs to the classes that we associated
with schemas in the ontology, e.g., Person and FatherOf classes;
2) we use fillContent() in ContentManager to fill the content of the message.
The following code inform an agent that “John lives in London and his only child Bill lives in
Paris”:
fatherOf.setChildren(children);
getContentManager().fillContent(message, fatherOf);
Using concrete objects like john and fatherOf is the easiest approach to filling the content of
a message but it is not fully expressive. For examples, consider the following problem: we want
to query an agent for the names of John’s children. We need to send a query-ref message with the
following content: (iota ?X fatherOf(john, ?X)), where ?X is a variable that the
receiver agent uses to come to know what we want to know. Such a content is an IRE, i.e., an
60
JADE Programmer’s GUIDE
expression that identifies an object. The problem is that we cannot set the children attribute of
a FatherOf object to a variable because such an attribute is a List. A number of techniques
are available to solve this problem exploiting inheritance, but they all require that you implement
many classes for describing the ontology. In order to solve this problem using only the classes we
already implemented for the ontology, we introduced abstract descriptors. An abstract descriptor
is an object that describes an instantiation of a schema, e.g., the following is the abstract
descriptor that describes the concept “John”:
An abstract descriptor is created with the name of a class (MAN in this example). Then, we
can set and get values on the descriptor using the names of the attributes. The structure of the
descriptor, i.e., what the available attributes are and what are their values, must be coherent with
the schema that the ontology associates with the name of the class (MAN in this example). The
following is the code for performing the query about the names of John’s children:
getContentManager().fillContent(message, absIRE);
The procedure for receiving a message is dual to that of sending a message. We can use both
concrete objects and abstract descriptors, and if we try to create a concrete object from a message
containing a variable, the content manager throws an UngroundedException. The following
code handles inform messages:
61
JADE Programmer’s GUIDE
62
JADE Programmer’s GUIDE
The Agent Management System (AMS) is the agent who exerts supervisory control over
access to and use of the Agent Platform. Only one AMS will exist in a single platform. The AMS
provides white-page and life-cycle service, maintaining a directory of agent identifiers (AID) and
agent state. Each agent must register with an AMS in order to get a valid AID.
The Directory Facilitator (DF) is the agent who provides the default yellow page service in
the platform.
The Message Transport System, also called Agent Communication Channel (ACC), is the
software component controlling all the exchange of messages within the platform, including
messages to/from remote platforms.
JADE fully complies with this reference architecture and when a JADE platform is launched,
the AMS and DF are immediately created and the ACC module is set to allow message
communication. The agent platform can be split on several hosts. Only one Java application, and
therefore only one Java Virtual Machine (JVM), is executed on each hos t. Each JVM is a basic
container of agents that provides a complete run time environment for agent execution and allows
several agents to concurrently execute on the same host. The main-container, or front-end, is the
agent container where the AMS and DF lives and where the RMI registry, that is used internally
by JADE, is created. The other agent containers, instead, connect to the main container and
provide a complete run-time environment for the execution of any set of JADE agents.
7
JADE Programmer’s GUIDE
Application Agent
Application Agent
Application Agent
Application Agent
Application Agent
Application Agent
Application Agent
Application Agent
Application Agent
According to the FIPA specifications, DF and AMS agents communicate by using the
FIPA-SL0 content language, the fipa-agent-management ontology, and the fipa-
request interaction protocol. JADE provides compliant implementations for all these
components:
- the SL-0 content language is implemented by the class jade.lang.sl.SL0Codec.
Automatic capability of using this language can be added to any agent by using the method
Agent.registerLanguage(SL0Codec.NAME, new SL0Codec());
- concepts of the ontology (apart from Agent Identifier, implemented by jade.core.AID)
are implemented by classes in the jade.domain.FIPAAgentManagement package.
The FIPAAgentManagementOntology class defines the vocabulary with all the
constant symbols of the ontology. Automatic capability of using this ontology can be added
to any agent by using the fillowing code:
Agent.registerOntology(FIPAAgentManagementOntology.NAME,
FIPAAgentManagement Ontology.instance());
- finally, the fipa-request interaction protocol is implemented as ready-to-use behaviours
in the package jade.proto.
8
JADE and Ontology
JADE provides extensive support for ontologies. The agents df and ams communicate using standard
FIPA ontolgies. JADE provides support for user defined ontolgies as well.
Up to JADE 2.3, JADE support for user ontolgies is in the package jade.onto and its subpackages.
Starting with version 2.4 a new set of packages, java.content and its subpackages, have made
implementing user ontolgies easier. In cps720 we will look at parts of the jade.content packages. The
development of ontolgies is a major topic which could easily provide material for a whole course on its
own. In cps720 we just look at the tip of this iceberg.
This appendix describes a simple ontology example to illustrate the jade.ontology packages. There are
three files for this example,
● PeopleOntology.java
● Sender.java
● Receiver.java
2 What is in an ontology?
The Artificial-Intelligence literature contains many definitions of an ontology; many of these contradict
one another. For the purposes of this guide an ontology is a formal explicit description of concepts in a
domain of discourse (classes (sometimes called concepts)), properties of each concept describing
various features and attributes of the concept (slots (sometimes called roles or properties)), and
restrictions on slots (facets (sometimes called role restrictions)). An ontology together with a set of
individual instances of classes constitutes a knowledge base. In reality, there is a fine line where the
ontology ends and the knowledge base begins. Classes are the focus of most ontologies. Classes
describe concepts in the domain. For example, a class of wines represents all wines. Specific wines are
instances of this class. The Bordeaux wine in the glass in front of you while you read this document is an
instance of the class of Bordeaux wines. A class can have subclasses that represent concepts that are
more specific than the superclass. For example, we can divide the class of all wines into red, white, and
rosé wines.
Notes/
Beware of confusion with the word class as used in ontology and OO.
In JADE ontologies are, of course, implemented in classes since Java is an OOPS. In the java.content
packages the idea of a schema is intorduced which corresponds more closely to the ontology concept of
class.
5 A P P E N D I X A : C O N T E N T- L A N G U A G E I N D E P E N D E N T A P I
F E D E R I C O B E R G E N T I ( UN I V E R S I T Y O F P A R M A )
Application-specific ontologies describe the elements that agents use to create the content of
messages, e.g., application -specific predicates and actions. The package jade.content (and
its sub-packages) allows to create application-specific ontologies and to use them independently
of the adopted content language: the code that implements the ontology and the code that sends
and receives messages do not depend on the content language. The following is a description of
such a package that uses src/example/content as a running example.
5. 1 C reating an Application-Specific Ontol ogy
An ontology defines a vocabulary and a set of relationships between the elements of the
vocabulary. The relationships can be:
1) structural, e.g., the predicate fatherOf is defined over two parameters, a father and a
set of children because we want to use it to say fatherOf(John, (Mary,
Lisa));
2) semantic, e.g., a concept belonging to the class Man also belongs to the class Person.
An application-specific ontology is implemented through one object of class
FullOntology and it is characterized by:
1) one name;
2) one base ontology at most, i.e., an ontology that it extends;
3) a vocabulary;
4) a set of element schemata.
The following code implements the People ontology: it defines a constant for each element
(concept, action, predicate , etc.) that we want to include in the vocabulary.
// Predicates
public static final String FATHER_OF = "FATHER_OF";
public static final String MOTHER_OF = "MOTHER_OF";
55
JADE Programmer’s GUIDE
// Actions
public static final String MARRY = "MARRY";
// Arguments in actions
public static final String HUSBAND = "HUSBAND";
public static final String WIFE = "WIFE";
The constructor calls super() to assign a name to the ontology and to declare that it
extends the ACLOntology. People ontology, and reasonably all ontologies, extends
jade.content.onto.ACLOntology because we want to use in our messages the elements
of such an ontology, e.g., variables and the Done predicate. If you do not need ACL concepts,
you can extend jade.content.onto.BasicOntology in order to have only basic types,
i.e., lists, strings and numbers. ACLOntology extends the BasicOntology.
The definition of the ontology in the example is not complete, we have to substitute dots
with the definition of the element schemata. Element schemata are objects describing the
structure of concepts, actions, predicate, etc. that we allow in our messages. In the People
ontology they describe what a person is, what an address is, what a father is, etc. The following is
the element schema for the concept of Person. This schema states that a Person is
characterized by a name and an address:
56
JADE Programmer’s GUIDE
PERSON, NAME and ADDRESS are string defined in the vocabulary and addressSchema
has been defined before (not shown). Schemata that describe concepts support inheritance11 . You
can define the concept of Man as a refinement of the concept of Person:
Element schema describe, in some way, the structure of a class of objects and therefore they
can be associated with Java classes. This maps elements of the ontology that comply with a
schema with Java objects of that class. The following is a class that might be associated with the
Person concept:
The association between the class and the schema is performed when registering the concept
in the ontology using the following statement:
11
Only concept schemata support inheritance, all other schemata, e.g., predicate schemata, action schemata, etc do not .
57
JADE Programmer’s GUIDE
Associating classes with schemata is not mandatory, but helps because it support easier APIs,
as shown later. In order to associate a class with a schema, the class must:
1) extend a class in jade.content, e.g., Person extends Concept because we want to
associate it with a concept schema;
2) provide public get/set methods for each attribute (you can use basic types like int or
boolean);
3) provide a constructor with no parameters, i.e., the default contructor.
Defining actions, predicates, etc. is just like defining concepts. Figure 8 shows the classes
that corresponds to the elements we can use in our ontologies.
ContentElement
fatherOfSchema.add(FATHER, manSchema);
fatherOfSchema.add(CHILDREN, childrenSchema);
58
JADE Programmer’s GUIDE
First we define a new schema to describe the set of children. Then we define the predicate
schema for fatherOf by introducing two roles: the father and the children. Finally we
register fatherOfSchema with the ontology associating it with the following class:
Note that we use jade.util.leap.List where the schema declares an aggregate, i.e.,
the BasicOntology associates any aggregate with List.
5.2 Sending and Receiving Messages
We restrict the description of ontologies to the features that support inter-agent communication.
Other models, e.g., DAML+OIL, use description logics to provide richer description that support
reasoning about concepts, predicates, actions, etc. In order to send and receive messages, we need
(i) an ontology to provides the vocabulary and (ii) a codec (coder/encoder) to handle the syntax of
the content language. These are registered with JADE through the content manager. The content
manager provides methods for encoding and decoding the content of messages exploiting the
registered ontologies and codecs. The following code registers the People ontology with the
content manager and it also registers a codec called jade.content.lang.j.JCodec.
getContentManager().registerOntology(PeopleOntology.getInstance());
getContentManager().registerLanguage(new JCodec());
The JCodec uses Java serialization to encode and decode the content of messages; the
jade.content.lang.leap.LEAPCodec provides CLDC-compliant encoding and
decoding. The choice of the codec is not so relevant because the rest of the API is content-
59
JADE Programmer’s GUIDE
language independent. The registration of ontologies and codecs is typically provided in the
setup() method of the agent.
In order to send a message, we have two possibilities: through concrete objects or through
abstract descriptors. The first approach is the easiest to use, but it is limited:
1) we create our content in terms of objects that belongs to the classes that we associated
with schemas in the ontology, e.g., Person and FatherOf classes;
2) we use fillContent() in ContentManager to fill the content of the message.
The following code inform an agent that “John lives in London and his only child Bill lives in
Paris”:
fatherOf.setChildren(children);
getContentManager().fillContent(message, fatherOf);
Using concrete objects like john and fatherOf is the easiest approach to filling the content of
a message but it is not fully expressive. For examples, consider the following problem: we want
to query an agent for the names of John’s children. We need to send a query-ref message with the
following content: (iota ?X fatherOf(john, ?X)), where ?X is a variable that the
receiver agent uses to come to know what we want to know. Such a content is an IRE, i.e., an
60
JADE Programmer’s GUIDE
expression that identifies an object. The problem is that we cannot set the children attribute of
a FatherOf object to a variable because such an attribute is a List. A number of techniques
are available to solve this problem exploiting inheritance, but they all require that you implement
many classes for describing the ontology. In order to solve this problem using only the classes we
already implemented for the ontology, we introduced abstract descriptors. An abstract descriptor
is an object that describes an instantiation of a schema, e.g., the following is the abstract
descriptor that describes the concept “John”:
An abstract descriptor is created with the name of a class (MAN in this example). Then, we
can set and get values on the descriptor using the names of the attributes. The structure of the
descriptor, i.e., what the available attributes are and what are their values, must be coherent with
the schema that the ontology associates with the name of the class (MAN in this example). The
following is the code for performing the query about the names of John’s children:
getContentManager().fillContent(message, absIRE);
The procedure for receiving a message is dual to that of sending a message. We can use both
concrete objects and abstract descriptors, and if we try to create a concrete object from a message
containing a variable, the content manager throws an UngroundedException. The following
code handles inform messages:
61
JADE Programmer’s GUIDE
62
JADE People Ontology
A JADE Ontology
This ontology is part of the JADE exampe using the jade.content packages. It goes with Sender.java and Receiver.java. It is
described in appendix A of the JADE Programmer's guide.
PeopleOntology.java (plain text)
/*****************************************************************
JADE - Java Agent DEvelopment Framework is a framework to develop
multi-agent systems in compliance with the FIPA specifications.
Copyright (C) 2000 CSELT S.p.A.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*****************************************************************/
package examples.content.ontology;
import jade.content.*;
import jade.content.onto.*;
import jade.content.abs.*;
import jade.content.schema.*;
import jade.content.acl.*;
import jade.content.lang.*;
import jade.util.leap.List;
/**
@author Federico Bergenti - Universita` di Parma
*/
// Concepts
// Slots
public static final String NAME = "NAME";
public static final String STREET = "STREET";
public static final String NUMBER = "NUMBER";
public static final String CITY = "CITY";
// Predicates
public static final String FATHER_OF = "FATHER_OF";
public static final String MOTHER_OF = "MOTHER_OF";
// Roles in predicates
public static final String FATHER = "FATHER";
public static final String MOTHER = "MOTHER";
public static final String CHILDREN = "CHILDREN";
// Actions
public static final String MARRY = "MARRY";
// Arguments in actions
public static final String HUSBAND = "HUSBAND";
public static final String WIFE = "WIFE";
try {
PrimitiveSchema stringSchema =
(PrimitiveSchema)getSchema(BasicOntology.STRING);
PrimitiveSchema integerSchema =
(PrimitiveSchema)getSchema(BasicOntology.INTEGER);
add(personSchema, Person.class);
add(manSchema, Man.class);
add(womanSchema, Woman.class);
add(addressSchema, Address.class);
add(fatherOfSchema, FatherOf.class);
add(motherOfSchema, MotherOf.class);
marrySchema.add(WIFE, womanSchema);
add(marrySchema);
} catch(OntologyException oe) { oe.printStackTrace(); }
}
}
● Person.java
● FatherOf.java
● MotherOf.java
● Man.java
● Womna.java
● Marry.java
/*****************************************************************
JADE - Java Agent DEvelopment Framework is a framework to develop
multi-agent systems in compliance with the FIPA specifications.
Copyright (C) 2000 CSELT S.p.A.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*****************************************************************/
package examples.content.ontology;
import jade.content.*;
import jade.content.onto.*;
import jade.content.abs.*;
import jade.content.schema.*;
import jade.content.acl.*;
import jade.content.lang.*;
import jade.util.leap.List;
/**
@author Federico Bergenti - Universita` di Parma
*/
// Concepts
public static final String PERSON = "PERSON";
public static final String MAN = "MAN";
public static final String WOMAN = "WOMAN";
public static final String ADDRESS = "ADDRESS";
// Slots
public static final String NAME = "NAME";
public static final String STREET = "STREET";
public static final String NUMBER = "NUMBER";
public static final String CITY = "CITY";
// Predicates
public static final String FATHER_OF = "FATHER_OF";
public static final String MOTHER_OF = "MOTHER_OF";
// Roles in predicates
public static final String FATHER = "FATHER";
public static final String MOTHER = "MOTHER";
// Actions
public static final String MARRY = "MARRY";
// Arguments in actions
public static final String HUSBAND = "HUSBAND";
public static final String WIFE = "WIFE";
try {
PrimitiveSchema stringSchema =
(PrimitiveSchema)getSchema(BasicOntology.STRING);
PrimitiveSchema integerSchema =
(PrimitiveSchema)getSchema(BasicOntology.INTEGER);
add(personSchema, Person.class);
add(manSchema, Man.class);
add(womanSchema, Woman.class);
add(addressSchema, Address.class);
add(fatherOfSchema, FatherOf.class);
add(motherOfSchema, MotherOf.class);
add(marrySchema);
} catch(OntologyException oe) { oe.printStackTrace(); }
}
}
/*****************************************************************
JADE - Java Agent DEvelopment Framework is a framework to develop
multi-agent systems in compliance with the FIPA specifications.
Copyright (C) 2000 CSELT S.p.A.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*****************************************************************/
package examples.content.ontology;
import jade.content.*;
/**
@author Federico Bergenti - Universita` di Parma
*/
/*****************************************************************
JADE - Java Agent DEvelopment Framework is a framework to develop
multi-agent systems in compliance with the FIPA specifications.
Copyright (C) 2000 CSELT S.p.A.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*****************************************************************/
package examples.content.ontology;
import jade.content.*;
/**
@author Federico Bergenti - Universita` di Parma
*/
/*****************************************************************
JADE - Java Agent DEvelopment Framework is a framework to develop
multi-agent systems in compliance with the FIPA specifications.
Copyright (C) 2000 CSELT S.p.A.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*****************************************************************/
package examples.content.ontology;
import jade.content.*;
import jade.util.leap.List;
/**
@author Federico Bergenti - Universita` di Parma
*/
/*****************************************************************
JADE - Java Agent DEvelopment Framework is a framework to develop
multi-agent systems in compliance with the FIPA specifications.
Copyright (C) 2000 CSELT S.p.A.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*****************************************************************/
package examples.content.ontology;
import jade.content.*;
import jade.util.leap.List;
/**
@author Federico Bergenti - Universita` di Parma
*/
/*****************************************************************
JADE - Java Agent DEvelopment Framework is a framework to develop
multi-agent systems in compliance with the FIPA specifications.
Copyright (C) 2000 CSELT S.p.A.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*****************************************************************/
package examples.content.ontology;
/**
@author Federico Bergenti - Universita` di Parma
*/
/*****************************************************************
JADE - Java Agent DEvelopment Framework is a framework to develop
multi-agent systems in compliance with the FIPA specifications.
Copyright (C) 2000 CSELT S.p.A.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*****************************************************************/
package examples.content.ontology;
/**
@author Federico Bergenti - Universita` di Parma
*/
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*****************************************************************/
package examples.content;
import jade.core.*;
import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;
import jade.util.leap.List;
import jade.util.leap.ArrayList;
import jade.content.*;
import jade.content.abs.*;
import jade.content.onto.*;
import jade.content.lang.*;
import jade.content.lang.leap.*;
import examples.content.ontology.*;
msg.setSender(getAID());
msg.addReceiver(receiver);
msg.setLanguage(codec.getName());
msg.setOntology(ontology.getName());
fatherOf.setChildren(children);
absFatherOf.set(PeopleOntology.CHILDREN, absChildren);
finished = true;
}
}
addBehaviour(new SenderBehaviour(this));
}
}
/*****************************************************************
JADE - Java Agent DEvelopment Framework is a framework to develop
multi-agent systems in compliance with the FIPA specifications.
Copyright (C) 2000 CSELT S.p.A.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*****************************************************************/
package examples.content;
import jade.core.*;
import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;
import jade.content.*;
import jade.content.abs.*;
import jade.content.onto.*;
import jade.content.lang.*;
import jade.content.lang.leap.*;
import examples.content.ontology.*;
PeopleOntology.getInstance();
private FatherOf proposition = null;
if (msg!= null) {
switch(msg.getPerformative()) {
case ACLMessage.INFORM:
ContentElement p = manager.extractContent(msg);
if(p instanceof FatherOf) {
proposition = (FatherOf)p;
System.out.println("[" + getLocalName() + "]
Receiver inform message: information stored.");
System.out.println("Father name " +
proposition.getFather().getName());
break;
}
case ACLMessage.QUERY_REF:
AbsContentElement abs =
manager.extractAbsContent(msg);
if(abs instanceof AbsIRE) {
AbsIRE ire = (AbsIRE)abs;
msg.setSender(getAID());
msg.addReceiver(sender);
msg.setLanguage(codec.getName());
msg.setOntology(ontology.getName());
AbsConcept absFather =
(AbsConcept)ontology.fromObject(proposition.getFather());
manager.fillContent(msg, absEquals);
send(msg);
addBehaviour(new ReceiverBehaviour(this));
}
}
package cps720.assignment3.ontology;
import jade.content.*;
import jade.content.onto.*;
import jade.content.abs.*;
import jade.content.schema.*;
import jade.content.acl.*;
import jade.content.lang.*;
/**
* An ontology for the supply-demand simulation. (See
Producer.java and Consumer.java.)
*
* These ontologies are quite confusing. You have to link the
"schemas" to the classes using
* the static string constants. The different types of schemas are
related to the categories of
* speech acts such as predicateas and actions.
* (see more comments below>)
*
* DG. October, 2001
*/
public class EconOntology extends FullOntology {
// concepts (classes)
// roles (slots)
// predicates
// actions
//
===========================================================================
super(ONTOLOGY_NAME, base);
try {
// include two data types
PrimitiveSchema stringSchema =
(PrimitiveSchema)getSchema(BasicOntology.STRING);
PrimitiveSchema floatSchema =
(PrimitiveSchema)getSchema(BasicOntology.FLOAT);
/*
* Concepts are objects of the ontology (abstract or
concrete). They are the nouns.
*
* The add() method adds slots, sometimes called
facets.
*/
ConceptSchema productSchema = new
ConceptSchema(PRODUCT);
productSchema.add(NAME, stringSchema);
productSchema.add(PRICE, floatSchema);
productSchema.add(UNIT_COST, floatSchema,
ObjectSchema.OPTIONAL);
productSchema.add(QUANTITY, floatSchema,
ObjectSchema.OPTIONAL); //eg tons of wheat
/**
* Each concept in the ontology is associated with a
Java class.
*/
add(productSchema, Product.class);
/*
* Predicates have truth values and express relations
among the concepts.
* The string constants (e.g., PRICE_OF) names the
predicate for the JADE sysetm.
*/
PredicateSchema priceOfSchema = new
PredicateSchema(PRICE_OF);
PredicateSchema quantityOfSchema = new
PredicateSchema(QUANTITY_OF);
/**
* Now add the concepts involved in the predicate. You
need the string name constant for
* each concept, and, a corresponding schema.
*/
priceOfSchema.add(PRODUCT, productSchema);
priceOfSchema.add(PRICE, floatSchema);
quantityOfSchema.add(PRODUCT, productSchema);
quantityOfSchema.add(QUANTITY,floatSchema);
/*
* And associate a Java class.
*/
add(priceOfSchema, PriceOf.class);
add(quantityOfSchema, QuantityOf.class);
/*
* You may also have actions. These are handled in the
same way.
*/
AgentActionSchema buySchema = new
AgentActionSchema(BUY);
buySchema.add(PRODUCT, productSchema);
add(buySchema, Buy.class);
}
}
Product.java
A support file for the EconOntology.
package cps720.assignment3.ontology;
import jade.content.*;
/**
* Part of the EconOntolgy
* setters and getters.
* DG. October, 2001
*/
public class Product implements Concept {
Party Agents
Ontology Example
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*****************************************************************/
package examples.PingAgent;
import java.util.Date;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import jade.core.*;
import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.DFService;
import jade.domain.FIPAException;
/**
This agent implements a simple Ping Agent.
First of all the agent registers itself with the DF of the platform and
then waits for ACLMessages.
If a QUERY_REF or QUER_IF message arrives that contains the string "ping" within the
content
then it replies with an INFORM message whose content will be the string "(pong)".
If it receives a NOT_UNDERSTOOD message no reply is sent.
For any other message received it replies with a NOT_UNDERSTOOD message.
The exchanged message are written in a log file whose name is the local name of the
agent.
PrintWriter logFile;
public WaitPingAndReplyBehaviour(Agent a) {
super(a);
}
public void action() {
ACLMessage msg = blockingReceive();
if(msg != null){
if(msg.getPerformative() == ACLMessage.NOT_UNDERSTOOD)
{
log("Received the following message: "+
msg.toString());
log("No reply message sent.");
}
else{
log("Received the following message: "+
msg.toString());
ACLMessage reply = msg.createReply();
if((msg.getPerformative()==
ACLMessage.QUERY_REF)||(msg.getPerformative()==
ACLMessage.QUERY_IF))
{
String content = msg.getContent();
if ((content != null) && (content.indexOf("ping") !=
-1))
{{
reply.setPerformative(ACLMessage.INFORM);
reply.setContent("(pong)");
}
eelse
{
reply.setPerformative(ACLMessage.NOT_UNDERSTOOD);
reply.setContent("( UnexpectedContent (expected
ping))");
}
}
else
{
reply.setPerformative(ACLMessage.NOT_UNDERSTOOD);
reply.setContent("( (Unexpected-act
"+ACLMessage.getPerformative(msg.getPerformative())+") ( expected
(query-ref :content ping)))");
}
log("Replied with the following message: "+ reply.toString());
send(reply);
}
}else{
//System.out.println("No message received");
}
}
} //Endinner class WaitPingAndReplyBehaviour
protected void setup() {
/** Registration with the DF */
DFAgentDescription dfd = new DFAgentDescription();
ServiceDescription sd = new ServiceDescription();
sd.setType("PingAgent");
sd.setName(getName());
sd.setOwnership("ExampleReceiversOfJADE");
sd.addOntologies("PingAgent");
dfd.setName(getAID());
dfd.addServices(sd);
try {
DFService.register(this,dfd);
} catch (FIPAException e) {
System.err.println(getLocalName()+" registration with DF
unsucceeded. Reason: "+e.getMessage());
doDelete();
}
try{
}catch(IOException e){
System.out.println("WARNING: The agent needs the "+
getLocalName()+".log file.");
e.printStackTrace();
}
}
Running PingAgent
You can start the PingAgent with java jade.Boot -gui ping:examples.PingAgent.PingAgent. (Assuming you have your
classpaths correct.) You can then use the DummyAgent to send it the "ping" message with performative QUERY_REF or
QUERY_IF.
Or you could have another agent send it the "ping" message. For an example, see the file SendPing2.java.
/*****************************************************************
JADE - Java Agent DEvelopment Framework is a framework to develop
multi-agent systems in compliance with the FIPA specifications.
Copyright (C) 2000 CSELT S.p.A.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*****************************************************************/
package examples.PingAgent;
import java.util.Date;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import jade.core.*;
import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.DFService;
import jade.domain.FIPAException;
/**
This agent implements a simple Ping Agent.
First of all the agent registers itself with the DF of the platform and
then waits for ACLMessages.
If a QUERY_REF or QUER_IF message arrives that contains the string "ping" within the
content
then it replies with an INFORM message whose content will be the string "(pong)".
If it receives a NOT_UNDERSTOOD message no reply is sent.
For any other message received it replies with a NOT_UNDERSTOOD message.
The exchanged message are written in a log file whose name is the local name of the
agent.
PrintWriter logFile;
public WaitPingAndReplyBehaviour(Agent a) {
super(a);
}
if(msg != null){
if(msg.getPerformative() == ACLMessage.NOT_UNDERSTOOD)
{
log("Received the following message: "+ msg.toString());
log("No reply message sent.");
}
else{
log("Received the following message: "+ msg.toString());
ACLMessage reply = msg.createReply();
if((msg.getPerformative()== ACLMessage.QUERY_REF)||(msg.getPerformative()==
ACLMessage.QUERY_IF))
{
String content = msg.getContent();
if ((content != null) && (content.indexOf("ping") != -1))
{
reply.setPerformative(ACLMessage.INFORM);
reply.setContent("(pong)");
}
else
{
reply.setPerformative(ACLMessage.NOT_UNDERSTOOD);
reply.setContent("( UnexpectedContent (expected ping))");
}
}
else
{
reply.setPerformative(ACLMessage.NOT_UNDERSTOOD);
reply.setContent("( (Unexpected-act
"+ACLMessage.getPerformative(msg.getPerformative())+") ( expected (query-ref :content
ping)))");
sd.setName(getName());
sd.setOwnership("ExampleReceiversOfJADE");
sd.addOntologies("PingAgent");
dfd.setName(getAID());
dfd.addServices(sd);
try {
DFService.register(this,dfd);
} catch (FIPAException e) {
System.err.println(getLocalName()+" registration with DF unsucceeded. Reason:
"+e.getMessage());
doDelete();
}
try{
logFile = new PrintWriter(new FileWriter(getLocalName()+".log",true));
log("Agent: " + getName() + " born");
WaitPingAndReplyBehaviour PingBehaviour = new
WaitPingAndReplyBehaviour(this);
addBehaviour(PingBehaviour);
}catch(IOException e){
System.out.println("WARNING: The agent needs the "+ getLocalName()+".log
file.");
e.printStackTrace();
}
}
package examples.PingAgent;
import jade.core.*;
import jade.core.behaviours.SimpleBehaviour;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.DFService;
import jade.domain.FIPAException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
try {
DFService.register(this, dfd);
} catch (FIPAException e) {
System.err.println(getLocalName() + " registration with DF failed. Reason: "
+ e.getMessage());
doDelete();
}
addBehaviour(new SimpleBehaviour() {
msg = blockingReceive();
if(msg != null) {
if(msg.getPerformative() == ACLMessage.INFORM ) {
System.out.println("[" + msg.getSender().getName()+ "] says "
+ msg.getContent());
} else if(msg.getPerformative() == ACLMessage.NOT_UNDERSTOOD) {
● HostUIFrame.java
● GuestAgent.java
See Also
● HostUIFrame.
● GuestAgent
HostAgent
/*****************************************************************************
* Source code information
* -----------------------
* Original author Ian Dickinson, HP Labs Bristol
* Author email Ian_Dickinson@hp.com
* Package
* Created 1 Oct 2001
* Filename $RCSfile: $
* Revision $Revision: $
* Release status Experimental. $State: $
*
** Last modified on $Date: $
* by $Author: $
*
* Copyright (c) 2001 Hewlett-Packard Company, all rights reserved.
*****************************************************************************/
package com.hp.hpl.jade_test;
import jade.core.AID;
import jade.core.Agent;
import jade.core.ProfileImpl;
import jade.core.Profile;
import jade.wrapper.AgentContainer;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.core.behaviours.CyclicBehaviour;
import jade.core.behaviours.OneShotBehaviour;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.DFService;
import jade.domain.FIPAException;
import javax.swing.*;
import java.util.*;
import java.text.NumberFormat;
/**
** <p>
* Agent representing the host for a party, to which a user-controlled number of
guests is invited. The sequence is
* as follows: the user selects a number guests to attend the party from 0 to 1000,
using the
* slider on the UI. When the party starts, the host creates N guest agents, each of
which registers
* with the DF, and sends the host a message to say that they have arrived. When all
the guests
* have arrived, the party starts. The host selects one guest at random, and tells
them a rumour.
* The host then selects two other guests at random, and introduces them to each
other. The party
* then proceeds as follows: each guest that is introduced to someone asks the host
to introduce them
* to another guest (at random). If a guest has someone introduce themselves, and
the guest knows
* the rumour, they tell the other guest. When a guest hears the rumour for the
first time, they
* notify the host. When all the guests have heard the rumour, the party ends and
the guests leave.
* </p>
* <p>
* Note: to start the host agent, it must be named 'host'. Thus:
* <code><pre>
* java jade.Boot -gui host:com.hp.hpl.jade_test.HostAgent()
* </pre></code>
* </p>
*
* @author Ian Dickinson, HP Labs (<a href="mailto:Ian_Dickinson@hp.com">email</a>)
* @version CVS info: $Id: $
*/
// Constructors
//////////////////////////////////
/**
* Construct the host agent. Some tweaking of the UI
parameters.
*/
public HostAgent() {
m_avgFormat.setMaximumFractionDigits( 2 );
m_avgFormat.setMinimumFractionDigits( 2 );
}
// External signature methods
//////////////////////////////////
/**
* Setup the agent. Registers with the DF, and adds a
behaviour to
* process ncoming messages.
*/
protected void setup() {
try {
System.out.println( getLocalName() + " setting up");
// create the agent descrption of itself
DFAgentDescription dfd = new DFAgentDescription();
dfd.setName( getAID() );
DFService.register( this, dfd );
}
}
} );
}
catch (Exception e) {
System.out.println( "Saw exception in HostAgent: " + e
);
e.printStackTrace();
}
}
s /**
* Setup the UI, which means creating and showing the main
frame.
*/
private void setupUI() {
m_frame = new HostUIFrame( this );
m_frame.setSize( 400, 200 );
m_frame.setLocation( 400, 400 );
m_frame.setVisible( true );
m_frame.validate();
}
/**
* Invite a number of guests, as determined by the given
parameter. Clears old
* state variables, then creates N guest agents. A list of
the agents is maintained,
* so that the host can tell them all to leave at the end of
the party.
*
* DG: This and several other methods are invokded by a
OneShotBehaviour of this
*agents defined in HostUIFrame.java.
*
* @param nGuests The number of guest agents to invite.
*/
protected void inviteGuests( int nGuests ) {
// remove any old state
m_guestList.clear();
m_guestCount = 0;
m_rumourCount = 0;
m_introductionCount = 0;
m_partyOver = false;
((HostUIFrame) m_frame).lbl_numIntroductions.setText( "0"
);
((HostUIFrame) m_frame).prog_rumourCount.setValue( 0 );
((HostUIFrame) m_frame).lbl_rumourAvg.setText( "0.0" );
// notice the start time
m_startTime = System.currentTimeMillis();
// try first to ensurat the DF has finished deregistering
the old guests
if (checkDF()) {
setPartyState( "Inviting guests" );
try {
for (int i = 0; i < nGuests; i++) {
// create a new agent
Agent guest = new GuestAgent();
// DG: each new agent gets a unique local name.
guest.doStart( "guest_" + i );
// start a rumour
ACLMessage rumour = new ACLMessage( ACLMessage.INFORM );
rumour.setContent( RUMOUR );
rumour.addReceiver( randomGuest( null ) )
send( rumour );
// introduce two agents to each other
doIntroduction( randomGuest( null ) );
setPartyState( "Swinging" );
}
/**
* Introduce guest0 to a random other guest. Also updates the
introduction
* count on the UI, and the avg no of introductions per
rumour.
*/
protected void doIntroduction( AID guest0 ) {
if (!m_partyOver) {
AID guest1 = randomGuest( guest0 );
// introduce two guests to each other
ACLMessage m = new ACLMessage( ACLMessage.INFORM );
m.setContent( INTRODUCE + " " + guest0 );
m.addReceiver( guest1 );
send( m );
// update the count of introductions on the UI
m_introductionCount++;
SwingUtilities.invokeLater( new Runnable() {
public void run() {
((HostUIFrame)
m_frame).lbl_numIntroductions.setText( Integer.toString(
m_introductionCount ));
}
} );
updateRumourAvg();
}
}
/**
* Increment the number of guests that have heard the rumour,
and update the UI.
/**
* Update the average number of introductions per rumour
spread
* in the UI.
*/
protected void updateRumourAvg() {
SwingUtilities.invokeLater( new Runnable() {
public void run() {
((HostUIFrame)
m_frame).lbl_rumourAvg.setText( m_avgFormat.format( ((double)
m_introductionCount) / m_rumourCount ) );
}
} );
}
/**
* Pick a guest at random who is not the given guest.
*
* @param aGuest A guest at the party or null
* @return A random guest who is not aGuest.
*/
protected AID randomGuest( AID aGuest ) {
AID g = null;
do {
int i = (int) Math.round( Math.random() *
(m_guestList.size() - 1) );
g = (AID) m_guestList.get( i );
} while (g == aGuest);
return g;
}
/**
* Answer true if the DF has cleared all guests. Note: this
approach does
* not work at the moment.
*/
protected boolean checkDF() {
try {
ServiceDescription sd = new ServiceDescription();
sd.setType( "PartyGuest" );
sd.setName( "GuestServiceDescription" );
DFAgentDescription dfd = new DFAgentDescription();
dfd.addServices( sd );
DFAgentDescription[] agents = DFService.search( this,
dfd );
/*****************************************************************************
* Source code information
* -----------------------
* Original author Ian Dickinson, HP Labs Bristol
* Author email Ian_Dickinson@hp.com
* Package
* Created 1 Oct 2001
* Filename $RCSfile: $
* Revision $Revision: $
* Release status Experimental. $State: $
*
* Last modified on $Date: $
* by $Author: $
*
* Copyright (c) 2001 Hewlett-Packard Company, all rights reserved.
*****************************************************************************/
// Package
///////////////
package com.hp.hpl.jade_test;
// Imports
///////////////
import jade.core.AID;
import jade.core.Agent;
import jade.core.ProfileImpl;
import jade.core.Profile;
import jade.wrapper.AgentContainer;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.core.behaviours.CyclicBehaviour;
import jade.core.behaviours.OneShotBehaviour;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.DFService;
import jade.domain.FIPAException;
import javax.swing.*;
import java.util.*;
import java.text.NumberFormat;
/**
* <p>
* Agent representing the host for a party, to which a user-controlled number of guests
is invited. The sequence is
* as follows: the user selects a number guests to attend the party from 0 to 1000, using
the
* slider on the UI. When the party starts, the host creates N guest agents, each of
which registers
* with the DF, and sends the host a message to say that they have arrived. When all the
guests
* have arrived, the party starts. The host selects one guest at random, and tells them
a rumour.
* The host then selects two other guests at random, and introduces them to each other.
The party
* then proceeds as follows: each guest that is introduced to someone asks the host to
introduce them
* to another guest (at random). If a guest has someone introduce themselves, and the
guest knows
* the rumour, they tell the other guest. When a guest hears the rumour for the first
time, they
* notify the host. When all the guests have heard the rumour, the party ends and the
guests leave.
* </p>
* <p>
* Note: to start the host agent, it must be named 'host'. Thus:
* <code><pre>
* java jade.Boot -gui host:com.hp.hpl.jade_test.HostAgent()
* </pre></code>
* </p>
*
* @author Ian Dickinson, HP Labs (<a href="mailto:Ian_Dickinson@hp.com">email</a>)
* @version CVS info: $Id: $
*/
public class HostAgent
extends Agent
{
// Constants
//////////////////////////////////
// Static variables
//////////////////////////////////
// Instance variables
//////////////////////////////////
protected JFrame m_frame = null;
protected Vector m_guestList = new Vector(); // invitees
protected int m_guestCount = 0; // arrivals
protected int m_rumourCount = 0;
protected int m_introductionCount = 0;
protected boolean m_partyOver = false;
protected NumberFormat m_avgFormat = NumberFormat.getInstance();
protected long m_startTime = 0L;
// Constructors
//////////////////////////////////
/**
* Construct the host agent. Some tweaking of the UI parameters.
*/
public HostAgent() {
m_avgFormat.setMaximumFractionDigits( 2 );
m_avgFormat.setMinimumFractionDigits( 2 );
}
/**
* Setup the agent. Registers with the DF, and adds a behaviour to
* process incoming messages.
*/
protected void setup() {
try {
System.out.println( getLocalName() + " setting up");
if (msg != null) {
if (HELLO.equals( msg.getContent() )) {
// a guest has arrived
m_guestCount++;
setPartyState( "Inviting guests (" + m_guestCount
+ " have arrived)" );
if (m_guestCount == m_guestList.size()) {
System.out.println( "All guests have arrived,
starting conversation" );
// all guests have arrived
beginConversation();
}
}
else if (RUMOUR.equals( msg.getContent() )) {
// count the agents who have heard the rumour
incrementRumourCount();
}
else if (msg.getPerformative() == ACLMessage.REQUEST
&& INTRODUCE.equals( msg.getContent() )) {
// an agent has requested an introduction
doIntroduction( msg.getSender() );
}
}
else {
// if no message is arrived, block the behaviour
block();
}
}
} );
}
catch (Exception e) {
System.out.println( "Saw exception in HostAgent: " + e );
e.printStackTrace();
}
/**
* Setup the UI, which means creating and showing the main frame.
*/
private void setupUI() {
m_frame = new HostUIFrame( this );
/**
* Invite a number of guests, as determined by the given parameter. Clears old
* state variables, then creates N guest agents. A list of the agents is maintained,
* so that the host can tell them all to leave at the end of the party.
*
* @param nGuests The number of guest agents to invite.
*/
protected void inviteGuests( int nGuests ) {
// remove any old state
m_guestList.clear();
m_guestCount = 0;
m_rumourCount = 0;
m_introductionCount = 0;
m_partyOver = false;
((HostUIFrame) m_frame).lbl_numIntroductions.setText( "0" );
((HostUIFrame) m_frame).prog_rumourCount.setValue( 0 );
((HostUIFrame) m_frame).lbl_rumourAvg.setText( "0.0" );
// try first to ensure that the DF has finished deregistering the old guests
if (checkDF()) {
try {
for (int i = 0; i < nGuests; i++) {
// create a new agent
Agent guest = new GuestAgent();
guest.doStart( "guest_" + i );
/**
* End the party: set the state variables, and tell all the guests to leave.
*/
protected void endParty() {
setPartyState( "Party over" );
m_partyOver = true;
send(msg);
}
m_guestList.clear();
}
/**
* Shut down the host agent, including removing the UI and deregistering
* from the DF.
*/
protected void terminateHost() {
try {
if (!m_guestList.isEmpty()) {
endParty();
}
DFService.deregister( this );
m_frame.dispose();
doDelete();
}
catch (Exception e) {
System.err.println( "Saw FIPAException while terminating: " + e );
e.printStackTrace();
}
}
/**
* Start the conversation in the party. Tell a random guest a rumour, and
* select two random guests and introduce them to each other.
*/
protected void beginConversation() {
// start a rumour
ACLMessage rumour = new ACLMessage( ACLMessage.INFORM );
rumour.setContent( RUMOUR );
rumour.addReceiver( randomGuest( null ) );
send( rumour );
/**
* Introduce guest0 to a random other guest. Also updates the introduction
* count on the UI, and the avg no of introductions per rumour.
*/
protected void doIntroduction( AID guest0 ) {
if (!m_partyOver) {
AID guest1 = randomGuest( guest0 );
/**
* Increment the number of guests that have heard the rumour, and update the UI.
* If all guests have heard the rumour, end the party.
*/
protected void incrementRumourCount() {
m_rumourCount++;
SwingUtilities.invokeLater( new Runnable() {
public void run() {
((HostUIFrame)
m_frame).prog_rumourCount.setValue( Math.round( 100 * m_rumourCount / m_guestCount ) );
}
} );
updateRumourAvg();
// when all the guests have heard the rumour, the party ends
if (m_rumourCount == m_guestCount) {
// simulate the user clicking stop when the guests have all heard the rumour
try {
SwingUtilities.invokeAndWait( new Runnable() {
public void run() {
((HostUIFrame)
m_frame).btn_stop_actionPerformed( null );
}
} );
}
catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* Update the state of the party in the UI
*/
protected void setPartyState( final String state ) {
SwingUtilities.invokeLater( new Runnable() {
public void run() {
((HostUIFrame)
m_frame).lbl_partyState.setText( state );
}
} );
}
/**
* Update the average number of introductions per rumour spread
* in the UI.
*/
protected void updateRumourAvg() {
SwingUtilities.invokeLater( new Runnable() {
public void run() {
((HostUIFrame)
m_frame).lbl_rumourAvg.setText( m_avgFormat.format( ((double) m_introductionCount) /
m_rumourCount ) );
}
} );
}
/**
* Pick a guest at random who is not the given guest.
*
* @param aGuest A guest at the party or null
* @return A random guest who is not aGuest.
*/
protected AID randomGuest( AID aGuest ) {
AID g = null;
do {
int i = (int) Math.round( Math.random() * (m_guestList.size() - 1) );
g = (AID) m_guestList.get( i );
} while (g == aGuest);
return g;
}
/**
* Answer true if the DF has cleared all guests. Note: this approach does
* not work at the moment.
*/
protected boolean checkDF() {
try {
ServiceDescription sd = new ServiceDescription();
sd.setType( "PartyGuest" );
sd.setName( "GuestServiceDescription" );
DFAgentDescription dfd = new DFAgentDescription();
dfd.addServices( sd );
return false;
}
//==============================================================================
// Inner class definitions
//==============================================================================
/*****************************************************************************
* Source code information
* -----------------------
* Original author Ian Dickinson, HP Labs Bristol
* Author email Ian_Dickinson@hp.com
* Package
* Created 1 Oct 2001
* Filename $RCSfile: $
* Revision $Revision: $
* Release status Experimental. $State: $
*
* Last modified on $Date: $
* by $Author: $
*
* Copyright (c) 2001 Hewlett-Packard Company, all rights reserved.
*****************************************************************************/
// Package
///////////////
package com.hp.hpl.jade_test;
// Imports
///////////////
import java.awt.*;
import javax.swing.*;
import java.beans.*;
import javax.swing.event.*;
import java.awt.event.*;
import jade.core.behaviours.OneShotBehaviour;
/**
* TODO: Class comment.
*
* @author Ian Dickinson, HP Labs (<a href="mailto:Ian_Dickinson@hp.com">email</a>)
* @version CVS info: $Id: $
*/
public class HostUIFrame
extends JFrame
{
// Constants
//////////////////////////////////
// Static variables
//////////////////////////////////
// Instance variables
//////////////////////////////////
// Constructors
//////////////////////////////////
m_owner = owner;
}
/**
* Setup the UI. This code generated by JBuilder designer.
*/
private void jbInit() throws Exception {
component3 = Box.createHorizontalStrut(10);
component2 = Box.createHorizontalStrut(5);
box_buttons = Box.createHorizontalBox();
box_numGuests = Box.createHorizontalBox();
component1 = Box.createGlue();
component4 = Box.createHorizontalStrut(5);
box1 = Box.createVerticalBox();
component6 = Box.createGlue();
component5 = Box.createGlue();
this.getContentPane().setLayout(borderLayout1);
pnl_main.setLayout(gridLayout1);
btn_Exit.setText("Exit");
btn_Exit.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
btn_Exit_actionPerformed(e);
}
});
btn_stop.setEnabled(false);
btn_stop.setText("Stop");
btn_stop.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
btn_stop_actionPerformed(e);
}
});
btn_start.setText("Start");
btn_start.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
btn_start_actionPerformed(e);
}
});
this.setTitle("Party Host Agent");
this.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(WindowEvent e) {
this_windowClosing(e);
}
});
pnl_numGuests.setLayout(borderLayout3);
lbl_numGuests.setText("No. of guests:");
lbl_guestCount.setMaximumSize(new Dimension(30, 17));
lbl_guestCount.setMinimumSize(new Dimension(30, 17));
lbl_guestCount.setPreferredSize(new Dimension(30, 17));
lbl_guestCount.setText("10");
slide_numGuests.setValue(10);
slide_numGuests.setMaximum(1000);
slide_numGuests.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(ChangeEvent e) {
slide_numGuests_stateChanged(e);
}
});
gridLayout1.setRows(4);
gridLayout1.setColumns(2);
jLabel1.setToolTipText("");
jLabel1.setHorizontalAlignment(SwingConstants.RIGHT);
jLabel1.setText("Party state: ");
jLabel2.setHorizontalAlignment(SwingConstants.RIGHT);
jLabel2.setText("No. of introductions: ");
lbl_numIntroductions.setBackground(Color.white);
lbl_numIntroductions.setText("0");
jLabel4.setToolTipText("");
jLabel4.setHorizontalAlignment(SwingConstants.RIGHT);
jLabel4.setText("Guests who have heard rumour: ");
lbl_partyState.setBackground(Color.white);
lbl_partyState.setText("Not started");
prog_rumourCount.setForeground(new Color(0, 255, 128));
prog_rumourCount.setStringPainted(true);
jLabel3.setToolTipText("");
jLabel3.setHorizontalAlignment(SwingConstants.RIGHT);
jLabel3.setText("Avg. intros per rumour: ");
lbl_rumourAvg.setToolTipText("");
lbl_rumourAvg.setText("0.0");
this.getContentPane().add(pnl_main, BorderLayout.CENTER);
pnl_main.add(jLabel1, null);
pnl_main.add(lbl_partyState, null);
pnl_main.add(jLabel2, null);
pnl_main.add(lbl_numIntroductions, null);
pnl_main.add(jLabel4, null);
pnl_main.add(box1, null);
box1.add(component5, null);
box1.add(prog_rumourCount, null);
box1.add(component6, null);
pnl_main.add(jLabel3, null);
pnl_main.add(lbl_rumourAvg, null);
this.getContentPane().add(pnl_numGuests, BorderLayout.NORTH);
pnl_numGuests.add(box_numGuests, BorderLayout.CENTER);
pnl_numGuests.setBorder( BorderFactory.createCompoundBorder(
BorderFactory.createEtchedBorder(), BorderFactory.createEmptyBorder( 2, 2, 2, 2 ) ) );
box_numGuests.add(lbl_numGuests, null);
box_numGuests.add(slide_numGuests, null);
box_numGuests.add(lbl_guestCount, null);
this.getContentPane().add(box_buttons, BorderLayout.SOUTH);
box_buttons.add(component2, null);
box_buttons.add(btn_start, null);
box_buttons.add(component3, null);
box_buttons.add(btn_stop, null);
box_buttons.add(component1, null);
box_buttons.add(btn_Exit, null);
box_buttons.add(component4, null);
lbl_partyState.setForeground( Color.black );
lbl_numIntroductions.setForeground( Color.black );
lbl_rumourAvg.setForeground( Color.black );
}
/**
* When the slider for the num guests changes, we update the label.
*/
void slide_numGuests_stateChanged(ChangeEvent e) {
lbl_guestCount.setText( Integer.toString( slide_numGuests.getValue() ) );
}
/**
* When the user clicks on start, notify the host to begin the party.
*/
void btn_start_actionPerformed(ActionEvent e) {
enableControls( true );
/**
* When the user clicks on stop, tell the host to stop the party.
*/
void btn_stop_actionPerformed(ActionEvent e) {
enableControls( false );
/**
* Maintains the enbabled/disabled state of key controls, depending
* on whether the sim is running or stopped.
*/
void enableControls( boolean starting ) {
btn_start.setEnabled( !starting );
btn_stop.setEnabled( starting );
slide_numGuests.setEnabled( !starting );
btn_Exit.setEnabled( !starting );
}
/**
* When the user clicks the exit button, tell the host to shut down.
*/
void btn_Exit_actionPerformed(ActionEvent e) {
m_owner.addBehaviour( new OneShotBehaviour() {
public void action() {
((HostAgent) myAgent).terminateHost();
}
} );
}
/**
* The window closing event is the same as clicking exit.
*/
void this_windowClosing(WindowEvent e) {
// simulate the user having clicked exit
btn_Exit_actionPerformed( null );
}
//==============================================================================
// Inner class definitions
//==============================================================================
/*****************************************************************************
* Source code information
* -----------------------
* Original author Ian Dickinson, HP Labs Bristol
* Author email Ian_Dickinson@hp.com
* Package
* Created 1 Oct 2001
* Filename $RCSfile: $
* Revision $Revision: $
* Release status Experimental. $State: $
*
* Last modified on $Date: $
* by $Author: $
*
* Copyright (c) 2001 Hewlett-Packard Company, all rights reserved.
*****************************************************************************/
// Package
///////////////
package com.hp.hpl.jade_test;
// Imports
///////////////
import jade.core.Agent;
import jade.core.AID;
import jade.domain.FIPAException;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.core.behaviours.CyclicBehaviour;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.DFService;
/**
* TODO: Class comment.
*
* @author Ian Dickinson, HP Labs (<a href="mailto:Ian_Dickinson@hp.com">email</a>)
* @version CVS info: $Id: $
*/
public class GuestAgent
extends Agent
{
// Constants
//////////////////////////////////
// Static variables
//////////////////////////////////
// Instance variables
//////////////////////////////////
// Constructors
//////////////////////////////////
/**
* Set up the agent. Register with the DF, and add a behaviour to process
* incoming messages. Also sends a message to the host to say that this
* guest has arrived.
*/
protected void setup() {
try {
// create the agent descrption of itself
ServiceDescription sd = new ServiceDescription();
sd.setType( "PartyGuest" );
sd.setName( "GuestServiceDescription" );
DFAgentDescription dfd = new DFAgentDescription();
dfd.setName( getAID() );
dfd.addServices( sd );
if (msg != null) {
if (HostAgent.GOODBYE.equals( msg.getContent() )) {
// time to go
leaveParty();
}
else if (msg.getContent().startsWith(
HostAgent.INTRODUCE )) {
// I am being introduced to another guest
introducing( msg.getContent().substring(
msg.getContent().indexOf( " " ) ) );
}
else if (msg.getContent().startsWith( HostAgent.HELLO
)) {
// someone saying hello
passRumour( msg.getSender() );
}
else if (msg.getContent().startsWith(
HostAgent.RUMOUR )) {
// someone passing a rumour to me
hearRumour();
}
else {
System.out.println( "Guest received unexpected
message: " + msg );
}
}
else {
// if no message is arrived, block the behaviour
block();
}
}
} );
}
catch (Exception e) {
System.out.println( "Saw exception in GuestAgent: " + e );
e.printStackTrace();
}
/**
* To leave the party, we deregister with the DF and delete the agent from
* the platform.
*/
protected void leaveParty() {
try {
DFService.deregister( this );
doDelete();
}
catch (FIPAException e) {
System.err.println( "Saw FIPAException while leaving party: " + e );
e.printStackTrace();
}
}
/**
* Host is introducing this guest to the named guest. Say hello to the guest,
* and ask the host for another introduction.
*
* @param agentName The string form of the AID of the other guest.
*/
protected void introducing( String agentName ) {
// get the AID of the guest and send them a hello message
AID aID = new AID( agentName.substring( agentName.lastIndexOf( ' ' ) + 1,
agentName.indexOf( ')' )), true );
send( m );
send( m1 );
}
/**
* Pass the rumour to the named guest, if we know it.
*
* @param agent Another guest we will send the rumour message to, but only if we
* know the rumour already.
*/
protected void passRumour( AID agent ) {
if (m_knowRumour) {
ACLMessage m = new ACLMessage( ACLMessage.INFORM );
m.setContent( HostAgent.RUMOUR );
m.addReceiver( agent );
send( m );
}
}
/**
* Someone has told this agent the rumour, we tell the host that we now know it.
*/
protected void hearRumour() {
// if I hear the rumour for the first time, tell the host
if (!m_knowRumour) {
ACLMessage m = new ACLMessage( ACLMessage.INFORM );
m.setContent( HostAgent.RUMOUR );
m.addReceiver( new AID( "host", false ) );
send( m );
m_knowRumour = true;
}
}
//==============================================================================
// Inner class definitions
//==============================================================================
/*****************************************************************************
* Source code information
* -----------------------
* Original author Ian Dickinson, HP Labs Bristol
* Author email Ian_Dickinson@hp.com
* Package
* Created 1 Oct 2001
* Filename $RCSfile: $
* Revision $Revision: $
* Release status Experimental. $State: $
*
* Last modified on $Date: $
* by $Author: $
*
* Copyright (c) 2001 Hewlett-Packard Company, all rights reserved.
*****************************************************************************/
// Package
///////////////
package com.hp.hpl.jade_test;
// Imports
///////////////
import java.awt.*;
import javax.swing.*;
import java.beans.*;
import javax.swing.event.*;
import java.awt.event.*;
import jade.core.behaviours.OneShotBehaviour;
/**
* TODO: Class comment.
*
* @author Ian Dickinson, HP Labs (<a href="mailto:Ian_Dickinson@hp.com">email</a>)
* @version CVS info: $Id: $
*/
public class HostUIFrame
extends JFrame
{
// Instance variables
BorderLayout borderLayout1 = new BorderLayout();
JPanel pnl_main = new JPanel();
JButton btn_Exit = new JButton();
Component component3;
JButton btn_stop = new JButton();
Component component2;
JButton btn_start = new JButton();
Box box_buttons;
JPanel pnl_numGuests = new JPanel();
BorderLayout borderLayout3 = new BorderLayout();
JLabel lbl_numGuests = new JLabel();
Box box_numGuests;
JLabel lbl_guestCount = new JLabel();
JSlider slide_numGuests = new JSlider();
Component component1;
Component component4;
GridLayout gridLayout1 = new GridLayout();
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JLabel lbl_numIntroductions = new JLabel();
JLabel jLabel4 = new JLabel();
JLabel lbl_partyState = new JLabel();
Box box1;
JProgressBar prog_rumourCount = new JProgressBar();
Component component6;
Component component5;
JLabel jLabel3 = new JLabel();
JLabel lbl_rumourAvg = new JLabel();
// Constructors
//////////////////////////////////
public HostUIFrame( HostAgent owner ) {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
m_owner = owner;
}
// Internal implementation methods
//////////////////////////////////
/**
* Setup the UI. This code generated by JBuilder designer.
*
*/
private void jbInit() throws Exception {
component3 = Box.createHorizontalStrut(10);
component2 = Box.createHorizontalStrut(5);
box_buttons = Box.createHorizontalBox();
box_numGuests = Box.createHorizontalBox()
component1 = Box.createGlue();
component4 = Box.createHorizontalStrut(5);
box1 = Box.createVerticalBox();
component6 = Box.createGlue();
component5 = Box.createGlue();
this.getContentPane().setLayout(borderLayout1);
pnl_main.setLayout(gridLayout1);
btn_Exit.setText("Exit");
btn_Exit.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
btn_Exit_actionPerformed(e);
}
});
btn_stop.setEnabled(false);
btn_stop.setText("Stop");
btn_stop.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
btn_stop_actionPerformed(e);
}
});
btn_start.setText("Start");
btn_start.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
btn_start_actionPerformed(e);
}
});
this.setTitle("Party Host Agent");
this.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(WindowEvent e) {
this_windowClosing(e);
}
});
pnl_numGuests.setLayout(borderLayout3);
lbl_numGuests.setText("No. of guests:");
lbl_guestCount.setMaximumSize(new Dimension(30, 17));
lbl_guestCount.setMinimumSize(new Dimension(30, 17));
lbl_guestCount.setPreferredSize(new Dimension(30, 17));
lbl_guestCount.setText("10");
slide_numGuests.setValue(10);
slide_numGuests.setMaximum(1000);
slide_numGuests.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(ChangeEvent e) {
slide_numuests_stateChanged(e);
}
});
gridLayout1.setRows(4);
gridLayout1.setColumns(2);
jLabel1.setToolTipText("");
jLabel1.setHorizontalAlignment(SwingConstants.RIGHT);
jLabel1.setText("Party state: ");
jLabel2.setHorizontalAlignment(SwingConstants.RIGHT);
jLabel2.setText("No. of introductions: ");
lbl_numIntroductions.setBackground(Color.white);
lbl_numIntroductions.setText("0");
jLabel4.setToolTipText("");
jLabel4.setHorizontalAlignment(SwingConstants.RIGHT);
jLabel4.setText("Guests who have heard rumour: ");
lbl_partyState.setBackground(Color.white);
lbl_partyState.setText("Not started");
prog_rumourCount.setForeground(new Color(0, 255, 128));
prog_rumourCount.setStringPainted(true);
jLabel3.setToolTipText("");
jLabel3.setHorizontalAlignment(SwingConstants.RIGHT);
jLabel3.setText("Avg. intros per rumour: ");
lbl_rumourAvg.setToolTipText("");
lbl_rumourAvg.setText("0.0");
this.getContentPane().add(pnlin, BorderLayout.CENTER);
pnl_main.add(jLabel1, null);
pnl_main.add(lbl_partyState, null);
pnl_main.add(jLabel2, null);
pnl_main.add(lbl_numIntroductions, null);
pnl_main.add(jLabel4, null);
pnl_main.add(box1, null);
box1.add(component5, null);
box1.add(prog_rumourCount, null);
box1.add(component6, null);
pnl_main.add(jLabel3, null);
pnl_main.add(lbl_rumourAvg, null);
this.getContentPane().add(pnl_numGuests, BorderLayout.NORTH);
pnl_numGuests.add(box_numGuests, BorderLayout.CENTER);
pnl_numGuests.setBorder( BorderFactory.createCompoundBorder(
BorderFactory.createEtchedBorder(), BorderFactory.createEmptyBorder( 2, 2, 2, 2 ) )
);
box_numGuests.add(lbl_numGuests, null);
box_numGuests.add(slide_numGuests, null);
box_numGuests.add(lbl_guestCount, null);
this.getContentPane().add(box_buttons, BorderLayout.SOUTH);
box_buttons.add(component2, null);
box_buttons.add(btn_start, null);
box_buttons.add(component3, null);
box_buttons.add(btn_stop, null);
box_buttons.add(component1, null);
box_buttons.add(btn_Exit, null);
box_buttons.add(component4, null);
lbl_partyState.setForeground( Color.black );
lbl_numIntroductions.setForeground( Color.black );
lbl_rumourAvg.setForeground( Color.black );
}
/**
* When the slider for the num guests changes, we update the
label.
*/
void slide_numGuests_stateChanged(ChangeEvent e) {
lbl_guestCount.setText( Integer.toString(
slide_numGuests.getValue() ) );
}
/**
* When the user clicks on start, notify the host to begin the
party.
*/
void btn_start_actionPerformed(ActionEvent e) {
enableControls( true );
}
});
}
/**
* When the user clicks on stop, tell the host to stop the
party.
*/
void btn_stop_actionPerformed(ActionEvent e) {
enableControls( false );
// add a behaviour to the host to end the party
m_owner.addBehaviour( new OneShotBehaviour() {
public void action() {
((HostAgent)
myAgent).endParty();
}
} );
}
/**
* Maintains the enbabled/disabled state of key controls,
depending
* on whether the sim is running or stopped.
*/
void enableControls( boolean starting ) {
btn_start.setEnabled( !starting );
btn_stop.setEnabled( starting );
slide_numGuests.setEnabled( !starting );
btn_Exit.setEnabled( !starting );
}
/**
* When the user clicks the exit button, tell the host to shut
down.
*/
void btn_Exit_actionPerformed(ActionEvent e)
m_owner.addBehaviour( new OneShotBehaviour() {
public void action() {
((HostAgent)
myAgent).terminateHost();
}
} );
}
/**
* The window closing event is the same as clicking exit.
*/
void this_windowClosing(WindowEvent e) {
// simulate the user having clicked exit
btn_Exit_actionPerformed( null );
}
}
/*****************************************************************************
* Source code information
* -----------------------
* Original author Ian Dickinson, HP Labs Bristol
* Author email Ian_Dickinson@h.com
* Package
* Created 1 Oct 2001
* Filename $RCSfile: $
* Revision $Revision: $
* Release status Experimental. $State: $
*
* Last modified on $Date: $
* by $Author: $
*
* Copyright (c) 2001 Hewlett-Packard Company, all rights reserved.
*****************************************************************************/
// Package
///////////////
package com.hp.hpl.jade_test;
// Imports
///////////////
import jade.core.Agent;
import jade.core.AID;
import jade.domain.FIPAException;
import jade.lang.acl.ACLMessage;
mport jade.lang.acl.MessageTemplate;
import jade.core.behaviours.CyclicBehaviour;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.DFService;
/**
* TODO: Class comment.
*
* @author Ian Dickinson, HP Labs (<a
href="mailto:Ian_Dickinson@hp.com">email</a>)
* @version CVS info: $Id: $
*/
public class GuestAgent
extends Agent
{
// Instance variables
//////////////////////////////////
protected boolean m_knowRumour = false;
if (msg != null) {
if (HostAgent.GOODBYE.equals(
msg.getContent() )) {
// time to go
leaveParty();
}
else if
(msg.getContent().startsWith( HostAgent.INTRODUCE )) {
// I am being introduced
to another guest
introducing(
msg.getContent().substring( msg.getContent().indexOf( " " ) ) );
}
else if
(msg.getContent().startsWith( HostAgent.HELLO )) {
// someone saying hello
passRumour(
msg.getSender() );
}
else if
(msg.getContent().startsWith( HostAgent.RUMOUR )) {
// someone passing a
rumour to me
hearRumour();
}
else {
System.out.println( "Guest
received unexpected message: " + msg );
}
}
else {
// if no message is arrived,
block the behaviour
block();
}
}
} );
}
catch (Exception e) {
System.out.println( "Saw exception in GuestAgent: " +
e );
e.printStackTrace();
}
}
// Internal implementation methods
//////////////////////////////////
/**
* To leave the party, we deregister with the DF and delete
the agent from
* the platform.
*/
protected void leaveParty() {
try {
DFService.deregister( this );
doDelete();
}
catch (FIPAException e) {
System.err.println( "Saw FIPAException while leaving
party: " + e );
e.printStackTrace();
}
}
/**
* Host is introducing this guest to the named guest. Say
hello to the guest,
* and ask the host for another introduction.
*
* @param agentName The string form of the AID of the other
guest.
*/
protected void introducing( String agentName ) {
// get the AID of the guest and send them a hello message
AID aID = new AID( agentName.substring(
agentName.lastIndexOf( ' ' ) + 1, agentName.indexOf( ')' )), true
);
ACLMessage m = new ACLMessage( ACLMessage.INFORM );
m.setContent( HostAgent.HELLO );
m.addReceiver( aID );
send( m );
// request another introduction from the host
ACLMessage m1 = new ACLMessage( ACLMessage.REQUEST );
m1.setContent( HostAgent.INTRODUCE );
m1.addReceiver( new AID( "host", false ) );
send( m1 );
}
/**
* Pass the rumour to the named guest, if we know it.
*
* @param agent Another guest we will send the rumour message
to, but only if we
* know the rumour already.
*/
protected void passRumour( AID agent ) {
if (m_knowRumour) {
ACLMessage m = new ACLMessage( ACLMessage.INFORM );
m.setContent( HostAgent.RUMOUR );
m.addReceiver( agent );
send( m );
}
}
/**
* Someone has told this agent the rumour, we tell the host
that we now know it.
*/
protected void hearRumour() {
// if I hear the rumour for the first time, tell the host
if (!m_knowRumour) {
m_knowRumour = true;
}
}
}
Introduction to XML
XML stands for Extensible Markup Language. Like HTML it is derived from a more genral markup
language called SGML, Standard General Markup Language. Both HTML and XML are defined in terms
of SGML constructs.
Overview from Sun's Tutorial
What does XML look like? A configuration file for a web server (parsed by IE).
XML is quite new and people see many possibilities for its use. The Sun Tutorial discusses some. Here is
another view of the applicablility of XML.
● to describe metacontent of documents or on-line resources
Because XML is extensible, it allows different documents to be structured in different ways, depending
on the needs of readers, machine or human, as forseen by the person creating the markup.
Example.
Consider you want to search on the Web for articles or speeches by Bill Clinton. On the Web these
documents are probably using HTML markups. That makes them look nice but for search purposes,
HTML markups are not too useful. (Actually, you can put keywords in the header to help the search.)
You will probably get thousands of hits, most of them "noise".
This search would be much more productive if there were an AUTHOR tag in HTML, but there isn't.
What one needs is some kind of markup language which structures knowledge from a "library ontology".
XML allows such a language to be created. XML is a language for creating custom markup languages.
Databases
Using HTML, data extracted from backend databases is ususally displayed in tables. This is rather rigid,
and furthermore, the data is hard to manipulate because the table it is in just looks like a table, it is
passive, not active. You can't do anything with it, other than look at it.
You could write a program using HTML's various TABLE tags to extract values from certain rows and
colums and, say, add them. But a subsequent changes in layout could invalidate the calculation.
The trouble is that the content and the layout are mixed together. In the case of XML, XML concerns
content structure, and the layout structure is given to another languages called XSL, Extensible Style
Language. Meaning is separated from appearance.
Messaging
Here is the situation most related to Software Agents. XML has the potential to be a kind of "lingua
franca", a universal language for communication among all kinds of agents, human, organizational (B2B
- business to business), or artificial.
Many large businesses, such as banks, today use EDI (Electronic Data Interchange) for B2B
commuications. This uses an arcane language called EDIFACT. These systems are expensive and hard to
maintain. They are out of the reach for small and medium businesses. They are looking to the Internet.
<!--
========================================================
Element
Attribute(s)
Element(s)
========================================================
period.
========================================================
========================================================
command line
xml declaration
default as specified by the dtd and/or
application
========================================================
Miscellany:
========================================================
-->
<!DOCTYPE WebServer [
<WebServer id="webServer">
<Service id="service0">
<WebApplication id="examples" mapping="/examples" docBase="examples"/>
</Service>
<Service id="service1">
<WebApplication id="cps840a4" mapping="/cps840a4"
docBase="cps840a4/WEB-INF/servlets"/>
</Service>
</WebServer>
Using XML
The following example illustrates how XML is created and used.
First the designer decides how to structure a document bases on its semantics and ontology. In this example, we have an employee
database ontology.
A DTD
File: department.dtd:
<!ELEMENT department (employee)*>
<!ELEMENT employee (name, (email | url))>
<!ATTLIST employee id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT url EMPTY>
<!ATTLIST url href CDATA #REQUIRED>
The meaning of some of these terms will be discussed later. If the parser is 'non-validating', you do not actually need a DTD.
The Parser
To use this code, an XML parser is necessary. There are many free XML parsers. IBM and Microsoft both supply them. In fact Internet
Explorer 5 has an XML parser built in. You can see this by looking at department.xml with IE5.
department.xml
This just makes the original code look pretty. But clearly IE5 "understands" something about XML. Try clicking department.xml with
Netscape 4.6 to see the difference.
The DOM
The standard XML parser outputs a data structure called a Document Object Model (DOM). This is a tree structure. For the above
example, the tree looks like this:
The boxes are inner nodes called elements. The leafs of the treee are strings (called CDATA in XML).
SAX Parsers
There is a second kind of parser called tthe "Simple API for XML" or SAX for short. It does not build a tree. Instead, each element
generates an event which the intepreting program can react to. The interpreting program can execute various callback methods in
response to these events. The process is similar to responding to, say, ActionEvents using an ActionListener and the callback method
actionPerformed.
In the case of SAX, you register interest in certain events with the parser and it calls back appropriate methods in your code when the
events of interest occur.
SAX parsers are lightweight and do not need to store the wholle XML document in memory. The drawback is that the elements "whiz
by" as the parse goes on. They generate their events and then are gone. You have to do your thing with the document in one pass. The
DOM on the other had sits there once it is generated and the interperator program can interact with it at leisure.
The DOM method is more useful for programs interacting with a user. On the other hand, SAX is more useful for data exchange
between systems, for example, for agent communication.
Validating Parsers
All XML parsers check the syntax of your XML file. They are much more strict than HTML parsers.
All parsers check for well-formed code. That is, for example, every opening tag has a closing tag. Validating parsers, in addition, try to
check the logical structure as well. For example, a person cannot have two names. This is explicit in the DTD and a validating parser
will catch an error such as this. Or, a tag not defined in the DTD could be present in a syntactically correct way. The validating parser
will catch that too.
Interpretation
The final step in using XML is to write an interpreter of the ontology being represented in the DOM. Interpretation is meaning. The
interpreter provides the semantics just as the parser represents the structure in its DOM output.
Java is a poplular language for writing such interpreters. Its "write once, run anywhere" philosophy is sybiotic to XML ambition to be a
universal language of machine communication.
The "meaning" of the information represented in the XML-DTD-DOM resides in how the interpreter uses the DOM. The example
above is not particularly exciting. The structure itself contains most of the meaning. Once could use the structure, to sort, or pick out
individuals with certain properties, using efficient tree processing algorithms.
Attributes
In the above code there are a number of element attributes, "subSections", "focus", etc. xmlns:JavaXML is also an attribute.
There are several of these reserved attributes
● xml:lang
● xml:space
● xml:link
These are described in the XML Pocket Reference but are not on the course.
Attribute syntax
Attribute names cannot contain @, & or spaces. If they contain a ':' the part before it must be a namespace name. User defined
attributes cannot start with xml.
Attributes are name/value pairs. The value is normally some kind of string.
Entity References
Entity reference are used for string substitutions. An entity reference begins with a '&' and ends with a ';'.
If you wish to use, say '<' , in data (PCDATA) then you can't do so directly because the parser will interpret it as the beginning of a tag.
So you use < instead.
● <
● >
● &
● "
● '
You can also put in hex values this way. For example, the copyright symbol could be put in this way:
This document is © 1999, D Grimshaw.
Processing Instructions
<? target attribute="value", attribute="value" ... ?>
This is a processing instruction (PI). This information is passed from the XML file to the processing application. The programmer can
develop her own. (not on cps720).
Note that there are some standard PI's built in. For example <?xml version="1.0" ?>
<?xml version="1.0"?>
<!DOCTYPE department SYSTEM "department.dtd">
<department>
<employee id="J.D">
<name>John Doe</name>
<email>John.Doe@foo.ibm.com</email>
</employee>
<employee id="B.S">
<name>Bob Smith</name>
<email>Bob.Smith@foo.com</email>
</employee>
<employee id="A.M">
<name>Alice Miller</name>
<url href="http://www.trl.jp.ibm.com/~amiller/"/>
</employee>
</department>
<?xml version="1.0"?>
<?xml-stylesheet href="XSL\JavaXML.html.xsl" type="text/xsl"?>
<?xml-stylesheet href="XSL\JavaXML.wml.xsl" type="text/xsl"
media="wap"?>
<?cocoon-process type="xslt"?>
<!DOCTYPE JavaXML:Book SYSTEM "DTD\JavaXML.dtd">
<JavaXML:Chapter focus="XML">
<JavaXML:Heading>Introduction</JavaXML:Heading>
<JavaXML:Topic subSections="7">What Is It?</JavaXML:Topic>
<JavaXML:Topic subSections="3">How Do I Use It?</JavaXML:Topic>
<JavaXML:Topic subSections="4">Why Should I Use It?</JavaXML:Topic>
<JavaXML:Topic subSections="0">What's Next?</JavaXML:Topic>
</JavaXML:Chapter>
<JavaXML:Chapter focus="XML">
<JavaXML:Heading>Creating XML</JavaXML:Heading>
<JavaXML:Topic subSections="0">An XML Document</JavaXML:Topic>
<JavaXML:Topic subSections="2">The Header</JavaXML:Topic>
<JavaXML:Topic subSections="6">The Content</JavaXML:Topic>
<JavaXML:Topic subSections="1">What's Next?</JavaXML:Topic>
</JavaXML:Chapter>
<JavaXML:Chapter focus="Java">
<JavaXML:Heading>Parsing XML</JavaXML:Heading>
<JavaXML:Topic subSections="3">Getting Prepared</JavaXML:Topic>
<JavaXML:Topic subSections="3">SAX Readers</JavaXML:Topic>
<JavaXML:Topic subSections="9">Content Handlers</JavaXML:Topic>
<JavaXML:Topic subSections="4">Error Handlers</JavaXML:Topic>
<JavaXML:Topic subSections="0">
A Better Way to Load a Parser
</JavaXML:Topic>
<JavaXML:Topic subSections="4">"Gotcha!"</JavaXML:Topic>
<JavaXML:Topic subSections="0">What's Next?</JavaXML:Topic>
</JavaXML:Chapter>
<JavaXML:SectionBreak/>
<JavaXML:Chapter focus="Java">
<JavaXML:Heading>Web Publishing Frameworks</JavaXML:Heading>
<JavaXML:Topic subSections="4">Selecting a Framework</JavaXML:Topic>
<JavaXML:Topic subSections="4">Installation</JavaXML:Topic>
<JavaXML:Topic subSections="3">
Using a Publishing Framework
</JavaXML:Topic>
<JavaXML:Topic subSections="2">XSP</JavaXML:Topic>
<JavaXML:Topic subSections="3">Cocoon 2.0 and Beyond</JavaXML:Topic>
<JavaXML:Topic subSections="0">What's Next?</JavaXML:Topic>
</JavaXML:Chapter>
</JavaXML:Contents>
<JavaXML:Copyright>&OReillyCopyright;</JavaXML:Copyright>
</JavaXML:Book>
XML NameSpaces
JavaXML in JavaXML:Book etc is a namespace. Small, local xml documents do not need separate name
spaces. But if a DTD and corresponding xml document is to be widely used on the Internet, steps must be
taken to prevent name clashes. Such clashes might occur when two xml documents from different
sources were combined into one document.
<JavaXML:Book xmlns:JavaXML="http://www.oreilly.com/catalog/javaxml/">
is a pointer to the owner of the name space.
xmlns: stands for xml name space. It is a reserved name, as are all names beginning with xml. To
the right of the ':' is a unique identifier. A url does just fine.
You can have more than one name space in the same xml document. See page 8 of the XML
Pocket Reference.
DTD Placement
DTDs can be placed in a separate file, or at the beginning of an xml file.
In a separate file.
In this case the xml file begins like this,
<?xml version="1.0" encoding="UTF-16"?>
<!DOCTYPE department SYSTEM "department.dtd">
]>
<!-- the xml -->
<WebServer id="webServer">
<Service id="service0">
<WebApplication id="examples" mapping="/examples" docBase="examples"/>
</Service>
<Service id="service1">
<WebApplication id="cps840a4" mapping="/cps840a4"
docBase="cps840a4/WEB-INF/servlets"/>
</Service>
</WebServer>
● ELEMENT A non-leaf node in the tree. The basic element of the DOM
● CDATA Unparsed character data (i.e., strings. text uniterpreted by the parser).
● EMPTY The node does not contain data. (But has attributes ot be of any use.)
● IDREF A reference to an ID
● NMTOKENA valid XML name composed of letters, numbers, hyphens, underscores, and colons.
Notes
● DTD language describes element trees, with the DOCTYPE as root. (Be able to draw such trees :-)).
● The elements in the above example contain no text data, just attributes.
Another Example
This example will be used later wrhen we look at interpreting DOMs.
averagegpa.xml
<?xml version="1.0"?>
<!-- test xml page -->
<!DOCTYPE averagegpa SYSTEM "averagegpa.dtd">
<averagegpa>
<student>
<firstname> Mary </firstname>
<lastname> Wong </lastname>
<sn> 97123456 </sn>
<gpa> 4.01 </gpa>
<grade Grade="A+" />
</student>
<student>
<firstname> Brian </firstname>
<lastname> Mulroney </lastname>
<sn> 579874562 </sn>
<gpa> 2.02</gpa>
<grade Grade="C-" />
</student>
<student>
<lastname> Kennedy </lastname>
<sn> 763245610 </sn>
<gpa> 2.78 </gpa>
<grade Grade="B-" />
</student>
</averagegpa>
A possible DTD to make this xml text "legal" to a parser is,
averagegpa.dtd
<!ELEMENT averagegpa (student)*>
<!ELEMENT student (firstname?, lastname, sn,gpa,grade)>
<!ELEMENT firstname (#PCDATA)>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT sn (#PCDATA) >
<!ELEMENT gpa (#PCDATA)>
<!ELEMENT grade EMPTY>
<!ATTLIST grade Grade CDATA #IMPLIED>
This very simple example illustrates elements (nodes) which contain text data. This contrasts with the nodes in the
webserver example, which contain nothing but attributes.
Nodes which contain text are leaf nodes. The text is represented in the DTD by the symbol #PCDATA which stands
for parsable character data.
Part of the tree represented by this DTD looks like this:
averagegpa
student
firstname
"Mary"
lastname
"Wong"
sn
"97123456"
gpa
"4.01"
grade Grade="A+"
Note that the values "Mary", "Wong". "97123456", and "4.01" are contained in nodes of type PCDATA. They are
leaf nodes of the tree. The node, grade Grade="A+", is also a leaf node, but not of a PCDATA type, and it is one
level higher in the tree than the other leafs.
Things to note
ENTITY
Entities are rather like macros. It allows you to substitute characters for other characters.
General Entities
<!ENTITY name "replacement characters">
These are defined in DTD's and used in xml documents.
For example,
<!ENTITY dg "David Grimsahaw">
which would allow you to have something like this in an xml file,
<NAME> &dg; </NAME>
You have already seen predefined entities such as < for '<<.
External Entities
This type allows you to copy other xml documents into yours. The above book index example has an example in its
last line. In the corresponding xml file we have,
<JavaXML:Copyright>&OReillyCopyright;</JavaXML:Copyright>
Parameter Entities
This type is only for use withing DTD's. THe syntax is a bit different:
<!ENTITY % name "replacement characters">
Example
This is legal:
<!ENTITY % pcdata "(#PCDATA)">
<!ELEMENT author %pcdata>
For more details on DTD's, check the XML Pocket Reference.
<?xml version="1.0"?>
<!-- test xml page -->
<!DOCTYPE averagegpa SYSTEM "averagegpa.dtd">
<averagegpa>
<student>
<firstname> Mary </firstname>
<lastname> Wong </lastname>
<sn> 97123456 </sn>
<gpa> 4.01 </gpa>
<grade Grade="A+" />
</student>
<student>
<firstname> Brian William</firstname>
<lastname> Mulroney </lastname>
<sn> 579874562 </sn>
<gpa> 2.02</gpa>
<grade Grade="C-" />
</student>
<student>
<lastname> Kennedy </lastname>
<sn> 763245610 </sn>
<gpa> 2.78 </gpa>
<grade Grade="B-" />
</student>
</averagegpa>
BestGPA2.java
This program interprets only one part of the xml file, the gpa element. It interprets it the way a human
agent would, and uses its interpretation to decide which student (just strings to the computer!) is the best
student. Or rather, the <student> element with the highers gpa value. This simple interpreter by no means
has the richness of understanding of a human agent.
This program was written using IBM's XML Parser.
import com.ibm.xml.parser.Parser;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Hashtable;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.EntityReference;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
// Start parsing
Parser parser = new Parser(argv[0]); // @XML4J
Document doc = parser.readStream(is); // @XML4J
}
if(data.getNodeName().equals("lastname")) {
currentStudent.lastName =
data.getFirstChild().getNodeValue();
}
if(data.getNodeName().equals("sn")) {
currentStudent.studentNumber =
data.getFirstChild().getNodeValue();
}
if(data.getNodeName().equals("gpa")) {
currentStudent.gpa = (new
Float(getTheText(data))).floatValue();
}
if(data.getNodeName().equals("grade")) {
}
} // end for_data
currentStudent.displayStudent("Student");
} // end of for_student
bestStudent.displayStudent("Best Student");
}
catch (Exception e) {
e.printStackTrace();
}
} // end main()
public Student() {
gpa = 0.0f;
}
import com.ibm.xml.parser.Parser;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Hashtable;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.EntityReference;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
// Start parsing
Parser parser = new Parser(argv[0]); // @XML4J
Document doc = parser.readStream(is); // @XML4J
Float(getTheText(data))).floatValue();
}
if(data.getNodeName().equals("grade")) {
}
} // end for_data
currentStudent.displayStudent("Student");
} // end of for_student
bestStudent.displayStudent("Best Student");
}
catch (Exception e) {
e.printStackTrace();
}
} // end main()
/* ---------------------------------------------------------*/
private static String getTheText (Node node){
// Create a StringBuffer to store the result.
// StringBuffer is more efficient than String
StringBuffer buffer = new StringBuffer();
return getTheText1 (node, buffer);
}
public Student() {
gpa = 0.0f;
}
Overview
Using the SAX parser is a completely different experience from using a DOM parser. Programming SAX
is event driven programming. Programming DOM is tree traversal.
Since SAX is event driven, programming SAX is not unlike programming the AWT or Swing. The SAX
parser reads in an xml file (also a dtd if present) and each time it "sees" something interesting, such as an
ELEMENT it generates a certain kind of event.
If your program is interested in this event, it can register with the parser as a listener by implementing
certain interfaces. The SAX parser will then call back certain methods which you have overridden to do
what you need to do in response to the event. Although the SAX parser organizes its events a bit
differently, the situation is similar to an AWT Button generating ActionEvents when clicked. Then, an
interested class implements an ActionListener and overrides the callback method actionPerformed.
SAX events, unlike AWT events, come in an ordered sequence as the xml file is read in. Given the tree
structure of the xml file, the parser is generating events in a depth first order.
Furthermore, the events are fired "on the fly" as the xml file is read in. You only get one chance to "grab
it" as it "flies" by. Unless you, the programmer, do something to capture relevant information at the point
at which it arrives, the information is lost unless you parse the whole file again. This is in contrast to the
DOM parser, which reads the who document in, storing it in its tree structure, and then waits for your
program to analyze it at its leisure.
import java.io.IOException;
/**
* Checks xml files for syntax errors. If a DTD is available, checks the validity of the xml
❍ DocumentHandler
SAXParserDemo.java
/*--
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
3. Products derived from this software may not be called "Java and XML", nor may
"Java and XML" appear in their name, without prior written permission from
Brett McLaughlin (brett@newInstance.com).
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
JDOM PROJECT OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import java.io.IOException;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.ErrorHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
/**
* <b><code>SAXParserDemo</code></b> will take an XML file and parse it using SAX,
* displaying the callbacks in the parsing lifecycle.
*
* @author Brett McLaughlin
* @version 1.0
*/
public class SAXParserDemo {
/**
* <p>
* This parses the file, using registered SAX handlers, and output
* the events in the parsing process cycle.
* </p>
*
* @param uri <code>String</code> URI of file to parse.
*/
public void performDemo(String uri) {
System.out.println("Parsing XML File: " + uri + "\n\n");
try {
// Instantiate a parser
XMLReader parser =
XMLReaderFactory.createXMLReader(
"org.apache.xerces.parsers.SAXParser");
parser.setErrorHandler(errorHandler);
} catch (IOException e) {
System.out.println("Error reading URI: " + e.getMessage());
} catch (SAXException e) {
System.out.println("Error in parsing: " + e.getMessage());
}
/**
* <p>
* This provides a command line entry point for this demo.
* </p>
*/
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("Usage: java SAXParserDemo [XML URI]");
System.exit(0);
}
/**
* <b><code>MyContentHandler</code></b> implements the SAX
* <code>ContentHandler</code> interface and defines callback
* behavior for the SAX callbacks associated with an XML
* document's content.
*/
/**
* <p>
* Provide reference to <code>Locator</code> which provides
* information about where in a document callbacks occur.
* </p>
*
* @param locator <code>Locator</code> object tied to callback
* process
*/
public void setDocumentLocator(Locator locator) {
System.out.println(" * setDocumentLocator() called");
// We save this for later use if desired.
this.locator = locator;
}
/**
* <p>
* This indicates the start of a Document parse - this precedes
* all callbacks in all SAX Handlers with the sole exception
* of <code>{@link #setDocumentLocator}</code>.
* </p>
*
* @throws <code>SAXException</code> when things go wrong
*/
public void startDocument() throws SAXException {
System.out.println("Parsing begins...");
}
/**
* <p>
* This indicates the end of a Document parse - this occurs after
* all callbacks in all SAX Handlers.</code>.
* </p>
*
* @throws <code>SAXException</code> when things go wrong
*/
public void endDocument() throws SAXException {
System.out.println("...Parsing ends.");
}
/**
* <p>
* This will indicate that a processing instruction (other than
* the XML declaration) has been encountered.
* </p>
*
* @param target <code>String</code> target of PI
* @param data <code>String</code containing all data sent to the PI.
* This typically looks like one or more attribute value
* pairs.
* @throws <code>SAXException</code> when things go wrong
*/
public void processingInstruction(String target, String data)
throws SAXException {
/**
* <p>
* This will indicate the beginning of an XML Namespace prefix
* mapping. Although this typically occur within the root element
* of an XML document, it can occur at any point within the
* document. Note that a prefix mapping on an element triggers
* this callback <i>before</i> the callback for the actual element
* itself (<code>{@link #startElement}</code>) occurs.
* </p>
*
* @param prefix <code>String</code> prefix used for the namespace
* being reported
* @param uri <code>String</code> URI for the namespace
* being reported
* @throws <code>SAXException</code> when things go wrong
*/
public void startPrefixMapping(String prefix, String uri) {
System.out.println("Mapping starts for prefix " + prefix +
" mapped to URI " + uri);
}
/**
* <p>
* This indicates the end of a prefix mapping, when the namespace
* reported in a <code>{@link #startPrefixMapping}</code> callback
* is no longer available.
* </p>
*
* @param prefix <code>String</code> of namespace being reported
* @throws <code>SAXException</code> when things go wrong
*/
public void endPrefixMapping(String prefix) {
System.out.println("Mapping ends for prefix " + prefix);
}
/**
* <p>
* This reports the occurrence of an actual element. It will include
* the element's attributes, with the exception of XML vocabulary
* specific attributes, such as
* <code>xmlns:[namespace prefix]</code> and
* <code>xsi:schemaLocation</code>.
* </p>
*
* @param namespaceURI <code>String</code> namespace URI this element
* is associated with, or an empty
* <code>String</code>
* @param localName <code>String</code> name of element (with no
/**
* <p>
* Indicates the end of an element
* (<code></[element name]></code>) is reached. Note that
* the parser does not distinguish between empty
* elements and non-empty elements, so this will occur uniformly.
* </p>
*
* @param namespaceURI <code>String</code> URI of namespace this
* element is associated with
* @param localName <code>String</code> name of element without prefix
* @param rawName <code>String</code> name of element in XML 1.0 form
* @throws <code>SAXException</code> when things go wrong
*/
/**
* <p>
* This will report character data (within an element).
* </p>
*
* @param ch <code>char[]</code> character array with character data
* @param start <code>int</code> index in array where data starts.
* @param end <code>int</code> index in array where data ends.
* @throws <code>SAXException</code> when things go wrong
*/
public void characters(char[] ch, int start, int end)
throws SAXException {
/**
* <p>
* This will report whitespace that can be ignored in the
* originating document. This is typically only invoked when
* validation is ocurring in the parsing process.
* </p>
*
* @param ch <code>char[]</code> character array with character data
* @param start <code>int</code> index in array where data starts.
* @param end <code>int</code> index in array where data ends.
* @throws <code>SAXException</code> when things go wrong
*/
public void ignorableWhitespace(char[] ch, int start, int end)
throws SAXException {
/**
* <p>
* This will report an entity that is skipped by the parser. This
* should only occur for non-validating parsers, and then is still
* implementation-dependent behavior.
* </p>
*
* @param name <code>String</code> name of entity being skipped
* @throws <code>SAXException</code> when things go wrong
*/
public void skippedEntity(String name) throws SAXException {
System.out.println("Skipping entity " + name);
}
/**
* <b><code>MyErrorHandler</code></b> implements the SAX
* <code>ErrorHandler</code> interface and defines callback
* behavior for the SAX callbacks associated with an XML
* document's errors.
*/
class MyErrorHandler implements ErrorHandler {
/**
* <p>
* This will report a warning that has occurred; this indicates
* that while no XML rules were "broken", something appears
* to be incorrect or missing.
* </p>
*
* @param exception <code>SAXParseException</code> that occurred.
System.out.println("**Parsing Warning**\n" +
" Line: " +
exception.getLineNumber() + "\n" +
" URI: " +
exception.getSystemId() + "\n" +
" Message: " +
exception.getMessage());
throw new SAXException("Warning encountered");
}
/**
* <p>
* This will report an error that has occurred; this indicates
* that a rule was broken, typically in validation, but that
* parsing can reasonably continue.
* </p>
*
* @param exception <code>SAXParseException</code> that occurred.
* @throws <code>SAXException</code> when things go wrong
*/
public void error(SAXParseException exception)
throws SAXException {
System.out.println("**Parsing Error**\n" +
" Line: " +
exception.getLineNumber() + "\n" +
" URI: " +
exception.getSystemId() + "\n" +
" Message: " +
exception.getMessage());
throw new SAXException("Error encountered");
}
/**
* <p>
* This will report a fatal error that has occurred; this indicates
* that a rule has been broken that makes continued parsing either
* impossible or an almost certain waste of time.
* </p>
*
* @param exception <code>SAXParseException</code> that occurred.
* @throws <code>SAXException</code> when things go wrong
*/
public void fatalError(SAXParseException exception)
throws SAXException {
Most of the useful work is done in the methods startDocument(), startElement(), endElement(), and
characters() shown in red.
Because the two programmer defined classes implement interfaces directly, all the methods in the
interfaces must be given some kind of body. This is inconvenient so the SAX provides some convenience
classes to provide empty implementations of all these methods. This is just like the adapter classes such
as WindowAdapter provided by the AWT.
HTML Doc for the SAXDemo program.
● averagegpa.xml
GPAExample.java
package xml.sax.gpaExample2;
import java.io.IOException;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
/**
* A SAX parser example with a simple calculation.<p>
* The file to be parsed conforms to the DTD averagegpa.dtd. An example is
* averagegpa.xml. <p>
* The program finds the student with the highest gpa. Output is to stdout.<p>
*
* SAX parsers analyse the xml document dynamically, producing events for each type
* of XML data. The analysis proceeds in depth first order. The program must arrange
* to capture relevant data as it "flies by". <p>
*
* Various interfaces provide callback methods to respond to these events. SAX 2.0 provides
* the convenience class DefaultHandler which provides empty implementations off all
* the methods in these interfaces. You subclass this class and override the methods of
* your choosing to provide the desired functionality. <p>
*
* This program uses several of the most useful of these callbacks, characters(), startElement(),
* and endElement().<p>
*/
public class GPAExample {
/**
* Sets up the parser. These calls are very standardized.
* @param uri <code> String</code>The locator for the XML file to be parsed.
*/
public void analyse(String uri) {
try {
// Instantiate a parser
XMLReader parser =
XMLReaderFactory.createXMLReader(
"org.apache.xerces.parsers.SAXParser");
//parser.setErrorHandler(errorHandler);
} catch (IOException e) {
System.out.println("Error reading URI: " + e.getMessage());
} catch (SAXException e) {
System.out.println("Error in parsing: " + e.getMessage());
}
}
}
/**
* Tailors the DefaultHandler for this application.
*/
class MyHandler extends DefaultHandler {
/*
* The startElement() and endElement() methods are called every time the parser
* sees an Element. These variables, global to the class, allow the different types
* of elements to be distinguished across calls. In particular the control the action of
* the characters() method which reads PCDATA from the XML file.
*/
private boolean isGPA = false;
private boolean isFirstName = false;
private boolean isLastName = false;
// retain some of the parsed data when the SAX parser moves on
public MyHandler() {
bestStudent = new Student("","", 0.00f, "");
}
// keep the parsed data. The aStudent variable should not be null because
// it got the reference when startElement() was called on <student> tag.
// Similarly the boolean flags are set in starElement().
if(isFirstName) {
if(aStudent != null) {
aStudent.setFirstName(s);
}
} else if(isLastName) {
if(aStudent != null) {
aStudent.setLastName(s);
}
} else if(isGPA) {
if(aStudent != null) {
float gp = (new Float(s)).floatValue();
aStudent.setGpa(gp);
}
}
}
if(localName.equals("student")) {
aStudent = new Student("", "", 0.0f, "");
}
if(localName.equals("gpa")) {
isGPA = true;
} else if(localName.equals("firstname")) {
isFirstName = true;
} else if(localName.equals("lastname")) {
isLastName = true;
}
}
// Check that the event signals the end of a <student> element. If so, the
// current student's (aStudent) data fields are populated. So now you can
// compare the current student to the best so far student and perhaps replace
// the best so far student.
isGPA = false;
isFirstName = false;
isLastName = false;
}
/**
* A class to represent student data. The fields correspond to those in the XML
document.
*/
class Student {
private String firstName;
private String lastName;
private float gpa;
private String grade;
System.out.println(lastName);
System.out.println(gpa);
System.out.println(grade);
}
}
}
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import java.io.IOException;
/**
* Checks xml files for syntax errors. If a DTD is available, checks the validity of the
xml
* file against the dtd.
*/
public class CheckXML {
public static void main(String [] args) {
if(args.length != 1) {
System.err.println("USAGE: java CheckXML <xml file name>");
System.exit(0);
}
try {
XMLReader parser = XMLReaderFactory.createXMLReader(
"org.apache.xerces.parsers.SAXParser");
parser.parse(args[0]);
} catch (IOException e) {
System.out.println("Error reading URI: " +
e.getMessage());
} catch (SAXException e) {
System.out.println("Error in parsing: " +
e.getMessage());
}
}
}
Class MyContentHandler
java.lang.Object
|
+--MyContentHandler
All Implemented Interfaces:
org.xml.sax.ContentHandler
class MyContentHandler
extends java.lang.Object
implements org.xml.sax.ContentHandler
MyContentHandler implements the SAX ContentHandler interface and
defines callback behavior for the SAX callbacks associated with an XML document's
content.
Constructor Summary
(package private) MyContentHandler()
Method Summary
void characters(char[] ch, int start, int end)
This will report character data (within an element).
void endDocument()
This indicates the end of a Document parse - this occurs after all
callbacks in all SAX Handlers..
void endElement(java.lang.String namespaceURI,
java.lang.String localName,
java.lang.String rawName)
Indicates the end of an element (</[element name]>) is
reached.
Constructor Detail
MyContentHandler
MyContentHandler()
Method Detail
setDocumentLocator
startDocument
endDocument
Throws:
SAXException - when things go wrong
processingInstruction
startPrefixMapping
endPrefixMapping
startElement
endElement
characters
ignorableWhitespace
int end)
throws org.xml.sax.SAXException
This will report whitespace that can be ignored in the originating document. This
is typically only invoked when validation is ocurring in the parsing process.
Specified by:
ignorableWhitespace in interface
org.xml.sax.ContentHandler
Parameters:
ch - char[] character array with character data
start - int index in array where data starts.
end - int index in array where data ends.
Throws:
SAXException - when things go wrong
skippedEntity
Class MyContentHandler
java.lang.Object
|
+--MyContentHandler
All Implemented Interfaces:
org.xml.sax.ContentHandler
class MyContentHandler
extends java.lang.Object
implements org.xml.sax.ContentHandler
MyContentHandler implements the SAX ContentHandler interface and defines callback
behavior for the SAX callbacks associated with an XML document's content.
Constructor Summary
(package private) MyContentHandler()
Method Summary
void characters(char[] ch, int start, int end)
This will report character data (within an element).
void endDocument()
This indicates the end of a Document parse - this occurs after all callbacks in all SAX
Handlers..
void endElement(java.lang.String namespaceURI,
java.lang.String localName, java.lang.String rawName)
Indicates the end of an element (</[element name]>) is reached.
Constructor Detail
MyContentHandler
MyContentHandler()
Method Detail
setDocumentLocator
startDocument
endDocument
Throws:
SAXException - when things go wrong
processingInstruction
startPrefixMapping
endPrefixMapping
startElement
endElement
characters
ignorableWhitespace
skippedEntity
Class MyErrorHandler
java.lang.Object
|
+--MyErrorHandler
All Implemented Interfaces:
org.xml.sax.ErrorHandler
class MyErrorHandler
extends java.lang.Object
implements org.xml.sax.ErrorHandler
MyErrorHandler implements the SAX ErrorHandler interface and defines callback behavior for
the SAX callbacks associated with an XML document's errors.
Constructor Summary
(package private) MyErrorHandler()
Method Summary
void error(org.xml.sax.SAXParseException exception)
This will report an error that has occurred; this indicates that a rule was broken, typically
in validation, but that parsing can reasonably continue.
void fatalError(org.xml.sax.SAXParseException exception)
This will report a fatal error that has occurred; this indicates that a rule has been broken
that makes continued parsing either impossible or an almost certain waste of time.
void warning(org.xml.sax.SAXParseException exception)
This will report a warning that has occurred; this indicates that while no XML rules were
"broken", something appears to be incorrect or missing.
Constructor Detail
MyErrorHandler
MyErrorHandler()
Method Detail
warning
error
Throws:
SAXException - when things go wrong
fatalError
Class SAXParserDemo
java.lang.Object
|
+--SAXParserDemo
Constructor Summary
SAXParserDemo()
Method Summary
static void main(java.lang.String[] args)
This provides a command line entry point for this demo.
void performDemo(java.lang.String uri)
This parses the file, using registered SAX handlers, and output the events in the
parsing process cycle.
Constructor Detail
SAXParserDemo
public SAXParserDemo()
Method Detail
performDemo
main
Deprecated API
CEFIMPSW
C
characters(char[], int, int) - Method in class MyContentHandler
This will report character data (within an element).
E
endDocument() - Method in class MyContentHandler
This indicates the end of a Document parse - this occurs after all callbacks in all SAX Handlers..
endElement(String, String, String) - Method in class MyContentHandler
Indicates the end of an element (</[element name]>) is reached.
endPrefixMapping(String) - Method in class MyContentHandler
This indicates the end of a prefix mapping, when the namespace reported in a
MyContentHandler.startPrefixMapping(java.lang.String,
java.lang.String) callback is no longer available.
error(SAXParseException) - Method in class MyErrorHandler
This will report an error that has occurred; this indicates that a rule was broken, typically in
validation, but that parsing can reasonably continue.
F
fatalError(SAXParseException) - Method in class MyErrorHandler
This will report a fatal error that has occurred; this indicates that a rule has been broken that makes
continued parsing either impossible or an almost certain waste of time.
I
ignorableWhitespace(char[], int, int) - Method in class MyContentHandler
This will report whitespace that can be ignored in the originating document.
M
main(String[]) - Static method in class SAXParserDemo
This provides a command line entry point for this demo.
MyContentHandler - class MyContentHandler.
MyContentHandler implements the SAX ContentHandler interface and defines callback
behavior for the SAX callbacks associated with an XML document's content.
MyContentHandler() - Constructor for class MyContentHandler
P
performDemo(String) - Method in class SAXParserDemo
This parses the file, using registered SAX handlers, and output the events in the parsing process
cycle.
processingInstruction(String, String) - Method in class MyContentHandler
This will indicate that a processing instruction (other than the XML declaration) has been
encountered.
S
SAXParserDemo - class SAXParserDemo.
SAXParserDemo will take an XML file and parse it using SAX, displaying the callbacks in the
parsing lifecycle.
SAXParserDemo() - Constructor for class SAXParserDemo
W
warning(SAXParseException) - Method in class MyErrorHandler
This will report a warning that has occurred; this indicates that while no XML rules were
"broken", something appears to be incorrect or missing.
CEFIMPSW
Class Tree Deprecated Index Help
PREV NEXT FRAMES NO FRAMES
Package
Each package has a page that contains a list of its classes and interfaces, with a summary for
each. This page can contain four categories:
● Interfaces (italic)
● Classes
● Exceptions
● Errors
Class/Interface
Each class, interface, inner class and inner interface has its own separate page. Each of these
pages has three sections consisting of a class/interface description, summary tables, and
detailed member descriptions:
● Class inheritance diagram
● Direct Subclasses
● Class/interface declaration
● Class/interface description
● Field Summary
● Constructor Summary
● Method Summary
● Field Detail
● Constructor Detail
● Method Detail
Each summary entry contains the first sentence from the detailed description for that item.
The summary entries are alphabetical, while the detailed descriptions are in the order they
appear in the source code. This preserves the logical groupings established by the
programmer.
Deprecated API
The Deprecated API page lists all of the API that have been deprecated. A deprecated API is
not recommended for use, generally due to improvements, and a replacement API is usually
given. Deprecated APIs may be removed in future implementations.
Index
The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and
fields.
Prev/Next
These links take you to the next or previous class, interface, package, or related page.
Frames/No Frames
These links show and hide the HTML frames. All pages are available with or without frames.
Serialized Form
Each serializable or externalizable class has a description of its serialization fields and methods. This
information is of interest to re-implementors, not to developers using the API. While there is no link in
the navigation bar, you can get to this information by going to any serialized class and clicking
"Serialized Form" in the "See also" section of the class description.
This help file applies to API documentation generated using the standard doclet.
/*--
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
3. Products derived from this software may not be called "Java and XML", nor may
"Java and XML" appear in their name, without prior written permission from
Brett McLaughlin (brett@newInstance.com).
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
JDOM PROJECT OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import java.io.IOException;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.ErrorHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
/**
* <b><code>SAXParserDemo</code></b> will take an XML file and parse it using SAX,
* displaying the callbacks in the parsing lifecycle.
*
* @author Brett McLaughlin
* @version 1.0
*/
public class SAXParserDemo {
/**
* <p>
* This parses the file, using registered SAX handlers, and output
* the events in the parsing process cycle.
* </p>
*
try {
// Instantiate a parser
XMLReader parser =
XMLReaderFactory.createXMLReader(
"org.apache.xerces.parsers.SAXParser");
} catch (IOException e) {
System.out.println("Error reading URI: " + e.getMessage());
} catch (SAXException e) {
System.out.println("Error in parsing: " + e.getMessage());
}
/**
* <p>
* This provides a command line entry point for this demo.
* </p>
*/
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("Usage: java SAXParserDemo [XML URI]");
System.exit(0);
}
/**
* <b><code>MyContentHandler</code></b> implements the SAX
* <code>ContentHandler</code> interface and defines callback
* behavior for the SAX callbacks associated with an XML
* document's content.
*/
class MyContentHandler implements ContentHandler {
/**
* <p>
* Provide reference to <code>Locator</code> which provides
* information about where in a document callbacks occur.
* </p>
*
* @param locator <code>Locator</code> object tied to callback
* process
*/
public void setDocumentLocator(Locator locator) {
System.out.println(" * setDocumentLocator() called");
// We save this for later use if desired.
this.locator = locator;
}
/**
* <p>
* This indicates the start of a Document parse - this precedes
* all callbacks in all SAX Handlers with the sole exception
* of <code>{@link #setDocumentLocator}</code>.
* </p>
*
* @throws <code>SAXException</code> when things go wrong
*/
public void startDocument() throws SAXException {
System.out.println("Parsing begins...");
}
/**
* <p>
* This indicates the end of a Document parse - this occurs after
* all callbacks in all SAX Handlers.</code>.
* </p>
*
* @throws <code>SAXException</code> when things go wrong
*/
public void endDocument() throws SAXException {
System.out.println("...Parsing ends.");
}
/**
* <p>
* This will indicate that a processing instruction (other than
* the XML declaration) has been encountered.
* </p>
*
* @param target <code>String</code> target of PI
* @param data <code>String</code containing all data sent to the PI.
* This typically looks like one or more attribute value
* pairs.
* @throws <code>SAXException</code> when things go wrong
*/
public void processingInstruction(String target, String data)
throws SAXException {
/**
* <p>
* This will indicate the beginning of an XML Namespace prefix
* mapping. Although this typically occur within the root element
* of an XML document, it can occur at any point within the
* document. Note that a prefix mapping on an element triggers
* this callback <i>before</i> the callback for the actual element
* itself (<code>{@link #startElement}</code>) occurs.
* </p>
*
* @param prefix <code>String</code> prefix used for the namespace
* being reported
* @param uri <code>String</code> URI for the namespace
* being reported
* @throws <code>SAXException</code> when things go wrong
*/
public void startPrefixMapping(String prefix, String uri) {
System.out.println("Mapping starts for prefix " + prefix +
" mapped to URI " + uri);
}
/**
* <p>
* This indicates the end of a prefix mapping, when the namespace
* reported in a <code>{@link #startPrefixMapping}</code> callback
* is no longer available.
* </p>
*
* @param prefix <code>String</code> of namespace being reported
* @throws <code>SAXException</code> when things go wrong
*/
public void endPrefixMapping(String prefix) {
System.out.println("Mapping ends for prefix " + prefix);
}
/**
* <p>
* This reports the occurrence of an actual element. It will include
* the element's attributes, with the exception of XML vocabulary
* specific attributes, such as
* <code>xmlns:[namespace prefix]</code> and
* <code>xsi:schemaLocation</code>.
* </p>
*
* @param namespaceURI <code>String</code> namespace URI this element
* is associated with, or an empty
* <code>String</code>
* @param localName <code>String</code> name of element (with no
* namespace prefix, if one is present)
* @param rawName <code>String</code> XML 1.0 version of element name:
* [namespace prefix]:[localName]
* @param atts <code>Attributes</code> list for this element
* @throws <code>SAXException</code> when things go wrong
*/
public void startElement(String namespaceURI, String localName,
String rawName, Attributes atts)
throws SAXException {
} else {
System.out.println(" has no associated namespace");
}
/**
* <p>
* Indicates the end of an element
* (<code></[element name]></code>) is reached. Note that
* the parser does not distinguish between empty
* elements and non-empty elements, so this will occur uniformly.
* </p>
*
* @param namespaceURI <code>String</code> URI of namespace this
* element is associated with
* @param localName <code>String</code> name of element without prefix
* @param rawName <code>String</code> name of element in XML 1.0 form
* @throws <code>SAXException</code> when things go wrong
*/
public void endElement(String namespaceURI, String localName,
String rawName)
throws SAXException {
/**
* <p>
* This will report character data (within an element).
* </p>
*
* @param ch <code>char[]</code> character array with character data
* @param start <code>int</code> index in array where data starts.
* @param end <code>int</code> index in array where data ends.
* @throws <code>SAXException</code> when things go wrong
*/
public void characters(char[] ch, int start, int end)
throws SAXException {
/**
* <p>
* This will report whitespace that can be ignored in the
* originating document. This is typically only invoked when
* validation is ocurring in the parsing process.
* </p>
*
* @param ch <code>char[]</code> character array with character data
* @param start <code>int</code> index in array where data starts.
* @param end <code>int</code> index in array where data ends.
* @throws <code>SAXException</code> when things go wrong
*/
public void ignorableWhitespace(char[] ch, int start, int end)
throws SAXException {
/**
* <p>
* This will report an entity that is skipped by the parser. This
* should only occur for non-validating parsers, and then is still
* implementation-dependent behavior.
* </p>
*
* @param name <code>String</code> name of entity being skipped
* @throws <code>SAXException</code> when things go wrong
*/
public void skippedEntity(String name) throws SAXException {
System.out.println("Skipping entity " + name);
}
/**
* <b><code>MyErrorHandler</code></b> implements the SAX
* <code>ErrorHandler</code> interface and defines callback
* behavior for the SAX callbacks associated with an XML
* document's errors.
*/
class MyErrorHandler implements ErrorHandler {
/**
* <p>
* This will report a warning that has occurred; this indicates
* that while no XML rules were "broken", something appears
* to be incorrect or missing.
* </p>
*
* @param exception <code>SAXParseException</code> that occurred.
* @throws <code>SAXException</code> when things go wrong
*/
public void warning(SAXParseException exception)
throws SAXException {
System.out.println("**Parsing Warning**\n" +
" Line: " +
exception.getLineNumber() + "\n" +
" URI: " +
exception.getSystemId() + "\n" +
" Message: " +
exception.getMessage());
throw new SAXException("Warning encountered");
}
/**
* <p>
* This will report an error that has occurred; this indicates
* that a rule was broken, typically in validation, but that
* parsing can reasonably continue.
* </p>
*
* @param exception <code>SAXParseException</code> that occurred.
* @throws <code>SAXException</code> when things go wrong
*/
public void error(SAXParseException exception)
throws SAXException {
System.out.println("**Parsing Error**\n" +
" Line: " +
exception.getLineNumber() + "\n" +
" URI: " +
exception.getSystemId() + "\n" +
" Message: " +
exception.getMessage());
throw new SAXException("Error encountered");
}
/**
* <p>
* This will report a fatal error that has occurred; this indicates
* that a rule has been broken that makes continued parsing either
* impossible or an almost certain waste of time.
* </p>
*
* @param exception <code>SAXParseException</code> that occurred.
* @throws <code>SAXException</code> when things go wrong
*/
public void fatalError(SAXParseException exception)
throws SAXException {
<?xml version="1.0"?>
<!-- test xml page -->
<!DOCTYPE averagegpa SYSTEM "averagegpa.dtd">
<averagegpa>
<student>
<firstname> Mary </firstname>
<lastname> Wong </lastname>
<sn> 97123456 </sn>
<gpa> 3.78 </gpa>
<grade Grade="A" />
</student>
<student>
<firstname> Brian William</firstname>
<lastname> Mulroney </lastname>
<sn> 579874562 </sn>
<gpa> 2.02</gpa>
<grade Grade="C-" />
</student>
<student>
<lastname> Bjork </lastname>
<sn> 763245610 </sn>
<gpa> 2.78 </gpa>
<grade Grade="B-" />
</student>
<student>
<firstname>John </firstname>
<lastname>von Neumann </lastname>
<sn> 26387782 </sn>
<gpa>4.2</gpa>
<grade Grade="A+" />
</student>
</averagegpa>
package xml.sax.gpaExample2;
import java.io.IOException;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
/**
* A SAX parser example with a simple calculation.<p>
* The file to be parsed conforms to the DTD averagegpa.dtd. An example is
* averagegpa.xml. <p>
* The program finds the student with the highest gpa. Output is to stdout.<p>
*
* SAX parsers analyse the xml document dynamically, producing events for each type
* of XML data. The analysis proceeds in depth first order. The program must arrange
* to capture relevant data as it "flies by". <p>
*
* Various interfaces provide callback methods to respond to these events. SAX 2.0
provides
* the convenience class DefaultHandler which provides empty implementations off all
* the methods in these interfaces. You subclass this class and override the methods of
* your choosing to provide the desired functionality. <p>
*
* This program uses several of the most useful of these callbacks, characters(),
startElement(),
* and endElement().<p>
*/
public class GPAExample {
/**
* Sets up the parser. These calls are very standardized.
* @param uri <code> String</code>The locator for the XML file to be parsed.
*/
public void analyse(String uri) {
try {
// Instantiate a parser
XMLReader parser =
XMLReaderFactory.createXMLReader(
"org.apache.xerces.parsers.SAXParser");
} catch (IOException e) {
System.out.println("Error reading URI: " +
e.getMessage());
} catch (SAXException e) {
System.out.println("Error in parsing: " +
e.getMessage());
}
}
}
/**
* Tailors the DefaultHandler for this application.
*/
class MyHandler extends DefaultHandler {
/*
* The startElement() and endElement() methods are called every time the
parser
* sees an Element. These variables, global to the class, allow the
different types
* of elements to be distinguished across calls. In particular the
control the action of
* the characters() method which reads PCDATA from the XML file.
*/
private boolean isGPA = false;
private boolean isFirstName = false;
private boolean isLastName = false;
// retain some of the parsed data when the SAX parser moves on
public MyHandler() {
bestStudent = new Student("","", 0.00f, "");
}
if(isFirstName) {
if(aStudent != null) {
aStudent.setFirstName(s);
}
} else if(isLastName) {
if(aStudent != null) {
aStudent.setLastName(s);
}
} else if(isGPA) {
if(aStudent != null) {
float gp = (new Float(s)).floatValue();
aStudent.setGpa(gp);
}
}
}
/**
* <p>
* This reports the occurrence of an actual element. It will
include
* the element's attributes, with the exception of XML vocabulary
* specific attributes, such as
* <code>xmlns:[namespace prefix]</code> and
* <code>xsi:schemaLocation</code>.
* </p>
*
* @param namespaceURI <code>String</code> namespace URI this
element
* is associated with, or an empty
* <code>String</code>
* @param localName <code>String</code> name of element (with no
* namespace prefix, if one is present)
* @param rawName <code>String</code> XML 1.0 version of element
name:
* [namespace prefix]:[localName]
* @param atts <code>Attributes</code> list for this element
* @throws <code>SAXException</code> when things go wrong
*/
public void startElement(String namespaceURI, String localName,
String rawName, Attributes atts)
throws SAXException {
if(localName.equals("student")) {
aStudent = new Student("", "", 0.0f,
"");
}
if(localName.equals("gpa")) {
isGPA = true;
} else if(localName.equals("firstname")) {
isFirstName = true;
} else if(localName.equals("lastname")) {
isLastName = true;
}
}
A Simple Example
We return to our old friend, averagegpa.xml (with its DTD averagegpa.dtd). Although averagegpa.xml is
reasonably readable by a human, it would be nicer if we could turn it into a regular HTML document,
averagegpa,html, for viewing with a browser. The XSL program, averagegpa.xsl.
averagegpa.xsl
<?xml version="1.0"?>
<!--
A style sheet for averagegpa.xml and averagegpa.dtd.
Used with Apache Xalan XSLT.
<!--
xls is an international namespace.
-->
<xsl:template match="averagegpa">
<html>
<head>
<title> Student Average GPAs </title>
</head>
<body>
<h1> Student Average Marks</h1>
<xsl:apply-templates select="student" />
</body>
</html>
</xsl:template>
<xsl:template match="student">
<h3>
<xsl:value-of select="firstname"/>
<xsl:value-of select= "lastname"/>
</h3>
<hr />
<ul>
<li>Student Number: <xsl:value-of select="sn"/></li>
<li>Average GPA: <xsl:value-of select="gpa"/></li>
<!--
The next line illustrates XPath.
-->
<li> Grade: <xsl:value-of select="./grade/@Grade"/></li>
</ul>
<xsl:apply-templates select="grade"/>
</xsl:template>
<!--
Another way to deal with the grade Element and its attribute.
Disadvantage is that it makes a separate ul.
-->
<xsl:template match="grade">
<ul>
<li> Average Grade: <xsl:value-of select="@Grade"/> </li>
</ul>
</xsl:template>
</xsl:stylesheet>
A Second Example
This example shows some more complicated things. It is taken from Brett McLaughlin's Java and XML.
It provides an XSL script for table of contents example discussed previously.
contents.xml JavaXML.dtd
JavaXML.html.xsl
This example illustrates using some logical constructs in XSL. The result of using this XSL script is
shown in contents.html.
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:JavaXML="http://www.oreilly.com/catalog/javaxml/"
version="1.0"
>
<xsl:template match="JavaXML:Book">
<html>
<head>
<title><xsl:value-of select="JavaXML:Title" /></title>
</head>
<body>
<xsl:apply-templates select="*[not(self::JavaXML:Title)]" />
</body>
</html>
</xsl:template>
<xsl:template match="JavaXML:Contents">
<center>
<h2>Table of Contents</h2>
</center>
<hr />
<ul>
<xsl:for-each select="JavaXML:Chapter">
<xsl:choose>
<xsl:when test="@focus='Java'">
<li><xsl:value-of select="JavaXML:Heading" /> (Java
Focus)</li>
</xsl:when>
<xsl:otherwise>
<li><xsl:value-of select="JavaXML:Heading" /> (XML
Focus)</li>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</ul>
</xsl:template>
<xsl:template match="JavaXML:References">
<p>
<center><h3>Useful References</h3></center>
<ol>
<xsl:for-each select="JavaXML:Reference">
<li>
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="JavaXML:Url" />
</xsl:attribute>
<xsl:value-of select="JavaXML:Name" />
</xsl:element>
</li>
</xsl:for-each>
</ol>
</p>
</xsl:template>
<xsl:template match="JavaXML:Copyright">
<xsl:copy-of select="*" />
</xsl:template>
</xsl:stylesheet>
Note: [CPS720 FALL 2000]. Students are only responsible for constructs in the first example. The
second example is shown only for interest.
Kennedy
<?xml version="1.0"?>
<!--
A style sheet for averagegpa.xml and averagegpa.dtd.
Used with Apache Xalan XSLT.
The output file is averagegpa.html.
DG. Nov. 2000
-->
<!--
xls is an international namespace.
-->
<xsl:template match="averagegpa">
<html>
<head>
<title> Student Average GPAs </title>
</head>
<body>
<h1> Student Average Marks</h1>
<xsl:apply-templates select="student" />
</body>
</html>
</xsl:template>
<xsl:template match="student">
<h3>
<xsl:value-of select="firstname"/>
<xsl:value-of select= "lastname"/>
</h3>
<hr />
<ul>
<li>Student Number: <xsl:value-of select="sn"/></li>
<li>Average GPA: <xsl:value-of select="gpa"/></li>
<!--
The next line illustrates XPath.
-->
<li> Grade: <xsl:value-of select="./grade/@Grade"/></li>
</ul>
<xsl:apply-templates select="grade"/>
</xsl:template>
<!--
Another way to deal with the grade Element and its attribute.
Disadvantage is that it makes a separate ul.
-->
<xsl:template match="grade">
<ul>
<li> Average Grade: <xsl:value-of select="@Grade"/> </li>
</ul>
</xsl:template>
</xsl:stylesheet>
Useful References
1.
Table of Contents
● Introduction (XML Focus)
● Creating XML (XML Focus)
● Parsing XML (Java Focus)
● Web Publishing Frameworks (Java Focus)
Useful References
1. The W3C
2. XSL List
Agent Negotiations
Bargaining and negotiation play key roles in natural agent interactions. People negotiate with other
people all the time. Negotiation is a method by which autonomous agents seek to cooperate by
coordinating their activities and goals.
Virtual software agents will no doubt have to learn to negotiate with one another. In the InfoSleuth
architecture, for example, there are 'clouds' of agents, consumer agents, producer agents, and broker
agents. Negotiations must occur throughout such systems.
Optimal Agreements
It also turns out, that protecting against deception can lead to inefficient, and even downright bad in some
situations. The threat of deception poisons the atmosphere of negotiations. A famous example of this is
the Prisoner's Dilemma game.
One way to solve the deception problem is policing. People who get caught are jailed or fined. This is a
very expensive approach, and may not be very effective.
In some situations it is possible to design institutional mechanisms, or protocols, which make honesty the
best policy. There are many examples of this, especially in connection with taxation policies, and
research continues on such mechanisms.
Negotiation protocols which encourage honesty would be very useful in a world of autonomous virtual
agents.
Preventing cheating
The simplest way is the law. Airlines caught doing this get fined. Note that a software implementation of
this cheating algorithm is less likely to get caught than a purely human one. That is because far fewer
people would have to know about it, perhaps only the programmers and some executives. Without the
software agent, all the pilots would have to be part of the plot.
A better way to prevent this scam would be some kind of automatic mechanism to encourage honesty.
One way would be a surcharged based upon how many places the plane was moved up in the queue. The
surcharge would provide a disincentive to underreporting the remaining fuel supply to gain a queue
advantage.
on the bids, as all the bidders have a tendency to keep their bids high to make a good profit if they do
with the bid. This is a case of inefficiency more than dishonesty.
William Vickrey (a Nobel Prize winner in economics) came up with the following mechanism which is
claimed to be more efficient in the long run. Bids are sealed as before, and opened simultaneously. The
lowest bid is chosen, but, the lowest bidder is paid the value of the second lowest bid !! The winning
bidder does not get the amount of money determined by itself. Rather the reward is determined by
another bidder's lowest bid.
The claim is that incentives to investigate opponents and push bids up is removed by this protocol.
These two examples illustrate possible mechanisms or protocols which align self interest with honesty
and optimality. Thee mechanisms encourage effective cooperation rather than costly conflict. Achieving
optimal cooperative solutions to possibly conflictual situations is the subject of Game Theory.
7 2 5 1
2 2 3 4
5 3 4 4
3 2 1 6
what is it?
Most people would interpret this as a table of numbers. Some might call it a matrix of integers.
Let's add some labels.
A B C D
I 7 2 5 1
Row Player II 2 2 3 4
Strategy III 5 3 4 4
IV 3 2 1 6
Now this table takes on a certain meaning. The matrix is called a payoff matrix. There are two players,
that is, agents, which are assumed to be rational. Players have strategies. This is a special use of the
word strategy. Normally, a strategy is a plan. In Game Theory, strategy must be complete. In other words
a player's strategy must del with every possible stategy of the opponent.
The outcome of the interaction of the players' strategies are the payoffs shown as number in the matrix.
For eacple, if the Row player plays strategy I and the column player plays his strategy, 'B', the payoff is
2.
Zero Sum
By convention, the payoffs shown in the matrix are from the point of view of the Row player. When the
Row player gets a payoff of 2, for example, the implication is that the Column player got a payoff of -2.
The sum of the two payoffs is 0, hence the name Zero Sum Game.
The game shown would be very unfair to the Column player if the payoffs were in dollars. A game with
dollar payoffs would presumably have some negative entries in the payoff matrix. Negative entries
would mean that the Row player would pay the Column player.
● Simultaneous moves. In the basic version of game theory, both players move at the same time.
They do not take turns. (Game theory can be extended to include taking move turns.
● Iterative and single games. Games can be played only once but they are much more interesting if
they are played over and over. Games played many times are called iterative games. It is also often
useful to have both players ignorant of just how many times the game will be repeated.
● Perfect information. Both players can see the whole payoff matrix. This means that they each
know the strategies of their opponents, as well as their own.
Game Theory itself is an ontology which is part of mathematics. The mention of dollars for the payoff is
an attempt to link this mathematics to real objects in the human world. Traditionally, Game Theorists
have linked their subject to economics and political science. i.e. business and politics.
Interpreting Game Theory results in the real world is very difficult and often controversial. Game Theory
abstracts from much of the detail of the real world but still can offer insights if carefully done. Hopefully,
it can also be the basis of conflict resolution among software agetns.
To use Game Theory you have to figure out all the possible strategies. Then you have to estimate
payoffs. These need not be absolute. (In the above example, if all the numbers were 10 times larger the
solutions would be the same.) Once the game is setup, the question arises: what is the best strategy for
each player?
The players are also assumed to be conservative in the sense that they will not give up a possibly modest
sure thing to gamble for a much larger gain at the risk of "loosing their shirt".
The Row player (the maximizer ) chooses a strategy which has the biggest worst case, the largerst
loweset value among the strategies. The Row player chooses the strategy with the maximum minimum!
(i.e., the maximin.)
The Column player (the minimizer) chooses the strategy which has the smallest worst case, the smallest
highest value among the strategies. The Column player chooses the strategy with the minimum
maximum (i.e., the minimax).
What happesn in William's example?
Row Player's Viewpoint
Strategy I II III IV
Maximin = 3 strategy III
Min Payoff 1 2 3 1
Strategy A B C D
Minimax = 3 strategy B
Max Payoff 7 3 5 6
So the Row player choosees strategy III. The Column player chooses strategy B,
In this example, the minimax of the Column player equals the maximin of the Row player. The game has
a unique solution. The two players wind up at the 3 (thousand foot) junction and no player can improve
on this outcome.
When the maximin and the minimax are equal the game is said to have a "saddle point", a term used in
calculus and horseback riding.
A B C D
I 7 2 5 1
Row Player II 2 2 3 4
Strategy III 5 3 4 4
IV 3 6 1 6
Strategy I II III IV
Maximin = 3 strategy III
Min Payoff 1 2 3 1
Strategy A B C D
Minimax = 5 strategy
Max Payoff 7 6 5 6
Nothing changes for the Row player, but the Column player now chooses strategy C instead of B and the
minimax is 5. If the Column player plays strategy C, she winds up at payoff 4 (thousand feet). Could she
do better?
There is a "gray area" in this new version of the game separating the minmax from the maxmin (the
payoffs between 3 and 5). How should players deal with this. The answer is mixed stategies.
Mixed Strategies
If a game has a saddle point, then each player has an optimal pure strategy.That is, one strategy is
certainly the best according to the rules of rationality (minimaxing). With no pure strategy available a
player must create a mix of two or more of the available strategies.
Mixing introduces probablilty. You imagine that the game is to be played over and over again. You can,
of course, only play one stategy at a time. But you can changed the chosen strategy at each play of the
game. The question is, how often should you play each strategy? And in what order?
What you do is to assign a probablilty to each strategy and then, each time the game is played, you
choose a strategy accoring to the probablility. The advantage of this randomization is that you keep the
opponent guessing. Now the question becomes, how do you rationally choose the appropriate
probabilities?
Finding the optimal mixed strategy, which means finding these probablilities is called solving the game.
One way of doing this uses the Simplex method of Linear Programming. (You may have taken this in an
Operations Research course, e.g., MTH 503). Solving these games is beyond the scope of CPS720.
However, there is a program on the net, courtesy Stephan Waner and Steven Constenoble of Hofstra
University in New York State.
Game Theory Simulation from Hofstra University
Uising the simulator with our example, we get the following mixed strategy.
The Optimal Row Strategy
[0, 0, 0.8333, 0.1667]
The Optimal Column Strategy
[0, 0.5, 0.5, 0]
This means that the Row player should play her strategy III 5 games out of every 6, strategy IV once
every 6 games, and never play the other two.
The Column player could toss a coin and play each of strategies B and C 50% of the time each. She
never plays strategies A and D.
The value of the game is 3.5 (thousand feet) which is the average payoff if the game is played over and
over again. Notice that this is better for the Column player thant the value 4 (thousand) feet she obtained
by using the minimax pure strategy mentioned earlier. The Row player can do nothing to prevent this
improvement int Column's score.
Dominance
The payoff matrix shows an interesting feature. Row's strategy II is dominated by strategy III. Every
score for III is greater than or equal to that of II. So you could simply cross out row II without changing
the outcome.
Some nice notes from Hoftra University.
Scissors, Paper and stone is playes as an iterative game. It is also a fair game. The value of this game is
therefore, 0.
A possible game matrix is:
There is no pure strategy for either player in this game. The maximin for the row player is -1 for all three
strategies. Similarly the minmax for the column player is 1 for all three strategies.
Because of the game's simplicity and symmetry it is easy to see that each player's mixed strategy should
be to play each of his or her strategies with a probablility of 1/3. For example, each could toss a die. If 1
or 2 turned up, say scissors. If 3 or 4 turned up, say paper, if 5 or 6 turned up, say stone.
Notice that you must completely randomize your choices and the order of choices. Otherwise the
opponent could spot a pattern and exploit it over a long period of plays.
Cooperative Games
Another interesting class of games. The most famous example of this type is the "Prisoners' Dilemma"
discussed on another page of these notes. In these games the size of the payoffs can depend on the level
of cooperation among players, in contrast to the zero sum nature of the games discussed here.
Cooperative Games
Zero sum games involve conflict. Your gain is my loss. Note that the payoff matrix in two player zero
sum games needs only hold the payoff for one side (the Row Player, by convention). The payoff for the
Column Player is just the negaive of that of the Row Player. But you can have games where this is not
true. In such situations it is possible for the players to cooperate for the benefit of all.
How to achieve this cooperative benefit can turn out to be quite difficult if you assume that rational
players pursue only their self interest. In other words, can you have cooperation without altruism. The
dilemma of achieving cooperation based on selfishness is famously illustrated by the Prisoners' Dilemma
Game.
Two Person Cooperative Games
In these games there are four kinds of payoffs.
● temptation
● sucker
● punishment
(These names make most sense with the Prisoners' Dilemma version of cooperative games.)
The Payoff Matrix
Player 2
cooperate defect
cooperate (3,3) (0,5)
Player 1 defect (5,0) (1,1)
Note in contrast to the zero sum payoff matrix, each element of this matrix has two values, one for each
player. The row player (Player 1) payoff is listed first.
In the example shown, we have, for each player, the following payoffs,
● tempataion = 5
● reward = 3
● sucker = 0
● punishment = 1
The ordering temptation > reward > punishment > sucker makes this a Prisoners' Dilemma.
Strategies
Players have two possible strategies,
● cooperate
● defect
Player 2
Cooperates Defects
The numbers are called payoffs. In this case the players want to minimize the payoff. When one player
defects, the other is said get the sucker payoff.
The Prisoner's Dilemma game illustrates both the benefits and the difficulties in achieving cooperation.
To achieve the optimum solution, both for yourself, and for both players together (a kind of "societal"
payoff) both players must trust the other. But trust involves the risk of being suckered.
In practice, what usually happens is that both players defect, and get a very bad result for each of them,
in the example, 4 years in jail each.
The clientele live around the restaurants. If they like a restaurant, they will return again and again. If they
feel they are suckered, they won't return. So these restaurants are likely to give better value to their
customers.
The Prisoner's Dilemma game can occur whenever negotiations take place, whether among human or
artificial agents. Game Theory also discusses many other situations where negotiations and bargaining
occur. It is a theory of rational behaviour among autonomous agents. It assumes that cooperative
agreements are "out there". The question is how can rational agents get "there" and avoid the likes of
Tosca's kiss.
Autonomous artificial agents will encounter the same dilemmas. Protocols to enable cooperation will
have to be developed. Undoubtedly, Game Theory will be extensively used in the development of such
protocols.
You too can play the Prisoners' Dilemma
Ascape comes with API documentation and a number of examples with source code. These are valuable
but rather too complex for people starting out with Ascape. At least I found them so. One fo the mostt
approachable of these examples is the Demographic Prisoner's Dilemma. Recently Miles Parker
published a paper based on this example which provides a tutorial-like description.
Demographic Prisoner's Dilemma
This example is still pretty complex for beginners. So in the hope of filling the gap caused by the absence
of more elementary examples, here are three tutorials.
● Tutorial 1. part 1. The Voter Game
It is hoped that these three tutorials will help newcomers get up to speed with Ascape. They are based on
my own experiences trying to learn Ascape.
Any suggestions or corrections would be greatly appreciated.
The Notes
Part 1 of Tutorial 1 implements the Voter Game simply with an overhead view of the agents. In Part 2
the vote count of each party is recorded and displayed in a histogram.
Basic Ascape Architecture
Ascape Rules
Tutorial 1. Part 1.
Ascape views
Tutorial 1. Part 2
Tutorial 2
These comments reflect my own learnig experience based on reading the above and trying to program the
Voter Game. The aim is to highlight what you need to know to get started.
Summary
An Ascape model has root ScapeVector holding at least 2 things, a ScapeGraph representing the agents'
environment and a ScapeVector containing the actual agents (which will be used for things like
collecting data). The ScapeGraph is often some kind of lattice structure. Cells of this lattice must be
made "comfortable" in this lattice using the HostCell class.
Your actual agent is a subclass of CellOccupant.
Ascape Rules
Ascape agent behaviour is defined by rules. Ascape itself defines a number of useful rules. These rules
are implemented in the Agent class, in the CellOccupant class, and in the Scape class. The rules have
names which are static fields.
● RESUME_RULE
● START_RULE
● STOP_RULE
Since Scapes are Agents, they inherit all the Agent rules.
By the way, the Scape and Agent classes carry extensive introductoriy documentation which you will
likely find quite useful.
It is also possible to create your own rules and this is often done. In the Voter Game example only two
predefined Ascape rules are needed.
Using Rules
Registration
Rules belong to Scapes . You tell a Scape about a rule (register the rule) using the metthods addRule() or
addInitialRule(). These methods have various forms and belong to the Scape class.
You can add rules when defining scapes but it is often more convenient ot add the rules from inside the
code for the individual agents. To this end, there is the Agent class method, scapeCreated() in which you
can call the addRule() methods via getScape(). The latter returns the scape which the agent in question
inhabits. For example, (inside the agent's class definition, Voter.java)
public void scapeCreated() {
// ...
getScape().addRule(ITERATE_AND_UPDATE_RULE);
// ...
}
Rule Actions
Once the scape knows the rules, it applies them iteratively to every agent on the scape (in an
unsystematic order). It does this by invoking certain methods of the Scape or Agent classes which
correspond to the appropriate rule.
As programmer, you override these methods to add your own code to carry out the rule's action. Or, you
can accept the default behaviour provided by Ascape.
Some rules automatically call a boolean method which tests some condition for the rule's action. These
rules behave like recognize (some condition or situation)-action rules as found, for example, in the JESS
expert system shell.
Bug alert! Make sure you type the signatures of these special methods exactly. Otherwise, your rule may
do nothing or execute the default behaviour only.
Example
In the case of the ITERATE_AND_UPDATE_RULE above, Ascape calls two methods, iterate() and
update().
Rule Order
There are two orders in calling rules, RULE_ORDER and AGENT_ORDER. The default is
AGENT_ORDER. In RULE_ORDER all the rules are executed on one agent and then all the rules are
executed on the next agent and so on. In AGENT_ORDER, the fisrt rule is executed on all the agents,
then the second rule is executed on all the agents, and so on.
The ITERATE_AND_UPDATE_RULE should be used with RULE_ORDER. In this case, the iterate()
method is called on all the agents, and the results temporarily stored. Then the update() method is called
on all the agents to update the agents' states. This ordering simulates parallelism. For example, in the
Voter Game this ordering ensures that each agent uses its neighbours old values in its voting decision,
avoiding a chain reaction where some of its neighbours have already changed their opinions before they
are used.
The program consists of two files, VoterScape.java and Voter.java (in package dave.ascape.voters2).
The code below is colour coded. Important methods and classes are bolded when they first appear.
● red. a method which will be called by Ascape
Voter.java (source)
package dave.ascape.voters2;
import edu.brook.ascape.model.*;
import edu.brook.ascape.view.*;
import edu.brook.ascape.rule.*;
import edu.brook.ascape.util.*;
import java.awt.Color;
/**
* An agent for the VoterScape world. Votes according to the opinion of
* a randomly chosen 'moore' neighbour.
*
* See also dave.ascape.voters2.VoterScape.java
*/
public class Voter extends CellOccupant {
private int supportedParty = 0;
private int temp = 0;
private int numParties = 0;
public Voter() {}
public void initialize() {
super.initialize();
numParties = ((VoterScape)scape.getModel()).getNumberOfParties();
supportedParty = randomInRange(0, numParties-1);
}
public void scapeCreated() {
getScape().addInitialRule(MOVE_RANDOM_LOCATION_RULE);
getScape().addRule(ITERATE_AND_UPDATE_RULE);
}
public void iterate() {
CellOccupant [] neighbors = getHostCell().getNeighboringOccupants();
int chosenNeighbor = randomInRange(0, neighbors.length-1);
CellOccupant chosenAgent = neighbors[chosenNeighbor];
temp = ((Voter) chosenAgent).getSupportedParty();
}
public void update() {
supportedParty = temp;
}
Notes on Voter.java
1. scape.getModel().getNumberOfParties().
This line has some interesting features. The number of parties is held by the numberOfParties variable in
the root Scape (VoterScape). So the idea is to tell the agent how many parties there are. This way of
doing this (rather than, for example, passing the information as a constructor argument) allows the user to
change the number of parties at run time.
For the Voter agent to get at the getNumberOfParties() method of the VoterScape class requires the two
steps shown: 'scape' and 'getModel()'. What is going on?
scape is protected field of th class, AscapeObject. Since the AscapeObject class is the root of the Ascape
system, this fields is inherited by all Ascape objects. It represents the scape (agent) to which the agent in
whose code the 'scape' variable appears, belongs.
In the VoterScape example, consider these two lines in the CreateScape() method,
package dave.ascape.voters2;
import edu.brook.ascape.model.*;
import edu.brook.ascape.view.*;
import edu.brook.ascape.rule.*;
import edu.brook.ascape.util.*;
/**
* A simple version of Dewdney's voting game.
* Voters ask a random neighbour his choice of party and switch to
* that party on the next round of voting.
* One run: 4 parties reduced to 1 in 12000 cycles
*
* This is mean to be an elementary introduction to Ascape programming.
* No statistics are collected. Only an overhead view is shown.
* Users can, however, adjust the number of parties from 2 to 5 at run time
* in the usuaal Ascape way.
*
* see also Voter.java for the agent code.
* Statistics are added in the program dave.ascape.voters3 package.
*/
public class VoterScape extends ScapeVector {
ScapeGraph lattice;
ScapeVector voters;
Overhead2DView overheadView;
ChartView chart;
super.createViews();
//Now, add a simple overhead view so that we can view the lattice:
overheadView = new Overhead2DView();
//Set its cell size to 12
overheadView.setCellSize(12);
//add it to the lattice so that it can view and be controlled by it
lattice.addView(overheadView);
}
package dave.ascape.voters2;
import edu.brook.ascape.model.*;
import edu.brook.ascape.view.*;
import edu.brook.ascape.rule.*;
import edu.brook.ascape.util.*;
import java.awt.Color;
/**
* An agent for the VoterScape world. Votes according to the opinion of
* a randomly chosen 'moore' neighbour.
*
* See also dave.ascape.voters2.VoterScape.java
*/
public class Voter extends CellOccupant {
public Voter() {}
getScape().addRule(ITERATE_AND_UPDATE_RULE);
}
The program consists of two files, VoterScape.java and Voter.java (in package dave.ascape.voters3).
The code below is colour coded. Important methods and classes are bolded when they first appear.
● red. a method which will be called by Ascape
● dark blue. often used methods or fields from the Ascape API.
This version of the Voter Game adds a histogram view of the vote counts for the parties. The program
also pauses on startup.
The code in smaller font is identical to the code in part 1 of this tutorial. Note that the file names are the
same as those of part 1 but theyare in diffent packages.
*
* In this version, vote counts for the parties are collected and
* displayed (by default) in a histogram.
*
*/
public class VoterScape extends ScapeVector {
// VoterScape is the root scape
private int numberOfParties = 3;
private int latticeWidth = 50;
private int latticeHeight = 50;
ScapeGraph lattice; // the agents' environment
/*
* Putting Ascape into pause right away allows the user to see the
* initial situation. The alternative is to cale setStartOnOpen(false) , for example in
onSetup().
*/
public void onStart() {
pause();
}
public void createViews() {
super.createViews();
//Now, add a simple overhead view so that we can view the lattice:
overheadView = new Overhead2DView();
//Set its cell size to 12
overheadView.setCellSize(12);
//add it to the lattice so that it can view and be controlled by it
lattice.addView(overheadView);
/*
The following code shows how to add some statistic collection to the Voter Agent and
have Ascape display it for your. The stats are collected using inner classes. Serveral
ways of doing this are shown.
The code is straightforward except for one trick which was ot obvious to me.
The trick.
*/
voters.addStatCollectors(stats);
super(name);
}
}
} // end VoterScape
Voter.java (source)
package dave.ascape.voters2;
import edu.brook.ascape.model.*;
import edu.brook.ascape.view.*;
import edu.brook.ascape.rule.*;
import edu.brook.ascape.util.*;
import java.awt.Color;
/**
* An agent for the VoterScape world. Votes according to the opinion of
* a randomly chosen 'moore' neighbour.
*
Notes on Voter.java
1. scape.getModel().getNumberOfParties().
This line has some interesting features. The number of parties is held by the numberOfParties variable in
the root Scape (VoterScape). So the idea is to tell the agent how many parties there are. This way of
doing this (rather than, for example, passing the information as a constructor argument) allows the user to
change the number of parties at run time.
For the Voter agent to get at the getNumberOfParties() method of the VoterScape class requires the two
steps shown: 'scape' and 'getModel()'. What is going on?
scape is protected field of th class, AscapeObject. Since the AscapeObject class is the root of the Ascape
system, this fields is inherited by all Ascape objects. It represents the scape (agent) to which the agent in
whose code the 'scape' variable appears, belongs.
In the VoterScape example, consider these two lines in the CreateScape() method,
voters = new ScapeVector();
voters.setPrototypeAgent(voter);
The ScapeVector, voters, "ownes" the voter agent. So, 'scaper' referes to this Scape.
Another line of the code is,
addAgent(voters);
The votes Scape is added to the root Scape, VoterScape by this instruction.
This is where getModel() comes in. getModel() is a method of the Agent class. It gets the root scape, in
this case the Scape owning the voters Scape. This is just the VoterScape class which contains the
variables and methods which describe the global properties of the model being designed,