Technical overview

From: Drew McDermott <drew.mcdermott@yale.edu>
Date: Sun Mar 05 2006 - 13:30:40 EST

Here is the revised technical overview. I have spent hours polishing
off various rough edges. It's amazing how much crap is in the Process
section. Obviously no one has ever actually read it! I could drop
the Prophecies of Nostradamus into the RDF in there and no one would
ever notice. I've deleted a few low-level things like the list and
bag definitions, but I've added more than I've deleted. Hopefully the
new examples make up for the other stuff, but no one's gonna read it
anyway!

                                             -- Drew

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>OWL-S: Semantic Markup for Web Services</title>

<link rel="section" href="#1"/>
<link rel="section" href="#2"/>
<link rel="section" href="#3"/>
<link rel="section" href="#4"/>
<link rel="section" href="#5"/>
<link rel="section" href="#6"/>
<link rel="section" href="#7"/>
<link rel="section" href="#acknowledgments"/>
<link rel="section" href="#references"/>

<link rel="stylesheet" type="text/css" href="spec.css"/>
<!-- <link rel="stylesheet" type="text/css" href="owl-xml.css" /> -->
<link rel="stylesheet" type="text/css" href="owl-s.css" />

</head>

<body>

<div class="head">

<div class="head">

<h1><a name="ST" />
<b>OWL-S: Semantic Markup for Web Services</b>
</h1>

<dl>
<dt>Authors:</dt><dd>
David Martin,
SRI International (editor)<br/>
Mark Burstein,
BBN Technologies<br/>
Jerry Hobbs,
USC Information Sciences Institute (*)<br/>
Ora Lassila,
Nokia<br/>
Drew McDermott,
Yale University<br/>
Sheila McIlraith,
University of Toronto (**) <br/>
Srini Narayanan,
International Institute of Computer Science (*)<br/>
Massimo Paolucci,
Carnegie Mellon University<br/>
Bijan Parsia,
The MIND Laboratory of the University of Maryland at College Park<br/>
Terry Payne,
University of Southampton<br/>
Evren Sirin,
The MIND Laboratory of the University of Maryland at College Park<br/>
Naveen Srinivasan,
Carnegie Mellon University<br/>
Katia Sycara,
Carnegie Mellon University<br/>
</dd></dl>

 (*) Jerry Hobbs and Srini Narayanan were affiliated with SRI
International when their work on OWL-S was done. <br />

(**) Sheila McIlraith was affiliated with Stanford University
(Knowledge Systems Laboratory) for a substantial part of the time that
she worked on OWL-S.

</div>

<hr/>

</div>

<h2><a id="abstract" name="abstract">Abstract</a></h2>

<div class="abstract">
<p>
The Semantic Web should enable greater access not only to content but
also to services on the Web. Users and software agents should be able
to discover, invoke, compose, and monitor Web resources offering
particular services and having particular properties, and should be
able to do so with a high degree of automation if desired. Powerful
tools should be enabled by service descriptions, across the Web service lifecycle.
OWL-S (formerly DAML-S) is an ontology of services
that makes these functionalities
possible. In this document we describe the overall structure of
the ontology and its three main parts: the service <em>profile</em> for
advertising and discovering services; the <em>process model</em>, which gives a
detailed description of a service's operation; and the <em>grounding</em>,
which provides details on how to interoperate with a service, via
messages.
</p>
<p>
Following the layered approach
     to markup language development, the current version of OWL-S
     builds on the <a href="http://www.w3.org/TR/owl-ref/">Ontology
     Web Language (OWL)</a> Recommendation produced by the<a
     href="http://www.w3.org/2001/sw/WebOnt/">Web-Ontology Working
     Group
     </a> at the World Wide Web Consortium (W3C).
</p>
</div>

<hr/>

</div>

<div class="toc">

<h2><a id="contents" name="contents">Table of contents</a></h2>

<ul class="toc">
<li class="tocline1">1. Introduction: Services on the Semantic Web
    </li>
<li class="tocline1">2. Some Motivating Tasks
    </li>
<li class="tocline1">3. An Upper Ontology for Services
    </li>
<li class="tocline1">4. Service Profiles</li>
<li class="tocline1">5. Modeling Services as Processes
    </li>
<li class="tocline1">6. Grounding a Service to a Concrete Realization
    </li>
<li class="tocline1">7. Summary and Current Status
    </li>
</ul>

<ul class="toc">
<li class="tocline1">Appendix A. Note on Input/Output Type Compatiblity
    </li>
<li class="tocline1">Appendix B. <a href="#AppendixB">Note on a
Convention for Notating Lists in OWL-S</a>
    </li>
</ul>

<ul class="toc">
<li class="tocline1">Acknowledgments </li>
<li class="tocline1">References </li>
</ul>

<hr/>

</div>

<h1><a name="1"></a>1. Introduction: Services on the Semantic Web </h1>

<p>

Efforts toward the creation of the Semantic Web are gaining momentum
&#91;<a
 href="#Berners-Lee-Hendler-Lassila">1</a>&#93;. Soon it will be possible to access Web
resources by content rather than just by keywords. A significant
force in this movement is the development of a new generation of Web
markup languages such as OWL&#91;<a
 href="#OWLReference">16</a>&#93; and its predecessor
DAML+OIL &#91;<a
 href="#Hendler-McGuinness">7</a>,<a
 href="#DAML-OILReference">9</a>&#93;.
These languages enable the creation of
ontologies for any domain and the instantiation of these ontologies in
the description of specific Web sites.
These languages are also amenable to efficient reasoning procedures
and thus reasoning applications can be built to automatically
determine the logical consequences of the ontological statements.
</p>

<p>
Among the most important Web resources are those that provide
services. By ``service'' we mean Web sites that do not merely provide
static information but allow one to effect some action or change in
the world, such as the sale of a product or the control of a physical
device. The Semantic Web should enable users to locate, select,
employ, compose, and monitor Web-based services automatically.
</p>

<p>
To make use of a Web service, a software agent needs a
computer-interpretable description of the service, and the means by
which it is accessed. An important goal for Semantic Web markup
languages, then, is to establish a framework within which these
descriptions are made and shared. Web sites should be able to employ a
standard ontology, consisting of a set of basic classes and
properties, for declaring and describing services, and the ontology
structuring mechanisms of OWL provide an appropriate, Web-compatible
representation language framework within which to do this.
</p>

<p>
This paper describes a collaborative effort by researchers at several
organizations to define just such an ontology. We call this ontology
OWL-S<a name="tex2html2"
  href="#foot174"><sup>1</sup></a>. In what follows, we will first
  motivate OWL-S in terms of some
sample tasks that it is designed to support. In the central part of
the paper we describe the upper ontology for services that we have
developed, including its subontologies for profiles, processes, and
groundings. The ontology is still evolving, and making connections to
other development efforts, such as those building ontologies of time
and resources. We will sometimes refer to the OWL-S ontology as a
<em>language</em> for describing services, reflecting the fact that it provides
a standard vocabulary that can be used together with the other aspects
of the OWL description language to create service descriptions.
</p>

<p>
This paper reflects the authors' design consensus as of OWL-S version
1.1, which is available at &#91;<a
href="#damls-url">3</a>&#93;. Please note that, in addition
to the OWL ontology files, the release site includes examples and
additional forms of documentation, including, in particular, a code
walk-through illustrative of many points in this document, additional
explanatory material (in HTML) regarding the grounding and the use of
profile-based class hierarchies, and information about the status of
this work, including unresolved issues and future directions.
</p>

<hr/>

<h1><a name="2"></a>2. Some Motivating Tasks </h1>

<p>

We will be considering both primitive, or ``atomic'' services, and
complex or "composite" services. Atomic services are ones where a
single Web-accessible computer program, sensor, or device is invoked
by a request message, performs its task and perhaps produces a single
response to the requester. With atomic services there is no ongoing
interaction between the user and the service. For example, a service
that returns a postal code or the longitude and latitude when given an
address would be in this category. In contrast, complex or 'composite'
services are composed of multiple more primitive services, and may
require an extended interaction or conversation between the requester
and the set of services that are being utilized. One's interaction
with www.amazon.com to buy a book is like this; the user searches for
books by various criteria, perhaps reads reviews, may or may not
decide to buy, and gives credit card and mailing information. OWL-S is
meant to support both categories of services, but complex services
have motivated many of the ontology's elements.
The following
three task types will give the reader an idea of the kinds of tasks
we expect OWL-S to enable &#91;<a
 href="#McIlraith-al-SemWeb">17</a>,<a
 href="#McIlraith-al-IEEE">18</a>&#93;.
</p>

<ol>
<li><b>Automatic Web service discovery.</b>
Automatic Web service discovery is an automated process for location
of Web services that can provide a particular class of service
capabilities, while adhering to some client-specified constraints.
For
example, the user may want to find a service that sells airline
tickets between two given cities and accepts a particular credit card.
Currently, this task must be performed by a human who might use a
search engine to find a service, read the Web page, and execute the
service manually, to determine if it satisfies the constraints. With
OWL-S markup of services, the information necessary for Web service
discovery could be specified as computer-interpretable semantic markup
at the service Web sites, and a service registry or ontology-enhanced
search engine could be used to locate the services
automatically. Alternatively, a server could proactively advertise
itself in OWL-S with a service registry, also called middle agent
&#91;<a
 href="#Decker:97">4</a>,<a
 href="#Wong00">25</a>,<a
 href="#Martin:OAA">15</a>&#93;, so that requesters can find it
when they query the registry. Thus, OWL-S enables declarative
advertisements of service properties and capabilities that can be used
for automatic service discovery.

</li>
<li><b>Automatic Web service invocation.</b>
Automatic Web service invocation is the automatic invocation of an Web
service by a computer program or agent, given only a declarative
description of that service, as opposed to when the agent has been
pre-programmed to be able to call that particular service. This is
required,for example, so that a user can request the purchase, from a
site found by searching and then selected by that user, of an airline
ticket on a particular flight. Execution of a Web service can be
thought of as a collection of remote procedure calls. OWL-S markup of
Web services provides a declarative, computer-interpretable API that
includes the semantics of the arguments to be specified when executing
these calls, and the semantics of that is returned in messages when
the services succeed or fail. A software agent should be able to
interpret this markup to understand what input is necessary to invoke
the service, and what information will be returned. OWL-S, in
conjunction with domain ontologies specified in OWL, provides standard
means of specifying declaratively APIs for Web services that enable
this kind of automated Web service execution.

</li>
<li><b>Automatic Web service composition and interoperation.</b>
This task involves the automatic selection, composition, and
interoperation of Web services to perform some complex task, given a
high-level description of an objective. For example, the user may want
to make all the travel arrangements for a trip to a
conference. Currently, the user must select the Web services, specify
the composition manually, and make sure that any software needed for
the interoperation of services that must share information is
custom-created. With OWL-S markup of Web services, the information
necessary to select and compose services will be encoded at the
service Web sites. Software can be written to manipulate these
representations, together with a specification of the objectives of
the task, to achieve the task automatically. To support this, OWL-S
provides declarative specifications of the prerequisites and
consequences of application of individual services , and a language
for describing service compositions and data flow interactions.

</li>
</ol>

<p>
Any Web-accessible program/sensor/device that is <em>declared</em> as a
service will be regarded as a service. OWL-S does not preclude
declaring simple, static Web pages to be services. But our primary
motivation in defining OWL-S has been to support more complex tasks
of the kinds described above.

</p>

<hr/>

<h1>3. An Upper Ontology for Services <a name="3"></a>
</h1>

<p>
Our structuring of the ontology of services is motivated by the need
to provide three essential types of knowledge about a service (shown
in Figure 1), each characterized by the question it
answers:

</p>

<ul>
<li><i>What does the service provide for prospective clients?</i> The
answer to this question is given in the "profile<a name="tex2html3"
href="#foot273"><sup>2</sup></a>," which is used to advertise the
service. To capture this perspective, each instance of the class
Service presents a ServiceProfile.
</li>
<li><i>How is it used?</i> The answer to this question is given in the
"process model." This perspective is captured by the ServiceModel
class. Instances of the class Service use the property describedBy to
refer to the service's ServiceModel.
</li>
<li><i>How does one interact with it?</i> The answer to this question
is given in the "grounding." A grounding provides the needed
details about transport protocols. Instances of the class
Service have a supports property referring to a ServiceGrounding.
</li>
</ul>

<p>
The class Service provides an organizational point of reference
for a declared Web service; one instance of Service will exist
for each distinct published service. The properties <i>presents</i>,
<i>describedBy</i>, and <i>supports</i> are properties of Service.
The classes ServiceProfile, ServiceModel, and ServiceGrounding are the respective ranges of those properties.
Each instance of Service will <i>present</i> a
ServiceProfile description, be <i>describedBy</i> a
ServiceModel description, and
<i>support</i> a ServiceGrounding description. The details of profiles, models, and
groundings may vary widely from one type of service to another--that
is, from one instance of Service to another. But each
of these three service perspectives provides an essential type of information about
the service, as we explain below.
</p>
<p>
Generally speaking, the ServiceProfile provides the information needed
for an agent to discover a service, while the ServiceModel and
ServiceGrounding, taken together, provide enough information for an
agent to make use of a service, once found.

</p>

<ins>
<a name="service_class"></a><a name="274"></a>
<table>
<caption><strong>Figure 1:</strong> Top level of the service ontology</caption>
<tr><td><img
     width="418" height="266"
 src="Service-Ontology1.1.gif"
 alt="Service-Ontology1.1.gif" /></td></tr>
</table>
</ins>
<!-- used with pre-Terry figure:
     width="550" height="444" -->
<!-- actual size of current image:
     width="418" height="266" -->

<p>
The service profile tells "what the service does", in a way that is
suitable for a service-seeking agent (or
matchmaking agent acting on behalf of a service-seeking agent) to
determine whether the service meets its needs.
This form of representation includes a description of what is accomplished by the service, limitations on service applicability and quality of service, and requirements that the service requester must satisfy to use the service successfully.
</p>
<p>
The service model tells a client how to use the service, by detailing
the semantic content of requests, the conditions under which
particular outcomes will occur, and, where necessary, the step by step
processes leading to those outcomes. That is, it describes how to ask
for the service and what happens when the service is carried out. For
nontrivial services (those composed of several steps over time), this
description may be used by a service-seeking agent in at least four
different ways: (1) to perform a more in-depth analysis of whether the
service meets its needs; (2) to compose service descriptions from
multiple services to perform a specific task; (3) during the course of
the service enactment, to coordinate the activities of the different
participants; and (4) to monitor the execution of the service.
</p>
<p>
A service grounding ("grounding" for short) specifies the details of
how an agent can access a service. Typically a grounding will specify
a communication protocol, message formats, and other service-specific
details such as port numbers used in contacting the service. In
addition, the grounding must specify, for each semantic type of input
or output specified
in the ServiceModel, an unambiguous way of exchanging data
elements of that type with the service (that is, the serialization
techniques employed).

</p>
<p>
The upper ontology for services specifies only two cardinality
constraints: a service can be described by at most one service model,
and a grounding must be associated with exactly one service. The upper
ontology deliberately does not specify any minimum cardinality for the
properties <i>presents</i> or <i>describedBy</i>. (Although, in
principle, a service needs all three properties to be fully
characterized, it is easy to imagine situations in which a partial
characterization could be useful.) Nor does the upper ontology
specify any maximum cardinality for <i>presents</i> or <i>supports</i>.
(It will be extremely useful for some services to offer multiple
profiles and/or multiple groundings.)

</p><p>
Finally, it must be noted that while we define one particular upper
ontology for profiles, one for service models, and one for groundings,
nevertheless OWL-S allows for the construction of alternative
approaches in each case. Our intent here is <em>not</em> to prescribe a
single approach in each of the three areas, but rather to provide
default approaches that will be useful for the majority of cases.
In the following three sections we discuss the resulting service profile,
service model, and service grounding in greater detail.
</p>

<hr/>

<h1><a name="4"></a>4. Service Profiles</h1>

<p>
A transaction in a web services marketplace involves three parties:
the service requesters, the service provider, and infrastructure
components &#91;<a
 href="#Sycara-al-SIGMOD">24</a>,<a
 href="#Wong00">25</a>&#93;. The service requester,
which may broadly identify with the buyer, seeks a service to complete
its work; the service provider, which can be broadly identified with
the seller, provides a service sought by the requester. In an open
environment such as the Internet, the requester may not know ahead of
time of the existence of the provider, so the requester relies on
infrastructure components that act like registries to find the
appropriate provider. For instance, a requester may need a news
service that reports stock quotes with no delay with respect to the
market. The role of the registries is to match the request with the
offers of service providers to identify which of them is the best
match. Within the OWL-S framework, the Service Profile provides a
way to describe the services offered by the providers, and the
services needed by the requesters.

</p><p>
The Service Profile does not mandate any representation of services;
rather, using the OWL subclassing it is possible to create specialized
representations of services that can be used as service profiles.
OWL-S provides one possible representation through the class Profile.
An OWL-S Profile describes a service as a function of three basic
types of information: what organization provides the service, what
function the service computes, and a host of features that specify
characteristics of the service. The three pieces of information are
reviewed in order below.

</p><p>
The provider information consists of contact information that refers
to the entity that provides the service. For instance, contact
information may refer to the maintenance operator that is responsible
for running the service, or to a customer representative that may
provide additional information about the service.

</p><p>
The functional description of the service is expressed in terms of the
transformation produced by the service. Specifically, it specifies
the inputs required by the service and the outputs generated;
furthermore, since a service may require external conditions to be
satisfied, and it has the effect of changing such conditions, the
profile describes the preconditions required by the service and the
expected effects that result from the execution of the service. For
example, a selling service may require as a precondition a valid
credit card and as input the credit card number and expiration date.
As output it generates a receipt, and as effect the card is charged.

</p><p>
Finally, the profile allows the description of a host of properties
that are used to describe features of the service. The first type of
information specifies the category of a given service, for example,
the category of the service within the UNSPSC classification system.
The second type of information is quality rating of the service: some
services may be very good, reliable, and quick to respond; others may
be unreliable, sluggish, or even malevolent. Before using a service,
a requester may want to check what kind of service it is dealing with;
therefore, a service may want to publish its rating within a specified
rating system, to showcase the quality of service it provides. It is
up to the service requester to use this information, to verify that it
is indeed correct, and to decide what to do with it. The last type of
information is an unbounded list of service parameters that can
contain any type of information. The OWL-S Profile provides a mechanism
for representing such parameters; which might include parameters that
provide an estimate of the max response time, to the geographic
availability of a service.

</p>

<h2><a name="SECTION00041000000000000000"></a>
4.1 Compiling a Profile: The Relation with Process Model
</h2>

<p>
The Profile of a service provides a concise description of the
service to a registry, but once the service has been selected the
Profile is useless; rather, the client will use the Process Model to
control the interaction with the service. Although the Profile and
the Process Model play different roles during the transaction between
Web services, they are two different representations of the same
service, so it is natural to expect that the input, output,
precondition, and effects (hereafter IOPEs) of one are reflected in the
IOPEs of the other.

</p><p>
OWL-S does not dictate any constraint between Profiles and Process
Models, so the two descriptions may be inconsistent without affecting
the validity of the OWL expression. Still, if the Profile represents
a service that is not consistent with the service represented in the
Process Model, the interaction will break at some point. As an
extreme example, imagine a service that advertises as a travel agent,
but adopts the process model of a book selling agent; it will be
selected to reserve travels, but it will fail to do that, asking
instead for book titles and ISBN numbers. On the other side, it will
never be selected by services that want to buy books, so it will never
sell a book either.

</p><p>
The selection of the IOPEs to specify in the Profile is quite a tricky
process. It should avoid misrepresentation of the service, so ideally
it would require all the IOPEs used in the Process Model. On the other
side, some of those IOPEs may be so general that they do not describe
the service. Another thing to consider is the registry's algorithm
for matching requests with providers. Furthermore, the Profile
implicitly specifies the intended purpose of the service: it
advertises those functionalities that the service wants to provide,
while it may hide (not declare publicly) other functionalities. As an
example, consider a book-selling service that may involve two
functionalities: the first one allows other services to browse its
site to find books of interest, and the second one allows users to buy
the books they found. The book seller has the choice of advertising
just the book-buying functionality or both the browsing functionality
and the buying functionality. In the latter case, the service makes
public the fact that it can provide browsing services, and it allows
everybody to browse its registry without buying a book. In contrast,
by advertising only the book-selling functionality, but not the
browsing, the agent discourages browsing by requesters who do not
intend to buy. The decision as to which functionalities to advertise
determines how the service will be used: a requester who intends to
browse but not to buy would select a service that advertises both
buying and browsing capabilities, but not one that advertises buying
only.

</p><p>
In the description so far, we tacitly assumed a registry model in
which service capabilities are advertised, and then matched
against requests of service. This is the model adopted by
registries like UDDI. While this is the most likely model to be
adopted by Web services, other forms of registry are also
possible. For example, when the demand for a service is higher
than the supply, then advertising needs for service is more
efficient then advertising offered services since a provider can
select the next request as soon as it is free; furthermore, in a
pure P2P architecture there would be no registry at all. Indeed
the types of registry may vary widely and as many as 28 different
types have been identified &#91;<a
 href="#Wong00">25</a>,<a
 href="#Decker:97">4</a>&#93;. By using a
declarative representation of Web services, the service profile is
not committed to any form of registry, but it can be used in all
of them. Since the service profile represents both offers of
services and needs of services, then it can be used in a reverse
registry that records needs and queries on offers. Indeed, the
Service Profile can be used in all 28 types of registry.

</p>

<h2><a name="SECTION00042000000000000000"></a>
4.2 Profile Properties
</h2>

<p>
In the following we describe in detail the main parts of the
profile model; we classify them into four sections: the first one
(4.2.1) describes the properties that link the
Service Profile class with the Service class and Process Model
class; the second section (4.2.2) describes the form of
contact information and the Description of the profile -- this is
information usually intended for human consumption; in the third
section (4.2.3), we discuss the functional
representation in terms of IOPEs; finally, in the last section
(4.2.4), we describe the attributes of the Profile.

</p>

<h3><a name="SECTION00042100000000000000"></a>
<a name="ServiceProfile"></a><br />
4.2.1 Service Profile
</h3>

<p>
The class ServiceProfile provides a superclass of every type of
high-level description of the service. ServiceProfile does not
mandate any representation of services, but it mandates the basic
information to link any instance of profile with an instance of
service.

</p><p>
There is a two-way relation between a service and a profile, so that
a service can be related to a profile and a profile to a service.
These relations are expressed by the properties <tt>presents</tt> and
<tt>presentedBy</tt>.</p>

<dl>
<dt><strong>presents</strong></dt>
<dd>describes a relation between an instance of service
 and an instance of profile, it basically says that the service is
 described by the profile.
</dd>

<dt><strong>presentedBy</strong></dt>
<dd>is the inverse of <tt>presents</tt>; it specifies
 that a given profile describes a service.
</dd>
</dl>

<h3><a name="SECTION00042200000000000000"></a>
<a name="Contacts"></a><br />
4.2.2 Service Name, Contacts and Description
</h3>

<p>
Some properties of the profile provide human-readable information that
is unlikely to be automatically processed. These properties include
<tt>serviceName</tt>, <tt>textDescription</tt> and <tt>contactInformation</tt>.
A profile may have at most one service name and text description, but
as many items of contact information as the provider wants to offer.

</p>
<dl>
<dt><strong>serviceName</strong></dt>
<dd>refers to the name of the service that is being
offered. It can be used as an identifier of the service.

</dd>
<dt><strong>textDescription</strong></dt>
<dd>provides a brief description of the service. It
summarizes what the service offers, it describes what the service
requires to work, and it indicates any additional information that the
compiler of the profile wants to share with the receivers.

</dd>
<dt><strong>contactInformation</strong></dt>
<dd>provides a mechanism of referring to humans or
individuals responsible for the service (or some aspect of the service).
The range of this property is unspecified within OWL-S, but can be
restricted to some other ontology, such as FOAF, VCard, or the now
depreciated Actor class provided in previous versions of OWL-S.

</dd>
</dl>

<h3><a name="SECTION00042300000000000000"></a>
<a name="Functional"></a><br />
4.2.3 Functionality Description
</h3>

<p>
An essential component of the profile is the specification of what
functionality the service provides and the specification of the
conditions that must be satisfied for a successful result. In
addition, the profile specifies what conditions result from the
service, including the expected and unexpected results of the
service activity. The OWL-S Profile represents two aspects of the
functionality of the service: the information transformation
(represented by inputs and outputs) and the state change produced
by the execution of the service (represented by preconditions and
effects). For example, to complete the sale, a book-selling
service requires as input a credit card number and expiration
date, but also the precondition that the credit card actually
exists and is not overdrawn. The result of the sale is the output
of a receipt that confirms the proper execution of the
transaction, and as effect the transfer of ownership and the
physical transfer of the book from the warehouse of the seller
to the address of the buyer.

</p><p>
The Profile ontology does not provide a schema to describe IOPE
instances. However, such a schema exists in the Process ontology,
as discussed in the next section. Ideally, we envision that the
IOPE's published by the Profile are a subset of those published by
the Process. Therefore, the Process part of a description will
create all the IOPE instances and the Profile instance can simply
point to these instances. In this case a single instance is
created for any IOPE, unlike in previous versions of OWL-S when,
for a certain IOPE, an instance was created both in the Profile
and Process part of the OWL-S description. However, if the IOPE's
of the Profile are different from those of the Process, the
Profile can still create its own IOPE instances using the schema
offered by the Process ontology.

</p><p>
The Profile ontology defines the following properties of the
Profile class for pointing to IOPE's:

</p>
<dl>
<dt><strong>hasParameter</strong></dt>
<dd>ranges over a Parameter instance of the Process
  ontology. Note that the Parameter class models our intuition that
  Inputs and Outputs (which are kinds of Parameters) are both
  involved in information transformation and therefore they are
  different from Preconditions and Effects. As a consequence, we
  do not expect this class to be instantiated. It's role is solely
  making domain knowledge explicit.

</dd>
<dt><strong>hasInput</strong></dt>
<dd>ranges over instances of Inputs as defined in the
  Process Ontology.

</dd>
<dt><strong>hasOutput</strong></dt>
<dd>ranges over instances of type Output, as defined in
  the Process ontology.

</dd>
<dt><strong>hasPrecondition</strong></dt>
<dd>specifies one of the preconditions of the
  service and ranges over a Precondition instance defined according to
  the schema in the Process ontology.

</dd>
<dt><strong>hasResult</strong></dt>
<dd>specifies one of the results of the service, as
  defined by the Result class in the Process ontology. It specifies
  under what conditions the outputs are generated. Furthermore,
  the Result specifies what domain changes are produced during the
  execution of the service.

</dd>
</dl>

<p>See Figure &nbsp;2, which shows
selected classes and properties of the Profile.
</p>

<p>
<a name="profile_class"></a><a name="967"></a>
<ins>
<table>
<caption><strong>Figure 2:</strong>
Selected classes and properties of the Profile</caption>
<tr><td><img
 src="Profile-Ontology-1.1ai.gif"
 alt="Profile-Ontology-1.1ai.gif" /></td></tr>
</table>
</ins>
</p>

<h3><a name="SECTION00042400000000000000"></a>
<a name="Attributes"></a><br />
4.2.4 Profile Attributes
</h3>

<p>
In the previous section we introduced the functional description of
services, but there are other aspects of services of which users
should be aware. These additional attributes include the quality
guarantees that are provided by the service, possible classification
of the service, and additional parameters that the service may want to
specify.

</p>
<dl>
<dt><strong>serviceParameter</strong></dt>
<dd>is an expandable list of properties that may
   accompany a profile description. The value of the property is an
   instance of the class ServiceParameter (4.2.5).

</dd>
<dt><strong>serviceCategory</strong></dt>
<dd>refers to an entry in some ontology or
   taxonomy of services. The value of the property is an instance of
   the class ServiceCategory (4.2.6)

</dd>
</dl>

<h3><a name="SECTION00042500000000000000"></a>
<a name="ServiceParameter"></a><br />
4.2.5 ServiceParameter
</h3>

<dl>
<dt><strong>serviceParameterName</strong></dt>
<dd>is the name of the actual parameter,
   which could be just a literal, or perhaps the URI of the process
   parameter (a property).

</dd>
<dt><strong>sParameter</strong></dt>
<dd>points to the value of the parameter within some
   OWL ontology.

</dd>
</dl>

<h3><a name="SECTION00042600000000000000"></a>
<a name="ServiceCategory"></a><br />
4.2.6 ServiceCategory
</h3>

<p>
ServiceCategory describes categories of services on the bases of some
classification that may be outside OWL-S and possibly outside
OWL. In the latter case, they may require some specialized reasoner
if any inference has to be done with it.

</p>

<dl>
<dt><strong>categoryName</strong></dt>
<dd>is the name of the actual category, which could
   be just a literal, or perhaps the URI of the process parameter (a
   property).
</dd>

<dt><strong>taxonomy</strong></dt>
<dd>stores a reference to the taxonomy scheme. It can
   be either a URI of the taxonomy, or a URL where the taxonomy
   resides, or the name of the taxonomy or anything else.
</dd>

<dt><strong>value</strong></dt>
<dd>points to the value in a specific taxonomy There may
   be more than one value for each taxonomy, so no restriction is
   added here.

</dd>
<dt><strong>code</strong></dt>
<dd>to each type of service stores the code associated to a
   taxonomy.
</dd>
</dl>

<h3><a name="SECTION00042700000000000000"></a>
<a name="TypeAndProduct"></a><br />
4.2.7 Specifying Service Type and Product
</h3>

<p>
The two properties, <strong>serviceClassification</strong> and <strong>
serviceProduct</strong>, are used to specify the type of service
provided and the products that are handled by the service. The values
of the two properties are instances of classes specified in OWL
ontologies of services and products. The properties
serviceClassification and serviceProduct are similar to
serviceCategory described above, but they differ in that the values of
the properties are OWL instances rather than strings referring to some
non-OWL business taxonomy.
</p>

<dl>

<dt><strong>serviceClassification</strong></dt>
<dd> defines a mapping from a Profile to an OWL ontology of
services, such as an OWL specification of NAICS.
</dd>

<dt><strong>serviceProduct</strong></dt>
<dd>defines a mapping from a Profile to an OWL ontology of
products, such as an OWL specification of UNSPSC.
</dd>
</dl>

<hr />

<h1>5. Modeling Services as Processes<a name="5"></a></h1>

<p>
To give a detailed perspective on how to interact with
a service, it can be viewed as a
<i>process</i>.
Specifically, OWL-S 1.1 defines a subclass of <tt>
ServiceModel</tt>, <tt>Process</tt>, which draws upon
well-established work in a variety of fields, including work in AI on
standardizations of planning languages [<a
 href="#PDDL">6</a>], work on languages for business processes [<a
 href="#BPEL">26</a>],
work in
programming languages and distributed systems [<a
 href="#Picalc">20</a>,<a
 href="#Mes92">19</a>],
emerging standards in process modeling and workflow technology such as
the NIST's Process Specification Language (PSL) [<a
 href="#PSL">22</a>] and the
Workflow Management Coalition effort (http://www.aiim.org/wfmc),
work
on modeling verb semantics and event structure [<a
 href="#Nara99">21</a>], previous
work on action-inspired Web service markup [<a
 href="#McIlraith-al-IEEE">18</a>],
work in AI on modeling complex actions [<a
 href="#lev97">13</a>], and work in agent
communication languages [<a
 href="#Martin:OAA">15</a>,<a
 href="#KQML">5</a>].
</p>

<p>
It is important to understand that a process is not a program to be
executed. It is a specification of the ways a client may interact
with a service. An <i>atomic</i> process is a description of a
service that expects one (possibly complex) message and returns one
(possibly complex) message in response. A
<i>composite</i> process is one that maintains some state; each
message the client sends
advances it through the process.
</p>

<p>
A process can have two sorts of purpose.
First, it can generate and return some new information based on
information it is given and
the world state. Information production is described by the inputs
and outputs of the process.
Second, it can produce a change in the
world. This transition is described
by the preconditions and effects of the process.
</p>

<p>
A process can have any number of inputs (including zero),
representing the information
that is, under some conditions, required for the performance of the
process. It can have any number of outputs, the information that the
process provides to the requester.
There can be any number of preconditions,
which must all hold in order for the process to be successfully invoked. Finally,
the process can have any number of effects. Outputs and effects can
depend on conditions that hold true of the world state at the time the
process is performed. (We use the term <i>perform</i> instead of
<i>execute</i> to de-emphasize the traditional picture of a single
agent being responsible for the occurrence of the process.)
</p>

<p>
Before we can go into the details of how processes work, it's
necessary to explain how inputs, outputs, preconditions, and results
(colloquially known as IOPRs) work, because fitting them into the OWL
framework requires bending the rules somewhat.
</p>

<h2><a name="SECTION00051000000000000000"></a>
5.1 Parameters and Expressions
</h2>

<p>
Inputs and outputs are subclasses of a general class called
<tt>Parameter</tt>, itself a subclass of <tt>ProcessVaar</tt>.
It's convenient to identify
 process vars with what are called <i>variables</i> in SWRL, the
 language for expressing OWL Rules.
</p>

<pre>
&lt;owl:Class rdf:about="#ProcessVar"&gt;
  &lt;rdfs:subClassOf rdf:resource="&amp;swrl;#Variable"/&gt;
&lt;/owl:Class&gt;
</pre>
<p>
Every process var has a type, specified using a URI. This is not the
OWL class the variable belongs to, but a specification of the
class (or datatype) its <i>values</i> belong to.
<pre>
&lt;owl:DatatypeProperty rdf:ID="parameterType"&gt;
  &lt;rdfs:domain rdf:resource="#ProcessVar"/&gt;
  &lt;rdfs:range rdf:resource="&amp;xsd;anyURI"/&gt;
&lt;/owl:DatatypeProperty&gt;
</pre>
</p>

<!-- This is not actually in the Process.owl file; should it be?
&lt;owl:Class rdf:ID="ProcessVar"&gt;
 &lt;rdfs:subClassOf&gt;
   &lt;owl:Restriction&gt;
     &lt;owl:onProperty rdf:resource="#parameterType" /&gt;
     &lt;owl:minCardinality rdf:datatype="&amp;xsd;#nonNegativeInteger"&gt;
              1&lt;/owl:minCardinality&gt;
   &lt;/owl:Restriction&gt;
 &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;
-->

<p>
Process vars are the disjoint union of several subclasses:
<pre>
&lt;owl:Class rdf:ID="ProcessVar"&gt;
 &lt;rdfs:subClassOf&gt;
   &lt;owl:Restriction&gt;
     &lt;owl:onProperty rdf:resource="#parameterType" /&gt;
     &lt;owl:cardinality rdf:datatype="&amp;xsd;#nonNegativeInteger"&gt;1&lt;/owl:cardinality&gt;
   &lt;/owl:Restriction&gt;
 &lt;/rdfs:subClassOf&gt;
 &lt;owl:unionOf rdf:parseType="Collection"&gt;
   &lt;owl:Class rdf:about="#Parameter"/&gt;
   &lt;owl:Class rdf:about="#Existential"/&gt;
   &lt;owl:Class rdf:about="#Participant"/&gt;
   &lt;owl:Class rdf:aobut="#ResultVar"/&gt;
   &lt;owl:Class rdf:about="#Local"/&gt;
 &lt;/owl:unionOf&gt;
&lt;/owl:Class&gt;
</pre>
We'll describe each of these (and provide the
disjointness conditions) in the appropriate place.
Note that we use the term <tt>parameterType</tt> to refer to the types
of all <tt>ProcessVar</tt>s, not just <tt>Parameter</tt>s. We like
the way it sounds, and the alternatives don't seem any clearer.
</p>

<p>Parameters are the disjoint union of Inputs and Outputs.
<pre>
&lt;owl:Class rdf:ID="Parameter"&gt;
  &lt;rdfs:comment&gt;
      Parameter is the disjoint union of Input and Output
  &lt;/rdfs:comment&gt;
  &lt;owl:unionOf rdf:parseType="Collection"&gt;
    &lt;owl:Class rdf:about="#Input"/&gt;
    &lt;owl:Class rdf:about="#Output"/&gt;
  &lt;/owl:unionOf&gt;
&lt;/owl:Class&gt;

&lt;owl:Class rdf:ID="Input"&gt;
  &lt;rdfs:subClassOf rdf:resource="#Parameter"/&gt;
  &lt;owl:disjointWith rdf:resource="#Output"/&gt;
&lt;/owl:Class&gt;
</pre>
</p>

<p>
Modeling variables as global, named individuals, as is done for Owl
Rules, can be misleading. RDF has no notion of the ``scope'' of a
variable, because an RDF document is nothing but a pile of triples. A
variable is named with a URI, like any other resource, and so has
global scope, or, more accurately, no notion of scope at all.
In spite of this lack of structure, we often use RDF to encode
hierarchical entites such as formulas and control structures.
Wrapping variable references inside literals allows us to sneak in and
impose our own scoping rules. We discuss the OWL-S rules in
section&nbsp;5.2.
</p>

<p>
A process will not execute properly unless its <i>preconditions</i> are
true. If and when it does execute, it has various <i>effects</i>. For
example, an agent can order 1000 bolts from a web service only if it
can get the web service to accept its promise to pay.
One effect of placing the order
is the transfer of ownership of the bolts from the service to the
agent (or the legal person for which it is a proxy).
</p>

<p>
Preconditions and effects are represented as logical formulas.
Getting logical formulas into RDF has not been easy, but it is now
reasonably clear how to proceed. There are actually several possible
approaches, depending on how close to RDF/OWL one wants to remain.
Usually having lots of choices for such a crucial job is a bad idea,
but in this case most of the differences are superficial; it is fairly
easy to translate between alternative notations.
</p>

<p>
The key idea underpinning our approach is to treat expressions as
literals, either string literals or XML literals. The latter case is
used for languages whose standard encoding is in XML, such as
SWRL&nbsp;[<a
 href="#SWRL">8</a>] or
RDF&nbsp;[<a
 href="#RDF">11</a>].
The former case is for other languages such as KIF&nbsp;[<a
 href="#Kif">10</a>] and PDDL&nbsp;[<a
 href="#PDDL">6</a>].
The ontology
&#91;<tt>http://www.daml.org/services/owl-s/1.1/generic/Expression.owl</tt>&#93;
defines <tt>Expression</tt>s and their properties.
</p>

<pre>
&lt;owl:Class rdf:ID="Expression"&gt;
  &lt;rdfs:subClassOf&gt;
    &lt;owl:Restriction&gt;
      &lt;owl:onProperty rdf:resource="#expressionLanguage"/&gt;
      &lt;owl:cardinality rdf:datatype="&amp;xsd;nonNegativeInteger"&gt;
                   1&lt;/owl:cardinality&gt;
    &lt;/owl:Restriction&gt;
  &lt;/rdfs:subClassOf&gt;
  &lt;rdfs:subClassOf&gt;
    &lt;owl:Restriction&gt;
      &lt;owl:onProperty rdf:resource="#expressionBody"/&gt;
      &lt;owl:cardinality rdf:datatype="&amp;xsd;nonNegativeInteger"&gt;
                   1&lt;/owl:cardinality&gt;
    &lt;/owl:Restriction&gt;
  &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;
</pre>

<p>
We annotate expressions with the language they are expressed in:
</p>

<pre>
&lt;owl:ObjectProperty rdf:ID="&amp;expr;#expressionLanguage"&gt;
  &lt;rdfs:domain rdf:resource="&amp;expr;#Expression"/&gt;
  &lt;rdfs:range rdf:resource="&amp;expr;#LogicLanguage"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>

<p>
The <tt>expressionBody</tt> property gives the actual expression:
</p>
<pre>
&lt;owl:DatatypeProperty rdf:ID="expressionBody"&gt;
  &lt;rdfs:domain rdf:resource="#Expression"/&gt;
&lt;/owl:DatatypeProperty&gt;
</pre>

<p>
As an example, we might state that in order to send the number of a
certain credit card to a web agent, one must know what its number is:
</p>

<pre>
  &lt;Description rdf:about="#process2"&gt;
     &lt;hasPrecondition&gt;
        &lt;expr:KIF-Expression&gt;
           &lt;expr:expressionBody&gt;
             (!agnt:know_val_is
                    (!ecom:credit_card_num ?cc)
                    ?num)
           &lt;/expr:expressionBody&gt;
        &lt;/expr:KIF-Expression&gt;
     &lt;/hasPrecondition&gt;
  &lt;/Description&gt;
</pre>

<p>(where the notation ``<tt>!<i>ecom</i>:</tt>'' for namespaces
is taken from Lassila's WILBUR
system&nbsp;&#91;<a
 href="#WILBUR">12</a>&#93;). (The declaration of the variable <tt>?cc</tt> is
not shown. We'll come back to that point shortly.)
</p>

<p>
In cases where an XML encoding is used, we would declare an expression to be
an XML
literal. Here's the same example using DRS as the expression language:
</p>

<pre>
  &lt;Description rdf:about="#process2"&gt;
     &lt;hasPrecondition&gt;
        &lt;Expression expressionLanguage="&amp;drs;#DRS"&gt;
           &lt;process:expressionBody&gt;
              &lt;drs:Atomic_formula&gt;
                 &lt;rdf:predicate rdf:resource="&amp;agnt;#Know_val_is"/&gt;
                 &lt;rdf:subject&gt;
                    &lt;drs:Functional_term&gt;
                       &lt;drs:function rdf:resource="&amp;ecom;credit_card_num"/&gt;
                       &lt;drs:term_args rdf:parseType="Collection"&gt;
                          &lt;swrl:Variable rdf:resource="#CC"/&gt;
                       &lt;/drs:term_args&gt;
                    &lt;/drs:Functional_term&gt;
                 &lt;/rdf:subject&gt;
                 &lt;rdf:object rdf:resource="#Num"/&gt;
              &lt;/drs:Atomic_formula&gt;
           &lt;/process:expressionBody&gt;
        &lt;/Expression&gt;
     &lt;/hasPrecondition&gt;
  &lt;/Description&gt;
</pre>

<p>
The references to <tt>#CC</tt> and <tt>#Num</tt> in the DRS example
are to parameters, the same ones written as <tt>?cc</tt> and
<tt>?num</tt> in the KIF example. We haven't yet provided a mechanism
for declaring the scopes of variables (see section&nbsp;<a
href="#sec_params">5.2</a>)
and how they acquire values.
Roughly speaking, parameters and other variables are scoped to the process where
they are used. We will describe this in more detail later.
In the example, <tt>#CC</tt> is an input parameter to the
process, that is, supplied by the client, but <tt>#Num</tt> is supposed
to be set in the process of reasoning about this very precondition.
Verifying that the process is feasible requires retrieving the
  credit-card's 16-digit number, which is then associated with the
  variable <tt>#Num</tt>. We call this an <i>existential</i> variable.
</p>

<pre>
&lt;owl:Class rdf:ID="Existential"&gt;
   &lt;rdfs:subClassOf rdf:resource="#ProcessVar"/&gt;
   &lt;owl:disjointwith rdf:resource="#Parameter"/&gt;
&lt;/owl:Class&gt;
</pre>

<p>
Of course, flagging bits of RDF as ``Literals'' means that an RDF
parser should ignore them. (If it did not, then it might
turn the RDF into a set of triples with a simple declarative meaning,
which is not appropriate.)
The trick is to have the OWL-S parser extract the ignored stuff and
interpret it appropriately for its context, treating it as ordinary
RDF after transformations such as replacing occurrences of variables
with their values.
In the example above, the
occurrences of <tt>#num</tt> and <tt>#cc</tt> are interpreted as the
values of these variables, not the variables themselves. In
the KIF example, the expressions <tt>?num</tt> and <tt>?cc</tt> must
be similarly interpreted.
It is usually not too difficult
  to do this sort of ``field engineering'' to interface an assertional
  language to RDF.
</p>

<p>
There are two special cases of <tt>Expression</tt>: <tt>Condition</tt>
and <tt>Effect</tt>. Because they are implemented as literals, there
is no way to declare what this difference is, but it's a useful
distinction for a human reader of the ontology.
</p>

<pre>
&lt;owl:Class rdf:ID="Condition"&gt;
   &lt;owl:subClassOf rdf:resource="&amp;expr;#Expression"/&gt;
&lt;/owl:Class&gt;

&lt;owl:Class rdf:ID="Effect"&gt;
   &lt;owl:subClassOf rdf:resource="&amp;expr;#Expression"/&gt;
&lt;/owl:Class&gt;
</pre>

<h2><a name="SECTION00052000000000000000"></a>
<a name="sec_params"></a><br/>
5.2 Process Parameters and Results
</h2>

<p>
We connect processes to their "IOPRs" using the properties shown in
this table:
</p>

<div>
<table cellpadding="3">
<tr><th align="left"><i>Property </i></th>
<th align="left"><i>Range </i></th>
<th align="left"><i>Kind</i></th>
</tr>
<tr><td align="left"><tt>hasParticipant</tt></td>
<td align="left"><tt>Participant</tt></td>
<td align="left"><i>ProcessVar </i></td>
</tr>
<tr><td align="left"><tt>hasInput</tt></td>
<td align="left"><tt>Input</tt></td>
<td align="left"><i>Parameter </i></td>
</tr>
<tr><td align="left"><tt>hasOutput</tt></td>
<td align="left"><tt>Output</tt></td>
<td align="left"><i>Parameter </i></td>
</tr>
<tr><td align="left"><tt>hasExistential</tt></td>
<td align="left"><tt>Existential</tt></td>
<td align="left"><i>ProcessVar</i></td>
</tr>
<tr><td align="left"><tt>hasPrecondition</tt></td>
<td align="left"><tt>Condition</tt></td>
<td align="left"><i>Expression </i></td>
</tr>
<tr><td align="left"><tt>hasResult</tt></td>
<td align="left"><tt>Result</tt></td>
<td align="left">(see below)</td>
</tr>
</table>
</div>

<p>
As promised above, the links from a process to its parameters
implicitly gives them <i>scope</i>. Participant, input, output, and existential
variables have as
scope the entire process they occur in. We introduce <i>result
  vars</i> and <i>local vars</i> below, which have a narrower scope.
</p>

<p>
In the rest of this section, we will discuss the entries in this table.
</p>

<ul>
<li><b>Participants</b>

<p>
A process involves two or more agents. One is <tt>TheClient</tt>,
the agent from whose point of view the process is described. Another
is <tt>TheServer</tt>, the principal element of the service that the
client deals with. If there are others, they are listed using the
property <tt>hasParticipant</tt>.
</p>

<pre>
&lt;owl:Class rdf:ID="Participant"&gt;
  &lt;rdfs:subClassOf rdf:resource="#ProcessVar"/&gt;
  &lt;owl:disjointWith rdf:resource="#Parameter"/&gt;
  &lt;owl:disjointWith rdf:resource="#Existential"/&gt;
  &lt;owl:disjointWith rdf:resource="#ResultVar"/&gt;
&lt;/owl:Class&gt;

&lt;owl:ObjectProperty rdf:ID="hasParticipant"&gt;
  &lt;rdfs:domain rdf:resource="#Process"/&gt;
  &lt;rdfs:range rdf:resource="#Participant"/&gt;
  &lt;rdfs:subPropertyOf rdf:resource="#hasVar"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="hasClient"&gt;
  &lt;rdfs:domain rdf:resource="#Process"/&gt;
  &lt;rdfs:subPropertyOf rdf:resource="#hasParticipant"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="performedBy"&gt;
  &lt;rdfs:domain rdf:resource="#Process"/&gt;
  &lt;rdfs:subPropertyOf rdf:resource="#hasParticipant"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;process:Participant rdf:ID="TheClient"/&gt;
&lt;process:Participant rdf:ID="TheServer"/&gt;
</pre>
It may seem slightly odd to say that participants are
<em>variables</em> instead of, say, <em>agents,</em> but remember that
we want the participants to differ between different enactments of the
process; we accomplish this by having <tt>theClient</tt> and
<tt>theServer</tt> be variables
with different values during different enactments.
</li>

<li><b>Inputs and Outputs</b>

<p>
Inputs and outputs specify the data transformation produced by the
process. Inputs specify the information that the process requires for
its execution. For atomic processes, the information must come from
the client. For the pieces of a composite process, some inputs come
directly from the client, but others come from previous steps of the
process.
</p>

<p>
We said above that an atomic process corresponds to a one-step service
that expects one message, so it might appear to be contradictory to
allow an atomic process to have multiple inputs. The contradiction is
resolved by distinguishing between the <i>inputs</i> and
the <i>message</i> sent to a process. There is just one message, but
it can bundle as many inputs as required. The bundling is specified
by the <i>grounding</i> of the process model; see
section&nbsp;6.
Similarly, the outputs produced by the invocation of an atomic process
flow back to the client as a single message, the format of which is
specified by the grounding. (Here we refer to the WSDL-based
grounding, which is the only style of grounding fully developed to date.)
</p>

<p>
The following example shows the definition of <tt>hasParameter</tt>, and its
subproperties <tt>hasInput</tt>, <tt>hasOutput</tt>, and
<tt>hasLocal</tt>:
</p>

<pre>
&lt;owl:ObjectProperty rdf:ID="hasParameter"&gt;
  &lt;rdfs:domain rdf:resource="#Process"/&gt;
  &lt;rdfs:range rdf:resource="#Parameter"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="hasInput"&gt;
  &lt;rdfs:subPropertyOf rdf:resource="#hasParameter"/&gt;
  &lt;rdfs:range rdf:resource="#Input"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="hasOutput"&gt;
  &lt;rdfs:subPropertyOf rdf:resource="#hasParameter"/&gt;
  &lt;rdfs:range rdf:resource="#Output"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="hasLocal"&gt;
  &lt;rdfs:subPropertyOf rdf:resource="#hasParameter"/&gt;
  &lt;rdfs:range rdf:resource="#Local"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>

</li>

<li><b>Preconditions and Results</b>

<p>
If a process has a precondition, then the process cannot be performed
successfully unless the precondition is true.
</p>

<pre>
&lt;owl:ObjectProperty rdf:ID="hasPrecondition"&gt;
  &lt;rdfs:domain rdf:resource="#Process"/&gt;
  &lt;rdfs:range rdf:resource="&amp;expr;#Condition"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>

<p>
Please be sure to distinguish between a condition's being true and
having various other properties, such as being believed to be true, being known
to be true, being represented in a database as true, etc. In OWL-S,
if a process's precondition is false, the consequences of performing or
initiating the process are undefined.
</p>

<p>
The performance of a process may result in changes of the state of
the world (effects), and the acquisition of information by the client agent
performing it (returned to it as outputs).
However, we don't link processes directly to effects and outputs,
because process modelers often want to model the dependence of these
on context. For example, if a process contains a step to buy an item,
there are two possible outcomes: either the purchase succeeds or it
fails. In the former case, the effect is that ownership is
transferred and the output is, say, a confirmation
number. In the latter case, there is no effect, and the output is a
failure message.
</p>

<p>
We use the term <i>result</i> to refer to a coupled output and
effect.
</p>

<pre>
&lt;owl:Class rdf:ID="Result"&gt;
  &lt;rdfs:label&gt;Result&lt;/rdfs:label&gt;
&lt;/owl:Class&gt;

&lt;owl:ObjectProperty rdf:ID="hasResult"&gt;
  &lt;rdfs:label&gt;hasResult&lt;/rdfs:label&gt;
  &lt;rdfs:domain rdf:resource="#Process"/&gt;
  &lt;rdfs:range rdf:resource="#Result"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>

</li>
<li><b>Conditioning Outputs and Effects</b>

<p>
Having declared a result, a process model can then describe it in
terms of four properties
</p>

<pre>
&lt;owl:ObjectProperty rdf:ID="inCondition"&gt;
  &lt;rdfs:label&gt;inCondition&lt;/rdfs:label&gt;
  &lt;rdfs:domain rdf:resource="#Result"/&gt;
  &lt;rdfs:range rdf:resource="&amp;expr;#Condition"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="hasResultVar"&gt;
  &lt;rdfs:label&gt;hasResultVar&lt;/rdfs:label&gt;
  &lt;rdfs:domain rdf:resource="#Result"/&gt;
  &lt;rdfs:range rdf:resource="#ResultVar"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="withOutput"&gt;
  &lt;rdfs:label&gt;withOutput&lt;/rdfs:label&gt;
  &lt;rdfs:domain rdf:resource="#Result"/&gt;
  &lt;rdfs:range rdf:resource="#OutputBinding"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="hasEffect"&gt;
  &lt;rdfs:label&gt;hasEffect&lt;/rdfs:label&gt;
  &lt;rdfs:domain rdf:resource="#Result"/&gt;
  &lt;rdfs:range rdf:resource="&amp;expr;#Expression"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>

<p>
The <tt>inCondition</tt> property specifies the condition under which
this result occurs. The <tt>withOutput</tt> and
<tt>hasEffect</tt> properties then state what ensues when the
condition is true. The <tt>hasResultVar</tt> property declares
variables that are bound in the <tt>inCondition</tt>. These
variables, called <tt>ResultVar</tt>s, are analogous to
<tt>Existential</tt>s, and serve a similar purpose.
Whereas <tt>Existentials</tt>s
are variables to be bound in preconditions and then used in the specifying
result conditions, outputs and effects, <tt>ResultVar</tt>s are scoped to
a particular result, are bound in the result's condition, and are used to
describe the outputs and effects associated with that condition. For example,
if a process were to validate a credit card, then one could have the
<tt>ResultVar</tt>
<tt>CardAccepted</tt> contain the result of that query process, which could then be
returned as an output.
</p>

<pre>
&lt;owl:Class rdf:ID="ResultVar"&gt;
  &lt;rdfs:subClassOf rdf:resource="#ProcessVar"/&gt;
  &lt;owl:disjointWith rdf:resource="#Parameter"/&gt;
  &lt;owl:disjointWith rdf:resource="#Existential"/&gt;
&lt;/owl:Class&gt;
</pre>

<p>
Another typical example is a process that charges a credit
card. The charge goes through if the card
is not overdrawn. If it is overdrawn, the only output is a failure
notification.
So the description of the process must include the description of two
<tt>Result</tt>s, possibly in this form:
</p>

<a name="credit-card">
<pre>
&lt;process:AtomicProcess rdf:ID="Purchase"&gt;
   &lt;process:hasInput&gt;
      &lt;process:Input rdf:ID="ObjectPurchased"/&gt;
   &lt;/process:hasInput&gt;
   &lt;process:hasInput&gt;
      &lt;process:Input rdf:ID="PurchaseAmt"/&gt;
   &lt;/process:hasInput&gt;
   &lt;process:hasInput&gt;
      &lt;process:Input rdf:ID="CreditCard"/&gt;
   &lt;/process:hasInput&gt;
   &lt;process:hasOutput&gt;
      &lt;process:Output rdf:ID="ConfirmationNum"/&gt;
   &lt;/process:hasOutput&gt;
   &lt;process:hasResult&gt;
     &lt;process:Result&gt;
        &lt;process:hasResultVar&gt;
           &lt;process:ResultVar rdf:ID="CreditLimH"&gt;
              &lt;process:parameterType rdf:resource="&amp;ecom;#Dollars"/&gt;
           &lt;/process:ResultVar&gt;
        &lt;/process:hasResultVar&gt;
        &lt;process:inCondition&gt;
          &lt;expr:KIF-Condition&gt;
            &lt;expr:expressionBody&gt;
              (and (current-value (credit-limit ?CreditCard)
                                  ?CreditLimH)
                   (&gt;= ?CreditLimH ?purchaseAmt))
            &lt;/expr:expressionBody&gt;
          &lt;/expr:KIF-Condition&gt;
        &lt;/process:inCondition&gt;
        &lt;process:withOutput&gt;
           &lt;process:OutputBinding&gt;
              &lt;process:toVar rdf:resource="#ConfirmationNum"/&gt;
              &lt;process:valueFunction rdf:parseType="Literal"&gt;
                 &lt;cc:ConfirmationNum xsd:datatype="&amp;xsd;#string"/&gt;
              &lt;/process:valueFunction&gt;
           &lt;/process:OutputBinding&gt;
        &lt;/process:withOutput&gt;
        &lt;process:hasEffect&gt;
          &lt;expr:KIF-Condition&gt;
            &lt;expr:expressionBody&gt;
              (and (confirmed (purchase ?purchaseAmt) ?ConfirmationNum)
                   (own ?objectPurchased)
                   (decrease (credit-limit ?CreditCard)
                             ?purchaseAmt))
            &lt;/expr:expressionBody&gt;
          &lt;/expr:KIF-Condition&gt;
        &lt;/process:hasEffect&gt;
     &lt;/process:Result&gt;
     &lt;process:Result&gt;
        &lt;process:hasResultVar&gt;
           &lt;process:ResultVar rdf:ID="CreditLimL"&gt;
              &lt;process:parameterType rdf:resource="&amp;ecom;#Dollars"/&gt;
           &lt;/process:ResultVar&gt;
        &lt;/process:hasResultVar&gt;
        &lt;process:inCondition&gt;
          &lt;expr:KIF-Condition&gt;
            &lt;expr:expressionBody&gt;
              (and (current-value (credit-limit ?CreditCard)
                                  ?CreditLimL)
                   (&lt; ?CreditLimL ?purchaseAmt))
            &lt;/expr:expressionBody&gt;
          &lt;/expr:KIF-Condition&gt;
        &lt;/process:inCondition&gt;
        &lt;process:withOutput rdf:resource="&amp;ecom;failureNotice"/&gt;
           &lt;process:OutputBinding&gt;
              &lt;process:toVar rdf:resource="#ConfirmationNum"/&gt;
              &lt;process:valueData rdf:parseType="Literal"&gt;
                 &lt;drs:Literal&gt;
                    &lt;drs:litdefn xsd:datatype="&amp;xsd;#string"
                                 &gt;00000000&lt;/drs:litdefn&gt;
                 &lt;/drs:Literal&gt;
              &lt;/process:valueData&gt;
           &lt;/process:OutputBinding&gt;
        &lt;/process:withOutput&gt;
     &lt;/process:Result&gt;
   &lt;/process:hasResult&gt;
&lt;/process:AtomicProcess&gt;
</pre>
</a>
<p>
As a result of the execution of the process, a credit card is
charged and the money in the account reduced. Note, once again, that there is a
fundamental difference between effects and outputs. Effects describe
conditions in the world, while outputs describe information. In a
more realistic version of this example,
the service may send a notification, or an
invoice, that it charged the credit card account. This output is just a
datum of one type or another. The effect describes
the actual event that the output is part of the description of: that
the amount of money in the credit card account
has been reduced and that the client now owns the object it intended
to purchase. (We have used instances of the class
<tt>OutputBinding</tt> in this example; we will explain what these are
in section 5.5.)
</p>

<p>
Finally, there is another output descriptor, called
<tt>resultForm</tt>. This is not attached to a variable, but to a
Result:
</p>

<pre>
&lt;owl:DatatypeProperty rdf:ID="resultForm"&gt;
  &lt;rdfs:label&gt;resultForm&lt;/rdfs:label&gt;
  &lt;rdfs:domain rdf:resource="#Result"/&gt;
  &lt;rdfs:range rdf:resource="&amp;rdf;#XMLLiteral"/&gt;
&lt;/owl:DatatypeProperty&gt;
</pre>

<p>
The purpose of <tt>resultForm</tt> is to provide an
abstract XML
template for outputs sent back to the client. The reasons we need such
a template are subtle, and do not always apply. Normally the
grounding suffices to express how the components of a message are
bundled, i.e., how inputs are put together to make a message to a
service, and how replies are disassembled into the intended outputs.
In essence, all we can or need to do is build up and tear down record structures
(in XML Schema terminology, <tt>ComplexType</tt>s).
But in the case of a process with multiple Results, it can be
extremely useful to specify other features of an output message that
indicate which result actually occurred, sparing us the chore of
providing output fields to encode that information, or making the
client infer it from the form of the other fields. That's what
<tt>resultForm</tt> is for.
</p>

<p>
<a name="kif-example">
In our example of a credit-card transaction, we had two Results, one
for the case where there was a sufficient balance to pay the bill, and
one for when there wasn't. We could augment each result with a
further binding, such as this one for the failure case:
</p>

<pre>
     &lt;owls:Result&gt;
        &lt;owls:hasResultVar&gt;
           &lt;owls:ResultVar rdf:ID="CreditLimL"&gt;
              &lt;owls:parameterType rdf:resource="&amp;ecom;#Dollars"/&gt;
           &lt;/owls:ResultVar&gt;
        &lt;/owls:hasResultVar&gt;
        &lt;process:inCondition&gt;
          &lt;expr:KIF-Condition&gt;
            &lt;expr:expressionBody&gt;
              (and (current-value (credit-limit ?creditCard)
                                  ?CreditLimL)
                   (&lt; ?CreditLimL ?purchaseAmt))
            &lt;/expr:expressionBody&gt;
          &lt;/expr:KIF-Condition&gt;
        &lt;/process:inCondition&gt;
        &lt;owls:resultForm rdf:parseType="Literal"&gt;
            &lt;ecom:CreditExceededFailure&gt;
               &lt;ecom:gap expressionLanguage="&amp;expr;#KIF"
                         rdf:datatype="&amp;xsd;#string"&gt;
                  (- ?purchaseAmt ?CreditLimL)
               &lt;/ecom:gap&gt;
            &lt;/ecom:CreditExceededFailure&gt;
        &lt;/owls:resultForm&gt;
        &lt;withOutput rdf:resource="&amp;ecom;failureNotice"/&gt;
           ...
        &lt;/withOutput&gt;
     &lt;/owls:Result&gt;
</pre>
</a>
</li>
</ul>

<h2><a name="SECTION00053000000000000000"></a>
5.3 Atomic and Simple Processes
</h2>

<p>
We are now ready to formalize the classes of processes: atomic,
composite, and, not mentioned before, ``simple.''
</p>

<pre>
&lt;owl:Class rdf:ID="Process"&gt;
  &lt;rdfs:comment&gt; The most general class of processes &lt;/rdfs:comment&gt;
  &lt;owl:unionOf rdf:parseType="Collection"&gt;
    &lt;owl:Class rdf:about="#AtomicProcess"/&gt;
    &lt;owl:Class rdf:about="#SimpleProcess"/&gt;
    &lt;owl:Class rdf:about="#CompositeProcess"/&gt;
  &lt;/owl:unionOf&gt;
&lt;/owl:Class&gt;
</pre>

<p>See Figure &nbsp;3, which shows
selected classes and properties of the process model.
</p>

<p>
<!-- used with pre-Terry figure:
     width="550" height="444" -->
<a name="processmodel_class"></a><a name="966"></a>
<ins>
<table>
<caption><strong>Figure 3:</strong>
Top level of the process ontology</caption>
<tr><td><img
 src="Process-Model-1.1.gif"
 alt="Process-Model-1.1.gif" /></td></tr>
</table>
</ins>
</p>

<p>
Atomic processes correspond to the actions a service can perform by
engaging it in a single interaction; composite processes correspond to
actions that require multi-step protocols and/or multiple server actions; finally,
simple processes provide an abstraction mechanism to provide multiple
views of the same process. We discuss atomics and simples here,
reserving composites for the next subsection.
</p>

<p>
<i>Atomic</i> processes are directly invocable (by passing them the
appropriate messages). Atomic processes have no subprocesses and
execute in a single step, as far as the service
requester is concerned. That is, they take an input message, do something, and then
return their output message. For each atomic process,
there must be provided a grounding that enables a
service requester to construct messages to the process from its inputs
and deconstruct
replies, as explained in Section
<a href="#6">6</a>.
</p>

<pre>
&lt;owl:Class rdf:ID="AtomicProcess"&gt;
  &lt;owl:subClassOf rdf:resource="#Process"/&gt;
&lt;/owl:Class&gt;
</pre>

<p>
<i>Simple</i> processes are not invocable and are
not associated with a grounding, but, like atomic processes, they <i>are</i> conceived of as having single-step executions. Simple processes
are used as elements of abstraction; a simple process may be used
either to provide a view of (a specialized way of using) some atomic
process, or a simplified representation of some composite process (for
purposes of planning and reasoning). In the former case, the simple
process is <tt>realizedBy</tt> the atomic process; in the latter case, the
simple process <tt>expandsTo</tt> the composite process (see below).
</p>

<pre>
&lt;owl:Class rdf:ID="SimpleProcess"&gt;
  &lt;rdfs:subClassOf rdf:resource="#Process"/&gt;
  &lt;owl:disjointWith rdf:resource="#AtomicProcess"/&gt;
&lt;/owl:Class&gt;

&lt;owl:ObjectProperty rdf:ID="realizedBy"&gt;
  &lt;rdfs:domain rdf:resource="#SimpleProcess"/&gt;
  &lt;rdfs:range rdf:resource="#AtomicProcess"/&gt;
  &lt;owl:inverseOf rdf:resource="#realizes"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="realizes"&gt;
  &lt;rdfs:domain rdf:resource="#AtomicProcess"/&gt;
  &lt;rdfs:range rdf:resource="#SimpleProcess"/&gt;
  &lt;owl:inverseOf rdf:resource="#realizedBy"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>
<p>
Finally, for an atomic process, there are always only two
participants, <tt>TheClient</tt> and <tt>TheServer</tt>:
</p>

<pre>
&lt;owl:Class rdf:about="#AtomicProcess"&gt;
    &lt;rdfs:subClassOf&gt;
      &lt;owl:Restriction&gt;
        &lt;owl:onProperty rdf:resource="#hasClient"/&gt;
        &lt;owl:hasValue rdf:resource="#TheClient"/&gt;
      &lt;/owl:Restriction&gt;
    &lt;/rdfs:subClassOf&gt;
    &lt;rdfs:subClassOf&gt;
      &lt;owl:Restriction&gt;
        &lt;owl:onProperty rdf:resource="#performedBy"/&gt;
        &lt;owl:hasValue rdf:resource="#TheServer"/&gt;
      &lt;/owl:Restriction&gt;
    &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;
</pre>

<h2><a name="SECTION00054000000000000000"></a>
5.4 Composite Processes
</h2>

<p>
<i>Composite</i> processes are decomposable into other (non-composite
or composite) processes; their decomposition can be specified by using
control constructs such as <tt> Sequence</tt> and <tt>
If-Then-Else</tt>, which are
discussed below. Because many of the control constructs have names
reminiscent of control structures in programming languages, it is easy
to lose sight of a fundamental difference: a composite process is not
a behavior a service <i>will</i> do, but a behavior (or set of behaviors) the
client <i>can</i> perform by sending and receiving a series of messages.
If the composite process has an overall effect, then the client must
perform the entire process in order to achieve that effect. We have
not yet given a precise
specification of what it means to perform a process, but all we mean
is that, e.g., if a composite is a <tt>Sequence</tt>, then the client
sends a series of messages that invoke every step in order.
</p>

<p>
One crucial feature of a composite process is its specification of how
its inputs are accepted by
particular subprocesses, and how its various outputs are produced by
particular subprocesses. We discuss this topic in section&nbsp;5.5.
</p>

<pre>
&lt;owl:Class rdf:ID="CompositeProcess"&gt;
  &lt;rdfs:subClassOf rdf:resource="#Process"/&gt;
  &lt;owl:disjointWith rdf:resource="#AtomicProcess"/&gt;
  &lt;owl:disjointWith rdf:resource="#SimpleProcess"/&gt;
  &lt;rdfs:comment&gt;
    A CompositeProcess must have exactly 1 composedOf property.
  &lt;/rdfs:comment&gt;
  &lt;owl:intersectionOf rdf:parseType="Collection"&gt;
      &lt;owl:Class rdf:about="#Process"/&gt;
      &lt;owl:Restriction&gt;
         &lt;owl:onProperty rdf:resource="#composedOf"/&gt;
         &lt;owl:cardinality rdf:datatype="&amp;xsd;#nonNegativeInteger"&gt;
                  1&lt;/owl:cardinality&gt;
      &lt;/owl:Restriction&gt;
  &lt;/owl:intersectionOf&gt;
&lt;/owl:Class&gt;
</pre>

<p>
A <tt>CompositeProcess</tt> must have a <tt>composedOf</tt> property
by which is indicated the control structure of the composite,
using a <tt> ControlConstruct</tt>.
</p>

<pre>
&lt;owl:ObjectProperty rdf:ID="composedOf"&gt;
  &lt;rdfs:domain rdf:resource="#CompositeProcess"/&gt;
  &lt;rdfs:range rdf:resource="#ControlConstruct"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:Class rdf:ID="ControlConstruct"&gt;
&lt;/owl:Class&gt;
</pre>

<p>
Each control construct, in turn, is associated with an additional
property called <tt>components</tt> to indicate the nested control
constructs from which it is composed, and, in some cases, their
ordering.
</p>

<pre>
&lt;owl:ObjectProperty rdf:ID="components"&gt;
 &lt;rdfs:domain rdf:resource="#ControlConstruct"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>

<p>
For instance, any instance of the control construct
 <tt>Sequence</tt> has a <tt>components</tt> property that ranges
 over a <tt>ControlConstructList</tt> (a list of
control constructs). We give a complete table of composite
control constructs below.
</p>

<p>
Any composite process can be considered a tree whose nonterminal nodes
are labeled with control constructs, each of which has children
specified using <tt>components</tt>.
The leaves of the tree are invocations of other processes, indicated
as instances of class <tt>Perform</tt>.
</p>

<pre>
&lt;owl:Class rdf:ID="Perform"&gt;
  &lt;rdfs:subClassOf rdf:resource="#ControlConstruct"/&gt;
  &lt;rdfs:subClassOf&gt;
    &lt;owl:Restriction&gt;
      &lt;owl:onProperty rdf:resource="#process"/&gt;
      &lt;owl:cardinality rdf:datatype="&amp;xsd;#nonNegativeInteger"&gt;
                   1&lt;/owl:cardinality&gt;
    &lt;/owl:Restriction&gt;
  &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;
</pre>

<p>
The <tt>process</tt> property of a perform indicates the
 process
to be performed:
</p>

<pre>
&lt;owl:ObjectProperty rdf:ID="process"&gt;
  &lt;rdfs:domain rdf:resource="#Perform"/&gt;
  &lt;rdfs:range rdf:resource="#Process"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>

<p>
When a process is performed as a step in a larger process, there must
be a description of where the inputs to the performed process come
from and where the outputs go. This issue we defer to
section&nbsp;5.5.
</p>

<p>
A process can often be viewed at different levels of granularity,
either as a primitive, undecomposable process or as a composite
process. These are sometimes referred to as ``black box'' and ``glass
box'' views, respectively. Either perspective may be the more useful
in some given context. When a composite process is viewed as a black
box, a simple process can be used to represent this. In this case,
the relationship between the simple and composite is represented using
the
<tt>expandsTo</tt> property, and its inverse,
 the <tt>collapsesTo</tt> property.
</p>

<pre>
&lt;owl:ObjectProperty rdf:ID="expandsTo"&gt;
  &lt;rdfs:domain rdf:resource="#SimpleProcess"/&gt;
  &lt;rdfs:range rdf:resource="#CompositeProcess"/&gt;
  &lt;owl:inverseOf rdf:resource="#collapsesTo"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="collapsesTo"&gt;
  &lt;rdfs:domain rdf:resource="#CompositeProcess"/&gt;
  &lt;rdfs:range rdf:resource="#SimpleProcess"/&gt;
  &lt;owl:inverseOf rdf:resource="#expandsTo"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>

<p>
We conclude this section with an overview of the OWL-S control
constructs: Sequence, Split, Split + Join, Choice, Any-Order,
Condition, If-Then-Else, Iterate, Repeat-While, Repeat-Until, and
AsProcess.
</p>

<dl>
<dt><strong>Sequence</strong></dt>
<dd>A list of control constructs to be done in order.

<pre>
&lt;owl:Class rdf:ID="Sequence"&gt;
  &lt;rdfs:subClassOf rdf:resource="#ControlConstruct"/&gt;
  &lt;rdfs:subClassOf&gt;
    &lt;owl:Restriction&gt;
      &lt;owl:onProperty rdf:resource="#components"/&gt;
      &lt;owl:allValuesFrom rdf:resource="#ControlConstructList"/&gt;
    &lt;/owl:Restriction&gt;
  &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;
</pre>

<p>A <tt>ControlConstructList</tt> is just a <tt>List</tt> whose
elements are control constructs.
</p>
</dd>

<dt><strong>Split</strong></dt>
<dd> The components of a <tt>Split</tt> process are a bag
of process components to be executed concurrently. <tt>Split</tt>
completes as soon as all of its component processes have been
scheduled for execution.

<pre>
&lt;owl:Class rdf:ID="Split"&gt;
  &lt;rdfs:subClassOf rdf:resource="#ControlConstruct"/&gt;
  &lt;rdfs:subClassOf&gt;
    &lt;owl:Restriction&gt;
      &lt;owl:onProperty rdf:resource="#components"/&gt;
      &lt;owl:allValuesFrom rdf:resource="#ControlConstructBag"/&gt;
    &lt;/owl:Restriction&gt;
  &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;
</pre>

<p>A <tt>ControlConstructBag</tt> is like a
<tt>ControlConstructList</tt>, but unordered.
</p>
</dd>

<dt><strong>Split+Join</strong></dt>
<dd>

<p>
Here the process consists of concurrent execution of a bunch of
process components with barrier synchronization. That is, <tt>
Split+Join</tt> completes when all of its components processes have
completed. With <tt> Split</tt> and <tt> Split+Join</tt>, we can
define processes that have partial synchronization (e.g., split all
and join some sub-bag).
</p>

<pre>
&lt;owl:Class rdf:ID="Split-Join"&gt;
  &lt;rdfs:subClassOf rdf:resource="#ControlConstruct"/&gt;
  &lt;rdfs:subClassOf&gt;
    &lt;owl:Restriction&gt;
      &lt;owl:onProperty rdf:resource="#components"/&gt;
      &lt;owl:allValuesFrom rdf:resource="#ControlConstructBag"/&gt;
    &lt;/owl:Restriction&gt;
  &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;
</pre>

</dd>

<dt><strong>Any-Order</strong></dt>
<dd>
Allows the process components (specified as a bag) to be executed in
some unspecified order but not concurrently. Execution and completion
of all components is required. The execution of processes in an
<tt>Any-Order</tt> construct cannot overlap, i.e. atomic processes cannot be
executed concurrently and composite processes cannot be interleaved.
All components must be
executed. As with <tt>Split+Join</tt>, completion of all components is
required.

<pre>
&lt;owl:Class rdf:ID="Any-Order"&gt;
  &lt;rdfs:subClassOf rdf:resource="#ControlConstruct"/&gt;
  &lt;rdfs:subClassOf&gt;
    &lt;owl:Restriction&gt;
      &lt;owl:onProperty rdf:resource="#components"/&gt;
      &lt;owl:allValuesFrom rdf:resource="#ControlConstructBag"/&gt;
    &lt;/owl:Restriction&gt;
  &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;
</pre>

</dd>

<dt><strong>Choice</strong></dt>
<dd> <tt> Choice</tt> calls for the execution of a single
    control construct from a given bag of control constructs (given by
    the components property). Any of the given control constructs may
    be chosen for execution.

<pre>
&lt;owl:Class rdf:ID="Choice"&gt;
  &lt;rdfs:subClassOf rdf:resource="#ControlConstruct"/&gt;
  &lt;rdfs:subClassOf&gt;
    &lt;owl:Restriction&gt;
      &lt;owl:onProperty rdf:resource="#components"/&gt;
      &lt;owl:allValuesFrom rdf:resource="#ControlConstructBag"/&gt;
    &lt;/owl:Restriction&gt;
  &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;
</pre>
</dd>

<dt><strong>If-Then-Else</strong></dt>
<dd> The <tt>If-Then-Else</tt> class is a control
construct that has properties <tt>ifCondition</tt>, <tt>then</tt> and
<tt>else</tt> holding different aspects of the <tt>If-Then-Else</tt>. Its
semantics is intended to be ``Test <tt>If-condition</tt>; if True do
<tt>Then</tt>, if False do <tt>Else</tt>.''

<pre>
&lt;owl:Class rdf:ID="If-Then-Else"&gt;
  &lt;rdfs:subClassOf rdf:resource="#ControlConstruct"/&gt;
  &lt;rdfs:subClassOf&gt;
    &lt;owl:Restriction&gt;
      &lt;owl:onProperty rdf:resource="#components"/&gt;
      &lt;owl:allValuesFrom rdf:resource="#ControlConstructBag"/&gt;
    &lt;/owl:Restriction&gt;
  &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;

&lt;owl:ObjectProperty rdf:ID="ifCondition"&gt;
 &lt;rdfs:comment&gt; The if condition of an if-then-else&lt;/rdfs:comment&gt;
  &lt;rdfs:domain rdf:resource="#If-Then-Else"/&gt;
  &lt;rdfs:range rdf:resource="&amp;expr;#Condition"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="then"&gt;
  &lt;rdfs:domain rdf:resource="#If-Then-Else"/&gt;
  &lt;rdfs:range rdf:resource="#ControlConstruct"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="else"&gt;
  &lt;rdfs:domain rdf:resource="#If-Then-Else"/&gt;
  &lt;rdfs:range rdf:resource="#ControlConstruct"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>

</dd>

<dt><strong>Iterate</strong></dt>
<dd> The <tt> Iterate</tt>
 construct makes no
assumption about how many iterations are made or when to initiate,
terminate, or resume. The initiation, termination or maintenance
condition could be specified with a <tt>whileCondition</tt> or an
<tt>untilCondition</tt> as below.<a name="tex2html6"
  href="#foot827"><sup>3</sup></a>

<p>
Iterate is an "abstract" class, in the sense that it's not detailed
enough to be instantiated in a process model. It's defined to serve as
the common superclass of Repeat-While, Repeat-Until, and potentially
other specific iteration constructs that might be needed in the
future.
</p>

<pre>
&lt;owl:Class rdf:ID="Iterate"&gt;
  &lt;rdfs:subClassOf rdf:resource="#ControlConstruct"/&gt;
  &lt;rdfs:subClassOf&gt;
    &lt;owl:Restriction&gt;
      &lt;owl:onProperty rdf:resource="#components"/&gt;
      &lt;owl:allValuesFrom rdf:resource="#ControlConstructBag"/&gt;
    &lt;/owl:Restriction&gt;
  &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;
</pre>

</dd>

<dt><strong>Repeat-While and Repeat-Until</strong></dt>
<dd>Both of these iterate until a
condition becomes false or true, following the familiar programming
language conventions. Repeat-While tests for the
condition, exits if it is false and does the operation if the
condition is true, then loops. Repeat-Until does the operation, tests
for the condition, exits if it is true, and otherwise loops. Thus, Repeat-While
while may never act, whereas Repeat-Until always acts at least once.

<pre>
&lt;owl:ObjectProperty rdf:ID="whileCondition"&gt;
  &lt;rdfs:domain rdf:resource="#Repeat-While"/&gt;
  &lt;rdfs:range rdf:resource="&amp;expr;#Condition"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="whileProcess"&gt;
  &lt;rdfs:domain rdf:resource="#Repeat-While"/&gt;
  &lt;rdfs:range rdf:resource="#ControlConstruct"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:Class rdf:ID="Repeat-While"&gt;
 &lt;rdfs:comment&gt; The repeat while construct&lt;/rdfs:comment&gt;
 &lt;rdfs:subClassOf rdf:resource="#Iterate"/&gt;
&lt;/owl:Class&gt;
</pre>

<pre>
&lt;owl:ObjectProperty rdf:ID="untilCondition"&gt;
  &lt;rdfs:domain rdf:resource="#Repeat-Until"/&gt;
  &lt;rdfs:range rdf:resource="&amp;expr;#Condition"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="untilProcess"&gt;
  &lt;rdfs:domain rdf:resource="#Repeat-Until"/&gt;
  &lt;rdfs:range rdf:resource="#ControlConstruct"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:Class rdf:ID="Repeat-Until"&gt;
  &lt;rdfs:comment&gt; The repeat until process&lt;/rdfs:comment&gt;
  &lt;rdfs:subClassOf rdf:resource="#Iterate"/&gt;
&lt;/owl:Class&gt;
</pre>

</dd>
</dl>

<h3><em>AsProcess</em></h3>

<p>The final control construct, <tt>AsProcess</tt>, is slightly
different from the others.
<pre>
&lt;owl:Class rdf:ID="AsProcess"&gt;
   &lt;rdfs:comment&gt;
      AsProcess turns an arbitrary control construct into a "local
      process" that is called at the point it is defined.
   &lt;/rdfs:comment&gt;
   &lt;rdfs:subClassOf rdf:resource="#ControlConstruct"/&gt;
   &lt;rdfs:subClassOf rdf:resource="#Process"/&gt;
   &lt;owl:disjointWith rdf:resource="#SimpleProcess"/&gt;
   &lt;rdfs:comment&gt;
      AsProcess's may be Atomic or Composite, but not Simple;
      they are used purely as syntactic devices.
   &lt;/rdfs:comment&gt;
   &lt;rdfs:subClassOf&gt;
      &lt;owl:Restriction&gt;
         &lt;owl:onProperty rdf:resource="#components"/&gt;
         &lt;owl:cardinality rdf:datatype="&amp;xsd;#nonNegativeInteger"&gt;
            0&lt;/owl:cardinality&gt;
       &lt;/owl:Restriction&gt;
   &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;
</pre>
An AsProcess object is both a control construct and a process.
Considered as a ControlConstruct, AsProcess has no
components. However, if it is a CompositeProcess it
may have a body (the value of its <tt>composedOf</tt> property).
It allows you to associate outputs, local variables, effects,
and even preconditions with an arbitrary subtree of a
composite-process definition.
</p>

<p>
For example, a brokering process might
be defined in such a way that after confirming with both Contractor
and Contractee, a <tt>brokered</tt> relationship exists between them:
<pre>
&lt;process:AsProcess&gt;
   &lt;process:Result&gt;
         &lt;process:hasEffect&gt;
             &lt;Expression expressionLanguage="&amp;drs;#DRS"&gt;
                &lt;drs:AtomicFormula&gt;
                   &lt;rdf:predicate rdf:resource="&amp;aux;brokered"/&gt;
                   &lt;rdf:subject rdf:resource="&amp;aux;Contractor"/&gt;
                   &lt;rdf:object rdf:resource="&amp;aux;Contractee"/&gt;
                &lt;/drs:AtomicFormula&gt;
             &lt;/Expression&gt;
         &lt;/process:hasEffect&gt;
   &lt;/process:Result&gt;
   <a name="missing-lines">&lt;process:composedOf&gt;
      &lt;process:Split+Join rdf:parseType="Collection"&gt;
         &lt;process:Perform&gt;
            &lt;process:process rdf:resource="&amp;aux;#Confirm-Contractor"/&gt;
            ...
         &lt;/process:Perform&gt;
         &lt;process:Perform&gt;
            &lt;process:process rdf:resource="&amp;aux;#Confirm-Contractee"/&gt;
            ...
         &lt;/process:Perform&gt;
      &lt;/process:Split+Join&gt;
   &lt;/process:composedOf&gt;</a>
&lt;/process:AsProcess&gt;
</pre>
The elided pieces of the <tt>Performs</tt> specify how how data from
this process are to be passed as
parameters to the performed process.
These will be filled in in the next
section.
</p>

<p>
One could replace any use of <tt>AsProcess</tt>
 by a Perform of a
process created <i>ad hoc</i>with roughly the same
      properties, but creating the extra process would be a distracting
 chore. (And the <i>ad hoc</i> process would have to be loaded with extra
 arguments if it had to make use of
 any variables from the enclosing context; in an <tt>AsProc</tt> they
 can be referred to as any other variables in scope would be; see next
 section.)
</p>

<a name="sec_dataflow">
<h2><a name="SECTION00055000000000000000"></a>
<br/>
5.5 Specifying Data Flow and Variable Bindings
</h2>
</a>

<p>
When defining processes using OWL-S, there are many places where the
input to one process component is obtained as one of the outputs of a
preceding step. This is one type of <i>data flow</i> from
one step of a process to another. There are also other patterns; in
particular, the outputs of a composite process may be derived from
outputs of some of its components, and specifying which component's
output becomes output

<img width="20" height="15" src="img3.gif" alt="X" />
of the composite is also a data-flow specification.
</p>

<p>
There are two complementary ways to specify how data flow from step to
step: <em>consumer-pull</em> and <em>producer-push</em>.
One uses the "pull" approach when specifying the source of a datum at
the point where it is used: if step 1 feeds step 3, we specify
this fact in the description of step 3 rather than the description of
step 1. We implement this convention by
providing a notation for arbitrary terms as the values of input or
output parameters of a process step, plus a notation for subterms denoting the output
or input parameters of prior process steps.
</p>

<h3><em>Consumer-Pull</em></h3>

<a name="example-tableau">
<p>
Consider the following tableau:

<pre>
<tt>I1</tt> input of: { Composite Process CP }: with output <tt>O1</tt>
<br /> <i>composed of </i>

Step 1: Perform S1 &rArr;
Step 2: Perform S2
<br />where S1 has inputs <tt>I11</tt> and <tt>I12</tt>, and output <tt>O11</tt>
and S2 has input <tt>I21</tt> and output <tt>O21</tt>
</pre>
</p>
</a>

<p>
The right-arrow here indicates that step 2 is meant to follow step 1,
but not necessarily immediately.
</p>

<p>
Suppose that we want a straightforward data flow: Input
<tt>I1</tt> of the overall process CP is used as input <tt>I11</tt> of S1,
after adding 1. Input <tt>I12</tt> of S1 is a constant, the string
<tt>"Academic"</tt>. Output <tt>O11</tt> of S1 is
used as input <tt>I21</tt> of S2. The maximum of 0 and output
<tt>O21</tt> of S2, times &pi;, is used as output <tt>O1</tt> of CP. Using a
consumer-pull convention, we simply declare the
parameters <tt>I1</tt>, <tt>O11</tt>, and <tt>O21</tt>, but for parameters
<tt>I11</tt>, <tt>I21</tt>, and <tt>O1</tt> we provide, in addition to a
declaration, <i>bindings</i> that specify that
</p>

<!-- MATH
 \begin{eqnarray*}
\hspace{2em} \texttt{\small I11}\mbox{\textrm{(Step1)}} &\mbox{\textit{comes from}}& \mbox{\texttt{incr(I1\mbox{\textrm{(CP)}})}} \\
\ \texttt{\small I12}\mbox{\textrm{(Step1)}} & = & \texttt{\small "Academic"} \\
                \texttt{\small I21}\mbox{\textrm{(Step2)}} &\mbox{\textit{comes from}}& \mbox{\texttt{O11}}\mbox{\textrm{(Step1)}} \\
                \texttt{\small O1}\mbox{\textrm{(CP)}} &\mbox{\textit{comes from}}&
                     \pi \times \max (0, \texttt{\small O21}\mbox{\textrm{(Step2)}})
\end{eqnarray*}
 -->

<pre>
I11(Step1) <i>comes from</i> incr(I1(CP))
I12(Step1) = "Academic"
I21(Step2) <i>comes from</i> O11(Step1)
O1(CP) <i>comes from</i> &pi; &times; max 0, O21(Step2))
</pre>

<p>
OWL-S uses <tt>hasDataFrom</tt> properties and
<tt>InputBinding</tt> objects to represent
each of these flows. A <tt>Binding</tt>
represents a flow of
data to a variable; it has two properties: <tt>toVar</tt>, the name of
the variable (e.g., <tt>I21</tt>), and
<tt>valueSpecifier</tt>,
a description of the value it is to receive. A <tt>Perform</tt> has one
<tt>hasDataFrom</tt> property per input variable; its value is a
Binding of that variable, in particular, an <tt>InputBinding</tt>.
</p>

<p>
In an effort to provide value specifications in
as concise a manner as possible in a variety of situations, we provide
four different kinds of <tt>valueSpecifier</tt> for <tt>Binding</tt>s:
<tt>valueSource</tt>,
<tt>valueType</tt>,
<tt>valueData</tt>, and
<tt>valueFunction</tt>.
</p>

<p>
We declare the <tt>toVar</tt> property in the usual way:
</p>

<pre>
&lt;owl:Class rdf:ID="Binding"&gt;
  &lt;rdfs:subClassOf&gt;
    &lt;owl:Restriction&gt;
      &lt;owl:onProperty rdf:resource="#toVar"/&gt;
      &lt;owl:cardinality rdf:datatype="&amp;xsd;nonNegativeInteger"&gt;
                     1&lt;/owl:cardinality&gt;
    &lt;/owl:Restriction&gt;
  &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;

&lt;owl:ObjectProperty rdf:ID="toVar"&gt;
  &lt;rdfs:domain rdf:resource="#Binding"/&gt;
  &lt;rdfs:range rdf:resource="#Parameter"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>

<p>
The simplest sort of dataflow spec is <tt>valueSource</tt>:
</p>

<pre>
&lt;owl:ObjectProperty rdf:ID="valueSource"&gt;
  &lt;rdfs:label&gt;valueSource&lt;/rdfs:label&gt;
  &lt;rdfs:domain rdf:resource="#Binding"/&gt;
  &lt;rdfs:range rdf:resource="#ValueOf"/&gt;
  &lt;rdfs:subPropertyOf rdf:resource="#valueSpecifier"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>

<p>
The range of <tt>valueSource</tt> is an object of class
<tt>ValueOf</tt>, specified entirely by its properties
<tt>theVar</tt> and <tt>fromProcess</tt>. If a binding with
<tt>toVar</tt><img
 width="32" height="30"
 src="img9.gif"
 alt=" = p " /> has <tt>valueSource</tt> <img
 width="31" height="16"
 src="img10.gif"
 alt=" = s " /> with properties
<tt>theVar</tt>=<img
 width="13" height="16"
 src="img11.gif"
 alt=" v " /> and <tt>fromProcess</tt><img
 width="36" height="16"
 src="img12.gif"
 alt=" = R " />, that means that
parameter <img
 width="13" height="30"
 src="img13.gif"
 alt=" p " /> of this process = parameter <img
 width="13" height="16"
 src="img11.gif"
 alt=" v " /> of <img
 width="18" height="16"
 src="img14.gif"
 alt=" R" />.
</p>

<pre>
&lt;owl:Class rdf:ID="ValueOf"&gt;
  &lt;rdfs:label&gt;ValueOf&lt;/rdfs:label&gt;
  &lt;rdfs:subClassOf&gt;
    &lt;owl:Restriction&gt;
      &lt;owl:onProperty rdf:resource="#theVar"/&gt;
      &lt;owl:cardinality rdf:datatype="&amp;xsd;#nonNegativeInteger"&gt;
                1&lt;/owl:cardinality&gt;
    &lt;/owl:Restriction&gt;
  &lt;/rdfs:subClassOf&gt;
  &lt;rdfs:subClassOf&gt;
    &lt;owl:Restriction&gt;
      &lt;owl:onProperty rdf:resource="#fromProcess"/&gt;
      &lt;owl:maxCardinality rdf:datatype="&amp;xsd;#nonNegativeInteger"&gt;
                  1&lt;/owl:maxCardinality&gt;
    &lt;/owl:Restriction&gt;
  &lt;/rdfs:subClassOf&gt;
&lt;/owl:Class&gt;

&lt;owl:ObjectProperty rdf:ID="theVar"&gt;
  &lt;rdfs:domain rdf:resource="#ValueOf"/&gt;
  &lt;rdfs:range rdf:resource="#Parameter"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:ObjectProperty rdf:ID="fromProcess"&gt;
  &lt;rdfs:domain rdf:resource="#ValueOf"/&gt;
  &lt;rdfs:range rdf:resource="#Perform"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>

<p>
For example, our simple tableau has one place where a
<tt>ValueSource</tt> expression can be used. Here is how that part
of the tableau would be expressed:
</p>

<pre>
&lt;process:Sequence rdf:ID="CP"&gt;
   &lt;process:components rdf:parseType="Collection"&gt;
      &lt;process:Perform rdf:ID="Step1"&gt;
         &lt;process:process rdf:resource="&amp;aux;#S1"/&gt;
         ...
      &lt;/process:Perform&gt;
      &lt;process:Perform rdf:ID="Step2"&gt;
         &lt;process:process rdf:resource="&amp;aux;#S2"/&gt;
         &lt;process:hasDataFrom&gt;
            &lt;process:InputBinding&gt;
               &lt;process:toVar rdf:resource="&amp;aux;#I21"/&gt;
               &lt;process:valueSource&gt;
                  &lt;process:ValueOf&gt;
                      &lt;process:theParam rdf:resource="#O11"/&gt;
                      &lt;process:fromProcess rdf:resource="#Step1"/&gt;
                  &lt;/process:ValueOf&gt;
               &lt;/process:valueSource&gt;
            &lt;/process:InputBinding&gt;
         &lt;/process:hasDataFrom&gt;
      &lt;/process:Perform&gt;
   &lt;/process:components&gt;
&lt;/process:Sequence&gt;
</pre>

<p> Note the use of the <tt>hasDataFrom</tt> property to connect
<tt>Perform</tt>s to input bindings:
<pre>
&lt;owl:ObjectProperty rdf:ID="hasDataFrom"&gt;
  &lt;rdfs:domain rdf:resource="#Perform"/&gt;
  &lt;rdfs:range rdf:resource="#InputBinding"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>
In the fragment above, Step2 has one input parameter, and hence one
<tt>hasDataFrom</tt> that specifies that <tt>I21</tt> is to get its
input from the given <tt>valueSource</tt>.
</p>

<p>Not surprisingly, an <tt>InputBinding</tt> is just a Binding that
binds an input parameter:
<pre>
&lt;owl:Class rdf:ID="InputBinding"&gt;
  &lt;owl:intersectionOf rdf:parseType="Collection"&gt;
     &lt;owl:Class rdf:about="#Binding"/&gt;
     &lt;owl:Restriction&gt;
       &lt;owl:onProperty rdf:resource="#toVar"/&gt;
       &lt;owl:allValuesFrom rdf:resource="#Input"/&gt;
     &lt;/owl:Restriction&gt;
  &lt;/owl:intersectionOf&gt;
  &lt;rdfs:subClassOf rdf:resource="#Binding"/&gt;
&lt;/owl:Class&gt;
</pre>
</p>

<p>
The complete tableau appears below, after discussion of
the remaining <tt>valueSpecifier</tt>s. Two of them,
<tt>valueFunction</tt> and <tt>valueData</tt>, use the XML Literal trick to
encode arbitrary expressions.
</p>

<pre>
&lt;owl:DatatypeProperty rdf:ID="valueFunction"&gt;
  &lt;rdfs:label&gt;valueFunction&lt;/rdfs:label&gt;
  &lt;rdfs:subPropertyOf rdf:resource="#valueSpecifier"/&gt;
  &lt;rdfs:domain rdf:resource="#Binding"/&gt;
  &lt;rdfs:range rdf:resource="&amp;rdf;#XMLLiteral"/&gt;
&lt;/owl:DatatypeProperty&gt;

&lt;owl:DatatypeProperty rdf:ID="valueData"&gt;
  &lt;rdfs:label&gt;valueData&lt;/rdfs:label&gt;
  &lt;rdfs:domain rdf:resource="#Binding"/&gt;
&lt;/owl:DatatypeProperty&gt;
</pre>

<p>
The <tt>valueFunction</tt> of a <tt>Binding</tt> is an XML literal to be
read as a functional term. Some of its subterms may be
<tt>ValueOf</tt>s specifying outputs of previous terms. As with
conditions and effects, the denotation of the <tt>valueFunction</tt>
expression cannot be known until variable values are plugged in.
The <tt>valueData</tt> of a <tt>Binding</tt> is an XML literal to be
interpreted as constant data.
</p>

<p>
The <tt>valueType</tt> of a <tt>Binding</tt> is a URI referring to
 an OWL class definition <tt>C</tt>. An instance of <tt>valueType</tt>
 asserts that the value of the given parameter will belong to
 <tt>C</tt>. <tt>C</tt> must be a subclass of the parameter's
 overall type, declared using <tt>parameterType</tt>.
</p>

<pre>
&lt;owl:DatatypeProperty rdf:ID="valueType"&gt;
  &lt;rdfs:label&gt;valueType&lt;/rdfs:label&gt;
  &lt;rdfs:subPropertyOf rdf:resource="#valueSpecifier"/&gt;
  &lt;rdfs:domain rdf:resource="#Binding"/&gt;
  &lt;rdfs:range rdf:resource="&amp;xsd;#anyURI"/&gt;
&lt;/owl:DatatypeProperty&gt;
</pre>

<p>In the discussion of Results, we gave a <a
href="#credit-card">credit-card example</a>, where we specified the
outputs using <tt>OutputBinding</tt>s. We won't bother to give the
formal specification of these; they are exactly analogous to
<tt>InputBinding</tt>s. We'll see another example of them below.
</p>

<p>
There are a bunch of subtle issues that arise from the fact that our
ontological categories refer to <em>variables</em> and not to the
<em>objects</em> the variables denote when processes are performed.
A person writing down a process is far more likely to be interested
in the latter. In XML Literals such as KIF expressions, when we write
a variable name we have assumed that software tools processing those
expressions will treat occurrences of variables as denoting their
enactment-time values. (See, for example, our treatment of Results in
a process checking credit cards.)
In other contexts we adopt similar conventions. For example,
in a <tt>ValueOf</tt>, the <tt>fromProcess</tt> is nominally a step.
But inference and enactment tools should treat it as denoting the
enactment corresponding to that step during the current process
performance.
</p>

<p> Occasionally, it is necessary to refer to the enactment of the
process <em>currently being defined</em>. For example, In our
informal tableau
above, we used expressions such as <!-- MATH
 $\mbox{\texttt{incr(I1\mbox{\textrm{(CP)}})}}$
 -->

<img
 width="116" height="34"
 src="img15.gif"
 alt="incr(I1(CP))" />

to mean
the the input <tt>I1</tt> of the overall process CP. But we cannot
literally refer to a <tt>Binding</tt> with <tt>valueSource</tt> that
is a <tt>ValueOf</tt> with <tt>fromProcess</tt> = CP, because CP is
not a <tt>Perform</tt>, but a process.
We want to
say:
During any Perform <img
 width="18" height="15"
 src="img16.gif"
 alt=" P " /> of CP, the value of the input <tt>I1</tt> of
step <tt>S1</tt> is the value of the input <tt>I1</tt> of <img
 width="18" height="15"
 src="img16.gif"
 alt=" P " />.
</p>

<p>
Hence we introduce a standard variable to play the role of
<img width="18" height="15" src="img16.gif"
 alt=" P " />, and give it the name <tt>ThisPerform</tt>.
</p>

<pre>
&lt;swrl:Variable rdf:ID="ThisPerform"&gt;
  &lt;rdfs:comment&gt;
    A special-purpose variable, used to refer, at runtime, to the execution
    instance of the enclosing process definition.
  &lt;/rdfs:comment&gt;
&lt;/swrl:Variable&gt;
</pre>

<p>
We will show how this device is used in our example tableau shortly.
</p>

<p>We close the discussion of "consumer-pull" with some examples. First,
we fill in the <a href="#missing-lines">missing lines in the <tt>AsProcess</tt>
example</a> from the previous section. Recall that we wanted to call the
<tt>Confirm-Contractor</tt> process in one branch of a
<tt>Split+Join</tt>, the <tt>Confirm-Contractee</tt> process in the
other. Here's how the first of these would look:
<pre>
         &lt;process:Perform&gt;
            &lt;process:process rdf:resource="&amp;aux;#Confirm-Contractor"/&gt;
            &lt;process:hasDataFrom&gt;
               &lt;process:InputBinding&gt;
                  &lt;process:toVar rdf:resource=&amp;aux;#Contractor"/&gt;
                  &lt;process:valueData xsd:datatpe=&amp;rdfs;#XML-Literal"
                      &gt;aux:Contractor&lt;/process:valueData&gt;
               &lt;/process:InputBinding&gt;
            &lt;/process:hasDataFrom&gt;
            &lt;process:hasDataFrom&gt;
               &lt;process:InputBinding&gt;
                  &lt;process:toVar rdf:resource="&amp;aux;#Partner"/&gt;
                  &lt;process:valueData xsd:datatype="&amp;rdfs;#XML-Literal"
                      &gt;aux:Contractee &lt;/process:valueData&gt;
               &lt;/process:InputBinding&gt;
            &lt;/process:hasDataFrom&gt;
         &lt;/process:Perform&gt;
</pre>
Filling in the call to <tt>Confirm-Contractee</tt> is left as an
exercise for the reader.
</p>

<p>
Finally, here is the OWL-S RDF representation of
<a href="#example-tableau">the example tableau</a> with which we began this section, with all
data flows expressed
using one of the three data-source specs.
</p>

<pre>
&lt;process:CompositeProcess rdf:ID="CP"&gt;
   &lt;process:hasInput rdf:ID="I1"/&gt;
   &lt;process:hasOutput rdf:ID="O1"/&gt;
   &lt;process:composedOf&gt;
      &lt;process:Sequence rdf:ID="CP"&gt;
         &lt;process:components rdf:parseType="Collection"&gt;
            &lt;process:Perform rdf:ID="Step1"&gt;
               &lt;process:process rdf:resource="&amp;aux;#S1"/&gt;
               &lt;process:hasDataFrom&gt;
                  &lt;process:InputBinding&gt;
                     &lt;process:toVar rdf:resource="&amp;aux;#I11"/&gt;
                     &lt;process:valueFunction expressionLanguage="&amp;drs;#DRS"
                                      rdf:parseType="Literal"&gt;
                        &lt;drs:Functional_term&gt;
                           &lt;drs:term_function rdf:resource="&amp;arith;#incr"/&gt;
                           &lt;drs:term_args rdf:parseType="Collection"&gt;
                              &lt;process:ValueOf&gt;
                                  &lt;process:theParam rdf:resource="#I1"/&gt;
                                  &lt;process:fromProcess
                                      rdf:resource="#ThisPerform"/&gt;
                              &lt;/process:valueOf&gt;
                           &lt;/drs:term_args&gt;
                        &lt;/drs:Functional_term&gt;
                     &lt;/process:valueFunction&gt;
                  &lt;/process:InputBinding&gt;
                  &lt;process:InputBinding&gt;
                     &lt;process:toVar rdf:resource="&amp;aux;#I12"/&gt;
                     &lt;process:valueData
                        xsd:datatype="&amp;xsd;#string"
                        &gt;Academic&lt;/process:valueData&gt;
                  &lt;/process:InputBinding&gt;
               &lt;/process:hasDataFrom&gt;
            &lt;/process:Perform&gt;
            &lt;process:Perform rdf:ID="Step2"&gt;
               &lt;process:process rdf:resource="&amp;aux;#S2"/&gt;
               &lt;process:hasDataFrom&gt;
                  &lt;process:InputBinding&gt;
                     &lt;process:toVar rdf:resource="&amp;aux;#I21"/&gt;
                     &lt;process:valueSource&gt;
                        &lt;process:ValueOf&gt;
                            &lt;process:theParam rdf:resource="#O11"/&gt;
                            &lt;process:fromProcess rdf:resource="#Step1"/&gt;
                        &lt;/process:ValueOf&gt;
                     &lt;/process:valueSource&gt;
                  &lt;/process:InputBinding&gt;
               &lt;/process:hasDataFrom&gt;
            &lt;/process:Perform&gt;
         &lt;/process:components&gt;
      &lt;/process:Sequence&gt;
  &lt;/process:composedOf&gt;

  &lt;process:hasResult&gt;
     &lt;process:Result&gt;
        &lt;process:withOutput&gt;
            &lt;process:OutputBinding&gt;
                &lt;process:toVar rdf:resource="#O1"/&gt;
                &lt;process:valueFunction expressionLanguage="&amp;drs;#DRS"
                                 rdf:parseType="Literal"&gt;
                   &lt;drs:Functional_term&gt;
                       &lt;drs:term_function rdf:resource="&amp;arith;#times"/&gt;
                       &lt;drs:term_args rdf:parseType="Collection"&gt;
                          &lt;xsd:Integer rdf:datatype="&amp;xsd;#Float"
                             &gt;3.14159&lt;/xsd:Float&gt;
                          &lt;drs:Functional_term&gt;
                             &lt;drs:term_function
                                rdf:resource="&amp;arith;#max"/&gt;
                             &lt;drs:term_args rdf:parseType="Collection"&gt;
                                &lt;xsd:Integer rdf:datatype="&amp;xsd;#Integer"
                                             &gt;0&lt;/xsd:Integer&gt;
                                &lt;process:ValueOf&gt;
                                   &lt;process:theParam
                                       rdf:resource="#O21"/&gt;
                                   &lt;process:fromProcess
                                       rdf:resource="#S2"/&gt;
                                &lt;/process:valueOf&gt;
                             &lt;/drs:term_args&gt;
                          &lt;/drs:Functional_term&gt;
                       &lt;/drs:term_args&gt;
                   &lt;/drs:Functional_term&gt;
                &lt;/process:valueFunction&gt;
            &lt;/process:OutputBinding&gt;
        &lt;/process:withOutput&gt;
     &lt;/process:Result&gt;
&lt;/process:CompositeProcess&gt;
</pre>

<h3><em>Producer-Push</em></h3>

<p> In all the examples so far, we were able to use
<tt>withOutput</tt> to "pull" the outputs out of terms
available when a Result is declared.
In some cases specifying things this way becomes awkward.
If a process is defined using <tt>IfThenElse</tt>s the outputs
may depend on which branches of the conditionals the agent takes. So
at the point in a branch where the data required to compute the output
are known, we insert a <tt>Produce</tt> pseudo-step to say what the
output will be.
<tt>Produce</tt> is a <tt>ControlConstruct</tt> that "pushes" to an
<tt>Output</tt> a value available at run time.
  This brings us to the "producer-push"
paradigm for expressing dataflow.
</p>

<pre>
&lt;owl:Class rdf:ID="Produce"&gt;
  &lt;rdfs:subClassOf rdf:resource="#ControlConstruct"/&gt;
&lt;/owl:Class&gt;
</pre>

<p> A
<tt>Produce</tt>
<!-- is a kind of "push" that -->
specifies a value and where it is going.
We can spell out the possible destinations of such values after we
explain the varieties of <em>local variables.</em>:
<pre>
&lt;owl:Class rdf:ID="Local"&gt;
  &lt;rdfs:comment&gt;
     A Local is a distinct type of variable used for intermediate results
     in a CompositeProcess.
  &lt;/rdfs:comment&gt;
  &lt;rdfs:subClassOf rdf:resource="#ProcessVar"/&gt;
  &lt;owl:disjointWith rdf:resource="#Participant"/&gt;
  &lt;owl:disjointWith rdf:resource="#Existential"/&gt;
  &lt;owl:disjointWith rdf:resource="#ResultVar"/&gt;
  &lt;owl:disjointWith rdf:resource="#Participant"/&gt;
  &lt;owl:unionOf rdf:parseType="Collection"&gt;
    &lt;owl:Class rdf:about="#Loc"/&gt;
    &lt;owl:Class rdf:about="#Link"/&gt;
  &lt;/owl:unionOf&gt;
&lt;/owl:Class&gt;

&lt;owl:ObjectProperty rdf:ID="hasLocal"&gt;
  &lt;rdfs:subPropertyOf rdf:resource="#hasVar"/&gt;
  &lt;rdfs:domain rdf:resource="#CompositeProcess"/&gt;
  &lt;rdfs:range rdf:resource="#Local"/&gt;
&lt;/owl:ObjectProperty&gt;
</pre>
</p>

<p><tt>Local</tt>s are divided into further classes of variable:
<tt>Loc</tt>s and <tt>Link</tt>s.

<pre>
&lt;owl:Class rdf:ID="Loc"&gt;
   &lt;rdfs:comment&gt;
      A Loc is a variable that may be written and overwritten as
      often as one pleases.
   &lt;/rdfs:comment&gt;
   &lt;rdfs:subClassOf rdf:resource="#Local"/&gt;
&lt;/owl:Class&gt;

&lt;owl:Class rdf:ID="Link"&gt;
   &lt;rdfs:comment&gt;
      A Link is a communication channel that may be written exactly once.
   &lt;/rdfs:comment&gt;
   &lt;rdfs:subclassOf rdf:resource="#Local"/&gt;
   &lt;owl:disjointWith rdf:resrouce="#Loc"/&gt;
&lt;/owl:Class&gt;
</pre>
</p>

<p> We can finally specify the precise target of a <tt>Produce</tt>:
the target is its
<tt>producedBinding</tt> property, which specifies either a Link or an Output:
<pre>
&lt;owl:ObjectProperty rdf:ID="producedBinding"&gt;
   &lt;rdfs:domain rdf:resource="#Produce"/&gt;
   &lt;rdfs:range&gt;
      &lt;owl:unionOf rdf:parseType="Collection"&gt;
         &lt;owl:Class rdf:about="#OutputBinding"/&gt;
         &lt;owl:Class rdf:about="#LinkBinding"/&gt;
      &lt;/owl:unionOf&gt;
   &lt;/rdfs:range&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:Class rdf:ID="LinkBinding"&gt;
  &lt;owl:intersectionOf rdf:parseType="Collection"&gt;
     &lt;owl:Class rdf:about="#Binding"/&gt;
     &lt;owl:Restriction&gt;
       &lt;owl:onProperty rdf:resource="#toVar"/&gt;
       &lt;owl:allValuesFrom rdf:resource="#Link"/&gt;
     &lt;/owl:Restriction&gt;
  &lt;/owl:intersectionOf&gt;
  &lt;rdfs:subClassOf rdf:resource="#Binding"/&gt;
&lt;/owl:Class&gt;
</pre>
</p>

<p>
Analogous to <tt>Produce</tt>, we have <tt>Set</tt>, which sends a
value to a <tt>Loc</tt>.
</p>

<pre>
&lt;owl:Class rdf:ID="Set"&gt;
   &lt;rdfs:subclassOf rdf:resource="#ControlConstruct"/&gt;
&lt;/owl:Class&gt;

&lt;owl:ObjectProperty rdf:ID="setBinding"&gt;
   &lt;rdfs:domain rdf:resource="#Set"/&gt;
   &lt;rdfs:range rdf:resource="#LocBinding"/&gt;
&lt;/owl:ObjectProperty&gt;

&lt;owl:Class rdf:ID="LocBinding"&gt;
  &lt;owl:intersectionOf rdf:parseType="Collection"&gt;
     &lt;owl:Class rdf:about="#Binding"/&gt;
     &lt;owl:Restriction&gt;
       &lt;owl:onProperty rdf:resource="#toVar"/&gt;
       &lt;owl:allValuesFrom rdf:resource="#Loc"/&gt;
     &lt;/owl:Restriction&gt;
  &lt;/owl:intersectionOf&gt;
  &lt;rdfs:subClassOf rdf:resource="#Binding"/&gt;
&lt;/owl:Class&gt;
</pre>
</p>

<p>Here is how one might use these push devices to express flow out of an
If-Then-Else:
<pre>
&lt;process:If-Then-Else&gt;
   &lt;process:ifCondition&gt;
      ...
   &lt;/process:ifCondition&gt;
   &lt;process:then&gt;
      &lt;process:Produce&gt;
          &lt;process:producedBinding&gt;
             &lt;process:LinkBinding&gt;
                &lt;process:toVar rdf:resource="#SomeLink"/&gt;
                &lt;process:valueData xsd:datatype="&amp;xsd;integer"
                            &gt;5&lt;/process:valueData&gt;
             &lt;/process:LinkBinding&gt;
          &lt;/process:producedBinding&gt;
      &lt;/process:Produce&gt;
   &lt;/process:then&gt;
   &lt;process:else&gt;
      &lt;process:Produce&gt;
          &lt;process:producedBinding&gt;
             &lt;process:LinkBinding&gt;
                &lt;process:toVar rdf:resource="#SomeLink"/&gt;
                &lt;process:valueData xsd:datatype="&amp;xsd;integer"
                            &gt;-5&lt;/process:valueData&gt;
             &lt;/process:LinkBinding&gt;
          &lt;/process:producedBinding&gt;
      &lt;/process:Produce&gt;
   &lt;/process:else&gt;
&lt;/process:If-Then-Else&gt;
</pre>
After this construct is executed, the value 5 or -5 is written to the
link <tt>SomeLink</tt>. The link can be referred to in later steps, like any other
variable, by simply writing its name.
</p>

<p>In this example, we could just as easily have used a <tt>Loc</tt>. In
more realistic examples, Links, because they are written exactly once,
give analysis tools a better chance of inferring the values of expressions
by tracing through the different possible paths through a process.
Currently there is no way to use Links to express algorithms that
involve iteration, passing values from one iteration to the next.
That is on the agenda for future development. One must currently Locs for
that purpose.
</p>

<h1><a name="6"></a>6. Grounding a Service to a Concrete Realization</h1>

<p>
The grounding of a service specifies the details of how to access the
service - details having mainly to do with protocol and message
formats, serialization, transport, and addressing. A grounding can be
thought of as a <i>mapping</i> from an <i>abstract</i> to a <i>concrete</i> specification of those service description elements that are
required for interacting with the service - in particular, for our
purposes, the inputs and outputs of atomic processes. Note
that in OWL-S, both the <i>ServiceProfile</i> and the <i>ServiceModel</i> are thought of as abstract representations; only the
<i>ServiceGrounding</i> deals with the concrete level of specification.
</p>

<p>
OWL-S does not include an <i>abstract</i>
construct for explicitly describing messages. Rather, the abstract content of a
message is specified, implicitly, by the input or output properties of
some atomic process. Thus, atomic processes, in addition to
specifying the basic actions from which larger processes are composed,
can also be thought of as the communication primitives of an
(abstract) process specification.
</p>

<p>
<i>Concrete</i> messages, however, <i>are</i> specified explicitly in a
grounding. The central function of an OWL-S grounding is to show how
the (abstract) inputs and outputs of an atomic process are to be
realized concretely as messages, which carry those inputs and outputs
in some specific transmittable format. Due to the existence of a
significant body of work in the area of concrete message
specification, which is already well along in terms of industry
adoption, we have chosen to make use of the Web Services Description
Language (WSDL)
in crafting an initial grounding mechanism for OWL-S. As
mentioned above, our intent here is not to prescribe the
only possible grounding approach to be used with all services, but rather to
provide a general, canonical and broadly applicable approach that will
be useful for the great majority of cases.

</p><p>
Web Services Description Language (WSDL) ``is an XML format for
describing network services as a set of endpoints operating on
messages containing either document-oriented or procedure-oriented
information. The operations and messages are described abstractly, and
then bound to a concrete network protocol and message format to define
an endpoint. Related concrete endpoints are combined into abstract
endpoints (services). WSDL is extensible to allow description of
endpoints and their messages regardless of what message formats or
network protocols are used to communicate
 &#91; <a href="#WSDL">2</a> &#93; .

</p><p> It may readily be observed that OWL-S' concept of grounding is
generally consistent with WSDL's concept of <i>binding</i>. Indeed,
by using the extensibility elements already provided by WSDL, along
with one new extensibility element proposed here, it is an easy matter
to ground an OWL-S atomic process. Here, we show how this may be
done, relying on the WSDL 1.1 specification. (After WSDL 2.0 has been
finalized, we expect to update the OWL-S Grounding, and this document,
appropriately.)

</p>

<h2><a name="SECTION00061000000000000000"></a>
6.1 Relationships between OWL-S and WSDL
</h2>

<p>
The approach described here allows a service developer, who is going
to provide service descriptions for use by potential clients, to take
advantage of the complementary strengths of these two specification
languages. On the one hand (the abstract side of a service
specification), the developer benefits by making use of OWL-S'
process model, and the expressiveness of OWL's class typing
mechanisms, relative to what XML Schema Definition (XSD) provides. On the other hand
(the concrete side), the developer benefits from the opportunity to
reuse the extensive work done in WSDL (and related languages such as
SOAP), and software support for message exchanges based on these
declarations, as defined to date for various protocols and transport
mechanisms.

</p>
<p>

<a name="groundingVenn"></a>

<!-- width="286" height="221" -->
<ins>
<table>
<caption ><strong>Figure 4:</strong>
Mapping between OWL-S and WSDL</caption>
<tr><td><img
 src="wsdl-grounding.gif"
 alt="wsdl-grounding.gif" /> </td></tr>
</table>
</ins>

</p>

<p> <a name="1818"></a>
We emphasize that an OWL-S/WSDL grounding involves a
<i>complementary</i> use of the two languages, in a way that is in accord
with the intentions of the authors of WSDL.
Both languages are required for the full specification of a grounding,
because the two languages do not cover the same conceptual
space. As indicated by Figure 4, the two languages
<i>do</i> overlap in providing for the specification of what WSDL
calls ``abstract types'', which in turn are used to characterize
the inputs and outputs of services. WSDL, by default, specifies abstract types
using XML Schema, whereas OWL-S allows for the definition of
abstract types as (description logic-based) OWL classes
<a name="tex2html8"
  href="#foot1753"><sup>4</sup></a>. However,
WSDL/XSD is unable to express the semantics of an OWL class.
Similarly, OWL-S has no means, as currently defined, to express the
binding information that WSDL captures. Thus, it is natural that a
OWL-S/WSDL grounding uses OWL classes as the abstract
types of message parts declared in WSDL, and then relies on WSDL
binding constructs
to specify the formatting of the messages.

</p><p>
AN OWL-S/WSDL grounding
is based upon the following three correspondences between OWL-S and
WSDL. Figure 4 shows the first two of these.

</p>

<ol>
<li>AN OWL-S atomic process corresponds to a WSDL (1.1) <i>operation</i>. Different types of operations are related to OWL-S
processes as follows:

<ul>
<li>An atomic process with both inputs and outputs corresponds to a
WSDL <i>request-response</i> operation.
</li>
<li>An atomic process with inputs, but no outputs, corresponds to
a WSDL <i>one-way</i> operation.
</li>
<li>An atomic process with outputs, but no inputs, corresponds to
a WSDL <i>notification</i> operation.
</li>
<li>A composite process with both outputs and inputs, and with the sending
of outputs specified as coming before the reception of inputs,
corresponds to WSDL's <i>solicit-response</i> operation.<a name="tex2html9"
  href="#foot1819"><sup>5</sup></a>
</li>

</ul>

<p>
Note that OWL-S grounding doesn't mandate a one-to-one correspondence
between an atomic process and a single WSDL operation (although that
is the most normal case). To accommodate the WSDL-supported practice
of providing multiple definitions (within different port types) of the
same operation, OWL-S allows for a one-to-many correspondence between
an atomic process and multiple WSDL operations. It is also possible,
in these situations, to maintain a one-to-one correspondence, by using
multiple (differently named) atomic processes.

</p>
</li>

<li>The set of inputs and the set of outputs of an OWL-S atomic process
each correspond to WSDL's concept of <i>message</i>. More precisely,
OWL-S inputs correspond to the parts of an input message of a WSDL
operation, and OWL-S outputs correspond to the parts of an output
message of a WSDL operation.
</li>
<li>The types (OWL classes) of the inputs and outputs of an OWL-S atomic
process correspond to WSDL's extensible notion of <i>abstract type</i>
(and, as such, may be used in WSDL specifications of message parts).
</li>
</ol>

<p>
To construct an OWL-S/WSDL grounding one must first identify,
in WSDL, the messages and operations by which an atomic process may be
accessed, and then specify correspondences (1) - (3).
</p>
<p>
Prior to OWL-S version 0.9, correspondences (2) and (3) were required
to be direct correspondences. That is, each OWL-S input or output
had to directly match up with a particular WSDL message part; and each
input/output type had to literally serve as the type specified in
WSDL. Starting with version 0.9, this limitation no longer exists.
Version 0.9 allows for the specification of XSLT transformations to
show how each WSDL input is derived from (one or more) OWL-S input
properties, and how each OWL-S output is derived from (one or
more) WSDL output message parts.
</p>
<p>
Although it is not logically necessary to do so, we believe it will be
useful to specify these correspondences both in WSDL and in
OWL-S. Thus, as indicated in the following, we allow for constructs
in both languages for this purpose.
</p>

<h2><a name="SECTION00062000000000000000"></a>
6.2 Grounding OWL-S Services with WSDL and SOAP
</h2>

<p>
Because OWL-S is an XML-based language, and its atomic process
declarations and input and output types already fit nicely with WSDL, it
is easy to extend existing WSDL bindings for use with OWL-S, such as
the SOAP binding. Here, we indicate briefly how an
arbitrary atomic process, specified in OWL-S, can be
given a grounding using WSDL and SOAP, with the assumption of HTTP as
the chosen transport mechanism.

</p>

<h3><a name="SECTION00062100000000000000"></a>
6.2.1 The <i>WSDL</i> Specification
</h3>

<p>
Grounding OWL-S with WSDL and SOAP involves the construction of a
WSDL (1.1) service description with all the usual parts (<i>types,
message, operation, port type, binding</i>, and <i>service</i>
constructs).
</p>
<p>
With respect to the types of the WSDL message parts, it is useful to
distinguish two cases: those in which the type is an OWL type
(that is, the WSDL service is a ``native speaker'' of that OWL
type); and all others. In the first case, the OWL class can
either be defined within the WSDL <i>types</i> section, or defined in a
separate document and referred to from within the WSDL description,
using <i>owl-s-parameter</i>, as explained below -- in which case its
definition can be omitted from the WSDL <i>types</i> section.

</p><p>
OWL-S extensions are
introduced as follows:

</p>

<ol>
<li>In a <i>part</i> of the WSDL <i>message</i> definition, the <i>owl-s-parameter</i> attribute may be used to indicate the fully qualified
name of the OWL-S input or output object (instance of class
Parameter), to which this part of the message corresponds. This
attribute is especially useful for those cases in which the type of
the message part is an OWL type (and has not been defined in the WSDL
<i>types</i> section). In these cases, the OWL type definition can be
obtained from the OWL-S process specification, by inspecting the
parameterType property of the referenced input or output object.

</li>

<li>For those cases in which a message part uses an OWL type, the <i>encodingStyle</i> attribute, within the WSDL <i>binding</i> element, can
be given a value such as
<br />``http://www.w3.org/2002/07/owl'' (or whatever is
appropriate for a later version or descendant language of OWL),
to indicate that the message parts will be serialized in the normal
way for class instances of the given types, for the specified version
of OWL.

</li>
<li>In each WSDL <i>operation</i> element, the <i>owl-s-process</i>
attribute may be used to indicate the name of the OWL-S atomic
process, to which the operation corresponds.

</li>
</ol>

<p>
Note that WSDL already allows for the use of arbitrary new attributes
in message part elements, and for the use of arbitrary values for the
<i>encodingStyle</i> attribute. Thus, extension (3) above is the only
point on which a modification to the current WSDL 1.1 specification is
called for.
</p>

<h3><a name="SECTION00062200000000000000"></a>
6.2.2 OWL-S' <i>Grounding</i> Class
</h3>

<p>
Thus far, we have only shown how WSDL
definitions may refer to the corresponding OWL-S declarations. It
remains to establish a mechanism by which the relevant WSDL constructs
may be referenced in OWL-S. The OWL-S <i>WsdlGrounding</i> class, a
subclass of <i>Grounding</i>, serves this purpose. Each <i>WsdlGrounding</i> instance, in turn, contains a list of <i>WsdlAtomicProcessGrounding</i> instances.

</p><p>
A <i>WsdlAtomicProcessGrounding</i> instance
refers to specific elements
within the WSDL specification, using the following properties:

</p>

<ul>
<li><i>wsdlVersion</i>: A URI that indicates the version of WSDL in use.
</li>
<li><i>wsdlDocument</i>: A URI of a WSDL document to which this grounding refers.
</li>
<li><i>wsdlOperation</i>: The URI of the WSDL operation corresponding to the
given atomic process.
</li>
<li><i>wsdlService, wsdlPort</i> (optional): The URI of a WSDL service (or port)
    that offers the given operation.
    Note that the value of <em>wsdlOperation</em> may or may not uniquely identify
    a particular WSDL port with which to interact. If there are multiple
    such ports offering the specified operation, an OWL-S enactment engine
    is free to choose any of these ports. If it is desired to further
    constrain the choice of ports, a <em>WsdlAtomicProcessGrounding</em> may do so
    by specifying any number of values for <em>wsdlService</em> and/or
    <em>wsdlPort</em>.
</li>
<li><i>wsdlInputMessage</i>: An object containing the URI of the WSDL message
definition that carries the inputs of the given atomic process.
</li>
<li><i>wsdlInput</i>: An object containing a
mapping pairs, for a message part of the WSDL input message.
(There should be one of these objects for each message part of the input message).
Each such pair is represented using an instance of
<i>WsdlInputMessageMap</i>. One element of the pair (expressed with the
<i>wsdlMessagePart</i> property) identifies the message part, using a
URI. The other element tells how to derive that
message part from one or more inputs of the OWL-S atomic process.
In the simplest cases -- in which the message part corresponds directly to a
single OWL-S input, and the type of the input is directly
used by the WSDL specification -- this is done just by mentioning the URI of a
particular input object (using the <i>owlsParameter</i> property).
In all other cases, the <i>xsltTransformation</i> property gives an
XSLT script that generates the message part from an instance of the
atomic process. (The script may be given as a string embedded within
the grounding instance, or as a URI.)
</li>
<li><i>wsdlOutputMessage</i>: Similar to <i>wsdlInputMessage</i>, but
for outputs.
</li>
<li><i>wsdlOutput</i>: Similar to <i>wsdlInput</i>, but
for outputs. In this case, we have a mapping pair for
an output of the OWL-S atomic process, which is
represented using an instance of WsdlOutputMessageMap. Each such pair
contains an <i>owlsParameter</i> instance specifying the output. The other element of the pair can either be <i>wsdlMessagePart</i>, when there is a direct correpondence with a
particular message part, or <i>xsltTransformation</i> for all other
cases.
</li>
</ul>

<p>
Additional explanation and examples of how to specify groundings are given
in an online document &#91;<a
 href="#DAMLWSDL">14</a>&#93;, as part of the OWL-S release
 site on <tt>www.daml.org</tt>.
</p>

<hr/>

<h1><a name="7"></a>7. Summary and Current Status</h1>

<p>
OWL-S is an ontology, within the OWL-based framework of
the Semantic Web, for describing Web services. It will
enable users and software agents to automatically discover, invoke,
compose, and monitor Web resources offering services, under specified
constraints.

</p><p> We hope to enhance OWL-S in the future in selected ways that
we have indicated in this technical overview and elsewhere, and in
response to users' experience with it.
</p>

<p>
We believe OWL-S will help make the Semantic Web a place where people can
not only find information but also get things done.
</p>

<hr/>

<h1><a name="AppendixA"></a>Appendix A. Note on Input/Output Type
Compatiblity</h1>

<p>
In general, two processes are type compatible if for each output of
one that flows to the input of the other, the parameterType of the
output is a subtype of the parameterType of the input. It is quite
common, and often encouraged, to use OWL classes as the type of
parameters in OWL-S descriptions. That is, the URI which is a value of
the parameterType property, denotes an OWL class, that is, a set of
individuals which answer to a description encoded in OWL. An OWL
reasoner can determine type compatibility in such cases by testing
that the relevant output type is subsumed by the input type (of
course, equivalent classes subsume each other). In the case where the
types are XML Schema types (or elements), the subtype relation is
determined by the XML Schema specification (and can be tested by an
XML schema validator).
</p>

<p>
XML Schema types and OWL classes are type incompatible. If the service
uses XML Schema (or similar) types in WSDL declarations, and a service modeler
wishes to use OWL at the process or profile level, the modeler should
provide for translations from the XML Schema to OWL.
</p>

<hr/>

<h1><a name="AppendixB"></a>Appendix B. Note on a
Convention for Notating Lists in OWL-S</h1>

<p>In OWL DL, the RDF List vocabulary (<tt>rdf:List</tt>,
<tt>rdf:first</tt>, <tt>rdf:rest</tt>, <tt>rdf:nil</tt>) can only be
used in conjunction with built-in predicates such as owl:unionOf,
owl:intersectionOf, etc. Using RDF lists to denote a list of
individuals is only permitted in OWL Full. More precisely, the list
vocabulary (and constructs that generate it, such as
<tt>rdf:parseType="Collection"</tt>) can only be used as
<em>syntax</em> in OWL DL, and not for domain modeling.</p>

<p>To make OWL-S ontologies accessible to existing OWL DL reasoners
the OWL-S Coalition has decided to obey this restriction. Unfortunately,
the control constructs in the Process ontology heavily used the
collection vocabulary. In OWL-S 1.0 such constructs were modeled as
RDF lists and the <tt>rdf:parseType="Collection"</tt> attribute was
used to write the list, for example:</p>

<pre>
&lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:process-1.0="http://www.daml.org/services/owl-s/1.0/ Process.owl#"&gt;
&lt;process-1.0:CompositeProcess rdf:ID="BravoAir_Process"&gt;
 &lt;process-1.0:composedOf&gt;
     &lt;process-1.0:Sequence&gt;
       &lt;process-1.0:components rdf:parseType="Collection"&gt;
           &lt;process-1.0:AtomicProcess rdf:about="#GetDesiredFlightDetails"/&gt;
           &lt;process-1.0:AtomicProcess rdf:about="#SelectAvailableFlight"/&gt;
           &lt;process-1.0:CompositeProcess rdf:about="#BookFlight"/&gt;
       &lt;/process-1.0:components&gt;
     &lt;/process-1.0:Sequence&gt;
 &lt;/process-1.0:composedOf&gt;
&lt;/process-1.0:CompositeProcess&gt;
&lt;/rdf:RDF&gt;
</pre>

<p>This is exactly equivalent to the following verbose representation:</p>
<pre>
&lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:process-1.0="http://www.daml.org/services/owl-s/1.0/ Process.owl#"&gt;
&lt;process-1.0:CompositeProcess rdf:ID="BravoAir_Process"&gt;
 &lt;process-1.0:composedOf&gt;
     &lt;process-1.0:Sequence&gt;
       &lt;process-1.0:components&gt;
           &lt;rdf:Description&gt;
             &lt;rdf:first&gt;
                 &lt;process-1.0:AtomicProcess rdf:about="#GetDesiredFlightDetails"/&gt;
             &lt;/rdf:first&gt;
             &lt;rdf:rest&gt;
                 &lt;rdf:Description&gt;
                   &lt;rdf:first&gt;
                       &lt;process-1.0:AtomicProcess rdf:about="#SelectAvailableFlight"/&gt;
                   &lt;/rdf:first&gt;
                   &lt;rdf:rest&gt;
                       &lt;rdf:Description&gt;
                         &lt;rdf:first&gt;
                             &lt;process-1.0:CompositeProcess rdf:about="#BookFlight"/&gt;
                         &lt;/rdf:first&gt;
                         &lt;rdf:rest rdf:resource="&amp;rdf;#nil"/&gt;
                       &lt;/rdf:Description&gt;
                   &lt;/rdf:rest&gt;
                 &lt;/rdf:Description&gt;
             &lt;/rdf:rest&gt;
           &lt;/rdf:Description&gt;
       &lt;/process-1.0:components&gt;
     &lt;/process-1.0:Sequence&gt;
 &lt;/process-1.0:composedOf&gt;
&lt;/process-1.0:CompositeProcess&gt;
&lt;/rdf:RDF&gt;
</pre>

<p>In OWL-S 1.1, the solution to stay in OWL DL is achieved by using a
"shadow" vocabulary to redefine <tt>List</tt>, <tt>first</tt>,
<tt>rest</tt> and <tt>nil</tt> concepts in a different namespace. The
shadow list ontology is located at <a
href="http://www.daml.org/services/owl-s/1.1/generic/ObjectList.owl">http://www.daml.org/services/owl-s/1.1/generic/ObjectList.owl</a>. The use of this vocabulary in OWL-S 1.1 is very
similar to the above example:</p>

<pre>
&lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:shadow-rdf="http://www.daml.org/services/owl-s/1.1/generic/ ObjectList.owl"
  xmlns:process-1.1="http://www.daml.org/services/owl-s/1.1/ Process.owl#"&gt;
&lt;process-1.1:CompositeProcess shadow-rdf:ID="BravoAir_Process"&gt;
 &lt;process-1.1:composedOf&gt;
     &lt;process-1.1:Sequence&gt;
       &lt;process-1.1:components&gt;
           &lt;rdf:Description&gt;
             &lt;shadow-rdf:first&gt;
                 &lt;process-1.1:AtomicProcess
                        rdf:about="#GetDesiredFlightDetails"/&gt;
             &lt;/shadow-rdf:first&gt;
             &lt;shadow-rdf:rest&gt;
                 &lt;rdf:Description&gt;
                   &lt;shadow-rdf:first&gt;
                       &lt;process-1.1:AtomicProcess
                            rdf:about="#SelectAvailableFlight"/&gt;
                   &lt;/shadow-rdf:first&gt;
                   &lt;shadow-rdf:rest&gt;
                       &lt;rdf:Description&gt;
                         &lt;shadow-rdf:first&gt;
                             &lt;process-1.1:CompositeProcess
                                  rdf:about="#BookFlight"/&gt;
                         &lt;/shadow-rdf:first&gt;
                         &lt;shadow-rdf:rest
                            rdf:resource="&amp;shadow-rdf;#nil"/&gt;
                       &lt;/rdf:Description&gt;
                   &lt;/shadow-rdf:rest&gt;
                 &lt;/rdf:Description&gt;
             &lt;/shadow-rdf:rest&gt;
           &lt;/rdf:Description&gt;
       &lt;/process-1.1:components&gt;
     &lt;/process-1.1:Sequence&gt;
 &lt;/process-1.1:composedOf&gt;
&lt;/process-1.1:CompositeProcess&gt;
&lt;/rdf:RDF&gt;
</pre>

<p>Note that, in this case we cannot use the short-hand notation of
<tt>rdf:parseType="Collection"</tt> since we are using a completely
different set of properties to denote lists. The current shadow list
vocabulary is a rather shallow representation of lists, but hardly more
so than the original <a
href="http://www.w3.org/TR/rdf-mt/#collections">RDF vocabulary</a>.
In OWL Full, there is no restriction on the use of RDF list vocabulary
and it is also possible to define equivalence relations between the
built-in RDF list vocabulary and shadow list vocabulary. The following
set of assertions is one way to establish this equivalence:</p>

<pre>&lt;rdf:Description rdf:ID="&amp;rdf;#List"&gt;
 &lt;owl:equivalentClass rdf:resource="&amp;shadow-rdf;#List"/&gt;
&lt;/rdf:Description&gt;
&lt;rdf:Property rdf:about="&amp;rdf;#first"&gt;
  &lt;owl:equivalentProperty rdf:resource="&amp;shadow-rdf;#first"/&gt;
&lt;/rdf:Property&gt;
&lt;rdf:Property rdf:about="&amp;rdf;#rest"&gt;
  &lt;owl:equivalentProperty rdf:resource="&amp;shadow-rdf;#rest"/&gt;
&lt;/rdf:Property&gt;
&lt;rdf:Description rdf:ID="&amp;rdf;#nil"&gt;
 &lt;owl:sameAs rdf:resource="&amp;shadow-rdf;#nil"/&gt;
&lt;/rdf:Description&gt;</pre>

<p>A service provider can simply import an ontology that contains
these assertions and continue to use the built-in RDF vocabulary (and
short-hand rdf:parseType="Collection" notation). Such service
descriptions are still consistent with OWL-S ontologies but certainly
fall into OWL Full. It is more difficult to go the other way, since
one must maintain the distinction between syntax uses of the RDF
vocabulary and domain modeling uses. It almost certainly requires an
a priori pass of an OWL parser such as the <a
href="http://owl.man.ac.uk/api.shtml">OWL API</a> to remove all the
syntax triples first; then the remaining triples may be replaced with the
shadow vocabulary.</p>

<hr/>

<h1><a name="acknowledgments"></a>Acknowledgments</h1>

<p>
This document was produced as part of the <a
href="http://www.daml.org/">DARPA DAML Program</a>, which provided
funding to many of the authors. We very much appreciate the ongoing
support, interest, and patience of DAML program managers
Jim Hendler, Murray
Burke, and Mark Greaves.</p>
<p>
We thank the W3C for permitting and supporting the use of
the public-sws-ig mailing list for discussion of OWL-S issues, and
Carine Bournez at W3C for helping to make this possible.
</p>
<p>
We would like to give a special thanks to the following individuals
who have made significant contributions to this work:
</p>
      <ul>
        <li>Anupriya Ankolekar (Carnegie Mellon University)</li>
        <li>Grit Denker (SRI International)</li>
        <li>Daniel Elenius (Linkoping University)</li>
        <li>Deb McGuinness (Stanford University)</li>
        <li>Marta Sabou (Vrije Universiteit Amsterdam)</li>
        <li>Monika Solanki (De Montfort University)</li>
      </ul>
<p>
In addition, we would like to express our gratitude to the many
interested researchers and users who have employed OWL-S in their
projects and publications, and to those who have taken the trouble to
share their suggestions and questions in the discussions
of OWL-S on the public-sws-ig list.
</p>
<p> This document has benefited
from input from members of the <a
href="http://www.swsi.org/">Semantic Web Services Initiative
(SWSI)</a>.
</p>

<hr/>

<h1><a id="references" name="references"></a>References</h1>

<dl>

<dt><a id="ref-guide">&#91;OWL Guide&#93;</a></dt>
<dd>
<cite><a
href="http://www.w3.org/TR/owl-guide/">OWL Web Ontology
Language Guide</a></cite>.
Michael K. Smith, Chris Welty, and Deborah L. McGuinness.
W3C Recommendation 10 February 2004. Latest version is available at <a
href="http://www.w3.org/TR/owl-guide/">http://www.w3.org/TR/owl-guide/</a>.
</dd>

<!-- this appears as a number ref.
<dt><a id="ref-overview">&#91;OWL Overview&#93;</a></dt>
<dd>
<cite><a
href="http://www.w3.org/TR/owl-features/">OWL Web Ontology
Language Overview</a></cite>.
Deborah L. McGuinness and Frank van Harmelen.
W3C Recommendation 10 February 2004. Latest version is available at <a
href="http://www.w3.org/TR/owl-features/">http://www.w3.org/TR/owl-features/</a>.
</dd>
-->

<dt><a id="ref-ref">&#91;OWL Reference&#93;</a></dt>
<dd>
<cite><a
href="http://www.w3.org/TR/2004/REC-owl-ref-20040210/">OWL Web Ontology
Language Reference</a></cite>.
Mike Dean, Guus Schreiber, Sean Bechhofer, Frank van
Harmelen, James Hendler, Ian Horrocks, Deborah L. McGuinness, Peter
F. Patel-Schneider, and Lynn Andrea Stein.
W3C Recommendation 10 February 2004. Latest version is available at <a
href="http://www.w3.org/TR/owl-ref/">http://www.w3.org/TR/owl-ref/</a>.
</dd>

</dl>

<dl>
<dt><a id="owl-xml">&#91;OWL XML&#93;</a></dt>
<dd> <cite><a
href="http://www.w3.org/TR/owl-xmlsyntax/">OWL Web Ontology Language
XML Presentation Syntax</a></cite>. Masahiro Hori, Jérôme Euzenat,
Peter F. Patel-Schneider. W3C Note 11 June 2003 </dd>
</dl>

<dl><dt><a id="ref-rdfconcepts">&#91;RDF Concepts&#93;</a></dt>
<dd> <cite><a
href="http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/">Resource Description Framework (RDF) Concepts and Abstract Syntax</a></cite>. Graham Klyne, Jeremy J. Carroll, and Brian McBride, eds. W3C Recommendation 10 February 2004.
Latest version is available at <a
href="http://www.w3.org/TR/rdf-concepts/">http://www.w3.org/TR/rdf-concepts/</a>.
</dd>
</dl>

<dl><dt><a id="RuleML">&#91;RuleML&#93;</a></dt><dd> <cite><a
href="http://www.ruleml.org">Rule Markup Language
Initiative</a></cite>.</dd>

</dl>

<dl>
<dt><a id="ref-xml">&#91;XML&#93;</a></dt>
<dd>
<cite><a href="http://www.w3.org/TR/2000/REC-xml-20001006">
Extensible Markup Language (XML) 1.0 (Second Edition)</a></cite>.
Tim Bray, Jean Paoli, C. M. Sperberg-McQueen, and Eve Maler, eds.
W3C Recommendation 6 October 2000.
Latest version is available at
<a href="http://www.w3.org/TR/REC-xml/">http://www.w3.org/TR/REC-xml/</a>.
</dd>
</dl>

<dl>

<dt><a name="Berners-Lee-Hendler-Lassila">1</a></dt>
<dd>
T.&nbsp;Berners-Lee, J.&nbsp;Hendler, and O.&nbsp;Lassila.
<br />The Semantic Web.
<br /><em>Scientific American</em>, 284(5):34-43, 2001.
</dd>

<dt><a name="WSDL"></a>2</dt>
<dd>
E.&nbsp;Christensen, F.&nbsp;Curbera, G.&nbsp;Meredith, and S.&nbsp;Weerawarana.
<br />Web Services Description Language (WSDL) 1.1.
<br />http://www.w3.org/TR/2001/NOTE-wsdl-20010315, 2001.
</dd>

<dt><a name="damls-url">3</a></dt>
<dd>
OWL-S Home Page.
<br />http://www.daml.org/services/owl-s/, 2003.
</dd>

<dt><a name="Decker:97">4</a></dt>
<dd>
K.&nbsp;Decker, K.&nbsp;Sycara, and M.&nbsp; Williamson.
<br />Middle-agents for the Internet.
<br />In <em>IJCAI97</em>, 1997.
</dd>

<dt><a name="KQML">5</a></dt>
<dd>
T.&nbsp;Finin, Y.&nbsp;Labrou, and J.&nbsp;Mayfield.
<br />KQML as an Agent Communication Language.
<br />In J.&nbsp;Bradshaw, editor, <em>Software Agents</em>. MIT Press, Cambridge,
  1997.
</dd>

<dt><a name="PDDL">6</a></dt>
<dd>
M.&nbsp;Ghallab et&nbsp;al.
<br />PDDL-The Planning Domain Definition Language V. 2.
<br />Technical Report, report CVC TR-98-003/DCS TR-1165, Yale Center for
  Computational Vision and Control, 1998.
</dd>

<dt><a name="Hendler-McGuinness">7</a></dt>
<dd>
J.&nbsp;Hendler and D.&nbsp;L. McGuinness.
<br />DARPA Agent Markup Language.
<br /><em>IEEE Intelligent Systems</em>, 15(6):72-73, 2001.
</dd>

<dt><a name="SWRL">8</a></dt>
<dd>
I. Horrocks, P.&nbsp;F. Patel-Schneider, H.&nbsp;Boley, S.&nbsp;Tabet,
B.&nbsp;Grosof, and M.&nbsp;Dean.
<br />Swrl: A semantic web rule language combining owl and ruleml, 2003.
<br />Available at <tt>http://www.daml.org/2003/11/swrl/</tt>.
</dd>

<dt><a name="DAML-OILReference">9</a></dt>
<dd>
D. Connolly, F. van Harmelen, I. Horrocks, D. L. McGuinness,
P. F. Patel-Schneider, and L. Stein.
<br />
DAML+OIL (March 2001) Reference Description. W3C Note 18, December
2001.
<br />http://www.w3.org/TR/daml+oil-reference
</dd>

<dt><a name="Kif">10</a></dt>
<dd>
KIF.
<br />Knowledge Interchange Format: Draft proposed American
  National Standard (dpans).
<br />Technical Report 2/98-004, ANS, 1998.
<br />Also at <tt>http://logic.stanford.edu/kif/dpans.html</tt>.
</dd>

<dt><a name="RDF">11</a></dt>
<dd>
G.&nbsp;Klyne and J.&nbsp;J. Carroll.
<br />Resource description framework (rdf): concepts and abstract syntax,
  2004.
<br />W3C Recommendation. Available at
  <tt>http://www.w3.org/TR/2004/REC-rdf-concepts-20040210</tt>.

</dd>

<dt><a name="WILBUR">12</a></dt>
<dd>
O.&nbsp;Lassila.
<br />Enabling semantic web programming by integrating Rdf and Common
  Lisp.
<br />In <em>Proc. First Semantic Web Working Symposium</em>,
  2001.
<br />Stanford University.
</dd>

<dt> <a name="lev97"></a> 13</dt>
<dd>
H.&nbsp;Levesque, R.&nbsp;Reiter, Y.&nbsp;Lesperance, F.&nbsp;Lin, and R.&nbsp;Scherl.
<br />GOLOG: A Logic programming language for dynamic domains.
<br /><em>Journal of Logic Programming</em>, 31(1-3):59-84, April-June 1997.
</dd>

<dt><a name="DAMLWSDL">14</a></dt>
<dd>
D.&nbsp;Martin, M.&nbsp;Burstein, O.&nbsp;Lassila, M.&nbsp;Paolucci, T.&nbsp;Payne, and S.&nbsp;McIlr
aith.
<br />Describing Web Services using OWL-S and WSDL.
<br />http://www.daml.org/services/owl-s/1.1/owl-s-wsdl.html, November
2004.
</dd>

<dt><a name="Martin:OAA">15</a></dt>
<dd>
D.&nbsp;Martin, A.&nbsp;Cheyer, and D.&nbsp;Moran.
<br />The Open Agent Architecture: A Framework for Building Distributed
  Software Systems.
<br /><em>Applied Artificial Intelligence</em>, 13(1-2):92-128, 1999.
</dd>

<dt><a name="OWLReference">16</a></dt>
<dd>
D.&nbsp;L. McGuinness and F.&nbsp;van Harmelen.
<br />OWL Web Ontology Language Overview.
<br />http://www.w3.org/TR/owl-features/, February 2004.
<br />World Wide Web Consortium (W3C) Recommendation.
</dd>

<dt><a name="McIlraith-al-SemWeb">17</a></dt>
<dd>
S.&nbsp;McIlraith, T.&nbsp;C. Son, and H.&nbsp;Zeng.
<br />Mobilizing the Web with DAML-Enabled Web Service.
<br />In <em>Proc. Second Int'l Workshop Semantic Web (SemWeb'2001)</em>,
  2001.
</dd>

<dt><a name="McIlraith-al-IEEE">18</a></dt>
<dd>
S.&nbsp;McIlraith, T.&nbsp;C. Son, and H.&nbsp;Zeng.
<br />Semantic Web Service.
<br /><em>IEEE Intelligent Systems</em>, 16(2):46-53, 2001.
</dd>

<dt><a name="Mes92">19</a></dt>
<dd>
J.&nbsp;Meseguer.
<br />Conditional Rewriting Logic as a Unified Model of Concurrency.
<br /><em>Theoretical Computer Science</em>, 96(1):73-155, 1992.
</dd>

<dt><a name="Picalc">20</a></dt>
<dd>
R.&nbsp;Milner.
<br />Communicating with Mobile Agents: The pi-Calculus.
<br />Cambridge University Press, Cambridge, 1999.
</dd>

<dt><a name="Nara99">21</a></dt>
<dd>
S.&nbsp;Narayanan.
<br />Reasoning About Actions in Narrative Understanding.
<br />In <em>Proc. International Joint Conference on Artificial
  Intelligence (IJCAI'1999)</em>, pages 350-357. Morgan Kaufmann Press, San
  Francisco, 1999.
</dd>

<dt><a name="PSL">22</a></dt>
<dd>
C.&nbsp;Schlenoff, M.&nbsp;Gruninger, F.&nbsp;Tissot, J.&nbsp;Valois, J.&nbsp;Lubell, and J.&nbsp;Lee
.
<br />The Process Specification Language (PSL): Overview and Version 1.0
  Specification.
<br />NISTIR 6459, National Institute of Standards and Technology,
  Gaithersburg, MD, 2000.
</dd>

<dt><a name="Sycara-Klusch">23</a></dt>
<dd>
K.&nbsp;Sycara and M.&nbsp;Klusch.
<br />Brokering and Matchmaking for Coordination of Agent Societies: A
  Survey.
<br />In A.&nbsp;Omicini et&nbsp;al, editor, <em>Coordination of Internet
  Agents</em>. Springer, 2001.
</dd>

<dt><a name="Sycara-al-SIGMOD">24</a></dt>
<dd>
K.&nbsp;Sycara, M.&nbsp;Klusch, S.&nbsp;Widoff, and J.&nbsp;Lu.
<br />Dynamic Service Matchmaking Among Agents in Open Information
  Environments.
<br /><em>ACM SIGMOD Record (Special Issue on Semantic Interoperability in
  Global Information Systems)</em>, 28(1):47-53, 1999.
</dd>

<dt><a name="Wong00">25</a></dt>
<dd>
H.-C. Wong and K.&nbsp;Sycara.
<br />A Taxonomy of Middle-agents for the Internet.
<br />In <em>ICMAS'2000</em>, 2000.
</dd>

<dt><a name="CurberEtal02">26</a></dt>
<dd>
Francisco Curbera, Yaron Goland, Johannes Klein, Frank Leymann, Dieter
Roller, Satish Thatte, and Sanjiva Weerawarana
<br /> <i>
Business Process Execution Language for Web Services, Version
1.0.
<br /> http://www-106.ibm.com/developerworks/library/ws-bpel/
<br /> IBM Technical Report
</dd>
</dl>

<hr/>

<h1><a name="footnotes"></a>Footnotes</h1>

<dl>

<dt>...
OWL-S<a name="foot174"
 href="#tex2html2"><sup>1</sup></a>
 </dt><dd>Originally called DAML-S. </dd>

<dt>... ``profile<a name="foot273"
 href="#tex2html3"><sup>2</sup></a>
 </dt>
<dd>Service profile has also been called
``service capability advertisement'' &#91;<a
 href="#Sycara-Klusch">23</a>&#93;.
</dd>
<dt>... below.<a name="foot827"
 href="#tex2html6"><sup>3</sup></a>
</dt>
<dd>Another possible extension
is the ability to define counters and use their values as termination
conditions. This could be part of an extended process control and
execution monitoring ontology.
</dd>
<dt>... classes<a name="foot1753"
 href="#tex2html8"><sup>4</sup></a>
 </dt><dd>The data types of
XML Schema can also be used in defining OWL properties.
</dd>

<dt>... operation.
<a name="foot1819" href="#tex2html9"><sup>5</sup></a>
 </dt>
<dd>
Since a composite process has no grounding, this construct would be grounded
indirectly by
means of its relationship to a simple process (by the <i>collapsesTo</i>
property), and hence to an atomic process (by the <i>realizedBy</i> property).
</dd>

</dl>

<hr/>

</body>
</html>

--
[To unsubscribe to this list send an email to "majdart@bbn.com"
with the following text in the BODY of the message "unsubscribe daml-process"]
Received on Sun Mar 5 13:32:07 2006

This archive was generated by hypermail 2.1.8 : Sun Mar 05 2006 - 13:32:09 EST